CMS 3D CMS Logo

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