seq_loc_mapper.cpp

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

CPP
1,895
字号
            if ( !res ) {                if ( m_KeepNonmapping ) {                    x_PushRangesToDstMix();                    x_GetMappedRanges(                        CSeq_id_Handle::GetHandle(src_pack_pnts.GetId()),                        src_pack_pnts.IsSetStrand() ?                        int(src_pack_pnts.GetStrand()) + 1 : 0)                        .push_back(TRangeWithFuzz(TRange(*i, *i), fuzz));                }                else {                    m_Partial = true;                }            }        }        break;    }    case CSeq_loc::e_Mix:    {        x_PushRangesToDstMix();        CRef<CSeq_loc> prev = m_Dst_loc;        m_Dst_loc.Reset();        const CSeq_loc_mix::Tdata& src_mix = src_loc.GetMix().Get();        ITERATE ( CSeq_loc_mix::Tdata, i, src_mix ) {            x_MapSeq_loc(**i);        }        x_PushRangesToDstMix();        CRef<CSeq_loc> mix = m_Dst_loc;        m_Dst_loc = prev;        x_OptimizeSeq_loc(mix);        x_PushLocToDstMix(mix);        break;    }    case CSeq_loc::e_Equiv:    {        x_PushRangesToDstMix();        CRef<CSeq_loc> prev = m_Dst_loc;        m_Dst_loc.Reset();        const CSeq_loc_equiv::Tdata& src_equiv = src_loc.GetEquiv().Get();        CRef<CSeq_loc> equiv(new CSeq_loc);        equiv->SetEquiv();        ITERATE ( CSeq_loc_equiv::Tdata, i, src_equiv ) {            x_MapSeq_loc(**i);            x_PushRangesToDstMix();            x_OptimizeSeq_loc(m_Dst_loc);            equiv->SetEquiv().Set().push_back(m_Dst_loc);            m_Dst_loc.Reset();        }        m_Dst_loc = prev;        x_PushLocToDstMix(equiv);        break;    }    case CSeq_loc::e_Bond:    {        x_PushRangesToDstMix();        CRef<CSeq_loc> prev = m_Dst_loc;        m_Dst_loc.Reset();        const CSeq_bond& src_bond = src_loc.GetBond();        CRef<CSeq_loc> dst_loc(new CSeq_loc);        dst_loc->SetBond();        CRef<CSeq_loc> pntA;        CRef<CSeq_loc> pntB;        TRangeFuzz fuzzA(kEmptyFuzz, kEmptyFuzz);        if ( src_bond.GetA().IsSetFuzz() ) {            fuzzA.first.Reset(new CInt_fuzz);            fuzzA.first->Assign(src_bond.GetA().GetFuzz());        }        bool resA = x_MapInterval(src_bond.GetA().GetId(),            TRange(src_bond.GetA().GetPoint(), src_bond.GetA().GetPoint()),            src_bond.GetA().IsSetStrand(),            src_bond.GetA().IsSetStrand() ?            src_bond.GetA().GetStrand() : eNa_strand_unknown,            fuzzA);        if ( resA ) {            pntA = x_GetMappedSeq_loc();            _ASSERT(pntA);            if ( !pntA->IsPnt() ) {                NCBI_THROW(CLocMapperException, eBadLocation,                           "Bond point A can not be mapped to a point");            }        }        else {            pntA.Reset(new CSeq_loc);            pntA->SetPnt().Assign(src_bond.GetA());        }        bool resB = false;        if ( src_bond.IsSetB() ) {            TRangeFuzz fuzzB(kEmptyFuzz, kEmptyFuzz);            if ( src_bond.GetB().IsSetFuzz() ) {                fuzzB.first.Reset(new CInt_fuzz);                fuzzB.first->Assign(src_bond.GetB().GetFuzz());            }            resB = x_MapInterval(src_bond.GetB().GetId(),                TRange(src_bond.GetB().GetPoint(), src_bond.GetB().GetPoint()),                src_bond.GetB().IsSetStrand(),                src_bond.GetB().IsSetStrand() ?                src_bond.GetB().GetStrand() : eNa_strand_unknown,                fuzzB);        }        if ( resB ) {            pntB = x_GetMappedSeq_loc();            _ASSERT(pntB);            if ( !pntB->IsPnt() ) {                NCBI_THROW(CLocMapperException, eBadLocation,                           "Bond point B can not be mapped to a point");            }        }        else {            pntB.Reset(new CSeq_loc);            pntB->SetPnt().Assign(src_bond.GetB());        }        m_Dst_loc = prev;        if ( resA  ||  resB  ||  m_KeepNonmapping ) {            CSeq_bond& dst_bond = dst_loc->SetBond();            dst_bond.SetA(pntA->SetPnt());            if ( src_bond.IsSetB() ) {                dst_bond.SetB(pntB->SetPnt());            }            x_PushLocToDstMix(dst_loc);        }        m_Partial |= (!resA || !resB);        break;    }    default:        NCBI_THROW(CAnnotException, eBadLocation,                   "Unsupported location type");    }}CRef<CSeq_loc> CSeq_loc_Mapper::x_RangeToSeq_loc(const CSeq_id_Handle& idh,                                                 TSeqPos from,                                                 TSeqPos to,                                                 int strand_idx,                                                 TRangeFuzz rg_fuzz){    if (m_UseWidth  &&  (m_Widths[idh] & fWidthNucToProt)) {        from = from/3;        to = to/3;    }    CRef<CSeq_loc> loc(new CSeq_loc);    // If both fuzzes are set, create interval, not point.    if (from == to  &&  (!rg_fuzz.first  ||  !rg_fuzz.second)) {        // point        loc->SetPnt().SetId().Assign(*idh.GetSeqId());        loc->SetPnt().SetPoint(from);        if (strand_idx > 0) {            loc->SetPnt().SetStrand(ENa_strand(strand_idx - 1));        }        if ( rg_fuzz.first ) {            loc->SetPnt().SetFuzz(*rg_fuzz.first);        }        else if ( rg_fuzz.second ) {            loc->SetPnt().SetFuzz(*rg_fuzz.second);        }    }    else {        // interval        loc->SetInt().SetId().Assign(*idh.GetSeqId());        loc->SetInt().SetFrom(from);        loc->SetInt().SetTo(to);        if (strand_idx > 0) {            loc->SetInt().SetStrand(ENa_strand(strand_idx - 1));        }        if ( rg_fuzz.first ) {            loc->SetInt().SetFuzz_from(*rg_fuzz.first);        }        if ( rg_fuzz.second ) {            loc->SetInt().SetFuzz_to(*rg_fuzz.second);        }    }    return loc;}void CSeq_loc_Mapper::x_OptimizeSeq_loc(CRef<CSeq_loc>& loc){    if ( !loc ) {        loc.Reset(new CSeq_loc);        loc->SetNull();        return;    }    switch (loc->Which()) {    case CSeq_loc::e_not_set:    case CSeq_loc::e_Feat:    case CSeq_loc::e_Null:    case CSeq_loc::e_Empty:    case CSeq_loc::e_Whole:    case CSeq_loc::e_Int:    case CSeq_loc::e_Pnt:    case CSeq_loc::e_Equiv:    case CSeq_loc::e_Bond:    case CSeq_loc::e_Packed_int:  // pack ?    case CSeq_loc::e_Packed_pnt:  // pack ?        return;    case CSeq_loc::e_Mix:    {        switch ( loc->GetMix().Get().size() ) {        case 0:            loc->SetNull();            break;        case 1:        {            CRef<CSeq_loc> single = *loc->SetMix().Set().begin();            loc = single;            break;        }        default:            break;        }        break;    }    default:        NCBI_THROW(CAnnotException, eBadLocation,                   "Unsupported location type");    }}CRef<CSeq_loc> CSeq_loc_Mapper::x_GetMappedSeq_loc(void){    CRef<CSeq_loc> dst_loc(new CSeq_loc);    CSeq_loc_mix::Tdata& dst_mix = dst_loc->SetMix().Set();    NON_CONST_ITERATE(TRangesById, id_it, m_MappedLocs) {        if ( !id_it->first ) {            if (m_GapFlag == eGapPreserve) {                CRef<CSeq_loc> null_loc(new CSeq_loc);                null_loc->SetNull();                dst_mix.push_back(null_loc);            }            continue;        }        for (int str = 0; str < (int)id_it->second.size(); ++str) {            if (id_it->second[str].size() == 0) {                continue;            }            TSeqPos from = kInvalidSeqPos;            TSeqPos to = kInvalidSeqPos;            TRangeFuzz fuzz(kEmptyFuzz, kEmptyFuzz);            id_it->second[str].sort();            NON_CONST_ITERATE(TMappedRanges, rg_it, id_it->second[str]) {                if ( rg_it->first.Empty() ) {                    // Empty seq-loc                    CRef<CSeq_loc> loc(new CSeq_loc);                    loc->SetEmpty().Assign(*id_it->first.GetSeqId());                    dst_mix.push_back(loc);                    continue;                }                if (to == kInvalidSeqPos) {                    from = rg_it->first.GetFrom();                    to = rg_it->first.GetTo();                    fuzz = rg_it->second;                    continue;                }                if (m_MergeFlag == eMergeAbutting) {                    if (rg_it->first.GetFrom() == to + 1) {                        to = rg_it->first.GetTo();                        fuzz.second = rg_it->second.second;                        continue;                    }                }                if (m_MergeFlag == eMergeAll) {                    if (rg_it->first.GetFrom() <= to + 1) {                        to = rg_it->first.GetTo();                        fuzz.second = rg_it->second.second;                        continue;                    }                }                // Add new interval or point                dst_mix.push_back(x_RangeToSeq_loc(id_it->first, from, to,                    str, fuzz));                from = rg_it->first.GetFrom();                to = rg_it->first.GetTo();                fuzz = rg_it->second;            }            // last interval or point            dst_mix.push_back(x_RangeToSeq_loc(id_it->first, from, to,                str, fuzz));        }    }    m_MappedLocs.clear();    x_OptimizeSeq_loc(dst_loc);    return dst_loc;}CRef<CSeq_align> CSeq_loc_Mapper::x_MapSeq_align(const CSeq_align& src_align){    CSeq_align_Mapper aln_mapper(src_align);    aln_mapper.Convert(*this);    return aln_mapper.GetDstAlign();    /*    ITERATE(TIdMap, id_it, m_IdMap) {        ITERATE(TRangeMap, rg_it, id_it->second) {            aln_mapper.Convert(*rg_it->second,                m_UseWidth ? m_Widths[id_it->first] : 0);        }    }    */}END_SCOPE(objects)END_NCBI_SCOPE/** ---------------------------------------------------------------------------* $Log: seq_loc_mapper.cpp,v $* Revision 1000.1  2004/06/01 19:24:12  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.20** Revision 1.20  2004/05/26 14:29:20  grichenk* Redesigned CSeq_align_Mapper: preserve non-mapping intervals,* fixed strands handling, improved performance.** Revision 1.19  2004/05/21 21:42:13  gorelenk* Added PCH ncbi_pch.hpp** Revision 1.18  2004/05/10 20:22:24  grichenk* Fixed more warnings (removed inlines)** Revision 1.17  2004/05/10 18:26:37  grichenk* Fixed 'not used' warnings** Revision 1.16  2004/05/07 13:53:18  grichenk* Preserve fuzz from original location.* Better detection of partial locations.** Revision 1.15  2004/05/05 14:04:22  grichenk* Use fuzz to indicate truncated intervals. Added KeepNonmapping flag.** Revision 1.14  2004/04/23 15:34:49  grichenk* Added PreserveDestinationLocs().** Revision 1.13  2004/04/12 14:35:59  grichenk* Fixed mapping of alignments between nucleotides and proteins** Revision 1.12  2004/04/06 13:56:33  grichenk* Added possibility to remove gaps (NULLs) from mapped location** Revision 1.11  2004/03/31 20:44:26  grichenk* Fixed warnings about unhandled cases in switch.** Revision 1.10  2004/03/30 21:21:09  grichenk* Reduced number of includes.** Revision 1.9  2004/03/30 17:00:00  grichenk* Fixed warnings, moved inline functions to hpp.** Revision 1.8  2004/03/30 15:42:34  grichenk* Moved alignment mapper to separate file, added alignment mapping* to CSeq_loc_Mapper.** Revision 1.7  2004/03/29 15:13:56  grichenk* Added mapping down to segments of a bioseq or a seqmap.* Fixed: preserve ranges already on the target bioseq(s).** Revision 1.6  2004/03/22 21:10:58  grichenk* Added mapping from segments to master sequence or through a seq-map.** Revision 1.5  2004/03/19 14:19:08  grichenk* Added seq-loc mapping through a seq-align.** Revision 1.4  2004/03/16 15:47:28  vasilche* Added CBioseq_set_Handle and set of EditHandles** Revision 1.3  2004/03/11 18:48:02  shomrat* skip if empty** Revision 1.2  2004/03/11 04:54:48  grichenk* Removed inline** Revision 1.1  2004/03/10 16:22:29  grichenk* Initial revision*** ===========================================================================*/

⌨️ 快捷键说明

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