QVector<U2Region> MultipleRangeSelector::getSelectedRegions(){ QVector<U2Region> currentRegions; if(ui->singleButton->isChecked()){ bool ok = false; int st = ui->startEdit->text().toInt(&ok); assert(ok); int en = ui->endEdit->text().toInt(&ok); assert(ok); if (isCircular && st > en ) { currentRegions.append(U2Region(0, en)); currentRegions.append(U2Region(st - 1, seqLen - st + 1)); } else { currentRegions.append(U2Region(st - 1, en - st + 1)); } }else{ QByteArray locEditText = ui->multipleRegionEdit->text().toLatin1(); U2Location currentLocation; if (isCircular){ Genbank::LocationParser::parseLocation( locEditText.constData(), ui->multipleRegionEdit->text().length(), currentLocation, seqLen); }else{ Genbank::LocationParser::parseLocation( locEditText.constData(), ui->multipleRegionEdit->text().length(), currentLocation, -1); } assert(!currentLocation->isEmpty()); currentRegions = U2Region::join(currentLocation->regions); } return currentRegions; }
void MultipleRangeSelector::accept(){ if(ui->singleButton->isChecked()){ bool ok = false; int v1 = ui->startEdit->text().toInt(&ok); if (!ok || v1 < 1 || v1 > seqLen) { return; } int v2 = ui->endEdit->text().toInt(&ok); if (!ok || (v2 < v1 && !isCircular) || v2 > seqLen) { return; } QDialog::accept(); }else{ QByteArray locEditText = ui->multipleRegionEdit->text().toLatin1(); U2Location currentLocation; if (isCircular) { Genbank::LocationParser::parseLocation(locEditText.constData(), ui->multipleRegionEdit->text().length(), currentLocation, seqLen); } else { Genbank::LocationParser::parseLocation(locEditText.constData(), ui->multipleRegionEdit->text().length(), currentLocation, -1); } if (currentLocation->isEmpty()) { return; } QDialog::accept(); } }
GeneByGeneCompareResult GeneByGeneComparator::compareGeneAnnotation(const DNASequence& seq, const QList<SharedAnnotationData> &annData, const QString& annName, float identity) { GeneByGeneCompareResult result; float maxIdentity = -1.0F; foreach (const SharedAnnotationData &adata, annData) { if (adata->name == annName) { U2Location location = adata->location; if (location->isSingleRegion()) { int reglen = location->regions.first().length; float lenRatio = reglen * 100 /static_cast<float>(seq.length()); maxIdentity = qMax(maxIdentity, lenRatio); if(lenRatio >= identity){ //check length ratio QString ident = adata->findFirstQualifierValue(BLAST_IDENT); if (!ident.isEmpty()){ //create BLAST string YES/identity/gaps float blastIdent = parseBlastQual(ident); if (blastIdent != -1.0f && blastIdent >= identity){ result.identical = true; result.identityString = GeneByGeneCompareResult::IDENTICAL_YES; result.identityString.append(QString("\\%1").arg(blastIdent)); QString gaps = adata->findFirstQualifierValue(BLAST_GAPS); if (!gaps.isEmpty()){ float blastGaps = parseBlastQual(gaps); if (blastGaps!=1.0f){ result.identityString.append(QString("\\%1").arg(blastGaps)); } }else{ result.identityString.append(QString("\\0")); } } }else{ //not a blast annotation result.identical = true; result.identityString = GeneByGeneCompareResult::IDENTICAL_YES; } } } break; } } if (result.identical == false && maxIdentity != -1.0f){ result.identityString.append(QString("\\%1").arg(maxIdentity)); } return result; }
QList<Task *> SpideyAlignmentTask::onSubTaskFinished(Task *subTask) { QList<Task *> res; propagateSubtaskError(); if (hasError() || isCanceled()) { return res; } if (subTask == prepareDataForSpideyTask) { SAFE_POINT(!prepareDataForSpideyTask->getResultPath().isEmpty(), "Invalid result path!", res); tmpOutputUrl = prepareDataForSpideyTask->getResultPath(); const QStringList &arguments = prepareDataForSpideyTask->getArgumentsList(); spideyTask = new ExternalToolRunTask(ET_SPIDEY, arguments, new SpideyLogParser()); spideyTask->setSubtaskProgressWeight(95); res.append(spideyTask); } else if (subTask == spideyTask) { if (!QFile::exists(tmpOutputUrl)) { if (AppContext::getExternalToolRegistry()->getByName(ET_SPIDEY)->isValid()) { stateInfo.setError(tr("Output file not found")); } else { ExternalTool *spideyTool = AppContext::getExternalToolRegistry()->getByName(ET_SPIDEY); SAFE_POINT(NULL != spideyTool, "Invalid Spidey tool!", res); stateInfo.setError( tr("Output file not found. May be %1 tool path '%2' not valid?") .arg(spideyTool->getName()).arg(spideyTool->getPath())); } return res; } // parse result QFile resultFile(tmpOutputUrl); if (!resultFile.open(QFile::ReadOnly)) { setError(tr("Failed to open result file %1").arg(tmpOutputUrl)); return res; } QTextStream inStream(&resultFile); bool strandDirect = true; U2Location location; location->op = U2LocationOperator_Join; while (!inStream.atEnd()) { QByteArray buf = inStream.readLine().toLatin1(); if (buf.startsWith("Strand")) { strandDirect = buf.contains("plus"); } if (buf.startsWith("Exon")) { // TODO: better to use reg exp here int startPos = buf.indexOf(":") + 1; int endPos = buf.indexOf("(gen)"); if (startPos == -1 || endPos == -1) { continue; } QByteArray loc = buf.mid(startPos, endPos - startPos).trimmed(); QList<QByteArray> loci = loc.split('-'); if (loci.size() < 2) { continue; } int start = QString(loci.at(0)).toInt(); int finish = QString(loci.at(1)).toInt(); if (start == finish) { continue; } location->regions.append(U2Region(start - 1, finish - start + 1)); } } if (!location->isEmpty()) { SharedAnnotationData data(new AnnotationData); data->location = location; data->setStrand(U2Strand(strandDirect ? U2Strand::Direct : U2Strand::Complementary)); data->type = U2FeatureTypes::Exon; data->name = "exon"; U1AnnotationUtils::addDescriptionQualifier(data, annDescription); resultAnnotations.append(data); } } return res; }
bool parseLocationDescriptor(U2Location &location, QString& errorReport) { bool remoteEntry = false; Token token = lexer.peek(); if (token.getType() == Token::NAME) { // remote entries remoteEntry = true; QByteArray accession = lexer.next().getString(); QString data = accession; if(!match(Token::PERIOD)) { errorReport = QString("GENBANK LOCATION PARSER: Must be PERIOD instead of %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } qint64 version = 0; if(!parseNumber(version)) { errorReport = QString("GENBANK LOCATION PARSER: can't parse Number. Token: %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } if(!match(Token::COLON)) { errorReport = QString("GENBANK LOCATION PARSER: Must be COLON instead of %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } ioLog.info(LocationParser::tr("Ignoring remote entry: %1.%2").arg(QString(accession)).arg(version)); } if (token.getType() == Token::COMPLEMENT) { lexer.next(); return parseComplement(location, errorReport); } qint64 firstBase = 0; bool firstBaseIsFromRange = false; if(match(Token::LEFT_PARENTHESIS)) { // cases like (1.2).. firstBaseIsFromRange = true; if(!parseNumber(firstBase)) { // use the first number as a region boundary errorReport = QString("GENBANK LOCATION PARSER: can't parse Number. Token: %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } else if(firstBase < 0) { errorReport = QString("GENBANK LOCATION PARSER: region boundary can not be less then zero. Token: %1%2").arg(firstBase).arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } if(!match(Token::PERIOD)) { errorReport = QString("GENBANK LOCATION PARSER: Must be PERIOD instead of %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } if(!match(Token::NUMBER)) { // ignore the second number errorReport = QString("GENBANK LOCATION PARSER: Must be NUMBER instead of %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } if(!match(Token::RIGHT_PARENTHESIS)) { errorReport = QString("GENBANK LOCATION PARSER: Must be RIGHT_PARENTHESIS instead of %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } ioLog.info(LocationParser::tr("'a single base from a range' in combination with 'sequence span' is not supported")); } else { if(match(Token::LESS)) { ioLog.info(LocationParser::tr("Ignoring '<' at start position")); } if(!parseNumber(firstBase)) { errorReport = QString("GENBANK LOCATION PARSER: can't parse Number. Token: %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } else if(firstBase < 0) { errorReport = QString("Region boundary can not be less then zero: %1%2").arg(firstBase).arg(lexer.peek().getString().data()); ioLog.trace("GENBANK LOCATION PARSER:" + errorReport); return false; } } if(match(Token::PERIOD)) { if(firstBaseIsFromRange) { // ranges are only allowed in spans errorReport = QString("GENBANK LOCATION PARSER: ranges are only allowed in spans. Token: %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } qint64 secondNumber = 0; if(!parseNumber(secondNumber)) { errorReport = QString("GENBANK LOCATION PARSER: can't parse Number. Token: %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } else if(secondNumber < 0) { errorReport = QString("Region boundary can not be less then zero: %1%2").arg(secondNumber).arg(lexer.peek().getString().data()); ioLog.trace("GENBANK LOCATION PARSER:" + errorReport); return false; } if(!location->isEmpty()) { errorReport = QString("GENBANK LOCATION PARSER: location is not empty. Token: %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } if(!remoteEntry) { // ignore remote entries location->regions.append(toRegion(firstBase, secondNumber)); location->regionType = U2LocationRegionType_SingleBase; } } else if(match(Token::DOUBLE_PERIOD)) { qint64 secondNumber = 0; if(match(Token::LEFT_PARENTHESIS)) { // cases like ..(1.2) if(!match(Token::NUMBER)) { // ignore the first number errorReport = QString("GENBANK LOCATION PARSER: Must be NUMBER instead of %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } if(!match(Token::PERIOD)) { errorReport = QString("GENBANK LOCATION PARSER: Must be PERIOD instead of %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } if(!parseNumber(secondNumber)) { // use the second number as a region boudary errorReport = QString("GENBANK LOCATION PARSER: can't parse Number. Token: %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } else if(secondNumber < 0) { errorReport = QString("Region boundary can not be less then zero: %1%2").arg(secondNumber).arg(lexer.peek().getString().data()); ioLog.trace("GENBANK LOCATION PARSER:" + errorReport); return false; } if(!match(Token::RIGHT_PARENTHESIS)) { errorReport = QString("GENBANK LOCATION PARSER: Must be RIGHT_PARENTHESIS instead of %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } ioLog.info(LocationParser::tr("'a single base from a range' in combination with 'sequence span' is not supported")); } else { if(match(Token::GREATER)) { ioLog.info(LocationParser::tr("Ignoring '>' at end position")); } if(!parseNumber(secondNumber)) { errorReport = QString("GENBANK LOCATION PARSER: can't parse Number. Token: %1").arg(lexer.peek().getString().data()); ioLog.trace(errorReport); return false; } else if(secondNumber < 0) { errorReport = QString("Region boundary can not be less then zero: %1%2").arg(secondNumber).arg(lexer.peek().getString().data()); ioLog.trace("GENBANK LOCATION PARSER:" + errorReport); return false; } } if(!remoteEntry) { // ignore remote entries if(seqLenForCircular != -1 && firstBase > secondNumber){ location->regions.append(toRegion(1, secondNumber)); location->regions.append(toRegion(firstBase, seqLenForCircular)); location->regionType = U2LocationRegionType_Default; location->op = U2LocationOperator_Join; }else{ location->regions.append(toRegion(firstBase, secondNumber)); location->regionType = U2LocationRegionType_Default; } } } else if(match(Token::CARET)) { if(firstBaseIsFromRange) { // ranges are only allowed in spans return false; } qint64 secondBase = 0; if(!parseNumber(secondBase)) { return false; } if(!location->isEmpty()) { return false; } if(!remoteEntry) { // ignore remote entries if(seqLenForCircular != -1 && firstBase > secondBase){ location->regions.append(toRegion(1, secondBase)); location->regions.append(toRegion(firstBase, seqLenForCircular)); location->regionType = U2LocationRegionType_Default; location->op = U2LocationOperator_Join; }else{ location->regions.append(toRegion(firstBase, secondBase)); location->regionType = U2LocationRegionType_Site; } } } else { if(firstBaseIsFromRange) { // ranges are only allowed in spans return false; } if(!remoteEntry) { // ignore remote entries location->regions.append(toRegion(firstBase, firstBase)); location->regionType = U2LocationRegionType_Default; } } return true; }