Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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();        
    }
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
 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;
 }