5 * Created by Pat Schloss on 7/12/10.
6 * Copyright 2010 Schloss Lab. All rights reserved.
10 #include "qualityscores.h"
12 /**************************************************************************************************/
14 QualityScores::QualityScores(){
16 m = MothurOut::getInstance();
21 m->errorOut(e, "QualityScores", "QualityScores");
26 /**************************************************************************************************/
28 QualityScores::QualityScores(ifstream& qFile, int l){
31 m = MothurOut::getInstance();
38 getline(qFile, line); gobble(qFile);
39 istringstream nameStream(line);
41 nameStream >> seqName;
42 seqName = seqName.substr(1);
44 //getline(qFile, line);
45 //istringstream qualStream(line);
48 // qualStream >> score;
49 // qScores.push_back(score);
53 //seqLength = qScores.size();
55 for(int i=0;i<seqLength;i++){
57 qScores.push_back(score);
63 m->errorOut(e, "QualityScores", "QualityScores");
69 /**************************************************************************************************/
71 string QualityScores::getName(){
77 m->errorOut(e, "QualityScores", "getName");
82 /**************************************************************************************************/
84 void QualityScores::printQScores(ofstream& qFile){
87 double aveQScore = calculateAverage();
89 qFile << '>' << seqName << '\t' << aveQScore << endl;
91 for(int i=0;i<seqLength;i++){
92 qFile << qScores[i] << ' ';
98 m->errorOut(e, "QualityScores", "printQScores");
103 /**************************************************************************************************/
105 void QualityScores::trimQScores(int start, int end){
110 hold = vector<int>(qScores.begin()+start, qScores.end());
114 hold = vector<int>(qScores.begin(), qScores.begin()+end); //not sure if indexing is correct
118 seqLength = qScores.size();
120 catch(exception& e) {
121 m->errorOut(e, "QualityScores", "trimQScores");
126 /**************************************************************************************************/
128 void QualityScores::flipQScores(){
131 vector<int> temp = qScores;
132 for(int i=0;i<seqLength;i++){
133 qScores[seqLength - i - 1] = temp[i];
137 catch(exception& e) {
138 m->errorOut(e, "QualityScores", "flipQScores");
143 /**************************************************************************************************/
145 bool QualityScores::stripQualThreshold(Sequence& sequence, double qThreshold){
147 string rawSequence = sequence.getUnaligned();
148 int seqLength = sequence.getNumBases();
150 if(seqName != sequence.getName()){
151 m->mothurOut("sequence name mismatch btwn fasta: " + sequence.getName() + " and qual file: " + seqName);
152 m->mothurOutEndLine();
156 for(int i=0;i<seqLength;i++){
158 if(qScores[i] < qThreshold){
163 sequence.setUnaligned(rawSequence.substr(0,end));
164 trimQScores(-1, end);
168 catch(exception& e) {
169 m->errorOut(e, "QualityScores", "flipQScores");
175 /**************************************************************************************************/
177 bool QualityScores::stripQualRollingAverage(Sequence& sequence, double qThreshold){
179 string rawSequence = sequence.getUnaligned();
180 int seqLength = sequence.getNumBases();
182 if(seqName != sequence.getName()){
183 m->mothurOut("sequence name mismatch btwn fasta: " + sequence.getName() + " and qual file: " + seqName);
184 m->mothurOutEndLine();
188 double rollingSum = 0.0000;
190 for(int i=0;i<seqLength;i++){
192 rollingSum += (double)qScores[i];
194 if(rollingSum / (double)(i+1) < qThreshold){
196 // cout << i+1 << '\t' << seqName << '\t' << rollingSum / (double)(i+1) << endl;
201 if(end == -1){ end = seqLength; }
203 sequence.setUnaligned(rawSequence.substr(0,end));
204 trimQScores(-1, end);
208 catch(exception& e) {
209 m->errorOut(e, "QualityScores", "flipQScores");
215 /**************************************************************************************************/
217 bool QualityScores::stripQualWindowAverage(Sequence& sequence, int stepSize, int windowSize, double qThreshold){
219 string rawSequence = sequence.getUnaligned();
220 int seqLength = sequence.getNumBases();
222 if(seqName != sequence.getName()){
223 m->mothurOut("sequence name mismatch between fasta: " + sequence.getName() + " and qual file: " + seqName);
224 m->mothurOutEndLine();
227 int end = windowSize;
231 while(start < seqLength){
232 double windowSum = 0.0000;
234 for(int i=start;i<end;i++){
235 windowSum += qScores[i];
237 double windowAverage = windowSum / (double)(end-start);
239 if(windowAverage < qThreshold){
240 end = end - stepSize;
244 end = start + windowSize;
245 if(end >= seqLength){ end = seqLength - 1; }
249 if(end == -1){ end = seqLength; }
251 sequence.setUnaligned(rawSequence.substr(0,end));
252 trimQScores(-1, end);
256 catch(exception& e) {
257 m->errorOut(e, "QualityScores", "flipQScores");
263 /**************************************************************************************************/
265 double QualityScores::calculateAverage(){
267 double aveQScore = 0.0000;
269 for(int i=0;i<seqLength;i++){
270 aveQScore += (double) qScores[i];
272 aveQScore /= (double) seqLength;
277 /**************************************************************************************************/
279 bool QualityScores::cullQualAverage(Sequence& sequence, double qAverage){
281 string rawSequence = sequence.getUnaligned();
282 bool success = 0; //guilty until proven innocent
284 if(seqName != sequence.getName()) {
285 m->mothurOut("sequence name mismatch btwn fasta: " + sequence.getName() + " and qual file: " + seqName);
286 m->mothurOutEndLine();
289 double aveQScore = calculateAverage();
291 if(aveQScore >= qAverage) { success = 1; }
292 else { success = 0; }
296 catch(exception& e) {
297 m->errorOut(e, "TrimSeqsCommand", "cullQualAverage");
302 /**************************************************************************************************/