]> git.donarmstrong.com Git - mothur.git/blobdiff - readphylip.cpp
changing command name classify.shared to classifyrf.shared
[mothur.git] / readphylip.cpp
index b13dc25c0eded92a950bfc41a782075624e47fdd..6de23e83279482127f5f261c53f94c345585455d 100644 (file)
@@ -33,12 +33,16 @@ int ReadPhylipMatrix::read(NameAssignment* nameMap){
         try {
         
                         float distance;
-                        int square, nseqs;
+                        int square, nseqs; 
                         string name;
                         vector<string> matrixNames;
-        
-                        fileHandle >> nseqs >> name;
-
+                                               
+                                               string numTest;
+                                               fileHandle >> numTest >> name;
+                       
+                                               if (!m->isContainingOnlyDigits(numTest)) { m->mothurOut("[ERROR]: expected a number and got " + numTest + ", quitting."); m->mothurOutEndLine(); exit(1); }
+                                               else { convert(numTest, nseqs); }
+                       
                         matrixNames.push_back(name);
 
                         if(nameMap == NULL){
@@ -68,7 +72,8 @@ int ReadPhylipMatrix::read(NameAssignment* nameMap){
                         }
         
                         Progress* reading;
-      
+                        DMatrix->resize(nseqs);
+        
                         if(square == 0){
 
                                 reading = new Progress("Reading matrix:     ", nseqs * (nseqs - 1) / 2);
@@ -91,14 +96,13 @@ int ReadPhylipMatrix::read(NameAssignment* nameMap){
                                                                                                                if (m->control_pressed) { delete reading; fileHandle.close(); return 0;  }
                                                                                                                
                                                         fileHandle >> distance;
-                                                                                       
                                                 
                                                         if (distance == -1) { distance = 1000000; }
                                                                                                                else if (sim) { distance = 1.0 - distance;  }  //user has entered a sim matrix that we need to convert.
                                                 
                                                         if(distance < cutoff){
-                                                                PCell value(i, j, distance);
-                                                                D->addCell(value);
+                                                            PDistCell value(i, distance);
+                                                            DMatrix->addCell(j, value);
                                                         }
                                                         index++;
                                                         reading->update(index);
@@ -117,8 +121,8 @@ int ReadPhylipMatrix::read(NameAssignment* nameMap){
                                                                                                                else if (sim) { distance = 1.0 - distance;  }  //user has entered a sim matrix that we need to convert.
                                                         
                                                         if(distance < cutoff){
-                                                                PCell value(nameMap->get(matrixNames[i]), nameMap->get(matrixNames[j]), distance);
-                                                                D->addCell(value);
+                                                            PDistCell value(nameMap->get(matrixNames[i]), distance);
+                                                            DMatrix->addCell(nameMap->get(matrixNames[j]), value);
                                                         }
                                                         index++;
                                                         reading->update(index);
@@ -149,8 +153,8 @@ int ReadPhylipMatrix::read(NameAssignment* nameMap){
                                                                                                                else if (sim) { distance = 1.0 - distance;  }  //user has entered a sim matrix that we need to convert.
                                                         
                                                         if(distance < cutoff && j < i){
-                                                                PCell value(i, j, distance);
-                                                                D->addCell(value);
+                                                            PDistCell value(i, distance);
+                                                            DMatrix->addCell(j, value);
                                                         }
                                                         index++;
                                                         reading->update(index);
@@ -169,8 +173,8 @@ int ReadPhylipMatrix::read(NameAssignment* nameMap){
                                                                                                                else if (sim) { distance = 1.0 - distance;  }  //user has entered a sim matrix that we need to convert.                                                        
                                                         
                                                                                                                if(distance < cutoff && j < i){
-                                                                PCell value(nameMap->get(matrixNames[i]), nameMap->get(matrixNames[j]), distance);
-                                                                D->addCell(value);
+                                                            PDistCell value(nameMap->get(matrixNames[i]), distance);
+                                                            DMatrix->addCell(nameMap->get(matrixNames[j]), value);
                                                         }
                                                         index++;
                                                         reading->update(index);
@@ -183,20 +187,11 @@ int ReadPhylipMatrix::read(NameAssignment* nameMap){
                                                
                         reading->finish();
                         delete reading;
-
+            
                         list->setLabel("0");
                         fileHandle.close();
 
-                     /*   if(nameMap != NULL){
-                                for(int i=0;i<matrixNames.size();i++){
-                                        nameMap->erase(matrixNames[i]);
-                                }
-                                if(nameMap->size() > 0){
-                                        //should probably tell them what is missing if we missed something
-                                        m->mothurOut("missed something\t" + toString(nameMap->size())); m->mothurOutEndLine();
-                                }
-                        } */
-                                               
+                                                               
                                                return 1;
 
                 }
@@ -205,10 +200,195 @@ int ReadPhylipMatrix::read(NameAssignment* nameMap){
                 exit(1);
         }
        }
-
 /***********************************************************************/
 
-ReadPhylipMatrix::~ReadPhylipMatrix(){
-       // delete D;
-       // delete list;
+int ReadPhylipMatrix::read(CountTable* countTable){
+    try {
+        
+        float distance;
+        int square, nseqs; 
+        string name;
+        vector<string> matrixNames;
+        
+        string numTest;
+        fileHandle >> numTest >> name;
+        
+        if (!m->isContainingOnlyDigits(numTest)) { m->mothurOut("[ERROR]: expected a number and got " + numTest + ", quitting."); m->mothurOutEndLine(); exit(1); }
+        else { convert(numTest, nseqs); }
+        
+        matrixNames.push_back(name);
+        
+        if(countTable == NULL){
+            list = new ListVector(nseqs);
+            list->set(0, name);
+        }
+        else{  list = new ListVector(countTable->getListVector()); }
+        
+        if (m->control_pressed) { return 0; }
+        
+        char d;
+        while((d=fileHandle.get()) != EOF){
+            
+            if(isalnum(d)){
+                square = 1;
+                fileHandle.putback(d);
+                for(int i=0;i<nseqs;i++){
+                    fileHandle >> distance;
+                }
+                break;
+            }
+            if(d == '\n'){
+                square = 0;
+                break;
+            }
+        }
+        
+        Progress* reading;
+        DMatrix->resize(nseqs);
+        
+        if(square == 0){
+            
+            reading = new Progress("Reading matrix:     ", nseqs * (nseqs - 1) / 2);
+            
+            int        index = 0;
+            
+            for(int i=1;i<nseqs;i++){
+                if (m->control_pressed) {  fileHandle.close();  delete reading; return 0; }
+                
+                fileHandle >> name;
+                matrixNames.push_back(name);
+                
+                
+                //there's A LOT of repeated code throughout this method...
+                if(countTable == NULL){
+                    list->set(i, name);
+                    
+                    for(int j=0;j<i;j++){
+                        
+                        if (m->control_pressed) { delete reading; fileHandle.close(); return 0;  }
+                        
+                        fileHandle >> distance;
+                        
+                        if (distance == -1) { distance = 1000000; }
+                        else if (sim) { distance = 1.0 - distance;  }  //user has entered a sim matrix that we need to convert.
+                        
+                        if(distance < cutoff){
+                            PDistCell value(i, distance);
+                            DMatrix->addCell(j, value);
+                        }
+                        index++;
+                        reading->update(index);
+                    }
+                    
+                }
+                else{
+                    for(int j=0;j<i;j++){
+                        fileHandle >> distance;
+                        
+                        if (m->control_pressed) { delete reading; fileHandle.close(); return 0;  }
+                        
+                        if (distance == -1) { distance = 1000000; }
+                        else if (sim) { distance = 1.0 - distance;  }  //user has entered a sim matrix that we need to convert.
+                        
+                        if(distance < cutoff){
+                            int iIndex = countTable->get(matrixNames[i]);
+                            int jIndex = countTable->get(matrixNames[j]);
+                            
+                            if (m->control_pressed) { delete reading; fileHandle.close(); return 0;  }
+                            if (iIndex < jIndex) { 
+                                PDistCell value(jIndex, distance);
+                                DMatrix->addCell(iIndex, value);
+                            }else {
+                                PDistCell value(iIndex, distance);
+                                DMatrix->addCell(jIndex, value);
+
+                            }
+                        }
+                        index++;
+                        reading->update(index);
+                    }
+                }
+            }
+        }
+        else{
+            
+            reading = new Progress("Reading matrix:     ", nseqs * nseqs);
+            
+            int index = nseqs;
+            
+            for(int i=1;i<nseqs;i++){
+                fileHandle >> name;                
+                matrixNames.push_back(name);
+                
+                
+                
+                if(countTable == NULL){
+                    list->set(i, name);
+                    for(int j=0;j<nseqs;j++){
+                        fileHandle >> distance;
+                        
+                        if (m->control_pressed) {  fileHandle.close();  delete reading; return 0; }
+                        
+                        if (distance == -1) { distance = 1000000; }
+                        else if (sim) { distance = 1.0 - distance;  }  //user has entered a sim matrix that we need to convert.
+                        
+                        if(distance < cutoff && j < i){
+                            PDistCell value(i, distance);
+                            DMatrix->addCell(j, value);
+                        }
+                        index++;
+                        reading->update(index);
+                    }
+                    
+                }
+                else{
+                    for(int j=0;j<nseqs;j++){
+                        fileHandle >> distance;
+                        
+                        if (m->control_pressed) {  fileHandle.close();  delete reading; return 0; }
+                        
+                        if (distance == -1) { distance = 1000000; }
+                        else if (sim) { distance = 1.0 - distance;  }  //user has entered a sim matrix that we need to convert.                                                        
+                        
+                        if(distance < cutoff && j < i){
+                            int iIndex = countTable->get(matrixNames[i]);
+                            int jIndex = countTable->get(matrixNames[j]);
+                            
+                            if (m->control_pressed) { delete reading; fileHandle.close(); return 0;  }
+                            if (iIndex < jIndex) { 
+                                PDistCell value(jIndex, distance);
+                                DMatrix->addCell(iIndex, value);
+                            }else {
+                                PDistCell value(iIndex, distance);
+                                DMatrix->addCell(jIndex, value);
+                                
+                            }
+                        }
+                        index++;
+                        reading->update(index);
+                    }
+                }
+            }
+        }
+        
+        if (m->control_pressed) {  fileHandle.close();  delete reading; return 0; }
+        
+        reading->finish();
+        delete reading;
+        
+        list->setLabel("0");
+        fileHandle.close();
+        
+        
+        return 1;
+        
+    }
+    catch(exception& e) {
+        m->errorOut(e, "ReadPhylipMatrix", "read");
+        exit(1);
+    }
 }
+/***********************************************************************/
+ReadPhylipMatrix::~ReadPhylipMatrix(){}
+/***********************************************************************/
+