splign_simple.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:8k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: splign_simple.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 18:13:03  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: splign_simple.cpp,v 1000.0 2004/06/01 18:13:03 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author: Philip Johnson
  35. *
  36. * File Description:
  37. *   CSplignSimple -- simple wrapper to splign that uses BLAST & the object
  38. *   manager
  39. *
  40. * ---------------------------------------------------------------------------
  41. */
  42. #include <ncbi_pch.hpp>
  43. #include <algo/align/splign/splign_simple.hpp>
  44. #include <algo/align/splign/splign_formatter.hpp>
  45. #include <algo/align/nw_spliced_aligner16.hpp>
  46. #include <algo/align/align_exception.hpp>
  47. #include <objects/seqloc/Seq_loc.hpp>
  48. #include <objects/seqalign/Seq_align.hpp>
  49. #include <objmgr/scope.hpp>
  50. #include <objmgr/bioseq_handle.hpp>
  51. #include <objmgr/seq_vector.hpp>
  52. #include <objmgr/util/sequence.hpp>
  53. #ifdef _DEBUG
  54. #include <serial/serial.hpp>
  55. #include <serial/objostr.hpp>
  56. #endif
  57. BEGIN_NCBI_SCOPE
  58. USING_SCOPE(objects);
  59. class CSplignObjMgrAccessor : public CSplignSeqAccessor {
  60. public:
  61.     CSplignObjMgrAccessor(const CSeq_id &id1, const CSeq_id &id2,
  62.                           CScope& scope) :
  63.         m_Handle1(scope.GetBioseqHandle(id1)),
  64.         m_Handle2(scope.GetBioseqHandle(id2)),
  65.         m_SeqVector1(m_Handle1.GetSeqVector(CBioseq_Handle::eCoding_Iupac)),
  66.         m_SeqVector2(m_Handle2.GetSeqVector(CBioseq_Handle::eCoding_Iupac))
  67.     {
  68.     }
  69.     virtual void Load(const string& id, vector<char> *seq,
  70.                       size_t start, size_t finish)
  71.     {
  72.         if (!seq) {
  73.             NCBI_THROW(CAlgoAlignException, eNotInitialized,
  74.                        "CSplignObjMgrAccessor::Load passed NULL sequence "
  75.                        "pointer.");
  76.         }
  77.         CSeq_id seqId(id);
  78.         CSeqVector *sv = NULL;
  79.         if (m_Handle1.IsSynonym(seqId)  ||
  80.             m_Handle1.GetSeqId()->GetSeqIdString(true) == id) {
  81.             sv = &m_SeqVector1;
  82.         } else if (m_Handle2.IsSynonym(seqId)  ||
  83.                    m_Handle1.GetSeqId()->GetSeqIdString(true) == id) {
  84.             sv = &m_SeqVector2;
  85.         } else {
  86.             NCBI_THROW(CAlgoAlignException, eInternal,
  87.                        "CSplignObjMgrAccessor::Load could not find the proper "
  88.                        "sequence for '"+id+"'.");
  89.         }
  90.         if (finish == kMax_UInt) { //flag to return everything
  91.             finish = sv->size() - 1;
  92.         }
  93.         seq->reserve(finish - start + 1);
  94.         for (size_t i = start;  i <= finish;  ++i) {
  95.             seq->push_back((*sv)[i]);
  96.         }
  97.     }
  98. protected:
  99.     CBioseq_Handle m_Handle1;
  100.     CBioseq_Handle m_Handle2;
  101.     CSeqVector m_SeqVector1;
  102.     CSeqVector m_SeqVector2;
  103. };
  104. /*---------------------------------------------------------------------------*/
  105. // PRE : transcript location, genomic location (maximum span), scope in
  106. // which transcript & genomic sequence can be resolved
  107. // POST: blast & splign initialized
  108. CSplignSimple::CSplignSimple(const CSeq_loc &transcript,
  109.                              const CSeq_loc &genomic,
  110.                              CScope& scope) :
  111.     m_Blast(blast::SSeqLoc(transcript, scope),
  112.             blast::SSeqLoc(genomic, scope), blast::eMegablast),
  113.     m_TranscriptId(&sequence::GetId(transcript)),
  114.     m_GenomicId   (&sequence::GetId(genomic))
  115. {
  116.     CRef<CSplicedAligner> aligner(new CSplicedAligner16);
  117.     CRef<CSplignSeqAccessor> accessor
  118.         (new CSplignObjMgrAccessor(*m_TranscriptId, *m_GenomicId, scope));
  119.     m_Splign.SetAligner(aligner);
  120.     m_Splign.SetSeqAccessor(accessor);
  121. }
  122. /*---------------------------------------------------------------------------*/
  123. // PRE : splign & blast objects initialized
  124. // POST: split results
  125. const CSplign::TResults& CSplignSimple::Run(void)
  126. {
  127.     string res;
  128.     blast::TSeqAlignVector blastRes(m_Blast.Run());
  129.     if (!blastRes.empty()  &&
  130.         blastRes.front().NotEmpty()  &&
  131.         !blastRes.front()->Get().empty()  &&
  132.         !blastRes.front()->Get().front()->GetSegs().GetDisc().Get().empty()) {
  133.         
  134.         CSplign::THits hits;
  135.         const CSeq_align_set::Tdata &sas =
  136.             blastRes.front()->Get().front()->GetSegs().GetDisc().Get();
  137.         ITERATE(CSeq_align_set::Tdata, saI, sas) {
  138.             hits.push_back(CHit(**saI));
  139.         }
  140.         m_Splign.Run(&hits);
  141.         const CSplign::TResults &splignRes = m_Splign.GetResult();        
  142.         ITERATE(CSplign::TResults, resI, splignRes) {
  143.             if (resI->m_error) {
  144.                 NCBI_THROW(CException, eUnknown, resI->m_msg);
  145.             }
  146.         }
  147.     }
  148.     return m_Splign.GetResult();
  149. }
  150. /*---------------------------------------------------------------------------*/
  151. // PRE : splign run
  152. // POST: splign results (if any) as Seq_align_set
  153. CRef<CSeq_align_set> CSplignSimple::GetResultsAsAln(void) const
  154. {
  155.     CRef<CSeq_align_set> sas(CSplignFormatter(m_Splign).AsSeqAlignSet());
  156.     CRef<CSeq_id> si;
  157.     NON_CONST_ITERATE (CSeq_align_set::Tdata, compartmentI, sas->Set()) {
  158.         NON_CONST_ITERATE (CSeq_align_set::Tdata, saI,
  159.                            (*compartmentI)->SetSegs().SetDisc().Set()) {
  160.             CDense_seg &ds = (*saI)->SetSegs().SetDenseg();
  161.             ds.SetIds().clear();
  162.             si = new CSeq_id;
  163.             si->Assign(*m_TranscriptId);
  164.             ds.SetIds().push_back(si);
  165.             si = new CSeq_id;
  166.             si->Assign(*m_GenomicId);
  167.             ds.SetIds().push_back(si);
  168.         }
  169.     }
  170.     return sas;
  171. }
  172. END_NCBI_SCOPE
  173. /*===========================================================================
  174. * $Log: splign_simple.cpp,v $
  175. * Revision 1000.0  2004/06/01 18:13:03  gouriano
  176. * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.6
  177. *
  178. * Revision 1.6  2004/05/24 16:13:57  gorelenk
  179. * Added PCH ncbi_pch.hpp
  180. *
  181. * Revision 1.5  2004/05/17 14:50:57  kapustin
  182. * Add/remove/rearrange some includes and object declarations
  183. *
  184. * Revision 1.4  2004/05/12 16:59:13  johnson
  185. * CSplignObjMgrAccessor falls back to id strings if IsSynonym fails
  186. *
  187. * Revision 1.3  2004/05/04 19:39:35  johnson
  188. * return correct seq-ids in seq-align
  189. *
  190. * Revision 1.2  2004/05/04 15:23:45  ucko
  191. * Split splign code out of xalgoalign into new xalgosplign.
  192. *
  193. * Revision 1.1  2004/05/03 15:39:11  johnson
  194. * initial revision
  195. *
  196. * ===========================================================================
  197. */