void flipstrand(char *fsname, SNP **snpm, int numsnps) // move alleles to opposite strand { FILE *fff ; char line[MAXSTR] ; char *spt[MAXFF] ; char *ss ; int nsplit, n, k ; SNP *cupt ; if (fsname == NULL) return ; openit (fsname, &fff, "r") ; freesnpindex() ; while (fgets(line, MAXSTR, fff) != NULL) { nsplit = splitup(line, spt, MAXFF) ; if (nsplit==0) continue ; if (spt[0][0] == '#') { freeup(spt, nsplit) ; continue ; } k = snpindex(snpm, numsnps, spt[0]) ; if (k>=0) { cupt = snpm[k] ; cupt -> alleles[0] = compbase(cupt -> alleles[0]) ; cupt -> alleles[1] = compbase(cupt -> alleles[1]) ; } freeup(spt, nsplit) ; } fclose (fff) ; }
void flipsnps(char *fsname, SNP **snpm, int numsnps, int phasedmode) { FILE *fff ; char line[MAXSTR] ; char *spt[MAXFF] ; char *ss ; int nsplit, n, k ; SNP *cupt ; if (fsname == NULL) return ; openit (fsname, &fff, "r") ; freesnpindex() ; while (fgets(line, MAXSTR, fff) != NULL) { nsplit = splitup(line, spt, MAXFF) ; if (nsplit==0) continue ; if (spt[0][0] == '#') { freeup(spt, nsplit) ; continue ; } k = snpindex(snpm, numsnps, spt[0]) ; if (k>=0) { flip1(snpm[k], phasedmode, flipreference) ; } freeup(spt, nsplit) ; } fclose (fff) ; }
void remap(SNP **s1, int nums1, SNP **s2, int nums2) { SNP *cupt1, *cupt2 ; SNP tcupt, *cupt ; int i, k ; for (i=0; i<nums2; ++i) { cupt2 = s2[i] ; k = snpindex(s1, nums1, cupt2 -> ID) ; if (k<0) { printf("%20s not found\n") ; cupt2 -> ignore = YES ; continue ; } cupt1 = s1[k] ; fixaa(cupt1, cupt2) ; if (cupt1 -> alleles[1] == 'X') { cupt1 -> alleles[1] = cxx(cupt1 -> alleles, cupt2 -> alleles) ; } tcupt = *cupt2 ; *cupt2 = *cupt1 ; cupt = &tcupt ; cupt2 -> chrom = cupt -> chrom ; cupt2 -> genpos = cupt -> genpos ; cupt2 -> physpos = cupt -> physpos ; cupt2 -> alleles[0] = cupt -> alleles[0] ; cupt2 -> alleles[1] = cupt -> alleles[1] ; } freesnpindex() ; }
int main(int argc, char **argv) { SNP **snpmarkers ; Indiv **indivmarkers ; int numsnps, numindivs ; unsigned char *packg1, *packg2 ; int **snppos ; int *snpindx ; int lsnplist, lindlist, numeg ; int i,j; SNP *cupt, *cupt1, *cupt2, *cupt3 ; Indiv *indx ; int ch1, ch2 ; int fmnum , lmnum ; int num, n1, n2 ; int nkill = 0 ; int t, k, x ; int nignore, numrisks = 1 ; char **genolist ; int numgenolist ; int maxmiss ; tersem = YES ; // no snp counts readcommands(argc, argv) ; setomode(&outputmode, omode) ; packmode = YES ; settersemode(tersem) ; nums1 = getsnps(snp1, &snpm1, 0.0, NULL, &nignore, numrisks) ; putped(1) ; freeped() ; nums2 = getsnps(snp2, &snpm2, 0.0, NULL, &nignore, numrisks) ; putped(2) ; freeped() ; for (x=0; x<nums1; ++x) { cupt1 = snpm1[x] ; cupt1 -> tagnumber = -1 ; } for (x=0; x<nums2; ++x) { cupt2 = snpm2[x] ; t = x %1000 ; // if (t==0) printf("zz %d %d\n", x, nums2) ; k = snpindex(snpm1, nums1, cupt2 -> ID) ; if (k<0) { cupt2 -> ignore = YES ; continue ; } cupt1 = snpm1[k] ; cupt1 -> tagnumber = x ; t = checkmatch(cupt1, cupt2) ; if (t==1) continue ; if (t==2) { cupt2 -> isrfake = YES ; continue ; } if (t<0) { cupt1 -> ignore = cupt2 -> ignore = YES ; continue ; } printf("allele funny: %s", cupt1 -> ID) ; printalleles(cupt1, stdout) ; printalleles(cupt2, stdout) ; printnl() ; cupt1 -> ignore = cupt2 -> ignore = YES ; continue ; } freesnpindex() ; numi1 = getindivs(ind1, &indm1) ; numi2 = getindivs(ind2, &indm2) ; for (x=0; x<numi2; ++x) { k = indindex(indm1, numi1, indm2[x] -> ID) ; // this code could be modified to allow duplicate individuals if (k>=0) fatalx("dup ind: %s\n", indm2[x] -> ID) ; // fix later? } setgenotypename(&geno1, ind1) ; getped(1) ; getgenos(geno1, snpm1, indm1, nums1, numi1, nignore) ; packg1 = (unsigned char *) getpackgenos() ; clearpackgenos() ; setgenotypename(&geno2, ind2) ; getped(2) ; getgenos(geno2, snpm2, indm2, nums2, numi2, nignore) ; packg2 = (unsigned char *) getpackgenos() ; numindivs = mergeit(snpm1, snpm2, &indm1, indm2, nums1, nums2, numi1, numi2) ; snpmarkers = snpm1 ; numsnps = nums1 ; indivmarkers = indm1 ; free(packg1) ; free(packg2) ; outfiles(snpoutfilename, indoutfilename, genooutfilename, snpmarkers, indivmarkers, numsnps, numindivs, packout, ogmode) ; printf("##end of mergeit run\n") ; return 0 ; }