]> git.donarmstrong.com Git - mothur.git/blobdiff - qualityscores.cpp
fixed trim.seqs bug with qtrim parameter and added num=1 special case to database...
[mothur.git] / qualityscores.cpp
index dd5d6de8da69a000882eadd86f8d2c50f853454f..4dd5b38d4f7ab3895d7fa305bdb57f2e9ab5a628 100644 (file)
@@ -16,6 +16,7 @@ QualityScores::QualityScores(){
                m = MothurOut::getInstance();
                seqName = "";
                seqLength = -1;
+               
        }
        catch(exception& e) {
                m->errorOut(e, "QualityScores", "QualityScores");
@@ -34,14 +35,16 @@ QualityScores::QualityScores(ifstream& qFile, int l){
                seqLength = l;
                int score;
                
-               string line;
-               getline(qFile, line); gobble(qFile);
-               istringstream nameStream(line);
-       
-               nameStream >> seqName;
-               seqName = seqName.substr(1); 
+               qFile >> seqName; 
 
-               //getline(qFile, line);
+               while (!qFile.eof())    {       char c = qFile.get(); if (c == 10 || c == 13 || c == -1){       break;  }       } // get rest of line 
+               m->gobble(qFile);
+               if (seqName == "") { m->mothurOut("Error reading quality file, name blank at position, " + toString(qFile.tellg())); m->mothurOutEndLine(); }
+               else {
+                       seqName = seqName.substr(1); 
+               }
+               
+               //m->getline(qFile, line);
                //istringstream qualStream(line);
        
                //while(qualStream){
@@ -52,11 +55,45 @@ QualityScores::QualityScores(ifstream& qFile, int l){
                
                //seqLength = qScores.size();   
                
+               /*while(!in.eof()){     
+                       string saveName = "";
+                       string name = "";
+                       string scores = "";
+                       
+                       in >> name; 
+                       //cout << name << endl;         
+                       if (name.length() != 0) { 
+                               saveName = name.substr(1);
+                               while (!in.eof())       {       
+                                       char c = in.get(); 
+                                       if (c == 10 || c == 13){        break;  }
+                                       else { name += c; }     
+                               } 
+                               m->gobble(in);
+                       }
+                       
+                       while(in){
+                               char letter= in.get();
+                               if(letter == '>'){      in.putback(letter);     break;  }
+                               else{ scores += letter; }
+                       }
+                       
+                //istringstream iss (scores,istringstream::in);
+                
+                //int count = 0; int tempScore;
+                //while (iss) { iss >> tempScore; count++; }
+                //cout << saveName << '\t' << count << endl;   
+                       
+                       m->gobble(in);
+               }*/             
+               
+               
+               
                for(int i=0;i<seqLength;i++){
                        qFile >> score;
                        qScores.push_back(score);
                }
-               gobble(qFile);
+               m->gobble(qFile);
 
        }
        catch(exception& e) {
@@ -65,7 +102,6 @@ QualityScores::QualityScores(ifstream& qFile, int l){
        }                                                       
 
 }
-
 /**************************************************************************************************/
 
 string QualityScores::getName(){
@@ -111,8 +147,10 @@ void QualityScores::trimQScores(int start, int end){
                        qScores = hold;         
                }
                if(start == -1){
-                       hold = vector<int>(qScores.begin(), qScores.begin()+end);       //not sure if indexing is correct
-                       qScores = hold;         
+                       if(qScores.size() > end){
+                               hold = vector<int>(qScores.begin(), qScores.begin()+end);
+                               qScores = hold;         
+                       }
                }
 
                seqLength = qScores.size();
@@ -160,9 +198,12 @@ bool QualityScores::stripQualThreshold(Sequence& sequence, double qThreshold){
                        }
                }
                
+               //every score passed
+               if (end == (seqLength-1)) { end = seqLength; }
+               
                sequence.setUnaligned(rawSequence.substr(0,end));
                trimQScores(-1, end);
-       
+               
                return 1;
        }
        catch(exception& e) {
@@ -200,9 +241,11 @@ bool QualityScores::stripQualRollingAverage(Sequence& sequence, double qThreshol
                
                if(end == -1){  end = seqLength;        }
                
+               
                sequence.setUnaligned(rawSequence.substr(0,end));
                trimQScores(-1, end);
                
+               
                return 1;
        }
        catch(exception& e) {
@@ -220,14 +263,15 @@ bool QualityScores::stripQualWindowAverage(Sequence& sequence, int stepSize, int
                int seqLength = sequence.getNumBases();
                
                if(seqName != sequence.getName()){
-                       m->mothurOut("sequence name mismatch btwn fasta: " + sequence.getName() + " and qual file: " + seqName);
-                       m->mothurOutEndLine();  
+                       m->mothurOut("sequence name mismatch between fasta: " + sequence.getName() + " and qual file: " + seqName);
+                       m->mothurOutEndLine();
                }
                
                int end = windowSize;
                int start = 0;
                
-
+               if(seqLength < windowSize) {    return 0;       }
+               
                while(start < seqLength){
                        double windowSum = 0.0000;
 
@@ -237,7 +281,7 @@ bool QualityScores::stripQualWindowAverage(Sequence& sequence, int stepSize, int
                        double windowAverage = windowSum / (double)(end-start);
                        
                        if(windowAverage < qThreshold){
-                               end = start;
+                               end = end - stepSize;
                                break;
                        }
                        start += stepSize;
@@ -248,6 +292,7 @@ bool QualityScores::stripQualWindowAverage(Sequence& sequence, int stepSize, int
                
                if(end == -1){  end = seqLength;        }
                
+               
                sequence.setUnaligned(rawSequence.substr(0,end));
                trimQScores(-1, end);
                
@@ -294,7 +339,66 @@ bool QualityScores::cullQualAverage(Sequence& sequence, double qAverage){
                return success;
        }
        catch(exception& e) {
-               m->errorOut(e, "TrimSeqsCommand", "cullQualAverage");
+               m->errorOut(e, "QualityScores", "cullQualAverage");
+               exit(1);
+       }
+}
+
+/**************************************************************************************************/
+
+void QualityScores::updateQScoreErrorMap(map<char, vector<int> >& qualErrorMap, string errorSeq, int start, int stop, int weight){
+       try {
+
+               int seqLength = errorSeq.size();
+               int qIndex = start - 1;
+               for(int i=0;i<seqLength;i++){
+                       
+                       if(errorSeq[i] == 'm')          {       qualErrorMap['m'][qScores[qIndex]] += weight;   }
+                       else if(errorSeq[i] == 's')     {       qualErrorMap['s'][qScores[qIndex]] += weight;   }
+                       else if(errorSeq[i] == 'i')     {       qualErrorMap['i'][qScores[qIndex]] += weight;   }
+                       else if(errorSeq[i] == 'a')     {       qualErrorMap['a'][qScores[qIndex]] += weight;   }
+                       else if(errorSeq[i] == 'd')     {       /*      there are no qScores for deletions      */              }
+
+                       if(errorSeq[i] != 'd')          {       qIndex++;       }
+
+               }       
+       }
+       catch(exception& e) {
+               m->errorOut(e, "QualityScores", "updateQScoreErrorMap");
+               exit(1);
+       }
+}
+
+/**************************************************************************************************/
+
+void QualityScores::updateForwardMap(vector<vector<int> >& forwardMap, int start, int stop, int weight){
+       try {
+               
+               int index = 0;
+               for(int i=start-1;i<stop;i++){
+                       forwardMap[index++][qScores[i]] += weight;
+               }
+               
+       }
+       catch(exception& e) {
+               m->errorOut(e, "QualityScores", "updateForwardMap");
+               exit(1);
+       }
+}
+
+/**************************************************************************************************/
+
+void QualityScores::updateReverseMap(vector<vector<int> >& reverseMap, int start, int stop, int weight){
+       try {
+               
+               int index = 0;
+               for(int i=stop-1;i>=start;i--){
+                       reverseMap[index++][qScores[i]] += weight;
+               }
+               
+       }       
+       catch(exception& e) {
+               m->errorOut(e, "QualityScores", "updateForwardMap");
                exit(1);
        }
 }