HGCal Test Beam  03a93d6239a951948e06fb3ef8dae4cbdebfad30
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
TBGeometry.cc
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // File: TBGeometry
3 // Description: read test beam geometry from Python config file and
4 // make available in a convenient format
5 // Created: 28-Apr-2016 Harrison B. Prosper
6 // ------------------------------------------------------------------------
7 #include <Python.h>
8 #include <iostream>
9 #include <cassert>
10 #include "HGCal/TBStandaloneSimulator/interface/TBGeometry.h"
11 #include "TPython.h"
12 
13 using namespace std;
14 
15 namespace
16 {
17 void setString(TBGeometry::Element& c, PyObject* o, string name)
18 {
19  //cout << "\tsetString(" << name << ")" << endl;
20  assert(o);
21  PyObject* q = PyDict_GetItemString(o, name.c_str());
22  assert(q);
23  c.smap[name] = string(PyString_AsString(q));
24 }
25 void setDouble(TBGeometry::Element& c, PyObject* o, string name)
26 {
27  //cout << "\tsetDouble(" << name << ")" << endl;
28  assert(o);
29  PyObject* q = PyDict_GetItemString(o, name.c_str());
30  assert(q);
31  c.dmap[name] = PyFloat_AsDouble(q);
32 }
33 void setInteger(TBGeometry::Element& c, PyObject* o, string name)
34 {
35  //cout << "\tsetInteger(" << name << ")" << endl;
36  assert(o);
37  PyObject* q = PyDict_GetItemString(o, name.c_str());
38  assert(q);
39  c.imap[name] = static_cast<int>(PyInt_AsLong(q));
40 }
41 
42 template <typename T>
43 void debug(map<string, T>& o)
44 {
45  for(typename map<string, T>::iterator it = o.begin(); it != o.end(); it++)
46  cout << " " << it->first << ":\t" << it->second << endl;
47 }
48 };
49 
50 
51 TBGeometry::TBGeometry(string modulename)
52  : _modulename(modulename),
53  _world(TBGeometry::Element()),
54  _header(TBGeometry::Element()),
55  _geometry(std::vector<TBGeometry::Element>()),
56  _sensitive(std::map<int, int>())
57 {
58  cout << endl
59  << "== TBGeometry =="
60  << endl << endl;
61 
62  // import Python function createGeometry
63  char cmd[2048];
64  sprintf(cmd,
65  "from HGCal.TBStandaloneSimulator.TBGeometryUtil import "
66  "createGeometry");
67  cout << cmd << endl;
68  TPython::Exec(cmd);
69 
70  // execute createGeometry
71  sprintf(cmd, "createGeometry('%s')", _modulename.c_str());
72  cout << endl << cmd << endl;
73  PyObject* geom = (PyObject*)TPython::Eval(cmd);
74  assert(geom);
75 
76  // -----------------------------------------------------
77  // get world information
78  // -----------------------------------------------------
79  PyObject* world = PyDict_GetItemString(geom, "world");
80  assert(world);
81  setString(_world, world, "shape");
82  setString(_world, world, "units");
83  setDouble(_world, world, "xside");
84  setDouble(_world, world, "yside");
85  setDouble(_world, world, "zside");
86 
87  //debug(_world.smap);
88  //debug(_world.dmap);
89 
90 
91  // -----------------------------------------------------
92  // get geometry header information
93  // -----------------------------------------------------
94  PyObject* header = PyDict_GetItemString(geom, "header");
95  if ( header ) {
96  setInteger(_header, header, "model");
97  setInteger(_header, header, "version");
98  } else {
99  _header.imap["model"] = 1;
100  _header.imap["version"] = 1;
101  }
102  // -----------------------------------------------------
103  // get geometry element information
104  // -----------------------------------------------------
105  PyObject* geometry = PyDict_GetItemString(geom, "geometry");
106  assert(geometry);
107 
108  // loop over elements (layers)
109  int nelements = PyList_Size(geometry);
110  for(int c = 0; c < nelements; c++) {
111  PyObject* item = PyList_GetItem(geometry, c);
112  PyObject* keys = PyDict_Keys(item);
113  int nkeys = PyList_Size(keys);
114 
115  TBGeometry::Element element;
116  setInteger(element, item, "sensitive");
117  setString(element, item, "shape");
118  setString(element, item, "material");
119  setString(element, item, "units");
120  for(int ii = 0; ii < nkeys; ii++) {
121  PyObject* key = PyList_GetItem(keys, ii);
122  string name = string(PyString_AsString(key));
123  if ( name == "sensitive" ) continue;
124  if ( name == "shape" ) continue;
125  if ( name == "material" ) continue;
126  if ( name == "units" ) continue;
127  if ( element.dmap.find(name) != element.dmap.end() ) continue;
128  if ( name == "first" || name == "last" )
129  setInteger(element, item, name);
130  else
131  setDouble(element, item, name);
132  }
133  _geometry.push_back(element);
134 
135  //cout << endl;
136  //debug(_geometry.back().smap);
137  //debug(_geometry.back().dmap);
138  }
139 
140  // -----------------------------------------------------
141  // get indices of sensitive layers
142  // -----------------------------------------------------
143  int layer = 0;
144  for(size_t c = 0; c < _geometry.size(); c++) {
145  TBGeometry::Element& element = _geometry[c];
146  if ( element.imap["sensitive"] ) {
147  layer++;
148  _sensitive[layer] = c;
149  }
150  }
151 }
152 
154 {
155 }
156 
157 //
159 TBGeometry::operator()(string item, int index)
160 {
161  if ( item == "world" ) {
162  return _world;
163  } else if ( item == "sensitive" ) {
164  if ( _sensitive.find(index) != _sensitive.end() )
165  return _geometry[_sensitive[index]];
166  else
167  return TBGeometry::Element();
168  } else if ( item == "geometry" ) {
169  if ( index < 0 )
170  return TBGeometry::Element();
171  if ( index >= (int)_geometry.size() )
172  return TBGeometry::Element();
173 
174  return _geometry[index];
175  } else
176  return TBGeometry::Element();
177 }
178 
179 std::ostream& operator<<(std::ostream& os, TBGeometry& o)
180 {
181  char record[1024];
182  os << "World" << endl << endl;
183  TBGeometry::Element world = o("world");
184  for(map<string, string>::iterator it = world.smap.begin();
185  it != world.smap.end();
186  it++) {
187  sprintf(record, " %-16s:\t%s",
188  (it->first).c_str(), (it->second).c_str());
189  os << record << endl;
190  }
191  for(map<string, double>::iterator it = world.dmap.begin();
192  it != world.dmap.end();
193  it++) {
194  sprintf(record, " %-16s:\t%f",
195  (it->first).c_str(), it->second);
196  os << record << endl;
197  }
198 
199  os << endl;
200  os << "Geometry - number of elements: " << o.size() << endl;
201 
202  for(size_t c = 0; c < o.size(); c++) {
203  TBGeometry::Element element = o("geometry", c);
204  os << endl;
205  if ( element.imap["first"] )
206  os << "BEGIN(SamplingSection)"
207  << endl;
208 
209  os << " element " << c;
210  if ( element.imap["sensitive"] )
211  os << "\t== sensitive ==";
212  os << endl;
213 
214  for(map<string, string>::iterator it = element.smap.begin();
215  it != element.smap.end();
216  it++) {
217  sprintf(record, " %-16s:\t%s",
218  (it->first).c_str(), (it->second).c_str());
219  os << record << endl;
220  }
221 
222  for(map<string, double>::iterator it = element.dmap.begin();
223  it != element.dmap.end();
224  it++) {
225  sprintf(record, " %-16s:\t%f",
226  (it->first).c_str(), it->second);
227  os << record << endl;
228  }
229 
230  if ( element.imap["last"] )
231  os << "END(SamplingSection)" << endl;
232  }
233  return os;
234 }
virtual ~TBGeometry()
Definition: TBGeometry.cc:153
std::map< std::string, double > dmap
Definition: TBGeometry.h:13
std::map< std::string, int > imap
Definition: TBGeometry.h:14
std::ostream & operator<<(std::ostream &, const HGCalTBDetId &id)
Definition: HGCalTBDetId.cc:37
size_t size()
Definition: TBGeometry.h:21
std::map< std::string, std::string > smap
Definition: TBGeometry.h:12
TBGeometry::Element operator()(std::string, int index=0)
Definition: TBGeometry.cc:159