]> git.donarmstrong.com Git - mothur.git/blobdiff - screenseqscommand.cpp
pat's slight modifications to trim.seqs
[mothur.git] / screenseqscommand.cpp
index f67dba7223eded3e55cc104841657ee229bc0db8..09b82cebe3138f44533aa477b0d24fa9165c0e08 100644 (file)
@@ -217,8 +217,10 @@ int ScreenSeqsCommand::execute(){
                                MPIPos = setFilePosFasta(fastafile, numFastaSeqs); //fills MPIPos, returns numSeqs
                                
                                //send file positions to all processes
-                               MPI_Bcast(&numFastaSeqs, 1, MPI_INT, 0, MPI_COMM_WORLD);  //send numSeqs
-                               MPI_Bcast(&MPIPos[0], (numFastaSeqs+1), MPI_LONG, 0, MPI_COMM_WORLD); //send file pos   
+                               for(int i = 1; i < processors; i++) { 
+                                       MPI_Send(&numFastaSeqs, 1, MPI_INT, i, tag, MPI_COMM_WORLD);
+                                       MPI_Send(&MPIPos[0], (numFastaSeqs+1), MPI_LONG, i, tag, MPI_COMM_WORLD);
+                               }
                                
                                //figure out how many sequences you have to align
                                numSeqsPerProcessor = numFastaSeqs / processors;
@@ -249,10 +251,10 @@ int ScreenSeqsCommand::execute(){
                                        }*/
                                }
                        }else{ //you are a child process
-                               MPI_Bcast(&numFastaSeqs, 1, MPI_INT, 0, MPI_COMM_WORLD); //get numSeqs
+                               MPI_Recv(&numFastaSeqs, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
                                MPIPos.resize(numFastaSeqs+1);
-                               MPI_Bcast(&MPIPos[0], (numFastaSeqs+1), MPI_LONG, 0, MPI_COMM_WORLD); //get file positions
-                               
+                               MPI_Recv(&MPIPos[0], (numFastaSeqs+1), MPI_LONG, 0, tag, MPI_COMM_WORLD, &status);
+
                                //figure out how many sequences you have to align
                                numSeqsPerProcessor = numFastaSeqs / processors;
                                int startIndex =  pid * numSeqsPerProcessor;
@@ -285,6 +287,7 @@ int ScreenSeqsCommand::execute(){
                        MPI_File_close(&outMPIGood);
                        MPI_File_close(&outMPIBad);
                        MPI_File_close(&outMPIBadAccnos);
+                       MPI_Barrier(MPI_COMM_WORLD); //make everyone wait - just in case
                                        
 #else
                                        
@@ -292,7 +295,7 @@ int ScreenSeqsCommand::execute(){
                        if(processors == 1){
                                ifstream inFASTA;
                                openInputFile(fastafile, inFASTA);
-                               numFastaSeqs=count(istreambuf_iterator<char>(inFASTA),istreambuf_iterator<char>(), '>');
+                               getNumSeqs(inFASTA, numFastaSeqs);
                                inFASTA.close();
                                
                                lines.push_back(new linePair(0, numFastaSeqs));
@@ -302,7 +305,7 @@ int ScreenSeqsCommand::execute(){
                                if (m->control_pressed) { remove(goodSeqFile.c_str()); remove(badSeqFile.c_str()); return 0; }
                                
                        }else{
-                               vector<int> positions;
+                               vector<unsigned long int> positions;
                                processIDS.resize(0);
                                
                                ifstream inFASTA;
@@ -312,21 +315,22 @@ int ScreenSeqsCommand::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();
                                
                                numFastaSeqs = positions.size();
-                               
+                       
                                int numSeqsPerProcessor = numFastaSeqs / 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 = numFastaSeqs - i * numSeqsPerProcessor;
                                        }
                                        lines.push_back(new linePair(startPos, numSeqsPerProcessor));
+               
                                }
                                
                                createProcesses(goodSeqFile, badSeqFile, badAccnosFile, fastafile, badSeqNames); 
@@ -366,7 +370,7 @@ int ScreenSeqsCommand::execute(){
        #else
                        ifstream inFASTA;
                        openInputFile(fastafile, inFASTA);
-                       numFastaSeqs=count(istreambuf_iterator<char>(inFASTA),istreambuf_iterator<char>(), '>');
+                       getNumSeqs(inFASTA, numFastaSeqs);
                        inFASTA.close();
                        
                        lines.push_back(new linePair(0, numFastaSeqs));
@@ -705,7 +709,7 @@ int ScreenSeqsCommand::driver(linePair* line, string goodFName, string badFName,
                inFASTA.seekg(line->start);
        
                for(int i=0;i<line->numSeqs;i++){
-                       
+               
                        if (m->control_pressed) {  return 0; }
                        
                        Sequence currSeq(inFASTA);