hit_matrix_ds.cpp
来自「ncbi源码」· C++ 代码 · 共 282 行
CPP
282 行
/* * =========================================================================== * PRODUCTION $Log: hit_matrix_ds.cpp,v $ * PRODUCTION Revision 1000.3 2004/06/01 21:10:54 gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * PRODUCTION * =========================================================================== *//* $Id: hit_matrix_ds.cpp,v 1000.3 2004/06/01 21:10:54 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. * * =========================================================================== * * Authors: Andrey Yazhuk * * File Description: * */#include <ncbi_pch.hpp>#include <gui/widgets/hit_matrix/hit_matrix_ds.hpp>#include <objects/seqalign/Seq_align.hpp>#include <objects/seqalign/Seq_align_set.hpp>#include <objects/seqalign/Dense_seg.hpp>#include <algorithm>BEGIN_NCBI_SCOPEUSING_SCOPE(ncbi::objects);struct FEqualSeqId{ FEqualSeqId(const CSeq_id& id) : m_Id(id) {} FEqualSeqId(const CRef<CSeq_id>& id) : m_Id(*id) {} bool operator()(CConstRef<CSeq_id> id) { return id->Equals(m_Id); } bool operator()(CRef<CSeq_id> id) { return id->Equals(m_Id); }protected: const CSeq_id& m_Id;};CHitMatrixDataSource::CHitMatrixDataSource(const CSeq_annot& annot, CScope& scope){ m_Annot = &annot; m_Scope = &scope; CTypeConstIterator<CSeq_align> it(ConstBegin(*m_Annot)); x_Init(it);}CHitMatrixDataSource::CHitMatrixDataSource(const CSeq_align_set& aset, CScope& scope){ m_Set = &aset; m_Scope = &scope; CTypeConstIterator<CSeq_align> it(ConstBegin(*m_Set)); x_Init(it);}CHitMatrixDataSource::~CHitMatrixDataSource(){}void CHitMatrixDataSource::x_Init(CTypeConstIterator<CSeq_align>& it){ m_QueryHitsRange.Set(0, 0); m_SubjectHitsRange.Set(0, 0); // iterate through all terminal seq-aligns and build list of seq_ids for( ; it; ++it) { const CSeq_align& align = *it; // terminal CSeq_align if(align.CanGetSegs() && align.GetSegs().IsDenseg()) { const CDense_seg& denseg = align.GetSegs().GetDenseg(); if(m_SeqIds.size() == 0) { // first seq-align - fill m_ScoreIds const CSeq_align::TScore& scores = align.GetScore(); ITERATE(CSeq_align::TScore , itSc, scores) { if((*itSc)->CanGetId()) { const CObject_id& id = (*itSc)->GetId(); m_ScoreIds.push_back(&id); } } } _ASSERT(denseg.CanGetIds()); const CDense_seg::TIds& v_ids = denseg.GetIds(); // iterate by IDs in denseg ITERATE(CDense_seg::TIds, itID, v_ids) { FEqualSeqId EqualID(*itID); TIdRefCont::const_iterator itS = find_if(m_SeqIds.begin(), m_SeqIds.end(), EqualID); if(itS == m_SeqIds.end()) { // not found - this is a new one m_SeqIds.push_back(TIdRef(*itID)); } } } } //for}const CHitMatrixDataSource::TIdRefCont& CHitMatrixDataSource::GetSeqIDs(){ return m_SeqIds;}/// selects query and subject from the set of available sequencesbool CHitMatrixDataSource::SelectIds(const TIdRef& q_id, const TIdRef& s_id){ cout << "\nCHitMatrixDataSource::SelectIds"; bool b_first = true; m_QueryHitsRange.Set(0, 0); m_SubjectHitsRange.Set(0, 0); // check that both ids exist in data FEqualSeqId FindQ(q_id.GetObject()); FEqualSeqId FindS(s_id.GetObject()); TIdRefCont::const_iterator itQuery = find_if(m_SeqIds.begin(), m_SeqIds.end(), FindQ); TIdRefCont::const_iterator itSubject = find_if(m_SeqIds.begin(), m_SeqIds.end(), FindS); bool b_ok = itQuery != m_SeqIds.end() && itSubject != m_SeqIds.end(); if(b_ok) { // iterate though seq_aligns and create Hit Adapters m_QueryID = q_id; m_SubjectID = s_id; m_HitAdapters.clear(); CTypeConstIterator<CSeq_align> it = m_Annot.NotEmpty() ? ConstBegin(*m_Annot) : ConstBegin(*m_Set); // iterate by all seq_aligns for( ; it; ++it) { const CSeq_align& align = *it; if(align.GetType() == CSeq_align_Base::eType_partial) { _ASSERT(align.CanGetSegs()); const CDense_seg& denseg = align.GetSegs().GetDenseg(); // find S and Q Ids in denseseg const CDense_seg::TIds& v_ids = denseg.GetIds(); // looking for query Id CDense_seg::TIds::const_iterator itQ = find_if(v_ids.begin(), v_ids.end(), FindQ); if(itQ != v_ids.end()) { // found Query CDense_seg::TIds::const_iterator itS = find_if(v_ids.begin(), v_ids.end(), FindS); if(itS != v_ids.end()) { int q_index = itQ - v_ids.begin(); int s_index = itS - v_ids.begin(); TSeqRange q_r = denseg.GetSeqRange(q_index); if(q_r.GetFrom() > q_r.GetTo()) { q_r.Set(q_r.GetTo(), q_r.GetFrom()); } TSeqRange s_r = denseg.GetSeqRange(s_index); if(s_r.GetFrom() > s_r.GetTo()) { s_r.Set(s_r.GetTo(), s_r.GetFrom()); } if(b_first) { m_QueryHitsRange = q_r; m_SubjectHitsRange = s_r; b_first = false; } else { m_QueryHitsRange += q_r; m_SubjectHitsRange += s_r; } m_HitAdapters.push_back( CHitDataAdapter(align, denseg, q_index, s_index) ); } } } } } return b_ok; }CScope& CHitMatrixDataSource::GetScope(){ return m_Scope.GetObject();}CHitMatrixDataSource::TIdRef CHitMatrixDataSource::GetQueryId() const{ return m_QueryID;}CHitMatrixDataSource::TIdRef CHitMatrixDataSource::GetSubjectId() const{ return m_SubjectID;}CBioseq_Handle CHitMatrixDataSource::GetQueryHandle(){ return m_Scope->GetBioseqHandle(m_QueryID.GetObject());}CBioseq_Handle CHitMatrixDataSource::GetSubjectHandle(){ return m_Scope->GetBioseqHandle(m_SubjectID.GetObject());}const CHitMatrixDataSource::THitAdapterCont& CHitMatrixDataSource::GetHits() const{ return m_HitAdapters;} int CHitMatrixDataSource::GetScoresCount() const{ return m_ScoreIds.size();}const CObject_id& CHitMatrixDataSource::GetScoreId(size_t index) const{ return *m_ScoreIds[index];}TSeqRange CHitMatrixDataSource::GetQueryHitsRange(){ return m_QueryHitsRange;}TSeqRange CHitMatrixDataSource::GetSubjectHitsRange(){ return m_SubjectHitsRange;}END_NCBI_SCOPE/* * =========================================================================== * $Log: hit_matrix_ds.cpp,v $ * Revision 1000.3 2004/06/01 21:10:54 gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * * Revision 1.6 2004/05/21 22:27:54 gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.5 2004/02/12 21:03:28 yazhuk * Extended x_Init() to support wider variety of alignments; implemented calculation * of hit ranges * * Revision 1.4 2004/01/20 18:22:10 dicuccio * Don't assume that the partial flag is required for proper alignment rendering * * Revision 1.3 2003/12/05 17:39:49 yazhuk * Added construction from CSeq_Annot, changed API to use const refs instead of CRefs * * Revision 1.2 2003/12/01 17:02:04 yazhuk * Seriously redesigned CHitMatrixDataSource * * Revision 1.1 2003/11/17 20:41:19 yazhuk * Initial revision * * =========================================================================== */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?