RDKit
Open-source cheminformatics and machine learning.
Loading...
Searching...
No Matches
EmbeddedFrag.h
Go to the documentation of this file.
1//
2// Copyright (C) 2003-2022 Greg Landrum and other RDKit contributors
3//
4// @@ All Rights Reserved @@
5// This file is part of the RDKit.
6// The contents are covered by the terms of the BSD license
7// which is included in the file license.txt, found at the root
8// of the RDKit source tree.
9//
10#include <RDGeneral/export.h>
11#ifndef RD_EMBEDDED_FRAG_H
12#define RD_EMBEDDED_FRAG_H
13
14#include <RDGeneral/types.h>
16#include <Geometry/point.h>
17#include "DepictUtils.h"
18#include <boost/smart_ptr.hpp>
19#include <boost/dynamic_bitset.hpp>
20
21namespace RDKit {
22class ROMol;
23class Bond;
24} // namespace RDKit
25
26namespace RDDepict {
27typedef boost::shared_array<double> DOUBLE_SMART_PTR;
28
29//! Class that contains the data for an atoms that has already been embedded
31 public:
32 typedef enum {
36 } EAtomType;
37
38 EmbeddedAtom() { neighs.clear(); }
39
40 EmbeddedAtom(const EmbeddedAtom &other) = default;
41
42 EmbeddedAtom(unsigned int aid, const RDGeom::Point2D &pos)
43 : aid(aid),
44 angle(-1.0),
45 nbr1(-1),
46 nbr2(-1),
47 CisTransNbr(-1),
48 ccw(true),
49 rotDir(0),
50 d_density(-1.0),
51 df_fixed(false) {
52 loc = pos;
53 }
54
56 if (this == &other) {
57 return *this;
58 }
59
60 loc = other.loc;
61 angle = other.angle;
62 nbr1 = other.nbr1;
63 nbr2 = other.nbr2;
65 rotDir = other.rotDir;
66 normal = other.normal;
67 ccw = other.ccw;
68 neighs = other.neighs;
69 d_density = other.d_density;
70 df_fixed = other.df_fixed;
71 return *this;
72 }
73
74 void Transform(const RDGeom::Transform2D &trans) {
75 RDGeom::Point2D temp = loc + normal;
76 trans.TransformPoint(loc);
77 trans.TransformPoint(temp);
78 normal = temp - loc;
79 }
80
81 void Reflect(const RDGeom::Point2D &loc1, const RDGeom::Point2D &loc2) {
82 RDGeom::Point2D temp = loc + normal;
83 loc = reflectPoint(loc, loc1, loc2);
84 temp = reflectPoint(temp, loc1, loc2);
85 normal = temp - loc;
86 ccw = (!ccw);
87 }
88
89 unsigned int aid{0}; // the id of the atom
90
91 //! the angle that is already takes at this atom, so any new atom attaching to
92 /// this atom with have to fall in the available part
93 double angle{-1.0};
94
95 //! the first neighbor of this atom that form the 'angle'
96 int nbr1{-1};
97
98 //! the second neighbor of atom that from the 'angle'
99 int nbr2{-1};
100
101 //! is this is a cis/trans atom the neighbor of this atom that is involved in
102 /// the cis/trans system - defaults to -1
103 int CisTransNbr{-1};
104
105 //! which direction do we rotate this normal to add the next bond
106 //! if ccw is true we rotate counter clockwise, otherwise rotate clock wise,
107 /// by an angle that is <= PI/2
108 bool ccw{true};
109
110 //! rotation direction around this atom when adding new atoms,
111 /// we determine this for the first neighbor and stick to this direction
112 /// after that
113 //! useful only on atoms that are degree >= 4
114 int rotDir{0};
115
116 RDGeom::Point2D loc; // the current location of this atom
117 //! this is a normal vector to one of the bonds that added this atom
118 //! it provides the side on which we want to add a new bond to this atom
119 //! this is only relevant when we are dealing with non ring atoms. We would
120 /// like to draw chains in a zig-zag manner
122
123 //! and these are the atom IDs of the neighbors that still need to be embedded
125
126 // density of the atoms around this atoms
127 // - this is sum of inverse of the square of distances to other atoms from
128 // this atom. Used in the collision removal code
129 // - initialized to -1.0
130 double d_density{-1.0};
131
132 //! if set this atom is fixed: further operations on the fragment may not
133 //! move it.
134 bool df_fixed{false};
135};
136
137typedef std::map<unsigned int, EmbeddedAtom> INT_EATOM_MAP;
138typedef INT_EATOM_MAP::iterator INT_EATOM_MAP_I;
139typedef INT_EATOM_MAP::const_iterator INT_EATOM_MAP_CI;
140
141//! Class containing a fragment of a molecule that has already been embedded
142/*
143 Here is how this class is designed to be used
144 - find a set of fused rings and compute the coordinates for the atoms in those
145 ring
146 - them grow this system either by adding non ring neighbors
147 - or by adding other embedded fragment
148 - so at the end of the process the whole molecule end up being one these
149 embedded frag objects
150*/
152 // REVIEW: think about moving member functions up to global level and just
153 // using
154 // this class as a container
155
156 public:
157 //! Default constructor
159 d_eatoms.clear();
160 d_attachPts.clear();
161 }
162
163 //! Initializer from a single atom id
164 /*!
165 A single Embedded Atom with this atom ID is added and placed at the origin
166 */
167 EmbeddedFrag(unsigned int aid, const RDKit::ROMol *mol);
168
169 //! Constructor when the coordinates have been specified for a set of atoms
170 /*!
171 This simply initialized a set of EmbeddedAtom to have the same coordinates
172 as the one's specified. No testing is done to verify any kind of
173 correctness. Also this fragment is less ready (to expand and add new
174 neighbors) than when using other constructors. This is because:
175 - the user may have specified coords for only a part of the atoms in a
176 fused ring systems in which case we need to find these atoms and merge
177 these ring systems to this fragment
178 - The atoms are not yet aware of their neighbor (what is left to add etc.)
179 this again depends on atoms properly so that new neighbors can be added
180 to them
181 */
183 const RDGeom::INT_POINT2D_MAP &coordMap);
184
185 //! Initializer from a set of fused rings
186 /*!
187 ARGUMENTS:
188 \param mol the molecule of interest
189 \param fusedRings a vector of rings, each ring is a list of atom ids
190 \param useRingTemplates whether to use ring system templates for generating
191 initial coordinates
192 */
193 EmbeddedFrag(const RDKit::ROMol *mol, const RDKit::VECT_INT_VECT &fusedRings,
194 bool useRingTemplates);
195
196 //! Initializer for a cis/trans system using the double bond
197 /*!
198 ARGUMENTS:
199 \param dblBond the double bond that is involved in the cis/trans
200 configuration
201 */
202 explicit EmbeddedFrag(const RDKit::Bond *dblBond);
203
204 //! Expand this embedded system by adding neighboring atoms or other embedded
205 /// systems
206 /*!
207
208 Note that both nratms and efrags are modified in this function
209 as we start merging them with the current fragment
210
211 */
212 void expandEfrag(RDKit::INT_LIST &nratms, std::list<EmbeddedFrag> &efrags);
213
214 //! Add a new non-ring atom to this object
215 /*
216 ARGUMENTS:
217 \param aid ID of the atom to be added
218 \param toAid ID of the atom that is already in this object to which this
219 atom is added
220 */
221 void addNonRingAtom(unsigned int aid, unsigned int toAid);
222
223 //! Merge this embedded object with another embedded fragment
224 /*!
225
226 The transformation (rotation + translation required to attached
227 the passed in object will be computed and applied. The
228 coordinates of the atoms in this object will remain fixed We
229 will assume that there are no common atoms between the two
230 fragments to start with
231
232 ARGUMENTS:
233 \param embObj another EmbeddedFrag object to be merged with this object
234 \param toAid the atom in this embedded fragment to which the new object
235 will be attached
236 \param nbrAid the atom in the other fragment to attach to
237 */
238 void mergeNoCommon(EmbeddedFrag &embObj, unsigned int toAid,
239 unsigned int nbrAid);
240
241 //! Merge this embedded object with another embedded fragment
242 /*!
243
244 The transformation (rotation + translation required to attached
245 the passed in object will be computed and applied. The
246 coordinates of the atoms in this object will remain fixed This
247 already know there are a atoms in common and we will use them to
248 merge things
249
250 ARGUMENTS:
251 \param embObj another EmbeddedFrag object to be merged with this object
252 \param commAtms a vector of ids of the common atoms
253
254 */
256
257 void mergeFragsWithComm(std::list<EmbeddedFrag> &efrags);
258
259 //! Mark this fragment to be done for final embedding
260 void markDone() { d_done = true; }
261
262 //! If this fragment done for the final embedding
263 bool isDone() { return d_done; }
264
265 //! Get the molecule that this embedded fragment belongs to
266 const RDKit::ROMol *getMol() const { return dp_mol; }
267
268 //! Find the common atom ids between this fragment and a second one
270
271 //! Find a neighbor to a non-ring atom among the already embedded atoms
272 /*!
273 ARGUMENTS:
274 \param aid the atom id of interest
275
276 RETURNS:
277 \return the id of the atom if we found a neighbor
278 -1 otherwise
279
280 NOTE: by definition we can have only one neighbor in the embedded system.
281 */
282 int findNeighbor(unsigned int aid);
283
284 //! Transform this object to a new coordinates system
285 /*!
286 ARGUMENTS:
287 \param trans : the transformation that need to be applied to the atoms in
288 this object
289 */
290 void Transform(const RDGeom::Transform2D &trans);
291
292 void Reflect(const RDGeom::Point2D &loc1, const RDGeom::Point2D &loc2);
293
294 const INT_EATOM_MAP &GetEmbeddedAtoms() const { return d_eatoms; }
295
296 void Translate(const RDGeom::Point2D &shift) {
297 INT_EATOM_MAP_I eari;
298 for (eari = d_eatoms.begin(); eari != d_eatoms.end(); eari++) {
299 eari->second.loc += shift;
300 }
301 }
302
303 EmbeddedAtom GetEmbeddedAtom(unsigned int aid) const {
304 INT_EATOM_MAP_CI posi = d_eatoms.find(aid);
305 if (posi == d_eatoms.end()) {
306 PRECONDITION(0, "Embedded atom does not contain embedded atom specified");
307 }
308 return posi->second;
309 }
310
311 //! the number of atoms in the embedded system
312 int Size() const { return d_eatoms.size(); }
313
314 //! \brief compute a box that encloses the fragment
316
317 //! \brief Flip atoms on one side of a bond - used in removing collisions
318 /*!
319 ARGUMENTS:
320 \param bondId - the bond used as the mirror to flip
321 \param flipEnd - flip the atoms at the end of the bond
322
323 */
324 void flipAboutBond(unsigned int bondId, bool flipEnd = true);
325
326 //! \brief flip one ring of a spiro compound to resolve collisions
327 /*!
328 \param spiroAid - the spiro center atom index
329 */
330 void flipAboutSpiroCenter(unsigned int spiroAid);
331
332 void openAngles(const double *dmat, unsigned int aid1, unsigned int aid2);
333
334 std::vector<PAIR_I_I> findCollisions(const double *dmat,
335 bool includeBonds = 1);
336
338
340 double mimicDmatWt);
341
342 void permuteBonds(unsigned int aid, unsigned int aid1, unsigned int aid2);
343
344 void randomSampleFlipsAndPermutations(unsigned int nBondsPerSample = 3,
345 unsigned int nSamples = 100,
346 int seed = 100,
347 const DOUBLE_SMART_PTR *dmat = nullptr,
348 double mimicDmatWt = 0.0,
349 bool permuteDeg4Nodes = false);
350
351 //! Remove collisions in a structure by flipping rotatable bonds and spiro centers
352 //! along the shortest path between two colliding atoms
354
355 [[deprecated("please use removeCollisionsBondAndSpiroFlip()")]] void removeCollisionsBondFlip() { removeCollisionsBondAndSpiroFlip(); };
356
357 //! Remove collision by opening angles at the offending atoms
359
360 //! Remove collisions by shortening bonds along the shortest path between the
361 /// atoms
363
364 //! helpers functions to
365
366 //! \brief make list of neighbors for each atom in the embedded system that
367 //! still need to be embedded
369
370 //! update the unembedded neighbor atom list for a specified atom
371 void updateNewNeighs(unsigned int aid);
372
373 //! \brief Find all atoms in this embedded system that are
374 //! within a specified distant of a point
375 int findNumNeigh(const RDGeom::Point2D &pt, double radius);
376
377 inline double getBoxPx() { return d_px; }
378 inline double getBoxNx() { return d_nx; }
379 inline double getBoxPy() { return d_py; }
380 inline double getBoxNy() { return d_ny; }
381
383
384 private:
385 double totalDensity();
386
387 // Helper methods for collision resolution
388 bool tryResolvingCollisionWithBondFlip(
389 const std::pair<unsigned int, unsigned int> &cAids,
390 unsigned int ncols,
391 double prevDensity,
392 std::map<int, unsigned int> &doneBonds,
393 const double *dmat);
394
395 bool tryResolvingCollisionWithSpiroFlip(
396 const std::pair<unsigned int, unsigned int> &cAids,
397 unsigned int ncols,
398 double prevDensity,
399 std::map<int, unsigned int> &doneSpiros,
400 const boost::dynamic_bitset<> &spiroCenters,
401 const double *dmat);
402
403 // returns true if fused rings found a template
404 bool matchToTemplate(const RDKit::INT_VECT &ringSystemAtoms);
405
406 void embedFusedRings(const RDKit::VECT_INT_VECT &fusedRings,
407 bool useRingTemplates);
408
409 void setupAttachmentPoints();
410
411 //! \brief Find a transform to join a ring to the current embedded frag when
412 /// we
413 //! have only on common atom
414 /*!
415 So this is the state of affairs assumed here:
416 - we already have some rings in the fused system embedded and the
417 coordinates for the atoms
418 - the coordinates for the atoms in the new ring (with the center
419 of rings at the origin) are available nringCors. we want to
420 translate and rotate this ring to join with the already
421 embeded rings.
422 - only one atom is common between this new ring and the atoms
423 that are already embedded
424 - so we need to compute a transform that includes a translation
425 so that the common atom overlaps and the rotation to minimize
426 overlap with other atoms.
427
428 Here's what is done:
429 - we bisect the remaining sweep angle at the common atom and
430 attach the new ring such that the center of the new ring falls
431 on this bisecting line
432
433 NOTE: It is assumed here that the original coordinates for the
434 new ring are such that the center is at the origin (this is the
435 way rings come out of embedRing)
436 */
437 RDGeom::Transform2D computeOneAtomTrans(unsigned int commAid,
438 const EmbeddedFrag &other);
439
440 RDGeom::Transform2D computeTwoAtomTrans(
441 unsigned int aid1, unsigned int aid2,
442 const RDGeom::INT_POINT2D_MAP &nringCor);
443
444 //! Merge a ring with already embedded atoms
445 /*!
446 It is assumed that the new rings has already been oriented
447 correctly etc. This function just update all the relevant data,
448 like the neighbor information and the sweep angle
449 */
450 void mergeRing(const EmbeddedFrag &embRing, unsigned int nCommon,
451 const RDKit::INT_VECT &pinAtoms);
452
453 //! Reflect a fragment if necessary through a line connecting two atoms
454 /*!
455
456 We want add the new fragment such that, most of its atoms fall
457 on the side opposite to where the atoms already embedded are aid1
458 and aid2 give the atoms that were used to align the new ring to
459 the embedded atoms and we will assume that that process has
460 already taken place (i.e. transformRing has been called)
461
462 */
463 void reflectIfNecessaryDensity(EmbeddedFrag &embFrag, unsigned int aid1,
464 unsigned int aid2);
465
466 //! Reflect a fragment if necessary based on the cis/trans specification
467 /*!
468
469 we want to add the new fragment such that the cis/trans
470 specification on bond between aid1 and aid2 is not violated. We
471 will assume that aid1 and aid2 from this fragments as well as
472 embFrag are already aligned to each other.
473
474 \param embFrag the fragment that will be reflected if necessary
475 \param ctCase which fragment if the cis/trans dbl bond
476 - 1 means embFrag is the cis/trans fragment
477 - 2 mean "this" is the cis/trans fragment
478 \param aid1 first atom that forms the plane (line) of reflection
479 \param aid2 second atom that forms the plane of reflection
480 */
481 void reflectIfNecessaryCisTrans(EmbeddedFrag &embFrag, unsigned int ctCase,
482 unsigned int aid1, unsigned int aid2);
483
484 //! Reflect a fragment if necessary based on a third common point
485 /*!
486
487 we want add the new fragment such that the third point falls on
488 the same side of aid1 and aid2. We will assume that aid1 and
489 aid2 from this fragments as well as embFrag are already aligned
490 to each other.
491
492 */
493 void reflectIfNecessaryThirdPt(EmbeddedFrag &embFrag, unsigned int aid1,
494 unsigned int aid2, unsigned int aid3);
495
496 //! \brief Initialize this fragment from a ring and coordinates for its atoms
497 /*!
498 ARGUMENTS:
499 /param ring a vector of atom ids in the ring; it is assumed that there
500 in
501 clockwise or anti-clockwise order
502 /param nringMap a map of atomId to coordinate map for the atoms in the ring
503 */
504 void initFromRingCoords(const RDKit::INT_VECT &ring,
505 const RDGeom::INT_POINT2D_MAP &nringMap);
506
507 //! Helper function to addNonRingAtom to a specified atoms in the fragment
508 /*
509 Add an atom to this embedded fragment when the fragment already
510 has at least two neighbors previously added to 'toAid'. In this
511 case we have to choose where the new neighbor goes based on
512 the angle that is already taken around the atom.
513
514 ARGUMENTS:
515 \param aid ID of the atom to be added
516 \param toAid ID of the atom that is already in this object to which this
517 atom is added
518 */
519 void addAtomToAtomWithAng(unsigned int aid, unsigned int toAid);
520
521 //! Helper function to addNonRingAtom to a specified atoms in the fragment
522 /*!
523
524 Add an atom (aid) to an atom (toAid) in this embedded fragment
525 when 'toAid' has one or no neighbors previously added. In this
526 case where the new atom should fall is determined by the degree
527 of 'toAid' and the congestion around it.
528
529 ARGUMENTS:
530 \param aid ID of the atom to be added
531 \param toAid ID of the atom that is already in this object to which this
532 atom is added
533 \param mol the molecule we are dealing with
534 */
535 void addAtomToAtomWithNoAng(
536 unsigned int aid,
537 unsigned int toAid); //, const RDKit::ROMol *mol);
538
539 //! Helper function to constructor that takes predefined coordinates
540 /*!
541
542 Given an atom with more than 2 neighbors all embedded in this
543 fragment this function tries to determine
544
545 - how much of an angle if left for any new neighbors yet to be
546 added
547 - which atom should we rotate when we add a new neighbor and in
548 which direction (clockwise or anticlockwise
549
550 This is how it works
551 - find the pair of nbrs that have the largest angle
552 - this will most likely be the angle that is available - unless
553 we have fused rings and we found on of the ring angle !!!! -
554 in this case we find the next best
555 - find the smallest angle that contains one of these nbrs -
556 this determined which
557 - way we want to rotate
558
559 ARGUMENTS:
560 \param aid the atom id where we are centered right now
561 \param doneNbrs list of neighbors that are already embedded around aid
562 */
563 void computeNbrsAndAng(unsigned int aid, const RDKit::INT_VECT &doneNbrs);
564 // const RDKit::ROMol *mol);
565
566 //! are we embedded with the final (molecule) coordinates
567 bool d_done = false;
568 double d_px = 0.0, d_nx = 0.0, d_py = 0.0, d_ny = 0.0;
569
570 //! a map that takes one from the atom id to the embeddedatom object for that
571 /// atom.
572 INT_EATOM_MAP d_eatoms;
573
574 // RDKit::INT_DEQUE d_attachPts;
575 RDKit::INT_LIST d_attachPts;
576
577 // pointer to the owning molecule
578 const RDKit::ROMol *dp_mol = nullptr;
579};
580} // namespace RDDepict
581
582#endif
#define PRECONDITION(expr, mess)
Definition Invariant.h:108
Class that contains the data for an atoms that has already been embedded.
EmbeddedAtom(const EmbeddedAtom &other)=default
int nbr1
the first neighbor of this atom that form the 'angle'
RDKit::INT_VECT neighs
and these are the atom IDs of the neighbors that still need to be embedded
RDGeom::Point2D normal
int nbr2
the second neighbor of atom that from the 'angle'
RDGeom::Point2D loc
EmbeddedAtom & operator=(const EmbeddedAtom &other)
EmbeddedAtom(unsigned int aid, const RDGeom::Point2D &pos)
void Transform(const RDGeom::Transform2D &trans)
void Reflect(const RDGeom::Point2D &loc1, const RDGeom::Point2D &loc2)
EmbeddedAtom GetEmbeddedAtom(unsigned int aid) const
void Transform(const RDGeom::Transform2D &trans)
Transform this object to a new coordinates system.
void flipAboutSpiroCenter(unsigned int spiroAid)
flip one ring of a spiro compound to resolve collisions
void updateNewNeighs(unsigned int aid)
update the unembedded neighbor atom list for a specified atom
void markDone()
Mark this fragment to be done for final embedding.
EmbeddedFrag(const RDKit::ROMol *mol, const RDKit::VECT_INT_VECT &fusedRings, bool useRingTemplates)
Initializer from a set of fused rings.
void flipAboutBond(unsigned int bondId, bool flipEnd=true)
Flip atoms on one side of a bond - used in removing collisions.
std::vector< PAIR_I_I > findCollisions(const double *dmat, bool includeBonds=1)
int Size() const
the number of atoms in the embedded system
void mergeNoCommon(EmbeddedFrag &embObj, unsigned int toAid, unsigned int nbrAid)
Merge this embedded object with another embedded fragment.
EmbeddedFrag(const RDKit::ROMol *mol, const RDGeom::INT_POINT2D_MAP &coordMap)
Constructor when the coordinates have been specified for a set of atoms.
EmbeddedFrag()
Default constructor.
EmbeddedFrag(const RDKit::Bond *dblBond)
Initializer for a cis/trans system using the double bond.
RDKit::INT_VECT findCommonAtoms(const EmbeddedFrag &efrag2)
Find the common atom ids between this fragment and a second one.
void expandEfrag(RDKit::INT_LIST &nratms, std::list< EmbeddedFrag > &efrags)
int findNumNeigh(const RDGeom::Point2D &pt, double radius)
Find all atoms in this embedded system that are within a specified distant of a point.
void removeCollisionsOpenAngles()
Remove collision by opening angles at the offending atoms.
EmbeddedFrag(unsigned int aid, const RDKit::ROMol *mol)
Initializer from a single atom id.
double mimicDistMatAndDensityCostFunc(const DOUBLE_SMART_PTR *dmat, double mimicDmatWt)
void removeCollisionsBondAndSpiroFlip()
void Translate(const RDGeom::Point2D &shift)
void addNonRingAtom(unsigned int aid, unsigned int toAid)
Add a new non-ring atom to this object.
void permuteBonds(unsigned int aid, unsigned int aid1, unsigned int aid2)
const RDKit::ROMol * getMol() const
Get the molecule that this embedded fragment belongs to.
void removeCollisionsShortenBonds()
void setupNewNeighs()
helpers functions to
void Reflect(const RDGeom::Point2D &loc1, const RDGeom::Point2D &loc2)
void computeBox()
compute a box that encloses the fragment
void openAngles(const double *dmat, unsigned int aid1, unsigned int aid2)
const INT_EATOM_MAP & GetEmbeddedAtoms() const
void mergeWithCommon(EmbeddedFrag &embObj, RDKit::INT_VECT &commAtms)
Merge this embedded object with another embedded fragment.
void randomSampleFlipsAndPermutations(unsigned int nBondsPerSample=3, unsigned int nSamples=100, int seed=100, const DOUBLE_SMART_PTR *dmat=nullptr, double mimicDmatWt=0.0, bool permuteDeg4Nodes=false)
bool isDone()
If this fragment done for the final embedding.
void mergeFragsWithComm(std::list< EmbeddedFrag > &efrags)
int findNeighbor(unsigned int aid)
Find a neighbor to a non-ring atom among the already embedded atoms.
void computeDistMat(DOUBLE_SMART_PTR &dmat)
void TransformPoint(Point2D &pt) const
class for representing a bond
Definition Bond.h:46
#define RDKIT_DEPICTOR_EXPORT
Definition export.h:97
boost::shared_array< double > DOUBLE_SMART_PTR
INT_EATOM_MAP::iterator INT_EATOM_MAP_I
RDKIT_DEPICTOR_EXPORT RDGeom::Point2D reflectPoint(const RDGeom::Point2D &point, const RDGeom::Point2D &loc1, const RDGeom::Point2D &loc2)
std::map< unsigned int, EmbeddedAtom > INT_EATOM_MAP
INT_EATOM_MAP::const_iterator INT_EATOM_MAP_CI
std::map< int, Point2D > INT_POINT2D_MAP
Definition point.h:556
Std stuff.
std::list< int > INT_LIST
Definition types.h:230
std::vector< int > INT_VECT
Definition types.h:224
std::vector< INT_VECT > VECT_INT_VECT
Definition types.h:238