Sequence* free_Alignment ( Alignment *LA) { /* Does not free the A->S field (sequences of A)*/ Sequence *S; //aln_stack checks the alignment has not already been freed if ( LA==NULL || !aln_stack(LA,FREE_ALN)){return NULL;} S=LA->S; free_char ( LA->file, -1); free_char ( LA->seq_al, -1); free_int ( LA->seq_cache, -1); free_int ( LA->cdna_cache, -1); free_char ( LA->name,-1); free_char ( LA->tree_order,-1); vfree ( LA->generic_comment); free_char ( LA->seq_comment, -1); free_char ( LA->aln_comment, -1); free_int ( LA->order, -1); vfree ( LA->score_seq); vfree ( LA->len); free_profile (LA->P); if ( LA->A){free_Alignment (LA->A);LA->A=NULL;} vfree ( LA); return S; }
Sequence* free_aln ( Alignment *LA){ return free_Alignment(LA);}
char * msa2tree (char **mfa, unsigned int num) { // fprintf(stderr, "TREELIB: Starting msa2tree [%d]\n", num); struct DistanceMatrix *mat = NULL; struct Alignment *aln = NULL; struct ClusterGroup *group = NULL; struct Tree *njTree = NULL; char *treestring = NULL; assert(num >= 0); if (num == 0) { return NULL; } else if (num == 1) { if(asprintf(&treestring, "%d;", 0) == -1) fatal_util("asprintf failed"); return treestring; } else if (num == 2) { float dist = jcdist(mfa[0], mfa[1]); dist *= 0.5; if(asprintf(&treestring, "(%d:%g, %d:%g)", 0, dist, 1, dist) == -1) fatal_util("asprintf failed"); return treestring; } // fprintf(stderr, "TREELIB: Here is the msa\n"); // unsigned int i = 0; // for (i=0; i<num; i++) { // fprintf(stderr, "TREELIB:\t[%s]\n", mfa[i]); // } // fprintf(stderr, "TREELIB: Building the distance matrix\n"); mat = mfa2dist(mfa, num); aln_init(&aln, num); group = alignment_to_ClusterGroup(aln, 0); group->matrix = mat; // print_DistanceMatrix(stderr, mat); fprintf(stderr, "TREELIB: Building the NJ tree\n"); njTree = neighbour_joining_buildtree(group, 0); struct Tnode *tmpNode = NULL; tmpNode = njTree->child[2]; njTree->child[2] = NULL; // fprintf(stderr, "TREELIB: Rooting the tree\n"); struct Tnode *leftNode = NULL; leftNode = (struct Tnode *) malloc_util(sizeof(struct Tnode)); leftNode->left = njTree->child[0]; leftNode->right = njTree->child[1]; leftNode->distance = 0.0; struct Tnode *rootNode = NULL; rootNode = (struct Tnode *) malloc_util(sizeof(struct Tnode)); rootNode->left = leftNode; rootNode->right = tmpNode; njTree->child[0] = rootNode; njTree->child[1] = NULL; fprintf(stderr, "TREELIB: Converting tree to string\n"); treestring = tree2string(njTree); // fprintf(stderr, "TREELIB: [[%s]]\n", treestring); // fprintf(stderr, "TREELIB: free aln\n"); aln = free_Alignment(aln); // fprintf(stderr, "TREELIB: free group\n"); group = free_ClusterGroup(group); // fprintf(stderr, "TREELIB: free njTree\n"); // njTree = free_Tree(njTree); // fprintf(stderr, "TREELIB: Ending msa2tree\n"); return treestring; }