CMS 3D CMS Logo

ddstats.cc
Go to the documentation of this file.
14 
15 #include <map>
16 #include <string>
17 #include <utility>
18 #include <vector>
19 
20 struct DDPosData;
21 
22 void ddstats(std::ostream & os)
23 {
24 
25  os << "DDD in memory stats:" << std::endl
26  << "====================" << std::endl << std::endl;
27  DDCompactView cpv;
28 
29  // What we will count:
30  // ----------------------
31 
32  int noEdges(0); // number of graph-multi-edges
33  int noNodes(0); // number of graph-nodes
34  int noExpNodes(1); // number of expanded-nodes
35 
36  // number of Logical- and PosParts, Solids, Materials
37  int noLog(0), noSol(0), noMat(0), noRot(0);
38 
39  // accumulative number of name-characters (logparts,solids,rotation,materials)
40  int noCLog(0), noCSol(0), noCMat(0), noCRot(0);
41 
42  int noSolidP(0); // accumulative number of solid-parameters
43 
44  // fetch the acyclic multigraph
45  const auto & g = cpv.graph();
46 
47  DDExpandedView exv(cpv);
48  while (exv.next()) ++noExpNodes;
49 
50  // iterate over the adjacency-list
51  auto it = g.begin();
52  for(; it != g.end(); ++it) {
53  ++noNodes;
54  noEdges += it->size();
55  }
56 
57  typedef DDLogicalPart::StoreT::value_type lpst_type;
58  lpst_type & lpst = DDLogicalPart::StoreT::instance();
59  lpst_type::iterator lpstit = lpst.begin();
60  for(; lpstit != lpst.end(); ++lpstit) {
61  noCLog += lpstit->first.name().size();
62  ++noLog;
63  }
64 
65  typedef DDMaterial::StoreT::value_type mast_type;
66  mast_type & mast = DDMaterial::StoreT::instance();
67  mast_type::iterator mastit = mast.begin();
68  for(; mastit != mast.end(); ++mastit) {
69  noCMat += mastit->first.name().size();
70  ++noMat;
71  }
72 
73  typedef DDSolid::StoreT::value_type sost_type;
74  sost_type & sost = DDSolid::StoreT::instance();
75  sost_type::iterator sostit = sost.begin();
76  for(; sostit != sost.end(); ++sostit) {
77  noCSol += sostit->first.name().size();
78  DDSolid s(sostit->first);
79  noSolidP += s.parameters().size();
80  ++noSol;
81  }
82 
83  typedef DDRotation::StoreT::value_type rost_type;
84  rost_type & rost = DDRotation::StoreT::instance();
85  rost_type::iterator rostit = rost.begin();
86  for(; rostit != rost.end(); ++rostit) {
87  noCRot += rostit->first.name().size();
88  ++noRot;
89  }
90 
91  // derived quantities
92  std::cout << "sizeof(void*)=" << sizeof(void*) << std::endl;
93  std::cout << "sizeof(DDLogicalPart)="<<sizeof(DDLogicalPart)<<std::endl;
94  std::cout << "sizeof(DDTranslation)="<< sizeof(DDTranslation)<<std::endl;
95  std::cout << "sizeof(DDRotationMatrix)=" << sizeof(DDRotationMatrix)<<std::endl;
96  int store = 4*sizeof(void*); // overhead for data-management (est.)
97  int byRot = noRot * (sizeof(DDRotationMatrix) + store); // bytes in rotations
98  int bySol = noSolidP * sizeof(double) + noSol*store; // bytes in solids
99  int byMat = noMat * (5*sizeof(double) + store); // bytes in materials
100  int byPos = noEdges * (sizeof(DDTranslation) + sizeof(DDRotation) + sizeof(int));
101  int byNam = noCLog + noCSol + noCMat + noCRot; // bytes in strings for names
102  int byLog = noLog * (sizeof(DDMaterial) + sizeof(DDSolid) + store); // LogicalPart
103  int byGra = (noEdges + noNodes)*store; // est. graph structure
104  int bytes = byRot + bySol + byMat + byPos + byNam + byLog + byGra;
105  bytes += noNodes*sizeof(DDLogicalPart) + noEdges*sizeof(DDPosData*);
106  double mb = 1024.*1024.;
107 
108  os << "noNodes=" << noNodes << std::endl
109  << "noEdges=" << noEdges << std::endl
110  << "noExNod=" << noExpNodes << std::endl << std::endl;
111  os << "noLog=" << noLog << std::endl
112  << "noSol=" << noSol << " noSolidP=" << noSolidP << std::endl
113  << "noMat=" << noMat << std::endl
114  << "noRot=" << noRot << std::endl << std::endl;
115  os << "noCLog=" << noCLog << std::endl
116  << "noCSol=" << noCSol << std::endl
117  << "noCMat=" << noCMat << std::endl
118  << "noCRot=" << noCRot << std::endl
119  << " --------" << std::endl
120  << " " << byNam
121  << " chars used for naming." << std::endl << std::endl;
122  os << "byLog = " << byLog/mb << " logicalparts " << std::endl
123  << "byNam = " << byNam/mb << " string for names " << std::endl
124  << "byRot = " << byRot/mb << " rotations " << std::endl
125  << "bySol = " << bySol/mb << " solids " << std::endl
126  << "byMat = " << byMat/mb << " materials " << std::endl
127  << "byPos = " << byPos/mb << " posparts " << std::endl
128  << "byGra = " << byGra/mb << " graph-struct " << std::endl
129  << "-----------------------" << std::endl
130  << "OVERALL: " << bytes / mb << " MByte" << std::endl;
131 
132 }
bool next()
set current node to the next node in the expanded tree
const std::vector< double > & parameters(void) const
Give the parameters of the solid.
Definition: DDSolid.cc:144
Relative position of a child-volume inside a parent-volume.
Definition: DDPosData.h:13
void ddstats(std::ostream &os)
Definition: ddstats.cc:22
DDMaterial is used to define and access material information.
Definition: DDMaterial.h:41
Compact representation of the geometrical detector hierarchy.
Definition: DDCompactView.h:83
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
A DDSolid represents the shape of a part.
Definition: DDSolid.h:38
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double > > DDTranslation
Definition: DDTranslation.h:7
Represents a uniquely identifyable rotation matrix.
Definition: DDTransform.h:67
static value_type & instance()
A DDLogicalPart aggregates information concerning material, solid and sensitveness ...
Definition: DDLogicalPart.h:92
const Graph & graph() const
Provides read-only access to the data structure of the compact-view.
Provides an exploded view of the detector (tree-view)
ROOT::Math::Rotation3D DDRotationMatrix
A DDRotationMatrix is currently implemented with a ROOT Rotation3D.