Task::ReportResult GTest_DNASequenceQualityScores::report() { GObject *obj = getContext<GObject>(this, objContextName); if(obj==NULL){ stateInfo.setError(QString("wrong value: %1").arg(OBJ_ATTR)); return ReportResult_Finished; } U2SequenceObject * mySequence = qobject_cast<U2SequenceObject*>(obj); if(mySequence==NULL){ stateInfo.setError(QString("Can't cast to sequence from: %1").arg(obj->getGObjectName())); return ReportResult_Finished; } const DNAQuality& quality = mySequence->getQuality(); if (quality.isEmpty()) { stateInfo.setError("Sequence doesn't have quality scores"); return ReportResult_Finished; } if (quality.qualCodes != qualityScores) { stateInfo.setError( QString("Quality scores are not valid! The score is %1, expected %2").arg(quality.qualCodes.constData()).arg(qualityScores.constData())); return ReportResult_Finished; } return ReportResult_Finished; }
Task::ReportResult GTest_DNASequencePart::report() { GObject *obj = getContext<GObject>(this,objContextName); if (obj==NULL) { stateInfo.setError(QString("wrong value: %1").arg(OBJ_ATTR)); return ReportResult_Finished; } U2SequenceObject * objSequence = qobject_cast<U2SequenceObject*>(obj); if (objSequence==NULL) { stateInfo.setError(QString("can't cast to sequence from: %1").arg(obj->getGObjectName())); return ReportResult_Finished; } if (objSequence->getSequenceLength() < startPos + subseq.length()) { stateInfo.setError(QString("sequence size is less that region end: size=%1, region-end=%2, objectName=%3").arg(objSequence->getSequenceLength()).arg(startPos + subseq.length()).arg(obj->getGObjectName())); return ReportResult_Finished; } QByteArray objSubSeq = objSequence->getSequenceData(U2Region(startPos, subseq.length())); if (!objSequence->getAlphabet()->isCaseSensitive()) { subseq = subseq.toUpper(); } if (objSubSeq != subseq){ stateInfo.setError(QString("region not matched: %1, expected %2").arg(objSubSeq.constData()).arg(subseq.constData())); return ReportResult_Finished; } return ReportResult_Finished; }
Task::ReportResult GTest_DNASequenceQualityValue::report() { GObject *obj = getContext<GObject>(this, objContextName); if(obj==NULL){ stateInfo.setError(QString("wrong value: %1").arg(OBJ_ATTR)); return ReportResult_Finished; } U2SequenceObject * mySequence = qobject_cast<U2SequenceObject*>(obj); if(mySequence==NULL){ stateInfo.setError(QString("Can't cast to sequence from: %1").arg(obj->getGObjectName())); return ReportResult_Finished; } const DNAQuality& quality = mySequence->getQuality(); if ( (pos < 0) || (pos > quality.qualCodes.count() - 1 ) ) { stateInfo.setError(QString("Quality scores doesn't have position %1").arg(pos)); return ReportResult_Finished; } int val = quality.getValue(pos); if (val != expectedVal) { stateInfo.setError( QString("Quality score values do not match! The score is %1, expected %2").arg(val).arg(expectedVal)); return ReportResult_Finished; } return ReportResult_Finished; }
void DotPlotDialog::sl_loadTaskStateChanged(Task* t){ DotPlotLoadDocumentsTask *loadTask = qobject_cast<DotPlotLoadDocumentsTask*>(t); if (!loadTask || !loadTask->isFinished()) { if(t->isFinished()){ if(curURL == ""){ return; } GUrl URL(curURL); Project *project = AppContext::getProject(); SAFE_POINT(project, "project is NULL", ); Document *doc = project->findDocumentByURL(URL); if (!doc || !doc->isLoaded()) { return; } QList<GObject*> docObjects = doc->getObjects(); foreach (GObject* obj, docObjects) { U2SequenceObject* seqObj = qobject_cast<U2SequenceObject*>(obj); if (seqObj != NULL){ QString name = seqObj->getGObjectName(); xAxisCombo->addItem(name); yAxisCombo->addItem(name); sequences << seqObj; } } curURL = ""; } return; }
void EnzymesPlugin::sl_onOpenCreateFragmentDialog() { GObjectViewWindow* w = GObjectViewUtils::getActiveObjectViewWindow(); if (w == NULL) { QMessageBox::information(QApplication::activeWindow(), openCreateFragmentDialog->text(), tr("There is no active sequence object.\nTo create fragment open sequence document.")); return; } AnnotatedDNAView* view = qobject_cast<AnnotatedDNAView*>(w->getObjectView()); if (view == NULL) { QMessageBox::information(QApplication::activeWindow(), openCreateFragmentDialog->text(), tr("There is no active sequence object.\nTo create fragment open sequence document.")); return; } U2SequenceObject* dnaObj = view->getSequenceInFocus()->getSequenceObject(); assert(dnaObj != NULL); if (!dnaObj->getAlphabet()->isNucleic()) { QMessageBox::information(QApplication::activeWindow(), openCreateFragmentDialog->text(), tr("The sequence doesn't have nucleic alphabet, it can not be used in cloning.")); return; } QObjectScopedPointer<CreateFragmentDialog> dlg = new CreateFragmentDialog(view->getSequenceInFocus(), QApplication::activeWindow()); dlg->exec(); }
Task::ReportResult GTest_DNAcompareSequencesInTwoObjects::report() { Document* doc = getContext<Document>(this, docContextName); if (doc == NULL) { stateInfo.setError(QString("document not found %1").arg(docContextName)); return ReportResult_Finished; } Document* doc2 = getContext<Document>(this, secondDocContextName); if (doc2 == NULL) { stateInfo.setError(QString("document not found %1").arg(secondDocContextName)); return ReportResult_Finished; } const QList<GObject*>& objs = doc->getObjects(); const QList<GObject*>& objs2 = doc2->getObjects(); GObject*obj=NULL; GObject*obj2=NULL; U2SequenceObject * mySequence; U2SequenceObject * mySequence2; for(int i=0;(i!=objs.size())&&(i!=objs2.size());i++){ obj = objs.at(i); obj2 = objs2.at(i); if((obj->getGObjectType()== GObjectTypes::SEQUENCE)&&(obj2->getGObjectType()== GObjectTypes::SEQUENCE)){ mySequence = qobject_cast<U2SequenceObject*>(obj); if(mySequence==NULL){ stateInfo.setError(QString("can't cast to sequence from: %1 in position %2").arg(obj->getGObjectName()).arg(i)); return ReportResult_Finished; } mySequence2 = qobject_cast<U2SequenceObject*>(obj2); if(mySequence2==NULL){ stateInfo.setError(QString("can't cast to sequence from: %1 in position %2").arg(obj2->getGObjectName()).arg(i)); return ReportResult_Finished; } if(mySequence->getWholeSequenceData(stateInfo) != mySequence2->getWholeSequenceData(stateInfo)){ CHECK_OP(stateInfo, ReportResult_Finished); stateInfo.setError(QString("Sequences of object in position %1 not matched").arg(i)); return ReportResult_Finished; } CHECK_OP(stateInfo, ReportResult_Finished); } } if (objs.size() != objs2.size()) { QString error("Number of objects in doc mismatches: [%1=%2] vs [%3=%4]"); error = error.arg(docContextName).arg(objs.size()) .arg(secondDocContextName).arg(objs2.size()); if (obj) { error += QString("\nLast good object: %1").arg(obj->getGObjectName()); } stateInfo.setError(error); } return ReportResult_Finished; }
void EvaluateBaseContentTask::run() { if (_obj->getGObjectType() == GObjectTypes::SEQUENCE) { U2SequenceObject* dnaObj = qobject_cast<U2SequenceObject*>(_obj); alp = dnaObj->getAlphabet(); DNASequenceGenerator::evaluateBaseContent(dnaObj->getWholeSequence(stateInfo), result); } else if (_obj->getGObjectType() == GObjectTypes::MULTIPLE_SEQUENCE_ALIGNMENT) { MultipleSequenceAlignmentObject* maObj = qobject_cast<MultipleSequenceAlignmentObject*>(_obj); alp = maObj->getAlphabet(); DNASequenceGenerator::evaluateBaseContent(maObj->getMultipleAlignment(), result); } else { stateInfo.setError(tr("Base content can be evaluated for sequence or sequence alignment")); } }
Task::ReportResult GTest_DNASequenceSize::report() { GObject *obj = getContext<GObject>(this, objContextName); if(obj==NULL){ stateInfo.setError(QString("wrong value: %1").arg(OBJ_ATTR)); return ReportResult_Finished; } U2SequenceObject * mySequence = qobject_cast<U2SequenceObject*>(obj); if(mySequence==NULL){ stateInfo.setError(QString("can't cast to sequence from: %1").arg(obj->getGObjectName())); return ReportResult_Finished; } int tempLength=mySequence->getSequenceLength(); if (tempLength != seqSize){ stateInfo.setError(QString("sequence size not matched: %1, expected %2 ").arg(tempLength).arg(seqSize)); } return ReportResult_Finished; }
Task::ReportResult GTest_DNASequenceAlphabetId::report() { GObject *obj = getContext<GObject>(this, objContextName); if(obj==NULL){ stateInfo.setError(QString("wrong value: %1").arg(OBJ_ATTR)); return ReportResult_Finished; } U2SequenceObject * mySequence = qobject_cast<U2SequenceObject*>(obj); if(mySequence==NULL){ stateInfo.setError(QString("can't cast to sequence from: %1").arg(obj->getGObjectName())); return ReportResult_Finished; } const DNAAlphabet *tempAlphabet = mySequence->getAlphabet(); if( tempAlphabet->getId() != alpId){ stateInfo.setError(QString("Alphabet id not matched: %1 expected %2").arg(tempAlphabet->getId()).arg(alpId)); } return ReportResult_Finished; }
MAlignment Kalign_Load_Align_Compare_Task::dna_to_ma(QList<GObject*> dnaSeqs) { int seqCount = dnaSeqs.count(); U2SequenceObject *seq = qobject_cast<U2SequenceObject *>(dnaSeqs[0]); MAlignment ma("Alignment",seq->getAlphabet()); for(int i=0; i<seqCount; i++) { seq = qobject_cast<U2SequenceObject *>(dnaSeqs[i]); if(seq == NULL) { stateInfo.setError( QString("Can't cast GObject to U2SequenceObject") ); return ma; } QByteArray seqData = seq->getWholeSequenceData(stateInfo); SAFE_POINT_OP(stateInfo, MAlignment()); ma.addRow(seq->getSequenceName(), seqData, stateInfo); SAFE_POINT_OP(stateInfo, MAlignment()); } return ma; }
void GTest_SecStructPredictTask::prepare() { U2SequenceObject * mySequence = getContext<U2SequenceObject>(this, seqName); if(mySequence==NULL){ stateInfo.setError( QString("error can't cast to sequence from GObject")); return; } SecStructPredictAlgRegistry* sspr = AppContext::getSecStructPredictAlgRegistry(); if (!sspr->hadRegistered(algName)) { stateInfo.setError( QString(tr("Algorithm named %1 not found")).arg(algName)); return; } SecStructPredictTaskFactory* factory = sspr->getAlgorithm(algName); QByteArray seqData = mySequence->getWholeSequenceData(stateInfo); task = factory->createTaskInstance(seqData); CHECK_OP(stateInfo, ); addSubTask(task); }
void uHMMPlugin::sl_search() { //to select a sequence //1. check that annotated DNA view is active //2. if not -> check that DNASequence object is selected in project view U2SequenceObject* obj = NULL; MWMDIWindow* w = AppContext::getMainWindow()->getMDIManager()->getActiveWindow(); if (w!=NULL) { GObjectViewWindow* ow = qobject_cast<GObjectViewWindow*>(w); if (ow!=NULL) { GObjectView* ov = ow->getObjectView(); AnnotatedDNAView* av = qobject_cast<AnnotatedDNAView*>(ov); if (av!=NULL) { ADVSequenceObjectContext* seqCtx = av->getSequenceInFocus(); obj = seqCtx->getSequenceObject(); } } } if (obj == NULL) { ProjectView* pv = AppContext::getProjectView(); if (pv!=NULL) { const GObjectSelection* sel = pv->getGObjectSelection(); GObject* o = sel->getSelectedObjects().size() == 1 ? sel->getSelectedObjects().first() : NULL; obj = qobject_cast<U2SequenceObject*>(o); } } QWidget *p = (QWidget*)AppContext::getMainWindow()->getQMainWindow(); if (obj == NULL) { QMessageBox::critical(p, tr("Error"), tr("Error! Select sequence in Project view or open sequence view.")); return; } U2OpStatusImpl os; DNASequence sequence = obj->getWholeSequence(os); CHECK_OP_EXT(os, QMessageBox::critical(QApplication::activeWindow(), L10N::errorTitle(), os.getError()), ); QObjectScopedPointer<HMMSearchDialogController> d = new HMMSearchDialogController(sequence, obj, p); d->exec(); }
void GTest_UHMM3Search::setAndCheckArgs() { assert( !stateInfo.hasError() ); if( hmmFilename.isEmpty() ) { stateInfo.setError( "hmm_filename_is_empty" ); return; } hmmFilename = env->getVar( "COMMON_DATA_DIR" ) + "/" + hmmFilename; if( searchTaskCtxName.isEmpty() ) { stateInfo.setError( "task_ctx_name_is_empty" ); return; } if( seqDocCtxName.isEmpty() ) { stateInfo.setError( "sequence_document_ctx_name_is_empty" ); return; } if( UNKNOWN_SEARCH == algo ) { stateInfo.setError( "unknown_algorithm_type" ); return; } Document* seqDoc = getContext<Document>( this, seqDocCtxName ); if( NULL == seqDoc ) { stateInfo.setError( QString( "context %1 not found" ).arg( seqDocCtxName ) ); return; } QList< GObject* > objsList = seqDoc->findGObjectByType( GObjectTypes::SEQUENCE ); CHECK_EXT(!objsList.isEmpty(),setError("No sequence objects found!"), ); U2SequenceObject* seqObj = qobject_cast< U2SequenceObject* >( objsList.first() ); sequence = seqObj->getWholeSequence(stateInfo); CHECK_OP(stateInfo, ); CHECK_EXT(sequence.length() > 0, setError(tr("Sequence is empty")), ); if( !machinePath.isEmpty() ) { machinePath = env->getVar( "COMMON_DATA_DIR" ) + "/" + machinePath; } }
void ADVClipboard::copySequenceSelection(bool complement, bool amino) { ADVSequenceObjectContext* seqCtx = getSequenceContext(); if (seqCtx == NULL) { QMessageBox::critical(QApplication::activeWindow(), L10N::errorTitle(), "No sequence selected!"); return; } QString res; QVector<U2Region> regions = seqCtx->getSequenceSelection()->getSelectedRegions(); #ifdef UGENE_X86 int totalLen = 0; foreach (const U2Region& r, regions) { totalLen += r.length; } if (totalLen > MAX_COPY_SIZE_FOR_X86) { QMessageBox::critical(QApplication::activeWindow(), L10N::errorTitle(), COPY_FAILED_MESSAGE); return; } #endif if (!regions.isEmpty()) { U2SequenceObject* seqObj = seqCtx->getSequenceObject(); DNATranslation* complTT = complement ? seqCtx->getComplementTT() : NULL; DNATranslation* aminoTT = amino ? seqCtx->getAminoTT() : NULL; U2OpStatus2Log os; QList<QByteArray> seqParts = U2SequenceUtils::extractRegions(seqObj->getSequenceRef(), regions, complTT, aminoTT, false, os); if (os.hasError()) { QMessageBox::critical(QApplication::activeWindow(), L10N::errorTitle(), tr("An error occurred during getting sequence data: %1").arg(os.getError())); return; } if (seqParts.size() == 1) { putIntoClipboard(seqParts.first()); return; } res = U1SequenceUtils::joinRegions(seqParts); } putIntoClipboard(res); }
U2SequenceObject *importSequence(DNASequence &sequence, const QString &objName, QList<GObject*>& objects, U2SequenceImporter &seqImporter, const U2DbiRef& dbiRef, const QString& folder, U2OpStatus& os) { seqImporter.startSequence(dbiRef, folder, sequence.getName(), sequence.circular, os); CHECK_OP(os, NULL); seqImporter.addBlock(sequence.seq.constData(), sequence.seq.length(), os); CHECK_OP(os, NULL); U2Sequence u2seq = seqImporter.finalizeSequenceAndValidate(os); TmpDbiObjects dbiObjects(dbiRef, os); dbiObjects.objects << u2seq.id; CHECK_OP(os, NULL); U2SequenceObject *seqObj = new U2SequenceObject(objName, U2EntityRef(dbiRef, u2seq.id)); seqObj->setSequenceInfo(sequence.info); objects << seqObj; return seqObj; }
void DotPlotDialog::sl_minLenHeuristics() { identityBox->setValue(100); // formula used here: nVariations / lenVariations = wantedResCount (==1000) // where nVariations == area size // lenVariations = 4^len where len is result // so we have len = ln(nVariations/wantedResCount)/ln(4) int xIdx = xAxisCombo->currentIndex(); int yIdx = yAxisCombo->currentIndex(); U2SequenceObject *objX = sequences.at(xIdx); U2SequenceObject *objY = sequences.at(yIdx); qint64 xSeqLen = objX->getSequenceLength(); qint64 ySeqLen = objY->getSequenceLength(); double nVariations = xSeqLen*ySeqLen; double resCount = 1000; double len = log(nVariations / resCount) / log(double(4)); minLenBox->setValue((int)len); }
Task::ReportResult GTest_DNATranslation3to1Test::report() { GObject *obj = getContext<GObject>(this, objContextName); if (obj==NULL){ stateInfo.setError(QString("wrong value: %1").arg(OBJ_ATTR)); return ReportResult_Finished; } U2SequenceObject * mySequence = qobject_cast<U2SequenceObject*>(obj); if(mySequence==NULL){ stateInfo.setError(QString("error can't cast to sequence from: %1").arg(obj->getGObjectName())); return ReportResult_Finished; } if(!(mySequence->getAlphabet()->isNucleic())){ stateInfo.setError(QString("error Alphabet is not Nucleic: %1").arg(mySequence->getAlphabet()->getId())); return ReportResult_Finished; } DNATranslation* aminoTransl = 0; DNATranslationRegistry* tr = AppContext::getDNATranslationRegistry(); QList<DNATranslation*> aminoTs = tr->lookupTranslation(mySequence->getAlphabet(), DNATranslationType_NUCL_2_AMINO); if (!aminoTs.empty()) { aminoTransl = tr->getStandardGeneticCodeTranslation(mySequence->getAlphabet()); } int tempValue; if(strTo == -1){ tempValue=-1; } else{ tempValue=(strTo-strFrom+1); } QByteArray myByteArray = mySequence->getSequenceData(U2Region(strFrom,tempValue)); QByteArray rezult(myByteArray.length() / 3, 0); int n = aminoTransl->translate(myByteArray, myByteArray.length(), rezult.data(), rezult.length()); assert(n == rezult.length()); Q_UNUSED(n); if(rezult != stringValue.toLatin1()){ stateInfo.setError(QString("translated sequence not matched: %1, expected %2 ").arg(rezult.data()).arg(stringValue)); return ReportResult_Finished; } return ReportResult_Finished; }
bool SequenceAccFilterTask::filterAcceptsObject(GObject *obj) { U2SequenceObject *seqObject = qobject_cast<U2SequenceObject *>(obj); CHECK(NULL != seqObject, false); return settings.nameFilterAcceptsString(seqObject->getSequenceInfo()[DNAInfo::ACCESSION].toString()); }
void GTest_uHMMERSearch::prepare() { Document* doc = getContext<Document>(this, seqDocCtxName); if (doc == NULL) { stateInfo.setError( QString("context not found %1").arg(seqDocCtxName) ); return; } QList<GObject*> list = doc->findGObjectByType(GObjectTypes::SEQUENCE); if (list.size() == 0) { stateInfo.setError( QString("container of object with type \"%1\" is empty").arg(GObjectTypes::SEQUENCE) ); return; } GObject *obj = list.first(); if(obj==NULL){ stateInfo.setError( QString("object with type \"%1\" not found").arg(GObjectTypes::SEQUENCE) ); return; } assert(obj!=NULL); U2SequenceObject * mySequence = qobject_cast<U2SequenceObject*>(obj); if(mySequence==NULL){ stateInfo.setError( QString("error can't cast to sequence from GObject") ); return; } UHMMSearchSettings s; if (expertOptions){ s.globE = evalueCutoff; s.eValueNSeqs = number_of_seq; s.domE = domEvalueCutoff; s.domT = minScoreCutoff; } QString env_algo = env->getVar(ENV_HMMSEARCH_ALGORITHM_NAME); if( !env_algo.isEmpty() ) { if( ENV_HMMSEARCH_ALGORITHM_SSE == env_algo ) { #if !defined(HMMER_BUILD_WITH_SSE2) stateInfo.setError( QString("SSE2 was not enabled in this build") ); return; #endif s.alg = HMMSearchAlgo_SSEOptimized; } else if( ENV_HMMSEARCH_ALGORITHM_CELL == env_algo ) { #if !defined UGENE_CELL stateInfo.setError( QString("HMMER-Cell was not enabled in this build") ); return; #endif s.alg = HMMSearchAlgo_CellOptimized; } else { stateInfo.setError( QString("unknown hmmsearch algorithm is selected") ); return; } } if(customHmmSearchChunk) { s.searchChunkSize = hmmSearchChunk; } QString annotationName = "hmm_signal"; QString url = env->getVar("TEMP_DATA_DIR")+"/uhmmsearch/"+resultDocName; IOAdapterFactory* iof = AppContext::getIOAdapterRegistry()->getIOAdapterFactoryById(IOAdapterUtils::url2io(url)); DocumentFormat* df = AppContext::getDocumentFormatRegistry()->getFormatById(BaseDocumentFormats::PLAIN_GENBANK); assert(aDoc == NULL); aDoc = df->createNewLoadedDocument(iof, url, stateInfo); CHECK_OP(stateInfo, ); AnnotationTableObject *ao = new AnnotationTableObject( "Annotations", aDoc->getDbiRef( ) ); aDoc->addObject(ao); DNASequence dnaSequence = mySequence->getWholeSequence(stateInfo); CHECK_OP(stateInfo, ); searchTask = new HMMSearchToAnnotationsTask(env->getVar("COMMON_DATA_DIR")+"/"+hmmFileName, dnaSequence, ao, annotationName, "", U2FeatureTypes::MiscSignal, annotationName, s); addSubTask(searchTask); }
/** * FASTQ format specification: http://maq.sourceforge.net/fastq.shtml */ static void load(IOAdapter* io, const U2DbiRef& dbiRef, const QVariantMap& hints, const GUrl& docUrl, QList<GObject*>& objects, U2OpStatus& os, int gapSize, int predictedSize, QString& writeLockReason) { DbiOperationsBlock opBlock(dbiRef, os); CHECK_OP(os, ); Q_UNUSED(opBlock); writeLockReason.clear(); bool merge = gapSize!=-1; QByteArray sequence; QByteArray qualityScores; QStringList headers; QSet<QString> uniqueNames; QVector<U2Region> mergedMapping; QByteArray gapSequence((merge ? gapSize : 0), 0); sequence.reserve(predictedSize); qualityScores.reserve(predictedSize); // for lower case annotations GObjectReference sequenceRef; qint64 sequenceStart = 0; U2SequenceImporter seqImporter(hints, true); const QString folder = hints.value(DocumentFormat::DBI_FOLDER_HINT, U2ObjectDbi::ROOT_FOLDER).toString(); int seqNumber = 0; int progressUpNum = 0; const int objectsCountLimit = hints.contains(DocumentReadingMode_MaxObjectsInDoc) ? hints[DocumentReadingMode_MaxObjectsInDoc].toInt() : -1; const bool settingsMakeUniqueName = !hints.value(DocumentReadingMode_DontMakeUniqueNames, false).toBool(); while (!os.isCoR()) { //read header QString sequenceName = readSequenceName(os, io, '@'); // check for eof while trying to read another FASTQ block if (io->isEof()) { break; } CHECK_OP_BREAK(os); if(sequenceName.isEmpty()){ sequenceName = "Sequence"; } if ((merge == false) || (seqNumber == 0)) { QString objName = sequenceName; if (settingsMakeUniqueName) { objName = (merge) ? "Sequence" : TextUtils::variate(sequenceName, "_", uniqueNames); objName.squeeze(); uniqueNames.insert(objName); } seqImporter.startSequence(dbiRef, folder, objName, false, os); CHECK_OP_BREAK(os); } //read sequence if (merge && sequence.length() > 0) { seqImporter.addDefaultSymbolsBlock(gapSize,os); sequenceStart += sequence.length(); sequenceStart+=gapSize; CHECK_OP_BREAK(os); } sequence.clear(); readSequence(os, io, sequence); MemoryLocker lSequence(os, qCeil(sequence.size()/(1000*1000))); CHECK_OP_BREAK(os); Q_UNUSED(lSequence); seqImporter.addBlock(sequence.data(),sequence.length(),os); CHECK_OP_BREAK(os); QString qualSequenceName = readSequenceName(os, io, '+'); if (!qualSequenceName.isEmpty()) { static const QString err = U2::FastqFormat::tr("Not a valid FASTQ file: %1, sequence name differs from quality scores name: %2 and %3"); CHECK_EXT_BREAK(sequenceName == qualSequenceName, os.setError(err.arg(docUrl.getURLString()).arg(sequenceName).arg(qualSequenceName))); } // read qualities qualityScores.clear(); readQuality(os, io, qualityScores, sequence.size()); CHECK_OP_BREAK(os); static const QString err = U2::FastqFormat::tr("Not a valid FASTQ file: %1. Bad quality scores: inconsistent size.").arg(docUrl.getURLString()); CHECK_EXT_BREAK(sequence.length() == qualityScores.length(), os.setError(err)); seqNumber++; progressUpNum++; if (merge) { headers.append(sequenceName); mergedMapping.append(U2Region(sequenceStart, sequence.length() )); } else { if (objectsCountLimit > 0 && objects.size() >= objectsCountLimit) { os.setError(FastqFormat::tr("File \"%1\" contains too many sequences to be displayed. " "However, you can process these data using instruments from the menu <i>Tools -> NGS data analysis</i> " "or pipelines built with Workflow Designer.") .arg(io->getURL().getURLString())); break; } U2Sequence u2seq = seqImporter.finalizeSequenceAndValidate(os); CHECK_OP_BREAK(os); sequenceRef = GObjectReference(io->getURL().getURLString(), u2seq.visualName, GObjectTypes::SEQUENCE, U2EntityRef(dbiRef, u2seq.id)); U2SequenceObject* seqObj = new U2SequenceObject(u2seq.visualName, U2EntityRef(dbiRef, u2seq.id)); CHECK_EXT_BREAK(seqObj != NULL, os.setError("U2SequenceObject is NULL")); seqObj->setQuality(DNAQuality(qualityScores)); objects << seqObj; U1AnnotationUtils::addAnnotations(objects, seqImporter.getCaseAnnotations(), sequenceRef, NULL, hints); } if (PROGRESS_UPDATE_STEP == progressUpNum) { progressUpNum = 0; os.setProgress(io->getProgress()); } } CHECK_OP_EXT(os, qDeleteAll(objects); objects.clear(), ); bool emptyObjects = objects.isEmpty(); CHECK_EXT(!emptyObjects || merge, os.setError(Document::tr("Document is empty.")), ); SAFE_POINT(headers.size() == mergedMapping.size(), "headers <-> regions mapping failed!", ); if (!merge) { return; } U2Sequence u2seq = seqImporter.finalizeSequenceAndValidate(os); CHECK_OP(os,); sequenceRef = GObjectReference(io->getURL().getURLString(), u2seq.visualName, GObjectTypes::SEQUENCE, U2EntityRef(dbiRef, u2seq.id)); U1AnnotationUtils::addAnnotations(objects, seqImporter.getCaseAnnotations(), sequenceRef, NULL, hints); objects << new U2SequenceObject(u2seq.visualName, U2EntityRef(dbiRef, u2seq.id)); objects << DocumentFormatUtils::addAnnotationsForMergedU2Sequence(sequenceRef, dbiRef, headers, mergedMapping, hints); if (headers.size() > 1) { writeLockReason = DocumentFormat::MERGED_SEQ_LOCK; } }
QString AssemblyBrowser::tryAddObject(GObject * obj) { Document * objDoc = obj->getDocument(); SAFE_POINT(NULL != objDoc, "", tr("Internal error: only object with document can be added to browser")); if (GObjectTypes::SEQUENCE == obj->getGObjectType()) { U2SequenceObject * seqObj = qobject_cast<U2SequenceObject*>(obj); CHECK(NULL != seqObj, tr("Internal error: broken sequence object")); SAFE_POINT(NULL != objDoc->getDocumentFormat(), "", tr("Internal error: empty document format")); U2OpStatus2Log os; qint64 seqLen = seqObj->getSequenceLength(); QStringList errs; qint64 modelLen = model->getModelLength(os); if (seqLen != modelLen) { errs << tr("The lengths of the sequence and assembly are different."); } if (seqObj->getGObjectName() != gobject->getGObjectName()) { errs << tr("The sequence and assembly names are different."); } // commented: waiting for fix //QByteArray refMd5 = model->getReferenceMd5(); //if(!refMd5.isEmpty()) { // //QByteArray data = QString(seqObj->getSequence()).remove("-").toUpper().toUtf8(); // QByteArray data = QString(seqObj->getSequence()).toUpper().toUtf8(); // QByteArray seqObjMd5 = QCryptographicHash::hash(data, QCryptographicHash::Md5).toHex(); // if(seqObjMd5 != refMd5) { // errs << tr("- Reference MD5 not match with MD5 written in assembly"); // } //} bool setRef = !isAssemblyObjectLocked(true) && !model->isLoadingReference(); setRef &= model->checkPermissions(QFile::WriteUser, setRef); if(!errs.isEmpty() && setRef) { const NotificationStack *notificationStack = AppContext::getMainWindow()->getNotificationStack(); const QString message = tr("It seems that sequence \"%1\", set as reference to assembly \"%2\", does not match it.").arg(seqObj->getGObjectName()).arg(gobject->getGObjectName()) + "\n- " + errs.join("\n- "); notificationStack->addNotification(message, Warning_Not); } if(setRef) { model->setReference(seqObj); U2Assembly assembly = model->getAssembly(); U2DataId refId; QString folder; const QStringList folders = model->getDbiConnection().dbi->getObjectDbi()->getObjectFolders(assembly.id, os); if (folders.isEmpty() || os.isCoR()) { folder = U2ObjectDbi::ROOT_FOLDER; } else { folder = folders.first(); } if (seqObj->getEntityRef().dbiRef == model->getDbiConnection().dbi->getDbiRef()) { refId = seqObj->getEntityRef().entityId; } else { U2CrossDatabaseReferenceDbi * crossDbi = model->getDbiConnection().dbi->getCrossDatabaseReferenceDbi(); U2CrossDatabaseReference crossDbRef; // Cannot simply use seqObj->getSequenceRef(), since it points to a temporary dbi // TODO: make similar method seqObj->getPersistentSequenctRef() crossDbRef.dataRef.dbiRef.dbiId = objDoc->getURLString(); crossDbRef.dataRef.dbiRef.dbiFactoryId = "document"; crossDbRef.dataRef.entityId = seqObj->getGObjectName().toUtf8(); crossDbRef.visualName = "cross_database_reference: " + seqObj->getGObjectName(); crossDbRef.dataRef.version = 1; crossDbi->createCrossReference(crossDbRef, folder, os); LOG_OP(os); refId = crossDbRef.id; addObjectToView(obj); } model->associateWithReference(refId); } } else if (GObjectTypes::VARIANT_TRACK == obj->getGObjectType()) { VariantTrackObject *trackObj = qobject_cast<VariantTrackObject*>(obj); CHECK(NULL != trackObj, tr("Internal error: broken variant track object")); model->addTrackObject(trackObj); addObjectToView(obj); connect(model.data(), SIGNAL(si_trackRemoved(VariantTrackObject *)), SLOT(sl_trackRemoved(VariantTrackObject *))); } else {