obj_convert.cpp
来自「ncbi源码」· C++ 代码 · 共 1,304 行 · 第 1/3 页
CPP
1,304 行
};////////////////////////////////////////////////////////////////////////////// seq-submit conversions//class CSeq_submitConverter : public CObjConverter{public: // seq-submit -> seq-submit // identity conversion void ToSeqSubmit(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_submit* sub = dynamic_cast<const CSeq_submit*> (&obj); if (sub) { objs.push_back(CConstRef<CObject>(sub)); } } // seq-submit -> seq-entry void ToSeqEntry(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_submit* sub = dynamic_cast<const CSeq_submit*> (&obj); if (sub && sub->GetData().IsEntrys()) { ITERATE (CSeq_submit::TData::TEntrys, iter, sub->GetData().GetEntrys()) { CConstRef<CObject> obj(iter->GetPointer()); objs.push_back(obj); } } } // seq-submit -> bioseq // identity operation void ToBioseq(CScope& scope, const CObject& obj, TObjList& objs) const { TObjList ents; ToSeqEntry(scope, obj, ents); ITERATE (TObjList, ent_iter, ents) { CObjectConverter::Convert(scope, **ent_iter, CBioseq::GetTypeInfo()->GetName(), objs); } } // seq-submit -> seq-id // we return only one of the seq-ids for this seq-submit void ToSeqId(CScope& scope, const CObject& obj, TObjList& objs) const { TObjList ents; ToSeqEntry(scope, obj, ents); ITERATE (TObjList, ent_iter, ents) { CObjectConverter::Convert(scope, **ent_iter, CSeq_id::GetTypeInfo()->GetName(), objs); } }};////////////////////////////////////////////////////////////////////////////// seq-id conversions//class CSeq_idConverter : public CObjConverter{public: // seq-id -> seq-entry // retrieve the seq-entry from the scope void ToSeqEntry(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_id* id = dynamic_cast<const CSeq_id*>(&obj); if (id) { // retrieve our handle from the scope and proceed CBioseq_Handle handle = scope.GetBioseqHandle(*id); if (handle) { const CSeq_entry& entry = handle.GetTopLevelSeqEntry(); CConstRef<CObject> obj(&entry); objs.push_back(obj); } } } // seq-id -> bioseq-set // retrieve the seq-entry from the scope and return its bioseq-set void ToBioseqSet(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_id* id = dynamic_cast<const CSeq_id*>(&obj); if (id) { // retrieve our handle from the scope and proceed CBioseq_Handle handle = scope.GetBioseqHandle(*id); if (handle) { const CSeq_entry& entry = handle.GetTopLevelSeqEntry(); if (entry.IsSet()) { objs.push_back(CConstRef<CObject>(&entry.GetSet())); } } } } // seq-id -> bioseq // retrieve the bioseq from the scope void ToBioseq(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_id* id = dynamic_cast<const CSeq_id*>(&obj); if (id) { // retrieve our handle from the scope and proceed CBioseq_Handle handle = scope.GetBioseqHandle(*id); if (handle) { const CBioseq& bs = *handle.GetCompleteBioseq(); objs.push_back(CConstRef<CObject>(&bs)); } } } // seq-id -> seq-id // we return only one of the seq-ids for each bioseq void ToSeqId(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_id* id = dynamic_cast<const CSeq_id*>(&obj); if (id) { objs.push_back(CConstRef<CObject>(id)); } } // seq-id -> seq-loc // this is a very simple conversion; we create a new CSeq_loc // of type whole void ToSeqLoc(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_id* id = dynamic_cast<const CSeq_id*>(&obj); if (id) { CRef<CSeq_loc> loc(new CSeq_loc()); loc->SetWhole(const_cast<CSeq_id&>(*id)); objs.push_back(CConstRef<CObject>(loc.GetPointer())); } }};////////////////////////////////////////////////////////////////////////////// seq-loc conversions//class CSeq_locConverter : public CObjConverter{public: // seq-loc -> seq-id // we return a set of unique seq-ids for each location void ToSeqId(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_loc* loc = dynamic_cast<const CSeq_loc*> (&obj); if (loc) { CTypeConstIterator<CSeq_id> id_iter(*loc); for ( ; id_iter; ++id_iter) { const CSeq_id& id = *id_iter; bool add = true; ITERATE(TObjList, obj_iter, objs) { const CSeq_id* other_id = dynamic_cast<const CSeq_id*> (obj_iter->GetPointer()); if ( !other_id ) { continue; } CSeq_id::E_SIC cmp = other_id->Compare(id); if (cmp == CSeq_id::e_YES) { add = false; break; } if (cmp == CSeq_id::e_DIFF) { _TRACE("Warning: seq-id compare ineffective"); } } if (add) { objs.push_back(CConstRef<CObject>(&id)); } } } } // seq-loc -> seq-loc // identity conversion void ToSeqLoc(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_loc* loc = dynamic_cast<const CSeq_loc*>(&obj); if (loc) { objs.push_back(CConstRef<CObject>(loc)); } } // seq-loc -> seq-feat // we use CFeat_CI void ToSeqFeat(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_loc* loc = dynamic_cast<const CSeq_loc*>(&obj); if (loc) { SAnnotSelector sel = CSeqUtils::GetAnnotSelector(); CFeat_CI iter(scope, *loc, sel); for (; iter; ++iter) { const CSeq_feat& feat = iter->GetOriginalFeature(); objs.push_back(CConstRef<CObject>(&feat)); } } } // seq-loc -> seq-align // we use CAlign_CI void ToSeqAlign(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_loc* loc = dynamic_cast<const CSeq_loc*>(&obj); if (loc) { SAnnotSelector sel = CSeqUtils::GetAnnotSelector(); CAlign_CI iter(scope, *loc, sel); for (; iter; ++iter) { objs.push_back(CConstRef<CObject>(&(*iter))); } } } // seq-loc --> seq-annot // we use CAnnot_CI here void ToSeqAnnot(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_loc* loc = dynamic_cast<const CSeq_loc*>(&obj); if (loc) { SAnnotSelector sel = CSeqUtils::GetAnnotSelector(); CAnnot_CI iter(scope, *loc, sel); for (; iter; ++iter) { const CSeq_annot& annot = iter->GetSeq_annot(); objs.push_back(CConstRef<CObject>(&annot)); } } }};////////////////////////////////////////////////////////////////////////////// seq-annot conversions//class CSeq_annotConverter : public CObjConverter{public: // seq-annot -> seq-entry: we create a dummy CSeq_entry to hold our object void ToSeqEntry(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_annot* annot = dynamic_cast<const CSeq_annot*> (&obj); if (annot) { CRef<CSeq_entry> entry(new CSeq_entry()); entry->SetSet().SetSeq_set(); entry->SetSet().SetAnnot() .push_back(CRef<CSeq_annot>(const_cast<CSeq_annot*>(annot))); objs.push_back( CConstRef<CObject> (entry.GetPointer()) ); } } // seq-annot -> seq-id: use CTypeConstIterator<> void ToSeqId(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_annot* annot = dynamic_cast<const CSeq_annot*> (&obj); if (annot) { CTypeConstIterator<CSeq_id> id_iter(*annot); for ( ; id_iter; ++id_iter) { objs.push_back( CConstRef<CObject> (&*id_iter) ); } } } // seq-annot -> seq-align void ToSeqAlign(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_annot* annot = dynamic_cast<const CSeq_annot*>(&obj); if (annot && annot->GetData().IsAlign()) { ITERATE (CSeq_annot::TData::TAlign, iter, annot->GetData().GetAlign()) { objs.push_back(CConstRef<CObject>(&**iter)); } } }};////////////////////////////////////////////////////////////////////////////// seq-align conversions//class CSeq_alignConverter : public CObjConverter{public: // functor for evaluating whether a seq-id matches that inside // of a seq-interval struct SSortByIdRef { bool operator() (const CConstRef<CSeq_id>& id1, const CConstRef<CSeq_id>& id2) const { return (*id1 < *id2); } }; // seq-align -> seq-id void ToSeqId(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_align* align = dynamic_cast<const CSeq_align*> (&obj); if (align) { typedef set<CConstRef<CSeq_id>, SSortByIdRef> TIdSet; TIdSet id_set; CTypeConstIterator<CSeq_id> id_iter(*align); for ( ; id_iter; ++id_iter) { id_set.insert( CConstRef<CSeq_id>(&*id_iter) ); } ITERATE (TIdSet, iter, id_set) { objs.push_back( CConstRef<CObject>(iter->GetPointer()) ); } } } // seq-align -> seq-align // identity conversion void ToSeqAlign(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_align* align = dynamic_cast<const CSeq_align*>(&obj); if (align) { objs.push_back(CConstRef<CObject>(align)); } } // seq-align -> seq-annot void ToSeqAnnot(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_align* align = dynamic_cast<const CSeq_align*>(&obj); if (align) { CRef<CSeq_annot> annot(new CSeq_annot()); annot->SetData().SetAlign() .push_back(CRef<CSeq_align>(const_cast<CSeq_align*>(align))); objs.push_back(CConstRef<CObject>(annot.GetPointer())); } }};////////////////////////////////////////////////////////////////////////////// seq-align-set conversions//class CSeq_align_setConverter : public CObjConverter{public: // functor for evaluating whether a seq-id matches that inside // of a seq-interval struct SSortByIdRef { bool operator() (const CConstRef<CSeq_id>& id1, const CConstRef<CSeq_id>& id2) const { return (*id1 < *id2); } }; // seq-align-set -> seq-id void ToSeqId(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_align_set* align = dynamic_cast<const CSeq_align_set*> (&obj); if (align) { typedef set<CConstRef<CSeq_id>, SSortByIdRef> TIdSet; TIdSet id_set; CTypeConstIterator<CSeq_id> id_iter(*align); for ( ; id_iter; ++id_iter) { id_set.insert( CConstRef<CSeq_id>(&*id_iter) ); } ITERATE (TIdSet, iter, id_set) { objs.push_back( CConstRef<CObject>(iter->GetPointer()) ); } } } // seq-align-set -> seq-align // identity conversion void ToSeqAlign(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_align_set* align = dynamic_cast<const CSeq_align_set*>(&obj); if (align) { ITERATE (CSeq_align_set::Tdata, iter, align->Get()) { objs.push_back(CConstRef<CObject>(iter->GetPointer())); } } } // seq-align-set -> seq-annot void ToSeqAnnot(CScope& scope, const CObject& obj, TObjList& objs) const { const CSeq_align_set* align = dynamic_cast<const CSeq_align_set*>(&obj); if (align) { CRef<CSeq_annot> annot(new CSeq_annot()); ITERATE (CSeq_align_set::Tdata, iter, align->Get()) { CRef<CSeq_align> ref (const_cast<CSeq_align*>(iter->GetPointer())); annot->SetData().SetAlign().push_back(ref); } objs.push_back(CConstRef<CObject>(annot.GetPointer())); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?