// ---------------------------------------------------------------------------- bool CVcfReader::x_ProcessMetaLineInfo( const string& line, CRef<CSeq_annot> pAnnot ) // ---------------------------------------------------------------------------- { const string prefix = "##INFO=<"; const string postfix = ">"; if ( ! NStr::StartsWith( line, prefix ) || ! NStr::EndsWith( line, postfix ) ) { return false; } try { vector<string> fields; string key, id, numcount, type, description; string info = line.substr( prefix.length(), line.length() - prefix.length() - postfix.length() ); NStr::Tokenize( info, ",", fields ); NStr::SplitInTwo( fields[0], "=", key, id ); if ( key != "ID" ) { throw "Unexpected --- ##INFO: bad ID key!"; } NStr::SplitInTwo( fields[1], "=", key, numcount ); if ( key != "Number" ) { throw "Unexpected --- ##INFO: bad number key!"; } NStr::SplitInTwo( fields[2], "=", key, type ); if ( key != "Type" ) { throw "Unexpected --- ##INFO: bad type key!"; } NStr::SplitInTwo( fields[3], "=", key, description ); if ( key != "Description" ) { throw "Unexpected --- ##INFO: bad description key!"; } m_InfoSpecs[id] = CVcfInfoSpec( id, numcount, type, description ); } catch ( ... ) { return true; } return true; }
// ---------------------------------------------------------------------------- bool CVcfReader::xProcessMetaLineInfo( const string& line, CRef<CSeq_annot> pAnnot, IMessageListener* pEC) // ---------------------------------------------------------------------------- { const string prefix = "##INFO=<"; const string postfix = ">"; if ( ! NStr::StartsWith( line, prefix ) || ! NStr::EndsWith( line, postfix ) ) { return false; } try { vector<string> fields; string key, id, numcount, type, description; string info = line.substr( prefix.length(), line.length() - prefix.length() - postfix.length() ); NStr::Tokenize( info, ",", fields ); NStr::SplitInTwo( fields[0], "=", key, id ); if ( key != "ID" ) { AutoPtr<CObjReaderLineException> pErr( CObjReaderLineException::Create( eDiag_Error, 0, "CVcfReader::xProcessMetaLineInfo: ##INFO with bad or missing \"ID\".", ILineError::eProblem_BadInfoLine) ); pErr->Throw(); } NStr::SplitInTwo( fields[1], "=", key, numcount ); if ( key != "Number" ) { AutoPtr<CObjReaderLineException> pErr( CObjReaderLineException::Create( eDiag_Error, 0, "CVcfReader::xProcessMetaLineInfo: ##INFO with bad or missing \"Number\".", ILineError::eProblem_BadInfoLine) ); pErr->Throw(); } NStr::SplitInTwo( fields[2], "=", key, type ); if ( key != "Type" ) { AutoPtr<CObjReaderLineException> pErr( CObjReaderLineException::Create( eDiag_Error, 0, "CVcfReader::xProcessMetaLineInfo: ##INFO with bad or missing \"Type\".", ILineError::eProblem_BadInfoLine) ); pErr->Throw(); } NStr::SplitInTwo( fields[3], "=", key, description ); if ( key != "Description" ) { AutoPtr<CObjReaderLineException> pErr( CObjReaderLineException::Create( eDiag_Error, 0, "CVcfReader::xProcessMetaLineInfo: ##INFO with bad or missing \"Description\".", ILineError::eProblem_BadInfoLine) ); pErr->Throw(); } m_InfoSpecs[id] = CVcfInfoSpec( id, numcount, type, description ); } catch (CObjReaderLineException& err) { ProcessError(err, pEC); } return true; }