]> git.donarmstrong.com Git - mothur.git/blobdiff - qualityscores.cpp
added oligos class. added check orient parameter to trim.flows, sffinfo, fastq.info...
[mothur.git] / qualityscores.cpp
index 26492245e2b9805144125052d57045a834bc3f95..916dab3a59743e4bcb860bd9891dcfbda74504b4 100644 (file)
@@ -23,7 +23,19 @@ QualityScores::QualityScores(){
                exit(1);
        }                                                       
 }
+/**************************************************************************************************/
 
+QualityScores::QualityScores(string n, vector<int> s){
+       try {
+               m = MothurOut::getInstance();
+               setName(n);
+        setScores(s);
+       }
+       catch(exception& e) {
+               m->errorOut(e, "QualityScores", "QualityScores");
+               exit(1);
+       }
+}
 /**************************************************************************************************/
 
 QualityScores::QualityScores(ifstream& qFile){
@@ -32,22 +44,22 @@ QualityScores::QualityScores(ifstream& qFile){
                m = MothurOut::getInstance();
 
                int score;
-               seqName = getSequenceName(qFile);
+               seqName = getSequenceName(qFile); m->gobble(qFile);
                
         if (m->debug) { m->mothurOut("[DEBUG]: name = '" + seqName + "'\n.");  }
         
                if (!m->control_pressed) {
-            string qScoreString = m->getline(qFile);
+            string qScoreString = m->getline(qFile); m->gobble(qFile);
             
             if (m->debug) { m->mothurOut("[DEBUG]: scores = '" + qScoreString + "'\n.");  }
             
             while(qFile.peek() != '>' && qFile.peek() != EOF){
                 if (m->control_pressed) { break; }
-                string temp = m->getline(qFile);
-                if (m->debug) { m->mothurOut("[DEBUG]: scores = '" + temp + "'\n.");  }
+                string temp = m->getline(qFile); m->gobble(qFile);
+                //if (m->debug) { m->mothurOut("[DEBUG]: scores = '" + temp + "'\n.");  }
                 qScoreString +=  ' ' + temp;
             }
-            //cout << "done reading " << endl; 
+            //cout << "done reading " << endl;
             istringstream qScoreStringStream(qScoreString);
             int count = 0;
             while(!qScoreStringStream.eof()){
@@ -55,7 +67,7 @@ QualityScores::QualityScores(ifstream& qFile){
                 string temp;
                 qScoreStringStream >> temp;  m->gobble(qScoreStringStream);
                 
-                if (m->debug) { m->mothurOut("[DEBUG]: score " + toString(qScores.size()) + " = '" + temp + "'\n.");  }
+                //if (m->debug) { m->mothurOut("[DEBUG]: score " + toString(qScores.size()) + " = '" + temp + "'\n.");  }
                 
                 //check temp to make sure its a number
                 if (!m->isContainingOnlyDigits(temp)) { m->mothurOut("[ERROR]: In sequence " + seqName + "'s quality scores, expected a number and got " + temp + ", setting score to 0."); m->mothurOutEndLine(); temp = "0"; }
@@ -68,7 +80,7 @@ QualityScores::QualityScores(ifstream& qFile){
         }
                
                seqLength = qScores.size();
-               //cout << "seqlength = " << seqLength << '\t' << count << endl;
+               //cout << "seqlength = " << seqLength  << endl;
                
        }
        catch(exception& e) {
@@ -130,7 +142,7 @@ string QualityScores::getName(){
 void QualityScores::printQScores(ofstream& qFile){
        try {
                
-               double aveQScore = calculateAverage();
+               double aveQScore = calculateAverage(false);
                
                qFile << '>' << seqName << '\t' << aveQScore << endl;
                
@@ -200,7 +212,7 @@ bool QualityScores::stripQualThreshold(Sequence& sequence, double qThreshold){
                
                if(seqName != sequence.getName()){
                        m->mothurOut("sequence name mismatch btwn fasta: " + sequence.getName() + " and qual file: " + seqName);
-                       m->mothurOutEndLine();  
+                       m->mothurOutEndLine();  m->control_pressed = true;
                }
                
                int end;
@@ -228,7 +240,7 @@ bool QualityScores::stripQualThreshold(Sequence& sequence, double qThreshold){
 
 /**************************************************************************************************/
 
-bool QualityScores::stripQualRollingAverage(Sequence& sequence, double qThreshold){
+bool QualityScores::stripQualRollingAverage(Sequence& sequence, double qThreshold, bool logTransform){
        try {
                string rawSequence = sequence.getUnaligned();
                int seqLength = sequence.getNumBases();
@@ -240,12 +252,22 @@ bool QualityScores::stripQualRollingAverage(Sequence& sequence, double qThreshol
                
                int end = -1;
                double rollingSum = 0.0000;
+        double value = 0.0;
                
                for(int i=0;i<seqLength;i++){
-
-                       rollingSum += (double)qScores[i];
+            
+            if (logTransform)   {
+                rollingSum += (double)pow(10.0, qScores[i]);
+                value = log10(rollingSum / (double)(i+1));
+                
+            } //Sum 10^Q
+            else                {
+                rollingSum += (double)qScores[i];
+                value = rollingSum / (double)(i+1);
+            }
                        
-                       if(rollingSum / (double)(i+1) < qThreshold){
+                       
+                       if(value < qThreshold){
                                end = i;
                                break;
                        }
@@ -269,7 +291,7 @@ bool QualityScores::stripQualRollingAverage(Sequence& sequence, double qThreshol
 
 /**************************************************************************************************/
 
-bool QualityScores::stripQualWindowAverage(Sequence& sequence, int stepSize, int windowSize, double qThreshold){
+bool QualityScores::stripQualWindowAverage(Sequence& sequence, int stepSize, int windowSize, double qThreshold, bool logTransform){
        try {
                string rawSequence = sequence.getUnaligned();
                int seqLength = sequence.getNumBases();
@@ -288,9 +310,12 @@ bool QualityScores::stripQualWindowAverage(Sequence& sequence, int stepSize, int
                        double windowSum = 0.0000;
 
                        for(int i=start;i<end;i++){
-                               windowSum += qScores[i];
+                if (logTransform)   {  windowSum += pow(10.0, qScores[i]);  }
+                else                {  windowSum += qScores[i];             }
                        }
-                       double windowAverage = windowSum / (double)(end-start);
+                       double windowAverage = 0.0;
+            if (logTransform)   { windowAverage = log10(windowSum / (double)(end-start)); }
+            else                { windowAverage = windowSum / (double)(end-start);      }
                                
                        if(windowAverage < qThreshold){
                                end = end - stepSize;
@@ -323,21 +348,24 @@ bool QualityScores::stripQualWindowAverage(Sequence& sequence, int stepSize, int
 
 /**************************************************************************************************/
 
-double QualityScores::calculateAverage(){
+double QualityScores::calculateAverage(bool logTransform){
        
        double aveQScore = 0.0000;
        
        for(int i=0;i<seqLength;i++){
-               aveQScore += (double) qScores[i];
+        if (logTransform)   {  aveQScore += pow(10.0, qScores[i]);  }
+        else                {  aveQScore += qScores[i];             }
        }
-       aveQScore /= (double) seqLength;
+    
+    if (logTransform)   {  aveQScore = log10(aveQScore /(double) seqLength);    }
+    else                {  aveQScore /= (double) seqLength;                     }
        
        return aveQScore;
 }
 
 /**************************************************************************************************/
 
-bool QualityScores::cullQualAverage(Sequence& sequence, double qAverage){
+bool QualityScores::cullQualAverage(Sequence& sequence, double qAverage, bool logTransform){
        try {
                string rawSequence = sequence.getUnaligned();
                bool success = 0;       //guilty until proven innocent
@@ -347,8 +375,10 @@ bool QualityScores::cullQualAverage(Sequence& sequence, double qAverage){
                        m->mothurOutEndLine();  
                } 
                        
-               double aveQScore = calculateAverage();
+               double aveQScore = calculateAverage(logTransform);
                
+        if (m->debug) { m->mothurOut("[DEBUG]: " + sequence.getName() + " average = " + toString(aveQScore) + "\n"); }
+        
                if(aveQScore >= qAverage)       {       success = 1;    }
                else                                            {       success = 0;    }