annot_collector.cpp

来自「ncbi源码」· C++ 代码 · 共 1,431 行 · 第 1/4 页

CPP
1,431
字号
        }        if (last_bit) {            // search to the end of annot set            x_SearchRange(tse, objs, guard, annot_name, id, hr, cvt,                range.first, objs->m_AnnotSet.size());        }    }    if ( x_NeedSNPs() ) {        CHandleRange::TRange range = hr.GetOverlappingRange();        ITERATE ( CTSE_Info::TSNPSet, snp_annot_it, objs->m_SNPSet ) {            const CSeq_annot_SNP_Info& snp_annot = **snp_annot_it;            CSeq_annot_SNP_Info::const_iterator snp_it =                snp_annot.FirstIn(range);            if ( snp_it != snp_annot.end() ) {                m_TSE_LockSet.insert(ConstRef(&tse));                TSeqPos index = snp_it - snp_annot.begin() - 1;                do {                    ++index;                    const SSNP_Info& snp = *snp_it;                    if ( snp.NoMore(range) ) {                        break;                    }                    if ( snp.NotThis(range) ) {                        continue;                    }                    CAnnotObject_Ref annot_ref(snp_annot, index);                    annot_ref.SetSNP_Point(snp, cvt);                    if ( x_AddObject(annot_ref, cvt, 0) ) {                        return;                    }                } while ( ++snp_it != snp_annot.end() );            }        }    }}void CAnnot_Collector::x_SearchRange(const CTSE_Info& tse,                                        const SIdAnnotObjs* objs,                                        CReadLockGuard& guard,                                        const CAnnotName& annot_name,                                        const CSeq_id_Handle& id,                                        const CHandleRange& hr,                                        CSeq_loc_Conversion* cvt,                                        size_t from_idx, size_t to_idx){    _ASSERT(objs);    CHandleRange::TRange range = hr.GetOverlappingRange();    m_TSE_LockSet.insert(ConstRef(&tse));    for ( size_t index = from_idx; index < to_idx; ++index ) {        size_t start_size = m_AnnotSet.size(); // for rollback                const CTSE_Info::TRangeMap& rmap = objs->m_AnnotSet[index];        if ( rmap.empty() ) {            continue;        }        for ( CTSE_Info::TRangeMap::const_iterator aoit(rmap.begin(range));              aoit; ++aoit ) {            const CAnnotObject_Info& annot_info =                *aoit->second.m_AnnotObject_Info;            _ASSERT(m_Selector.MatchType(annot_info));            if ( annot_info.IsChunkStub() ) {                const CTSE_Chunk_Info& chunk = annot_info.GetChunk_Info();                if ( chunk.NotLoaded() ) {                    // New annot objects are to be loaded,                    // so we'll need to restart scan of current range.                    // Forget already found object                    // as they will be found again:                    m_AnnotSet.resize(start_size);                    CAnnotName name(annot_name);                    // Release lock for tse update:                    guard.Release();                                            // Load the stub:                    const_cast<CTSE_Chunk_Info&>(chunk).Load();                    // Acquire the lock again:                    guard.Guard(tse.m_AnnotObjsLock);                    // Reget range map pointer as it may change:                    objs = tse.x_GetIdObjects(name, id);                    _ASSERT(objs);                    // Restart this index again:                    --index;                    break;                }                else {                    // Skip chunk stub                    continue;                }            }            if ( !x_MatchLimitObject(annot_info) ) {                continue;            }                            if ( !x_MatchRange(hr, aoit->first, aoit->second) ) {                continue;            }            CAnnotObject_Ref annot_ref(annot_info);            if (!cvt  &&  annot_info.GetMultiIdFlags()) {                // Create self-conversion, add to conversion set                CRef<CSeq_loc_Conversion> cvt_ref                    (new CSeq_loc_Conversion(id, m_Scope));                if (x_AddObjectMapping(annot_ref,                    &*cvt_ref, aoit->second.m_AnnotLocationIndex)) {                    return;                }            }            else {                if (cvt  &&  !annot_ref.IsAlign() ) {                    cvt->Convert                        (annot_ref,                         m_Selector.m_FeatProduct ?                         CSeq_loc_Conversion::eProduct :                         CSeq_loc_Conversion::eLocation);                }                else {                    annot_ref.SetAnnotObjectRange(aoit->first,                                                  m_Selector.m_FeatProduct);                }                if ( x_AddObject(annot_ref, cvt,                    aoit->second.m_AnnotLocationIndex) ) {                    return;                }            }        }    }}bool CAnnot_Collector::x_Search(const CHandleRangeMap& loc,                                   CSeq_loc_Conversion* cvt){    bool found = false;    ITERATE ( CHandleRangeMap, idit, loc ) {        if ( idit->second.Empty() ) {            continue;        }        bool have_main = false;        CConstRef<CSynonymsSet> syns = m_Scope->GetSynonyms(idit->first);        if ( !syns ) {            if (m_Selector.m_IdResolving == SAnnotSelector::eFailUnresolved) {                NCBI_THROW(CAnnotException, eFindFailed,                           "Cannot find id synonyms");            }        }        else {            ITERATE ( CSynonymsSet, synit, *syns ) {                CSeq_id_Handle idh = CSynonymsSet::GetSeq_id_Handle(synit);                if ( !have_main ) {                    have_main = idit->first == idh;                }                found = x_Search(idh, CSynonymsSet::GetBioseqHandle(synit),                                 idit->second, cvt)  ||  found;            }        }        if ( !have_main ) {            found = x_Search(idit->first, CBioseq_Handle(),                             idit->second, cvt)  ||  found;        }    }    return found;}void CAnnot_Collector::x_SearchAll(void){    _ASSERT(m_Selector.m_LimitObjectType != SAnnotSelector::eLimit_None);    _ASSERT(m_Selector.m_LimitObject);    _ASSERT(m_MappingCollector->m_LimitObjectInfo);    if ( m_TSE_LockSet.empty() ) {        // data source name not matched        return;    }    switch ( m_Selector.m_LimitObjectType ) {    case SAnnotSelector::eLimit_TSE_Info:        x_SearchAll(*CTypeConverter<CTSE_Info>::                    SafeCast(m_MappingCollector->                    m_LimitObjectInfo.GetPointer()));        break;    case SAnnotSelector::eLimit_Seq_entry_Info:        x_SearchAll(*CTypeConverter<CSeq_entry_Info>::                    SafeCast(m_MappingCollector->                    m_LimitObjectInfo.GetPointer()));        break;    case SAnnotSelector::eLimit_Seq_annot_Info:        x_SearchAll(*CTypeConverter<CSeq_annot_Info>::                    SafeCast(m_MappingCollector->                    m_LimitObjectInfo.GetPointer()));        break;    default:        // no limit object -> do nothing        break;    }}void CAnnot_Collector::x_SearchAll(const CSeq_entry_Info& entry_info){    {{        CConstRef<CBioseq_Base_Info> base = entry_info.m_Contents;        // Collect all annotations from the entry        ITERATE( CBioseq_Base_Info::TAnnot, ait, base->GetAnnot() ) {            x_SearchAll(**ait);            if ( x_GetAnnotCount() >= m_Selector.m_MaxSize )                return;        }    }}    if ( entry_info.IsSet() ) {        CConstRef<CBioseq_set_Info> set(&entry_info.GetSet());        // Collect annotations from all children        ITERATE( CBioseq_set_Info::TSeq_set, cit, set->GetSeq_set() ) {            x_SearchAll(**cit);            if ( x_GetAnnotCount() >= m_Selector.m_MaxSize )                return;        }    }}void CAnnot_Collector::x_SearchAll(const CSeq_annot_Info& annot_info){    // Collect all annotations from the annot    ITERATE ( SAnnotObjects_Info::TObjectInfos, aoit,              annot_info.m_ObjectInfos.GetInfos() ) {        if ( !m_Selector.MatchType(*aoit) ) {            continue;        }        CAnnotObject_Ref annot_ref(*aoit);        if ( x_AddObject(annot_ref) ) {            return;        }    }    if ( x_NeedSNPs() && annot_info.x_HasSNP_annot_Info() ) {        const CSeq_annot_SNP_Info& snp_annot =            annot_info.x_GetSNP_annot_Info();        TSeqPos index = 0;        ITERATE ( CSeq_annot_SNP_Info, snp_it, snp_annot ) {            const SSNP_Info& snp = *snp_it;            CAnnotObject_Ref annot_ref(snp_annot, index);            annot_ref.SetSNP_Point(snp, 0);            if ( x_AddObject(annot_ref) ) {                return;            }            ++index;        }    }}bool CAnnot_Collector::x_SearchMapped(const CSeqMap_CI& seg,                                      CSeq_loc& master_loc_empty,                                      const CSeq_id_Handle& master_id,                                      const CHandleRange& master_hr){    CHandleRange::TOpenRange master_seg_range(seg.GetPosition(),                                              seg.GetEndPosition());    CHandleRange::TOpenRange ref_seg_range(seg.GetRefPosition(),                                           seg.GetRefEndPosition());    bool reversed = seg.GetRefMinusStrand();    TSignedSeqPos shift;    if ( !reversed ) {        shift = ref_seg_range.GetFrom() - master_seg_range.GetFrom();    }    else {        shift = ref_seg_range.GetTo() + master_seg_range.GetFrom();    }    CSeq_id_Handle ref_id = seg.GetRefSeqid();    CHandleRangeMap ref_loc;    {{ // translate master_loc to ref_loc        CHandleRange& hr = ref_loc.AddRanges(ref_id);        ITERATE ( CHandleRange, mlit, master_hr ) {            CHandleRange::TOpenRange range =                master_seg_range.IntersectionWith(mlit->first);            if ( !range.Empty() ) {                ENa_strand strand = mlit->second;                if ( !reversed ) {                    range.SetOpen(range.GetFrom() + shift,                                  range.GetToOpen() + shift);                }                else {                    strand = Reverse(strand);                    range.Set(shift - range.GetTo(), shift - range.GetFrom());                }                hr.AddRange(range, strand);            }        }        if ( hr.Empty() )            return false;    }}    if (m_Selector.m_NoMapping) {        return x_Search(ref_loc, 0);    }    else {        CRef<CSeq_loc_Conversion> cvt(new CSeq_loc_Conversion(master_loc_empty,                                                              master_id,                                                              seg,                                                              ref_id,                                                              m_Scope));        return x_Search(ref_loc, &*cvt);    }}END_SCOPE(objects)END_NCBI_SCOPE/** ---------------------------------------------------------------------------* $Log: annot_collector.cpp,v $* Revision 1000.3  2004/06/01 19:22:32  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7** Revision 1.7  2004/05/26 14:29:20  grichenk* Redesigned CSeq_align_Mapper: preserve non-mapping intervals,* fixed strands handling, improved performance.** Revision 1.6  2004/05/21 21:42:12  gorelenk* Added PCH ncbi_pch.hpp** Revision 1.5  2004/05/10 18:26:37  grichenk* Fixed 'not used' warnings** Revision 1.4  2004/05/03 17:01:03  grichenk* Invalidate total range before reusing seq-loc.** Revision 1.3  2004/04/13 21:14:27  vasilche* Fixed wrong order of object deletion causing "tse is locked" error.** Revision 1.2  2004/04/13 15:59:35  grichenk* Added CScope::GetBioseqHandle() with id resolving flag.** Revision 1.1  2004/04/05 15:54:26  grichenk* Initial revision*** ===========================================================================*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?