]> git.donarmstrong.com Git - mothur.git/blobdiff - blastdb.cpp
started work on classify.seqs command. changed the database class so that it does...
[mothur.git] / blastdb.cpp
index 0cba83323db70f0748e4e6a5ec0d902ee8294945..6b45a48ce379168e82300209a7668c3e07e4d0ab 100644 (file)
 
 /**************************************************************************************************/
 
-BlastDB::BlastDB(string fastaFileName, float gO, float gE, float m, float mM) : Database(fastaFileName), 
+BlastDB::BlastDB(float gO, float gE, float m, float mM) : Database(), 
 gapOpen(gO), gapExtend(gE), match(m), misMatch(mM) {
        
        globaldata = GlobalData::getInstance();
-       
-       mothurOut("Generating the temporary BLAST database...\t");      cout.flush();
+       count = 0;
 
        int randNumber = rand();
        dbFileName = toString(randNumber) + ".template.unaligned.fasta";
        queryFileName = toString(randNumber) + ".candidate.unaligned.fasta";
        blastFileName = toString(randNumber) + ".blast";
 
-
-       ofstream unalignedFastaFile;
-       openOutputFile(dbFileName, unalignedFastaFile);                         
-       
-       for(int i=0;i<numSeqs;i++){                                                                     //      generating a fasta file with unaligned template
-               unalignedFastaFile << '>' << i << endl;                                 //      sequences, which will be input to formatdb
-               unalignedFastaFile << templateSequences[i].getUnaligned() << endl;
-       }
-       unalignedFastaFile.close();
-       
-       path = globaldata->argv;
-       path = path.substr(0, (path.find_last_of('m')));
-       
-       string formatdbCommand = path + "blast/bin/formatdb -p F -o T -i " + dbFileName;        //      format the database, -o option gives us the ability
-       system(formatdbCommand.c_str());                                                                //      to get the right sequence names, i think. -p F
-                                                                                                                                       //      option tells formatdb that seqs are DNA, not prot
-       mothurOut("DONE."); mothurOutEndLine(); mothurOutEndLine(); cout.flush();
-       emptySequence = Sequence();
-       emptySequence.setName("no_match");
-       emptySequence.setUnaligned("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-       emptySequence.setAligned("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
-
-
 }
 
 /**************************************************************************************************/
 
 BlastDB::~BlastDB(){
-       //for (int i = 0; i < templateSequences.size(); i++) {  delete templateSequences[i];   }
-       //templateSequences.clear();
-       //delete emptySequence;
-       
        remove(queryFileName.c_str());                          //      let's clean stuff up and remove the temp files
        remove(dbFileName.c_str());                                     //      let's clean stuff up and remove the temp files
        remove(blastFileName.c_str());                          //      let's clean stuff up and remove the temp files
 }
-
 /**************************************************************************************************/
+//assumes you have added all the template sequences using the addSequence function and run generateDB.
+vector<int> BlastDB::findClosestSequences(Sequence* seq, int n) {
+       try{
+               vector<int> topMatches;
+               
+               ofstream queryFile;
+               openOutputFile(queryFileName, queryFile);
+               queryFile << '>' << seq->getName() << endl;
+               queryFile << seq->getUnaligned() << endl;
+               queryFile.close();
+                               
+               //      the goal here is to quickly survey the database to find the closest match.  To do this we are using the default
+               //      wordsize used in megablast.  I'm sure we're sacrificing accuracy for speed, but anyother way would take way too
+               //      long.  With this setting, it seems comparable in speed to the suffix tree approach.
+               
+               string blastCommand = path + "blast/bin/blastall -p blastn -d " + dbFileName + " -b 1 -m 8 -W 28 -v " + toString(n);
+               blastCommand += (" -i " + queryFileName + " -o " + blastFileName);
+               system(blastCommand.c_str());
+               
+               ifstream m8FileHandle;
+               openInputFile(blastFileName, m8FileHandle);
+               
+               string dummy;
+               int templateAccession;
+               gobble(m8FileHandle);
+               
+               while(!m8FileHandle.eof()){
+                       m8FileHandle >> dummy >> templateAccession >> searchScore;
+                       
+                       //get rest of junk in line
+                       while (!m8FileHandle.eof())     {       char c = m8FileHandle.get(); if (c == 10 || c == 13){   break;  }       } 
+                       
+                       gobble(m8FileHandle);
+                       topMatches.push_back(templateAccession);
+               }
+               m8FileHandle.close();
+               
+               return topMatches;
+       }
+       catch(exception& e) {
+               errorOut(e, "BlastDB", "findClosestSequences");
+               exit(1);
+       }
 
-Sequence BlastDB::findClosestSequence(Sequence* candidate){
-
-       ofstream queryFile;
-       openOutputFile(queryFileName, queryFile);
-       queryFile << '>' << candidate->getName() << endl;
-       queryFile << candidate->getUnaligned() << endl;
-       queryFile.close();
+}
+/**************************************************************************************************/
+void BlastDB::addSequence(Sequence seq) {
+       try {
        
+               ofstream unalignedFastaFile;
+               openOutputFileAppend(dbFileName, unalignedFastaFile);                           
        
-//     the goal here is to quickly survey the database to find the closest match.  To do this we are using the default
-//     wordsize used in megablast.  I'm sure we're sacrificing accuracy for speed, but anyother way would take way too
-//     long.  With this setting, it seems comparable in speed to the suffix tree approach.
-
-       string blastCommand = path + "blast/bin/blastall -p blastn -d " + dbFileName + " -b 1 -m 8 -W 28";
-       blastCommand += (" -i " + queryFileName + " -o " + blastFileName);
-       system(blastCommand.c_str());
+               //      generating a fasta file with unaligned template
+               unalignedFastaFile << '>' << count << endl;                                     //      sequences, which will be input to formatdb
+               unalignedFastaFile << seq.getUnaligned() << endl;
+               unalignedFastaFile.close();
+               
+               count++;
+       }
+       catch(exception& e) {
+               errorOut(e, "BlastDB", "addSequence");
+               exit(1);
+       }
+}
+/**************************************************************************************************/
+void BlastDB::generateDB() {
+       try {
        
-       ifstream m8FileHandle;
-       openInputFile(blastFileName, m8FileHandle);
+               mothurOut("Generating the temporary BLAST database...\t");      cout.flush();
+               
+               path = globaldata->argv;
+               path = path.substr(0, (path.find_last_of('m')));
        
-       string dummy;
-       int templateAccession;
-       gobble(m8FileHandle);
-       if(!m8FileHandle.eof()){
-               m8FileHandle >> dummy >> templateAccession >> searchScore;
-               m8FileHandle.close();
-               return templateSequences[templateAccession];
+               string formatdbCommand = path + "blast/bin/formatdb -p F -o T -i " + dbFileName;        //      format the database, -o option gives us the ability
+               system(formatdbCommand.c_str());                                                                //      to get the right sequence names, i think. -p F
+                                                                                                                                       //      option tells formatdb that seqs are DNA, not prot
+               mothurOut("DONE."); mothurOutEndLine(); mothurOutEndLine(); cout.flush();
        }
-       else{
-               searchScore = 0.00;
-               return emptySequence;
+       catch(exception& e) {
+               errorOut(e, "BlastDB", "generateDB");
+               exit(1);
        }
-       m8FileHandle.close();
 }
 
 /**************************************************************************************************/
+