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