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 + -
显示快捷键?