00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <ncbi_pch.hpp>
00035 #include <stdio.h>
00036 #include <stdlib.h>
00037 #include <math.h>
00038 #include "fastme.h"
00039 #include "graph.h"
00040
00041 BEGIN_NCBI_SCOPE
00042 BEGIN_SCOPE(fastme)
00043
00044 boolean leaf(meNode *v);
00045
00046 meEdge *depthFirstTraverse(meTree *T, meEdge *e);
00047
00048 void compareSets(meTree *T, meSet *S, FILE *ofile)
00049 {
00050 meEdge *e;
00051 meNode *v,*w;
00052 meSet *X;
00053 e = depthFirstTraverse(T,NULL);
00054 while (NULL != e)
00055 {
00056 v = e->head;
00057 for(X = S; NULL != X; X = X->secondNode)
00058 {
00059 w = X->firstNode;
00060 if (0 == strcmp(v->label,w->label))
00061 {
00062 v->index2 = w->index2;
00063 w->index2 = -1;
00064 break;
00065 }
00066 }
00067 e = depthFirstTraverse(T,e);
00068 }
00069 v = T->root;
00070 for(X = S; NULL != X; X = X->secondNode)
00071 {
00072 w = X->firstNode;
00073 if (0 == strcmp(v->label,w->label))
00074 {
00075 v->index2 = w->index2;
00076 w->index2 = -1;
00077 break;
00078 }
00079 }
00080 if (-1 == v->index2)
00081 {
00082 fprintf(stderr,"Error leaf %s in meTree not in distance matrix.\n",v->label);
00083 exit(EXIT_FAILURE);
00084 }
00085 e = depthFirstTraverse(T,NULL);
00086 while (NULL != e)
00087 {
00088 v = e->head;
00089 if ((leaf(v)) && (-1 == v->index2))
00090 {
00091 fprintf(stderr,"Error leaf %s in meTree not in distance matrix.\n",v->label);
00092 exit(EXIT_FAILURE);
00093 }
00094 e = depthFirstTraverse(T,e);
00095 }
00096 for(X = S; NULL != X; X = X->secondNode)
00097 if (X->firstNode->index2 > -1)
00098 {
00099 fprintf(ofile,"(v1:0.0)v2;");
00100 fclose(ofile);
00101 fprintf(stderr,"Error meNode %s in matrix but not a leaf in tree.\n",X->firstNode->label);
00102 exit(EXIT_FAILURE);
00103 }
00104 }
00105
00106 void freeMatrix(double **D, int size)
00107 {
00108 int i;
00109 for(i=0;i<size;i++)
00110 free(D[i]);
00111 free(D);
00112 }
00113
00114 double **loadMatrix(double **table_in, char **labels, int *size_in, meSet *S)
00115 {
00116
00117 meNode *v;
00118 double **table;
00119 int *size;
00120 int i,j;
00121
00122 size = size_in;
00123 if ((*size < 0) || (*size > MAXSIZE))
00124 {
00125 printf("Problem inputting size.\n");
00126 exit(EXIT_FAILURE);
00127 }
00128 table = (double **) malloc(*size*sizeof(double *));
00129 for(i=0;i<*size;i++)
00130 {
00131 j = 0;
00132 table[i] = (double *) malloc(*size*sizeof(double));
00133
00134
00135
00136
00137
00138
00139 v = makeNewNode(labels[i],-1);
00140 v->index2 = i;
00141 S = addToSet(v,S);
00142 while (j < *size)
00143 {
00144
00145
00146
00147
00148
00149
00150 table[i][j] = table_in[i][j];
00151 j++;
00152 }
00153 }
00154 return(table);
00155 }
00156
00157 double **loadMatrixOLD(FILE *ifile, int *size, meSet *S)
00158 {
00159 char nextString[MAX_EVENT_NAME];
00160 meNode *v;
00161 double **table;
00162 int i,j;
00163 if (!(fscanf(ifile,"%s",nextString)))
00164 {
00165 fprintf(stderr,"Error loading input matrix.\n");
00166 exit(EXIT_FAILURE);
00167 }
00168 *size = atoi(nextString);
00169 if ((*size < 0) || (*size > MAXSIZE))
00170 {
00171 printf("Problem inputting size.\n");
00172 exit(EXIT_FAILURE);
00173 }
00174 table = (double **) malloc(*size*sizeof(double *));
00175 for(i=0;i<*size;i++)
00176 {
00177 j = 0;
00178 table[i] = (double *) malloc(*size*sizeof(double));
00179 if (!(fscanf(ifile,"%s",nextString)))
00180 {
00181 fprintf(stderr,"Error loading label %d.\n",i);
00182 exit(EXIT_FAILURE);
00183 }
00184 v = makeNewNode(nextString,-1);
00185 v->index2 = i;
00186 S = addToSet(v,S);
00187 while (j < *size)
00188 {
00189 if (!(fscanf(ifile,"%s",nextString)))
00190 {
00191 fprintf(stderr,"Error loading (%d,%d)-entry.\n",i,j);
00192 exit(EXIT_FAILURE);
00193 }
00194 table[i][j++] = atof(nextString);
00195 }
00196 }
00197 return(table);
00198 }
00199
00200 void partitionSizes(meTree *T)
00201 {
00202 meEdge *e;
00203 e = depthFirstTraverse(T,NULL);
00204 while (NULL != e)
00205 {
00206 if (leaf(e->head))
00207 e->bottomsize = 1;
00208 else
00209 e->bottomsize = e->head->leftEdge->bottomsize
00210 + e->head->rightEdge->bottomsize;
00211 e->topsize = (T->size + 2)/2 - e->bottomsize;
00212 e = depthFirstTraverse(T,e);
00213 }
00214 }
00215
00216
00217 END_SCOPE(fastme)
00218 END_NCBI_SCOPE
00219
00220