📄 dnapars.c
字号:
boolean done; done = false; do { treei = findunrearranged(bestrees, nextree, true); if (treei < 0) done = true; else bestrees[treei].gloreange = true; if (!done) { load_tree(treei); globrearrange(); done = rearrfirst; } } while (!done);} /* grandrearr */void maketree(){ /* constructs a binary tree from the pointers in treenode. adds each node at location which yields highest "likelihood" then rearranges the tree for greatest "likelihood" */ long i, j, numtrees, nextnode; boolean done, firsttree, goteof, haslengths; node *item, *nufork, *dummy; pointarray nodep; if (!usertree) { for (i = 1; i <= spp; i++) enterorder[i - 1] = i; if (jumble) randumize(seed, enterorder); recompute = true; root = treenode[enterorder[0] - 1]; add(treenode[enterorder[0] - 1], treenode[enterorder[1] - 1], treenode[spp], &root, recompute, treenode, &grbg, zeros); if (progress) { printf("Adding species:\n"); writename(0, 2, enterorder);#ifdef WIN32 phyFillScreenColor();#endif } lastrearr = false; oldnufork = NULL; for (i = 3; i <= spp; i++) { bestyet = -10.0 * spp * chars; item = treenode[enterorder[i - 1] - 1]; getnufork(&nufork, &grbg, treenode, zeros); there = root; memcpy(tempadd->base, item->base, endsite*sizeof(long)); memcpy(tempadd->numsteps, item->numsteps, endsite*sizeof(long)); memcpy(tempadd->oldbase, zeros, endsite*sizeof(long)); memcpy(tempadd->oldnumsteps, zeros, endsite*sizeof(long)); addpreorder(root, item, nufork); if (!mulf) add(there, item, nufork, &root, recompute, treenode, &grbg, zeros); else add(there, item, NULL, &root, recompute, treenode, &grbg, zeros); like = bestyet; rearrange(&root); if (progress) { writename(i - 1, 1, enterorder);#ifdef WIN32 phyFillScreenColor();#endif } lastrearr = (i == spp); if (lastrearr) { bestlike = bestyet; if (jumb == 1) { bstlike2 = bestlike; nextree = 1; initbestrees(bestrees, maxtrees, true); initbestrees(bestrees, maxtrees, false); } if (progress) { printf("\nDoing global rearrangements"); if (rearrfirst) printf(" on the first of the trees tied for best\n"); else printf(" on all trees tied for best\n"); printf(" !"); for (j = 1; j <= nonodes; j++) putchar('-'); printf("!\n");#ifdef WIN32 phyFillScreenColor();#endif } globrearrange(); } } done = false; while (!done && findunrearranged(bestrees, nextree, true) >= 0) { grandrearr(); done = rearrfirst; } if (progress) putchar('\n'); recompute = false; for (i = spp - 1; i >= 1; i--) re_move(treenode[i], &dummy, &root, recompute, treenode, &grbg, zeros); if (jumb == njumble) { if (thorough && (nextree > 2)) reducebestrees(bestrees, &nextree); if (treeprint) { putc('\n', outfile); if (nextree == 2) fprintf(outfile, "One most parsimonious tree found:\n"); else fprintf(outfile, "%6ld trees in all found\n", nextree - 1); } if (nextree > maxtrees + 1) { if (treeprint) fprintf(outfile, "here are the first %4ld of them\n", (long)maxtrees); nextree = maxtrees + 1; } if (treeprint) putc('\n', outfile); for (i = 0; i <= (nextree - 2); i++) { root = treenode[0]; add(treenode[0], treenode[1], treenode[spp], &root, recompute, treenode, &grbg, zeros); nextnode = spp + 2; for (j = 3; j <= spp; j++) { if (bestrees[i].btree[j - 1] > 0) add(treenode[bestrees[i].btree[j - 1] - 1], treenode[j - 1], treenode[nextnode++ - 1], &root, recompute, treenode, &grbg, zeros); else add(treenode[treenode[-bestrees[i].btree[j - 1]-1]->back->index-1], treenode[j - 1], NULL, &root, recompute, treenode, &grbg, zeros); } reroot(treenode[outgrno - 1], root); postorder(root); evaluate(root); treelength(root, chars, treenode); dnapars_printree(); describe(); for (j = 1; j < spp; j++) re_move(treenode[j], &dummy, &root, recompute, treenode, &grbg, zeros); } } } else { openfile(&intree,INTREE,"input tree", "r",progname,intreename); numtrees = countsemic(&intree); if (numtrees > 2) initseed(&inseed, &inseed0, seed); if (numtrees > MAXNUMTREES) { printf("\nERROR: number of input trees is read incorrectly from %s\n", intreename); exxit(-1); } if (treeprint) { fprintf(outfile, "User-defined tree"); if (numtrees > 1) putc('s', outfile); fprintf(outfile, ":\n"); } fsteps = (long **)Malloc(maxuser*sizeof(long *)); for (j = 1; j <= maxuser; j++) fsteps[j - 1] = (long *)Malloc(endsite*sizeof(long)); if (trout) fprintf(outtree, "%ld\n", numtrees); nodep = NULL; which = 1; while (which <= numtrees) { firsttree = true; nextnode = 0; haslengths = true; treeread(intree, &root, treenode, &goteof, &firsttree, nodep, &nextnode, &haslengths, &grbg, initdnaparsnode); if (treeprint) fprintf(outfile, "\n\n"); if (outgropt) reroot(treenode[outgrno - 1], root); postorder(root); evaluate(root); treelength(root, chars, treenode); dnapars_printree(); describe(); if (which < numtrees) gdispose(root, &grbg, treenode); which++; } FClose(intree); putc('\n', outfile); if (numtrees > 1 && chars > 1 ) standev(chars, numtrees, minwhich, minsteps, nsteps, fsteps, seed); for (j = 1; j <= maxuser; j++) free(fsteps[j - 1]); free(fsteps); } if (jumb == njumble) { if (progress) { printf("\nOutput written to file \"%s\"\n\n", outfilename); if (trout) { printf("Tree"); if (numtrees > 1) printf("s"); printf(" also written onto file \"%s\"\n\n", outtreename); } } }} /* maketree */void reallocchars() { /* The amount of chars can change between runs this function reallocates all the variables whose size depends on the amount of chars */ long i; for (i=0; i < spp; i++){ free(y[i]); y[i] = (Char *)Malloc(chars*sizeof(Char)); } free(weight); free(oldweight); free(alias); free(ally); free(location); weight = (long *)Malloc(chars*sizeof(long)); oldweight = (long *)Malloc(chars*sizeof(long)); alias = (long *)Malloc(chars*sizeof(long)); ally = (long *)Malloc(chars*sizeof(long)); location = (long *)Malloc(chars*sizeof(long));}void freerest(){ /* free variables that are allocated each data set */ long i; if (!usertree) { freenode(&temp); freenode(&temp1); freenode(&temp2); freenode(&tempsum); freenode(&temprm); freenode(&tempadd); freenode(&tempf); freenode(&tmp); freenode(&tmp1); freenode(&tmp2); freenode(&tmp3); freenode(&tmprm); freenode(&tmpadd); } for (i = 0; i < spp; i++) free(y[i]); free(y); for (i = 1; i <= maxtrees; i++) free(bestrees[i - 1].btree); free(bestrees); free(nayme); free(enterorder); free(place); free(weight); free(oldweight); free(alias); free(ally); free(location); freegrbg(&grbg); if (ancseq) freegarbage(&garbage); free(threshwt); free(zeros); freenodes(nonodes, treenode);} /* freerest */void usage(void){ fprintf(stderr,"Usage is %s [options]\n", progname); fprintf(stderr,"Options\n"); fprintf(stderr," -u<number> 1=More thorough search, 2=Rearrange on best tree, 3=Less thorough\n"); fprintf(stderr," -m<number> Number of trees to save\n"); fprintf(stderr," -j<number> Number of times to jumble (0 = Not randomize input order)\n"); fprintf(stderr," -s<number> Seed\n"); fprintf(stderr," -o<number> Number of outgroup species\n"); fprintf(stderr," -t<number> Parsimony threshold (0 = Not use Threshold parsimony)\n"); // fprintf(stderr," -w Sites weighted\n"); fprintf(stderr," -v Count only transversions\n"); exit (8);}int main(int argc, Char *argv[]){ /* DNA parsimony by uphill search */ long tempint=0; /* reads in spp, chars, and the data. Then calls maketree to construct the tree */#ifdef MAC argc = 1; /* macsetup("Dnapars",""); */ argv[0] = "Dnapars";#endif init(argc, argv); progname = argv[0]; printf("---------------------------------------\n"); printf(" MBETOOLBOX_DNAPARS\n"); printf(" The modified version of DNAPARS\n"); printf(" (in phylip 3.6a3) for MEBToolbox\n"); printf("---------------------------------------\n\n"); if ((argc == 1) || (strcmp(argv[1],"-help") == 0)) {usage();}; openfile(&infile,INFILE,"input file", "r",argv[0],infilename); openfile(&outfile,OUTFILE,"output file", "w",argv[0],outfilename); ibmpc = IBMCRT; ansi = ANSICRT; msets = 1; firstset = true; garbage = NULL; grbg = NULL; doinit(); while ((argc > 1) && (argv[1][0] == '-')) { switch (argv[1][1]) { case 'u': // 1 = More thorough search, 2 = Rearrange on one best tree, 3 = Less thorough switch (atoi(&argv[1][2])) { case 2: thorough=false; rearrfirst=true; break; case 3: thorough=false; rearrfirst=false; break; default : thorough=true; rearrfirst=false; break; } break; case 'm': maxtrees = atoi(&argv[1][2]); /* Number of trees to save */ break; case 'j': tempint = atoi(&argv[1][2]); if(tempint==0){ jumble = false; }else{ jumble = true; njumble=tempint; }; break; case 's': inseed0 = atoi(&argv[1][2]); inseed = atoi(&argv[1][2]); break; case 'o': tempint = atoi(&argv[1][2]); if(tempint==0){ outgropt = false; // fprintf(stderr," -o<number> Number of outgroup species\n"); }else{ outgropt = true; outgrno=tempint; // fprintf(stderr," -o%d Number of outgroup species\n",outgrno ); }; break; case 't': tempint = atoi(&argv[1][2]); if(tempint==0){ thresh = false; }else{ thresh = true; threshold=tempint; }; break; case 'v': transvp = true; break; default: fprintf(stderr,"Bad option %s\n", argv[1]); usage(); } /* * move the argument list up one * move the count down one */ ++argv; --argc; } if (weights || justwts) openfile(&weightfile,WEIGHTFILE,"weights file","r",argv[0],weightfilename); if (trout) openfile(&outtree,OUTTREE,"output tree file", "w",argv[0],outtreename); for (ith = 1; ith <= msets; ith++) { if (!(justwts && !firstset)) allocrest(); if (msets > 1 && !justwts) { fprintf(outfile, "\nData set # %ld:\n\n", ith); if (progress) printf("\nData set # %ld:\n\n", ith); } doinput(); if (ith == 1) firstset = false; for (jumb = 1; jumb <= njumble; jumb++) maketree(); if (!justwts) freerest(); } freetree(nonodes, treenode); FClose(infile); FClose(outfile); if (weights || justwts) FClose(weightfile); if (trout) FClose(outtree); if (usertree) FClose(intree);#ifdef MAC fixmacfile(outfilename); fixmacfile(outtreename);#endif if (progress) printf("Done.\n\n");#ifdef WIN32 phyRestoreConsoleAttributes();#endif return 0;} /* DNA parsimony by uphill search */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -