All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
LayerFinder.cc
Go to the documentation of this file.
1 /*
2  * LayerFinder.cc
3  *
4  * Created on: Nov 11, 2016
5  * Author: slukic
6  */
7 
8 #include <DD4hep/Detector.h>
9 #include <DD4hep/DetType.h>
10 #include <LayerFinder.h>
11 #include "DD4hep/DD4hepUnits.h"
12 
13 using namespace lcio;
14 
15 /***************************************************
16  * Implementation of base class LayerResolverBase
17  * *********************************************** */
18 
19 LayerResolverBase::LayerResolverBase(const int _detTypeFlag,
20  const std::string _collectionName, const std::string _detectorName, double _sensThickCheatVal) :
21  ThicknessSensitive( _sensThickCheatVal>0. ? &LayerResolverBase::SensitiveThicknessCheat : NULL ),
22  sensThickCheatVal(_sensThickCheatVal),
23  detTypeFlag(_detTypeFlag),
24  collectionName(_collectionName),
25  detectorName(_detectorName),
26  collection(NULL),
27  decoder(NULL)
28 {}
29 
31  if(decoder) delete decoder;
32  decoder=NULL;
33 }
34 
36  if (collection) return collection->getTypeName();
37  else return "NONE";
38 }
39 
41  if (collection)
42  return collection->getParameters().getStringVal( lcio::LCIO::CellIDEncoding );
43  else return "EMPTY";
44 }
45 
46 // Event-by-event:
48  if (collection) return collection->getNumberOfElements();
49  else return -1;
50 }
51 
52 TrackerHitPlane* LayerResolverBase::GetHit(int i) const {
53  if (collection) return dynamic_cast<TrackerHitPlane*>(collection->getElementAt(i));
54  else return NULL;
55 }
56 
57 int LayerResolverBase::SetCollection(EVENT::LCEvent *evt) {
58 
59  if (decoder) delete decoder;
60  decoder = NULL;
61 
62  streamlog_out(DEBUG5) << "LayerResolver::SetCollection: Looking for collection "
63  << collectionName << ".\n";
64  try {
65  collection = evt->getCollection(collectionName);
66  }
67  catch(EVENT::DataNotAvailableException &dataex) {
68  streamlog_out(MESSAGE) << "Collection " << collectionName
69  << " not found in event #" << evt->getEventNumber() << ".\n";
70  collection = NULL;
71  return -1;
72  }
73 
74  decoder = new CellIDDecoder<TrackerHitPlane>(collection);
75 
76  streamlog_out(DEBUG5) << "Found collection of type \'" << collection->getTypeName()
77  << "\' with encoding \'"
78  << collection->getParameters().getStringVal( lcio::LCIO::CellIDEncoding ) << "\'\n";
79  return 0;
80 }
81 
82 
83 
84 /******************************************
85  * Implementation of class LayerResolver
86  * ************************************** */
87 
88 template <class T>
89 LayerResolver<T>::LayerResolver(const int _detTypeFlag,
90  T *_layering,
91  const std::string _collectionName,
92  const std::string _detectorName,
93  double _sensThickCheatVal) :
94  LayerResolverBase(_detTypeFlag, _collectionName, _detectorName, _sensThickCheatVal),
95  layering(_layering)
96 {
98 }
99 
100 
101 template <class T>
103  return layering->layers.at(nLayer).thicknessSensitive;
104 }
105 
106 
107 
108 /******************************************
109  * Implementation of class LayerFinder
110  * ************************************** */
111 
112 LayerFinder::LayerFinder(EVENT::StringVec _collectionNames, dd4hep::Detector& theDetector,
113  FloatVec sensThickCheatVals) :
114  layerResolvers()
115 {
116 
117  const std::vector< dd4hep::DetElement > &detElements = theDetector.detectors("tracker", true);
118 
119  if(_collectionNames.size() != detElements.size()) {
120  streamlog_out(ERROR) << "There are " << detElements.size() << " tracker detector elements in "
121  "the geometry and " << _collectionNames.size() << " tracker hit collection names have been "
122  "set in the parameters.\n";
123  exit(0);
124  }
125 
126  streamlog_out(MESSAGE) << "Tracker has " << detElements.size() << " elements:\n";
127 
128  for(unsigned i=0; i<detElements.size(); i++) {
129 
130  streamlog_out(MESSAGE) << "Detector element #" << i << " of type \'" << detElements.at(i).type();
131  streamlog_out(MESSAGE) << "\', named \'" << detElements.at(i).name() << "\'\n";
132  streamlog_out(MESSAGE) << " ... expects collection name " << _collectionNames[i] << "\n";
133  streamlog_out(MESSAGE) << " ... has type flags " << detElements.at(i).typeFlag() << "\n";
134 
135  int tf = detElements.at(i).typeFlag();
136 
137  LayerResolverBase *sr = NULL;
138 
139  try {
140  streamlog_out(DEBUG) << "Trying ZPlanarData.\n";
141  dd4hep::rec::ZPlanarData* layering = detElements.at(i).extension<dd4hep::rec::ZPlanarData>() ;
142  sr = new PlaneResolver(tf, layering, _collectionNames[i], detElements.at(i).name(), sensThickCheatVals.at(i));
143  }
144  catch ( std::exception &e) {
145  streamlog_out(DEBUG) << "Caught exception " << e.what() << std::endl;
146  try {
147  streamlog_out(DEBUG) << "Trying ZDiskPetalsData.\n";
148  dd4hep::rec::ZDiskPetalsData *layering = detElements.at(i).extension<dd4hep::rec::ZDiskPetalsData>() ;
149  sr = new PetalResolver(tf, layering, _collectionNames[i], detElements.at(i).name(), sensThickCheatVals.at(i));
150  }
151  catch ( std::exception &e1) {
152  streamlog_out(DEBUG) << "Caught exception " << e1.what() << std::endl;
153  }
154  }
155 
156  if (!sr) {
157  streamlog_out(ERROR) << "Could not find a semiconductor layering extension in the detector element! Aborting.";
158  exit(0);
159  }
160 
161  streamlog_out(MESSAGE) << "Detector element has " << sr->GetNumberOfLayers() << " layers with thicknesses: ";
162 
163  for(unsigned iLayer = 0; iLayer < sr->GetNumberOfLayers(); iLayer++) {
164 
165  double sensThick = sr->SensitiveThickness(iLayer)/dd4hep::mm;
166  streamlog_out(MESSAGE) << sensThick << " mm, ";
167 
168  if(sensThick < 1.e-6 && sensThickCheatVals.at(i) < 0.) {
169  streamlog_out(ERROR) << "Detector element #" << i << ", named \'" << detElements.at(i).name()
170  << "\' has sensitive thickness " << sensThick << " mm in layer " << iLayer
171  << " and cheat value has not been set.\n";
172  exit(0);
173  }
174 
175  streamlog_out(MESSAGE) << "\n";
176  }
177 
178  ResolverMapIter it = layerResolvers.find(detElements.at(i).id());
179  if (it == layerResolvers.end()) {
180  layerResolvers[detElements.at(i).id()] = sr;
181  }
182  else {
183  streamlog_out(ERROR) << "Detector element \'" << detElements.at(i).name()
184  << "\' has ID = " << detElements.at(i).id()
185  << " which is already taken by the detector element \'"
186  << it->second->GetDetectorName() << "\'! Aborting.\n";
187  exit(0);
188  }
189 
190 
191  if(sensThickCheatVals.at(i) > 0.) {
192  streamlog_out(MESSAGE) << " ... Replacing this detector sensitive thicknesses with value "
193  << sensThickCheatVals.at(i)/dd4hep::mm << " mm.\n";
194  }
195 
196  } // Loop over detector elements (i)
197 
198 }
199 
200 
201 int LayerFinder::ReadCollections(EVENT::LCEvent *evt) {
202 
203  for(auto collit : layerResolvers) {
204 
205  collit.second->SetCollection(evt);
206 
207  } // End loop over known detectors
208 
209  return 0;
210 }
211 
212 
213 double LayerFinder::SensitiveThickness(TrackerHitPlane* thit) {
214 
215  streamlog_out(DEBUG5) << "LayerFinder::SensitiveThickness() for hit ID = " << thit->getCellID0() << ".\n";
216 
217  // Decode system ID where the hit is located.
218  int systemID = FindSystem(thit);
219 
220  // Check if the system is registered for handling by the processor
221  ResolverMapIter resolver = layerResolvers.find(systemID);
222  if (resolver == layerResolvers.end()) {
223  streamlog_out(WARNING) << "Hit is located in the system with ID " << systemID
224  << " which is not handled by the processor.\n";
225  return -1.;
226  }
227 
228  streamlog_out(DEBUG5) << "Hit is located in subdetector \'" << resolver->second->GetDetectorName()
229  << "\' with system ID " << systemID << "\n";
230 
231  double t = resolver->second->SensitiveThickness(thit);
232 
233  streamlog_out(DEBUG5) << " ... Thickness is " << t/dd4hep::mm << " mm.\n";
234  return t;
235 }
236 
237 
239 
240 
241  streamlog_out(DEBUG5) << "LayerFinder handles the following detectors:\n";
242  for(auto dit : layerResolvers) {
243  std::string dettype;
244  if (dit.second->GetDetTypeFlag() & dd4hep::DetType::BARREL) dettype = "BARREL";
245  else if (dit.second->GetDetTypeFlag() & dd4hep::DetType::ENDCAP) dettype = "ENDCAP";
246  streamlog_out(DEBUG5) << "Detector \'" << dit.second->GetDetectorName() << "\' of type \'" << dettype;
247  streamlog_out(DEBUG5) << "\' associated with collection name \'" << dit.second->GetCollectionName() << "\'.\n";
248  streamlog_out(DEBUG5) << "Currently looking at collection of type \'" << dit.second->GetCollectionType();
249  streamlog_out(DEBUG5) << "\' with encoding \'" << dit.second->GetCollectionEncoding() << "\'\n";
250  }
251 }
252 
253 
254 int LayerFinder::FindSystem(TrackerHitPlane* thit) const {
255 
256  for( auto cit : layerResolvers) {
257 
258  for(int i=0; i<cit.second->GetNumberOfHits(); i++) {
259 
260  if( thit == cit.second->GetHit(i) ) {
261 
262  streamlog_out(DEBUG5) << " ... Found matching hit " << cit.second->GetHit(i)->getCellID0()
263  << " with energy " << cit.second->GetHit(i)->getEDep()
264  << " in collection " << cit.second->GetCollectionName() << ".\n";
265 
266  return cit.second->DecodeSystem(thit);
267  }
268  } // Loop over hits
269  } // Loop over collections
270 
271  return -1;
272 
273 }
static const float mm
std::string GetCollectionEncoding() const
Definition: LayerFinder.cc:40
int SetCollection(EVENT::LCEvent *)
Definition: LayerFinder.cc:57
double SensitiveThicknessRead(int nLayer) const
Definition: LayerFinder.cc:102
LayerResolver< dd4hep::rec::ZPlanarData > PlaneResolver
Definition: LayerFinder.h:117
LayerFinder()=delete
std::string GetCollectionType() const
Definition: LayerFinder.cc:35
virtual ~LayerResolverBase()
Definition: LayerFinder.cc:30
int FindSystem(lcio::TrackerHitPlane *thit) const
Definition: LayerFinder.cc:254
lcio::TrackerHitPlane * GetHit(int i) const
Definition: LayerFinder.cc:52
ResolverMap::iterator ResolverMapIter
Definition: LayerFinder.h:153
int GetNumberOfHits() const
Definition: LayerFinder.cc:47
static const float T
int ReadCollections(EVENT::LCEvent *)
Definition: LayerFinder.cc:201
LayerResolverFn ThicknessSensitive
Definition: LayerFinder.h:75
static const float e
LayerResolverBase()=delete
double(LayerResolverBase::* LayerResolverFn)(int) const
Definition: LayerFinder.h:70
LayerResolver< dd4hep::rec::ZDiskPetalsData > PetalResolver
Definition: LayerFinder.h:116
void ReportHandledDetectors()
Definition: LayerFinder.cc:238
ResolverMap layerResolvers
Definition: LayerFinder.h:158
EVENT::LCCollection * collection
Definition: LayerFinder.h:87
std::string collectionName
Definition: LayerFinder.h:84
double SensitiveThickness(lcio::TrackerHitPlane *)
Definition: LayerFinder.cc:213
const T * layering
Definition: LayerFinder.h:112
lcio::CellIDDecoder< lcio::TrackerHitPlane > * decoder
Definition: LayerFinder.h:88
LayerResolver()=delete
std::vector< std::string > StringVec
Definition: SiStripClus.h:56