]> git.donarmstrong.com Git - mothur.git/blobdiff - mgclustercommand.cpp
created blank accnos in chimera commands if no seqs are deemed chimeric. modified...
[mothur.git] / mgclustercommand.cpp
index 023f2142deb8584ad3794170b95e1b1d12889529..182e78dc31502fb6c9a75e1703c8f17ffe4ba0fb 100644 (file)
@@ -166,11 +166,20 @@ int MGClusterCommand::execute(){
                
                list = new ListVector(nameMap->getListVector());
                RAbundVector* rabund = new RAbundVector(list->getRAbundVector());
+for (int i = 0; i < list->getNumBins(); i++) {
+string bin = list->get(i);
+if(bin == "") {
+cout << "bin " << i << " is blank."<< endl;
+}
+}
+cout << "after outputting blank bins." << endl;
                
                if (m->control_pressed) { delete nameMap; delete read; delete list; delete rabund; return 0; }
                
                start = time(NULL);
                oldList = *list;
+               map<string, int> Seq2Bin;
+               map<string, int> oldSeq2Bin;
                
                if (method == "furthest")               { tag = "fn";  }
                else if (method == "nearest")   { tag = "nn";  }
@@ -198,13 +207,15 @@ int MGClusterCommand::execute(){
                        else if(method == "nearest"){   cluster = new SingleLinkage(rabund, list, distMatrix, cutoff, method); }
                        else if(method == "average"){   cluster = new AverageLinkage(rabund, list, distMatrix, cutoff, method); }
                        cluster->setMapWanted(true);
+                       Seq2Bin = cluster->getSeqtoBin();
+                       oldSeq2Bin = Seq2Bin;
                        
                        if (m->control_pressed) { 
                                delete nameMap; delete distMatrix; delete list; delete rabund; delete cluster;
                                listFile.close(); rabundFile.close(); sabundFile.close(); remove((fileroot+ tag + ".list").c_str()); remove((fileroot+ tag + ".rabund").c_str()); remove((fileroot+ tag + ".sabund").c_str());
                                return 0; 
                        }
-                       
+       int count = 0;          
                        //cluster using cluster classes
                        while (distMatrix->getSmallDist() < cutoff && distMatrix->getNNodes() > 0){
                                
@@ -223,16 +234,17 @@ int MGClusterCommand::execute(){
                                }else{
                                        rndDist = roundDist(dist, precision); 
                                }
-
+cout << "here " << count << '\t' << dist << endl;
                                
                                if(previousDist <= 0.0000 && dist != previousDist){
                                        oldList.setLabel("unique");
                                        printData(&oldList);
+                                       Seq2Bin = cluster->getSeqtoBin();
                                }
                                else if(rndDist != rndPreviousDist){
                                        if (merge) {
-                                               map<string, int> seq2Bin = cluster->getSeqtoBin();
-                                               ListVector* temp = mergeOPFs(seq2Bin, rndPreviousDist);
+                                               Seq2Bin = cluster->getSeqtoBin();
+                                               ListVector* temp = mergeOPFs(oldSeq2Bin, rndPreviousDist);
                                                
                                                if (m->control_pressed) { 
                                                        delete nameMap; delete distMatrix; delete list; delete rabund; delete cluster; delete temp;
@@ -248,20 +260,23 @@ int MGClusterCommand::execute(){
                                                printData(&oldList);
                                        }
                                }
-                               
+       //cout << "after merge " << count << '\t' << dist << endl;      
+       count++;                
                                previousDist = dist;
                                rndPreviousDist = rndDist;
                                oldList = *list;
+                               oldSeq2Bin = Seq2Bin;
                        }
                        
                        if(previousDist <= 0.0000){
                                oldList.setLabel("unique");
                                printData(&oldList);
+                               Seq2Bin = cluster->getSeqtoBin();
                        }
                        else if(rndPreviousDist<cutoff){
                                if (merge) {
-                                       map<string, int> seq2Bin = cluster->getSeqtoBin();
-                                       ListVector* temp = mergeOPFs(seq2Bin, rndPreviousDist);
+                                       Seq2Bin = cluster->getSeqtoBin();
+                                       ListVector* temp = mergeOPFs(oldSeq2Bin, rndPreviousDist);
                                        
                                        if (m->control_pressed) { 
                                                        delete nameMap; delete distMatrix; delete list; delete rabund; delete cluster; delete temp;
@@ -301,6 +316,8 @@ int MGClusterCommand::execute(){
                        //create cluster
                        hcluster = new HCluster(rabund, list, method, distFile, nameMap, cutoff);
                        hcluster->setMapWanted(true);
+                       Seq2Bin = cluster->getSeqtoBin();
+                       oldSeq2Bin = Seq2Bin;
                        
                        vector<seqDist> seqs; seqs.resize(1); // to start loop
                        //ifstream inHcluster;
@@ -348,11 +365,12 @@ int MGClusterCommand::execute(){
                                                if((previousDist <= 0.0000) && (seqs[i].dist != previousDist)){
                                                        oldList.setLabel("unique");
                                                        printData(&oldList);
+                                                       Seq2Bin = hcluster->getSeqtoBin();
                                                }
                                                else if((rndDist != rndPreviousDist)){
                                                        if (merge) {
-                                                               map<string, int> seq2Bin = hcluster->getSeqtoBin();
-                                                               ListVector* temp = mergeOPFs(seq2Bin, rndPreviousDist);
+                                                               Seq2Bin = hcluster->getSeqtoBin();
+                                                               ListVector* temp = mergeOPFs(oldSeq2Bin, rndPreviousDist);
                                                                
                                                                if (m->control_pressed) { 
                                                                        delete nameMap;  delete list; delete rabund; delete hcluster; delete temp;
@@ -374,6 +392,7 @@ int MGClusterCommand::execute(){
                                                previousDist = seqs[i].dist;
                                                rndPreviousDist = rndDist;
                                                oldList = *list;
+                                               oldSeq2Bin = Seq2Bin;
                                        }
                                }
                        }
@@ -385,8 +404,8 @@ int MGClusterCommand::execute(){
                        }
                        else if(rndPreviousDist<cutoff){
                                if (merge) {
-                                       map<string, int> seq2Bin = hcluster->getSeqtoBin();
-                                       ListVector* temp = mergeOPFs(seq2Bin, rndPreviousDist);
+                                       Seq2Bin = hcluster->getSeqtoBin();
+                                       ListVector* temp = mergeOPFs(oldSeq2Bin, rndPreviousDist);
                                        
                                        if (m->control_pressed) { 
                                                        delete nameMap; delete list; delete rabund; delete hcluster; delete temp;
@@ -466,6 +485,17 @@ ListVector* MGClusterCommand::mergeOPFs(map<string, int> binInfo, float dist){
        try {
                //create new listvector so you don't overwrite the clustering
                ListVector* newList = new ListVector(oldList);
+for (int i = 0; i < newList->getNumBins(); i++) {
+string bin = newList->get(i);
+if(bin == "") {
+cout << "bin " << i << " is blank."<< endl;
+for (map<string, int>::iterator itBin = binInfo.begin(); itBin != binInfo.end(); itBin++) {
+       if (itBin->second == i) { cout << itBin->first << " maps to an empty bin." << endl; }
+}
+}
+}
+cout << "after outputting blank bins." << endl;                
+
                bool done = false;
                ifstream inOverlap;
                int count = 0;
@@ -509,16 +539,24 @@ ListVector* MGClusterCommand::mergeOPFs(map<string, int> binInfo, float dist){
                                //get names of seqs that overlap
                                string name1 = nameMap->get(overlapNode.seq1);
                                string name2 = nameMap->get(overlapNode.seq2);
-                               
+                       
                                //use binInfo to find out if they are already in the same bin
-                               int binKeep = binInfo[name1];
-                               int binRemove = binInfo[name2];
+                               map<string, int>::iterator itBin1 = binInfo.find(name1);
+                               map<string, int>::iterator itBin2 = binInfo.find(name2);
                                
+                               if(itBin1 == binInfo.end()){  cerr << "AAError: Sequence '" << name1 << "' does not have any bin info.\n"; exit(1);  }
+                               if(itBin2 == binInfo.end()){  cerr << "ABError: Sequence '" << name2 << "' does not have any bin info.\n"; exit(1);  }
+cout << overlapNode.dist << '\t' << dist << endl;
+                               int binKeep = itBin1->second;
+                               int binRemove = itBin2->second;
+                       
                                //if not merge bins and update binInfo
                                if(binKeep != binRemove) {
+       cout << "bin keep = " << binKeep << " bin remove = " << binRemove << endl;              
                                        //save names in old bin
-                                       string names = list->get(binRemove);
-                                       
+                                       string names = newList->get(binRemove);
+                       cout << names << endl << endl << endl;  
+                       cout << newList->get(binKeep) << endl << endl << endl;  
                                        //merge bins into name1s bin
                                        newList->set(binKeep, newList->get(binRemove)+','+newList->get(binKeep));
                                        newList->set(binRemove, "");