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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: structure_set.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:29:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.79
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: structure_set.hpp,v 1000.2 2004/06/01 18:29:31 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 sets of structure data
  38. *
  39. * ===========================================================================
  40. */
  41. #ifndef CN3D_STRUCTURESET__HPP
  42. #define CN3D_STRUCTURESET__HPP
  43. #include <corelib/ncbistd.hpp>
  44. #include <corelib/ncbistl.hpp>
  45. #include <objects/ncbimime/Ncbi_mime_asn1.hpp>
  46. #include <objects/cdd/Cdd.hpp>
  47. #include <objects/mmdb1/Biostruc.hpp>
  48. #include <objects/mmdb1/Biostruc_annot_set.hpp>
  49. #include <objects/mmdb3/Biostruc_feature.hpp>
  50. #include <objects/cdd/Align_annot_set.hpp>
  51. #include <objects/seq/Bioseq.hpp>
  52. #include <objects/cdd/Reject_id.hpp>
  53. #include <string>
  54. #include <map>
  55. #include <vector>
  56. #include <list>
  57. #include <objseq.h>
  58. #include <objloc.h>
  59. #include "structure_base.hpp"
  60. #include "vector_math.hpp"
  61. BEGIN_SCOPE(Cn3D)
  62. // StructureSet is the top-level container. It holds a set of SturctureObjects;
  63. // A SturctureObject is basically the contents of one PDB entry.
  64. class StructureObject;
  65. class OpenGLRenderer;
  66. class ShowHideManager;
  67. class StyleManager;
  68. class Residue;
  69. class SequenceSet;
  70. class AlignmentSet;
  71. class AlignmentManager;
  72. class SequenceViewer;
  73. class Messenger;
  74. class Colors;
  75. class Molecule;
  76. class BlockMultipleAlignment;
  77. class Sequence;
  78. class SequenceSet;
  79. class ChemicalGraph;
  80. class CoordSet;
  81. class ASNDataManager;
  82. class StructureSet : public StructureBase
  83. {
  84. public:
  85.     StructureSet(ncbi::objects::CNcbi_mime_asn1 *mime, int structureLimit, OpenGLRenderer *r);
  86.     StructureSet(ncbi::objects::CCdd *cdd, int structureLimit, OpenGLRenderer *r);
  87.     ~StructureSet(void);
  88.     // public data
  89.     bool isAlphaOnly;   // assume if one Object is alpha-only, then they all are
  90.     int nDomains;       // total number of domains over all objects
  91.     bool hasUserStyle;  // whether there's a global style in the original data
  92.     typedef std::list < const StructureObject * > ObjectList;
  93.     ObjectList objects;
  94.     // sequence and alignment information
  95.     const SequenceSet *sequenceSet;
  96.     const AlignmentSet *alignmentSet;
  97.     AlignmentManager *alignmentManager;
  98.     OpenGLRenderer *renderer;
  99.     ShowHideManager *showHideManager;
  100.     StyleManager *styleManager;
  101.     Vector center; // center of structure (relative to Master's coordinates)
  102.     double maxDistFromCenter; // max distance of any atom from center
  103.     Vector rotationCenter; // center of rotation (relative to Master's coordinates)
  104.     // for assigning display lists and frames
  105.     unsigned int lastDisplayList;
  106.     typedef std::list < unsigned int > DisplayLists;
  107.     typedef std::vector < DisplayLists > FrameMap;
  108.     FrameMap frameMap;
  109.     // to map display list -> slave transform
  110.     typedef std::map < unsigned int, const Matrix * const * > TransformMap;
  111.     TransformMap transformMap;
  112.     // for ensuring unique structure<->structure alignments for repeated structures
  113.     std::map < int, bool > usedFeatures;
  114.     // public methods
  115.     bool IsMultiStructure(void) const;
  116.     // set screen and rotation center of model (coordinate relative to Master);
  117.     // if NULL, will calculate average geometric center
  118.     void SetCenter(const Vector *setTo = NULL);
  119.     // center rotation and view on aligned residues only
  120.     void CenterViewOnAlignedResidues(void);
  121.     bool Draw(const AtomSet *atomSet) const;
  122.     // keep a list of names to look atoms from GL selection
  123.     unsigned int CreateName(const Residue *residue, int atomID);
  124.     bool GetAtomFromName(unsigned int name, const Residue **residue, int *atomID) const;
  125.     // called when an atom is selected in the GL window. If setCenter == true, then
  126.     // the atom's location is used as the global rotation center
  127.     void SelectedAtom(unsigned int name, bool setCenter);
  128.     // select either biopolymer residues only or all residues/molecules within cutoff distance
  129.     // of currently selected residues
  130.     void SelectByDistance(double cutoff, bool biopolymersOnly, bool otherMoleculesOnly) const;
  131.     // updates sequences in the asn, to remove any sequences
  132.     // that are not used by the current alignmentSet or updates
  133.     void RemoveUnusedSequences(void);
  134.     // put in new AlignmentSet - e.g. when alignment has been edited
  135.     void ReplaceAlignmentSet(AlignmentSet *newAlignmentSet);
  136.     // replace the ASN update list with the current updates
  137.     void ReplaceUpdates(ncbi::objects::CCdd::TPending& newUpdates);
  138.     // bit flags to tell whether various parts of the data have been changed
  139.     static const unsigned int
  140.         ePSSMData,                  // PSSM values have changed
  141.         eRowOrderData,              // row order has changed
  142.         eAnyAlignmentData,          // any change to alignment (including edits that don't change prev two)
  143.         eStructureAlignmentData,
  144.         eSequenceData,
  145.         eUpdateData,
  146.         eStyleData,
  147.         eUserAnnotationData,
  148.         eCDDData,
  149.         eOtherData;
  150.     bool HasDataChanged(void) const;
  151.     void SetDataChanged(unsigned int what) const;
  152.     // CDD-specific data accessors
  153.     bool IsCDD(void) const;
  154.     bool IsCDDInMime(void) const;
  155.     const std::string& GetCDDName(void) const;
  156.     bool SetCDDName(const std::string& name);
  157.     const std::string& GetCDDDescription(void) const;
  158.     bool SetCDDDescription(const std::string& descr);
  159.     typedef std::vector < std::string > TextLines;
  160.     bool GetCDDNotes(TextLines *lines) const;
  161.     bool SetCDDNotes(const TextLines& lines);
  162.     ncbi::objects::CCdd_descr_set * GetCDDDescrSet(void);
  163.     ncbi::objects::CAlign_annot_set * GetCDDAnnotSet(void);
  164.     // convert underlying data from mime to cdd
  165.     bool ConvertMimeDataToCDD(const std::string& cddName);
  166.     // writes data to a file; returns true on success
  167.     bool SaveASNData(const char *filename, bool doBinary, unsigned int *changeFlags);
  168.     // adds a new Sequence to the SequenceSet
  169.     const Sequence * CreateNewSequence(ncbi::objects::CBioseq& bioseq);
  170.     // reject sequence (from CDD)
  171.     void RejectAndPurgeSequence(const Sequence *reject, std::string reason, bool purge);
  172.     typedef std::list < ncbi::CRef < ncbi::objects::CReject_id > > RejectList;
  173.     const RejectList * GetRejects(void) const;
  174.     void ShowRejects(void) const;
  175.     // creates Bioseq from Sequence; registed with SeqMgr and stored in BioseqMap
  176.     Bioseq * GetOrCreateBioseq(const Sequence *sequence);
  177.     void CreateAllBioseqs(const BlockMultipleAlignment *multiple);
  178.     // adds a new Biostruc to the asn data, if appropriate
  179.     bool AddBiostrucToASN(ncbi::objects::CBiostruc *biostruc);
  180.     // for manipulating structure alignment features
  181.     void InitStructureAlignments(int masterMMDBID);
  182.     void AddStructureAlignment(ncbi::objects::CBiostruc_feature *feature,
  183.         int masterDomainID, int slaveDomainID);
  184.     void RemoveStructureAlignments(void);
  185. private:
  186.     ASNDataManager *dataManager;
  187.     // data preparation methods
  188.     void Load(int structureLimit);
  189.     void LoadSequencesForSingleStructure(void);             // for single structures
  190.     void LoadAlignmentsAndStructures(int structureLimit);   // for alignments
  191.     std::map < const ncbi::objects::CBiostruc * , bool > usedStructures;
  192.     bool MatchSequenceToMoleculeInObject(const Sequence *seq,
  193.         const StructureObject *obj, const Sequence **seqHandle = NULL);
  194.     bool LoadMaster(int masterMMDBID);
  195.     void VerifyFrameMap(void) const;
  196.     // to keep track of gl "name" -> atom correspondence (for structure picking)
  197.     typedef std::pair < const Residue*, int > NamePair;
  198.     typedef std::map < unsigned int, NamePair > NameMap;
  199.     NameMap nameMap;
  200.     unsigned int lastAtomName;
  201.     // holds C Bioseqs associated with Sequences
  202.     typedef std::map < const Sequence *, Bioseq * > BioseqMap;
  203.     BioseqMap bioseqs;
  204.     // for printing out distances between successively picked atoms
  205.     Vector prevPickedAtomCoord;
  206.     bool havePrevPickedAtomCoord;
  207. };
  208. class StructureObject : public StructureBase
  209. {
  210. private:
  211.     const bool isMaster;
  212. public:
  213.     // biostruc must not be "raw" mmdb data - will get confused by presence of different models
  214.     StructureObject(StructureBase *parent, const ncbi::objects::CBiostruc& biostruc, bool isMaster);
  215.     ~StructureObject(void) { if (transformToMaster) delete transformToMaster; }
  216.     // public data
  217.     static const int NO_MMDB_ID;
  218.     int id, mmdbID;
  219.     std::string pdbID;
  220.     Matrix *transformToMaster;
  221.     // an object has one ChemicalGraph that can be applied to one or more
  222.     // CoordSets to generate the object's model(s)
  223.     const ChemicalGraph *graph;
  224.     typedef std::list < const CoordSet * > CoordSetList;
  225.     CoordSetList coordSets;
  226.     // min and max atomic temperatures
  227.     static const double NO_TEMPERATURE;
  228.     double minTemperature, maxTemperature;
  229.     // map of internal domainID -> Molecule and MMDB-assigned id
  230.     typedef std::map < int, const Molecule * > DomainMap;
  231.     DomainMap domainMap;
  232.     typedef std::map < int, int > DomainIDMap;
  233.     DomainIDMap domainID2MMDB;
  234.     // public methods
  235.     typedef std::map < const Residue *, const Molecule * > ResidueMap;
  236.     void SelectByDistance(double cutoff, bool biopolymersOnly, bool otherMoleculesOnly,
  237.         ResidueMap *selectedResidues) const;
  238.     // set transform based on asn1 data
  239.     bool SetTransformToMaster(const ncbi::objects::CBiostruc_annot_set& annot, int masterMMDBID);
  240.     // set transform based on rigid body fit of given coordinates
  241.     void RealignStructure(int nCoords,
  242.         const Vector * const *masterCoords, const Vector * const *slaveCoords,
  243.         const double *weights, int slaveRow);
  244.     bool IsMaster(void) const { return isMaster; }
  245.     bool IsSlave(void) const { return !isMaster; }
  246.     int NDomains(void) const { return domainMap.size(); }
  247. };
  248. END_SCOPE(Cn3D)
  249. #endif // CN3D_STRUCTURESET__HPP
  250. /*
  251. * ---------------------------------------------------------------------------
  252. * $Log: structure_set.hpp,v $
  253. * Revision 1000.2  2004/06/01 18:29:31  gouriano
  254. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.79
  255. *
  256. * Revision 1.79  2004/05/21 17:29:51  thiessen
  257. * allow conversion of mime to cdd data
  258. *
  259. * Revision 1.78  2004/02/19 17:05:15  thiessen
  260. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  261. *
  262. * Revision 1.77  2003/07/17 20:13:51  thiessen
  263. * don't ask for filename on save/termination with -f; add eAnyAlignmentData flag
  264. *
  265. * Revision 1.76  2003/07/17 16:52:34  thiessen
  266. * add FileSaved message with edit typing
  267. *
  268. * Revision 1.75  2003/07/14 18:37:08  thiessen
  269. * change GetUngappedAlignedBlocks() param types; other syntax changes
  270. *
  271. * Revision 1.74  2003/02/03 19:20:07  thiessen
  272. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  273. *
  274. * Revision 1.73  2003/01/27 15:52:22  thiessen
  275. * merge after highlighted row; show rejects; trim rejects from new reject list
  276. *
  277. * Revision 1.72  2002/11/21 15:26:33  thiessen
  278. * fix style dictionary loading bug
  279. *
  280. * Revision 1.71  2002/11/19 21:19:44  thiessen
  281. * more const changes for objects; fix user vs default style bug
  282. *
  283. * Revision 1.70  2002/11/06 00:18:10  thiessen
  284. * fixes for new CRef/const rules in objects
  285. *
  286. * Revision 1.69  2002/09/26 17:32:13  thiessen
  287. * show distance between picked atoms; show RMS for structure alignments
  288. *
  289. * Revision 1.68  2002/09/19 12:51:08  thiessen
  290. * fix block aligner / update bug; add distance select for other molecules only
  291. *
  292. * Revision 1.67  2002/09/14 17:03:07  thiessen
  293. * center initial view on aligned residues
  294. *
  295. * Revision 1.66  2002/06/05 17:50:09  thiessen
  296. * title tweaks
  297. *
  298. * Revision 1.65  2002/04/10 13:16:29  thiessen
  299. * new selection by distance algorithm
  300. *
  301. * Revision 1.64  2002/02/19 14:59:40  thiessen
  302. * add CDD reject and purge sequence
  303. *
  304. * Revision 1.63  2002/02/12 17:19:22  thiessen
  305. * first working structure import
  306. *
  307. * Revision 1.62  2002/01/03 16:18:40  thiessen
  308. * add distance selection
  309. *
  310. * Revision 1.61  2001/12/06 23:13:46  thiessen
  311. * finish import/align new sequences into single-structure data; many small tweaks
  312. *
  313. * Revision 1.60  2001/11/27 16:26:10  thiessen
  314. * major update to data management system
  315. *
  316. * Revision 1.59  2001/10/17 17:46:27  thiessen
  317. * save camera setup and rotation center in files
  318. *
  319. * Revision 1.58  2001/10/09 18:57:27  thiessen
  320. * add CDD references editing dialog
  321. *
  322. * Revision 1.57  2001/10/08 00:00:02  thiessen
  323. * estimate threader N random starts; edit CDD name
  324. *
  325. * Revision 1.56  2001/10/01 16:03:58  thiessen
  326. * make CDD annotation window non-modal; add SetWindowTitle to viewers
  327. *
  328. * Revision 1.55  2001/09/27 15:36:48  thiessen
  329. * decouple sequence import and BLAST
  330. *
  331. * Revision 1.54  2001/09/18 03:09:38  thiessen
  332. * add preliminary sequence import pipeline
  333. *
  334. * Revision 1.53  2001/08/15 20:53:58  juran
  335. * Heed warnings.
  336. *
  337. * Revision 1.52  2001/08/13 22:30:52  thiessen
  338. * add structure window mouse drag/zoom; add highlight option to render settings
  339. *
  340. * Revision 1.51  2001/07/12 17:34:23  thiessen
  341. * change domain mapping ; add preliminary cdd annotation GUI
  342. *
  343. * Revision 1.50  2001/07/10 16:39:34  thiessen
  344. * change selection control keys; add CDD name/notes dialogs
  345. *
  346. * Revision 1.49  2001/07/04 19:38:55  thiessen
  347. * finish user annotation system
  348. *
  349. * Revision 1.48  2001/06/14 17:44:46  thiessen
  350. * progress in styles<->asn ; add structure limits
  351. *
  352. * Revision 1.47  2001/06/14 00:33:23  thiessen
  353. * asn additions
  354. *
  355. * Revision 1.46  2001/06/05 13:21:17  thiessen
  356. * fix structure alignment list problems
  357. *
  358. * Revision 1.45  2001/05/31 18:46:27  thiessen
  359. * add preliminary style dialog; remove LIST_TYPE; add thread single and delete all; misc tweaks
  360. *
  361. * Revision 1.44  2001/05/02 13:46:15  thiessen
  362. * major revision of stuff relating to saving of updates; allow stored null-alignments
  363. *
  364. * Revision 1.43  2001/04/17 20:15:24  thiessen
  365. * load 'pending' Cdd alignments into update window
  366. *
  367. * Revision 1.42  2001/03/23 15:13:46  thiessen
  368. * load sidechains in CDD's
  369. *
  370. * Revision 1.41  2001/03/22 00:32:36  thiessen
  371. * initial threading working (PSSM only); free color storage in undo stack
  372. *
  373. * Revision 1.40  2001/02/16 00:36:48  thiessen
  374. * remove unused sequences from asn data
  375. *
  376. * Revision 1.39  2001/02/13 01:03:04  thiessen
  377. * backward-compatible domain ID's in output; add ability to delete rows
  378. *
  379. * Revision 1.38  2001/02/02 20:17:42  thiessen
  380. * can read in CDD with multi-structure but no struct. alignments
  381. *
  382. * Revision 1.37  2001/01/18 19:37:01  thiessen
  383. * save structure (re)alignments to asn output
  384. *
  385. * Revision 1.36  2000/12/29 19:23:50  thiessen
  386. * save row order
  387. *
  388. * Revision 1.35  2000/12/22 19:25:47  thiessen
  389. * write cdd output files
  390. *
  391. * Revision 1.34  2000/12/21 23:42:25  thiessen
  392. * load structures from cdd's
  393. *
  394. * Revision 1.33  2000/12/20 23:47:53  thiessen
  395. * load CDD's
  396. *
  397. * Revision 1.32  2000/12/01 19:34:43  thiessen
  398. * better domain assignment
  399. *
  400. * Revision 1.31  2000/11/30 15:49:09  thiessen
  401. * add show/hide rows; unpack sec. struc. and domain features
  402. *
  403. * Revision 1.30  2000/11/13 18:05:58  thiessen
  404. * working structure re-superpositioning
  405. *
  406. * Revision 1.29  2000/11/12 04:02:22  thiessen
  407. * working file save including alignment edits
  408. *
  409. * Revision 1.28  2000/11/11 21:12:08  thiessen
  410. * create Seq-annot from BlockMultipleAlignment
  411. *
  412. * Revision 1.27  2000/11/02 16:48:24  thiessen
  413. * working editor undo; dynamic slave transforms
  414. *
  415. * Revision 1.26  2000/10/04 17:40:47  thiessen
  416. * rearrange STL #includes
  417. *
  418. * Revision 1.25  2000/09/15 19:24:33  thiessen
  419. * allow repeated structures w/o different local id
  420. *
  421. * Revision 1.24  2000/09/11 22:57:56  thiessen
  422. * working highlighting
  423. *
  424. * Revision 1.23  2000/09/11 01:45:54  thiessen
  425. * working messenger for sequence<->structure window communication
  426. *
  427. * Revision 1.22  2000/08/30 19:49:05  thiessen
  428. * working sequence window
  429. *
  430. * Revision 1.21  2000/08/29 04:34:15  thiessen
  431. * working alignment manager, IBM
  432. *
  433. * Revision 1.20  2000/08/28 18:52:18  thiessen
  434. * start unpacking alignments
  435. *
  436. * Revision 1.19  2000/08/27 18:50:56  thiessen
  437. * extract sequence information
  438. *
  439. * Revision 1.18  2000/08/21 19:31:17  thiessen
  440. * add style consistency checking
  441. *
  442. * Revision 1.17  2000/08/07 14:12:48  thiessen
  443. * added animation frames
  444. *
  445. * Revision 1.16  2000/08/07 00:20:18  thiessen
  446. * add display list mechanism
  447. *
  448. * Revision 1.15  2000/08/04 22:49:11  thiessen
  449. * add backbone atom classification and selection feedback mechanism
  450. *
  451. * Revision 1.14  2000/08/03 15:12:29  thiessen
  452. * add skeleton of style and show/hide managers
  453. *
  454. * Revision 1.13  2000/07/27 13:30:10  thiessen
  455. * remove 'using namespace ...' from all headers
  456. *
  457. * Revision 1.12  2000/07/18 16:49:44  thiessen
  458. * more friendly rotation center setting
  459. *
  460. * Revision 1.11  2000/07/18 00:05:45  thiessen
  461. * allow arbitrary rotation center
  462. *
  463. * Revision 1.10  2000/07/17 22:36:46  thiessen
  464. * fix vector_math typo; correctly set initial view
  465. *
  466. * Revision 1.9  2000/07/17 04:21:10  thiessen
  467. * now does correct structure alignment transformation
  468. *
  469. * Revision 1.8  2000/07/16 23:18:35  thiessen
  470. * redo of drawing system
  471. *
  472. * Revision 1.7  2000/07/12 02:00:39  thiessen
  473. * add basic wxWindows GUI
  474. *
  475. * Revision 1.6  2000/07/11 13:49:30  thiessen
  476. * add modules to parse chemical graph; many improvements
  477. *
  478. * Revision 1.5  2000/07/01 15:44:23  thiessen
  479. * major improvements to StructureBase functionality
  480. *
  481. * Revision 1.4  2000/06/29 19:18:19  thiessen
  482. * improved atom map
  483. *
  484. * Revision 1.3  2000/06/29 14:35:20  thiessen
  485. * new atom_set files
  486. *
  487. * Revision 1.2  2000/06/28 13:08:13  thiessen
  488. * store alt conf ensembles
  489. *
  490. * Revision 1.1  2000/06/27 20:08:14  thiessen
  491. * initial checkin
  492. *
  493. */