CMS 3D CMS Logo

GeometryInfoDump.cc
Go to the documentation of this file.
11 
12 #include <cassert>
13 #include <fstream>
14 #include <map>
15 #include <set>
16 #include <vector>
17 
20 
22 
24 
26  bool dumpHistory, bool dumpSpecs, bool dumpPosInfo, const DDCompactView& cpv, std::string fname, int nVols) {
27  fname = "dump" + fname;
28  DDExpandedView epv(cpv);
29  std::cout << "Top Most LogicalPart =" << epv.logicalPart() << std::endl;
30  if (dumpHistory || dumpPosInfo) {
31  if (dumpPosInfo) {
32  std::cout << "After the GeoHistory in the output file dumpGeoHistoryOnRead you will see x, y, z, r11, r12, r13, "
33  "r21, r22, r23, r31, r32, r33"
34  << std::endl;
35  }
36  typedef DDExpandedView::nav_type nav_type;
37  typedef std::map<nav_type, int> id_type;
38  id_type idMap;
39  int id = 0;
40  std::ofstream dump(fname.c_str());
41  bool notReachedDepth(true);
42  char buf[256];
43 
44  do {
45  nav_type pos = epv.navPos();
46  idMap[pos] = id;
47  // dump << id
48  dump << " - " << epv.geoHistory();
49  DD3Vector x, y, z;
50  epv.rotation().GetComponents(x, y, z);
51  if (dumpPosInfo) {
52  size_t s = snprintf(buf,
53  256,
54  ",%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f,%12.4f",
55  epv.translation().x(),
56  epv.translation().y(),
57  epv.translation().z(),
58  x.X(),
59  y.X(),
60  z.X(),
61  x.Y(),
62  y.Y(),
63  z.Y(),
64  x.Z(),
65  y.Z(),
66  z.Z());
67  assert(s < 256);
68  dump << buf;
69  }
70  dump << "\n";
71  ;
72  ++id;
73  if (nVols != 0 && id > nVols)
74  notReachedDepth = false;
75  } while (epv.next() && notReachedDepth);
76  dump << std::flush;
77  dump.close();
78  }
79  if (dumpSpecs) {
80  // dump specifics at every compact-view nodes to have the most detailed "true"
81  // final destination of the DDSpecifics
82  std::string dsname = "dumpSpecs" + fname;
83  std::ofstream dump(dsname.c_str());
84  const auto& gra = cpv.graph();
85  std::set<DDLogicalPart> lpStore;
86  adjl_iterator git = gra.begin();
87  adjl_iterator gend = gra.end();
88  Graph::index_type i = 0;
89  for (; git != gend; ++git) {
90  const DDLogicalPart& ddLP = gra.nodeData(git);
91  if (lpStore.find(ddLP) != lpStore.end() && !ddLP.attachedSpecifics().empty()) {
92  dump << ddLP.toString() << ": ";
94  }
95  lpStore.insert(ddLP);
96 
97  ++i;
98  if (!git->empty()) {
99  // ask for children of ddLP
100  for (const auto& cit : *git) {
101  const DDLogicalPart& ddcurLP = gra.nodeData(cit.first);
102  if (lpStore.find(ddcurLP) != lpStore.end() && !ddcurLP.attachedSpecifics().empty()) {
103  dump << ddcurLP.toString() << ": ";
104  dumpSpec(ddcurLP.attachedSpecifics(), dump);
105  }
106  lpStore.insert(ddcurLP);
107  } // iterate over children
108  } // if (children)
109  } // iterate over graph nodes
110  dump.close();
111  }
112 }
113 
114 void GeometryInfoDump::dumpSpec(const std::vector<std::pair<const DDPartSelection*, const DDsvalues_type*> >& attspec,
115  std::ostream& dump) {
116  std::vector<std::pair<const DDPartSelection*, const DDsvalues_type*> >::const_iterator bit(attspec.begin()),
117  eit(attspec.end());
118  for (; bit != eit; ++bit) {
119  // DDPartSelection is a std::vector<DDPartSelectionLevel>
120  std::vector<DDPartSelectionLevel>::const_iterator psit(bit->first->begin()), pseit(bit->first->end());
121  for (; psit != pseit; ++psit) {
122  switch (psit->selectionType_) {
123  case ddunknown:
124  throw cms::Exception("DetectorDescriptionSpecPar") << "Can not have an unknown selection type!";
125  break;
126  case ddanynode:
127  dump << "//*";
128  break;
129  case ddanychild:
130  dump << "/*";
131  break;
132  case ddanylogp:
133  dump << "//" << psit->lp_.toString();
134  break;
135  case ddanyposp:
136  dump << "//" << psit->lp_.toString() << "[" << psit->copyno_ << "]";
137  break;
138  case ddchildlogp:
139  dump << "/" << psit->lp_.toString();
140  break;
141  case ddchildposp:
142  dump << "/" << psit->lp_.toString() << "[" << psit->copyno_ << "]";
143  break;
144  default:
145  throw cms::Exception("DetectorDescriptionSpecPar")
146  << "Can not end up here! default of switch on selectionTyp_";
147  }
148  }
149  dump << " ";
150  // DDsvalues_type is typedef std::vector< std::pair<unsigned int, DDValue> > DDsvalues_type;
151  DDsvalues_type::const_iterator bsit(bit->second->begin()), bseit(bit->second->end());
152  for (; bsit != bseit; ++bsit) {
153  dump << bsit->second.name() << " ";
154  dump << (bsit->second.isEvaluated() ? "eval " : "NOT eval ");
155  size_t sdind(0);
156  for (; sdind != bsit->second.strings().size(); ++sdind) {
157  if (bsit->second.isEvaluated()) {
158  dump << bsit->second.doubles()[sdind];
159  } else {
160  dump << bsit->second.strings()[sdind];
161  }
162  if (sdind != bsit->second.strings().size() - 1)
163  dump << ", ";
164  }
165  if (!bsit->second.strings().empty() && bsit + 1 != bseit)
166  dump << " | ";
167  }
168  if (!bit->second->empty() && bit + 1 != eit)
169  dump << " | ";
170  }
171  dump << std::endl;
172 }
bool next()
set current node to the next node in the expanded tree
void dumpInfo(bool dumpHistory, bool dumpSpecs, bool dumpPosInfo, const DDCompactView &cpv, std::string fname="GeoHistory", int nVols=0)
math::Graph< DDLogicalPart, DDPosData * > Graph
Definition: DDCompactView.h:82
const DDRotationMatrix & rotation() const
The absolute rotation of the current node.
std::vector< double >::size_type index_type
Definition: Graph.h:15
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:80
nav_type navPos() const
return the stack of sibling numbers which indicates the current position in the DDExpandedView ...
const DDGeoHistory & geoHistory() const
The list of ancestors up to the root-node of the current node.
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DD3Vector
A DD Translation is currently implemented with Root Vector3D.
Definition: DDTranslation.h:6
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:93
Graph::const_adj_iterator adjl_iterator
const DDTranslation & translation() const
The absolute translation of the current node.
void dumpSpec(const std::vector< std::pair< const DDPartSelection *, const DDsvalues_type * > > &attspec, std::ostream &dump)
const Graph & graph() const
Provides read-only access to the data structure of the compact-view.
std::string toString() const
Definition: DDBase.h:63
adj_iterator begin()
Definition: Graph.h:172
string fname
main script
adj_list::const_iterator const_adj_iterator
Definition: Graph.h:105
const DDLogicalPart & logicalPart() const
The logical-part of the current node in the expanded-view.
const std::vector< std::pair< const DDPartSelection *, const DDsvalues_type * > > & attachedSpecifics(void) const
Provides an exploded view of the detector (tree-view)
std::vector< int > nav_type
std::vector of sibling numbers