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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: sequence_display.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/12 17:33:23  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.28
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: sequence_display.hpp,v 1000.1 2004/04/12 17:33:23 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 rows in a sequence/alignment display
  38. *
  39. * ===========================================================================
  40. */
  41. #ifndef CN3D_SEQUENCE_DISPLAY__HPP
  42. #define CN3D_SEQUENCE_DISPLAY__HPP
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbistl.hpp>
  45. #include <map>
  46. #include "viewable_alignment.hpp"
  47. #include "block_multiple_alignment.hpp"
  48. #include "sequence_set.hpp"
  49. BEGIN_SCOPE(Cn3D)
  50. typedef std::map < BlockMultipleAlignment *, BlockMultipleAlignment * > Old2NewAlignmentMap;
  51. ////////////////////////////////////////////////////////////////////////////////
  52. // The sequence view is composed of rows which can be from sequence, alignment,
  53. // or any string - anything derived from DisplayRow.
  54. ////////////////////////////////////////////////////////////////////////////////
  55. class DisplayRow
  56. {
  57. public:
  58.     virtual int Width(void) const = 0;
  59.     virtual bool GetCharacterTraitsAt(int column, BlockMultipleAlignment::eUnalignedJustification justification,
  60.         char *character, Vector *color, bool *drawBackground, Vector *cellBackgroundColor) const = 0;
  61.     virtual bool GetSequenceAndIndexAt(int column, BlockMultipleAlignment::eUnalignedJustification justification,
  62.         const Sequence **sequence, int *index) const = 0;
  63.     virtual const Sequence * GetSequence(void) const = 0;
  64.     virtual void SelectedRange(int from, int to,
  65.         BlockMultipleAlignment::eUnalignedJustification justification, bool toggle) const = 0;
  66.     virtual DisplayRow * Clone(const Old2NewAlignmentMap& newAlignments) const = 0;
  67. };
  68. class DisplayRowFromAlignment : public DisplayRow
  69. {
  70. public:
  71.     int row;
  72.     BlockMultipleAlignment * const alignment;
  73.     DisplayRowFromAlignment(int r, BlockMultipleAlignment *a) :
  74.         row(r), alignment(a) { }
  75.     int Width(void) const { return alignment->AlignmentWidth(); }
  76.     DisplayRow * Clone(const Old2NewAlignmentMap& newAlignments) const
  77.         { return new DisplayRowFromAlignment(row, newAlignments.find(alignment)->second); }
  78.     bool GetCharacterTraitsAt(int column, BlockMultipleAlignment::eUnalignedJustification justification,
  79.         char *character, Vector *color, bool *drawBackground, Vector *cellBackgroundColor) const;
  80.     bool GetSequenceAndIndexAt(int column, BlockMultipleAlignment::eUnalignedJustification justification,
  81.         const Sequence **sequence, int *index) const
  82.     {
  83. bool ignore;
  84.         return alignment->GetSequenceAndIndexAt(column, row, justification, sequence, index, &ignore);
  85.     }
  86.     const Sequence * GetSequence(void) const
  87.     {
  88.         return alignment->GetSequenceOfRow(row);
  89.     }
  90.     void SelectedRange(int from, int to,
  91.         BlockMultipleAlignment::eUnalignedJustification justification, bool toggle) const
  92.     {
  93.         alignment->SelectedRange(row, from, to, justification, toggle);
  94.     }
  95. };
  96. class DisplayRowFromSequence : public DisplayRow
  97. {
  98. public:
  99.     const Sequence * const sequence;
  100.     const int fromIndex, toIndex;
  101.     DisplayRowFromSequence(const Sequence *s, int from, int to);
  102.     int Width(void) const { return toIndex - fromIndex + 1; }
  103.     DisplayRow * Clone(const Old2NewAlignmentMap& newAlignments) const
  104.         { return new DisplayRowFromSequence(sequence, fromIndex, toIndex); }
  105.     bool GetCharacterTraitsAt(int column, BlockMultipleAlignment::eUnalignedJustification justification,
  106.         char *character, Vector *color, bool *drawBackground, Vector *cellBackgroundColor) const;
  107.     bool GetSequenceAndIndexAt(int column, BlockMultipleAlignment::eUnalignedJustification justification,
  108.         const Sequence **sequenceHandle, int *index) const;
  109.     const Sequence * GetSequence(void) const
  110.         { return sequence; }
  111.     void SelectedRange(int from, int to,
  112.         BlockMultipleAlignment::eUnalignedJustification justification, bool toggle) const;
  113. };
  114. class DisplayRowFromString : public DisplayRow
  115. {
  116. public:
  117.     const std::string title;
  118.     std::string theString;
  119.     const Vector stringColor, backgroundColor;
  120.     const bool hasBackgroundColor;
  121.     BlockMultipleAlignment * const alignment;
  122.     DisplayRowFromString(const std::string& s, const Vector color = Vector(0,0,0.5),
  123.         const std::string& t = "", bool hasBG = false, Vector bgColor = Vector(1,1,1),
  124.         BlockMultipleAlignment *a = NULL) :
  125.         theString(s), stringColor(color), title(t),
  126.         hasBackgroundColor(hasBG), backgroundColor(bgColor), alignment(a) { }
  127.     int Width(void) const { return theString.size(); }
  128.     DisplayRow * Clone(const Old2NewAlignmentMap& newAlignments) const
  129.         { return new DisplayRowFromString(
  130.             theString, stringColor, title, hasBackgroundColor, backgroundColor,
  131.             alignment ? newAlignments.find(alignment)->second : NULL); }
  132.     bool GetCharacterTraitsAt(int column, BlockMultipleAlignment::eUnalignedJustification justification,
  133.         char *character, Vector *color, bool *drawBackground, Vector *cellBackgroundColor) const;
  134.     bool GetSequenceAndIndexAt(int column, BlockMultipleAlignment::eUnalignedJustification justification,
  135.         const Sequence **sequenceHandle, int *index) const { return false; }
  136.     const Sequence * GetSequence(void) const { return NULL; }
  137.     void SelectedRange(int from, int to,
  138.         BlockMultipleAlignment::eUnalignedJustification justification, bool toggle) const
  139.         { } // do nothing
  140. };
  141. ////////////////////////////////////////////////////////////////////////////////
  142. // The SequenceDisplay is the structure that holds the DisplayRows of the view.
  143. // It's also derived from ViewableAlignment, in order to be plugged into a
  144. // SequenceViewerWidget.
  145. ////////////////////////////////////////////////////////////////////////////////
  146. class SequenceViewer;
  147. class UpdateViewer;
  148. class ViewerWindowBase;
  149. class Molecule;
  150. class SequenceDisplay : public ViewableAlignment
  151. {
  152.     friend class SequenceViewer;
  153.     friend class UpdateViewer;
  154. public:
  155.     SequenceDisplay(bool editable, ViewerWindowBase* const *parentViewerWindow);
  156.     ~SequenceDisplay(void);
  157.     // these functions add a row to the end of the display, from various sources
  158.     void AddRowFromAlignment(int row, BlockMultipleAlignment *fromAlignment);
  159.     void AddRowFromSequence(const Sequence *sequence, int from, int to);
  160.     void AddRowFromString(const std::string& anyString);
  161.     // adds a string row to the alignment, that contains block boundary indicators
  162.     DisplayRowFromString * FindBlockBoundaryRow(const BlockMultipleAlignment *forAlignment) const;
  163.     void UpdateBlockBoundaryRow(const BlockMultipleAlignment *forAlignment) const;
  164.     void AddBlockBoundaryRow(BlockMultipleAlignment *forAlignment);  // adds to end of display!
  165.     void AddBlockBoundaryRows(void);
  166.     void RemoveBlockBoundaryRows(void);
  167.     // returns a list of all sequences in the display (in order) for the given alignment
  168.     typedef std::vector < const Sequence * > SequenceList;
  169.     void GetSequences(const BlockMultipleAlignment *forAlignment, SequenceList *seqs) const;
  170.     // returns a list of all protein sequences in the display (in order)
  171.     void GetProteinSequences(SequenceList *seqs) const;
  172.     // fills the vector with the current row ordering for the given alignment
  173.     void GetRowOrder(const BlockMultipleAlignment *forAlignment, std::vector < int > *slaveRowOrder) const;
  174.     // to inform the display that new rows have been added to or removed from the multiple
  175.     void RowsAdded(int nRowsAddedToMultiple, BlockMultipleAlignment *multiple, int where = -1);
  176.     void RowsRemoved(const std::vector < int >& rowsRemoved, const BlockMultipleAlignment *multiple);
  177.     // row scoring and sorting functions - only for single-alignment displays!
  178.     // sorting necessarily always leaves master at the top
  179.     bool CalculateRowScoresWithThreader(double weightPSSM);
  180.     void SortRowsByIdentifier(void);
  181.     void SortRowsByThreadingScore(double weightPSSM);
  182.     void SortRowsBySelfHit(void);
  183.     void FloatPDBRowsToTop(void);
  184.     void FloatHighlightsToTop(void);
  185.     void FloatGVToTop(void);
  186.     // a sort of clustering of similar sequences around a particular row
  187.     bool ProximitySort(int displayRow);
  188.     // create a new copy of this object
  189.     SequenceDisplay * Clone(const Old2NewAlignmentMap& newAlignments) const;
  190.     // clear out all rows from this display
  191.     void Empty(void);
  192. private:
  193.     const bool isEditable;
  194.     // generic row manipulation functions
  195.     void AddRow(DisplayRow *row);
  196.     BlockMultipleAlignment * GetAlignmentForRow(int row) const;
  197.     void UpdateBlockBoundaryRow(DisplayRowFromString *blockBoundaryRow) const;
  198.     ViewerWindowBase* const *viewerWindow;
  199.     int startingColumn;
  200.     typedef std::vector < DisplayRow * > RowVector;
  201.     RowVector rows;
  202.     int maxRowWidth;
  203.     void UpdateMaxRowWidth(void);
  204.     void UpdateAfterEdit(const BlockMultipleAlignment *forAlignment);
  205.     bool shiftDown, controlDown;
  206.     void SortRows(void);
  207. public:
  208.     int NRows(void) const { return rows.size(); }
  209.     bool IsEditable(void) const { return isEditable; }
  210.     const Sequence * GetSequenceForRow(int row) const
  211.     {
  212.         if (row >= 0 && row < NRows())
  213.             return rows[row]->GetSequence();
  214.         else
  215.             return NULL;
  216.     }
  217.     // redraw all molecules associated with the SequenceDisplay
  218.     void RedrawAlignedMolecules(void) const;
  219.     // find coordinates of this residue in the display; returns false if not found
  220.     bool GetDisplayCoordinates(const Molecule *molecule, int seqIndex,
  221.         BlockMultipleAlignment::eUnalignedJustification justification, int *column, int *row);
  222.     // column to scroll to when this display is first shown
  223.     void SetStartingColumn(int column) { startingColumn = column; }
  224.     int GetStartingColumn(void) const { return startingColumn; }
  225.     // methods required by ViewableAlignment base class
  226.     void GetSize(int *setColumns, int *setRows) const
  227.         { *setColumns = maxRowWidth; *setRows = rows.size(); }
  228.     bool GetRowTitle(int row, wxString *title, wxColour *color) const;
  229.     bool GetCharacterTraitsAt(int column, int row,              // location
  230.         char *character, // character to draw
  231.         wxColour *color,                                        // color of this character
  232.         bool *drawBackground,                                   // special background color?
  233.         wxColour *cellBackgroundColor
  234.     ) const;
  235.     // callbacks for ViewableAlignment
  236.     void MouseOver(int column, int row) const;
  237.     bool MouseDown(int column, int row, unsigned int controls);
  238.     void SelectedRectangle(int columnLeft, int rowTop, int columnRight, int rowBottom);
  239.     void DraggedCell(int columnFrom, int rowFrom, int columnTo, int rowTo);
  240. };
  241. END_SCOPE(Cn3D)
  242. #endif // CN3D_SEQUENCE_DISPLAY__HPP
  243. /*
  244. * ---------------------------------------------------------------------------
  245. * $Log: sequence_display.hpp,v $
  246. * Revision 1000.1  2004/04/12 17:33:23  gouriano
  247. * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.28
  248. *
  249. * Revision 1.28  2004/02/19 17:05:06  thiessen
  250. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  251. *
  252. * Revision 1.27  2003/10/20 13:17:15  thiessen
  253. * add float geometry violations sorting
  254. *
  255. * Revision 1.26  2003/02/03 19:20:05  thiessen
  256. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  257. *
  258. * Revision 1.25  2003/01/29 01:41:06  thiessen
  259. * add merge neighbor instead of merge near highlight
  260. *
  261. * Revision 1.24  2002/09/05 18:38:57  thiessen
  262. * add sort by highlights
  263. *
  264. * Revision 1.23  2002/06/13 14:54:07  thiessen
  265. * add sort by self-hit
  266. *
  267. * Revision 1.22  2002/04/26 19:01:00  thiessen
  268. * fix display delete bug
  269. *
  270. * Revision 1.21  2002/02/28 19:11:52  thiessen
  271. * wrap sequences in single-structure mode
  272. *
  273. * Revision 1.20  2002/02/05 18:53:25  thiessen
  274. * scroll to residue in sequence windows when selected in structure window
  275. *
  276. * Revision 1.19  2001/11/27 16:26:09  thiessen
  277. * major update to data management system
  278. *
  279. * Revision 1.18  2001/07/23 20:08:38  thiessen
  280. * add regex pattern search
  281. *
  282. * Revision 1.17  2001/07/10 16:39:34  thiessen
  283. * change selection control keys; add CDD name/notes dialogs
  284. *
  285. * Revision 1.16  2001/06/21 02:01:07  thiessen
  286. * major update to molecule identification and highlighting ; add toggle highlight (via alt)
  287. *
  288. * Revision 1.15  2001/06/15 14:52:30  thiessen
  289. * fix minor syntax errors
  290. *
  291. * Revision 1.14  2001/06/04 14:33:54  thiessen
  292. * add proximity sort; highlight sequence on browser launch
  293. *
  294. * Revision 1.13  2001/06/01 18:07:38  thiessen
  295. * fix display clone bug
  296. *
  297. * Revision 1.12  2001/06/01 14:04:54  thiessen
  298. * add float PDB sort
  299. *
  300. * Revision 1.11  2001/05/11 02:10:04  thiessen
  301. * add better merge fail indicators; tweaks to windowing/taskbar
  302. *
  303. * Revision 1.10  2001/05/03 14:38:32  thiessen
  304. * put ViewableAlignment in its own (non-wx) header
  305. *
  306. * Revision 1.9  2001/04/04 00:27:21  thiessen
  307. * major update - add merging, threader GUI controls
  308. *
  309. * Revision 1.8  2001/03/30 14:43:11  thiessen
  310. * show threader scores in status line; misc UI tweaks
  311. *
  312. * Revision 1.7  2001/03/30 03:07:08  thiessen
  313. * add threader score calculation & sorting
  314. *
  315. * Revision 1.6  2001/03/22 00:32:36  thiessen
  316. * initial threading working (PSSM only); free color storage in undo stack
  317. *
  318. * Revision 1.5  2001/03/19 15:47:37  thiessen
  319. * add row sorting by identifier
  320. *
  321. * Revision 1.4  2001/03/13 01:24:15  thiessen
  322. * working undo system for >1 alignment (e.g., update window)
  323. *
  324. * Revision 1.3  2001/03/09 15:48:43  thiessen
  325. * major changes to add initial update viewer
  326. *
  327. * Revision 1.2  2001/03/06 20:20:43  thiessen
  328. * progress towards >1 alignment in a SequenceDisplay ; misc minor fixes
  329. *
  330. * Revision 1.1  2001/03/01 20:15:29  thiessen
  331. * major rearrangement of sequence viewer code into base and derived classes
  332. *
  333. */