]> git.donarmstrong.com Git - mothur.git/blobdiff - deconvolutecommand.cpp
added SequenceCountParser class to parse the count table by group. added count parame...
[mothur.git] / deconvolutecommand.cpp
index 5888feedcf5f6d6c01438d5acecc5e65ba897c54..bab5a634cd101507957dabc22e34e429c5ec5b1b 100644 (file)
@@ -45,6 +45,27 @@ string DeconvoluteCommand::getHelpString(){
        }
 }
 //**********************************************************************************************************************
+string DeconvoluteCommand::getOutputFileNameTag(string type, string inputName=""){     
+       try {
+        string outputFileName = "";
+               map<string, vector<string> >::iterator it;
+        
+        //is this a type this command creates
+        it = outputTypes.find(type);
+        if (it == outputTypes.end()) {  m->mothurOut("[ERROR]: this command doesn't create a " + type + " output file.\n"); }
+        else {
+            if (type == "fasta") {  outputFileName =  "unique" + m->getExtension(inputName); }
+            else if (type == "name") {  outputFileName =  "names"; }
+            else { m->mothurOut("[ERROR]: No definition for type " + type + " output file tag.\n"); m->control_pressed = true;  }
+        }
+        return outputFileName;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "DeconvoluteCommand", "getOutputFileNameTag");
+               exit(1);
+       }
+}
+//**********************************************************************************************************************
 DeconvoluteCommand::DeconvoluteCommand(){      
        try {
                abort = true; calledHelp = true; 
@@ -125,9 +146,15 @@ DeconvoluteCommand::DeconvoluteCommand(string option)  {
                        }
                        
                        oldNameMapFName = validParameter.validFile(parameters, "name", true);
-                       if (oldNameMapFName == "not open") { abort = true; }
+                       if (oldNameMapFName == "not open") { oldNameMapFName = ""; abort = true; }
                        else if (oldNameMapFName == "not found"){       oldNameMapFName = "";   }
                        else { m->setNameFile(oldNameMapFName); }
+                       
+                       if (oldNameMapFName == "") {
+                               vector<string> files; files.push_back(inFastaName);
+                               parser.getNameFile(files);
+                       }
+                       
                }
 
        }
@@ -143,12 +170,15 @@ int DeconvoluteCommand::execute() {
                if (abort == true) { if (calledHelp) { return 0; }  return 2;   }
 
                //prepare filenames and open files
-               string outNameFile = outputDir + m->getRootName(m->getSimpleName(inFastaName)) + "names";
-               string outFastaFile = outputDir + m->getRootName(m->getSimpleName(inFastaName)) + "unique" + m->getExtension(inFastaName);
+               string outNameFile = outputDir + m->getRootName(m->getSimpleName(inFastaName)) + getOutputFileNameTag("name");
+               string outFastaFile = outputDir + m->getRootName(m->getSimpleName(inFastaName)) + getOutputFileNameTag("fasta", inFastaName);
                
                map<string, string> nameMap;
                map<string, string>::iterator itNames;
-               if (oldNameMapFName != "")  {  m->readNames(oldNameMapFName, nameMap); }
+               if (oldNameMapFName != "")  {  
+            m->readNames(oldNameMapFName, nameMap); 
+            if (oldNameMapFName == outNameFile){ outNameFile = outputDir + m->getRootName(m->getSimpleName(inFastaName)) + "unique." + getOutputFileNameTag("name");   }
+        }
                
                if (m->control_pressed) { return 0; }
                
@@ -162,10 +192,11 @@ int DeconvoluteCommand::execute() {
                map<string, string>::iterator itStrings;
                set<string> nameInFastaFile; //for sanity checking
                set<string>::iterator itname;
+               vector<string> nameFileOrder;
                int count = 0;
                while (!in.eof()) {
                        
-                       if (m->control_pressed) { in.close(); outFasta.close(); remove(outFastaFile.c_str()); return 0; }
+                       if (m->control_pressed) { in.close(); outFasta.close(); m->mothurRemove(outFastaFile); return 0; }
                        
                        Sequence seq(in);
                        
@@ -189,8 +220,9 @@ int DeconvoluteCommand::execute() {
                                                        m->mothurOut("[ERROR]: " + seq.getName() + " is in your fasta file, and not in your namefile, please correct."); m->mothurOutEndLine();
                                                }else {
                                                        sequenceStrings[seq.getAligned()] = itNames->second;
+                                                       nameFileOrder.push_back(seq.getAligned());
                                                }
-                                       }else { sequenceStrings[seq.getAligned()] = seq.getName();      }
+                                       }else { sequenceStrings[seq.getAligned()] = seq.getName();      nameFileOrder.push_back(seq.getAligned()); }
                                }else { //this is a dup
                                        if (oldNameMapFName != "") {
                                                itNames = nameMap.find(seq.getName());
@@ -216,27 +248,32 @@ int DeconvoluteCommand::execute() {
                in.close();
                outFasta.close();
                
-               if (m->control_pressed) { remove(outFastaFile.c_str()); return 0; }
+               if (m->control_pressed) { m->mothurRemove(outFastaFile); return 0; }
                
                //print new names file
                ofstream outNames;
                m->openOutputFile(outNameFile, outNames);
                
-               for (itStrings = sequenceStrings.begin(); itStrings != sequenceStrings.end(); itStrings++) {
-                       if (m->control_pressed) { outputTypes.clear(); remove(outFastaFile.c_str()); outNames.close(); remove(outNameFile.c_str()); return 0; }
+               for (int i = 0; i < nameFileOrder.size(); i++) {
+               //for (itStrings = sequenceStrings.begin(); itStrings != sequenceStrings.end(); itStrings++) {
+                       if (m->control_pressed) { outputTypes.clear(); m->mothurRemove(outFastaFile); outNames.close(); m->mothurRemove(outNameFile); return 0; }
                        
-                       //get rep name
-                       int pos = (itStrings->second).find_first_of(',');
+                       itStrings = sequenceStrings.find(nameFileOrder[i]);
                        
-                       if (pos == string::npos) { // only reps itself
-                               outNames << itStrings->second << '\t' << itStrings->second << endl;
-                       }else {
-                               outNames << (itStrings->second).substr(0, pos) << '\t' << itStrings->second << endl;
-                       }
+                       if (itStrings != sequenceStrings.end()) {
+                               //get rep name
+                               int pos = (itStrings->second).find_first_of(',');
+                       
+                               if (pos == string::npos) { // only reps itself
+                                       outNames << itStrings->second << '\t' << itStrings->second << endl;
+                               }else {
+                                       outNames << (itStrings->second).substr(0, pos) << '\t' << itStrings->second << endl;
+                               }
+                       }else{ m->mothurOut("[ERROR]: mismatch in namefile print."); m->mothurOutEndLine(); m->control_pressed = true; }
                }
                outNames.close();
                
-               if (m->control_pressed) { outputTypes.clear(); remove(outFastaFile.c_str()); remove(outNameFile.c_str()); return 0; }
+               if (m->control_pressed) { outputTypes.clear(); m->mothurRemove(outFastaFile); m->mothurRemove(outNameFile); return 0; }
                
                m->mothurOutEndLine();
                m->mothurOut("Output File Names: "); m->mothurOutEndLine();