]> git.donarmstrong.com Git - mothur.git/blobdiff - preclustercommand.cpp
fixed classify.seqs output file name - had issue if reference taxonomy file did not...
[mothur.git] / preclustercommand.cpp
index 21de0344e7c856bb83105abe9b51cf8fe5b4a8ec..bcff0fcd820a497da04405bef0ddb42d7d60ded9 100644 (file)
@@ -147,7 +147,7 @@ PreClusterCommand::PreClusterCommand(string option) {
                        // ...at some point should added some additional type checking...
                        namefile = validParameter.validFile(parameters, "name", true);
                        if (namefile == "not found") { namefile =  "";  }
-                       else if (namefile == "not open") { abort = true; }      
+                       else if (namefile == "not open") { namefile = ""; abort = true; }       
                        else {  m->setNameFile(namefile); }
                        
                        groupfile = validParameter.validFile(parameters, "group", true);
@@ -162,7 +162,10 @@ PreClusterCommand::PreClusterCommand(string option) {
                        m->setProcessors(temp);
                        m->mothurConvert(temp, processors);
                        
-                       
+                       if (namefile == "") {
+                               vector<string> files; files.push_back(fastafile);
+                               parser.getNameFile(files);
+                       }
                }
                                
        }
@@ -214,17 +217,19 @@ int PreClusterCommand::execute(){
                        m->mothurOutEndLine(); 
                        m->mothurOut("/******************************************/"); m->mothurOutEndLine(); 
                        m->mothurOut("Running command: unique.seqs(" + inputString + ")"); m->mothurOutEndLine(); 
-                       
+                       m->mothurCalling = true;
+            
                        Command* uniqueCommand = new DeconvoluteCommand(inputString);
                        uniqueCommand->execute();
                        
                        map<string, vector<string> > filenames = uniqueCommand->getOutputFiles();
                        
                        delete uniqueCommand;
-                       
+                       m->mothurCalling = false;
                        m->mothurOut("/******************************************/"); m->mothurOutEndLine(); 
                        
                        m->renameFile(filenames["fasta"][0], newFastaFile);
+            m->renameFile(filenames["name"][0], newNamesFile);
                        
                        m->mothurOut("It took " + toString(time(NULL) - start) + " secs to run pre.cluster."); m->mothurOutEndLine(); 
                                
@@ -299,7 +304,7 @@ int PreClusterCommand::createProcessesGroups(SequenceParser* parser, string newF
                        lines.push_back(linePair(startIndex, endIndex));
                }
                
-#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux)          
+#if defined (__APPLE__) || (__MACH__) || (linux) || (__linux) || (__linux__) || (__unix__) || (__unix)         
                
                //loop through and create all the processes you want
                while (process != processors) {
@@ -309,7 +314,17 @@ int PreClusterCommand::createProcessesGroups(SequenceParser* parser, string newF
                                processIDS.push_back(pid);  //create map from line number to pid so you can append files in correct order later
                                process++;
                        }else if (pid == 0){
+                outputNames.clear();
                                num = driverGroups(parser, newFName + toString(getpid()) + ".temp", newNName + toString(getpid()) + ".temp", newMFile, lines[process].start, lines[process].end, groups);
+                
+                string tempFile = toString(getpid()) + ".outputNames.temp";
+                ofstream outTemp;
+                m->openOutputFile(tempFile, outTemp);
+                
+                outTemp << outputNames.size();
+                for (int i = 0; i < outputNames.size(); i++) { outTemp << outputNames[i] << endl; }
+                outTemp.close();
+                
                                exit(0);
                        }else { 
                                m->mothurOut("[ERROR]: unable to spawn the necessary processes."); m->mothurOutEndLine(); 
@@ -326,7 +341,23 @@ int PreClusterCommand::createProcessesGroups(SequenceParser* parser, string newF
                        int temp = processIDS[i];
                        wait(&temp);
                }
-               
+        
+        for (int i = 0; i < processIDS.size(); i++) {
+            string tempFile = toString(processIDS[i]) +  ".outputNames.temp";
+            ifstream intemp;
+            m->openInputFile(tempFile, intemp);
+            
+            int num;
+            intemp >> num;
+            for (int k = 0; k < num; k++) {
+                string name = "";
+                intemp >> name; m->gobble(intemp);
+                
+                outputNames.push_back(name); outputTypes["map"].push_back(name);
+            }
+            intemp.close();
+            m->mothurRemove(tempFile);
+        }
 #else
                
                //////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -511,7 +542,7 @@ int PreClusterCommand::readFASTA(){
                m->openInputFile(fastafile, inFasta);
                
                //string firstCol, secondCol, nameString;
-               length = 0;
+               set<int> lengths;
                
                while (!inFasta.eof()) {
                        
@@ -537,17 +568,21 @@ int PreClusterCommand::readFASTA(){
                                        else{
                                                seqPNode tempNode(itSize->second, seq, names[seq.getName()]);
                                                alignSeqs.push_back(tempNode);
-                                               if (seq.getAligned().length() > length) {  length = seq.getAligned().length();  }
+                                               lengths.insert(seq.getAligned().length());
                                        }       
                                }else { //no names file, you are identical to yourself 
                                        seqPNode tempNode(1, seq, seq.getName());
                                        alignSeqs.push_back(tempNode);
-                                       if (seq.getAligned().length() > length) {  length = seq.getAligned().length();  }
+                                       lengths.insert(seq.getAligned().length());
                                }
                        }
                }
                inFasta.close();
                //inNames.close();
+        
+        if (lengths.size() > 1) { m->control_pressed = true; m->mothurOut("[ERROR]: your sequences are not all the same length. pre.cluster requires sequences to be aligned."); m->mothurOutEndLine(); }
+        else if (lengths.size() == 1) { length = *(lengths.begin()); }
+        
                return alignSeqs.size();
        }
        
@@ -559,7 +594,7 @@ int PreClusterCommand::readFASTA(){
 /**************************************************************************************************/
 int PreClusterCommand::loadSeqs(map<string, string>& thisName, vector<Sequence>& thisSeqs){
        try {
-               length = 0;
+               set<int> lengths;
                alignSeqs.clear();
                map<string, string>::iterator it;
                bool error = false;
@@ -582,15 +617,18 @@ int PreClusterCommand::loadSeqs(map<string, string>& thisName, vector<Sequence>&
                                        
                                        seqPNode tempNode(numReps, thisSeqs[i], it->second);
                                        alignSeqs.push_back(tempNode);
-                                       if (thisSeqs[i].getAligned().length() > length) {  length = thisSeqs[i].getAligned().length();  }
+                    lengths.insert(thisSeqs[i].getAligned().length());
                                }       
                        }else { //no names file, you are identical to yourself 
                                seqPNode tempNode(1, thisSeqs[i], thisSeqs[i].getName());
                                alignSeqs.push_back(tempNode);
-                               if (thisSeqs[i].getAligned().length() > length) {  length = thisSeqs[i].getAligned().length();  }
+                               lengths.insert(thisSeqs[i].getAligned().length());
                        }
                }
                
+        if (lengths.size() > 1) { error = true; m->mothurOut("[ERROR]: your sequences are not all the same length. pre.cluster requires sequences to be aligned."); m->mothurOutEndLine(); }
+        else if (lengths.size() == 1) { length = *(lengths.begin()); }
+        
                //sanity check
                if (error) { m->control_pressed = true; }