MSADistanceMatrix::MSADistanceMatrix(const MultipleSequenceAlignment& ma, bool _excludeGaps, bool _usePercents) : usePercents(_usePercents), excludeGaps(_excludeGaps), alignmentLength(ma->getLength()) { int nSeq = ma->getNumRows(); table.reserve(nSeq); for (int i = 0; i < nSeq; i++) { table.append(QVarLengthArray<int>(i + 1)); memset(table[i].data(), 0, (i + 1) * sizeof(int)); seqsUngappedLenghts.append(ma->getMsaRow(i)->getUngappedLength()); } }
MuscleTask::MuscleTask(const MultipleSequenceAlignment &ma, const MuscleTaskSettings& _config) : Task(tr("MUSCLE alignment"), TaskFlags_FOSCOE | TaskFlag_MinimizeSubtaskErrorText), config(_config), inputMA(ma->getExplicitCopy()) { GCOUNTER( cvar, tvar, "MuscleTask" ); config.nThreads = (config.nThreads == 0 ? AppContext::getAppSettings()->getAppResourcePool()->getIdealThreadCount() : config.nThreads); SAFE_POINT_EXT(config.nThreads > 0, setError("Incorrect number of max parallel subtasks"), ); setMaxParallelSubtasks(config.nThreads); algoLog.info(tr("MUSCLE alignment started")); ctx = new MuscleContext(config.nThreads); ctx->params.g_bStable = config.stableMode; ctx->params.g_uMaxIters = config.maxIterations; ctx->params.g_ulMaxSecs = config.maxSecs; parallelSubTask = NULL; //todo: make more precise estimation, use config.op mode int aliLen = ma->getLength(); int nSeq = ma->getNumRows(); int memUseMB = qint64(aliLen) * qint64(nSeq) * 200 / (1024 * 1024); //200x per char in alignment TaskResourceUsage tru(RESOURCE_MEMORY, memUseMB); QString inputAlName = inputMA->getName(); resultMA->setName(inputAlName); resultSubMA->setName(inputAlName); inputSubMA = inputMA->getExplicitCopy(); if (config.alignRegion && config.regionToAlign.length != inputMA->getLength()) { SAFE_POINT_EXT(config.regionToAlign.length > 0, setError(tr("Incorrect region to align")), ); inputSubMA = inputMA->mid(config.regionToAlign.startPos, config.regionToAlign.length); CHECK_EXT(inputSubMA != MultipleSequenceAlignment(), setError(tr("Stopping MUSCLE task, because of error in MultipleSequenceAlignment::mid function")), ); }
void convertMAlignment2MSA(MSA& muscleMSA, const MultipleSequenceAlignment& ma, bool fixAlpha) { MuscleContext *ctx = getMuscleContext(); ctx->fillUidsVectors(ma->getNumRows()); for (int i=0, n = ma->getNumRows(); i<n; i++) { const MultipleSequenceAlignmentRow row = ma->getMsaRow(i); int coreLen = row->getCoreLength(); int maLen = ma->getLength(); char* seq = new char[maLen + 1]; memcpy(seq, row->getCore().constData(), coreLen); memset(seq + coreLen, '-', maLen - coreLen + 1); seq[maLen] = 0; char* name = new char[row->getName().length() + 1]; memcpy(name, row->getName().toLocal8Bit().constData(), row->getName().length()); name[row->getName().length()] = '\0'; muscleMSA.AppendSeq(seq, maLen, name); ctx->tmp_uIds[i] = ctx->input_uIds[i]; } if (fixAlpha) { muscleMSA.FixAlpha(); } }