CMS 3D CMS Logo

FWGeometry.cc
Go to the documentation of this file.
1 #include "TFile.h"
2 #include "TTree.h"
3 #include "TEveGeoNode.h"
4 #include "TPRegexp.h"
5 #include "TSystem.h"
6 #include "TGeoArb8.h"
7 #include "TObjArray.h"
8 
12 
13 #include <iostream>
14 #include <cassert>
15 #include <sstream>
16 #include <stdexcept>
17 #include <algorithm>
18 
19 FWGeometry::FWGeometry( void ):m_producerVersion(0)
20 {}
21 
23 {}
24 
25 TFile*
27 {
28  std::string searchPath = ".";
29 
30  if (gSystem->Getenv( "CMSSW_SEARCH_PATH" ))
31  {
32 
33  TString paths = gSystem->Getenv( "CMSSW_SEARCH_PATH" );
34 
35  TObjArray* tokens = paths.Tokenize( ":" );
36  for( int i = 0; i < tokens->GetEntries(); ++i )
37  {
38  TObjString* path = (TObjString*)tokens->At( i );
39  searchPath += ":";
40  searchPath += static_cast<const char *>(path->GetString());
41  if (gSystem->Getenv("CMSSW_VERSION"))
42  searchPath += "/Fireworks/Geometry/data/";
43  }
44  }
45 
46  TString fn = fileName;
47  const char* fp = gSystem->FindFile(searchPath.c_str(), fn, kFileExists);
48  return fp ? TFile::Open( fp) : nullptr;
49 }
50 
51 void
53 {
54  TFile* file = findFile( fileName );
55  if( ! file )
56  {
57  throw std::runtime_error( "ERROR: failed to find geometry file. Initialization failed." );
58  return;
59  }
60 
61  TTree* tree = static_cast<TTree*>(file->Get( "idToGeo" ));
62  if( ! tree )
63  {
64  throw std::runtime_error( "ERROR: cannot find detector id map in the file. Initialization failed." );
65  return;
66  }
67 
68  unsigned int id;
69  Float_t points[24];
70  Float_t topology[9];
71  Float_t shape[5];
72  Float_t translation[3];
73  Float_t matrix[9];
74  bool loadPoints = tree->GetBranch( "points" ) != nullptr;
75  bool loadParameters = tree->GetBranch( "topology" ) != nullptr;
76  bool loadShape = tree->GetBranch( "shape" ) != nullptr;
77  bool loadTranslation = tree->GetBranch( "translation" ) != nullptr;
78  bool loadMatrix = tree->GetBranch( "matrix" ) != nullptr;
79  tree->SetBranchAddress( "id", &id );
80  if( loadPoints )
81  tree->SetBranchAddress( "points", &points );
82  if( loadParameters )
83  tree->SetBranchAddress( "topology", &topology );
84  if( loadShape )
85  tree->SetBranchAddress( "shape", &shape );
86  if( loadTranslation )
87  tree->SetBranchAddress( "translation", &translation );
88  if( loadMatrix )
89  tree->SetBranchAddress( "matrix", &matrix );
90 
91  unsigned int treeSize = tree->GetEntries();
92  if( m_idToInfo.size() != treeSize )
93  m_idToInfo.resize( treeSize );
94  for( unsigned int i = 0; i < treeSize; ++i )
95  {
96  tree->GetEntry( i );
97 
98  m_idToInfo[i].id = id;
99  if( loadPoints )
100  {
101  for( unsigned int j = 0; j < 24; ++j )
102  m_idToInfo[i].points[j] = points[j];
103  }
104  if( loadParameters )
105  {
106  for( unsigned int j = 0; j < 9; ++j )
107  m_idToInfo[i].parameters[j] = topology[j];
108  }
109  if( loadShape )
110  {
111  for( unsigned int j = 0; j < 5; ++j )
112  m_idToInfo[i].shape[j] = shape[j];
113  }
114  if( loadTranslation )
115  {
116  for( unsigned int j = 0; j < 3; ++j )
117  m_idToInfo[i].translation[j] = translation[j];
118  }
119  if( loadMatrix )
120  {
121  for( unsigned int j = 0; j < 9; ++j )
122  m_idToInfo[i].matrix[j] = matrix[j];
123  }
124  }
125 
126 
127  m_versionInfo.productionTag = static_cast<TNamed*>(file->Get( "tag" ));
128  m_versionInfo.cmsswVersion = static_cast<TNamed*>(file->Get( "CMSSW_VERSION" ));
129  m_versionInfo.extraDetectors = static_cast<TObjArray*>(file->Get( "ExtraDetectors" ));
130 
131 
132  TString path = file->GetPath();
133  if (path.EndsWith(":/")) path.Resize(path.Length() -2);
134 
136  fwLog( fwlog::kInfo ) << Form("Load %s %s from %s\n", tree->GetName(), m_versionInfo.productionTag->GetTitle(), path.Data());
137  else
138  fwLog( fwlog::kInfo ) << Form("Load %s from %s\n", tree->GetName(), path.Data());
139 
140 
141  TNamed* producerInfo = static_cast<TNamed*>(file->Get( "PRODUCER_VERSION" ));
142  if (producerInfo) {
143  m_producerVersion = atoi(producerInfo->GetTitle());
144  }
145  file->Close();
146 }
147 
148 void
150 {
151  FWRecoGeom::InfoMapItr begin = map.begin();
152  FWRecoGeom::InfoMapItr end = map.end();
153  unsigned int mapSize = map.size();
154  if( m_idToInfo.size() != mapSize )
155  m_idToInfo.resize( mapSize );
156  unsigned int i = 0;
157  for( FWRecoGeom::InfoMapItr it = begin;
158  it != end; ++it, ++i )
159  {
160  m_idToInfo[i].id = it->id;
161  for( unsigned int j = 0; j < 24; ++j )
162  m_idToInfo[i].points[j] = it->points[j];
163  for( unsigned int j = 0; j < 9; ++j )
164  m_idToInfo[i].parameters[j] = it->topology[j];
165  for( unsigned int j = 0; j < 5; ++j )
166  m_idToInfo[i].shape[j] = it->shape[j];
167  for( unsigned int j = 0; j < 3; ++j )
168  m_idToInfo[i].translation[j] = it->translation[j];
169  for( unsigned int j = 0; j < 9; ++j )
170  m_idToInfo[i].matrix[j] = it->matrix[j];
171  }
172 }
173 
174 const TGeoMatrix*
175 FWGeometry::getMatrix( unsigned int id ) const
176 {
177  std::map<unsigned int, TGeoMatrix*>::iterator mit = m_idToMatrix.find( id );
178  if( mit != m_idToMatrix.end()) return mit->second;
179 
180  IdToInfoItr it = FWGeometry::find( id );
181  if( it == m_idToInfo.end())
182  {
183  fwLog( fwlog::kWarning ) << "no reco geometry found for id " << id << std::endl;
184  return nullptr;
185  }
186  else
187  {
188  const GeomDetInfo& info = *it;
189  TGeoTranslation trans( info.translation[0], info.translation[1], info.translation[2] );
190  TGeoRotation rotation;
191  const Double_t matrix[9] = { info.matrix[0], info.matrix[1], info.matrix[2],
192  info.matrix[3], info.matrix[4], info.matrix[5],
193  info.matrix[6], info.matrix[7], info.matrix[8]
194  };
195  rotation.SetMatrix( matrix );
196 
197  m_idToMatrix[id] = new TGeoCombiTrans( trans, rotation );
198  return m_idToMatrix[id];
199  }
200 }
201 
202 std::vector<unsigned int>
204 {
205  std::vector<unsigned int> ids;
206  unsigned int mask = ( det << 4 ) | ( subdet );
207  for( IdToInfoItr it = m_idToInfo.begin(), itEnd = m_idToInfo.end();
208  it != itEnd; ++it )
209  {
210  if( FWGeometry::match_id( *it, mask ))
211  ids.push_back(( *it ).id );
212  }
213 
214  return ids;
215 }
216 
217 TGeoShape*
218 FWGeometry::getShape( unsigned int id ) const
219 {
220  IdToInfoItr it = FWGeometry::find( id );
221  if( it == m_idToInfo.end())
222  {
223  fwLog( fwlog::kWarning ) << "no reco geoemtry found for id " << id << std::endl;
224  return nullptr;
225  }
226  else
227  {
228  return getShape( *it );
229  }
230 }
231 
232 TGeoShape*
234 {
235  TEveGeoManagerHolder gmgr( TEveGeoShape::GetGeoMangeur());
236  TGeoShape* geoShape = nullptr;
237  if( info.shape[0] == 1 )
238  {
239  geoShape = new TGeoTrap(
240  info.shape[3], //dz
241  0, //theta
242  0, //phi
243  info.shape[4], //dy1
244  info.shape[1], //dx1
245  info.shape[2], //dx2
246  0, //alpha1
247  info.shape[4], //dy2
248  info.shape[1], //dx3
249  info.shape[2], //dx4
250  0); //alpha2
251  }
252  else
253  geoShape = new TGeoBBox( info.shape[1], info.shape[2], info.shape[3] );
254 
255  return geoShape;
256 }
257 
258 TEveGeoShape*
259 FWGeometry::getEveShape( unsigned int id ) const
260 {
261  IdToInfoItr it = FWGeometry::find( id );
262  if( it == m_idToInfo.end())
263  {
264  fwLog( fwlog::kWarning ) << "no reco geoemtry found for id " << id << std::endl;
265  return nullptr;
266  }
267  else
268  {
269  const GeomDetInfo& info = *it;
270  double array[16] = { info.matrix[0], info.matrix[3], info.matrix[6], 0.,
271  info.matrix[1], info.matrix[4], info.matrix[7], 0.,
272  info.matrix[2], info.matrix[5], info.matrix[8], 0.,
273  info.translation[0], info.translation[1], info.translation[2], 1.
274  };
275  TEveGeoManagerHolder gmgr( TEveGeoShape::GetGeoMangeur());
276  TEveGeoShape* shape = new TEveGeoShape(TString::Format("RecoGeom Id=%u", id));
277  TGeoShape* geoShape = getShape( info );
278  shape->SetShape( geoShape );
279  // Set transformation matrix from a column-major array
280  shape->SetTransMatrix( array );
281  return shape;
282  }
283 }
284 
285 const float*
286 FWGeometry::getCorners( unsigned int id ) const
287 {
288  // reco geometry points
289  IdToInfoItr it = FWGeometry::find( id );
290  if( it == m_idToInfo.end())
291  {
292  fwLog( fwlog::kWarning ) << "no reco geometry found for id " << id << std::endl;
293  return nullptr;
294  }
295  else
296  {
297  return ( *it ).points;
298  }
299 }
300 
301 const float*
302 FWGeometry::getParameters( unsigned int id ) const
303 {
304  // reco geometry parameters
305  IdToInfoItr it = FWGeometry::find( id );
306  if( it == m_idToInfo.end())
307  {
308  fwLog( fwlog::kWarning ) << "no reco geometry found for id " << id << std::endl;
309  return nullptr;
310  }
311  else
312  {
313  return ( *it ).parameters;
314  }
315 }
316 
317 const float*
318 FWGeometry::getShapePars( unsigned int id ) const
319 {
320  // reco geometry parameters
321  IdToInfoItr it = FWGeometry::find( id );
322  if( it == m_idToInfo.end())
323  {
324  fwLog( fwlog::kWarning ) << "no reco geometry found for id " << id << std::endl;
325  return nullptr;
326  }
327  else
328  {
329  return ( *it ).shape;
330  }
331 }
332 
333 void
334 FWGeometry::localToGlobal( unsigned int id, const float* local, float* global, bool translatep ) const
335 {
336  IdToInfoItr it = FWGeometry::find( id );
337  if( it == m_idToInfo.end())
338  {
339  fwLog( fwlog::kWarning ) << "no reco geometry found for id " << id << std::endl;
340  }
341  else
342  {
343  localToGlobal( *it, local, global, translatep );
344  }
345 }
346 
347 void
348 FWGeometry::localToGlobal( unsigned int id, const float* local1, float* global1,
349  const float* local2, float* global2, bool translatep ) const
350 {
351  IdToInfoItr it = FWGeometry::find( id );
352  if( it == m_idToInfo.end())
353  {
354  fwLog( fwlog::kWarning ) << "no reco geometry found for id " << id << std::endl;
355  }
356  else
357  {
358  localToGlobal( *it, local1, global1, translatep );
359  localToGlobal( *it, local2, global2, translatep );
360  }
361 }
362 
364 FWGeometry::find( unsigned int id ) const
365 {
368  return std::lower_bound( begin, end, id );
369 }
370 
371 void
372 FWGeometry::localToGlobal( const GeomDetInfo& info, const float* local, float* global, bool translatep ) const
373 {
374  for( int i = 0; i < 3; ++i )
375  {
376  global[i] = translatep ? info.translation[i] : 0;
377  global[i] += local[0] * info.matrix[3 * i]
378  + local[1] * info.matrix[3 * i + 1]
379  + local[2] * info.matrix[3 * i + 2];
380  }
381 }
382 
383 //______________________________________________________________________________
384 
385 bool FWGeometry::VersionInfo::haveExtraDet(const char* det) const
386 {
387 
388  return (extraDetectors && extraDetectors->FindObject(det)) ? true : false;
389 }
static TFile * findFile(const char *fileName)
Definition: FWGeometry.cc:26
std::vector< FWRecoGeom::Info >::const_iterator InfoMapItr
Definition: FWRecoGeom.h:28
static const TGPicture * info(bool iBackgroundIsBlack)
TObjArray * extraDetectors
Definition: FWGeometry.h:46
static void loadMatrix(DOMElement *elem, unsigned int n, TMatrixDBase &matrix)
void initMap(const FWRecoGeom::InfoMap &map)
Definition: FWGeometry.cc:149
CaloTopology const * topology(0)
IdToInfoItr find(unsigned int) const
Definition: FWGeometry.cc:364
const float * getParameters(unsigned int id) const
Definition: FWGeometry.cc:302
FWGeometry(void)
Definition: FWGeometry.cc:19
~FWGeometry(void)
Definition: FWGeometry.cc:22
bool match_id(const GeomDetInfo &o, unsigned int mask) const
Definition: FWGeometry.h:101
TGeoShape * getShape(unsigned int id) const
Definition: FWGeometry.cc:218
const TGeoMatrix * getMatrix(unsigned int id) const
Definition: FWGeometry.cc:175
std::map< unsigned int, TGeoMatrix * > m_idToMatrix
Definition: FWGeometry.h:128
const float * getShapePars(unsigned int id) const
Definition: FWGeometry.cc:318
bool haveExtraDet(const char *) const
Definition: FWGeometry.cc:385
VersionInfo m_versionInfo
Definition: FWGeometry.h:134
TEveGeoShape * getEveShape(unsigned int id) const
Definition: FWGeometry.cc:259
void loadMap(const char *fileName)
Definition: FWGeometry.cc:52
int m_producerVersion
Definition: FWGeometry.h:136
void localToGlobal(unsigned int id, const float *local, float *global, bool translatep=true) const
Definition: FWGeometry.cc:334
#define end
Definition: vmac.h:39
std::vector< FWRecoGeom::Info > InfoMap
Definition: FWRecoGeom.h:27
const float * getCorners(unsigned int id) const
Definition: FWGeometry.cc:286
#define fwLog(_level_)
Definition: fwLog.h:50
#define begin
Definition: vmac.h:32
std::vector< unsigned int > getMatchedIds(Detector det, SubDetector subdet) const
Definition: FWGeometry.cc:203
Definition: tree.py:1
IdToInfo m_idToInfo
Definition: FWGeometry.h:130
std::vector< FWGeometry::GeomDetInfo >::const_iterator IdToInfoItr
Definition: FWGeometry.h:107