static SearchQuery* createRevComplQuery(SearchQuery* query, DNATranslation* transl) { SAFE_POINT(query != NULL, "Query is null", NULL); SAFE_POINT(transl != NULL, "Transl is null", NULL); QByteArray reversed(query->constSequence()); TextUtils::reverse(reversed.data(), reversed.count()); DNASequence dnaSeq(QString("%1_rev").arg(query->getName()), reversed, NULL); SearchQuery *rQu = new SearchQuery(&dnaSeq, query); transl->translate(const_cast<char*>(rQu->constData()), rQu->length()); if (rQu->constSequence() == query->constSequence()) { delete rQu; rQu = NULL; return NULL; } query->setRevCompl(rQu); return rQu; }
void ReadShortReadsSubTask::run() { stateInfo.setProgress(0); GTIMER(cvar, tvar, "ReadSubTask"); GenomeAlignerTask *parent = static_cast<GenomeAlignerTask*>(getParentTask()); if (!alignContext.bestMode) { parent->pWriteTask->flush(); } alignContext.cleanVectors(); dataBunch = new DataBunch(); if (isCanceled()) { readingFinishedWakeAll(); return; } qint64 m = freeMemorySize; taskLog.details(QString("Memory size is %1").arg(m)); bool alignReversed = settings.getCustomValue(GenomeAlignerTask::OPTION_ALIGN_REVERSED, true).toBool(); int qualityThreshold = settings.getCustomValue(GenomeAlignerTask::OPTION_QUAL_THRESHOLD, 0).toInt(); DNATranslation* transl = AppContext::getDNATranslationRegistry()-> lookupTranslation(BaseDNATranslationIds::NUCL_DNA_DEFAULT_COMPLEMENT); alignContext.isReadingStarted = true; bunchSize = 0; int readNum = 0; while(!seqReader->isEnd()) { if (isCanceled()) { readingFinishedWakeAll(); return; } SearchQuery *query = seqReader->read(); if (NULL == query) { if (!seqReader->isEnd()) { setError("Short-reads object type must be a sequence, but not a multiple alignment"); readingFinishedWakeAll(); return; } break; } ++bunchSize; if (!checkDnaQuality(query, qualityThreshold)) { continue; } updateMinMaxReadLengths(alignContext, query->length()); int W = 0, q = 0; int CMAX = alignContext.nMismatches; if (!add(CMAX, W, q, readNum, query, parent)) { delete query; continue; } m -= query->memoryHint(); if (alignReversed) { SearchQuery *rQu = createRevComplQuery(query, transl); if (rQu) { add(CMAX, W, q, readNum, rQu, parent); m -= rQu->memoryHint(); } } qint64 alignContextMemoryHint = dataBunch->memoryHint(); if (m <= alignContextMemoryHint + prevMemoryHint) { break; } SAFE_POINT(NULL != dataBunch, "No dataBunch",); if (dataBunch->bitValuesV.size() > DROP_BUNCH_DATA_SIZE) { dropToAlignContext(); readNum = 0; alignContext.readShortReadsWait.wakeOne(); } } dropToAlignContext(); readingFinishedWakeAll(); }