]> git.donarmstrong.com Git - mothur.git/commitdiff
working on removing pointers from chimera.slayer to eliminate pesky memory leaks
authorwestcott <westcott>
Tue, 31 May 2011 15:36:25 +0000 (15:36 +0000)
committerwestcott <westcott>
Tue, 31 May 2011 15:36:25 +0000 (15:36 +0000)
16 files changed:
ccode.cpp
ccode.h
chimera.h
chimeracheckrdp.cpp
chimeracheckrdp.h
chimeraslayer.cpp
chimeraslayer.h
chimeraslayercommand.cpp
decalc.cpp
decalc.h
maligner.cpp
maligner.h
pintail.cpp
pintail.h
slayer.cpp
slayer.h

index e82018409013f59bc4ce9f80474e99d22e111f21..ee88ba1c84838b2b9d6e4edaef2899ca81d31dee 100644 (file)
--- a/ccode.cpp
+++ b/ccode.cpp
@@ -74,7 +74,7 @@ Ccode::~Ccode() {
        #endif
 }      
 //***************************************************************************************************************
-Sequence* Ccode::print(ostream& out, ostream& outAcc) {
+Sequence Ccode::print(ostream& out, ostream& outAcc) {
        try {
                
                ofstream out2;
@@ -155,7 +155,7 @@ Sequence* Ccode::print(ostream& out, ostream& outAcc) {
                //free memory
                for (int i = 0; i < closest.size(); i++) {  delete closest[i].seq;  }
 
-               return NULL;
+               return *querySeq;
        }
        catch(exception& e) {
                m->errorOut(e, "Ccode", "print");
@@ -164,7 +164,7 @@ Sequence* Ccode::print(ostream& out, ostream& outAcc) {
 }
 #ifdef USE_MPI
 //***************************************************************************************************************
-Sequence* Ccode::print(MPI_File& out, MPI_File& outAcc) {
+Sequence Ccode::print(MPI_File& out, MPI_File& outAcc) {
        try {
                
                string outMapString = "";
@@ -263,7 +263,7 @@ Sequence* Ccode::print(MPI_File& out, MPI_File& outAcc) {
                //free memory
                for (int i = 0; i < closest.size(); i++) {  delete closest[i].seq;  }
 
-               return NULL;
+               return *querySeq;
        }
        catch(exception& e) {
                m->errorOut(e, "Ccode", "print");
diff --git a/ccode.h b/ccode.h
index 60feaf448727b545e171682a9a3a0d72257b6f8b..456b735df524ff3eed9c2688be95f8537c0d0c86 100644 (file)
--- a/ccode.h
+++ b/ccode.h
@@ -28,10 +28,10 @@ class Ccode : public Chimera {
                ~Ccode();
                
                int getChimeras(Sequence* query);
-               Sequence* print(ostream&, ostream&);
+               Sequence print(ostream&, ostream&);
                
                #ifdef USE_MPI
-               Sequence* print(MPI_File&, MPI_File&);
+               Sequence print(MPI_File&, MPI_File&);
                #endif
        private:
        
index 3f4eb4ef9f430ed9191f7de78e41df3427c4bec4..9c5a21995c2acd71516b4e3a9cf53732b10b54f9 100644 (file)
--- a/chimera.h
+++ b/chimera.h
@@ -103,6 +103,12 @@ struct SeqDist {
        float dist;
        int index;
 };
+/***********************************************************************/
+struct SeqCompare {
+       Sequence seq;
+       float dist;
+       int index;
+};
 //********************************************************************************************************************
 //sorts lowest to highest
 inline bool compareRegionStart(results left, results right){
@@ -114,7 +120,11 @@ inline bool compareSeqDist(SeqDist left, SeqDist right){
        return (left.dist < right.dist);        
 } 
 //********************************************************************************************************************
-
+//sorts lowest to highest
+inline bool compareSeqCompare(SeqCompare left, SeqCompare right){
+       return (left.dist < right.dist);        
+} 
+//********************************************************************************************************************
 struct sim {
                string leftParent;
                string rightParent; 
@@ -147,14 +157,14 @@ class Chimera {
                virtual void printHeader(ostream&){};
                virtual int getChimeras(Sequence*){ return 0; }
                virtual int getChimeras(){ return 0; }
-               virtual Sequence* print(ostream&, ostream&){  return NULL; }
-               virtual Sequence* print(ostream&, ostream&, data_results, data_results) { return NULL; }
+               virtual Sequence print(ostream&, ostream&){  Sequence temp; return temp; }
+               virtual Sequence print(ostream&, ostream&, data_results, data_results) { Sequence temp; return temp; }
                virtual int print(ostream&, ostream&, string){  return 0; }
                virtual data_results getResults() { data_results results; return results; }
                
                #ifdef USE_MPI
-               virtual Sequence* print(MPI_File&, MPI_File&){  return 0; }
-               virtual Sequence* print(MPI_File&, MPI_File&, data_results, data_results){  return NULL; }
+               virtual Sequence print(MPI_File&, MPI_File&){  Sequence temp; return temp; }
+               virtual Sequence print(MPI_File&, MPI_File&, data_results, data_results){  Sequence temp; return temp; }
                virtual int print(MPI_File&, MPI_File&, string){  return 0; }
                #endif
                
index 16d5f9242f2379465a285b866f6359a5d376215e..be593153fc332e4ef216e8bdece7c0a62d302636 100644 (file)
@@ -47,7 +47,7 @@ ChimeraCheckRDP::~ChimeraCheckRDP() {
        }
 }      
 //***************************************************************************************************************
-Sequence* ChimeraCheckRDP::print(ostream& out, ostream& outAcc) {
+Sequence ChimeraCheckRDP::print(ostream& out, ostream& outAcc) {
        try {
                
                m->mothurOut("Processing: " + querySeq->getName()); m->mothurOutEndLine();
@@ -72,7 +72,7 @@ Sequence* ChimeraCheckRDP::print(ostream& out, ostream& outAcc) {
                        }
                }
                
-               return NULL;
+               return *querySeq;
        }
        catch(exception& e) {
                m->errorOut(e, "ChimeraCheckRDP", "print");
@@ -81,7 +81,7 @@ Sequence* ChimeraCheckRDP::print(ostream& out, ostream& outAcc) {
 }
 #ifdef USE_MPI
 //***************************************************************************************************************
-Sequence* ChimeraCheckRDP::print(MPI_File& out, MPI_File& outAcc) {
+Sequence ChimeraCheckRDP::print(MPI_File& out, MPI_File& outAcc) {
        try {
                
                cout << "Processing: " << querySeq->getName() << endl; 
@@ -115,7 +115,7 @@ Sequence* ChimeraCheckRDP::print(MPI_File& out, MPI_File& outAcc) {
                        }
                }
                
-               return NULL;
+               return *querySeq;
        }
        catch(exception& e) {
                m->errorOut(e, "ChimeraCheckRDP", "print");
index 4805ba11920bba45b96befc23005f4dba6e22fc5..cc23c2e9e8b0b794339a0dfa8fa91bae50f28c00 100644 (file)
@@ -29,10 +29,10 @@ class ChimeraCheckRDP : public Chimera {
                ~ChimeraCheckRDP();
                
                int getChimeras(Sequence*);
-               Sequence* print(ostream&, ostream&);
+               Sequence print(ostream&, ostream&);
                
                #ifdef USE_MPI
-               Sequence* print(MPI_File&, MPI_File&);
+               Sequence print(MPI_File&, MPI_File&);
                #endif
                
        private:
index 3f45e17ed5aad1e5007b530b5cb7025688b3b164..b00cedfba5b4edf8463343618ebdd80acae209be 100644 (file)
@@ -35,8 +35,6 @@ int minsim, int mincov, int minbs, int minsnp, int par, int it, int inc, int num
                realign = r; 
                trimChimera = trim;
        
-               decalc = new DeCalculator();    
-               
                doPrep();
        }
        catch(exception& e) {
@@ -68,8 +66,6 @@ ChimeraSlayer::ChimeraSlayer(string file, string temp, bool trim, map<string, in
                trimChimera = trim;
                priority = prior;
                
-               decalc = new DeCalculator();    
-               
                createFilter(templateSeqs, 0.0); //just removed columns where all seqs have a gap
                
                if (searchMethod == "distance") { 
@@ -235,14 +231,14 @@ int ChimeraSlayer::doPrep() {
        }
 }
 //***************************************************************************************************************
-vector<Sequence*> ChimeraSlayer::getTemplate(Sequence* q, vector<Sequence*>& userTemplateFiltered) {
+vector<Sequence*> ChimeraSlayer::getTemplate(Sequence q, vector<Sequence*>& userTemplateFiltered) {
        try {
                
                //when template=self, the query file is sorted from most abundance to least abundant
                //userTemplate grows as the query file is processed by adding sequences that are not chimeric and more abundant
                vector<Sequence*> userTemplate;
                
-               int myAbund = priority[q->getName()];
+               int myAbund = priority[q.getName()];
                
                for (int i = 0; i < templateSeqs.size(); i++) {
                        
@@ -346,7 +342,6 @@ vector<Sequence*> ChimeraSlayer::getTemplate(Sequence* q, vector<Sequence*>& use
 
 //***************************************************************************************************************
 ChimeraSlayer::~ChimeraSlayer() {      
-       delete decalc;  
        if (templateFileName != "self") {
                if (searchMethod == "kmer") {  delete databaseRight;  delete databaseLeft;  }   
                else if (searchMethod == "blast") {  delete databaseLeft; }
@@ -361,10 +356,10 @@ void ChimeraSlayer::printHeader(ostream& out) {
        out << "Name\tLeftParent\tRightParent\tDivQLAQRB\tPerIDQLAQRB\tBootStrapA\tDivQLBQRA\tPerIDQLBQRA\tBootStrapB\tFlag\tLeftWindow\tRightWindow\n";
 }
 //***************************************************************************************************************
-Sequence* ChimeraSlayer::print(ostream& out, ostream& outAcc) {
+Sequence ChimeraSlayer::print(ostream& out, ostream& outAcc) {
        try {
-               Sequence* trim = NULL;
-               if (trimChimera) { trim = new Sequence(trimQuery.getName(), trimQuery.getAligned()); }
+               Sequence trim;
+               if (trimChimera) { trim.setName(trimQuery.getName()); trim.setAligned(trimQuery.getAligned()); }
                
                if (chimeraFlags == "yes") {
                        string chimeraFlag = "no";
@@ -375,23 +370,23 @@ Sequence* ChimeraSlayer::print(ostream& out, ostream& outAcc) {
                        
                        if (chimeraFlag == "yes") {     
                                if ((chimeraResults[0].bsa >= minBS) || (chimeraResults[0].bsb >= minBS)) {
-                                       m->mothurOut(querySeq->getName() + "\tyes"); m->mothurOutEndLine();
-                                       outAcc << querySeq->getName() << endl;
+                                       m->mothurOut(querySeq.getName() + "\tyes"); m->mothurOutEndLine();
+                                       outAcc << querySeq.getName() << endl;
                                        
-                                       if (templateFileName == "self") {  chimericSeqs.insert(querySeq->getName()); }
+                                       if (templateFileName == "self") {  chimericSeqs.insert(querySeq.getName()); }
                                        
                                        if (trimChimera) {  
                                                int lengthLeft = chimeraResults[0].winLEnd - chimeraResults[0].winLStart;
                                                int lengthRight = chimeraResults[0].winREnd - chimeraResults[0].winRStart;
                                                
-                                               string newAligned = trim->getAligned();
+                                               string newAligned = trim.getAligned();
 
                                                if (lengthLeft > lengthRight) { //trim right
                                                        for (int i = (chimeraResults[0].winRStart-1); i < newAligned.length(); i++) { newAligned[i] = '.'; }
                                                }else { //trim left
                                                        for (int i = 0; i < chimeraResults[0].winLEnd; i++) { newAligned[i] = '.'; }
                                                }
-                                               trim->setAligned(newAligned);
+                                               trim.setAligned(newAligned);
                                        }
                                }
                        }
@@ -399,7 +394,7 @@ Sequence* ChimeraSlayer::print(ostream& out, ostream& outAcc) {
                        printBlock(chimeraResults[0], chimeraFlag, out);
                        out << endl;
                }else {  
-                       out << querySeq->getName() << "\tno" << endl; 
+                       out << querySeq.getName() << "\tno" << endl; 
                }
                
                return trim;
@@ -411,13 +406,13 @@ Sequence* ChimeraSlayer::print(ostream& out, ostream& outAcc) {
        }
 }
 //***************************************************************************************************************
-Sequence* ChimeraSlayer::print(ostream& out, ostream& outAcc, data_results leftPiece, data_results rightPiece) {
+Sequence ChimeraSlayer::print(ostream& out, ostream& outAcc, data_results leftPiece, data_results rightPiece) {
        try {
-               Sequence* trim = NULL;
+               Sequence trim;
                                
                if (trimChimera) { 
                        string aligned = leftPiece.trimQuery.getAligned() + rightPiece.trimQuery.getAligned();
-                       trim = new Sequence(leftPiece.trimQuery.getName(), aligned); 
+                       trim.setName(leftPiece.trimQuery.getName()); trim.setAligned(aligned); 
                }
                
                if ((leftPiece.flag == "yes") || (rightPiece.flag == "yes")) {
@@ -445,13 +440,13 @@ Sequence* ChimeraSlayer::print(ostream& out, ostream& outAcc, data_results leftP
                                if (leftPiece.flag == "yes") { if ((leftPiece.results[0].bsa >= minBS) || (leftPiece.results[0].bsb >= minBS))  { leftChimeric = true;  } }
                                
                                if (rightChimeric || leftChimeric) {
-                                       m->mothurOut(querySeq->getName() + "\tyes"); m->mothurOutEndLine();
-                                       outAcc << querySeq->getName() << endl;
+                                       m->mothurOut(querySeq.getName() + "\tyes"); m->mothurOutEndLine();
+                                       outAcc << querySeq.getName() << endl;
                                        
-                                       if (templateFileName == "self") {  chimericSeqs.insert(querySeq->getName()); }
+                                       if (templateFileName == "self") {  chimericSeqs.insert(querySeq.getName()); }
                                        
                                        if (trimChimera) {  
-                                               string newAligned = trim->getAligned();
+                                               string newAligned = trim.getAligned();
                                                                                                
                                                //right side is fine so keep that
                                                if ((leftChimeric) && (!rightChimeric)) {
@@ -493,7 +488,7 @@ Sequence* ChimeraSlayer::print(ostream& out, ostream& outAcc, data_results leftP
                                                        }
                                                }
                                                        
-                                               trim->setAligned(newAligned);
+                                               trim.setAligned(newAligned);
                                        }
                                        
                                }
@@ -502,7 +497,7 @@ Sequence* ChimeraSlayer::print(ostream& out, ostream& outAcc, data_results leftP
                        printBlock(leftPiece, rightPiece, leftChimeric, rightChimeric, chimeraFlag, out);
                        out << endl;
                }else {  
-                       out << querySeq->getName() << "\tno" << endl;  
+                       out << querySeq.getName() << "\tno" << endl;  
                }
                
                return trim;
@@ -516,18 +511,18 @@ Sequence* ChimeraSlayer::print(ostream& out, ostream& outAcc, data_results leftP
 
 #ifdef USE_MPI
 //***************************************************************************************************************
-Sequence* ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc, data_results leftPiece, data_results rightPiece) {
+Sequence ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc, data_results leftPiece, data_results rightPiece) {
        try {
                MPI_Status status;
                bool results = false;
                string outAccString = "";
                string outputString = "";
                
-               Sequence* trim = NULL;
+               Sequence trim;
                
                if (trimChimera) { 
                        string aligned = leftPiece.trimQuery.getAligned() + rightPiece.trimQuery.getAligned();
-                       trim = new Sequence(leftPiece.trimQuery.getName(), aligned); 
+                       trim.setName(leftPiece.trimQuery.getName());  trim.setAligned(aligned);
                }
                
                
@@ -558,11 +553,11 @@ Sequence* ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc, data_results lef
                                if (leftPiece.flag == "yes") { if ((leftPiece.results[0].bsa >= minBS) || (leftPiece.results[0].bsb >= minBS))  { leftChimeric = true;  } }
                                
                                if (rightChimeric || leftChimeric) {
-                                       cout << querySeq->getName() <<  "\tyes" << endl;
-                                       outAccString += querySeq->getName() + "\n";
+                                       cout << querySeq.getName() <<  "\tyes" << endl;
+                                       outAccString += querySeq.getName() + "\n";
                                        results = true;
                                        
-                                       if (templateFileName == "self") {  chimericSeqs.insert(querySeq->getName()); }
+                                       if (templateFileName == "self") {  chimericSeqs.insert(querySeq.getName()); }
                                        
                                        //write to accnos file
                                        int length = outAccString.length();
@@ -573,7 +568,7 @@ Sequence* ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc, data_results lef
                                        delete buf2;
                                        
                                        if (trimChimera) {  
-                                               string newAligned = trim->getAligned();
+                                               string newAligned = trim.getAligned();
                                                
                                                //right side is fine so keep that
                                                if ((leftChimeric) && (!rightChimeric)) {
@@ -615,7 +610,7 @@ Sequence* ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc, data_results lef
                                                        }
                                                }
                                                
-                                               trim->setAligned(newAligned);
+                                               trim.setAligned(newAligned);
                                        }
                                        
                                }
@@ -633,7 +628,7 @@ Sequence* ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc, data_results lef
                        delete buf;
 
                }else {  
-                       outputString += querySeq->getName() + "\tno\n";  
+                       outputString += querySeq.getName() + "\tno\n";  
        
                        //write to output file
                        int length = outputString.length();
@@ -653,15 +648,15 @@ Sequence* ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc, data_results lef
        }
 }
 //***************************************************************************************************************
-Sequence* ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc) {
+Sequence ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc) {
        try {
                MPI_Status status;
                bool results = false;
                string outAccString = "";
                string outputString = "";
                
-               Sequence* trim = NULL;
-               if (trimChimera) { trim = new Sequence(trimQuery.getName(), trimQuery.getAligned()); }
+               Sequence trim;
+               if (trimChimera) { trim.setName(trimQuery.getName()); trim.setAligned(trimQuery.getAligned()); }
                
                if (chimeraFlags == "yes") {
                        string chimeraFlag = "no";
@@ -672,11 +667,11 @@ Sequence* ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc) {
                        
                        if (chimeraFlag == "yes") {     
                                if ((chimeraResults[0].bsa >= minBS) || (chimeraResults[0].bsb >= minBS)) {
-                                       cout << querySeq->getName() <<  "\tyes" << endl;
-                                       outAccString += querySeq->getName() + "\n";
+                                       cout << querySeq.getName() <<  "\tyes" << endl;
+                                       outAccString += querySeq.getName() + "\n";
                                        results = true;
                                        
-                                       if (templateFileName == "self") {  chimericSeqs.insert(querySeq->getName()); }
+                                       if (templateFileName == "self") {  chimericSeqs.insert(querySeq.getName()); }
                                        
                                        //write to accnos file
                                        int length = outAccString.length();
@@ -690,13 +685,13 @@ Sequence* ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc) {
                                                int lengthLeft = chimeraResults[0].winLEnd - chimeraResults[0].winLStart;
                                                int lengthRight = chimeraResults[0].winREnd - chimeraResults[0].winRStart;
                                                
-                                               string newAligned = trim->getAligned();
+                                               string newAligned = trim.getAligned();
                                                if (lengthLeft > lengthRight) { //trim right
                                                        for (int i = (chimeraResults[0].winRStart-1); i < newAligned.length(); i++) { newAligned[i] = '.'; }
                                                }else { //trim left
                                                        for (int i = 0; i < (chimeraResults[0].winLEnd-1); i++) { newAligned[i] = '.'; }
                                                }
-                                               trim->setAligned(newAligned);   
+                                               trim.setAligned(newAligned);    
                                        }
                                }
                        }
@@ -713,7 +708,7 @@ Sequence* ChimeraSlayer::print(MPI_File& out, MPI_File& outAcc) {
                        delete buf;
                        
                }else {  
-                       outputString += querySeq->getName() + "\tno\n";  
+                       outputString += querySeq.getName() + "\tno\n";  
                        
                        //write to output file
                        int length = outputString.length();
@@ -743,20 +738,20 @@ int ChimeraSlayer::getChimeras(Sequence* query) {
                chimeraFlags = "no";
                printResults.flag = "no";
                
-               querySeq = query;
+               querySeq = *query;
                
                //you must create a template
                vector<Sequence*> thisTemplate;
                vector<Sequence*> thisFilteredTemplate;
                if (templateFileName != "self") { thisTemplate = templateSeqs; thisFilteredTemplate = filteredTemplateSeqs; }
-               else {  thisTemplate = getTemplate(query, thisFilteredTemplate);  } //fills this template and creates the databases
+               else {  thisTemplate = getTemplate(*query, thisFilteredTemplate);  } //fills this template and creates the databases
                
                if (m->control_pressed) {  return 0;  }
                
                if (thisTemplate.size() == 0) {  return 0; } //not chimeric
                
                //moved this out of maligner - 4/29/11
-               vector<Sequence*> refSeqs = getRefSeqs(query, thisTemplate, thisFilteredTemplate);
+               vector<Sequence> refSeqs = getRefSeqs(*query, thisTemplate, thisFilteredTemplate);
                
                Maligner maligner(refSeqs, match, misMatch, divR, minSim, minCov); 
                Slayer slayer(window, increment, minSim, divR, iters, minSNP, minBS);
@@ -768,13 +763,13 @@ int ChimeraSlayer::getChimeras(Sequence* query) {
        
                if (m->control_pressed) {  return 0;  }
 
-               string chimeraFlag = maligner.getResults(query, decalc);
+               string chimeraFlag = maligner.getResults(*query, decalc);
 
                if (m->control_pressed) {  return 0;  }
                
                vector<results> Results = maligner.getOutput();
                
-               for (int i = 0; i < refSeqs.size(); i++) {  delete refSeqs[i];  }
+               //for (int i = 0; i < refSeqs.size(); i++) {  delete refSeqs[i];        }
                
                if (chimeraFlag == "yes") {
                        
@@ -791,7 +786,7 @@ int ChimeraSlayer::getChimeras(Sequence* query) {
                        
 //                     cout << query->getAligned() << endl;
                        //get sequence that were given from maligner results
-                       vector<SeqDist> seqs;
+                       vector<SeqCompare> seqs;
                        map<string, float> removeDups;
                        map<string, float>::iterator itDup;
                        map<string, string> parentNameSeq;
@@ -820,9 +815,9 @@ int ChimeraSlayer::getChimeras(Sequence* query) {
                        
                        for (itDup = removeDups.begin(); itDup != removeDups.end(); itDup++) {
                                itSeq = parentNameSeq.find(itDup->first);
-                               Sequence* seq = new Sequence(itDup->first, itSeq->second);
+                               Sequence seq(itDup->first, itSeq->second);
                                
-                               SeqDist member;
+                               SeqCompare member;
                                member.seq = seq;
                                member.dist = itDup->second;
                                seqs.push_back(member);
@@ -831,30 +826,30 @@ int ChimeraSlayer::getChimeras(Sequence* query) {
                        //limit number of parents to explore - default 3
                        if (Results.size() > parents) {
                                //sort by distance
-                               sort(seqs.begin(), seqs.end(), compareSeqDist);
+                               sort(seqs.begin(), seqs.end(), compareSeqCompare);
                                //prioritize larger more similiar sequence fragments
                                reverse(seqs.begin(), seqs.end());
                                
-                               for (int k = seqs.size()-1; k > (parents-1); k--)  {  
-                                       delete seqs[k].seq;
-                                       seqs.pop_back();        
-                               }
+                               //for (int k = seqs.size()-1; k > (parents-1); k--)  {  
+                               //      delete seqs[k].seq;
+                                       //seqs.pop_back();      
+                               //}
                        }
                
                        //put seqs into vector to send to slayer
                        
 //                     cout << query->getAligned() << endl;
-                       vector<Sequence*> seqsForSlayer;
+                       vector<Sequence> seqsForSlayer;
                        for (int k = 0; k < seqs.size(); k++) {  
 //                             cout << seqs[k].seq->getAligned() << endl;
                                seqsForSlayer.push_back(seqs[k].seq);   
 //                             cout << seqs[k].seq->getName() << endl;
                        }
                        
-                       if (m->control_pressed) {  for (int k = 0; k < seqs.size(); k++) {  delete seqs[k].seq;   }  return 0;  }
+                       if (m->control_pressed) {  return 0;  }
 
                        //send to slayer
-                       chimeraFlags = slayer.getResults(query, seqsForSlayer);
+                       chimeraFlags = slayer.getResults(*query, seqsForSlayer);
                        if (m->control_pressed) {  return 0;  }
                        chimeraResults = slayer.getOutput();
                        
@@ -862,7 +857,7 @@ int ChimeraSlayer::getChimeras(Sequence* query) {
                        printResults.results = chimeraResults;
                        
                        //free memory
-                       for (int k = 0; k < seqs.size(); k++) {  delete seqs[k].seq;   }
+                       //for (int k = 0; k < seqs.size(); k++) {  delete seqs[k].seq;   }
                }
                //cout << endl << endl;
                return 0;
@@ -875,7 +870,7 @@ int ChimeraSlayer::getChimeras(Sequence* query) {
 //***************************************************************************************************************
 void ChimeraSlayer::printBlock(data_struct data, string flag, ostream& out){
        try {
-               out << querySeq->getName() << '\t';
+               out << querySeq.getName() << '\t';
                out << data.parentA.getName() << "\t" << data.parentB.getName()  << '\t';
        
                out << data.divr_qla_qrb << '\t' << data.qla_qrb << '\t' << data.bsa << '\t';
@@ -894,7 +889,7 @@ void ChimeraSlayer::printBlock(data_results leftdata, data_results rightdata, bo
        try {
                
                if ((leftChimeric) && (!rightChimeric)) { //print left
-                       out << querySeq->getName() << '\t';
+                       out << querySeq.getName() << '\t';
                        out << leftdata.results[0].parentA.getName() << "\t" << leftdata.results[0].parentB.getName()  << '\t';
                        
                        out << leftdata.results[0].divr_qla_qrb << '\t' << leftdata.results[0].qla_qrb << '\t' << leftdata.results[0].bsa << '\t';
@@ -903,7 +898,7 @@ void ChimeraSlayer::printBlock(data_results leftdata, data_results rightdata, bo
                        out << flag << '\t' << leftdata.results[0].winLStart << "-" << leftdata.results[0].winLEnd << '\t' << leftdata.results[0].winRStart << "-" << leftdata.results[0].winREnd << '\t';
                
                }else if ((!leftChimeric) && (rightChimeric)) {  //print right
-                       out << querySeq->getName() << '\t';
+                       out << querySeq.getName() << '\t';
                        out << rightdata.results[0].parentA.getName() << "\t" << rightdata.results[0].parentB.getName()  << '\t';
                        
                        out << rightdata.results[0].divr_qla_qrb << '\t' << rightdata.results[0].qla_qrb << '\t' << rightdata.results[0].bsa << '\t';
@@ -913,7 +908,7 @@ void ChimeraSlayer::printBlock(data_results leftdata, data_results rightdata, bo
                        
                }else  { //print both results
                        if (leftdata.flag == "yes") {
-                               out << querySeq->getName() + "_LEFT" << '\t';
+                               out << querySeq.getName() + "_LEFT" << '\t';
                                out << leftdata.results[0].parentA.getName() << "\t" << leftdata.results[0].parentB.getName()  << '\t';
                                
                                out << leftdata.results[0].divr_qla_qrb << '\t' << leftdata.results[0].qla_qrb << '\t' << leftdata.results[0].bsa << '\t';
@@ -925,7 +920,7 @@ void ChimeraSlayer::printBlock(data_results leftdata, data_results rightdata, bo
                        if (rightdata.flag == "yes") {
                                if (leftdata.flag == "yes") { out << endl; }
                                
-                               out << querySeq->getName() + "_RIGHT"<< '\t';
+                               out << querySeq.getName() + "_RIGHT"<< '\t';
                                out << rightdata.results[0].parentA.getName() << "\t" << rightdata.results[0].parentB.getName()  << '\t';
                                
                                out << rightdata.results[0].divr_qla_qrb << '\t' << rightdata.results[0].qla_qrb << '\t' << rightdata.results[0].bsa << '\t';
@@ -948,7 +943,7 @@ string ChimeraSlayer::getBlock(data_results leftdata, data_results rightdata, bo
                string out = "";
                
                if ((leftChimeric) && (!rightChimeric)) { //get left
-                       out += querySeq->getName() + "\t";
+                       out += querySeq.getName() + "\t";
                        out += leftdata.results[0].parentA.getName() + "\t" + leftdata.results[0].parentB.getName() + "\t";
                        
                        out += toString(leftdata.results[0].divr_qla_qrb) + "\t" + toString(leftdata.results[0].qla_qrb) + "\t" + toString(leftdata.results[0].bsa) + "\t";
@@ -957,7 +952,7 @@ string ChimeraSlayer::getBlock(data_results leftdata, data_results rightdata, bo
                        out += flag + "\t" + toString(leftdata.results[0].winLStart) + "-" + toString(leftdata.results[0].winLEnd) + "\t" + toString(leftdata.results[0].winRStart) + "-" + toString(leftdata.results[0].winREnd) + "\t";
                        
                }else if ((!leftChimeric) && (rightChimeric)) {  //print right
-                       out += querySeq->getName() + "\t";
+                       out += querySeq.getName() + "\t";
                        out += rightdata.results[0].parentA.getName() + "\t" + rightdata.results[0].parentB.getName()  + "\t";
                        
                        out += toString(rightdata.results[0].divr_qla_qrb) + "\t" + toString(rightdata.results[0].qla_qrb) + "\t" + toString(rightdata.results[0].bsa) + "\t";
@@ -968,7 +963,7 @@ string ChimeraSlayer::getBlock(data_results leftdata, data_results rightdata, bo
                }else  { //print both results
                        
                        if (leftdata.flag == "yes") {
-                               out += querySeq->getName() + "_LEFT\t";
+                               out += querySeq.getName() + "_LEFT\t";
                                out += leftdata.results[0].parentA.getName() + "\t" + leftdata.results[0].parentB.getName() + "\t";
                                
                                out += toString(leftdata.results[0].divr_qla_qrb) + "\t" + toString(leftdata.results[0].qla_qrb) + "\t" + toString(leftdata.results[0].bsa) + "\t";
@@ -979,7 +974,7 @@ string ChimeraSlayer::getBlock(data_results leftdata, data_results rightdata, bo
                        
                        if (rightdata.flag == "yes") {
                                if (leftdata.flag == "yes") { out += "\n"; }
-                               out +=  querySeq->getName() + "_RIGHT\t";
+                               out +=  querySeq.getName() + "_RIGHT\t";
                                out += rightdata.results[0].parentA.getName() + "\t" + rightdata.results[0].parentB.getName()  + "\t";
                                
                                out += toString(rightdata.results[0].divr_qla_qrb) + "\t" + toString(rightdata.results[0].qla_qrb) + "\t" + toString(rightdata.results[0].bsa) + "\t";
@@ -1003,7 +998,7 @@ string ChimeraSlayer::getBlock(data_struct data, string flag){
                
                string outputString = "";
                
-               outputString += querySeq->getName() + "\t";
+               outputString += querySeq.getName() + "\t";
                outputString += data.parentA.getName() + "\t" + data.parentB.getName()  + "\t";
                        
                outputString += toString(data.divr_qla_qrb) + "\t" + toString(data.qla_qrb) + "\t" + toString(data.bsa) + "\t";
@@ -1019,16 +1014,16 @@ string ChimeraSlayer::getBlock(data_struct data, string flag){
        }
 }
 //***************************************************************************************************************
-vector<Sequence*> ChimeraSlayer::getRefSeqs(Sequence* q, vector<Sequence*>& thisTemplate, vector<Sequence*>& thisFilteredTemplate){
+vector<Sequence> ChimeraSlayer::getRefSeqs(Sequence q, vector<Sequence*>& thisTemplate, vector<Sequence*>& thisFilteredTemplate){
        try {
                
-               vector<Sequence*> refSeqs;
+               vector<Sequence> refSeqs;
                
                if (searchMethod == "distance") {
                        //find closest seqs to query in template - returns copies of seqs so trim does not destroy - remember to deallocate
-                       Sequence* newSeq = new Sequence(q->getName(), q->getAligned());
+                       Sequence* newSeq = new Sequence(q.getName(), q.getAligned());
                        runFilter(newSeq);
-                       refSeqs = decalc->findClosest(newSeq, thisTemplate, thisFilteredTemplate, numWanted, minSim);
+                       refSeqs = decalc.findClosest(*newSeq, thisTemplate, thisFilteredTemplate, numWanted, minSim);
                        delete newSeq;
                }else if (searchMethod == "blast")  {
                        refSeqs = getBlastSeqs(q, thisTemplate, numWanted); //fills indexes
@@ -1044,18 +1039,18 @@ vector<Sequence*> ChimeraSlayer::getRefSeqs(Sequence* q, vector<Sequence*>& this
        }
 }
 //***************************************************************************************************************/
-vector<Sequence*> ChimeraSlayer::getBlastSeqs(Sequence* q, vector<Sequence*>& db, int num) {
+vector<Sequence> ChimeraSlayer::getBlastSeqs(Sequence q, vector<Sequence*>& db, int num) {
        try {   
                
-               vector<Sequence*> refResults;
+               vector<Sequence> refResults;
                
                //get parts of query
-               string queryUnAligned = q->getUnaligned();
+               string queryUnAligned = q.getUnaligned();
                string leftQuery = queryUnAligned.substr(0, int(queryUnAligned.length() * 0.33)); //first 1/3 of the sequence
                string rightQuery = queryUnAligned.substr(int(queryUnAligned.length() * 0.66)); //last 1/3 of the sequence
 //cout << "whole length = " << queryUnAligned.length() << '\t' << "left length = " << leftQuery.length() << '\t' << "right length = "<< rightQuery.length() << endl;   
-               Sequence* queryLeft = new Sequence(q->getName(), leftQuery);
-               Sequence* queryRight = new Sequence(q->getName(), rightQuery);
+               Sequence* queryLeft = new Sequence(q.getName(), leftQuery);
+               Sequence* queryRight = new Sequence(q.getName(), rightQuery);
                
                vector<int> tempIndexesLeft = databaseLeft->findClosestMegaBlast(queryLeft, num+1, minSim);
                vector<int> tempIndexesRight = databaseLeft->findClosestMegaBlast(queryRight, num+1, minSim);
@@ -1122,10 +1117,9 @@ vector<Sequence*> ChimeraSlayer::getBlastSeqs(Sequence* q, vector<Sequence*>& db
                
                for (int i = 0; i < mergedResults.size(); i++) {
                        //cout << q->getName() << mergedResults[i]  << '\t' << db[mergedResults[i]]->getName() << endl; 
-                       if (db[mergedResults[i]]->getName() != q->getName()) { 
-                               Sequence* temp = new Sequence(db[mergedResults[i]]->getName(), db[mergedResults[i]]->getAligned());
+                       if (db[mergedResults[i]]->getName() != q.getName()) { 
+                               Sequence temp(db[mergedResults[i]]->getName(), db[mergedResults[i]]->getAligned());
                                refResults.push_back(temp);
-                               
                        }
                }
                //cout << endl << endl;
@@ -1133,7 +1127,7 @@ vector<Sequence*> ChimeraSlayer::getBlastSeqs(Sequence* q, vector<Sequence*>& db
                delete queryRight;
                delete queryLeft;
                
-               if (refResults.size() == 0) { m->mothurOut("[WARNING]: mothur found 0 potential parents, so we are not able to check " + q->getName() + ". This could be due to formatdb.exe not being setup properly, please check formatdb.log for errors."); m->mothurOutEndLine(); }
+               if (refResults.size() == 0) { m->mothurOut("[WARNING]: megablast found 0 potential parents, so we are not able to check " + q.getName() + ". This could be due to formatdb.exe not being setup properly, please check formatdb.log for errors."); m->mothurOutEndLine(); }
                
                return refResults;
        }
@@ -1143,17 +1137,17 @@ vector<Sequence*> ChimeraSlayer::getBlastSeqs(Sequence* q, vector<Sequence*>& db
        }
 }
 //***************************************************************************************************************
-vector<Sequence*> ChimeraSlayer::getKmerSeqs(Sequence* q, vector<Sequence*>& db, int num) {
+vector<Sequence> ChimeraSlayer::getKmerSeqs(Sequence q, vector<Sequence*>& db, int num) {
        try {   
-               vector<Sequence*> refResults;
+               vector<Sequence> refResults;
                
                //get parts of query
-               string queryUnAligned = q->getUnaligned();
+               string queryUnAligned = q.getUnaligned();
                string leftQuery = queryUnAligned.substr(0, int(queryUnAligned.length() * 0.33)); //first 1/3 of the sequence
                string rightQuery = queryUnAligned.substr(int(queryUnAligned.length() * 0.66)); //last 1/3 of the sequence
                
-               Sequence* queryLeft = new Sequence(q->getName(), leftQuery);
-               Sequence* queryRight = new Sequence(q->getName(), rightQuery);
+               Sequence* queryLeft = new Sequence(q.getName(), leftQuery);
+               Sequence* queryRight = new Sequence(q.getName(), rightQuery);
                
                vector<int> tempIndexesLeft = databaseLeft->findClosestSequences(queryLeft, num);
                vector<int> tempIndexesRight = databaseRight->findClosestSequences(queryRight, num);
@@ -1210,8 +1204,8 @@ vector<Sequence*> ChimeraSlayer::getKmerSeqs(Sequence* q, vector<Sequence*>& db,
                
                for (int i = 0; i < mergedResults.size(); i++) {
                        //cout << mergedResults[i]  << '\t' << db[mergedResults[i]]->getName() << endl; 
-                       if (db[mergedResults[i]]->getName() != q->getName()) { 
-                               Sequence* temp = new Sequence(db[mergedResults[i]]->getName(), db[mergedResults[i]]->getAligned());
+                       if (db[mergedResults[i]]->getName() != q.getName()) { 
+                               Sequence temp(db[mergedResults[i]]->getName(), db[mergedResults[i]]->getAligned());
                                refResults.push_back(temp);
                                
                        }
index ded0f89b1cb57c88c66777405d1c0d8de9df088d..304ea108f3ce76790b5bfa2e3946289eb8d97720 100644 (file)
@@ -15,6 +15,8 @@
 #include "maligner.h"
 #include "slayer.h"
 
+
+
 //***********************************************************************/
 //This class was modeled after the chimeraSlayer written by the Broad Institute
 /***********************************************************************/
@@ -28,21 +30,21 @@ class ChimeraSlayer : public Chimera {
                ~ChimeraSlayer();
                
                int getChimeras(Sequence*);
-               Sequence* print(ostream&, ostream&);
-               Sequence* print(ostream&, ostream&, data_results, data_results);
+               Sequence print(ostream&, ostream&);
+               Sequence print(ostream&, ostream&, data_results, data_results);
                void printHeader(ostream&);
                int doPrep();
                data_results getResults() { return printResults; }
                
                #ifdef USE_MPI
-               Sequence* print(MPI_File&, MPI_File&);
-               Sequence* print(MPI_File&, MPI_File&, data_results, data_results);
+               Sequence print(MPI_File&, MPI_File&);
+               Sequence print(MPI_File&, MPI_File&, data_results, data_results);
                #endif
                
        private:
-               Sequence* querySeq;
+               Sequence querySeq;
                Sequence trimQuery;
-               DeCalculator* decalc;
+               DeCalculator decalc;
                Database* databaseRight;
                Database* databaseLeft;
                map<string, int> priority; //for template=self, seqname, seqAligned, abundance
@@ -60,10 +62,10 @@ class ChimeraSlayer : public Chimera {
                string getBlock(data_struct, string);
                string getBlock(data_results, data_results, bool, bool, string);
                //int readNameFile(string);
-               vector<Sequence*> getTemplate(Sequence*, vector<Sequence*>&);
-               vector<Sequence*> getRefSeqs(Sequence*, vector<Sequence*>&, vector<Sequence*>&);
-               vector<Sequence*> getBlastSeqs(Sequence*, vector<Sequence*>&, int);
-               vector<Sequence*> getKmerSeqs(Sequence*, vector<Sequence*>&, int);
+               vector<Sequence*> getTemplate(Sequence, vector<Sequence*>&);
+               vector<Sequence> getRefSeqs(Sequence, vector<Sequence*>&, vector<Sequence*>&);
+               vector<Sequence> getBlastSeqs(Sequence, vector<Sequence*>&, int);
+               vector<Sequence> getKmerSeqs(Sequence, vector<Sequence*>&, int);
                
 };
 
index a422c8883ea9f172fe076961fa7705cb548e767e..0e7e19bbda16ff8f4222562c0ffe95f78b335d35 100644 (file)
@@ -716,15 +716,15 @@ int ChimeraSlayerCommand::driver(linePair* filePos, string outputFName, string f
                                                data_results rightResults = chimera->getResults();
                                                
                                                //if either piece is chimeric then report
-                                               Sequence* trimmed = chimera->print(out, out2, leftResults, rightResults);
-                                               if (trim) { trimmed->printSequence(out3); delete trimmed; }
+                                               Sequence trimmed = chimera->print(out, out2, leftResults, rightResults);
+                                               if (trim) { trimmed.printSequence(out3);  }
                                                
                                                delete left; delete right;
                                                
                                        }else { //already chimeric
                                                //print results
-                                               Sequence* trimmed = chimera->print(out, out2);
-                                               if (trim) { trimmed->printSequence(out3); delete trimmed; }
+                                               Sequence trimmed = chimera->print(out, out2);
+                                               if (trim) { trimmed.printSequence(out3);  }
                                        }
                                        
                                        
@@ -832,10 +832,9 @@ int ChimeraSlayerCommand::driverMPI(int start, int num, MPI_File& inMPI, MPI_Fil
                                                data_results rightResults = chimera->getResults();
                                                
                                                //if either piece is chimeric then report
-                                               Sequence* trimmed = chimera->print(outMPI, outAccMPI, leftResults, rightResults);
+                                               Sequence trimmed = chimera->print(outMPI, outAccMPI, leftResults, rightResults);
                                                if (trim) {  
-                                                       string outputString = ">" + trimmed->getName() + "\n" + trimmed->getAligned() + "\n";
-                                                       delete trimmed;
+                                                       string outputString = ">" + trimmed.getName() + "\n" + trimmed.getAligned() + "\n";
                                                        
                                                        //write to accnos file
                                                        int length = outputString.length();
@@ -850,11 +849,10 @@ int ChimeraSlayerCommand::driverMPI(int start, int num, MPI_File& inMPI, MPI_Fil
                                                
                                        }else { 
                                                //print results
-                                               Sequence* trimmed = chimera->print(outMPI, outAccMPI);
+                                               Sequence trimmed = chimera->print(outMPI, outAccMPI);
                                                
                                                if (trim) {  
-                                                       string outputString = ">" + trimmed->getName() + "\n" + trimmed->getAligned() + "\n";
-                                                       delete trimmed;
+                                                       string outputString = ">" + trimmed.getName() + "\n" + trimmed.getAligned() + "\n";
                                                        
                                                        //write to accnos file
                                                        int length = outputString.length();
index 3a8c9d5711fa56631a4cac6cac70658fc2ad27f9..973340ca0589c87dcf36176638f99f959cd484cc 100644 (file)
@@ -683,23 +683,23 @@ float DeCalculator::getCoef(vector<float> obs, vector<float> qav) {
 }
 //***************************************************************************************************************
 //gets closest matches to each end, since chimeras will most likely have different parents on each end
-vector<Sequence*> DeCalculator::findClosest(Sequence* querySeq, vector<Sequence*>& thisTemplate, vector<Sequence*>& thisFilteredTemplate, int numWanted, int minSim) {
+vector<Sequence> DeCalculator::findClosest(Sequence querySeq, vector<Sequence*>& thisTemplate, vector<Sequence*>& thisFilteredTemplate, int numWanted, int minSim) {
        try {
                //indexes.clear();
                
-               vector<Sequence*> seqsMatches;  
+               vector<Sequence> seqsMatches;  
                
                vector<SeqDist> distsLeft;
                vector<SeqDist> distsRight;
                
                Dist* distcalculator = new eachGapDist();
                
-               string queryUnAligned = querySeq->getUnaligned();
+               string queryUnAligned = querySeq.getUnaligned();
                int numBases = int(queryUnAligned.length() * 0.33);
                
                string leftQuery = ""; //first 1/3 of the sequence
                string rightQuery = ""; //last 1/3 of the sequence
-               string queryAligned = querySeq->getAligned();
+               string queryAligned = querySeq.getAligned();
                
                //left side
                bool foundFirstBase = false;
@@ -740,8 +740,8 @@ vector<Sequence*> DeCalculator::findClosest(Sequence* querySeq, vector<Sequence*
                }
                rightQuery = queryAligned.substr(rightSpot, (lastBaseSpot-rightSpot+1)); //sequence from pos spot to end
                
-               Sequence queryLeft(querySeq->getName(), leftQuery);
-               Sequence queryRight(querySeq->getName(), rightQuery);
+               Sequence queryLeft(querySeq.getName(), leftQuery);
+               Sequence queryRight(querySeq.getName(), rightQuery);
                
 //cout << querySeq->getName() << '\t' << leftSpot << '\t' << rightSpot << '\t' << firstBaseSpot << '\t' << lastBaseSpot << endl;
 //cout << queryUnAligned.length() << '\t' << queryLeft.getUnaligned().length() << '\t' << queryRight.getUnaligned().length() << endl;
@@ -841,8 +841,8 @@ vector<Sequence*> DeCalculator::findClosest(Sequence* querySeq, vector<Sequence*
                for (int i = 0; i < dists.size(); i++) {
 //                     cout << db[dists[i].index]->getName() << '\t' << dists[i].dist << endl;
 
-                       if ((thisTemplate[dists[i].index]->getName() != querySeq->getName()) && (((1.0-dists[i].dist)*100) >= minSim)) {
-                               Sequence* temp = new Sequence(thisTemplate[dists[i].index]->getName(), thisTemplate[dists[i].index]->getAligned()); //have to make a copy so you can trim and filter without stepping on eachother.
+                       if ((thisTemplate[dists[i].index]->getName() != querySeq.getName()) && (((1.0-dists[i].dist)*100) >= minSim)) {
+                               Sequence temp(thisTemplate[dists[i].index]->getName(), thisTemplate[dists[i].index]->getAligned()); //have to make a copy so you can trim and filter without stepping on eachother.
                                //cout << querySeq->getName() << '\t' << thisTemplate[dists[i].index]->getName()  << '\t' << dists[i].dist << endl;
                                seqsMatches.push_back(temp);
                        }
@@ -889,17 +889,17 @@ Sequence* DeCalculator::findClosest(Sequence* querySeq, vector<Sequence*> db) {
        }
 }
 /***************************************************************************************************************/
-map<int, int> DeCalculator::trimSeqs(Sequence* query, vector<Sequence*> topMatches) {
+map<int, int> DeCalculator::trimSeqs(Sequence& query, vector<Sequence>& topMatches) {
        try {
                
                int frontPos = 0;  //should contain first position in all seqs that is not a gap character
-               int rearPos = query->getAligned().length();
+               int rearPos = query.getAligned().length();
                
                //********find first position in topMatches that is a non gap character***********//
                //find first position all query seqs that is a non gap character
                for (int i = 0; i < topMatches.size(); i++) {
                        
-                       string aligned = topMatches[i]->getAligned();
+                       string aligned = topMatches[i].getAligned();
                        int pos = 0;
                        
                        //find first spot in this seq
@@ -915,7 +915,7 @@ map<int, int> DeCalculator::trimSeqs(Sequence* query, vector<Sequence*> topMatch
                }
                
                
-               string aligned = query->getAligned();
+               string aligned = query.getAligned();
                int pos = 0;
                        
                //find first position in query that is a non gap character
@@ -933,7 +933,7 @@ map<int, int> DeCalculator::trimSeqs(Sequence* query, vector<Sequence*> topMatch
                //********find last position in topMatches that is a non gap character***********//
                for (int i = 0; i < topMatches.size(); i++) {
                        
-                       string aligned = topMatches[i]->getAligned();
+                       string aligned = topMatches[i].getAligned();
                        int pos = aligned.length();
                        
                        //find first spot in this seq
@@ -949,7 +949,7 @@ map<int, int> DeCalculator::trimSeqs(Sequence* query, vector<Sequence*> topMatch
                }
                
                
-               aligned = query->getAligned();
+               aligned = query.getAligned();
                pos = aligned.length();
                
                //find last position in query that is a non gap character
@@ -966,24 +966,24 @@ map<int, int> DeCalculator::trimSeqs(Sequence* query, vector<Sequence*> topMatch
                map<int, int> trimmedPos;
                //check to make sure that is not whole seq
                if ((rearPos - frontPos - 1) <= 0) {  
-                       query->setAligned("");
+                       query.setAligned("");
                        //trim topMatches
                        for (int i = 0; i < topMatches.size(); i++) {
-                               topMatches[i]->setAligned("");
+                               topMatches[i].setAligned("");
                        }
                        
                }else {
 
                        //trim query
-                       string newAligned = query->getAligned();
+                       string newAligned = query.getAligned();
                        newAligned = newAligned.substr(frontPos, (rearPos-frontPos+1));
-                       query->setAligned(newAligned);
+                       query.setAligned(newAligned);
                        
                        //trim topMatches
                        for (int i = 0; i < topMatches.size(); i++) {
-                               newAligned = topMatches[i]->getAligned();
+                               newAligned = topMatches[i].getAligned();
                                newAligned = newAligned.substr(frontPos, (rearPos-frontPos+1));
-                               topMatches[i]->setAligned(newAligned);
+                               topMatches[i].setAligned(newAligned);
                        }
                        
                        for (int i = 0; i < newAligned.length(); i++) {
index 40b3a10cb601d67bb17c442a9a972f42bbcfa104..d6cca182e81937dd5a494d57c2c8221b6039ad45 100644 (file)
--- a/decalc.h
+++ b/decalc.h
@@ -39,14 +39,14 @@ class DeCalculator {
                DeCalculator() { m = MothurOut::getInstance(); }
                ~DeCalculator() {};
                
-               vector<Sequence*> findClosest(Sequence*, vector<Sequence*>&, vector<Sequence*>&, int, int);  //takes querySeq, a reference db, filteredRefDB, numWanted, minSim 
+               vector<Sequence> findClosest(Sequence, vector<Sequence*>&, vector<Sequence*>&, int, int);  //takes querySeq, a reference db, filteredRefDB, numWanted, minSim 
                Sequence* findClosest(Sequence*, vector<Sequence*>);
                set<int> getPos() {  return h;  }
                void setMask(string); 
                void setAlignmentLength(int l) {  alignLength = l;  }
                void runMask(Sequence*);
                void trimSeqs(Sequence*, Sequence*, map<int, int>&);
-               map<int, int> trimSeqs(Sequence*, vector<Sequence*>);
+               map<int, int> trimSeqs(Sequence&, vector<Sequence>&);
                void removeObviousOutliers(vector< vector<float> >&, int);
                vector<float> calcFreq(vector<Sequence*>, string);
                vector<int> findWindows(Sequence*, int, int, int&, int);
index f4c4a9821350c38a9bde8ca7a4fcd6ae01d6b3c3..f31e4821fe52cb4160af0c6dbc30c0bf989a1cf6 100644 (file)
 #include "maligner.h"
 
 /***********************************************************************/ //int num, int match, int misMatch, , string mode, Database* dataLeft, Database* dataRight
-Maligner::Maligner(vector<Sequence*> temp, int match, int misMatch, float div, int ms, int minCov) : db(temp), matchScore(match), misMatchPenalty(misMatch), minDivR(div), minSimilarity(ms), minCoverage(minCov) { 
+Maligner::Maligner(vector<Sequence> temp, int match, int misMatch, float div, int ms, int minCov) : db(temp), matchScore(match), misMatchPenalty(misMatch), minDivR(div), minSimilarity(ms), minCoverage(minCov) { 
                        //numWanted(num),  , searchMethod(mode), databaseLeft(dataLeft), databaseRight(dataRight)
                        
                        m = MothurOut::getInstance(); 
                        
 }
 /***********************************************************************/
-string Maligner::getResults(Sequence* q, DeCalculator* decalc) {
+string Maligner::getResults(Sequence q, DeCalculator decalc) {
        try {
                
                outputResults.clear();
                
                //make copy so trimming doesn't destroy query from calling class - remember to deallocate
-               query = new Sequence(q->getName(), q->getAligned());
+               query.setName(q.getName()); query.setAligned(q.getAligned());
                
                string chimera;
                
                //copy refSeqs so that filter does not effect original
                for(int i = 0; i < db.size(); i++) {  
-                       Sequence* newSeq = new Sequence(db[i]->getName(), db[i]->getAligned());
+                       Sequence newSeq(db[i].getName(), db[i].getAligned());
                        refSeqs.push_back(newSeq);
                }
                
                refSeqs = minCoverageFilter(refSeqs);
                
                if (refSeqs.size() < 2)  { 
-                       for (int i = 0; i < refSeqs.size(); i++) {  delete refSeqs[i];  }
+                       //for (int i = 0; i < refSeqs.size(); i++) {  delete refSeqs[i];        }
                        percentIdenticalQueryChimera = 0.0;
                        return "unknown"; 
                }
@@ -49,9 +49,9 @@ string Maligner::getResults(Sequence* q, DeCalculator* decalc) {
                if (m->control_pressed) { return chimera;  }
                                
                //free memory
-               delete query;
+               //delete query;
 
-               for (int i = 0; i < refSeqs.size(); i++) {  delete refSeqs[i];  }
+               //for (int i = 0; i < refSeqs.size(); i++) {  delete refSeqs[i];        }
                
                return chimera;
        }
@@ -61,30 +61,26 @@ string Maligner::getResults(Sequence* q, DeCalculator* decalc) {
        }
 }
 /***********************************************************************/
-string Maligner::chimeraMaligner(int chimeraPenalty, DeCalculator* decalc) {
+string Maligner::chimeraMaligner(int chimeraPenalty, DeCalculator decalc) {
        try {
                
                string chimera;
-               
                //trims seqs to first non gap char in all seqs and last non gap char in all seqs
-               spotMap = decalc->trimSeqs(query, refSeqs);
-               
+               spotMap = decalc.trimSeqs(query, refSeqs);
+
                //you trimmed the whole sequence, skip
-               if (query->getAligned() == "") { return "no"; }
+               if (query.getAligned() == "") { return "no"; }
 
-               vector<Sequence*> temp = refSeqs;
-               
-//             for(int i=0;i<refSeqs.size();i++){
-//                     cout << refSeqs[i]->getName() << endl;
-//             }
-               
+               vector<Sequence> temp = refSeqs;
                temp.push_back(query);
                        
-               verticalFilter(temp);
+               temp = verticalFilter(temp);
+               query = temp[temp.size()-1];
+               for (int i = 0; i < temp.size()-1; i++) {  refSeqs[i] = temp[i]; }
                
                //for (int i = 0; i < refSeqs.size(); i++) { cout << refSeqs[i]->getName() << endl ; }//<< refSeqs[i]->getAligned() << endl
 
-               vector< vector<score_struct> > matrix = buildScoreMatrix(query->getAligned().length(), refSeqs.size()); //builds and initializes
+               vector< vector<score_struct> > matrix = buildScoreMatrix(query.getAligned().length(), refSeqs.size()); //builds and initializes
                
                if (m->control_pressed) { return chimera;  }
                
@@ -94,14 +90,14 @@ string Maligner::chimeraMaligner(int chimeraPenalty, DeCalculator* decalc) {
                
                if (m->control_pressed) { return chimera;  }
                
-               vector<trace_struct> trace = mapTraceRegionsToAlignment(path, refSeqs);
+               vector<trace_struct> trace = mapTraceRegionsToAlignment(path);
                                
                if (trace.size() > 1) {         chimera = "yes";        }
                else { chimera = "no";  return chimera; }
                
                int traceStart = path[0].col;
                int traceEnd = path[path.size()-1].col; 
-               string queryInRange = query->getAligned();
+               string queryInRange = query.getAligned();
                queryInRange = queryInRange.substr(traceStart, (traceEnd-traceStart+1));
 //             cout << queryInRange << endl;
                string chimeraSeq = constructChimericSeq(trace, refSeqs);
@@ -140,23 +136,23 @@ string Maligner::chimeraMaligner(int chimeraPenalty, DeCalculator* decalc) {
 //                     cout << regionStart << '\t' << regionEnd << '\t' << seqIndex << endl;
                        results temp;
                        
-                       temp.parent = refSeqs[seqIndex]->getName();
-                       temp.parentAligned = db[seqIndex]->getAligned();
+                       temp.parent = refSeqs[seqIndex].getName();
+                       temp.parentAligned = db[seqIndex].getAligned();
                        temp.nastRegionStart = spotMap[regionStart];
                        temp.nastRegionEnd = spotMap[regionEnd];
                        temp.regionStart = unalignedMap[regionStart];
                        temp.regionEnd = unalignedMap[regionEnd];
                        
-                       string parentInRange = refSeqs[seqIndex]->getAligned();
+                       string parentInRange = refSeqs[seqIndex].getAligned();
                        parentInRange = parentInRange.substr(traceStart, (traceEnd-traceStart+1));
                        
                        temp.queryToParent = computePercentID(queryInRange, parentInRange);
                        temp.divR = (percentIdenticalQueryChimera / temp.queryToParent);
 
-                       string queryInRegion = query->getAligned();
+                       string queryInRegion = query.getAligned();
                        queryInRegion = queryInRegion.substr(regionStart, (regionEnd-regionStart+1));
                        
-                       string parentInRegion = refSeqs[seqIndex]->getAligned();
+                       string parentInRegion = refSeqs[seqIndex].getAligned();
                        parentInRegion = parentInRegion.substr(regionStart, (regionEnd-regionStart+1));
                        
                        temp.queryToParentLocal = computePercentID(queryInRegion, parentInRegion);
@@ -175,15 +171,15 @@ string Maligner::chimeraMaligner(int chimeraPenalty, DeCalculator* decalc) {
 }
 /***********************************************************************/
 //removes top matches that do not have minimum coverage with query.
-vector<Sequence*> Maligner::minCoverageFilter(vector<Sequence*> ref){  
+vector<Sequence> Maligner::minCoverageFilter(vector<Sequence> ref){  
        try {
-               vector<Sequence*> newRefs;
+               vector<Sequence> newRefs;
                
-               string queryAligned = query->getAligned();
+               string queryAligned = query.getAligned();
                
                for (int i = 0; i < ref.size(); i++) {
                        
-                       string refAligned = ref[i]->getAligned();
+                       string refAligned = ref[i].getAligned();
                        
                        int numBases = 0;
                        int numCovered = 0;
@@ -205,9 +201,9 @@ vector<Sequence*> Maligner::minCoverageFilter(vector<Sequence*> ref){
                        //if coverage above minimum
                        if (coverage > minCoverage) {
                                newRefs.push_back(ref[i]);
-                       }else {
-                               delete ref[i];
-                       }
+                       }//else {
+                               //delete ref[i];
+                       //}
                }
                
                return newRefs;
@@ -222,7 +218,7 @@ vector<Sequence*> Maligner::minCoverageFilter(vector<Sequence*> ref){
 int Maligner::computeChimeraPenalty() {
        try {
                
-               int numAllowable = ((1.0 - (1.0/minDivR)) * query->getNumBases());
+               int numAllowable = ((1.0 - (1.0/minDivR)) * query.getNumBases());
 
 //             if(numAllowable < 1){   numAllowable = 1;       }
                
@@ -238,16 +234,16 @@ int Maligner::computeChimeraPenalty() {
 }
 /***********************************************************************/
 //this is a vertical filter
-void Maligner::verticalFilter(vector<Sequence*> seqs) {
+vector<Sequence> Maligner::verticalFilter(vector<Sequence> seqs) {
        try {
-               vector<int> gaps;       gaps.resize(query->getAligned().length(), 0);
+               vector<int> gaps;       gaps.resize(query.getAligned().length(), 0);
                
-               string filterString = (string(query->getAligned().length(), '1'));
+               string filterString = (string(query.getAligned().length(), '1'));
                
                //for each sequence
                for (int i = 0; i < seqs.size(); i++) {
                
-                       string seqAligned = seqs[i]->getAligned();
+                       string seqAligned = seqs[i].getAligned();
                        
                        for (int j = 0; j < seqAligned.length(); j++) {
                                //if this spot is a gap
@@ -257,7 +253,7 @@ void Maligner::verticalFilter(vector<Sequence*> seqs) {
                
                //zero out spot where all sequences have blanks
                int numColRemoved = 0;
-               for(int i = 0; i < seqs[0]->getAligned().length(); i++){
+               for(int i = 0; i < seqs[0].getAligned().length(); i++){
                        if(gaps[i] == seqs.size())      {       filterString[i] = '0';  numColRemoved++;  }
                }
                
@@ -265,7 +261,7 @@ void Maligner::verticalFilter(vector<Sequence*> seqs) {
                //for each sequence
                for (int i = 0; i < seqs.size(); i++) {
                
-                       string seqAligned = seqs[i]->getAligned();
+                       string seqAligned = seqs[i].getAligned();
                        string newAligned = "";
                        int count = 0;
                        
@@ -278,10 +274,10 @@ void Maligner::verticalFilter(vector<Sequence*> seqs) {
                                }
                        }
                        
-                       seqs[i]->setAligned(newAligned);
+                       seqs[i].setAligned(newAligned);
                }
                
-               string query = seqs[seqs.size()-1]->getAligned();
+               string query = seqs[seqs.size()-1].getAligned();
                int queryLength = query.length();
                
                unalignedMap.resize(queryLength, 0);
@@ -297,6 +293,8 @@ void Maligner::verticalFilter(vector<Sequence*> seqs) {
                }
                
                spotMap = newMap;
+               
+               return seqs;
        }
        catch(exception& e) {
                m->errorOut(e, "Maligner", "verticalFilter");
@@ -333,19 +331,19 @@ vector< vector<score_struct> > Maligner::buildScoreMatrix(int cols, int rows) {
 
 //***************************************************************************************************************
 
-void Maligner::fillScoreMatrix(vector<vector<score_struct> >& ms, vector<Sequence*> seqs, int penalty) {
+void Maligner::fillScoreMatrix(vector<vector<score_struct> >& ms, vector<Sequence> seqs, int penalty) {
        try{
                
                //get matrix dimensions
-               int numCols = query->getAligned().length();
+               int numCols = query.getAligned().length();
                int numRows = seqs.size();
                
 //             cout << numRows << endl;
                
                //initialize first col
-               string queryAligned = query->getAligned();
+               string queryAligned = query.getAligned();
                for (int i = 0; i < numRows; i++) {
-                       string subjectAligned = seqs[i]->getAligned();
+                       string subjectAligned = seqs[i].getAligned();
                        
                        //are you both gaps?
                        if ((!isalpha(queryAligned[0])) && (!isalpha(subjectAligned[0]))) {
@@ -366,7 +364,7 @@ void Maligner::fillScoreMatrix(vector<vector<score_struct> >& ms, vector<Sequenc
 //                     for (int i = 0; i < 1; i++) {  //iterate through matrix rows
                        for (int i = 0; i < numRows; i++) {  //iterate through matrix rows
                                
-                               string subjectAligned = seqs[i]->getAligned();
+                               string subjectAligned = seqs[i].getAligned();
                                
                                int matchMisMatchScore = 0;
                                //are you both gaps?
@@ -434,7 +432,7 @@ vector<score_struct> Maligner::extractHighestPath(vector<vector<score_struct> >
        try {
                
                //get matrix dimensions
-               int numCols = query->getAligned().length();
+               int numCols = query.getAligned().length();
                int numRows = ms.size();
                
                
@@ -480,7 +478,7 @@ vector<score_struct> Maligner::extractHighestPath(vector<vector<score_struct> >
        }
 }
 //***************************************************************************************************************
-vector<trace_struct> Maligner::mapTraceRegionsToAlignment(vector<score_struct> path, vector<Sequence*> seqs) {
+vector<trace_struct> Maligner::mapTraceRegionsToAlignment(vector<score_struct> path) {
        try {
                vector<trace_struct> trace;
                
@@ -668,14 +666,14 @@ vector<trace_struct> Maligner::mapTraceRegionsToAlignment(vector<score_struct> p
 */
 //***************************************************************************************************************
 
-string Maligner::constructChimericSeq(vector<trace_struct> trace, vector<Sequence*> seqs) {
+string Maligner::constructChimericSeq(vector<trace_struct> trace, vector<Sequence> seqs) {
        try {
                string chimera = "";
                
                for (int i = 0; i < trace.size(); i++) {
 //                     cout << i << '\t' << trace[i].row << '\t' << trace[i].col << '\t' << trace[i].oldCol << endl;
                        
-                       string seqAlign = seqs[trace[i].row]->getAligned();
+                       string seqAlign = seqs[trace[i].row].getAligned();
                        seqAlign = seqAlign.substr(trace[i].col, (trace[i].oldCol-trace[i].col+1));
                        chimera += seqAlign;
                }
@@ -692,7 +690,7 @@ string Maligner::constructChimericSeq(vector<trace_struct> trace, vector<Sequenc
 
 //***************************************************************************************************************
 
-string Maligner::constructAntiChimericSeq(vector<trace_struct> trace, vector<Sequence*> seqs) {
+string Maligner::constructAntiChimericSeq(vector<trace_struct> trace, vector<Sequence> seqs) {
        try {
                string antiChimera = "";
                
@@ -701,7 +699,7 @@ string Maligner::constructAntiChimericSeq(vector<trace_struct> trace, vector<Seq
                        
                        int oppositeIndex = trace.size() - i - 1;
                        
-                       string seqAlign = seqs[trace[oppositeIndex].row]->getAligned();
+                       string seqAlign = seqs[trace[oppositeIndex].row].getAligned();
                        seqAlign = seqAlign.substr(trace[i].col, (trace[i].oldCol-trace[i].col+1));
                        antiChimera += seqAlign;
                }
index 4f5c949a45112ebed570f4f6df46cd60f1aeb23e..fc00e99faf3ad3931f76606c34ffb65b69eb4de7 100644 (file)
@@ -20,35 +20,35 @@ class Maligner {
 
        public:
                
-               Maligner(vector<Sequence*>, int, int, float, int, int); //int, int, int, , string, Database*, Database*
+               Maligner(vector<Sequence>, int, int, float, int, int); //int, int, int, , string, Database*, Database*
                ~Maligner() {};
                
-               string getResults(Sequence*, DeCalculator*);
+               string getResults(Sequence, DeCalculator);
                float getPercentID() {  return percentIdenticalQueryChimera;    }
                vector<results> getOutput()  {  return outputResults;                   }
                
                                
        private:
-               Sequence* query;
-               vector<Sequence*> refSeqs;
-               vector<Sequence*> db;
+               Sequence query;
+               vector<Sequence> refSeqs;
+               vector<Sequence> db;
                int minCoverage, minSimilarity, matchScore, misMatchPenalty;
                float minDivR, percentIdenticalQueryChimera;
                vector<results> outputResults;
                map<int, int> spotMap;
                vector<int> unalignedMap;
-               vector<Sequence*> minCoverageFilter(vector<Sequence*>);  //removes top matches that do not have minimum coverage with query.
+               vector<Sequence> minCoverageFilter(vector<Sequence>);  //removes top matches that do not have minimum coverage with query.
                int computeChimeraPenalty();
-               void verticalFilter(vector<Sequence*>);
+               vector<Sequence> verticalFilter(vector<Sequence>);
                
                vector< vector<score_struct> > buildScoreMatrix(int, int);
-               void fillScoreMatrix(vector<vector<score_struct> >&, vector<Sequence*>, int);
+               void fillScoreMatrix(vector<vector<score_struct> >&, vector<Sequence>, int);
                vector<score_struct> extractHighestPath(vector<vector<score_struct> >);
-               vector<trace_struct> mapTraceRegionsToAlignment(vector<score_struct>, vector<Sequence*>);
-               string constructChimericSeq(vector<trace_struct>, vector<Sequence*>);
-               string constructAntiChimericSeq(vector<trace_struct>, vector<Sequence*>);
+               vector<trace_struct> mapTraceRegionsToAlignment(vector<score_struct>);
+               string constructChimericSeq(vector<trace_struct>, vector<Sequence>);
+               string constructAntiChimericSeq(vector<trace_struct>, vector<Sequence>);
                float computePercentID(string, string);
-               string chimeraMaligner(int, DeCalculator*);
+               string chimeraMaligner(int, DeCalculator);
                MothurOut* m;
                
 };
index b04efea9ba2c59b06dff4bf599d492dc2f9cd0e2..10f931f8230d035decdfcc282fe8de248aa0bdac 100644 (file)
@@ -249,7 +249,7 @@ int Pintail::doPrep() {
        }
 }
 //***************************************************************************************************************
-Sequence* Pintail::print(ostream& out, ostream& outAcc) {
+Sequence Pintail::print(ostream& out, ostream& outAcc) {
        try {
                
                int index = ceil(deviation);
@@ -280,7 +280,7 @@ Sequence* Pintail::print(ostream& out, ostream& outAcc) {
                for (int m = 0; m < expectedDistance.size(); m++) {  out << expectedDistance[m] << '\t';  }
                out << endl;
                
-               return NULL;
+               return *querySeq;
                
        }
        catch(exception& e) {
index 6bbc1a3ab2b74f856ddae5c7a42376280656a389..92c399889c3be0aa0e552fe296612eb336bc8168 100644 (file)
--- a/pintail.h
+++ b/pintail.h
@@ -28,13 +28,13 @@ class Pintail : public Chimera {
                ~Pintail();
                
                int getChimeras(Sequence*);
-               Sequence* print(ostream&, ostream&);
+               Sequence print(ostream&, ostream&);
                
                void setCons(string c)          { consfile = c;  }
                void setQuantiles(string q) { quanfile = q;  }
                
                #ifdef USE_MPI
-               Sequence* print(MPI_File&, MPI_File&);
+               Sequence print(MPI_File&, MPI_File&);
                #endif
                
        private:
index 4987d4170337f6d4e172c395c137be71832759ed..a787f2727dd8290b89bffeb382bae6c15001110d 100644 (file)
 Slayer::Slayer(int win, int increment, int parentThreshold, float div, int i, int snp, int mi) :
                minBS(mi), windowSize(win), windowStep(increment), parentFragmentThreshold(parentThreshold), divRThreshold(div), iters(i), percentSNPSample(snp){ m = MothurOut::getInstance(); }
 /***********************************************************************/
-string Slayer::getResults(Sequence* query, vector<Sequence*> refSeqs) {
+string Slayer::getResults(Sequence query, vector<Sequence> refSeqs) {
        try {
                vector<data_struct> all; all.clear();
-               myQuery = *query;
+               myQuery = query;
 
                for (int i = 0; i < refSeqs.size(); i++) {
                
@@ -25,19 +25,21 @@ string Slayer::getResults(Sequence* query, vector<Sequence*> refSeqs) {
                                if (m->control_pressed) { return "no";  }
        
                                //make copies of query and each parent because runBellerophon removes gaps and messes them up
-                               Sequence* q = new Sequence(query->getName(), query->getAligned());
-                               Sequence* leftParent = new Sequence(refSeqs[i]->getName(), refSeqs[i]->getAligned());
-                               Sequence* rightParent = new Sequence(refSeqs[j]->getName(), refSeqs[j]->getAligned());
+                               Sequence q(query.getName(), query.getAligned());
+                               Sequence leftParent(refSeqs[i].getName(), refSeqs[i].getAligned());
+                               Sequence rightParent(refSeqs[j].getName(), refSeqs[j].getAligned());
                                
                                //cout << q->getName() << endl << q->getAligned() << endl << endl;      
-                               //cout << leftParent->getName() << endl << leftParent->getAligned() << endl << endl;            
+                               //cout << leftParent.getName() << '\t' << leftParent.getAligned().length() << endl << endl;
+                               //cout << rightParent.getName() << '\t' << rightParent.getAligned().length() << endl << endl;
+                               //cout << q.getName() << '\t' << q.getAligned().length() << endl << endl;
                                //cout << rightParent->getName() << endl << rightParent->getAligned() << endl << endl;  
                                //cout << " length = " << rightParent->getAligned().length() << endl;
        
                                map<int, int> spots;  //map from spot in original sequence to spot in filtered sequence for query and both parents
                                vector<data_struct> divs = runBellerophon(q, leftParent, rightParent, spots);
        
-                               if (m->control_pressed) { delete q; delete leftParent; delete rightParent; return "no"; }
+                               if (m->control_pressed) { return "no"; }
 //                             cout << "examining:\t" << refSeqs[i]->getName() << '\t' << refSeqs[j]->getName() << endl;
                                vector<data_struct> selectedDivs;
                                for (int k = 0; k < divs.size(); k++) {
@@ -45,7 +47,7 @@ string Slayer::getResults(Sequence* query, vector<Sequence*> refSeqs) {
                                        vector<snps> snpsLeft = getSNPS(divs[k].parentA.getAligned(), divs[k].querySeq.getAligned(), divs[k].parentB.getAligned(), divs[k].winLStart, divs[k].winLEnd);
                                        vector<snps> snpsRight = getSNPS(divs[k].parentA.getAligned(), divs[k].querySeq.getAligned(), divs[k].parentB.getAligned(), divs[k].winRStart, divs[k].winREnd);
        
-                                       if (m->control_pressed) { delete q; delete leftParent; delete rightParent; return "no"; }
+                                       if (m->control_pressed) {  return "no"; }
                                        
                                        int numSNPSLeft = snpsLeft.size();
                                        int numSNPSRight = snpsRight.size();
@@ -57,7 +59,7 @@ string Slayer::getResults(Sequence* query, vector<Sequence*> refSeqs) {
                                                float BS_A, BS_B;
                                                bootstrapSNPS(snpsLeft, snpsRight, BS_A, BS_B, iters);
                                                
-                                               if (m->control_pressed) { delete q; delete leftParent; delete rightParent; return "no"; }
+                                               if (m->control_pressed) { return "no"; }
 
                                                divs[k].bsa = BS_A;
                                                divs[k].bsb = BS_B;
@@ -89,10 +91,6 @@ string Slayer::getResults(Sequence* query, vector<Sequence*> refSeqs) {
 
                                //save selected
                                for (int mi = 0; mi < selectedDivs.size(); mi++) {  all.push_back(selectedDivs[mi]);    }
-                               
-                               delete q;
-                               delete leftParent;
-                               delete rightParent;
                        }
                }
                
@@ -116,26 +114,27 @@ string Slayer::getResults(Sequence* query, vector<Sequence*> refSeqs) {
        }
 }
 /***********************************************************************/
-vector<data_struct> Slayer::runBellerophon(Sequence* q, Sequence* pA, Sequence* pB, map<int, int>& spots) {
+vector<data_struct> Slayer::runBellerophon(Sequence q, Sequence pA, Sequence pB, map<int, int>& spots) {
        try{
                
                vector<data_struct> data;
                
                //vertical filter
-               vector<Sequence*> temp;
-               temp.push_back(q); temp.push_back(pA); temp.push_back(pB);
+               //cout << q.getName() << endl << q.getAligned() << endl << endl;        
+               //cout << pA.getName() << endl << pA.getUnaligned() << endl << endl;            
+               //cout << pB.getName() << endl << pB.getUnaligned() << endl << endl;    
                
                //maps spot in new alignment to spot in alignment before filter
-               spots = verticalFilter(temp);  //fills baseSpots
+               spots = verticalFilter(q, pA, pB);  //fills baseSpots
                
                //get these to avoid numerous function calls
-               string query = q->getAligned();
-               string parentA = pA->getAligned();
-               string parentB = pB->getAligned();
+               string query = q.getAligned();
+               string parentA = pA.getAligned();
+               string parentB = pB.getAligned();
                int length = query.length();
-//cout << q->getName() << endl << q->getAligned() << endl << endl;     
-//cout << pA->getName() << endl << pA->getUnaligned() << endl << endl;         
-//cout << pB->getName() << endl << pB->getUnaligned() << endl << endl; 
+//cout << q.getName() << endl << q.getAligned() << endl << endl;       
+//cout << pA.getName() << endl << pA.getUnaligned() << endl << endl;           
+//cout << pB.getName() << endl << pB.getUnaligned() << endl << endl;   
 //cout << " length = " << length << endl;
        
                //check window size
@@ -209,9 +208,9 @@ vector<data_struct> Slayer::runBellerophon(Sequence* q, Sequence* pA, Sequence*
                                        member.winLEnd = breakpoint;  
                                        member.winRStart = breakpoint+1; 
                                        member.winREnd = length-1; 
-                                       member.querySeq = *(q);
-                                       member.parentA = *(pA);
-                                       member.parentB = *(pB);
+                                       member.querySeq = q;
+                                       member.parentA = pA;
+                                       member.parentB = pB;
                                        member.bsa = 0;
                                        member.bsb = 0;
                                        member.bsMax = 0;
@@ -478,33 +477,41 @@ float Slayer::computePercentID(string queryAlign, string chimera, int left, int
 }
 /***********************************************************************/
 //remove columns that contain any gaps
-map<int, int> Slayer::verticalFilter(vector<Sequence*> seqs) {
+map<int, int> Slayer::verticalFilter(Sequence& q, Sequence& pA, Sequence& pB) {
        try {
                //find baseSpots
                baseSpots.clear(); 
                baseSpots.resize(3);  //query, parentA, parentB
        
-               vector<int> gaps;       gaps.resize(seqs[0]->getAligned().length(), 0);
+               vector<int> gaps;       gaps.resize(q.getAligned().length(), 0);
                
-               string filterString = (string(seqs[0]->getAligned().length(), '1'));
+               string filterString = (string(q.getAligned().length(), '1'));
                
-               //for each sequence
-               for (int i = 0; i < seqs.size(); i++) {
+               string seqAligned = q.getAligned();
+               for (int j = 0; j < seqAligned.length(); j++) {
+                       //if this spot is a gap
+                       if ((seqAligned[j] == '-') || (seqAligned[j] == '.') || (toupper(seqAligned[j]) == 'N'))        {   gaps[j]++;  }
+               }
                
-                       string seqAligned = seqs[i]->getAligned();
-                       
-                       for (int j = 0; j < seqAligned.length(); j++) {
-                               //if this spot is a gap
-                               if ((seqAligned[j] == '-') || (seqAligned[j] == '.') || (toupper(seqAligned[j]) == 'N'))        {   gaps[j]++;  }
-                       }
+               seqAligned = pA.getAligned();
+               for (int j = 0; j < seqAligned.length(); j++) {
+                       //if this spot is a gap
+                       if ((seqAligned[j] == '-') || (seqAligned[j] == '.') || (toupper(seqAligned[j]) == 'N'))        {   gaps[j]++;  }
                }
                
+               seqAligned = pB.getAligned();
+               for (int j = 0; j < seqAligned.length(); j++) {
+                       //if this spot is a gap
+                       if ((seqAligned[j] == '-') || (seqAligned[j] == '.') || (toupper(seqAligned[j]) == 'N'))        {   gaps[j]++;  }
+               }
+               
+               
                //zero out spot where any sequences have blanks
                int numColRemoved = 0;
                int count = 0;
                map<int, int> maskMap; maskMap.clear();
 
-               for(int i = 0; i < seqs[0]->getAligned().length(); i++){
+               for(int i = 0; i < q.getAligned().length(); i++){
                        if(gaps[i] != 0)        {       filterString[i] = '0';  numColRemoved++;  }
                        else {
                                maskMap[count] = i;
@@ -512,29 +519,64 @@ map<int, int> Slayer::verticalFilter(vector<Sequence*> seqs) {
                        }
                }
 
-               //for each sequence
-               for (int i = 0; i < seqs.size(); i++) {
-               
-                       string seqAligned = seqs[i]->getAligned();
-                       string newAligned = "";
+               seqAligned = q.getAligned();
+               string newAligned = "";
                        
-                       int baseCount = 0;
-                       int count = 0;
-                       for (int j = 0; j < seqAligned.length(); j++) {
-                               //are you a base
-                               if ((seqAligned[j] != '-') && (seqAligned[j] != '.') && (toupper(seqAligned[j]) != 'N'))        { baseCount++; }
+               int baseCount = 0;
+               count = 0;
+               for (int j = 0; j < seqAligned.length(); j++) {
+                       //are you a base
+                       if ((seqAligned[j] != '-') && (seqAligned[j] != '.') && (toupper(seqAligned[j]) != 'N'))        { baseCount++; }
                        
-                               //if this spot is not a gap
-                               if (filterString[j] == '1') { 
-                                       newAligned += seqAligned[j]; 
-                                       baseSpots[i][count] = baseCount;
-                                       count++;
-                               }
+                       //if this spot is not a gap
+                       if (filterString[j] == '1') { 
+                               newAligned += seqAligned[j]; 
+                               baseSpots[0][count] = baseCount;
+                               count++;
                        }
+               }
                        
-                       seqs[i]->setAligned(newAligned);
+               q.setAligned(newAligned);
+               
+               seqAligned = pA.getAligned();
+               newAligned = "";
+               
+               baseCount = 0;
+               count = 0;
+               for (int j = 0; j < seqAligned.length(); j++) {
+                       //are you a base
+                       if ((seqAligned[j] != '-') && (seqAligned[j] != '.') && (toupper(seqAligned[j]) != 'N'))        { baseCount++; }
+                       
+                       //if this spot is not a gap
+                       if (filterString[j] == '1') { 
+                               newAligned += seqAligned[j]; 
+                               baseSpots[1][count] = baseCount;
+                               count++;
+                       }
+               }
+               
+               pA.setAligned(newAligned);
+               
+               seqAligned = pB.getAligned();
+               newAligned = "";
+               
+               baseCount = 0;
+               count = 0;
+               for (int j = 0; j < seqAligned.length(); j++) {
+                       //are you a base
+                       if ((seqAligned[j] != '-') && (seqAligned[j] != '.') && (toupper(seqAligned[j]) != 'N'))        { baseCount++; }
+                       
+                       //if this spot is not a gap
+                       if (filterString[j] == '1') { 
+                               newAligned += seqAligned[j]; 
+                               baseSpots[2][count] = baseCount;
+                               count++;
+                       }
                }
                
+               pB.setAligned(newAligned);
+               
+               
                return maskMap;
        }
        catch(exception& e) {
index 107b02785fffb395662508dc8875e49013103b47..eeefc62392b64cdb0eb5797cba1c994b27058f50 100644 (file)
--- a/slayer.h
+++ b/slayer.h
@@ -32,7 +32,7 @@ class Slayer {
                Slayer(int, int, int, float, int, int, int);
                ~Slayer() {};
                
-               string getResults(Sequence*, vector<Sequence*>);
+               string getResults(Sequence, vector<Sequence>);
                vector<data_struct> getOutput()  {      return outputResults;                   }
                
                                
@@ -44,10 +44,10 @@ class Slayer {
                vector< map<int, int> > baseSpots;
                Sequence myQuery;
                
-               map<int, int> verticalFilter(vector<Sequence*>);
+               map<int, int> verticalFilter(Sequence&, Sequence&, Sequence&);
                float computePercentID(string, string, int, int);
                
-               vector<data_struct> runBellerophon(Sequence*, Sequence*, Sequence*, map<int, int>&);
+               vector<data_struct> runBellerophon(Sequence, Sequence, Sequence, map<int, int>&);
                vector<snps> getSNPS(string, string, string, int, int);
                int bootstrapSNPS(vector<snps>, vector<snps>, float&, float&, int);
                float snpQA(vector<snps>);