// ---------------------------------------------------------------------------- bool CGtfReader::xFeatureSetQualifiersGene( const CGff2Record& record, CRef< CSeq_feat > pFeature ) // ---------------------------------------------------------------------------- { // // Create GB qualifiers for the record attributes: // CRef< CGb_qual > pQual(0); const CGff2Record::TAttributes& attrs = record.Attributes(); CGff2Record::TAttrCit it = attrs.begin(); for (/*NOOP*/; it != attrs.end(); ++it) { // gtf genes don't get transcript_id if (it->first == "transcript_id") { continue; } // special case some well-known attributes if (x_ProcessQualifierSpecialCase(it, pFeature)) { continue; } // turn everything else into a qualifier pQual.Reset(new CGb_qual); pQual->SetQual(it->first); pQual->SetVal(it->second); pFeature->SetQual().push_back(pQual); } return true; }
// ---------------------------------------------------------------------------- bool CGff3Reader::x_UpdateAnnot( const CGff2Record& record, CRef< CSeq_annot > pAnnot ) // ---------------------------------------------------------------------------- { string gbkey; record.GetAttribute("gbkey", gbkey); CRef< CSeq_feat > pFeature(new CSeq_feat); // Round trip info: CRef< CGb_qual > pQual( new CGb_qual ); pQual->SetQual( "gff_source" ); pQual->SetVal( record.Source() ); pFeature->SetQual().push_back( pQual ); pQual.Reset( new CGb_qual ); pQual->SetQual( "gff_type" ); pQual->SetVal( record.Type() ); pFeature->SetQual().push_back( pQual ); if ( record.IsSetScore() ) { pQual.Reset( new CGb_qual ); pQual->SetQual( "gff_score" ); pQual->SetVal( NStr::DoubleToString( record.Score() ) ); pFeature->SetQual().push_back( pQual ); } // Special case: exon feature belonging to an RNA we have already seen if (record.Type() == "exon") { string parent; if (record.GetAttribute("Parent", parent)) { IdToFeatureMap::iterator it = m_MapIdToFeature.find(parent); if (it != m_MapIdToFeature.end()) { return record.UpdateFeature(m_iFlags, it->second); } } } // Special case: Piece of another feature we have already seen string id; if (record.GetAttribute("ID", id)) { IdToFeatureMap::iterator it = m_MapIdToFeature.find(id); if (it != m_MapIdToFeature.end()) { return record.UpdateFeature(m_iFlags, it->second); } } // General case: brand new regular feature if (!record.InitializeFeature(m_iFlags, pFeature)) { return false; } string strId; if ( record.GetAttribute( "ID", strId ) ) { m_MapIdToFeature[ strId ] = pFeature; } return x_AddFeatureToAnnot( pFeature, pAnnot ); }
// ---------------------------------------------------------------------------- bool CGtfReader::x_ProcessQualifierSpecialCase( CGff2Record::TAttrCit it, CRef< CSeq_feat > pFeature ) // ---------------------------------------------------------------------------- { CRef<CGb_qual> pQual(0); if (0 == NStr::CompareNocase(it->first, "exon_id")) { return true; } if (0 == NStr::CompareNocase(it->first, "exon_number")) { return true; } if ( 0 == NStr::CompareNocase( it->first, "note" ) ) { pFeature->SetComment( it->second ); return true; } if ( 0 == NStr::CompareNocase( it->first, "dbxref" ) || 0 == NStr::CompareNocase( it->first, "db_xref" ) ) { vector< string > tags; NStr::Split( it->second, ";", tags ); for ( vector<string>::iterator it = tags.begin(); it != tags.end(); ++it ) { pFeature->SetDbxref().push_back( x_ParseDbtag( *it ) ); } return true; } if ( 0 == NStr::CompareNocase( it->first, "pseudo" ) ) { pFeature->SetPseudo( true ); return true; } if ( 0 == NStr::CompareNocase( it->first, "partial" ) ) { pFeature->SetPartial( true ); return true; } //if (0 == NStr::CompareNocase(it->first, "protein_id")) { // if (pFeature->IsSetProduct()) { // return true; // } //} return false; }