]> git.donarmstrong.com Git - mothur.git/blobdiff - chimeraslayercommand.cpp
1.12.1
[mothur.git] / chimeraslayercommand.cpp
index 35b0433152da0f2c590c4822fa5879d136938377..1dd3d4221975a33bf52e5e6031029c97d66e0ca5 100644 (file)
@@ -29,7 +29,7 @@ ChimeraSlayerCommand::ChimeraSlayerCommand(string option)  {
                        OptionParser parser(option);
                        map<string,string> parameters = parser.getParameters();
                        
-                       ValidParameters validParameter;
+                       ValidParameters validParameter("chimera.slayer");
                        map<string,string>::iterator it;
                        
                        //check to make sure all parameters are valid for command
@@ -77,7 +77,17 @@ ChimeraSlayerCommand::ChimeraSlayerCommand(string option)  {
                                                if (pid == 0) {
                                        #endif
 
-                                       ableToOpen = openInputFile(fastaFileNames[i], in);
+                                       ableToOpen = openInputFile(fastaFileNames[i], in, "noerror");
+                               
+                                       //if you can't open it, try default location
+                                       if (ableToOpen == 1) {
+                                               if (m->getDefaultPath() != "") { //default path is set
+                                                       string tryPath = m->getDefaultPath() + getSimpleName(fastaFileNames[i]);
+                                                       m->mothurOut("Unable to open " + fastaFileNames[i] + ". Trying default " + tryPath); m->mothurOutEndLine();
+                                                       ableToOpen = openInputFile(tryPath, in, "noerror");
+                                                       fastaFileNames[i] = tryPath;
+                                               }
+                                       }
                                        in.close();
                                        
                                        #ifdef USE_MPI  
@@ -92,7 +102,7 @@ ChimeraSlayerCommand::ChimeraSlayerCommand(string option)  {
                                        #endif
 
                                        if (ableToOpen == 1) { 
-                                               m->mothurOut(fastaFileNames[i] + " will be disregarded."); m->mothurOutEndLine(); 
+                                               m->mothurOut("Unable to open " + fastaFileNames[i] + ". It will be disregarded."); m->mothurOutEndLine(); 
                                                //erase from file list
                                                fastaFileNames.erase(fastaFileNames.begin()+i);
                                                i--;
@@ -140,7 +150,7 @@ ChimeraSlayerCommand::ChimeraSlayerCommand(string option)  {
                        temp = validParameter.validFile(parameters, "minbs", false);                    if (temp == "not found") { temp = "90"; }
                        convert(temp, minBS);
                        
-                       temp = validParameter.validFile(parameters, "minsnp", false);                   if (temp == "not found") { temp = "10"; }
+                       temp = validParameter.validFile(parameters, "minsnp", false);                   if (temp == "not found") { temp = "100"; }
                        convert(temp, minSNP);
 
                        temp = validParameter.validFile(parameters, "parents", false);                  if (temp == "not found") { temp = "3"; }
@@ -177,7 +187,7 @@ void ChimeraSlayerCommand::help(){
                m->mothurOut("This command was modeled after the chimeraSlayer written by the Broad Institute.\n");
                m->mothurOut("The chimera.slayer command parameters are fasta, template, processors, ksize, window, match, mismatch, divergence. minsim, mincov, minbs, minsnp, parents, search, iters, increment and numwanted.\n"); //realign,
                m->mothurOut("The fasta parameter allows you to enter the fasta file containing your potentially chimeric sequences, and is required. \n");
-               m->mothurOut("You may enter multiple fasta files by separating their names with dashes. ie. fasta=abrecovery.fasta-amzon.fasta \n");
+               m->mothurOut("You may enter multiple fasta files by separating their names with dashes. ie. fasta=abrecovery.fasta-amazon.fasta \n");
                m->mothurOut("The template parameter allows you to enter a template file containing known non-chimeric sequences, and is required. \n");
                m->mothurOut("The processors parameter allows you to specify how many processors you would like to use.  The default is 1. \n");
                #ifdef USE_MPI
@@ -195,7 +205,7 @@ void ChimeraSlayerCommand::help(){
                m->mothurOut("The minsim parameter allows you to specify a minimum similarity with the parent fragments, default=90. \n");
                m->mothurOut("The mincov parameter allows you to specify minimum coverage by closest matches found in template. Default is 70, meaning 70%. \n");
                m->mothurOut("The minbs parameter allows you to specify minimum bootstrap support for calling a sequence chimeric. Default is 90, meaning 90%. \n");
-               m->mothurOut("The minsnp parameter allows you to specify percent of SNPs to sample on each side of breakpoint for computing bootstrap support (default: 10) \n");
+               m->mothurOut("The minsnp parameter allows you to specify percent of SNPs to sample on each side of breakpoint for computing bootstrap support (default: 100) \n");
                m->mothurOut("The search parameter allows you to specify search method for finding the closest parent. Choices are distance, blast, and kmer, default distance. \n");
                m->mothurOut("The realign parameter allows you to realign the query to the potential parents. Choices are true or false, default false.  \n");
                m->mothurOut("The chimera.slayer command should be in the following format: \n");
@@ -230,7 +240,6 @@ int ChimeraSlayerCommand::execute(){
                                                        
                        string outputFileName = outputDir + getRootName(getSimpleName(fastaFileNames[s])) + "slayer.chimeras";
                        string accnosFileName = outputDir + getRootName(getSimpleName(fastaFileNames[s]))  + "slayer.accnos";
-                       bool hasAccnos = true;
                        
                        if (m->control_pressed) { delete chimera; for (int j = 0; j < outputNames.size(); j++) {        remove(outputNames[j].c_str()); }  return 0;    }
                        
@@ -244,8 +253,7 @@ int ChimeraSlayerCommand::execute(){
                #ifdef USE_MPI  
                        int pid, end, numSeqsPerProcessor; 
                                int tag = 2001;
-                               vector<long> MPIPos;
-                               MPIWroteAccnos = false;
+                               vector<unsigned long int> MPIPos;
                                
                                MPI_Status status; 
                                MPI_Comm_rank(MPI_COMM_WORLD, &pid); //find out who we are
@@ -306,11 +314,6 @@ int ChimeraSlayerCommand::execute(){
                                        
                                        if (m->control_pressed) {  MPI_File_close(&inMPI);  MPI_File_close(&outMPI);   MPI_File_close(&outMPIAccnos);  for (int j = 0; j < outputNames.size(); j++) {   remove(outputNames[j].c_str()); }  remove(outputFileName.c_str());  remove(accnosFileName.c_str());  delete chimera; return 0;  }
 
-                                       for (int i = 1; i < processors; i++) {
-                                               bool tempResult;
-                                               MPI_Recv(&tempResult, 1, MPI_INT, i, tag, MPI_COMM_WORLD, &status);
-                                               if (tempResult != 0) { MPIWroteAccnos = true; }
-                                       }
                                }else{ //you are a child process
                                        MPI_Recv(&numSeqs, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
                                        MPIPos.resize(numSeqs+1);
@@ -325,8 +328,6 @@ int ChimeraSlayerCommand::execute(){
                                        driverMPI(startIndex, numSeqsPerProcessor, inMPI, outMPI, outMPIAccnos, MPIPos);
                                        
                                        if (m->control_pressed) {  MPI_File_close(&inMPI);  MPI_File_close(&outMPI);   MPI_File_close(&outMPIAccnos);  for (int j = 0; j < outputNames.size(); j++) {   remove(outputNames[j].c_str()); }  delete chimera; return 0;  }
-
-                                       MPI_Send(&MPIWroteAccnos, 1, MPI_INT, 0, tag, MPI_COMM_WORLD); 
                                }
                                
                                //close files 
@@ -335,14 +336,6 @@ int ChimeraSlayerCommand::execute(){
                                MPI_File_close(&outMPIAccnos);
                                MPI_Barrier(MPI_COMM_WORLD); //make everyone wait - just in case
                                
-                               //delete accnos file if blank
-                               if (pid == 0) {
-                                       if (!MPIWroteAccnos) { 
-                                               hasAccnos = false;      
-                                               remove(accnosFileName.c_str()); 
-                                       }
-                               }
-                       
                #else
                        ofstream outHeader;
                        string tempHeader = outputDir + getRootName(getSimpleName(fastaFileNames[s])) + "slayer.chimeras.tempHeader";
@@ -373,11 +366,8 @@ int ChimeraSlayerCommand::execute(){
                                                return 0;
                                        }
                                        
-                                       //delete accnos file if its blank 
-                                       if (isBlank(accnosFileName)) {  remove(accnosFileName.c_str());  hasAccnos = false; }
-                                                                       
                                }else{
-                                       vector<int> positions;
+                                       vector<unsigned long int> positions;
                                        processIDS.resize(0);
                                        
                                        ifstream inFASTA;
@@ -387,7 +377,7 @@ int ChimeraSlayerCommand::execute(){
                                        while(!inFASTA.eof()){
                                                input = getline(inFASTA);
                                                if (input.length() != 0) {
-                                                       if(input[0] == '>'){    long int pos = inFASTA.tellg(); positions.push_back(pos - input.length() - 1);  }
+                                                       if(input[0] == '>'){    unsigned long int pos = inFASTA.tellg(); positions.push_back(pos - input.length() - 1); }
                                                }
                                        }
                                        inFASTA.close();
@@ -397,7 +387,7 @@ int ChimeraSlayerCommand::execute(){
                                        int numSeqsPerProcessor = numSeqs / processors;
                                        
                                        for (int i = 0; i < processors; i++) {
-                                               long int startPos = positions[ i * numSeqsPerProcessor ];
+                                               unsigned long int startPos = positions[ i * numSeqsPerProcessor ];
                                                if(i == processors - 1){
                                                        numSeqsPerProcessor = numSeqs - i * numSeqsPerProcessor;
                                                }
@@ -407,6 +397,7 @@ int ChimeraSlayerCommand::execute(){
                                        createProcesses(outputFileName, fastaFileNames[s], accnosFileName); 
                                
                                        rename((outputFileName + toString(processIDS[0]) + ".temp").c_str(), outputFileName.c_str());
+                                       rename((accnosFileName + toString(processIDS[0]) + ".temp").c_str(), accnosFileName.c_str());
                                                
                                        //append output files
                                        for(int i=1;i<processors;i++){
@@ -414,24 +405,12 @@ int ChimeraSlayerCommand::execute(){
                                                remove((outputFileName + toString(processIDS[i]) + ".temp").c_str());
                                        }
                                        
-                                       vector<string> nonBlankAccnosFiles;
-                                       //delete blank accnos files generated with multiple processes
-                                       for(int i=0;i<processors;i++){  
-                                               if (!(isBlank(accnosFileName + toString(processIDS[i]) + ".temp"))) {
-                                                       nonBlankAccnosFiles.push_back(accnosFileName + toString(processIDS[i]) + ".temp");
-                                               }else { remove((accnosFileName + toString(processIDS[i]) + ".temp").c_str());  }
+                                       //append output files
+                                       for(int i=1;i<processors;i++){
+                                               appendFiles((accnosFileName + toString(processIDS[i]) + ".temp"), accnosFileName);
+                                               remove((accnosFileName + toString(processIDS[i]) + ".temp").c_str());
                                        }
                                        
-                                       //append accnos files
-                                       if (nonBlankAccnosFiles.size() != 0) { 
-                                               rename(nonBlankAccnosFiles[0].c_str(), accnosFileName.c_str());
-                                               
-                                               for (int h=1; h < nonBlankAccnosFiles.size(); h++) {
-                                                       appendFiles(nonBlankAccnosFiles[h], accnosFileName);
-                                                       remove(nonBlankAccnosFiles[h].c_str());
-                                               }
-                                       }else{ hasAccnos = false;  }
-                                       
                                        if (m->control_pressed) { 
                                                remove(outputFileName.c_str()); 
                                                remove(accnosFileName.c_str());
@@ -462,8 +441,6 @@ int ChimeraSlayerCommand::execute(){
                                                return 0;
                                }
                                
-                               //delete accnos file if its blank 
-                               if (isBlank(accnosFileName)) {  remove(accnosFileName.c_str());  hasAccnos = false; }
                        #endif
                        
                        appendFiles(outputFileName, tempHeader);
@@ -478,10 +455,10 @@ int ChimeraSlayerCommand::execute(){
                        for (int i = 0; i < lines.size(); i++) {  delete lines[i];  }  lines.clear();
                        
                        outputNames.push_back(outputFileName);
-                       if (hasAccnos) { outputNames.push_back(accnosFileName); }
+                       outputNames.push_back(accnosFileName); 
                        
                        m->mothurOutEndLine(); m->mothurOut("It took " + toString(time(NULL) - start) + " secs to check " + toString(numSeqs) + " sequences."); m->mothurOutEndLine();
-                       }
+               }
                
                m->mothurOutEndLine();
                m->mothurOut("Output File Names: "); m->mothurOutEndLine();
@@ -552,7 +529,7 @@ int ChimeraSlayerCommand::driver(linePair* line, string outputFName, string file
 }
 //**********************************************************************************************************************
 #ifdef USE_MPI
-int ChimeraSlayerCommand::driverMPI(int start, int num, MPI_File& inMPI, MPI_File& outMPI, MPI_File& outAccMPI, vector<long>& MPIPos){
+int ChimeraSlayerCommand::driverMPI(int start, int num, MPI_File& inMPI, MPI_File& outMPI, MPI_File& outAccMPI, vector<unsigned long int>& MPIPos){
        try {                           
                MPI_Status status; 
                int pid;
@@ -589,8 +566,6 @@ int ChimeraSlayerCommand::driverMPI(int start, int num, MPI_File& inMPI, MPI_Fil
                //cout << "about to print" << endl;
                                        //print results
                                        bool isChimeric = chimera->print(outMPI, outAccMPI);
-                                       if (isChimeric) { MPIWroteAccnos = true;  }
-       
                                }
                        }
                        delete candidateSeq;