]> git.donarmstrong.com Git - mothur.git/blobdiff - qualityscores.cpp
added modify names parameter to set.dir
[mothur.git] / qualityscores.cpp
index 90412c62b6ae20705c0ba1c162c4c73c260d0171..26492245e2b9805144125052d57045a834bc3f95 100644 (file)
@@ -26,81 +26,91 @@ QualityScores::QualityScores(){
 
 /**************************************************************************************************/
 
-QualityScores::QualityScores(ifstream& qFile, int l){
+QualityScores::QualityScores(ifstream& qFile){
        try {
                
                m = MothurOut::getInstance();
 
-               seqName = "";
-               seqLength = l;
                int score;
+               seqName = getSequenceName(qFile);
+               
+        if (m->debug) { m->mothurOut("[DEBUG]: name = '" + seqName + "'\n.");  }
+        
+               if (!m->control_pressed) {
+            string qScoreString = m->getline(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.");  }
+                qScoreString +=  ' ' + temp;
+            }
+            //cout << "done reading " << endl; 
+            istringstream qScoreStringStream(qScoreString);
+            int count = 0;
+            while(!qScoreStringStream.eof()){
+                if (m->control_pressed) { break; }
+                string temp;
+                qScoreStringStream >> temp;  m->gobble(qScoreStringStream);
+                
+                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"; }
+                convert(temp, score);
+                
+                //cout << count << '\t' << score << endl;
+                qScores.push_back(score);
+                count++;
+            }
+        }
                
-               qFile >> seqName; 
-
-               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){
-               //      qualStream >> score;
-               //      qScores.push_back(score);
-               //}
-               //qScores.pop_back();
-               
-               //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);
-               }*/             
-               
-               
+               seqLength = qScores.size();
+               //cout << "seqlength = " << seqLength << '\t' << count << endl;
                
-               for(int i=0;i<seqLength;i++){
-                       qFile >> score;
-                       qScores.push_back(score);
-               }
-               m->gobble(qFile);
-
        }
        catch(exception& e) {
                m->errorOut(e, "QualityScores", "QualityScores");
                exit(1);
        }                                                       
-
+       
+}
+//********************************************************************************************************************
+string QualityScores::getSequenceName(ifstream& qFile) {
+       try {
+               string name = "";
+               
+        qFile >> name;
+        m->getline(qFile);
+               
+               if (name.length() != 0) { 
+            
+                       name = name.substr(1); 
+            
+            m->checkName(name);
+            
+        }else{ m->mothurOut("Error in reading your qfile, at position " + toString(qFile.tellg()) + ". Blank name."); m->mothurOutEndLine(); m->control_pressed = true;  }
+        
+               return name;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "QualityScores", "getSequenceName");
+               exit(1);
+       }
+}
+//********************************************************************************************************************
+void QualityScores::setName(string name) {
+       try {
+      
+        m->checkName(name);   
+        seqName = name;
+       }
+       catch(exception& e) {
+               m->errorOut(e, "QualityScores", "setName");
+               exit(1);
+       }
 }
 /**************************************************************************************************/
 
@@ -142,6 +152,9 @@ void QualityScores::trimQScores(int start, int end){
        try {
                vector<int> hold;
                
+
+               //cout << seqName << '\t' << start << '\t' << end << '\t' << qScores.size() << endl;
+               //for (int i = 0; i < qScores.size(); i++) { cout << qScores[i] << end; }
                if(end == -1){          
                        hold = vector<int>(qScores.begin()+start, qScores.end());
                        qScores = hold;         
@@ -234,7 +247,6 @@ bool QualityScores::stripQualRollingAverage(Sequence& sequence, double qThreshol
                        
                        if(rollingSum / (double)(i+1) < qThreshold){
                                end = i;
-//                             cout << i+1 << '\t' << seqName << '\t' << rollingSum / (double)(i+1) << endl;
                                break;
                        }
                }
@@ -269,35 +281,41 @@ bool QualityScores::stripQualWindowAverage(Sequence& sequence, int stepSize, int
                
                int end = windowSize;
                int start = 0;
-               
+
                if(seqLength < windowSize) {    return 0;       }
                        
-               while(start < seqLength){
+               while((start+windowSize) < seqLength){
                        double windowSum = 0.0000;
 
                        for(int i=start;i<end;i++){
                                windowSum += qScores[i];
                        }
                        double windowAverage = windowSum / (double)(end-start);
-                       
+                               
                        if(windowAverage < qThreshold){
                                end = end - stepSize;
                                break;
                        }
+                       
                        start += stepSize;
                        end = start + windowSize;
-                       if(end >= seqLength){   end = seqLength - 1;    }
+                               
+                       if(end >= seqLength){   end = seqLength;        }
+                               
                }
-               
+       
                if(end == -1){  end = seqLength;        }
                
+               //failed first window
+               if (end < windowSize) { return 0; }
+                       
                sequence.setUnaligned(rawSequence.substr(0,end));
                trimQScores(-1, end);
                
                return 1;
        }
        catch(exception& e) {
-               m->errorOut(e, "QualityScores", "flipQScores");
+               m->errorOut(e, "QualityScores", "stripQualWindowAverage");
                exit(1);
        }                                                       
        
@@ -348,17 +366,20 @@ void QualityScores::updateQScoreErrorMap(map<char, vector<int> >& qualErrorMap,
        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] == 'a')     {       qualErrorMap['a'][qScores[qIndex]] += weight;   /*if(qScores[qIndex] != 0){     cout << qIndex << '\t';         }*/     }
                        else if(errorSeq[i] == 'd')     {       /*      there are no qScores for deletions      */              }
 
                        if(errorSeq[i] != 'd')          {       qIndex++;       }
-
+                                               
+                       if(qIndex > stop){      break;  }
                }       
        }
        catch(exception& e) {
@@ -390,13 +411,13 @@ void QualityScores::updateReverseMap(vector<vector<int> >& reverseMap, int start
        try {
                
                int index = 0;
-               for(int i=stop-1;i>=start;i--){
+               for(int i=stop-1;i>=start-1;i--){
                        reverseMap[index++][qScores[i]] += weight;
                }
                
        }       
        catch(exception& e) {
-               m->errorOut(e, "QualityScores", "updateForwardMap");
+               m->errorOut(e, "QualityScores", "updateReverseMap");
                exit(1);
        }
 }