CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
PrintGeomSummary.cc
Go to the documentation of this file.
4 
16 
17 #include "G4Run.hh"
18 #include "G4PhysicalVolumeStore.hh"
19 #include "G4LogicalVolumeStore.hh"
20 #include "G4VPhysicalVolume.hh"
21 #include "G4LogicalVolume.hh"
22 #include "G4VSolid.hh"
23 #include "G4Material.hh"
24 #include "G4NavigationHistory.hh"
25 #include "G4Track.hh"
26 #include "G4VisAttributes.hh"
27 #include "G4UserLimits.hh"
28 #include "G4TransportationManager.hh"
29 
30 #include <algorithm>
31 #include <iostream>
32 #include <vector>
33 #include <map>
34 #include <set>
35 #include <string>
36 
37 class PrintGeomSummary : public SimWatcher, public Observer<const BeginOfRun*> {
38 public:
40  ~PrintGeomSummary() override = default;
41 
43  void beginRun(edm::EventSetup const&) override;
44 
45 private:
46  void update(const BeginOfRun* run) override;
47  void addSolid(const DDLogicalPart& part);
48  void fillLV(G4LogicalVolume* lv);
49  void fillPV(G4VPhysicalVolume* pv);
50  void dumpSummary(std::ostream& out, std::string name);
51  G4VPhysicalVolume* getTopPV();
52  void addName(std::string name);
53  void printSummary(std::ostream& out);
54 
55 private:
57  std::vector<std::string> nodeNames_;
58  std::map<DDSolidShape, std::string> solidShape_;
59  std::map<std::string, DDSolidShape> solidMap_;
60  G4VPhysicalVolume* theTopPV_;
61  std::vector<G4LogicalVolume*> lvs_, touch_;
62  std::vector<G4VSolid*> sls_;
63  std::vector<G4VPhysicalVolume*> pvs_;
64  std::map<DDSolidShape, std::pair<int, int>> kount_;
65 };
66 
68  std::vector<std::string> defNames;
69  nodeNames_ = p.getUntrackedParameter<std::vector<std::string>>("NodeNames", defNames);
70  G4cout << "PrintGeomSummary:: initialised for " << nodeNames_.size() << " nodes:" << G4endl;
71  for (unsigned int ii = 0; ii < nodeNames_.size(); ii++)
72  G4cout << "Node[" << ii << "] : " << nodeNames_[ii] << G4endl;
73 
76  solidShape_[DDSolidShape::ddtrap] = "Trapezoid";
79  solidShape_[DDSolidShape::ddpolyhedra_rz] = "Polyhedra_rz";
80  solidShape_[DDSolidShape::ddpolycone_rrz] = "Polycone_rrz";
81  solidShape_[DDSolidShape::ddpolyhedra_rrz] = "Polyhedra_rrz";
83  solidShape_[DDSolidShape::ddunion] = "UnionSolid";
84  solidShape_[DDSolidShape::ddsubtraction] = "SubtractionSolid";
85  solidShape_[DDSolidShape::ddintersection] = "IntersectionSolid";
86  solidShape_[DDSolidShape::ddshapeless] = "ShapelessSolid";
87  solidShape_[DDSolidShape::ddpseudotrap] = "PseudoTrapezoid";
88  solidShape_[DDSolidShape::ddtrunctubs] = "TruncatedTube";
90  solidShape_[DDSolidShape::ddellipticaltube] = "EllipticalTube";
92  solidShape_[DDSolidShape::ddextrudedpolygon] = "ExtrudedPolygon";
94 }
95 
98  G4cout << "PrintGeomSummary::Initialize ESGetToken for DDCompactView" << G4endl;
99 }
100 
102  const DDCompactView* cpv = &es.getData(ddcompToken_);
103 
104  const auto& gra = cpv->graph();
105 
106  using Graph = DDCompactView::Graph;
108 
109  Graph::index_type i = 0;
110  solidMap_.clear();
111  for (adjl_iterator git = gra.begin(); git != gra.end(); ++git) {
112  const DDLogicalPart& ddLP = gra.nodeData(git);
113  addSolid(ddLP);
114  ++i;
115  if (!git->empty()) {
116  // ask for children of ddLP
117  for (Graph::edge_list::const_iterator cit = git->begin(); cit != git->end(); ++cit) {
118  const DDLogicalPart& ddcurLP = gra.nodeData(cit->first);
119  addSolid(ddcurLP);
120  }
121  }
122  }
123  G4cout << "Finds " << solidMap_.size() << " different solids in the tree" << G4endl;
124 }
125 
127  theTopPV_ = getTopPV();
128  if (theTopPV_) {
129  lvs_.clear();
130  sls_.clear();
131  touch_.clear();
132  fillLV(theTopPV_->GetLogicalVolume());
133  std::string name = theTopPV_->GetName();
134  dumpSummary(G4cout, name);
135 
136  pvs_.clear();
137  fillPV(theTopPV_);
138  G4cout << " Number of G4VPhysicalVolume's for " << name << ": " << pvs_.size() << G4endl;
139 
140  for (unsigned int k = 0; k < nodeNames_.size(); ++k) {
141  const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
142  std::vector<G4LogicalVolume*>::const_iterator lvcite;
143  for (lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++) {
144  if ((*lvcite)->GetName() == (G4String)(nodeNames_[k])) {
145  lvs_.clear();
146  sls_.clear();
147  touch_.clear();
148  fillLV(*lvcite);
149  dumpSummary(G4cout, nodeNames_[k]);
150  }
151  }
152  const G4PhysicalVolumeStore* pvs = G4PhysicalVolumeStore::GetInstance();
153  std::vector<G4VPhysicalVolume*>::const_iterator pvcite;
154  for (pvcite = pvs->begin(); pvcite != pvs->end(); pvcite++) {
155  if ((*pvcite)->GetName() == (G4String)(nodeNames_[k])) {
156  pvs_.clear();
157  fillPV(*pvcite);
158  G4cout << " Number of G4VPhysicalVolume's for " << nodeNames_[k] << ": " << pvs_.size() << G4endl;
159  }
160  }
161  }
162  }
163 }
164 
166  const DDSolid& solid = part.solid();
167  std::map<DDSolidShape, std::string>::iterator it = solidShape_.find(solid.shape());
168  std::string name = solid.name().name();
169  if (it == solidShape_.end())
171  else
172  solidMap_[name] = it->first;
173  //G4cout << "Solid " << name << " is of shape " << solidMap_[name] << G4endl;
174 }
175 
176 void PrintGeomSummary::fillLV(G4LogicalVolume* lv) {
177  if (std::find(lvs_.begin(), lvs_.end(), lv) == lvs_.end())
178  lvs_.push_back(lv);
179  G4VSolid* sl = lv->GetSolid();
180  if (std::find(sls_.begin(), sls_.end(), sl) == sls_.end())
181  sls_.push_back(sl);
182  touch_.push_back(lv);
183  for (int ii = 0; ii < (int)(lv->GetNoDaughters()); ii++)
184  fillLV(lv->GetDaughter(ii)->GetLogicalVolume());
185 }
186 
187 void PrintGeomSummary::fillPV(G4VPhysicalVolume* pv) {
188  if (std::find(pvs_.begin(), pvs_.end(), pv) == pvs_.end())
189  pvs_.push_back(pv);
190  for (int ii = 0; ii < (int)(pv->GetLogicalVolume()->GetNoDaughters()); ii++)
191  fillPV(pv->GetLogicalVolume()->GetDaughter(ii));
192 }
193 
195  //---------- Dump number of objects of each class
196  out << G4endl << G4endl << "@@@@@@@@@@@@@@@@@@ Dumping Summary For Node " << name << G4endl;
197  out << " Number of G4VSolid's: " << sls_.size() << G4endl;
198  out << " Number of G4LogicalVolume's: " << lvs_.size() << G4endl;
199  out << " Number of Touchable's: " << touch_.size() << G4endl;
200  //First the solids
201  out << G4endl << "Occurence of each type of shape among Solids" << G4endl;
202  kount_.clear();
203  for (std::vector<G4VSolid*>::iterator it = sls_.begin(); it != sls_.end(); ++it) {
204  std::string name = (*it)->GetName();
205  addName(name);
206  }
207  printSummary(out);
208  //Then the logical volumes
209  out << G4endl << "Occurence of each type of shape among Logical Volumes" << G4endl;
210  kount_.clear();
211  for (std::vector<G4LogicalVolume*>::iterator it = lvs_.begin(); it != lvs_.end(); ++it) {
212  std::string name = ((*it)->GetSolid())->GetName();
213  addName(name);
214  }
215  printSummary(out);
216  //Finally the touchables
217  out << G4endl << "Occurence of each type of shape among Touchables" << G4endl;
218  kount_.clear();
219  for (std::vector<G4LogicalVolume*>::iterator it = touch_.begin(); it != touch_.end(); ++it) {
220  std::string name = ((*it)->GetSolid())->GetName();
221  addName(name);
222  }
223  printSummary(out);
224 }
225 
226 G4VPhysicalVolume* PrintGeomSummary::getTopPV() {
227  return G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking()->GetWorldVolume();
228 }
229 
231  bool refl(false);
232  if (name.find("_refl") < name.size()) {
233  refl = true;
234  name = name.substr(0, (name.find("_refl")));
235  }
236  std::map<std::string, DDSolidShape>::const_iterator jt = solidMap_.find(name);
237  DDSolidShape shape = (jt == solidMap_.end()) ? DDSolidShape::dd_not_init : jt->second;
238  std::map<DDSolidShape, std::pair<int, int>>::iterator itr = kount_.find(shape);
239  if (itr == kount_.end()) {
240  kount_[shape] = (refl) ? std::pair<int, int>(0, 1) : std::pair<int, int>(1, 0);
241  } else {
242  kount_[shape] = (refl) ? std::pair<int, int>(((itr->second).first), ++((itr->second).second))
243  : std::pair<int, int>(++((itr->second).first), ((itr->second).second));
244  }
245 }
246 
247 void PrintGeomSummary::printSummary(std::ostream& out) {
248  int k(0);
249  for (std::map<DDSolidShape, std::pair<int, int>>::iterator itr = kount_.begin(); itr != kount_.end(); ++itr, ++k) {
250  std::string shape = solidShape_[itr->first];
251  out << "Shape [" << k << "] " << shape << " # " << (itr->second).first << " : " << (itr->second).second << G4endl;
252  }
253 }
254 
257 
T getUntrackedParameter(std::string const &, T const &) const
math::Graph< DDLogicalPart, DDPosData * > Graph
Definition: DDCompactView.h:83
#define DEFINE_SIMWATCHER(type)
void update(const BeginOfRun *run) override
This routine will be called when the appropriate signal arrives.
std::vector< double >::size_type index_type
Definition: Graph.h:15
void addName(std::string name)
void addSolid(const DDLogicalPart &part)
const N & name() const
Definition: DDBase.h:59
void fillPV(G4VPhysicalVolume *pv)
void printSummary(std::ostream &out)
std::map< DDSolidShape, std::string > solidShape_
G4VPhysicalVolume * getTopPV()
G4VPhysicalVolume * theTopPV_
const DDSolid & solid(void) const
Returns a reference object of the solid being the shape of this LogicalPart.
int ii
Definition: cuy.py:589
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:81
A DDSolid represents the shape of a part.
Definition: DDSolid.h:39
void beginRun(edm::EventSetup const &) override
bool getData(T &iHolder) const
Definition: EventSetup.h:122
U second(std::pair< T, U > const &p)
void registerConsumes(edm::ConsumesCollector) override
std::vector< G4LogicalVolume * > touch_
~PrintGeomSummary() override=default
PrintGeomSummary(edm::ParameterSet const &p)
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:93
DDSolidShape shape(void) const
The type of the solid.
Definition: DDSolid.cc:123
Graph::const_adj_iterator adjl_iterator
edm::ESGetToken< DDCompactView, IdealGeometryRecord > ddcompToken_
std::vector< std::string > nodeNames_
void fillLV(G4LogicalVolume *lv)
const Graph & graph() const
Provides read-only access to the data structure of the compact-view.
part
Definition: HCALResponse.h:20
std::vector< G4VSolid * > sls_
DDSolidShape
Definition: DDSolidShapes.h:6
void dumpSummary(std::ostream &out, std::string name)
std::vector< G4VPhysicalVolume * > pvs_
std::vector< G4LogicalVolume * > lvs_
Pt3D refl(const Pt3D &p)
adj_list::const_iterator const_adj_iterator
Definition: Graph.h:105
std::map< std::string, DDSolidShape > solidMap_
const std::string & name() const
Returns the name.
Definition: DDName.cc:41
std::map< DDSolidShape, std::pair< int, int > > kount_