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