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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bond.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:27:52  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.21
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: bond.cpp,v 1000.2 2004/06/01 18:27: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 chemical bonds
  38. *
  39. * ===========================================================================
  40. */
  41. #ifdef _MSC_VER
  42. #pragma warning(disable:4018)   // disable signed/unsigned mismatch warning in MSVC
  43. #endif
  44. #include <ncbi_pch.hpp>
  45. #include <corelib/ncbistd.hpp>
  46. #include <objects/mmdb1/Molecule_id.hpp>
  47. #include <objects/mmdb1/Residue_id.hpp>
  48. #include <objects/mmdb1/Atom_id.hpp>
  49. #include "bond.hpp"
  50. #include "atom_set.hpp"
  51. #include "structure_set.hpp"
  52. #include "coord_set.hpp"
  53. #include "opengl_renderer.hpp"
  54. #include "chemical_graph.hpp"
  55. #include "periodic_table.hpp"
  56. #include "style_manager.hpp"
  57. #include "molecule.hpp"
  58. #include "show_hide_manager.hpp"
  59. #include "cn3d_tools.hpp"
  60. USING_NCBI_SCOPE;
  61. USING_SCOPE(objects);
  62. BEGIN_SCOPE(Cn3D)
  63. Bond::Bond(StructureBase *parent) : StructureBase(parent), order(eUnknown),
  64.     previousVirtual(NULL), nextVirtual(NULL)
  65. {
  66. }
  67. const Bond* MakeBond(StructureBase *parent,
  68.     int mID1, int rID1, int aID1,
  69.     int mID2, int rID2, int aID2,
  70.     int bondOrder)
  71. {
  72.     // get StructureObject* parent
  73.     const StructureObject *object;
  74.     if (!parent->GetParentOfType(&object) || object->coordSets.size() == 0) {
  75.         ERRORMSG("Bond() : parent doesn't have any CoordSets");
  76.         return NULL;
  77.     }
  78.     AtomPntr ap1(mID1, rID1, aID1), ap2(mID2, rID2, aID2);
  79.     Bond *bond = new Bond(parent);
  80.     bond->atom1 = ap1;
  81.     bond->atom2 = ap2;
  82.     bond->order = static_cast<Bond::eBondOrder>(bondOrder);
  83.     return bond;
  84. }
  85. const Bond* MakeBond(StructureBase *parent,
  86.     const CAtom_pntr& atomPtr1, const CAtom_pntr& atomPtr2, int bondOrder)
  87. {
  88.     return MakeBond(parent,
  89.         atomPtr1.GetMolecule_id().Get(),
  90.         atomPtr1.GetResidue_id().Get(),
  91.         atomPtr1.GetAtom_id().Get(),
  92.         atomPtr2.GetMolecule_id().Get(),
  93.         atomPtr2.GetResidue_id().Get(),
  94.         atomPtr2.GetAtom_id().Get(),
  95.         bondOrder
  96.     );
  97. }
  98. bool Bond::Draw(const AtomSet *atomSet) const
  99. {
  100.     if (!parentSet->renderer) {
  101.         ERRORMSG("Bond::Draw() - no renderer");
  102.         return false;
  103.     }
  104.     // get AtomCoord* for appropriate altConf
  105.     if (!atomSet) {
  106.         ERRORMSG("Bond::Draw(data) - NULL AtomSet*");
  107.         return false;
  108.     }
  109.     bool overlayEnsembles = parentSet->showHideManager->OverlayConfEnsembles();
  110.     const AtomCoord *a1 = atomSet->GetAtom(atom1, overlayEnsembles, true);
  111.     if (!a1) return true;
  112.     const AtomCoord *a2 = atomSet->GetAtom(atom2, overlayEnsembles, true);
  113.     if (!a2) return true;
  114.     // get Style
  115.     BondStyle bondStyle;
  116.     if (!parentSet->styleManager->GetBondStyle(this, atom1, a1, atom2, a2,
  117.             (a1->site - a2->site).length(), &bondStyle))
  118.         return false;
  119.     // don't show bond if either atom isn't visible
  120.     if (bondStyle.end1.style == StyleManager::eNotDisplayed &&
  121.         bondStyle.end2.style == StyleManager::eNotDisplayed)
  122.         return true;
  123.     // get prev, next alphas if drawing worm virtual bond
  124.     const Vector *site0 = NULL, *site3 = NULL;
  125.     if (bondStyle.end1.style == StyleManager::eLineWormBond ||
  126.         bondStyle.end1.style == StyleManager::eThickWormBond ||
  127.         bondStyle.end2.style == StyleManager::eLineWormBond ||
  128.         bondStyle.end2.style == StyleManager::eThickWormBond) {
  129.         if (previousVirtual) {
  130.             const AtomCoord *a0 = atomSet->GetAtom(previousVirtual->atom1, overlayEnsembles, true);
  131.             if (a0) site0 = &(a0->site);
  132.         }
  133.         if (!site0) site0 = &(a1->site);
  134.         if (nextVirtual) {
  135.             const AtomCoord *a3 = atomSet->GetAtom(nextVirtual->atom2, overlayEnsembles, true);
  136.             if (a3) site3 = &(a3->site);
  137.         }
  138.         if (!site3) site3 = &(a2->site);
  139.     }
  140.     // draw the bond
  141.     parentSet->renderer->DrawBond(a1->site, a2->site, bondStyle, site0, site3);
  142.     return true;
  143. }
  144. END_SCOPE(Cn3D)
  145. /*
  146. * ---------------------------------------------------------------------------
  147. * $Log: bond.cpp,v $
  148. * Revision 1000.2  2004/06/01 18:27:52  gouriano
  149. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.21
  150. *
  151. * Revision 1.21  2004/05/21 21:41:38  gorelenk
  152. * Added PCH ncbi_pch.hpp
  153. *
  154. * Revision 1.20  2004/02/19 17:04:44  thiessen
  155. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  156. *
  157. * Revision 1.19  2003/06/21 08:18:58  thiessen
  158. * show all atoms with coordinates, even if not in all coord sets
  159. *
  160. * Revision 1.18  2003/02/03 19:20:01  thiessen
  161. * format changes: move CVS Log to bottom of file, remove std:: from .cpp files, and use new diagnostic macros
  162. *
  163. * Revision 1.17  2001/08/09 19:07:13  thiessen
  164. * add temperature and hydrophobicity coloring
  165. *
  166. * Revision 1.16  2001/06/29 18:13:57  thiessen
  167. * initial (incomplete) user annotation system
  168. *
  169. * Revision 1.15  2001/03/23 04:18:52  thiessen
  170. * parse and display disulfides
  171. *
  172. * Revision 1.14  2000/12/01 19:35:56  thiessen
  173. * better domain assignment; basic show/hide mechanism
  174. *
  175. * Revision 1.13  2000/08/25 14:22:00  thiessen
  176. * minor tweaks
  177. *
  178. * Revision 1.12  2000/08/24 18:43:52  thiessen
  179. * tweaks for transparent sphere display
  180. *
  181. * Revision 1.11  2000/08/11 12:58:31  thiessen
  182. * added worm; get 3d-object coords from asn1
  183. *
  184. * Revision 1.10  2000/08/07 00:21:17  thiessen
  185. * add display list mechanism
  186. *
  187. * Revision 1.9  2000/08/04 22:49:02  thiessen
  188. * add backbone atom classification and selection feedback mechanism
  189. *
  190. * Revision 1.8  2000/08/03 15:12:23  thiessen
  191. * add skeleton of style and show/hide managers
  192. *
  193. * Revision 1.7  2000/07/27 13:30:51  thiessen
  194. * remove 'using namespace ...' from all headers
  195. *
  196. * Revision 1.6  2000/07/18 16:50:10  thiessen
  197. * more friendly rotation center setting
  198. *
  199. * Revision 1.5  2000/07/18 02:41:32  thiessen
  200. * fix bug in virtual bonds and altConfs
  201. *
  202. * Revision 1.4  2000/07/17 22:37:17  thiessen
  203. * fix vector_math typo; correctly set initial view
  204. *
  205. * Revision 1.3  2000/07/17 04:20:49  thiessen
  206. * now does correct structure alignment transformation
  207. *
  208. * Revision 1.2  2000/07/16 23:19:10  thiessen
  209. * redo of drawing system
  210. *
  211. * Revision 1.1  2000/07/11 13:45:28  thiessen
  212. * add modules to parse chemical graph; many improvements
  213. *
  214. */