CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DDCompareTools.cc
Go to the documentation of this file.
3 
5 
6 DDCompareEPV::DDCompareEPV(const DDCompOptions& ddco) : ddco_(ddco) { }
7 
9  bool ret(true);
10  /* struct DDCompareCPVGraph : public std::binary_function<DDCompactView::graph_type, DDCompactView::graph_type, bool> { */
11  /* bool operator()(const DDCompactView::graph_type& lhs, const DDCompactView::graph_type& rhs) const { */
12  /* bool ret; */
13  // const graph<DDLogicalPart, DDPosData*>& g1= lhs;
14  // graph<DDLogicalPart, DDPosData*>::const_iterator beg1 = g1.begin();
15  //DDCompactView::graph_type::const_iterator beg1 = lhs.begin();
16  /* std::cout << "size of lhs = " << lhs.edge_size() << std::endl; */
17  /* std::cout << "size of rhs = " << rhs.edge_size() << std::endl; */
18  /* std::cout << "iterating over lhs edges?" << std::endl; */
19  /* graph<DDLogicalPart, DDPosData*>::const_iterator beg1(lhs), end1(lhs); */
20  /* beg1 = lhs.begin_iter(); */
21  /* end1 = lhs.end_iter(); */
22  /* size_t countem(0); */
23  /* for ( ; beg1 != end1 ; ++beg1 ) { */
24  /* ++countem; */
25  /* } */
26  /* std::cout << "between lhs.begin_iter() and lhs.end_iter() there are " << countem << std::endl; */
27  /* graph<DDLogicalPart,DDPosData*>::const_edge_range cer = lhs.graph().edges(lhs.root()); */
28  /* graph<DDLogicalPart,DDPosData*>::adj_iterator i = const_edge_range.first */
29  // DDExpandedView v1(lhs), v2(rhs);
30  // if (v1.next()) std::cout << "v1 is true" << std::endl;
31  // if (v2.next()) std::cout << "v2 is true" << std::endl;
32  // DDNodeComparator ddnc;
33  //if ( ddnc (v1, v2) ) {
34  // ret = true;
35  //}
36  /* while (v1.next()) { */
37  /* if (v2.next()) { */
38  /* std::cout << v1.logicalPart().name().name() << ":" << v1.copyno() */
39  /* << " !=? " << v2.logicalPart().name().name() << ":" << v2.copyno() */
40  /* << std::endl; */
41 
42  /* if ( v1.logicalPart().name().name() != v2.logicalPart().name().name() ) { */
43  /* std::cout << v1.logicalPart().name().name() << ":" << v1.copyno() */
44  /* << " !=? " << v2.logicalPart().name().name() << ":" << v2.copyno() */
45  /* << std::endl; */
46  /* // std::cout << v1.logicalPart().name().name() << " !=? " << v2.logicalPart().name().name() << std::endl; */
47  /* ret=false; */
48  /* break; */
49  /* } */
50  /* } */
51  /* } */
52  std::cout <<"*********FIRST BY firstChild, firstChild, nextSibling, nextSibling*********" << std::endl;
53  std::cout << lhs.logicalPart().name().name() << ":" << lhs.copyno()
54  << " !=? " << rhs.logicalPart().name().name() << ":" << rhs.copyno()
55  << std::endl;
56  lhs.firstChild();
57  rhs.firstChild();
58  std::cout << lhs.logicalPart().name().name() << ":" << lhs.copyno()
59  << " !=? " << rhs.logicalPart().name().name() << ":" << rhs.copyno()
60  << std::endl;
61  lhs.firstChild();
62  rhs.firstChild();
63  std::cout << lhs.logicalPart().name().name() << ":" << lhs.copyno()
64  << " !=? " << rhs.logicalPart().name().name() << ":" << rhs.copyno()
65  << std::endl;
66  lhs.nextSibling();
67  rhs.nextSibling();
68  std::cout << lhs.logicalPart().name().name() << ":" << lhs.copyno()
69  << " !=? " << rhs.logicalPart().name().name() << ":" << rhs.copyno()
70  << std::endl;
71  lhs.nextSibling();
72  rhs.nextSibling();
73  std::cout << lhs.logicalPart().name().name() << ":" << lhs.copyno()
74  << " !=? " << rhs.logicalPart().name().name() << ":" << rhs.copyno()
75  << std::endl;
76  lhs.parent();
77  rhs.parent();
78  std::cout <<"*********THEN BY next, next, next, next*********" << std::endl;
79  lhs.parent();
80  rhs.parent();
81  std::cout << lhs.logicalPart().name().name() << ":" << lhs.copyno()
82  << " !=? " << rhs.logicalPart().name().name() << ":" << rhs.copyno()
83  << std::endl;
84  lhs.next();
85  rhs.next();
86  std::cout << lhs.logicalPart().name().name() << ":" << lhs.copyno()
87  << " !=? " << rhs.logicalPart().name().name() << ":" << rhs.copyno()
88  << std::endl;
89  lhs.next();
90  rhs.next();
91  std::cout << lhs.logicalPart().name().name() << ":" << lhs.copyno()
92  << " !=? " << rhs.logicalPart().name().name() << ":" << rhs.copyno()
93  << std::endl;
94  std::cout << lhs.depth() << " depth " << rhs.depth() << std::endl;
95  lhs.next();
96  rhs.next();
97  std::cout << lhs.depth() << " depth " << rhs.depth() << std::endl;
98  std::cout << lhs.logicalPart().name().name() << ":" << lhs.copyno()
99  << " !=? " << rhs.logicalPart().name().name() << ":" << rhs.copyno()
100  << std::endl;
101  return ret;
102 }
103 
105 
106 DDCompareCPV::DDCompareCPV(const DDCompOptions& ddco) : ddco_(ddco) { }
107 
108 bool DDCompareCPV::operator()(const DDCompactView& lhs, const DDCompactView& rhs) const {
109  bool ret(true);
110 
111  const DDCompactView::graph_type & g1 = lhs.graph();
112  const DDCompactView::graph_type & g2 = rhs.graph();
113 
114  typedef DDCompactView::graph_type::const_adj_iterator adjl_iterator;
115  adjl_iterator git1 = g1.begin();
116  adjl_iterator gend1 = g1.end();
117  adjl_iterator git2 = g2.begin();
118  adjl_iterator gend2 = g2.end();
119  /* std::cout << "uniqueness test: " << &(*git1) << " != " << &(*git2) */
120  /* << " and " << &(*gend1) << " != " << &(*gend2) << std::endl; */
121  // DDCompactView::graph_type::const_iterator bit = g1.begin_iter();
123  // for (; git1 != gend1; ++git1) {
124  while ( git1 != gend1 && git2 != gend2 && ret ) {
125  const DDLogicalPart & ddLP1 = g1.nodeData(git1);
126  const DDLogicalPart & ddLP2 = g2.nodeData(git2);
127  std::cout << ++i << " P " << ddLP1.name() << " " << ddLP2.name() << std::endl;
128  if ( ! DDCompareLP(ddco_)(ddLP1, ddLP2) ) {
129  ret = false;
130  break;
131  } else if (git1->size() && git2->size() ) {
132  DDCompactView::graph_type::edge_list::const_iterator cit1 = git1->begin();
133  DDCompactView::graph_type::edge_list::const_iterator cend1 = git1->end();
134  DDCompactView::graph_type::edge_list::const_iterator cit2 = git2->begin();
135  DDCompactView::graph_type::edge_list::const_iterator cend2 = git2->end();
136  //for (; cit != cend; ++cit) {
137  while ( cit1 != cend1 && cit2 != cend2 ) {
138  const DDLogicalPart & ddcurLP1 = g1.nodeData(cit1->first);
139  const DDLogicalPart & ddcurLP2 = g2.nodeData(cit2->first);
140  std::cout << ++i << " c1--> " << g1.edgeData(cit1->second)->copyno_ << " " << ddcurLP1.name().fullname() << std::endl;
141  std::cout << ++i << " c2--> " << g2.edgeData(cit2->second)->copyno_ << " " << ddcurLP2.name().fullname() << std::endl;
142  const DDPosData* p1(g1.edgeData(cit1->second));
143  const DDPosData* p2(g2.edgeData(cit2->second));
144  // if ( g1.edgeData(cit1->second)->copyno_ != g2.edgeData(cit2->second)->copyno_
145 // if ( p1->copyno_ != p2->copyno_
146 // || ddcurLP1.name().fullname() != ddcurLP2.name().fullname() ) {
147 // std::cout << "Failed to match node (fullname:copy_no): 1: "
148 // << ddcurLP1.name().fullname() << ":" << p1->copyno_ << " 2: "
149 // << ddcurLP2.name().fullname() << ":" << p2->copyno_ << std::endl;
150 // ret = false;
151 // break;
152  if ( p1->copyno_ != p2->copyno_ ||
153  ! DDCompareLP(ddco_)(ddcurLP1,ddcurLP2) ) {
154  std::cout << "Failed to match node (fullname:copy_no): 1: "
155  << ddcurLP1.name().fullname() << ":" << p1->copyno_ << " 2: "
156  << ddcurLP2.name().fullname() << ":" << p2->copyno_ << std::endl;
157  ret = false;
158  break;
159  } else if ( ! DDCompareDDTrans()(p1->trans_, p2->trans_) ) {
160  std::cout << "Failed to match translation " << std::endl;
161 // std::cout << "1: " << std::setw(12) << std::fixed << std::setprecision(4) << p1->trans_.x();
162 // std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << p1->trans_.y();
163 // std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << p1->trans_.z() << std::endl;
164 // std::cout << "2: " << std::setw(12) << std::fixed << std::setprecision(4) << p2->trans_.x();
165 // std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << p2->trans_.y();
166 // std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << p2->trans_.z() << std::endl;
167  ret = false;
168  break;
169  } else if ( ! DDCompareDDRot(ddco_)(p1->rot_, p2->rot_) ) {
170  std::cout << "Failed to match rotation " << std::endl;
171  ret = false;
172  break;
173  }
174  ++cit1;
175  ++cit2;
176  }
177  } else if ( git1->size() != git2->size() ) {
178  ret = false;
179  std::cout << "DDCompactViews are different because number of children do not match" << std::endl;
180  std::cout << "graph1 size of edge_list: " << git1->size() << " and graph2 size of edge_list: " << git2->size() << std::endl;
181  break;
182  }
183  ++git1;
184  ++git2;
185  }
186  return ret;
187 }
188 
190 
191 DDCompareLP::DDCompareLP(const DDCompOptions& ddco) : ddco_(ddco) { }
192 
193 bool DDCompareLP::operator()(const DDLogicalPart& lhs, const DDLogicalPart& rhs) const {
194  bool ret(true);
195  // for a logical part to be equal, the solid must be equal and the name must be equal.
196  if ( lhs.name().fullname() != rhs.name().fullname() ) {
197  ret = false;
198  std::cout << "LogicalPart names do not match " << lhs.name().fullname()
199  << " and " << rhs.name().fullname() << std::endl;
200  } else if ( ! DDCompareSolid(ddco_)(lhs.solid(), rhs.solid()) ){
201  ret = false;
202  std::cout << "LogicalPart Solids do not match " << lhs.name().fullname()
203  << " and " << rhs.name().fullname() << std::endl;
204  }
205  return ret;
206 }
207 
209 
210 DDCompareSolid::DDCompareSolid(const DDCompOptions& ddco) : ddco_(ddco) { }
211 
212 bool DDCompareSolid::operator()(const DDSolid& lhs, const DDSolid& rhs) const {
213  bool ret(true);
214  switch ( lhs.shape() ) {
215  case dd_not_init:
216  case ddbox:
217  case ddtubs:
218  case ddtrap:
219  case ddcons:
220  case ddpolycone_rz:
221  case ddpolyhedra_rz:
222  case ddpolycone_rrz:
223  case ddpolyhedra_rrz:
224  case ddtorus:
225  case ddpseudotrap:
226  case ddtrunctubs:
227  case ddsphere:
228  case ddorb:
229  case ddellipticaltube:
230  case ddellipsoid:
231  case ddparallelepiped:
232  case ddshapeless:
233  {
234  if ( lhs.name().fullname() != rhs.name().fullname() ) {
235  ret = false;
236  std::cout << "Solid names do not match for solid " << lhs.name().fullname() << " and " << rhs.name().fullname() << std::endl;
237  } else if ( lhs.shape() != rhs.shape() ) {
238  ret = false;
239  std::cout << "Shape types do not match for solids " << lhs.name().fullname()
240  << " and " << rhs.name().fullname()
241  << " even though their names match " << std::endl;
242  } else if ( ! DDCompareDBLVEC()(lhs.parameters(), rhs.parameters()) ) {
243  ret = false;
244  std::cout << "Parameters do not match for solids " << lhs.name().fullname()
245  << " and " << rhs.name().fullname()
246  << " even though their names and shape type match." << std::endl;
247  std::cout << "size: " << lhs.parameters().size() << " " << rhs.parameters().size() << std::endl;
248  }
249  break;
250  }
251  case ddunion:
252  case ddsubtraction:
253  case ddintersection:
254  {
255  if ( ! DDCompareBoolSol(ddco_)(lhs, rhs) ) {
256  ret = false;
257  }
258  break;
259  }
260  case ddreflected:
261  {
262  DDReflectionSolid rs1(lhs);
263  DDReflectionSolid rs2(rhs);
264  if ( ! DDCompareSolid(ddco_)( rs1.unreflected(), rs2.unreflected()) ) {
265  ret = false;
266  std::cout << "Unreflected volumes of DDReflections do not match. Reflections are "
267  << lhs.name().fullname() << " and " << rhs.name().fullname() << std::endl;
268  }
269  break;
270  }
271  default:
272  break;
273  }
274  return ret;
275 }
276 
278 
279 DDCompareDBLVEC::DDCompareDBLVEC(double tol) : tol_(tol) { }
280 
281 bool
282 DDCompareDBLVEC::operator() ( const std::vector<double>& lhs, const std::vector<double>& rhs ) const
283 {
284  bool ret(true);
285  std::ios_base::fmtflags originalFlags = std::cout.flags();
286  int originalPrecision = std::cout.precision();
287  if( lhs.size() != rhs.size())
288  {
289  ret = false;
290  std::cout << "Size of vectors do not match." << std::endl;
291  }
292  else
293  {
294  for( size_t i = 0; i < lhs.size() ; ++i )
295  {
296  if( std::fabs( lhs[i] - rhs[i] ) > tol_ )
297  {
298  ret = false;
299  std::cout << "Vector content at index " << i << " does not match " ;
300  std::cout << std::setw(12) << std::fixed << std::setprecision(4) << lhs[i] << " != " << rhs[i] << std::endl;
301  break;
302  }
303  }
304  }
305  // Now set everything back to defaults
306  std::cout.flags( originalFlags );
307  std::cout.precision( originalPrecision );
308  return ret;
309 }
310 
312 
313 DDCompareBoolSol::DDCompareBoolSol(const DDCompOptions& ddco) : ddco_(ddco) { }
314 bool DDCompareBoolSol::operator() ( const DDBooleanSolid& lhs, const DDBooleanSolid& rhs ) const {
315  bool ret(true);
316  if ( lhs.name().fullname() != rhs.name().fullname() ) {
317  ret = false;
318  std::cout << "BooleanSolid names do not match ";
319  } else if ( lhs.shape() != rhs.shape() ) {
320  ret = false;
321  std::cout << "BooleanSolid shape types do not match ";
322  } else if ( ! DDCompareDBLVEC(ddco_.distTol_)(lhs.parameters(), rhs.parameters()) ) {
323  ret = false;
324  std::cout << "BooleanSolid parameters do not match ";
325  } else if ( ! DDCompareSolid(ddco_)(lhs.solidA(), rhs.solidA()) ) {
326  ret = false;
327  std::cout << "BooleanSolid SolidA solids do not match ";
328  } else if ( ! DDCompareSolid(ddco_)(lhs.solidB(), rhs.solidB()) ) {
329  ret= false;
330  std::cout << "BooleanSolid SolidB solids do not match ";
331  } else if ( ! DDCompareDDTrans(ddco_.distTol_)(lhs.translation(), rhs.translation()) ) {
332  ret = false;
333  std::cout << "BooleanSolid Translations do not match ";
334  } else if ( ! DDCompareDDRot(ddco_)(lhs.rotation(), rhs.rotation()) ) {
335  ret = false;
336  std::cout << "BooleanSolid Rotations do not match ";
337  }
338  if ( ! ret ) {
339  std::cout << "for boolean solids "
340  << lhs.name().fullname() << " and "
341  << rhs.name().fullname() << std::endl;
342  }
343  return ret;
344 }
345 
347 
348 DDCompareDDTrans::DDCompareDDTrans(double tol) : tol_(tol) { }
349 
350 bool DDCompareDDTrans::operator() ( const DDTranslation& lhs, const DDTranslation& rhs ) const {
351  bool ret(true);
352  if ( std::fabs(lhs.x() - rhs.x()) > tol_
353  || std::fabs(lhs.y() - rhs.y()) > tol_
354  || std::fabs(lhs.z() - rhs.z()) > tol_ ) {
355  ret=false;
356  }
357  return ret;
358 }
359 
361 
362 DDCompareDDRot::DDCompareDDRot( const DDCompOptions& ddco ) : ddco_(ddco) { }
363 
364 bool DDCompareDDRot::operator() ( const DDRotation& lhs, const DDRotation& rhs ) const {
365  bool ret(true);
366  if ( ddco_.compRotName_ && lhs.name().fullname() != rhs.name().fullname() ) {
367  ret = false;
368  std::cout << "DDRotation names do not match "
369  << lhs.name().fullname() << " and "
370  << rhs.name().fullname() << std::endl;
371  } else if ( ! DDCompareDDRotMat()(*lhs.rotation(), *rhs.rotation()) ) {
372  ret = false;
373  std::cout << "DDRotationMatrix values do not match "
374  << lhs.name().fullname() << " and "
375  << rhs.name().fullname() << std::endl;
376  }
377  return ret;
378 }
379 
381 
382 DDCompareDDRotMat::DDCompareDDRotMat(double tol) : tol_(tol) { }
383 
385  bool ret(true);
386  // manual way to do it... postponed. Tested with Distance method from root::math
387  //DD3Vector x1, y1, z1;
388  //lhs.GetComponents(x1,y1,z1);
389  //DD3Vector x2, y2, z2;
390  //rhs.GetComponents(x2,y2,z2);
391  double dist = Distance(lhs,rhs);
392  if ( std::fabs(dist) > tol_ ) {
393  std::cout << "Rotation matrices do not match." << std::endl;
394  ret = false;
395  DD3Vector x, y, z;
396  std::cout << "FIRST" << std::endl;
397  lhs.GetComponents(x,y,z);
398  std::cout << std::setw(12) << std::fixed << std::setprecision(4) << x.X();
399  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << y.X();
400  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << z.X();
401  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << x.Y();
402  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << y.Y();
403  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << z.Y();
404  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << x.Z();
405  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << y.Z();
406  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << z.Z() << std::endl;
407  std::cout << "SECOND" << std::endl;
408  rhs.GetComponents(x,y,z);
409  std::cout << std::setw(12) << std::fixed << std::setprecision(4) << x.X();
410  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << y.X();
411  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << z.X();
412  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << x.Y();
413  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << y.Y();
414  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << z.Y();
415  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << x.Z();
416  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << y.Z();
417  std::cout << "," << std::setw(12) << std::fixed << std::setprecision(4) << z.Z() << std::endl;
418  }
419 
420  return ret;
421 }
422 
423 
bool next()
set current node to the next node in the expanded tree
const DDRotationMatrix * rotation() const
Returns the read-only rotation-matrix.
Definition: DDTransform.h:90
int i
Definition: DBlmapReader.cc:9
const std::vector< double > & parameters(void) const
Give the parameters of the solid.
Definition: DDSolid.cc:150
bool parent()
set the current node to the parent node ...
Relative position of a child-volume inside a parent-volume.
Definition: DDPosData.h:13
const N & name() const
Definition: DDBase.h:78
DDCompOptions ddco_
bool operator()(const DDCompactView &lhs, const DDCompactView &rhs) const
const graph_type & graph() const
Provides read-only access to the data structure of the compact-view.
Needs to know about rotmat because of BooleanSolid.
const N & nodeData(const edge_type &) const
Definition: adjgraph.h:317
const E & edgeData(index_type i) const
Definition: adjgraph.h:183
DDTranslation translation(void) const
Definition: DDSolid.cc:540
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
std::vector< double >::size_type index_type
Definition: adjgraph.h:15
DDCompOptions ddco_
type of data representation of DDCompactView
Definition: DDCompactView.h:76
DDCompOptions ddco_
Needs to know because of Rotation Matrix of Boolean Relationship.
A DDSolid represents the shape of a part.
Definition: DDSolid.h:35
DDSolid solidB(void) const
Definition: DDSolid.cc:550
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
bool operator()(const DDTranslation &lhs, const DDTranslation &rhs) const
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:66
DDSolid unreflected(void) const
Definition: DDSolid.cc:272
DDRotation rotation(void) const
Definition: DDSolid.cc:535
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DD3Vector
A DD Translation is currently implemented with Root Vector3D.
Definition: DDTranslation.h:6
bool operator()(const DDLogicalPart &lhs, const DDLogicalPart &rhs) const
int depth() const
depth of the scope. 0 means unrestricted depth.
const std::string fullname() const
Definition: DDName.h:56
int copyno_
Definition: DDPosData.h:38
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:88
DDSolidShape shape(void) const
The type of the solid.
Definition: DDSolid.cc:144
bool operator()(const std::vector< double > &lhs, const std::vector< double > &rhs) const
bool operator()(DDExpandedView &lhs, DDExpandedView &rhs) const
double p2[4]
Definition: TauolaWrapper.h:90
DDCompOptions ddco_
bool operator()(const DDSolid &lhs, const DDSolid &rhs) const
bool operator()(const DDBooleanSolid &lhs, const DDBooleanSolid &rhs) const
DDCompOptions ddco_
DDSolid solidA(void) const
Definition: DDSolid.cc:545
DDComparators need to know if names of DDRotation matter.
bool operator()(const DDRotationMatrix &lhs, const DDRotationMatrix &rhs) const
int copyno() const
Copy number associated with the current node.
bool firstChild()
set the current node to the first child ...
Allows to compare name or not. If not, compares only values of the rotation matrix.
bool nextSibling()
set the current node to the next sibling ...
adj_list::const_iterator const_adj_iterator
Definition: adjgraph.h:125
LogicalParts have solids which could be BooleanSolids.
double p1[4]
Definition: TauolaWrapper.h:89
tuple cout
Definition: gather_cfg.py:121
adj_iterator begin()
Definition: adjgraph.h:197
const DDLogicalPart & logicalPart() const
The logical-part of the current node in the expanded-view.
Provides an exploded view of the detector (tree-view)
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.
bool operator()(const DDRotation &lhs, const DDRotation &rhs) const
const std::string & name() const
Returns the name.
Definition: DDName.cc:87
adj_iterator end()
Definition: adjgraph.h:199