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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: block_multiple_alignment.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 17:30:52  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.40
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: block_multiple_alignment.hpp,v 1000.2 2004/04/12 17:30:52 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. * Authors:  Paul Thiessen
  35. *
  36. * File Description:
  37. *      Classes to hold alignment data
  38. *
  39. * ===========================================================================
  40. */
  41. #ifndef CN3D_BLOCK_MULTIPLE_ALIGNMENT__HPP
  42. #define CN3D_BLOCK_MULTIPLE_ALIGNMENT__HPP
  43. #include <corelib/ncbistl.hpp>
  44. #include <objects/cdd/Update_align.hpp>
  45. #include <objects/seqalign/Seq_align.hpp>
  46. #include <objalign.h>
  47. #include <blast.h>
  48. #include <blastkar.h>
  49. #include <thrdatd.h>
  50. #include <thrddecl.h>
  51. #include <list>
  52. #include <vector>
  53. #include <map>
  54. #include "vector_math.hpp"
  55. #include "style_manager.hpp"
  56. BEGIN_SCOPE(Cn3D)
  57. class Sequence;
  58. class ConservationColorer;
  59. class AlignmentManager;
  60. class Block;
  61. class UngappedAlignedBlock;
  62. class UnalignedBlock;
  63. class Messenger;
  64. class Threader;
  65. class BlockMultipleAlignment
  66. {
  67. public:
  68.     typedef std::vector < const Sequence * > SequenceList;
  69.     // list will be owned/freed by this object
  70.     BlockMultipleAlignment(SequenceList *sequenceList, AlignmentManager *alnMgr);
  71.     ~BlockMultipleAlignment(void);
  72.     const SequenceList *sequences;
  73.     AlignmentManager *alignmentManager;
  74.     // create a C-object SeqAlign from this alignment (actually a linked list of pairwise
  75.     // SeqAlign's; should be freed with SeqAlignSetFree())
  76.     SeqAlignPtr CreateCSeqAlign(void) const;
  77.     // to track the origin of this alignment if it came from an update
  78.     ncbi::CRef < ncbi::objects::CUpdate_align > updateOrigin;
  79.     // add a new aligned block - will be "owned" and deallocated by BlockMultipleAlignment
  80.     bool AddAlignedBlockAtEnd(UngappedAlignedBlock *newBlock);
  81.     // these two should be called after all aligned blocks have been added; fills out
  82.     // unaligned blocks inbetween aligned blocks (and at ends). Also sets length.
  83.     bool AddUnalignedBlocks(void);
  84.     // Fills out the BlockMap for mapping alignment column -> block+column, special colors,
  85.     // and sets up conservation colors (although they're not calculated until needed).
  86.     bool UpdateBlockMapAndColors(bool clearRowInfo = true);
  87.     // find out if a residue is aligned, by row
  88.     bool IsAligned(int row, int seqIndex) const;
  89.     // find out if a residue is aligned, by Sequence - only works for non-repeated Sequences!
  90.     bool IsAligned(const Sequence *sequence, int seqIndex) const
  91.     {
  92.         int row = GetRowForSequence(sequence);
  93.         if (row < 0) return false;
  94.         return IsAligned(row, seqIndex);
  95.     }
  96.     // stuff regarding master sequence
  97.     const Sequence * GetMaster(void) const { return (*sequences)[0]; }
  98.     bool IsMaster(const Sequence *sequence) const { return (sequence == (*sequences)[0]); }
  99.     // return sequence for given row
  100.     const Sequence * GetSequenceOfRow(int row) const
  101.     {
  102.         if (row >= 0 && row < sequences->size())
  103.             return (*sequences)[row];
  104.         else
  105.             return NULL;
  106.     }
  107.     // given a sequence, return row number in this alignment (or -1 if not found)
  108.     int GetRowForSequence(const Sequence *sequence) const;
  109.     // get a color for an aligned residue that's dependent on the entire alignment
  110.     // (e.g., for coloring by sequence conservation)
  111.     const Vector * GetAlignmentColor(const Sequence *sequence, int seqIndex,
  112.         StyleSettings::eColorScheme colorScheme) const;
  113.     const Vector * GetAlignmentColor(int row, int seqIndex,
  114.         StyleSettings::eColorScheme colorScheme) const;
  115.     // will be used to control padding of unaligned blocks
  116.     enum eUnalignedJustification {
  117.         eLeft,
  118.         eRight,
  119.         eCenter,
  120.         eSplit
  121.     };
  122.     // return alignment position of left side first aligned block (-1 if no aligned blocks)
  123.     int GetFirstAlignedBlockPosition(void) const;
  124.     // makes a new copy of itself
  125.     BlockMultipleAlignment * Clone(void) const;
  126.     // character query interface - "column" must be in alignment range [0 .. totalWidth-1]
  127.     bool GetCharacterTraitsAt(int alignmentColumn, int row, eUnalignedJustification justification,
  128.         char *character, Vector *color, bool *isHighlighted,
  129.         bool *drawBackground, Vector *cellBackgroundColor) const;
  130.     // get sequence and index (if any) at given position, and whether that residue is aligned
  131.     bool GetSequenceAndIndexAt(int alignmentColumn, int row, eUnalignedJustification justification,
  132.         const Sequence **sequence, int *index, bool *isAligned) const;
  133.     // given row and sequence index, return alignment index; not the most efficient function - use sparingly
  134.     int GetAlignmentIndex(int row, int seqIndex, eUnalignedJustification justification);
  135.     // called when user selects some part of a row
  136.     void SelectedRange(int row, int from, int to,
  137.         eUnalignedJustification justification, bool toggle) const;
  138.     // fill in a vector of UngappedAlignedBlocks
  139.     typedef std::vector < const UngappedAlignedBlock * > UngappedAlignedBlockList;
  140.     void GetUngappedAlignedBlocks(UngappedAlignedBlockList *blocks) const;
  141.     // free color storage
  142.     void FreeColors(void);
  143.     // highlight aligned columns based on master indexes (mainly for alignment annotations);
  144.     // returns false if any residue in the range is unaligned (or out of range), true on success
  145.     bool HighlightAlignedColumnsOfMasterRange(int from, int to) const;
  146.     // PSSM for this alignment (cached)
  147.     const BLAST_Matrix * GetPSSM(void) const;
  148.     void RemovePSSM(void) const;
  149.     ///// editing functions /////
  150.     // if in an aligned block, give block column and width of that position; otherwise, -1
  151.     void GetAlignedBlockPosition(int alignmentIndex, int *blockColumn, int *blockWidth) const;
  152.     // get seqIndex of slave aligned to the given master seqIndex; -1 if master residue unaligned
  153.     int GetAlignedSlaveIndex(int masterSeqIndex, int slaveRow) const;
  154.     // returns true if any boundary shift actually occurred
  155.     bool MoveBlockBoundary(int columnFrom, int columnTo);
  156.     // splits a block such that alignmentIndex is the first column of the new block;
  157.     // returns false if no split occurred (e.g. if index is not inside aligned block)
  158.     bool SplitBlock(int alignmentIndex);
  159.     // merges all blocks that overlap specified range - assuming no unaligned blocks
  160.     // in that range. Returns true if any merge(s) occurred, false otherwise.
  161.     bool MergeBlocks(int fromAlignmentIndex, int toAlignmentIndex);
  162.     // creates a block, if given region of an unaligned block in which no gaps
  163.     // are present. Returns true if a block is created.
  164.     bool CreateBlock(int fromAlignmentIndex, int toAlignmentIndex, eUnalignedJustification justification);
  165.     // deletes the block containing this index; returns true if deletion occurred.
  166.     bool DeleteBlock(int alignmentIndex);
  167.     // deletes all blocks; returns true if there were any blocks to delete
  168.     bool DeleteAllBlocks(void);
  169.     // shifts (horizontally) the residues in and immediately surrounding an
  170.     // aligned block; returns true if any shift occurs.
  171.     bool ShiftRow(int row, int fromAlignmentIndex, int toAlignmentIndex, eUnalignedJustification justification);
  172.     // delete a row; returns true if successful
  173.     bool DeleteRow(int row);
  174.     // flag an aligned block for realignment - block will be removed upon ExtractRows; returns true if
  175.     // column is in fact an aligned block
  176.     bool MarkBlock(int column);
  177.     bool ClearMarks(void);  // remove all block flags
  178.     // this function does two things: it extracts from a multiple alignment all slave rows listed for
  179.     // removal; and if pairwiseAlignments!=NULL, for each slave removed creates a new BlockMultipleAlignment
  180.     // that contains the alignment of just that slave with the master, as it was in the original multiple
  181.     // (i.e., not according to the corresponding pre-IBM MasterSlaveAlignment)
  182.     typedef std::list < BlockMultipleAlignment * > AlignmentList;
  183.     bool ExtractRows(const std::vector < int >& slavesToRemove, AlignmentList *pairwiseAlignments);
  184.     // merge in the contents of the given alignment (assuming same master, compatible block structure),
  185.     // addings its rows to the end of this alignment; returns true if merge successful. Does not change
  186.     // block structure - just adds the part of new alignment's aligned blocks that intersect with this
  187.     // object's aligned blocks
  188.     bool MergeAlignment(const BlockMultipleAlignment *newAlignment);
  189.     // turn on/off geometry violations; if param is true, will return # violations found
  190.     int ShowGeometryViolations(bool showGeometryViolations);
  191. private:
  192.     ConservationColorer *conservationColorer;
  193.     mutable BLAST_Matrix *pssm;
  194.     typedef std::list < Block * > BlockList;
  195.     BlockList blocks;
  196.     int totalWidth;
  197.     typedef struct {
  198.         Block *block;
  199.         int blockColumn, alignedBlockNum;
  200.     } BlockInfo;
  201.     typedef std::vector < BlockInfo > BlockMap;
  202.     BlockMap blockMap;
  203.     // to flag blocks for realignment
  204.     typedef std::map < const Block * , bool > MarkBlockMap;
  205.     MarkBlockMap markBlocks;
  206.     bool CheckAlignedBlock(const Block *newBlock) const;
  207.     UnalignedBlock * CreateNewUnalignedBlockBetween(const Block *left, const Block *right);
  208.     Block * GetBlockBefore(const Block *block) const;
  209.     Block * GetBlockAfter(const Block *block) const;
  210.     void InsertBlockBefore(Block *newBlock, const Block *insertAt);
  211.     void InsertBlockAfter(const Block *insertAt, Block *newBlock);
  212.     void RemoveBlock(Block *block);
  213.     // for cacheing of residue->block lookups
  214.     mutable int cachePrevRow;
  215.     mutable const Block *cachePrevBlock;
  216.     mutable BlockList::const_iterator cacheBlockIterator;
  217.     void InitCache(void);
  218.     // given a row and seqIndex, find block that contains that residue
  219.     const Block * GetBlock(int row, int seqIndex) const;
  220.     // intended for volatile storage of row-associated info (e.g. for alignment scores, etc.)
  221.     mutable std::vector < double > rowDoubles;
  222.     mutable std::vector < std::string > rowStrings;
  223.     // for flagging residues (e.g. for geometry violations)
  224.     typedef std::vector < std::vector < bool > > RowSeqIndexFlags;
  225.     RowSeqIndexFlags geometryViolations;
  226.     bool showGeometryViolations;
  227. public:
  228.     // NULL if block before is aligned; if NULL passed, retrieves last block (if unaligned; else NULL)
  229.     const UnalignedBlock * GetUnalignedBlockBefore(const UngappedAlignedBlock *aBlock) const;
  230.     int NBlocks(void) const { return blocks.size(); }
  231.     int NAlignedBlocks(void) const;
  232.     int NRows(void) const { return sequences->size(); }
  233.     int AlignmentWidth(void) const { return totalWidth; }
  234.     // return a number from 1..n for aligned blocks, -1 for unaligned
  235.     int GetAlignedBlockNumber(int alignmentIndex) const { return blockMap[alignmentIndex].alignedBlockNum; }
  236.     // for storing/querying info
  237.     double GetRowDouble(int row) const { return rowDoubles[row]; }
  238.     void SetRowDouble(int row, double value) const { rowDoubles[row] = value; }
  239.     const std::string& GetRowStatusLine(int row) const { return rowStrings[row]; }
  240.     void SetRowStatusLine(int row, const std::string& value) const { rowStrings[row] = value; }
  241.     // empties all rows' infos
  242.     void ClearRowInfo(void) const
  243.     {
  244.         for (int r=0; r<NRows(); ++r) {
  245.             rowDoubles[r] = 0.0;
  246.             rowStrings[r].erase();
  247.         }
  248.     }
  249.     // kludge for now for storing allowed alignment regions, e.g. when demoted from multiple.
  250.     // (only two ranges for now, since this is used only with pairwise alignments)
  251.     int alignMasterFrom, alignMasterTo, alignSlaveFrom, alignSlaveTo;
  252. };
  253. // static function to create Seq-aligns out of multiple
  254. ncbi::objects::CSeq_align * CreatePairwiseSeqAlignFromMultipleRow(const BlockMultipleAlignment *multiple,
  255.     const BlockMultipleAlignment::UngappedAlignedBlockList& blocks, int slaveRow);
  256. // base class for Block - BlockMultipleAlignment is made up of a list of these
  257. class Block
  258. {
  259. public:
  260.     int width;
  261.     virtual bool IsAligned(void) const = 0;
  262.     typedef struct {
  263.         int from, to;
  264.     } Range;
  265.     // get sequence index for a column, which must be in block range (0 ... width-1)
  266.     virtual int GetIndexAt(int blockColumn, int row,
  267.         BlockMultipleAlignment::eUnalignedJustification justification) const = 0;
  268.     // delete a row
  269.     virtual void DeleteRow(int row) = 0;
  270.     virtual void DeleteRows(std::vector < bool >& removeRows, int nToRemove) = 0;
  271.     // makes a new copy of itself
  272.     virtual Block * Clone(const BlockMultipleAlignment *newMultiple) const = 0;
  273. protected:
  274.     Block(const BlockMultipleAlignment *multiple) :
  275.         parentAlignment(multiple), ranges(multiple->NRows()) { }
  276.     typedef std::vector < Range > RangeList;
  277.     RangeList ranges;
  278.     const BlockMultipleAlignment *parentAlignment;
  279. public:
  280.     virtual ~Block(void) { }    // virtual destructor for base class
  281.     bool IsFrom(const BlockMultipleAlignment *alignment) const { return (alignment == parentAlignment); }
  282.     // given a row number (from 0 ... nSequences-1), give the sequence range covered by this block
  283.     const Range* GetRangeOfRow(int row) const { return &(ranges[row]); }
  284.     // set range
  285.     void SetRangeOfRow(int row, int from, int to)
  286.     {
  287.         ranges[row].from = from;
  288.         ranges[row].to = to;
  289.     }
  290.     // resize - add new (empty) rows at end
  291.     void AddRows(int nNewRows) { ranges.resize(ranges.size() + nNewRows); }
  292.     int NSequences(void) const { return ranges.size(); }
  293. };
  294. // a gapless aligned block; width must be >= 1
  295. class UngappedAlignedBlock : public Block
  296. {
  297. public:
  298.     UngappedAlignedBlock(const BlockMultipleAlignment *multiple) : Block(multiple) { }
  299.     bool IsAligned(void) const { return true; }
  300.     int GetIndexAt(int blockColumn, int row,
  301.         BlockMultipleAlignment::eUnalignedJustification justification =
  302.             BlockMultipleAlignment::eCenter) const  // justification ignored for aligned block
  303.         { return (GetRangeOfRow(row)->from + blockColumn); }
  304.     char GetCharacterAt(int blockColumn, int row) const;
  305.     void DeleteRow(int row);
  306.     void DeleteRows(std::vector < bool >& removeRows, int nToRemove);
  307.     Block * Clone(const BlockMultipleAlignment *newMultiple) const;
  308. };
  309. // an unaligned block; max width of block must be >=1, but range over any given
  310. // sequence can be length 0 (but not <0). If length 0, "to" is the residue after
  311. // the block, and "from" (=to - 1) is the residue before.
  312. class UnalignedBlock : public Block
  313. {
  314. public:
  315.     UnalignedBlock(const BlockMultipleAlignment *multiple) : Block(multiple) { }
  316.     void Resize(void);  // recompute block width from current ranges
  317.     bool IsAligned(void) const { return false; }
  318.     int GetIndexAt(int blockColumn, int row,
  319.         BlockMultipleAlignment::eUnalignedJustification justification) const;
  320.     void DeleteRow(int row);
  321.     void DeleteRows(std::vector < bool >& removeRows, int nToRemove);
  322.     Block * Clone(const BlockMultipleAlignment *newMultiple) const;
  323. };
  324. END_SCOPE(Cn3D)
  325. #endif // CN3D_BLOCK_MULTIPLE_ALIGNMENT__HPP
  326. /*
  327. * ---------------------------------------------------------------------------
  328. * $Log: block_multiple_alignment.hpp,v $
  329. * Revision 1000.2  2004/04/12 17:30:52  gouriano
  330. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.40
  331. *
  332. * Revision 1.40  2004/03/15 17:17:56  thiessen
  333. * prefer prefix vs. postfix ++/-- operators
  334. *
  335. * Revision 1.39  2004/02/19 17:04:44  thiessen
  336. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  337. *
  338. * Revision 1.38  2003/11/06 18:52:31  thiessen
  339. * make geometry violations shown on/off; allow multiple pmid entry in ref dialog
  340. *
  341. * Revision 1.37  2003/07/14 18:37:07  thiessen
  342. * change GetUngappedAlignedBlocks() param types; other syntax changes
  343. *
  344. * Revision 1.36  2003/02/03 19:20:01  thiessen
  345. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  346. *
  347. * Revision 1.35  2003/01/31 17:18:58  thiessen
  348. * many small additions and changes...
  349. *
  350. * Revision 1.34  2003/01/28 21:07:56  thiessen
  351. * add block fit coloring algorithm; tweak row dragging; fix style bug
  352. *
  353. * Revision 1.33  2003/01/23 20:03:05  thiessen
  354. * add BLAST Neighbor algorithm
  355. *
  356. * Revision 1.32  2003/01/22 14:47:30  thiessen
  357. * cache PSSM in BlockMultipleAlignment
  358. *
  359. * Revision 1.31  2002/10/23 01:29:25  thiessen
  360. * fix block cache bug
  361. *
  362. * Revision 1.30  2002/07/26 15:28:44  thiessen
  363. * add Alejandro's block alignment algorithm
  364. *
  365. * Revision 1.29  2002/06/13 13:32:38  thiessen
  366. * add self-hit calculation
  367. *
  368. * Revision 1.28  2002/05/17 19:10:27  thiessen
  369. * preliminary range restriction for BLAST/PSSM
  370. *
  371. * Revision 1.27  2002/03/28 14:06:02  thiessen
  372. * preliminary BLAST/PSSM ; new CD startup style
  373. *
  374. * Revision 1.26  2002/02/21 22:01:49  thiessen
  375. * remember alignment range on demotion
  376. *
  377. * Revision 1.25  2002/02/19 14:59:38  thiessen
  378. * add CDD reject and purge sequence
  379. *
  380. * Revision 1.24  2002/02/05 18:53:24  thiessen
  381. * scroll to residue in sequence windows when selected in structure window
  382. *
  383. * Revision 1.23  2001/09/27 15:36:47  thiessen
  384. * decouple sequence import and BLAST
  385. *
  386. * Revision 1.22  2001/08/29 20:03:27  juran
  387. * Heed warnings via static_cast.
  388. *
  389. * Revision 1.21  2001/08/15 20:52:57  juran
  390. * Heed warnings.
  391. *
  392. * Revision 1.20  2001/07/19 19:12:46  thiessen
  393. * working CDD alignment annotator ; misc tweaks
  394. *
  395. * Revision 1.19  2001/07/10 16:39:32  thiessen
  396. * change selection control keys; add CDD name/notes dialogs
  397. *
  398. * Revision 1.18  2001/06/21 02:01:06  thiessen
  399. * major update to molecule identification and highlighting ; add toggle highlight (via alt)
  400. *
  401. * Revision 1.17  2001/06/02 17:22:58  thiessen
  402. * fixes for GCC
  403. *
  404. * Revision 1.16  2001/06/01 13:35:39  thiessen
  405. * add aligned block number to status line
  406. *
  407. * Revision 1.15  2001/05/17 18:34:00  thiessen
  408. * spelling fixes; change dialogs to inherit from wxDialog
  409. *
  410. * Revision 1.14  2001/05/11 02:10:04  thiessen
  411. * add better merge fail indicators; tweaks to windowing/taskbar
  412. *
  413. * Revision 1.13  2001/05/09 17:14:51  thiessen
  414. * add automatic block removal upon demotion
  415. *
  416. * Revision 1.12  2001/05/02 13:46:15  thiessen
  417. * major revision of stuff relating to saving of updates; allow stored null-alignments
  418. *
  419. * Revision 1.11  2001/04/05 22:54:50  thiessen
  420. * change bg color handling ; show geometry violations
  421. *
  422. * Revision 1.10  2001/04/04 00:27:21  thiessen
  423. * major update - add merging, threader GUI controls
  424. *
  425. * Revision 1.9  2001/03/30 03:07:08  thiessen
  426. * add threader score calculation & sorting
  427. *
  428. * Revision 1.8  2001/03/22 00:32:35  thiessen
  429. * initial threading working (PSSM only); free color storage in undo stack
  430. *
  431. * Revision 1.7  2001/03/09 15:48:42  thiessen
  432. * major changes to add initial update viewer
  433. *
  434. * Revision 1.6  2001/03/06 20:20:43  thiessen
  435. * progress towards >1 alignment in a SequenceDisplay ; misc minor fixes
  436. *
  437. * Revision 1.5  2001/02/13 01:03:03  thiessen
  438. * backward-compatible domain ID's in output; add ability to delete rows
  439. *
  440. * Revision 1.4  2001/02/02 20:17:42  thiessen
  441. * can read in CDD with multi-structure but no struct. alignments
  442. *
  443. * Revision 1.3  2001/01/26 19:30:37  thiessen
  444. * limit undo stack size ; fix memory leak
  445. *
  446. * Revision 1.2  2000/12/15 15:52:08  thiessen
  447. * show/hide system installed
  448. *
  449. * Revision 1.1  2000/11/30 15:49:06  thiessen
  450. * add show/hide rows; unpack sec. struc. and domain features
  451. *
  452. */