| 178 | } |
| 179 | |
| 180 | bool SingleEndProcessor::processSingleEnd(ReadPack* pack, ThreadConfig* config){ |
| 181 | string* outstr = new string(); |
| 182 | string* failedOut = new string(); |
| 183 | int tid = config->getThreadId(); |
| 184 | |
| 185 | int readPassed = 0; |
| 186 | for(int p=0;p<pack->count;p++){ |
| 187 | |
| 188 | // original read1 |
| 189 | Read* or1 = pack->data[p]; |
| 190 | |
| 191 | // stats the original read before trimming |
| 192 | config->getPreStats1()->statRead(or1); |
| 193 | |
| 194 | int frontTrimmed = 0; |
| 195 | // trim in head and tail, and apply quality cut in sliding window |
| 196 | Read* r1 = mFilter->trimAndCut(or1, mOptions->trim.front, mOptions->trim.tail, frontTrimmed); |
| 197 | |
| 198 | if(r1 != NULL) { |
| 199 | if(mOptions->polyXTrim.enabled) |
| 200 | PolyX::trimPolyX(r1, config->getFilterResult(), mOptions->polyXTrim.minLen); |
| 201 | } |
| 202 | |
| 203 | vector<Read*> outReads; |
| 204 | |
| 205 | if(r1 != NULL && mOptions->adapter.enabled){ |
| 206 | int trimmed = 0; |
| 207 | if(!mOptions->adapter.sequenceStart.empty()) |
| 208 | trimmed += AdapterTrimmer::trimBySequenceStart(r1, config->getFilterResult(), mOptions->adapter.sequenceStart, mOptions->adapter.edMax, mOptions->adapter.trimmingExtension); |
| 209 | if(!mOptions->adapter.sequenceEnd.empty()) |
| 210 | trimmed += AdapterTrimmer::trimBySequenceEnd(r1, config->getFilterResult(), mOptions->adapter.sequenceEnd,mOptions->adapter.edMax, mOptions->adapter.trimmingExtension); |
| 211 | if(mOptions->adapter.hasFasta) { |
| 212 | trimmed += AdapterTrimmer::trimByMultiSequences(r1, config->getFilterResult(), mOptions->adapter.seqsInFasta, mOptions->adapter.edMax,mOptions->adapter.trimmingExtension); |
| 213 | } |
| 214 | if(trimmed > 0) { |
| 215 | config->getFilterResult()->addReadTrimmed(trimmed); |
| 216 | } |
| 217 | |
| 218 | //search for middle adapter |
| 219 | int start = -1; |
| 220 | int len = 0; |
| 221 | bool foundMiddleAdapter = AdapterTrimmer::findMiddleAdapters(r1, mOptions->adapter.sequenceStart, mOptions->adapter.sequenceEnd, start, len, mOptions->adapter.edMax,mOptions->adapter.trimmingExtension); |
| 222 | if(foundMiddleAdapter) { |
| 223 | //break the read |
| 224 | outReads = r1->breakByGap(start, len); |
| 225 | //cerr << "break at " << start << ", " << len << ", read len: " << r1->length() << endl; |
| 226 | //cerr << r1->mSeq->substr(start, len) << endl; |
| 227 | } else { |
| 228 | outReads.push_back(r1); |
| 229 | } |
| 230 | } else if(r1 != NULL) { |
| 231 | outReads.push_back(r1); |
| 232 | } |
| 233 | |
| 234 | //break by low quality regions |
| 235 | if(mOptions->breakOpt.enabled && outReads.size() > 0) { |
| 236 | vector<Read*> tmpReads; |
| 237 | for(int i=0; i<outReads.size(); i++) { |
nothing calls this directly
no test coverage detected