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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnmix.hpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:38:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.38
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef OBJECTS_ALNMGR___ALNMIX__HPP
  10. #define OBJECTS_ALNMGR___ALNMIX__HPP
  11. /*  $Id: alnmix.hpp,v 1000.3 2004/06/01 19:38:16 gouriano Exp $
  12. * ===========================================================================
  13. *
  14. *                            PUBLIC DOMAIN NOTICE
  15. *               National Center for Biotechnology Information
  16. *
  17. *  This software/database is a "United States Government Work" under the
  18. *  terms of the United States Copyright Act.  It was written as part of
  19. *  the author's official duties as a United States Government employee and
  20. *  thus cannot be copyrighted.  This software/database is freely available
  21. *  to the public for use. The National Library of Medicine and the U.S.
  22. *  Government have not placed any restriction on its use or reproduction.
  23. *
  24. *  Although all reasonable efforts have been taken to ensure the accuracy
  25. *  and reliability of the software and data, the NLM and the U.S.
  26. *  Government do not and cannot warrant the performance or results that
  27. *  may be obtained by using this software or data. The NLM and the U.S.
  28. *  Government disclaim all warranties, express or implied, including
  29. *  warranties of performance, merchantability or fitness for any particular
  30. *  purpose.
  31. *
  32. *  Please cite the author in any work or product based on this material.
  33. *
  34. * ===========================================================================
  35. *
  36. * Author:  Kamen Todorov, NCBI
  37. *
  38. * File Description:
  39. *   Alignment merger
  40. *
  41. */
  42. #include <objtools/alnmgr/alnvec.hpp>
  43. #include <objects/seqalign/Seq_align.hpp>
  44. #include <serial/iterator.hpp>
  45. BEGIN_NCBI_SCOPE
  46. BEGIN_objects_SCOPE // namespace ncbi::objects::
  47. // forward declarations
  48. class CScope;
  49. class CSeq_id;
  50. class CAlnMixSegment;
  51. class CAlnMixSeq;
  52. class CAlnMixMatch;
  53. class NCBI_XALNMGR_EXPORT CAlnMix : public CSeq_align::SSeqIdChooser
  54. // Note that SSeqIdChooser derives from CObject, so CAlnMix *is* also a CObject.
  55. {
  56. public:
  57.     // constructor
  58.     CAlnMix(void);
  59.     CAlnMix(CScope& scope);
  60.     // destructor
  61.     ~CAlnMix(void);
  62.     enum EAddFlags {
  63.         // ObjMgr is used to identify sequences and obtain a bioseqhandle.
  64.         // Also used to calc scores and determine the type of molecule
  65.         fDontUseObjMgr        = 0x01,
  66.         // Determine score of each aligned segment in the process of mixing
  67.         // (can only be set in addition to fUseObjMgr)
  68.         fCalcScore            = 0x02,
  69.         // Force translation of nucleotide rows
  70.         // This will result in an output Dense-seg that has Widths,
  71.         // no matter if the whole alignment consists of nucleotides only.
  72.         fForceTranslation     = 0x0200
  73.     };
  74.     typedef int TAddFlags; // binary OR of EMergeFlags
  75.     void Add(const CDense_seg& ds, TAddFlags flags = 0);
  76.     void Add(const CSeq_align& aln, TAddFlags flags = 0);
  77.     enum EMergeFlags {
  78.         fGen2EST              = 0x0001, // otherwise Nucl2Nucl
  79.         fTruncateOverlaps     = 0x0002, // otherwise put on separate rows
  80.         fNegativeStrand       = 0x0004,
  81.         fTryOtherMethodOnFail = 0x0008,
  82.         fGapJoin              = 0x0010, // join equal len segs gapped on refseq
  83.         fMinGap               = 0x0020, // minimize segs gapped on refseq
  84.         fSortSeqsByScore      = 0x0040, // Seqs with better scoring aligns on top
  85.         fQuerySeqMergeOnly    = 0x0080, // Only put the query seq on same row, 
  86.                                         // other seqs from diff densegs go to diff rows
  87.         fFillUnalignedRegions = 0x0100
  88.     };
  89.     typedef int TMergeFlags; // binary OR of EMergeFlags
  90.     void Merge(TMergeFlags flags = 0);
  91.     typedef vector<CConstRef<CDense_seg> >         TConstDSs;
  92.     typedef vector<CConstRef<CSeq_align> >         TConstAlns;
  93.     CScope&            GetScope         (void) const;
  94.     const TConstDSs&   GetInputDensegs  (void) const;
  95.     const TConstAlns&  GetInputSeqAligns(void) const;
  96.     const CDense_seg&  GetDenseg        (void) const;
  97.     const CSeq_align&  GetSeqAlign      (void) const;
  98. private:
  99.     // Prohibit copy constructor and assignment operator
  100.     CAlnMix(const CAlnMix& value);
  101.     CAlnMix& operator=(const CAlnMix& value);
  102.     // CRef<Seq-id> comparison predicate
  103.     struct SSeqIds {
  104.         bool 
  105.         operator() (const CRef<CSeq_id>& id1, const CRef<CSeq_id>& id2) const {
  106.             return (*id1 < *id2);
  107.         }
  108.     };
  109.     typedef map<void *, CConstRef<CDense_seg> >           TConstDSsMap;
  110.     typedef map<void *, CConstRef<CSeq_align> >           TConstAlnsMap;
  111.     typedef vector<CAlnMixSeq*>                           TSeqs;
  112.     typedef map<CBioseq_Handle, CRef<CAlnMixSeq> >        TBioseqHandleMap;
  113.     typedef map<CRef<CSeq_id>, CRef<CAlnMixSeq>, SSeqIds> TSeqIdMap;
  114.     typedef vector<CRef<CAlnMixMatch> >                   TMatches;
  115.     typedef vector<CAlnMixSegment*>                       TSegments;
  116.     typedef vector<CRef<CAlnMixSegment> >                 TSegmentsContainer;
  117.     enum ESecondRowFits {
  118.         eSecondRowFitsOk,
  119.         eForceSeparateRow,
  120.         eInconsistentStrand,
  121.         eInconsistentFrame,
  122.         eFirstRowOverlapBelow,
  123.         eFirstRowOverlapAbove,
  124.         eInconsistentOverlap,
  125.         eSecondRowOverlap,
  126.         eSecondRowInconsistency,
  127.         eIgnoreMatch
  128.     };
  129.     typedef int TSecondRowFits;
  130.     TSecondRowFits x_SecondRowFits(CAlnMixMatch * match) const;
  131.     void x_Reset               (void);
  132.     void x_InitBlosum62Map     (void);
  133.     void x_Merge               (void);
  134.     void x_CreateRowsVector    (void);
  135.     void x_CreateSegmentsVector(void);
  136.     void x_CreateDenseg        (void);
  137.     void x_ConsolidateGaps     (TSegmentsContainer& gapped_segs);
  138.     void x_MinimizeGaps        (TSegmentsContainer& gapped_segs);
  139.     void x_IdentifyAlnMixSeq   (CRef<CAlnMixSeq>& aln_seq, const CSeq_id& seq_id);
  140.     // SChooseSeqId implementation
  141.     virtual void ChooseSeqId(CSeq_id& id1, const CSeq_id& id2);
  142.     CRef<CDense_seg> x_ExtendDSWithWidths(const CDense_seg& ds);
  143.     static bool x_CompareAlnSeqScores  (const CAlnMixSeq* aln_seq1,
  144.                                         const CAlnMixSeq* aln_seq2);
  145.     static bool x_CompareAlnMatchScores(const CRef<CAlnMixMatch>& aln_match1,
  146.                                         const CRef<CAlnMixMatch>& aln_match2);
  147.     static bool x_CompareAlnSegIndexes (const CAlnMixSegment* aln_seg1,
  148.                                         const CAlnMixSegment* aln_seg2);
  149.         
  150.     mutable CRef<CScope>        m_Scope;
  151.     TConstDSs                   m_InputDSs;
  152.     TConstAlns                  m_InputAlns;
  153.     TConstDSsMap                m_InputDSsMap;
  154.     TConstAlnsMap               m_InputAlnsMap;
  155.     CRef<CDense_seg>            m_DS;
  156.     CRef<CSeq_align>            m_Aln;
  157.     TAddFlags                   m_AddFlags;
  158.     TMergeFlags                 m_MergeFlags;
  159.     TSeqs                       m_Seqs;
  160.     TMatches                    m_Matches;
  161.     TSegments                   m_Segments;
  162.     TSeqs                       m_Rows;
  163.     list<CRef<CAlnMixSeq> >     m_ExtraRows;
  164.     bool                        m_SingleRefseq;
  165.     bool                        m_IndependentDSs;
  166.     TBioseqHandleMap            m_BioseqHandles;
  167.     TSeqIdMap                   m_SeqIds;
  168.     bool                        m_ContainsAA;
  169.     bool                        m_ContainsNA;
  170. };
  171. ///////////////////////////////////////////////////////////
  172. ///////////////////// Helper Classes //////////////////////
  173. ///////////////////////////////////////////////////////////
  174. class CAlnMixSegment : public CObject
  175. {
  176. public:
  177.     // TStarts really belongs in CAlnMixSeq, but had to move here as
  178.     // part of a workaround for Compaq's compiler's bogus behavior
  179.     typedef map<TSeqPos, CRef<CAlnMixSegment> > TStarts;
  180.     typedef map<CAlnMixSeq*, TStarts::iterator> TStartIterators;
  181.         
  182.     TSeqPos         m_Len;
  183.     TStartIterators m_StartIts;
  184.     int             m_DSIndex; // used by the truncate algorithm
  185. };
  186. class CAlnMixSeq : public CObject
  187. {
  188. public:
  189.     CAlnMixSeq(void) 
  190.         : m_DS_Count(0),
  191.           m_Score(0),
  192.           m_Width(1),
  193.           m_Frame(-1),
  194.           m_RefBy(0),
  195.           m_ExtraRow(0),
  196.           m_DSIndex(0)
  197.     {};
  198.     typedef CAlnMixSegment::TStarts TStarts;
  199.     typedef list<CAlnMixMatch *>    TMatchList;
  200.     int                   m_DS_Count;
  201.     const CBioseq_Handle* m_BioseqHandle;
  202.     CRef<CSeq_id>         m_SeqId;
  203.     int                   m_Score;
  204.     bool                  m_IsAA;
  205.     int                   m_Width;
  206.     int                   m_Frame;
  207.     bool                  m_PositiveStrand;
  208.     TStarts               m_Starts;
  209.     CAlnMixSeq *          m_RefBy;
  210.     CAlnMixSeq *          m_ExtraRow;
  211.     int                   m_RowIndex;
  212.     int                   m_SeqIndex;
  213.     int                   m_DSIndex;
  214.     TStarts::iterator     m_StartIt;
  215.     TMatchList            m_MatchList;
  216.     CSeqVector& GetSeqVector(void) {
  217.         if ( !m_SeqVector ) {
  218.             m_SeqVector = new CSeqVector
  219.                 (m_BioseqHandle->GetSeqVector(CBioseq_Handle::eCoding_Iupac));
  220.         }
  221.         return *m_SeqVector;
  222.     }
  223. private:
  224.     CRef<CSeqVector> m_SeqVector;
  225. };
  226. class CAlnMixMatch : public CObject
  227. {
  228. public:
  229.     CAlnMixMatch(void)
  230.         : m_Score(0), m_Start1(0), m_Start2(0),
  231.           m_Len(0), m_StrandsDiffer(false), m_DSIndex(0)
  232.     {};
  233.         
  234.     int                              m_Score;
  235.     CAlnMixSeq                       * m_AlnSeq1, * m_AlnSeq2;
  236.     TSeqPos                          m_Start1, m_Start2, m_Len;
  237.     bool                             m_StrandsDiffer;
  238.     int                              m_DSIndex;
  239.     CAlnMixSeq::TMatchList::iterator m_MatchIter1, m_MatchIter2;
  240. };
  241. ///////////////////////////////////////////////////////////
  242. ///////////////////// inline methods //////////////////////
  243. ///////////////////////////////////////////////////////////
  244. inline
  245. CScope& CAlnMix::GetScope() const
  246. {
  247.     return const_cast<CScope&>(*m_Scope);
  248. }
  249. inline
  250. const CAlnMix::TConstDSs& CAlnMix::GetInputDensegs() const
  251. {
  252.     return m_InputDSs;
  253. }
  254. inline
  255. const CAlnMix::TConstAlns& CAlnMix::GetInputSeqAligns() const
  256. {
  257.     return m_InputAlns;
  258. }
  259. inline
  260. const CDense_seg& CAlnMix::GetDenseg() const
  261. {
  262.     if (!m_DS) {
  263.         NCBI_THROW(CAlnException, eMergeFailure,
  264.                    "CAlnMix::GetDenseg(): "
  265.                    "Dense_seg is not available until after Merge()");
  266.     }
  267.     return *m_DS;
  268. }
  269. inline
  270. const CSeq_align& CAlnMix::GetSeqAlign() const
  271. {
  272.     if (!m_Aln) {
  273.         NCBI_THROW(CAlnException, eMergeFailure,
  274.                    "CAlnMix::GetSeqAlign(): "
  275.                    "Seq_align is not available until after Merge()");
  276.     }
  277.     return *m_Aln;
  278. }
  279. ///////////////////////////////////////////////////////////
  280. ////////////////// end of inline methods //////////////////
  281. ///////////////////////////////////////////////////////////
  282. END_objects_SCOPE // namespace ncbi::objects::
  283. END_NCBI_SCOPE
  284. /*
  285. * ===========================================================================
  286. *
  287. * $Log: alnmix.hpp,v $
  288. * Revision 1000.3  2004/06/01 19:38:16  gouriano
  289. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.38
  290. *
  291. * Revision 1.38  2004/05/25 16:00:20  todorov
  292. * remade truncation of overlaps
  293. *
  294. * Revision 1.37  2004/03/30 23:27:32  todorov
  295. * Switch from CAlnMix::x_RankSeqId() to CSeq_id::BestRank()
  296. *
  297. * Revision 1.36  2004/03/15 17:46:03  todorov
  298. * Avoid multiple inheritance since Workshop has problems placing the vtables.
  299. * Now CAlnMix inherits from SSeqIdChooser which inherits from CObject
  300. *
  301. * Revision 1.35  2004/03/09 17:15:46  todorov
  302. * + SSeqIdChooser implementation
  303. *
  304. * Revision 1.34  2003/12/22 18:30:38  todorov
  305. * ObjMgr is no longer created internally. Scope should be passed as a reference in the ctor
  306. *
  307. * Revision 1.33  2003/12/08 21:28:04  todorov
  308. * Forced Translation of Nucleotide Sequences
  309. *
  310. * Revision 1.32  2003/11/03 14:43:52  todorov
  311. * Use CDense_seg::Validate()
  312. *
  313. * Revision 1.31  2003/08/20 19:35:41  todorov
  314. * Added x_ValidateDenseg
  315. *
  316. * Revision 1.30  2003/08/20 15:06:25  todorov
  317. * include path fixed
  318. *
  319. * Revision 1.29  2003/08/20 14:35:14  todorov
  320. * Support for NA2AA Densegs
  321. *
  322. * Revision 1.28  2003/06/26 21:35:53  todorov
  323. * + fFillUnalignedRegions
  324. *
  325. * Revision 1.27  2003/06/25 15:17:26  todorov
  326. * truncation consistent for the whole segment now
  327. *
  328. * Revision 1.26  2003/06/24 15:24:28  todorov
  329. * added optional truncation of overlaps
  330. *
  331. * Revision 1.25  2003/06/09 20:54:12  todorov
  332. * Use of ObjMgr is now optional
  333. *
  334. * Revision 1.24  2003/06/02 16:01:38  dicuccio
  335. * Rearranged include/objects/ subtree.  This includes the following shifts:
  336. *     - include/objects/alnmgr --> include/objtools/alnmgr
  337. *     - include/objects/cddalignview --> include/objtools/cddalignview
  338. *     - include/objects/flat --> include/objtools/flat
  339. *     - include/objects/objmgr/ --> include/objmgr/
  340. *     - include/objects/util/ --> include/objmgr/util/
  341. *     - include/objects/validator --> include/objtools/validator
  342. *
  343. * Revision 1.23  2003/05/30 17:42:45  todorov
  344. * x_CreateSegmentsVector now uses a stack to order the segs
  345. *
  346. * Revision 1.22  2003/05/09 16:41:46  todorov
  347. * Optional mixing of the query sequence only
  348. *
  349. * Revision 1.21  2003/03/28 16:47:22  todorov
  350. * Introduced TAddFlags (fCalcScore for now)
  351. *
  352. * Revision 1.20  2003/03/26 16:38:31  todorov
  353. * mix independent densegs
  354. *
  355. * Revision 1.19  2003/03/10 22:12:10  todorov
  356. * fixed x_CompareAlnMatchScores callback
  357. *
  358. * Revision 1.18  2003/03/05 17:42:28  todorov
  359. * Allowing multiple mixes + general case speed optimization
  360. *
  361. * Revision 1.17  2003/02/11 21:32:37  todorov
  362. * fMinGap optional merging algorithm
  363. *
  364. * Revision 1.16  2003/01/23 16:30:36  todorov
  365. * Moved calc score to alnvec
  366. *
  367. * Revision 1.15  2003/01/22 20:13:02  vasilche
  368. * Changed use of CBioseqHandle::GetSeqVector() method.
  369. *
  370. * Revision 1.14  2003/01/10 00:42:42  todorov
  371. * Optional sorting of seqs by score
  372. *
  373. * Revision 1.13  2003/01/02 16:39:57  todorov
  374. * Added accessors to the input data
  375. *
  376. * Revision 1.12  2002/12/26 12:38:08  dicuccio
  377. * Added Win32 export specifiers
  378. *
  379. * Revision 1.11  2002/12/24 16:20:57  todorov
  380. * Fixed initializing of a CTypeConstIterator
  381. *
  382. * Revision 1.10  2002/12/23 18:03:41  todorov
  383. * Support for putting in and getting out Seq-aligns
  384. *
  385. * Revision 1.9  2002/12/19 15:09:07  ucko
  386. * Reorder some definitions to make Compaq's C++ compiler happy.
  387. *
  388. * Revision 1.8  2002/12/19 00:06:55  todorov
  389. * Added optional consolidation of segments that are gapped on the query.
  390. *
  391. * Revision 1.7  2002/12/18 03:47:05  todorov
  392. * created an algorithm for mixing alignments that share a single sequence.
  393. *
  394. * Revision 1.6  2002/11/08 19:43:33  grichenk
  395. * CConstRef<> constructor made explicit
  396. *
  397. * Revision 1.5  2002/11/04 21:28:57  grichenk
  398. * Fixed usage of const CRef<> and CRef<> constructor
  399. *
  400. * Revision 1.4  2002/10/25 20:02:20  todorov
  401. * new fTryOtherMethodOnFail flag
  402. *
  403. * Revision 1.3  2002/10/24 21:31:33  todorov
  404. * adding Dense-segs instead of Seq-aligns
  405. *
  406. * Revision 1.2  2002/10/08 18:02:09  todorov
  407. * changed the aln lst input param
  408. *
  409. * Revision 1.1  2002/08/23 14:43:50  ucko
  410. * Add the new C++ alignment manager to the public tree (thanks, Kamen!)
  411. *
  412. *
  413. * ===========================================================================
  414. */
  415. #endif // OBJECTS_ALNMGR___ALNMIX__HPP