]> git.donarmstrong.com Git - mothur.git/blobdiff - alignmentdb.cpp
moved utilities out of mothur.h and into mothurOut class.
[mothur.git] / alignmentdb.cpp
index 4b324b49c0f081356ab84a119e9657b05199dcb4..e2b1dc197eb8d3399156a3ca752bff5da267101f 100644 (file)
@@ -25,30 +25,34 @@ AlignmentDB::AlignmentDB(string fastaFileName, string s, int kmerSize, float gap
                m->mothurOut("Reading in the " + fastaFileName + " template sequences...\t");   cout.flush();
                
                #ifdef USE_MPI  
-                       int pid;
-                       vector<long> positions;
+                       int pid, processors;
+                       vector<unsigned long int> positions;
                
                        MPI_Status status; 
                        MPI_File inMPI;
                        MPI_Comm_rank(MPI_COMM_WORLD, &pid); //find out who we are
+                       MPI_Comm_size(MPI_COMM_WORLD, &processors);
+                       int tag = 2001;
        
-                       char inFileName[fastaFileName.length()];
+                       char inFileName[1024];
                        strcpy(inFileName, fastaFileName.c_str());
        
                        MPI_File_open(MPI_COMM_WORLD, inFileName, MPI_MODE_RDONLY, MPI_INFO_NULL, &inMPI);  //comm, filename, mode, info, filepointer
                        
                        if (pid == 0) {
-                               positions = setFilePosFasta(fastaFileName, numSeqs); //fills MPIPos, returns numSeqs
+                               positions = m->setFilePosFasta(fastaFileName, numSeqs); //fills MPIPos, returns numSeqs
 
                                //send file positions to all processes
-                               MPI_Bcast(&numSeqs, 1, MPI_INT, 0, MPI_COMM_WORLD);  //send numSeqs
-                               MPI_Bcast(&positions[0], (numSeqs+1), MPI_LONG, 0, MPI_COMM_WORLD); //send file pos     
+                               for(int i = 1; i < processors; i++) { 
+                                       MPI_Send(&numSeqs, 1, MPI_INT, i, tag, MPI_COMM_WORLD);
+                                       MPI_Send(&positions[0], (numSeqs+1), MPI_LONG, i, tag, MPI_COMM_WORLD);
+                               }
                        }else{
-                               MPI_Bcast(&numSeqs, 1, MPI_INT, 0, MPI_COMM_WORLD); //get numSeqs
+                               MPI_Recv(&numSeqs, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
                                positions.resize(numSeqs+1);
-                               MPI_Bcast(&positions[0], (numSeqs+1), MPI_LONG, 0, MPI_COMM_WORLD); //get file positions
+                               MPI_Recv(&positions[0], (numSeqs+1), MPI_LONG, 0, tag, MPI_COMM_WORLD, &status);
                        }
-                       
+               
                        //read file 
                        for(int i=0;i<numSeqs;i++){
                                
@@ -56,12 +60,14 @@ AlignmentDB::AlignmentDB(string fastaFileName, string s, int kmerSize, float gap
                                
                                //read next sequence
                                int length = positions[i+1] - positions[i];
-                               char buf4[length];
+                               char* buf4 = new char[length];
+                       
                                MPI_File_read_at(inMPI, positions[i], buf4, length, MPI_CHAR, &status);
-                               
+               
                                string tempBuf = buf4;
                                if (tempBuf.length() > length) { tempBuf = tempBuf.substr(0, length); }
-                               
+                               delete buf4;
+
                                istringstream iss (tempBuf,istringstream::in);
                
                                Sequence temp(iss);  
@@ -72,13 +78,16 @@ AlignmentDB::AlignmentDB(string fastaFileName, string s, int kmerSize, float gap
                                }
                        }
                        
+                       MPI_Barrier(MPI_COMM_WORLD); //make everyone wait - just in case
+                       
                        MPI_File_close(&inMPI);
+               
        #else
                ifstream fastaFile;
-               openInputFile(fastaFileName, fastaFile);
+               m->openInputFile(fastaFileName, fastaFile);
 
                while (!fastaFile.eof()) {
-                       Sequence temp(fastaFile);  gobble(fastaFile);
+                       Sequence temp(fastaFile);  m->gobble(fastaFile);
                        
                        if (m->control_pressed) {  templateSequences.clear(); break;  }
                        
@@ -113,8 +122,11 @@ AlignmentDB::AlignmentDB(string fastaFileName, string s, int kmerSize, float gap
                        #else
                                kmerDBName = fastaFileName.substr(0,fastaFileName.find_last_of(".")+1) + char('0'+ kmerSize) + "mer";
                                ifstream kmerFileTest(kmerDBName.c_str());
-                       
-                               if(kmerFileTest){       needToGenerate = false;         }
+                               
+                               if(kmerFileTest){       
+                                       bool GoodFile = m->checkReleaseVersion(kmerFileTest, m->getVersion());
+                                       if (GoodFile) {  needToGenerate = false;        }
+                               }
                        #endif
                }
                else if(method == "suffix")             {       search = new SuffixDB(numSeqs);                                                         }
@@ -142,7 +154,7 @@ AlignmentDB::AlignmentDB(string fastaFileName, string s, int kmerSize, float gap
                                ifstream kmerFileTest(kmerDBName.c_str());
                                search->readKmerDB(kmerFileTest);       
                        }
-                       
+               
                        search->setNumSeqs(numSeqs);
                }
        }
@@ -191,65 +203,6 @@ Sequence AlignmentDB::findClosestSequence(Sequence* seq) {
                exit(1);
        }
 }
-#ifdef USE_MPI 
-/**************************************************************************************************/
-int AlignmentDB::MPISend(int receiver) {
-       try {
-               
-               //send numSeqs - int
-               MPI_Send(&numSeqs, 1, MPI_INT, receiver, 2001, MPI_COMM_WORLD); 
-                                                                       
-               //send longest - int
-               MPI_Send(&longest, 1, MPI_INT, receiver, 2001, MPI_COMM_WORLD); 
-       
-               //send templateSequences
-               for (int i = 0; i < templateSequences.size(); i++) {
-                       templateSequences[i].MPISend(receiver);
-               }
-               
-               //send Database
-               search->MPISend(receiver);
-               
-               return 0;
-       }
-       catch(exception& e) {
-               m->errorOut(e, "AlignmentDB", "MPISend");
-               exit(1);
-       }
-}
-/**************************************************************************************************/
-int AlignmentDB::MPIRecv(int sender) {
-       try {
-               MPI_Status status;
-               //receive numSeqs - int
-               MPI_Recv(&numSeqs, 1, MPI_INT, sender, 2001, MPI_COMM_WORLD, &status);
-               
-               //receive longest - int
-               MPI_Recv(&longest, 1, MPI_INT, sender, 2001, MPI_COMM_WORLD, &status);
-
-               //receive templateSequences
-               templateSequences.resize(numSeqs);
-               for (int i = 0; i < templateSequences.size(); i++) {
-                       templateSequences[i].MPIRecv(sender);
-               }
-
-               //receive Database
-               search->MPIRecv(sender);
-       
-               for (int i = 0; i < templateSequences.size(); i++) {
-                       search->addSequence(templateSequences[i]);
-               }
-               search->generateDB();
-               search->setNumSeqs(numSeqs);
-
-               return 0;
-       }
-       catch(exception& e) {
-               m->errorOut(e, "AlignmentDB", "MPIRecv");
-               exit(1);
-       }
-}
-#endif
 /**************************************************************************************************/