fastme.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:11k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: fastme.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:09:53  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: fastme.cpp,v 1000.1 2004/06/01 18:09:53 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author:  Richard Desper
  35. *
  36. * File Description:  fastme.cpp
  37. *
  38. *    A part of the Miminum Evolution algorithm
  39. *
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <stdio.h>
  43. #include <stdlib.h>
  44. #include <math.h>
  45. #include "fastme.h"
  46. #include "graph.h"
  47. #include "newick.h"
  48. BEGIN_NCBI_SCOPE
  49. BEGIN_SCOPE(fastme)
  50. /*functions from newickstring.c*/
  51. meTree *loadNewickTree(FILE *ifile, int numLeaves);
  52. void NewickPrintTree(meTree *T, FILE *ofile);
  53. char *NewickPrintTreeString(meTree *T);
  54. meTree *detrifurcate(meTree *T);
  55. void partitionSizes(meTree *T);
  56. /*functions from bme.c*/
  57. meTree *BMEaddSpecies(meTree *T,meNode *v, double **D, double **A); 
  58. void makeBMEAveragesTable(meTree *T, double **D, double **A);
  59. void assignBMEWeights(meTree *T, double **A);
  60. /*from gme.c*/
  61. meTree *GMEaddSpecies(meTree *T,meNode *v, double **D, double **A);
  62. void makeOLSAveragesTable(meTree *T, double **D, double **A);
  63. void assignOLSWeights(meTree *T, double **A);
  64. void assignAllSizeFields(meTree *T);
  65. /*from inputs.c*/
  66. double **loadMatrixOLD(FILE *ifile, int *size, meSet *S);
  67. double **loadMatrix(double **table_in, char **labels, int *size_in, meSet *S);
  68. void compareSets(meTree *T, meSet *S, FILE *ofile);
  69. void freeMatrix(double **D, int size);
  70. /*from NNI.c*/
  71. void NNI(meTree *T, double **avgDistArray, int *count);
  72. /*from bNNI.c*/
  73. void bNNI(meTree *T, double **avgDistArray, int *count);
  74. /*from graph.c*/
  75. void freeSet(meSet *S);
  76. void freeTree(meTree *T);
  77. void chooseSettings(int argc, char **argv, int *btype, int *ntype, int *wtype, int *numDataSets, char **filenames)
  78. {
  79.   int counter = 1;
  80.   int i;
  81.   sprintf(filenames[0],"input.d");
  82.   sprintf(filenames[1],"output.t");
  83.   sprintf(filenames[2],"input.t");
  84.   while (counter < argc)
  85.     {
  86.       switch(argv[counter][1])
  87. {
  88. case 'i':
  89.   counter++;
  90.   if (NULL != argv[counter])
  91.     strcpy(filenames[0],argv[counter]);
  92.   else
  93.     {
  94.       fprintf(stderr,"Error: -d flag requires argument.n");
  95.       exit(EXIT_FAILURE);
  96.     }
  97.   counter++;
  98.   break;
  99. case 'o':
  100.   counter++;
  101.   if (NULL != argv[counter])     
  102.     strcpy(filenames[1],argv[counter]);
  103.   else
  104.     {
  105.       fprintf(stderr,"Error: -o flag requires argument.n");
  106.       exit(EXIT_FAILURE);
  107.     }
  108.   counter++;
  109.   break;
  110. case 't':
  111.   counter++;
  112.   if (NULL != argv[counter])
  113.     strcpy(filenames[2],argv[counter]);
  114.   else
  115.     {
  116.       fprintf(stderr,"Error: -i flag requires argument.n");
  117.       exit(EXIT_FAILURE);
  118.     }
  119.   counter++;
  120.   *btype = USER;
  121.   break;
  122. case 'w':
  123.   counter++;
  124.   switch(argv[counter][0])
  125.     {
  126.     case 'b':
  127.     case 'B':
  128.       *wtype = BAL;
  129.       break;
  130.     case 'g':
  131.     case 'G':
  132.     case 'o':
  133.     case 'O':
  134.       *wtype = OLS;
  135.       break;
  136.     default:
  137.       fprintf(stderr,"Unknown argument to -w option: please");
  138.       fprintf(stderr," use (b)alanced or (O)LSn");
  139.       exit(EXIT_FAILURE);
  140.     }
  141.   counter++;
  142.   break;
  143. case 'b':
  144.   counter++;
  145.   switch(argv[counter][0])
  146.     {
  147.     case 'b':
  148.     case 'B':
  149.       *btype = BAL;
  150.       break;
  151.     case 'g':
  152.     case 'G':
  153.     case 'o':
  154.     case 'O':
  155.       *btype = OLS;
  156.       break;
  157.     default:
  158.       fprintf(stderr,"Unknown argument to -b option: please");
  159.       fprintf(stderr," use BME or GMEn");
  160.       exit(EXIT_FAILURE);
  161.     }
  162.   counter++;
  163.   break;
  164. case 'n':
  165.   counter++;
  166.   *numDataSets = i = 0;
  167.   while (argv[counter][i])
  168.     *numDataSets = 10* (*numDataSets) + (argv[counter][i++] - '0');
  169.   counter++;
  170.   break;
  171. case 's':
  172.   counter++;
  173.   switch(argv[counter][0])
  174.     {
  175.     case 'b':
  176.     case 'B':
  177.       *ntype = BAL;
  178.       break;
  179.     case 'g':
  180.     case 'G':
  181.     case 'o':
  182.     case 'O':
  183.       *ntype = OLS;
  184.       break;
  185.     case 'n':
  186.     case 'N':
  187.       *ntype = NONE;
  188.       break;
  189.     default:
  190.       fprintf(stderr,"Unknown argument to -s option: please");
  191.       fprintf(stderr," use BME, GME, or nonen");
  192.       exit(EXIT_FAILURE);
  193.     }
  194.   counter++;
  195.   break;
  196. case 'v':
  197.   verbose = TRUE_FASTME;
  198.   counter++;
  199.   break;
  200. case 'h':
  201. default:
  202.   fprintf(stderr,"Usage: fastme -binostvn");
  203.   fprintf(stderr,"-b specify method for building initial tree: ");
  204.   fprintf(stderr,"BME or GME(default).n");
  205.   fprintf(stderr,"-i filename of distance matrixn");
  206.   fprintf(stderr,"-n number of trees/matrices input (default = 1)n");
  207.   fprintf(stderr,"-o filename for meTree outputn");
  208.   fprintf(stderr,"-s specify type of meTree swapping (NNIs): ");
  209.   fprintf(stderr,"(b)alanced, (O)LS, or (n)one. (Default is balanced.)n");
  210.   fprintf(stderr,"-t (optional) filename of starting meTree topologyn");
  211.   fprintf(stderr,"-v for verbose outputn");
  212.   fprintf(stderr,"-w (b)alanced or (O)LS weights (if not doing NNIs on input topology) n");
  213.   fprintf(stderr,"-help to get this messagen");
  214.   exit(0);
  215. }
  216.     }
  217. }
  218. double **initDoubleMatrix(int d)
  219. {
  220.   int i,j;
  221.   double **A;
  222.   A = (double **) malloc(d*sizeof(double *));
  223.   for(i=0;i<d;i++)
  224.     {
  225.       A[i] = (double *) malloc(d*sizeof(double));
  226.       for(j=0;j<d;j++)
  227. A[i][j] = 0.0;
  228.     }
  229.   return(A);
  230. }
  231. /*void fastme_run(int argc, char **argv)*/
  232. meTree* fastme_run(double** D_in, int numSpecies_in, char **labels, int btype_in, int wtype_in, int ntype_in)
  233. {
  234. //  FILE *ifile2, *ofile;
  235.   double **D, **A;
  236.   meSet *species, *slooper;
  237. //  char **filenames;
  238.   char *treeString = NULL;   /* space for this allocated in newickPrintTreeString */
  239.   meTree *T;
  240.   int setCounter = 0;
  241.   int numSets = 1;
  242.   int count = 0;
  243.   int nniCount = 0;
  244.   int ntype = ntype_in, btype = btype_in, wtype = wtype_in;
  245.   numSpecies = numSpecies_in;
  246.   T = NULL;
  247. //  int i;
  248. //  FILE *ifile1;
  249. //  char **filenames;
  250. //  ntype = BAL;
  251. //  wtype = btype = OLS;
  252. //  verbose = FALSE_FASTME;
  253. //  filenames = (char **) malloc (3*sizeof(char *));
  254. //  for(i=0;i<3;i++)
  255. //    filenames[i] = (char *) malloc(MAX_FILE_NAME_LENGTH*sizeof(char));
  256. //  chooseSettings(argc,argv,&btype,&ntype,&wtype,&numSets,filenames);
  257. /*   ifile1 = fopen(filenames[0],"r"); */
  258. /*   if (!ifile1) */
  259. /*     { */
  260. /*       fprintf(stderr,"Error opening input file %sn",filenames[0]); */
  261. /*       exit(EXIT_FAILURE); */
  262. /*     } */
  263. /*   ofile = fopen(filenames[1],"w"); */
  264. /*   if (!ofile) */
  265. /*     { */
  266. /*       fprintf(stderr,"Error opening output file %sn",filenames[1]); */
  267. /*       exit(EXIT_FAILURE); */
  268. /*     } */
  269. /*   if (USER == btype) */
  270. /*     ifile2 = fopen(filenames[2],"r"); */
  271.   while ( setCounter < numSets ) {
  272.     species = (meSet *) malloc(sizeof(meSet));
  273.     species->firstNode = NULL;
  274.     species->secondNode = NULL;
  275.     D = loadMatrix(D_in,labels,&numSpecies,species);
  276.     A = initDoubleMatrix(2*numSpecies-2);  
  277.     switch(btype)
  278.     {
  279.     case USER:
  280. /*
  281.  *  Old option for user-specified tree from file.
  282.         if (!ifile2)
  283.             {
  284.                 fprintf(stderr,"Error opening input file %sn",filenames[2]);
  285.                 exit(EXIT_FAILURE);
  286.             }
  287.         T = loadNewickTree(ifile2,numSpecies);
  288.         T = detrifurcate(T);      
  289.         compareSets(T,species,ofile);
  290.         partitionSizes(T);
  291. */
  292. break;
  293.     case OLS:
  294.         for(slooper = species; NULL != slooper; slooper = slooper->secondNode)
  295.             T = GMEaddSpecies(T,slooper->firstNode,D,A);
  296.         break;
  297.     case BAL:
  298.         for(slooper = species; NULL != slooper; slooper = slooper->secondNode)
  299.             T = BMEaddSpecies(T,slooper->firstNode,D,A);
  300.         break;
  301.     }
  302.     switch(wtype) /*assign weights*/
  303.         {
  304.             
  305.             break;
  306.         case BAL:
  307.             
  308.             break;
  309.         }
  310.     switch(ntype)
  311.       {      
  312.       case OLS:
  313. if (OLS != btype)
  314.   assignAllSizeFields(T);
  315. makeOLSAveragesTable(T,D,A);
  316. NNI(T,A,&nniCount);
  317. assignOLSWeights(T,A);
  318. break;
  319.       case BAL:
  320. if (BAL != btype)
  321.   makeBMEAveragesTable(T,D,A);
  322. bNNI(T,A,&nniCount);
  323. assignBMEWeights(T,A);
  324. break;
  325.       case NONE:
  326. switch(wtype)
  327.   {
  328.   case OLS:
  329.     if (OLS != btype)
  330.       assignAllSizeFields(T);
  331.     makeOLSAveragesTable(T,D,A);
  332.     assignOLSWeights(T,A);
  333.     break;
  334.   case BAL:
  335.     if (BAL != btype)
  336.       makeBMEAveragesTable(T,D,A);
  337.     assignBMEWeights(T,A);
  338.     break;
  339.   default:
  340.     fprintf(stderr,"Error in program: variable 'btype' has illegal ");
  341.       fprintf(stderr,"value %d.n",btype);
  342.       exit(EXIT_FAILURE);
  343.   }
  344. break;
  345.       default:
  346. fprintf(stderr,"Error in program: variable 'ntype' has illegal ");
  347. fprintf(stderr,"value %d.n",ntype);
  348. exit(EXIT_FAILURE);
  349.       }
  350. /*     NewickPrintTree(T,ofile); */
  351. if (T == NULL) {
  352. return NULL;
  353. }
  354.    /* treeString = NewickPrintTreeString(T); */
  355.     freeMatrix(D,numSpecies);
  356.     freeMatrix(A,2*numSpecies - 2);
  357.     freeSet(species);
  358.     //freeTree(T);
  359.     //T = NULL;
  360.     setCounter++;
  361.     if ((verbose) && (ntype))
  362.       printf("Performed %d NNIs on data meSet %dn",nniCount,setCounter);
  363.     nniCount = 0;
  364.   }
  365.   return T;
  366. }
  367. /* main(int argc, char **argv) */
  368. /* { */
  369. /*     fprintf(stdout, "Hello from fastme!n"); */
  370. /* } */
  371. END_SCOPE(fastme)
  372. END_NCBI_SCOPE
  373. /*
  374.  * ===========================================================================
  375.  * $Log: fastme.cpp,v $
  376.  * Revision 1000.1  2004/06/01 18:09:53  gouriano
  377.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  378.  *
  379.  * Revision 1.2  2004/05/21 21:41:03  gorelenk
  380.  * Added PCH ncbi_pch.hpp
  381.  *
  382.  * Revision 1.1  2004/02/10 15:16:01  jcherry
  383.  * Initial version
  384.  *
  385.  * ===========================================================================
  386.  */