X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=qualityscores.cpp;h=916dab3a59743e4bcb860bd9891dcfbda74504b4;hp=fa78b69d653cb841c33833d6249bab6b6ecaf18c;hb=fefd5ee1517abd3bc38b469cb2dffc85a1571c7e;hpb=260ae19c36cb11a53ddc5a75b5e507f8dd8b31d6 diff --git a/qualityscores.cpp b/qualityscores.cpp index fa78b69..916dab3 100644 --- a/qualityscores.cpp +++ b/qualityscores.cpp @@ -16,61 +16,114 @@ QualityScores::QualityScores(){ m = MothurOut::getInstance(); seqName = ""; seqLength = -1; + } catch(exception& e) { m->errorOut(e, "QualityScores", "QualityScores"); exit(1); } } +/**************************************************************************************************/ +QualityScores::QualityScores(string n, vector s){ + try { + m = MothurOut::getInstance(); + setName(n); + setScores(s); + } + catch(exception& e) { + m->errorOut(e, "QualityScores", "QualityScores"); + exit(1); + } +} /**************************************************************************************************/ -QualityScores::QualityScores(ifstream& qFile, int l){ +QualityScores::QualityScores(ifstream& qFile){ try { m = MothurOut::getInstance(); - seqName = ""; - seqLength = l; int score; + seqName = getSequenceName(qFile); m->gobble(qFile); - //string line; - //m->getline(qFile, line); - //istringstream nameStream(line); - - 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(); + if (m->debug) { m->mothurOut("[DEBUG]: name = '" + seqName + "'\n."); } + + if (!m->control_pressed) { + 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); m->gobble(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++; + } + } - //seqLength = qScores.size(); + seqLength = qScores.size(); + //cout << "seqlength = " << seqLength << endl; - for(int i=0;i> 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); + } } - /**************************************************************************************************/ string QualityScores::getName(){ @@ -89,7 +142,7 @@ string QualityScores::getName(){ void QualityScores::printQScores(ofstream& qFile){ try { - double aveQScore = calculateAverage(); + double aveQScore = calculateAverage(false); qFile << '>' << seqName << '\t' << aveQScore << endl; @@ -111,13 +164,18 @@ void QualityScores::trimQScores(int start, int end){ try { vector 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(qScores.begin()+start, qScores.end()); qScores = hold; } if(start == -1){ - hold = vector(qScores.begin(), qScores.begin()+end); //not sure if indexing is correct - qScores = hold; + if(qScores.size() > end){ + hold = vector(qScores.begin(), qScores.begin()+end); + qScores = hold; + } } seqLength = qScores.size(); @@ -154,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; @@ -165,9 +223,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) { @@ -179,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(); @@ -191,23 +252,34 @@ bool QualityScores::stripQualRollingAverage(Sequence& sequence, double qThreshol int end = -1; double rollingSum = 0.0000; + double value = 0.0; for(int i=0;i= 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); } @@ -267,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;imothurOutEndLine(); } - 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; } return success; } catch(exception& e) { - m->errorOut(e, "TrimSeqsCommand", "cullQualAverage"); + m->errorOut(e, "QualityScores", "cullQualAverage"); + exit(1); + } +} + +/**************************************************************************************************/ + +void QualityScores::updateQScoreErrorMap(map >& qualErrorMap, string errorSeq, int start, int stop, int weight){ + try { + + int seqLength = errorSeq.size(); + + int qIndex = start - 1; + + for(int i=0;i stop){ break; } + } + } + catch(exception& e) { + m->errorOut(e, "QualityScores", "updateQScoreErrorMap"); + exit(1); + } +} + +/**************************************************************************************************/ + +void QualityScores::updateForwardMap(vector >& forwardMap, int start, int stop, int weight){ + try { + + int index = 0; + for(int i=start-1;ierrorOut(e, "QualityScores", "updateForwardMap"); + exit(1); + } +} + +/**************************************************************************************************/ + +void QualityScores::updateReverseMap(vector >& reverseMap, int start, int stop, int weight){ + try { + + int index = 0; + for(int i=stop-1;i>=start-1;i--){ + reverseMap[index++][qScores[i]] += weight; + } + + } + catch(exception& e) { + m->errorOut(e, "QualityScores", "updateReverseMap"); exit(1); } }