All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
LayerFinder.h
Go to the documentation of this file.
1 /*
2  * LayerFinder.h
3  *
4  * Created on: Nov 11, 2016
5  * Author: slukic
6  */
7 
8 #ifndef INCLUDE_LAYERFINDER_H_
9 #define INCLUDE_LAYERFINDER_H_
10 
11 #include <EVENT/LCCollection.h>
12 #include <IMPL/TrackerHitPlaneImpl.h>
13 #include <UTIL/CellIDDecoder.h>
14 #include "LCIOTypes.h"
15 #include "streamlog/streamlog.h"
16 
17 #include <DD4hep/Detector.h>
18 #include "DDRec/DetectorData.h"
19 
20 typedef std::map<EVENT::LCCollection*, lcio::CellIDDecoder<lcio::TrackerHitPlane>*> CollectionMap;
21 
22 /* Utility class to connect the dots:
23  * - Detector element type flagword
24  * - Struct extension (for sensitive thickness)
25  * - Hit collection
26  * - decoder (layer number decoder string)
27  */
29 
30 public:
31  LayerResolverBase() = delete ;
32  LayerResolverBase(const LayerResolverBase &) = delete ;
33  LayerResolverBase(const int _detTypeFlag,
34  const std::string _collectionName,
35  const std::string _detectorName,
36  double _sensThickCheatVal=-1.);
37 
38  virtual ~LayerResolverBase() ;
39 
40  const LayerResolverBase& operator=(const LayerResolverBase&) = delete;
41 
42  /* The detector type flag helps to distinguish pointers
43  * to plane from petal resolver objects at runtime.
44  */
45  int GetDetTypeFlag() const { return detTypeFlag; }
46 
47  int SetCollection(EVENT::LCEvent *) ;
48  std::string GetCollectionName() const { return collectionName; }
49  std::string GetDetectorName() const { return detectorName; }
50  std::string GetCollectionType() const;
51  std::string GetCollectionEncoding() const;
52 
53  // Event-by-event:
54  int GetNumberOfHits() const;
55  lcio::TrackerHitPlane* GetHit(int i) const;
56 
57  virtual unsigned GetNumberOfLayers() const = 0;
58 
59  lcio::CellIDDecoder<lcio::TrackerHitPlane>* GetDecoder() const { return decoder; }
60  bool HasCollection() const { return static_cast<bool>(decoder); }
61  int DecodeLayer(lcio::TrackerHitPlane* thit) const { return (*decoder)(thit)["layer"]; }
62  int DecodeSystem(lcio::TrackerHitPlane* thit) const { return (*decoder)(thit)["system"]; }
63 
64 
65  virtual double SensitiveThickness(int nLayer) const { return (this->*ThicknessSensitive)(nLayer); }
66  virtual double SensitiveThickness(lcio::TrackerHitPlane* thit) const {
67  return (this->*ThicknessSensitive)(DecodeLayer(thit));
68  }
69 
70  typedef double (LayerResolverBase::*LayerResolverFn)(int) const;
72 
73 protected:
74 
76  virtual double SensitiveThicknessRead(int nLayer) const = 0;
77  double SensitiveThicknessCheat(int) const { return sensThickCheatVal; };
78  // Thickness value used for cheating
79  const double sensThickCheatVal;
80 
81 
82  // Constant in run:
84  std::string collectionName;
85  std::string detectorName;
86  // Event-to-event
87  EVENT::LCCollection *collection;
88  lcio::CellIDDecoder<lcio::TrackerHitPlane>* decoder;
89 
90 };
91 
92 
93 template <class T> class LayerResolver : public LayerResolverBase {
94 
95 public:
96  LayerResolver() = delete ;
97  LayerResolver(const LayerResolver<T> &lt) = delete ;
98  LayerResolver(const int _detTypeFlag, T *,
99  const std::string _collectionName,
100  const std::string _detectorName,
101  double _sensThickCheatVal=-1.);
102 
104 
105  unsigned GetNumberOfLayers() const { return layering->layers.size(); }
106 
107  const LayerResolver& operator=(const LayerResolver<T>&) = delete ;
108  const T *GetLayering() const {return layering;};
109 
110 protected:
111  double SensitiveThicknessRead(int nLayer) const ;
112  const T *layering;
113 
114 };
115 
118 
119 
120 
121 /* LayerFinder class parses tracker hit collections in the event
122  * finds where the hit belogs,
123  * and uses a vector of LayerResolver objects to decode the
124  * layer number and get the sensitive thickness
125  */
126 
127 class LayerFinder {
128 
129 public:
130  LayerFinder() = delete;
131  // Constructor with the vector of collection names that the finder
132  // will use when looking for the collections.
133  LayerFinder(EVENT::StringVec _collectionNames, dd4hep::Detector&, lcio::FloatVec sensThickCheatVals);
134  LayerFinder( const LayerFinder& ) = delete;
135 
136  LayerFinder& operator = ( const LayerFinder& ) = delete;
137 
138  /* Reads the decoders of whichever collections are found in the event
139  * among those stored in knownDetectors. Returns zero on success and -1 if
140  * some of the decoders could not be read.
141  */
142  int ReadCollections(EVENT::LCEvent *);
143 
144  /* Returns the sensitive thickness of the layer where the hit was recorded
145  * Also returns the detector type flag in the second argument
146  */
147  double SensitiveThickness(lcio::TrackerHitPlane*);
148 
149  // Sensitive thickness of layer
150  void ReportHandledDetectors();
151 
152  typedef std::map<int, LayerResolverBase*> ResolverMap;
153  typedef ResolverMap::iterator ResolverMapIter;
154 
155 // CellIDDecoder<TrackerHitPlane>* GetDecoder() const { return decoder; }
156 
157 protected:
159 
160  // Search for the TrackerHit collection that contains the hit and
161  // use the collection decoder string to decode the system from CellID
162  int FindSystem(lcio::TrackerHitPlane* thit) const ;
163 
164 };
165 
166 
167 
168 #endif /* INCLUDE_LAYERFINDER_H_ */
const LayerResolver & operator=(const LayerResolver< T > &)=delete
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
std::map< int, LayerResolverBase * > ResolverMap
Definition: LayerFinder.h:152
LayerResolver< dd4hep::rec::ZPlanarData > PlaneResolver
Definition: LayerFinder.h:117
int GetDetTypeFlag() const
Definition: LayerFinder.h:45
LayerFinder & operator=(const LayerFinder &)=delete
const LayerResolverBase & operator=(const LayerResolverBase &)=delete
int DecodeLayer(lcio::TrackerHitPlane *thit) const
Definition: LayerFinder.h:61
LayerFinder()=delete
int DecodeSystem(lcio::TrackerHitPlane *thit) const
Definition: LayerFinder.h:62
std::string GetCollectionType() const
Definition: LayerFinder.cc:35
std::map< EVENT::LCCollection *, lcio::CellIDDecoder< lcio::TrackerHitPlane > * > CollectionMap
Definition: LayerFinder.h:20
unsigned GetNumberOfLayers() const
Definition: LayerFinder.h:105
bool HasCollection() const
Definition: LayerFinder.h:60
virtual double SensitiveThickness(int nLayer) const
Definition: LayerFinder.h:65
virtual ~LayerResolverBase()
Definition: LayerFinder.cc:30
int FindSystem(lcio::TrackerHitPlane *thit) const
Definition: LayerFinder.cc:254
std::string GetDetectorName() const
Definition: LayerFinder.h:49
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
const T * GetLayering() const
Definition: LayerFinder.h:108
int ReadCollections(EVENT::LCEvent *)
Definition: LayerFinder.cc:201
virtual double SensitiveThickness(lcio::TrackerHitPlane *thit) const
Definition: LayerFinder.h:66
LayerResolverFn ThicknessSensitive
Definition: LayerFinder.h:75
virtual unsigned GetNumberOfLayers() const =0
LayerResolverBase()=delete
bool CheatsSensThickness() const
Definition: LayerFinder.h:71
double(LayerResolverBase::* LayerResolverFn)(int) const
Definition: LayerFinder.h:70
LayerResolver< dd4hep::rec::ZDiskPetalsData > PetalResolver
Definition: LayerFinder.h:116
std::string detectorName
Definition: LayerFinder.h:85
void ReportHandledDetectors()
Definition: LayerFinder.cc:238
ResolverMap layerResolvers
Definition: LayerFinder.h:158
std::string GetCollectionName() const
Definition: LayerFinder.h:48
EVENT::LCCollection * collection
Definition: LayerFinder.h:87
double SensitiveThicknessCheat(int) const
Definition: LayerFinder.h:77
std::string collectionName
Definition: LayerFinder.h:84
lcio::CellIDDecoder< lcio::TrackerHitPlane > * GetDecoder() const
Definition: LayerFinder.h:59
double SensitiveThickness(lcio::TrackerHitPlane *)
Definition: LayerFinder.cc:213
virtual double SensitiveThicknessRead(int nLayer) const =0
const T * layering
Definition: LayerFinder.h:112
lcio::CellIDDecoder< lcio::TrackerHitPlane > * decoder
Definition: LayerFinder.h:88
const double sensThickCheatVal
Definition: LayerFinder.h:77
LayerResolver()=delete
std::vector< std::string > StringVec
Definition: SiStripClus.h:56