void MafftAddToAlignmentTask::prepare() { algoLog.info(tr("Align sequences to an existing alignment by MAFFT started")); MSAUtils::removeColumnsWithGaps(inputMsa, inputMsa->getNumRows()); tmpDirUrl = ExternalToolSupportUtils::createTmpDir("add_to_alignment", stateInfo); QString tmpAddedUrl = generateTmpFileUrl(tmpDirUrl + QDir::separator() + "XXXXXXXXXXXXXXXX_add.fa");; DocumentFormatRegistry *dfr = AppContext::getDocumentFormatRegistry(); DocumentFormat *dfd = dfr->getFormatById(BaseDocumentFormats::FASTA); Document* tempDocument = dfd->createNewLoadedDocument(IOAdapterUtils::get(BaseIOAdapters::LOCAL_FILE), GUrl(tmpAddedUrl), stateInfo); QListIterator<QString> namesIterator(settings.addedSequencesNames); int currentRowNumber = inputMsa->getNumRows(); foreach(const U2EntityRef& sequenceRef, settings.addedSequencesRefs) { uniqueIdsToNames[QString::number(currentRowNumber)] = namesIterator.next(); U2SequenceObject seqObject(QString::number(currentRowNumber), sequenceRef); GObject* cloned = seqObject.clone(tempDocument->getDbiRef(), stateInfo); CHECK_OP(stateInfo, ); cloned->setGObjectName(QString::number(currentRowNumber)); tempDocument->addObject(cloned); currentRowNumber++; } saveSequencesDocumentTask = new SaveDocumentTask(tempDocument, tempDocument->getIOAdapterFactory(), tmpAddedUrl, SaveDocFlags(SaveDoc_Roll) | SaveDoc_DestroyAfter | SaveDoc_ReduceLoggingLevel); addSubTask(saveSequencesDocumentTask); QString tmpExistingAlignmentUrl = generateTmpFileUrl(tmpDirUrl + QDir::separator() + "XXXXXXXXXXXXXXXX.fa"); saveAlignmentDocumentTask = new SaveMSA2SequencesTask(inputMsa, tmpExistingAlignmentUrl, false, BaseDocumentFormats::FASTA); addSubTask(saveAlignmentDocumentTask); }
QList<Task*> DefaultConvertFileTask::onSubTaskFinished(Task *subTask) { QList<Task*> result; CHECK(!subTask->hasError() && !subTask->isCanceled(), result); CHECK(!hasError() && !isCanceled(), result); if (saveTask == subTask) { return result; } SAFE_POINT_EXT(loadTask == subTask, setError("Unknown subtask"), result); bool mainThread = false; Document *srcDoc = loadTask->getDocument(mainThread); SAFE_POINT_EXT(NULL != srcDoc, setError("NULL document"), result); DocumentFormatRegistry *dfr = AppContext::getDocumentFormatRegistry(); DocumentFormat *df = dfr->getFormatById(targetFormat); SAFE_POINT_EXT(NULL != df, setError("NULL document format"), result); QSet<GObjectType> selectedFormatObjectsTypes = df->getSupportedObjectTypes(); QSet<GObjectType> inputFormatObjectTypes; QListIterator<GObject*> objectsIterator(srcDoc->getObjects()); while (objectsIterator.hasNext()) { GObject *obj = objectsIterator.next(); inputFormatObjectTypes << obj->getGObjectType(); } inputFormatObjectTypes.intersect(selectedFormatObjectsTypes); if (inputFormatObjectTypes.empty()) { setError(tr("The formats are not compatible: %1 and %2").arg(srcDoc->getDocumentFormatId()).arg(targetFormat)); return result; } QString ext = targetFormat; if (!df->getSupportedDocumentFileExtensions().isEmpty()) { ext = df->getSupportedDocumentFileExtensions().first(); } if (targetUrl.isEmpty()) { QString fileName = srcDoc->getName() + "." + ext; targetUrl = GUrlUtils::rollFileName(workingDir + fileName, QSet<QString>()); } else { if (QFileInfo(targetFormat).suffix() != ext) { targetUrl += "." + ext; } targetUrl = GUrlUtils::rollFileName(targetUrl, QSet<QString>()); } IOAdapterFactory *iof = AppContext::getIOAdapterRegistry()->getIOAdapterFactoryById(IOAdapterUtils::url2io(srcDoc->getURL())); Document *dstDoc = srcDoc->getSimpleCopy(df, iof, srcDoc->getURL()); saveTask = new SaveDocumentTask(dstDoc, iof, targetUrl); result << saveTask; return result; }
void ExportAlignmentTask::run() { DocumentFormatRegistry* r = AppContext::getDocumentFormatRegistry(); DocumentFormat* f = r->getFormatById(format); IOAdapterFactory* iof = AppContext::getIOAdapterRegistry()->getIOAdapterFactoryById(IOAdapterUtils::url2io(fileName)); resultDocument = f->createNewLoadedDocument(iof, fileName, stateInfo); CHECK_OP(stateInfo, ); MultipleSequenceAlignmentObject* obj = MultipleSequenceAlignmentImporter::createAlignment(resultDocument->getDbiRef(), ma, stateInfo); CHECK_OP(stateInfo, ); resultDocument->addObject(obj); f->storeDocument(resultDocument, stateInfo); }
void ExportMSA2SequencesTask::run() { DocumentFormatRegistry* r = AppContext::getDocumentFormatRegistry(); DocumentFormat* f = r->getFormatById(format); IOAdapterFactory* iof = AppContext::getIOAdapterRegistry()->getIOAdapterFactoryById(IOAdapterUtils::url2io(url)); resultDocument = f->createNewLoadedDocument(iof, url, stateInfo); CHECK_OP(stateInfo, ); QList<DNASequence> lst = MSAUtils::ma2seq(ma, trimAli); QSet<QString> usedNames; foreach(DNASequence s, lst) { QString name = s.getName(); if (usedNames.contains(name)) { name = TextUtils::variate(name, " ", usedNames, false, 1); s.setName(name); } U2EntityRef seqRef = U2SequenceUtils::import(stateInfo, resultDocument->getDbiRef(), s); CHECK_OP(stateInfo, ); resultDocument->addObject(new U2SequenceObject(name, seqRef)); usedNames.insert(name); }