id_range.cpp

来自「ncbi源码」· C++ 代码 · 共 361 行

CPP
361
字号
/* * =========================================================================== * PRODUCTION $Log: id_range.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 19:25:01  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * PRODUCTION * =========================================================================== *//*  $Id: id_range.cpp,v 1000.2 2004/06/01 19:25:01 gouriano Exp $* ===========================================================================**                            PUBLIC DOMAIN NOTICE*               National Center for Biotechnology Information**  This software/database is a "United States Government Work" under the*  terms of the United States Copyright Act.  It was written as part of*  the author's official duties as a United States Government employee and*  thus cannot be copyrighted.  This software/database is freely available*  to the public for use. The National Library of Medicine and the U.S.*  Government have not placed any restriction on its use or reproduction.**  Although all reasonable efforts have been taken to ensure the accuracy*  and reliability of the software and data, the NLM and the U.S.*  Government do not and cannot warrant the performance or results that*  may be obtained by using this software or data. The NLM and the U.S.*  Government disclaim all warranties, express or implied, including*  warranties of performance, merchantability or fitness for any particular*  purpose.**  Please cite the author in any work or product based on this material.** ===========================================================================** Author:  Eugene Vasilchenko** File Description:*   Utility class for collecting ranges of sequences** ===========================================================================*/#include <ncbi_pch.hpp>#include <objmgr/split/id_range.hpp>#include <objects/seqloc/seqloc__.hpp>#include <objects/seqfeat/Seq_feat.hpp>#include <objects/seqalign/Seq_align.hpp>#include <objects/seqalign/Std_seg.hpp>#include <objects/seqalign/Seq_align_set.hpp>#include <objects/seqalign/Dense_diag.hpp>#include <objects/seqalign/Dense_seg.hpp>#include <objects/seqalign/Packed_seg.hpp>#include <objects/seqres/Seq_graph.hpp>BEGIN_NCBI_SCOPEBEGIN_SCOPE(objects)void COneSeqRange::Add(const COneSeqRange& range){    Add(range.GetTotalRange());}void COneSeqRange::Add(const TRange& range){    m_TotalRange += range;}void COneSeqRange::Add(TSeqPos start, TSeqPos stop_exclusive){    Add(COpenRange<TSeqPos>(start, stop_exclusive));}CSeqsRange::CSeqsRange(void){}CSeqsRange::~CSeqsRange(void){}CNcbiOstream& CSeqsRange::Print(CNcbiOstream& out) const{    ITERATE ( TRanges, it, m_Ranges ) {        if ( it != m_Ranges.begin() ) {            out << ',';        }        TRange range = it->second.GetTotalRange();        out << it->first.AsString();        if ( range != TRange::GetWhole() ) {            out << "(" << range.GetFrom() << "-" << range.GetTo() << ")";        }    }    return out;}CSeq_id_Handle CSeqsRange::GetSingleId(void) const{    CSeq_id_Handle ret;    if ( m_Ranges.size() == 1 ) {        ret = m_Ranges.begin()->first;    }    return ret;}void CSeqsRange::Add(const CSeq_id_Handle& id, const COneSeqRange& loc){    m_Ranges[id].Add(loc);}void CSeqsRange::Add(const CSeqsRange& range){    ITERATE ( CSeqsRange, it, range ) {        m_Ranges[it->first].Add(it->second);    }}void CSeqsRange::Add(const CSeq_loc& loc){    switch ( loc.Which() ) {    case CSeq_loc::e_Whole:        Add(loc.GetWhole());        break;    case CSeq_loc::e_Int:        Add(loc.GetInt());        break;    case CSeq_loc::e_Pnt:        Add(loc.GetPnt());        break;    case CSeq_loc::e_Packed_int:        ITERATE( CPacked_seqint::Tdata, ii, loc.GetPacked_int().Get() ) {            Add(**ii);        }        break;    case CSeq_loc::e_Packed_pnt:        Add(loc.GetPacked_pnt());        break;    case CSeq_loc::e_Mix:        // extract sub-locations        ITERATE ( CSeq_loc_mix::Tdata, li, loc.GetMix().Get() ) {            Add(**li);        }        break;    case CSeq_loc::e_Equiv:        // extract sub-locations        ITERATE ( CSeq_loc_equiv::Tdata, li, loc.GetEquiv().Get() ) {            Add(**li);        }        break;    case CSeq_loc::e_Bond:        Add(loc.GetBond().GetA());        if ( loc.GetBond().IsSetB() ) {            Add(loc.GetBond().GetB());        }        break;    }}void CSeqsRange::Add(const CSeq_id& id){    CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(id);    m_Ranges[idh].Add(TRange::GetWhole());}void CSeqsRange::Add(const CSeq_point& p){    CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(p.GetId());    m_Ranges[idh].Add(p.GetPoint(), p.GetPoint()+1);}void CSeqsRange::Add(const CSeq_interval& i){    CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(i.GetId());    m_Ranges[idh].Add(i.GetFrom(), i.GetTo()+1);}void CSeqsRange::Add(const CPacked_seqpnt& pp){    CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(pp.GetId());    COneSeqRange& range = m_Ranges[idh];    ITERATE ( CPacked_seqpnt::TPoints, pi, pp.GetPoints() ) {        range.Add(*pi, *pi+1);    }}void CSeqsRange::Add(const CSeq_feat& obj){    Add(obj.GetLocation());    if ( obj.IsSetProduct() ) {        Add(obj.GetProduct());    }}void CSeqsRange::Add(const CSeq_align& obj){    const CSeq_align::C_Segs& segs = obj.GetSegs();    switch ( segs.Which() ) {    case CSeq_align::C_Segs::e_Dendiag:        ITERATE ( CSeq_align::C_Segs::TDendiag, it, segs.GetDendiag() ) {            Add(**it);        }        break;    case CSeq_align::C_Segs::e_Denseg:        Add(segs.GetDenseg());        break;    case CSeq_align::C_Segs::e_Std:        ITERATE ( CSeq_align::C_Segs::TStd, it, segs.GetStd() ) {            ITERATE ( CStd_seg::TLoc, it_loc, (*it)->GetLoc() ) {                Add(**it_loc);            }        }        break;    case CSeq_align::C_Segs::e_Packed:        Add(segs.GetPacked());        break;    case CSeq_align::C_Segs::e_Disc:        ITERATE ( CSeq_align_set::Tdata, it, segs.GetDisc().Get() ) {            Add(**it);        }        break;    }}void CSeqsRange::Add(const CDense_seg& denseg){    size_t dim    = denseg.GetDim();    size_t numseg = denseg.GetNumseg();    // claimed dimension may not be accurate :-/    if ( numseg != denseg.GetLens().size() ) {        ERR_POST(Warning << "Invalid 'lens' size in denseg");        numseg = min(numseg, denseg.GetLens().size());    }    if ( dim != denseg.GetIds().size() ) {        ERR_POST(Warning << "Invalid 'ids' size in denseg");        dim = min(dim, denseg.GetIds().size());    }    if ( dim*numseg != denseg.GetStarts().size() ) {        ERR_POST(Warning << "Invalid 'starts' size in denseg");        dim = min(dim*numseg, denseg.GetStarts().size()) / numseg;    }    CDense_seg::TStarts::const_iterator it_start = denseg.GetStarts().begin();    CDense_seg::TLens::const_iterator it_len = denseg.GetLens().begin();    for ( size_t seg = 0;  seg < numseg;  seg++, ++it_len) {        CDense_seg::TIds::const_iterator it_id = denseg.GetIds().begin();        for ( size_t seq = 0;  seq < dim;  seq++, ++it_start, ++it_id) {            if ( *it_start >= 0 ) {                CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(**it_id);                m_Ranges[idh].Add(*it_start, *it_start + *it_len);            }        }    }}void CSeqsRange::Add(const CDense_diag& diag){    size_t dim = diag.GetDim();    if ( dim != diag.GetIds().size() ) {        ERR_POST(Warning << "Invalid 'ids' size in dendiag");        dim = min(dim, diag.GetIds().size());    }    if ( dim != diag.GetStarts().size() ) {        ERR_POST(Warning << "Invalid 'starts' size in dendiag");        dim = min(dim, diag.GetStarts().size());    }    TSeqPos len = diag.GetLen();    CDense_diag::TStarts::const_iterator it_start = diag.GetStarts().begin();    ITERATE ( CDense_diag::TIds, it_id, diag.GetIds() ) {        CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(**it_id);        m_Ranges[idh].Add(*it_start, *it_start + len);        ++it_start;    }}void CSeqsRange::Add(const CPacked_seg& packed){    size_t dim    = packed.GetDim();    size_t numseg = packed.GetNumseg();    // claimed dimension may not be accurate :-/    if ( dim * numseg > packed.GetStarts().size() ) {        dim = packed.GetStarts().size() / numseg;    }    if ( dim * numseg > packed.GetPresent().size() ) {        dim = packed.GetPresent().size() / numseg;    }    if ( dim > packed.GetLens().size() ) {        dim = packed.GetLens().size();    }    CPacked_seg::TStarts::const_iterator it_start = packed.GetStarts().begin();    CPacked_seg::TLens::const_iterator it_len = packed.GetLens().begin();    CPacked_seg::TPresent::const_iterator it_pres= packed.GetPresent().begin();    for ( size_t seg = 0;  seg < numseg;  seg++, ++it_len ) {        CPacked_seg::TIds::const_iterator it_id = packed.GetIds().begin();        for ( size_t seq = 0;  seq < dim;  seq++, ++it_pres) {            if ( *it_pres ) {                CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(**it_id);                m_Ranges[idh].Add(*it_start, *it_start + *it_len);                ++it_id;                ++it_start;            }        }    }}void CSeqsRange::Add(const CSeq_graph& obj){    Add(obj.GetLoc());}END_SCOPE(objects)END_NCBI_SCOPE/** ---------------------------------------------------------------------------* $Log: id_range.cpp,v $* Revision 1000.2  2004/06/01 19:25:01  gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6** Revision 1.6  2004/05/21 21:42:14  gorelenk* Added PCH ncbi_pch.hpp** Revision 1.5  2004/01/07 17:36:27  vasilche* Moved id2_split headers to include/objmgr/split.* Fixed include path to genbank.** Revision 1.4  2003/12/01 18:37:10  vasilche* Separate different annotation types in split info to reduce memory usage.** Revision 1.3  2003/11/26 23:04:59  vasilche* Removed extra semicolons after BEGIN_SCOPE and END_SCOPE.** Revision 1.2  2003/11/26 17:56:02  vasilche* Implemented ID2 split in ID1 cache.* Fixed loading of splitted annotations.** Revision 1.1  2003/11/12 16:18:30  vasilche* First implementation of ID2 blob splitter withing cache.** ===========================================================================*/

⌨️ 快捷键说明

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