SharedAnnotationData FindAlgorithmResult::toAnnotation(const QString &name, bool splitCircular, int seqLen) const { SAFE_POINT(!splitCircular || (seqLen != -1), "Sequence length is not set!", SharedAnnotationData()); SharedAnnotationData data(new AnnotationData); data->name = name; if (splitCircular && (region.endPos() > seqLen) ) { if (region.startPos >= seqLen) { data->location->regions << U2Region(region.startPos - seqLen, region.length); } else { SAFE_POINT(region.startPos < seqLen, "Region is not correct", SharedAnnotationData()); data->location->regions << U2Region(region.startPos, seqLen - region.startPos); data->location->regions << U2Region(0, region.length - (seqLen - region.startPos)); } } else { data->location->regions << region; } data->setStrand(strand); data->qualifiers.append(U2Qualifier("mismatches", QString::number(err))); return data; }
SharedAnnotationData SwissProtPlainTextFormat::readAnnotation(IOAdapter* io, char* cbuff, int len, int READ_BUFF_SIZE, U2OpStatus& si, int offset, int seqLen){ Q_UNUSED(seqLen); AnnotationData* a = new AnnotationData(); SharedAnnotationData f(a); QString key = QString::fromLatin1(cbuff+5, 10).trimmed(); if (key.isEmpty()) { si.setError(EMBLGenbankAbstractDocument::tr("Annotation name is empty")); return SharedAnnotationData(); } a->name = key; if(key == "STRAND" || key == "HELIX" || key == "TURN"){ a->qualifiers.append(U2Qualifier(GBFeatureUtils::QUALIFIER_GROUP, "Secondary structure")); } QString start= QString::fromLatin1(cbuff+15, 5).trimmed(); if(start.isEmpty()){ si.setError(EMBLGenbankAbstractDocument::tr("Annotation start position is empty")); return SharedAnnotationData(); } QString end= QString::fromLatin1(cbuff+22, 5).trimmed(); if(end.isEmpty()){ si.setError(EMBLGenbankAbstractDocument::tr("Annotation end position is empty")); return SharedAnnotationData(); } a->location->reset(); if(key == "DISULFID" && start != end){ a->location->op=U2LocationOperator_Order; U2Region reg1(start.toInt()-1,1); U2Region reg2(end.toInt()-1,1); a->location->regions.append(reg1); a->location->regions.append(reg2); }else{ U2Region reg(start.toInt()-1,end.toInt() - start.toInt()+1); a->location->regions.append(reg); } if (offset!=0) { U2Region::shift(offset, a->location->regions); } QString valQStr = QString::fromLatin1(cbuff).split(QRegExp("\\n")).first().mid(34); QString nameQStr = "Description"; bool isDescription=true; const QByteArray& aminoQ = GBFeatureUtils::QUALIFIER_AMINO_STRAND; const QByteArray& nameQ = GBFeatureUtils::QUALIFIER_NAME; //here we have valid key and location; //reading qualifiers bool lineOk = true; while ((len = io->readUntil(cbuff, READ_BUFF_SIZE, TextUtils::LINE_BREAKS, IOAdapter::Term_Include, &lineOk) ) > 0) { if (len == 0 || len < QN_COL+1 || cbuff[K_COL]!=' ' || cbuff[0]!=fPrefix[0] || cbuff[1]!=fPrefix[1]) { io->skip(-len); if(isDescription && !valQStr.isEmpty()){ isDescription=false; a->qualifiers.append(U2Qualifier(nameQStr, valQStr)); } break; } if (!lineOk) { si.setError(EMBLGenbankAbstractDocument::tr("Unexpected line format")); break; } //parse line if(cbuff[A_COL] != '/'){//continue of description valQStr.append(" "); valQStr.append(QString::fromLatin1(cbuff).split(QRegExp("\\n")).takeAt(0).mid(34)); }else{ for (; QN_COL < len && TextUtils::LINE_BREAKS[(uchar)cbuff[len-1]]; len--){}; //remove line breaks int flen = len + readMultilineQualifier(io, cbuff, READ_BUFF_SIZE-len, len == maxAnnotationLineLen, len, si); //now the whole feature is in cbuff int valStart = A_COL + 1; for (; valStart < flen && cbuff[valStart] != '='; valStart++){}; //find '==' and valStart if (valStart < flen) { valStart++; //skip '=' char } const QBitArray& WHITE_SPACES = TextUtils::WHITES; for (; valStart < flen && WHITE_SPACES[(uchar)cbuff[flen-1]]; flen--){}; //trim value const char* qname = cbuff + QN_COL; int qnameLen = valStart - (QN_COL + 1); const char* qval = cbuff + valStart; int qvalLen = flen - valStart; if (qnameLen == aminoQ.length() && TextUtils::equals(qname, aminoQ.constData(), qnameLen)) { //a->aminoFrame = qvalLen == aminoQYes.length() && TextUtils::equals(qval, aminoQYes.constData(), qvalLen) ? TriState_Yes // : (qvalLen == aminoQNo.length() && TextUtils::equals(qval, aminoQNo.constData(), qvalLen) ? TriState_No : TriState_Unknown); } else if (qnameLen == nameQ.length() && TextUtils::equals(qname, nameQ.constData(), qnameLen)) { a->name = QString::fromLocal8Bit(qval, qvalLen); } else { QString nameQStr = QString::fromLocal8Bit(qname, qnameLen); QString valQStr = QString::fromLocal8Bit(qval, qvalLen); a->qualifiers.append(U2Qualifier(nameQStr, valQStr)); } } } return f; }