HerdSoftware  0.1.1
GGSSimReader.h
Go to the documentation of this file.
1 /*
2  * GGSSimReader.h
3  *
4  * Created on: 18 Jan 2021
5  * Author: Valerio Formato
6  */
7 
10 #ifndef HERD_GGSSIMREADER_H_
11 #define HERD_GGSSIMREADER_H_
12 
13 #ifndef GGSSMARTLOG_H_
14 #define HERD_GGSSIMREADER_H_UNDEF_LOGGING
15 #endif
16 
17 // GGS headers
18 #include "montecarlo/readers/GGSTHadrIntReader.h"
19 #include "montecarlo/readers/GGSTHitsReader.h"
20 #include "montecarlo/readers/GGSTMCTruthReader.h"
21 #include "montecarlo/readers/GGSTPrimaryDisReader.h"
22 #include "montecarlo/readers/GGSTRootReader.h"
23 
24 #ifdef HERD_GGSSIMREADER_H_UNDEF_LOGGING
25 // Remove the definitions of GGS output macros (would conflict with the same macros defined in EventAnalysis)
26 // We only do this if GGSSmartLog.h is being parsed in this TU, otherwise there would be nothing to undef
27 // (or we could even be undefining the EA macros)
28 #undef COUT
29 #undef CCOUT
30 #undef ENDL
31 #endif
32 
33 // HerdSoftware headers
34 #include "common/DefaultValues.h"
35 #include "dataobjects/CaloHits.h"
40 #include "dataobjects/MCTruth.h"
51 
52 // c++ headers
53 #include <functional>
54 #include <string>
55 
56 using namespace EA;
57 
58 namespace Herd {
59 
60 // clang-format off
66 // clang-format on
67 
68 class GGSSimReader : public DataReader {
69 public:
78  GGSSimReader(std::shared_ptr<GGSTRootReader> reader, std::string fileName);
79 
80  virtual ~GGSSimReader() = default;
81 
90  virtual bool SetCurrentEvent(unsigned int) final;
91 
99  virtual bool IsObjectAvailable(const std::string &name) final;
100 
108  virtual bool IsObjectKnown(const std::string &name) final;
109 
120  RetrievalResult GetObject(const std::string &name, ObjectCategory category, ObjectWrapper &wrapper,
121  std::string &actualName) final;
122 
132  virtual std::vector<std::string> FreeObjects(const std::vector<std::string> &, Memory::Status) final;
133 
140  bool IsFileValid() { return m_hitReader || m_mcReader; }
141 
149  void SetFileName(std::string fileName) { m_fileName = std::move(fileName); }
150 
158  void SetCaloHitIDFromGGSPos(std::function<unsigned int(const float *)> conversionFunction) {
159  m_caloVolIDFromGGSPos = conversionFunction;
160  };
161 
168  void SetFitGeoParamsColl(observer_ptr<FitGeoParamsColl> fitGeoParamsColl);
169 
176  void SetStkGeoParamsColl(observer_ptr<StkGeoParamsColl> stkGeoParamsColl);
177 
184  void SetScdGeoParamsColl(observer_ptr<ScdGeoParamsColl> scdGeoParamsColl);
185 
192  void SetPsdGeoParamsColl(observer_ptr<PsdGeoParamsColl> psdGeoParamsColl);
193 
198  void SetSideFitFirstVolumeID(std::array<int, 4> sideFitFirstVolumeID) {
199  m_sideFitFirstVolumeID = sideFitFirstVolumeID;
200  }
201 
206  void SetSideStkFirstWaferID(std::array<int, 4> sideStkFirstWaferID) { m_sideStkFirstWaferID = sideStkFirstWaferID; }
207 
212  void SetSideStkFirstStripID(std::array<int, 4> sideStkFirstStripID) { m_sideStkFirstStripID = sideStkFirstStripID; }
213 
218  void SetSideScdFirstWaferID(std::array<int, 4> sideScdFirstWaferID) { m_sideScdFirstWaferID = sideScdFirstWaferID; }
219 
224  void SetSideScdFirstStripID(std::array<int, 4> sideScdFirstStripID) { m_sideScdFirstStripID = sideScdFirstStripID; }
225 
226  enum class PsdType : int { NONE = -1, tiles = 0, bars = 1 };
227  void SetPsdType(PsdType type) { m_psdType = type; }
228 
229 private:
230  struct ObjDescriptor {
231  std::string name;
232  std::vector<std::string> aliases;
234  std::function<ObjectWrapper(GGSSimReader *)> retriever;
235  std::function<bool(GGSSimReader *)> checker;
236  };
237 
238  std::vector<ObjDescriptor> m_knownObjects;
239 
240  unsigned int m_currEv;
241  unsigned int m_currReadEv;
242 
243  std::string m_fileName;
244  std::shared_ptr<GGSTRootReader> m_ggsreader;
245  GGSTHitsReader *m_hitReader = nullptr;
246  GGSTMCTruthReader *m_mcReader = nullptr;
247  GGSTHadrIntReader *m_hadrIntReader = nullptr;
248  GGSTPrimaryDisReader *m_primDisReader = nullptr;
249 
250  void CheckAvailableObjects();
251  std::vector<ParticleHit> ConvertParticles(GGSTIntHit &ggsIntHit);
252 
253  // MC GEN
254  bool m_mcGenRead = false;
255 
257  bool IsMCGenAvailable();
258  ObjectWrapper GetMCGen();
259 
260  // MC TRUTH
261  bool m_mcTruthRead = false;
262  bool m_hadrIntChecked = false;
263  bool m_PrimDisAvailable = false;
264 
266  bool IsMCTruthAvailable();
267  ObjectWrapper GetMCTruth();
268 
269  // CALO
270  std::function<unsigned int(const float *)> m_caloVolIDFromGGSPos;
271  int m_caloDetIndex = std::numeric_limits<int>::lowest();
273  bool IsCaloHitsAvailable();
274  ObjectWrapper GetCaloHits();
275 
276  // FIT
277  bool m_areFitHitsRead = false;
278  bool m_readFitParticleHits = false;
279  bool m_areFitParticleHitsRead = false;
280  bool m_areFitHitsConverted = false;
281  bool m_isTopFitDetectorSet = false;
282  bool m_isSideFitDetectorSet = false;
283 
284  observer_ptr<FitGeoParamsColl> m_fitGeoParamsColl = nullptr;
285  int m_topFitDetIndex = std::numeric_limits<int>::lowest();
286  int m_sideFitDetIndex = std::numeric_limits<int>::lowest();
287  std::array<int, 4> m_sideFitFirstVolumeID; // ID of the first Volume on each lateral FIT, indexed as in GGS files
288  bool SetupFitReadout();
289 
291  bool IsFitHitsAvailable();
292  ObjectWrapper GetFitHits();
294  bool IsFitParticleHitsAvailable();
295  ObjectWrapper GetFitParticleHits();
296 
297  enum class SiliconDetectorType : int { UNKNOWN = -1, STRIP = 0, WAFER = 1 };
298 
299  enum class SiliconDetectorName { STK, SCD };
300  std::array<int, 4> &SiliconDetectorFirstVolumeID(SiliconDetectorName detector, SiliconDetectorType type);
301  ObjectWrapper GetSiliconDetectorHits(SiliconDetectorName detector, SiliconDetectorType type);
302  ObjectWrapper GetSiliconDetectorWaferParticleHits(SiliconDetectorName detector);
303 
304  // STK
305  SiliconDetectorType m_stkType = SiliconDetectorType::UNKNOWN;
306  bool m_areStkHitsRead = false;
307  bool m_areStkWaferParticleHitsRead = false;
308  bool m_isTopStkDetectorSet = false;
309  bool m_isSideStkDetectorSet = false;
310 
311  observer_ptr<StkGeoParamsColl> m_stkGeoParamsColl = nullptr;
312  int m_topStkDetIndex = std::numeric_limits<int>::lowest();
313  int m_sideStkHDetIndex = std::numeric_limits<int>::lowest();
314  int m_sideStkVDetIndex = std::numeric_limits<int>::lowest();
315  std::array<int, 4> m_sideStkFirstWaferID; // ID of the first Wafer on each lateral STK, indexed as in GGS files
316  std::array<int, 4> m_sideStkFirstStripID; // ID of the first Strip on each lateral STK, indexed as in GGS files
317  bool SetupStkReadout(SiliconDetectorType type);
318 
320  bool IsStkWaferHitsAvailable();
321  bool IsStkStripHitsAvailable();
322  ObjectWrapper GetStkWaferHits() {
323  return GetSiliconDetectorHits(SiliconDetectorName::STK, SiliconDetectorType::WAFER);
324  };
325  ObjectWrapper GetStkStripHits() {
326  return GetSiliconDetectorHits(SiliconDetectorName::STK, SiliconDetectorType::STRIP);
327  };
329  bool IsStkWaferParticleHitsAvailable();
330  ObjectWrapper GetStkWaferParticleHits() { return GetSiliconDetectorWaferParticleHits(SiliconDetectorName::STK); };
331 
332  // SCD
333  SiliconDetectorType m_scdType = SiliconDetectorType::UNKNOWN;
334  bool m_areScdHitsRead = false;
335  bool m_areScdWaferParticleHitsRead = false;
336  bool m_isTopScdDetectorSet = false;
337  bool m_isSideScdDetectorSet = false;
338 
339  observer_ptr<ScdGeoParamsColl> m_scdGeoParamsColl = nullptr;
340  int m_topScdDetIndex = std::numeric_limits<int>::lowest();
341  int m_sideScdHDetIndex = std::numeric_limits<int>::lowest();
342  int m_sideScdVDetIndex = std::numeric_limits<int>::lowest();
343  std::array<int, 4> m_sideScdFirstWaferID; // ID of the first Wafer on each lateral SCD, indexed as in GGS files
344  std::array<int, 4> m_sideScdFirstStripID; // ID of the first Strip on each lateral SCD, indexed as in GGS files
345  bool SetupScdReadout(SiliconDetectorType type);
346 
348  bool IsScdWaferHitsAvailable();
349  bool IsScdStripHitsAvailable();
350  ObjectWrapper GetScdWaferHits() {
351  return GetSiliconDetectorHits(SiliconDetectorName::SCD, SiliconDetectorType::WAFER);
352  };
353  ObjectWrapper GetScdStripHits() {
354  return GetSiliconDetectorHits(SiliconDetectorName::SCD, SiliconDetectorType::STRIP);
355  };
357  bool IsScdWaferParticleHitsAvailable();
358  ObjectWrapper GetScdWaferParticleHits() { return GetSiliconDetectorWaferParticleHits(SiliconDetectorName::SCD); };
359 
360  // PSD
361  enum class SidePsdSegmentation : int { NONE = -1, H = 0, V = 1 };
362 
363  struct PsdIDVolInfo {
364  unsigned int _ID;
365  unsigned int _layer;
367  };
368 
369  bool m_arePsdHitsRead = false;
370  bool m_readPsdParticleHits = false;
371  bool m_arePsdParticleHitsRead = false;
372  bool m_isTopPsdDetectorSet = false;
373  bool m_isSidePsdDetectorSet = false;
374 
375  PsdType m_psdType = PsdType::NONE;
376  observer_ptr<PsdGeoParamsColl> m_psdGeoParamsColl = nullptr;
377  int m_topPsdDetIndex = std::numeric_limits<int>::lowest();
378  std::vector<int> m_sidePsdDetIndexes;
379  bool SetupPsdReadout(bool readParticleHits);
380  PsdIDVolInfo SidePsdHitIDLayerSideFromGGSID(int iGGSPsdID, SidePsdSegmentation sidePsdSegmentation);
381 
383  bool IsPsdHitsAvailable();
384  ObjectWrapper GetPsdHits();
386  bool IsPsdParticleHitsAvailable();
387  ObjectWrapper GetPsdParticleHits();
388 };
389 } // namespace Herd
390 
391 #endif
Base class for GGSSimReaders.
Definition: GGSSimReader.h:68
void SetCaloHitIDFromGGSPos(std::function< unsigned int(const float *)> conversionFunction)
Set the volID calculator for the calorimeter.
Definition: GGSSimReader.h:158
std::vector< std::string > aliases
Definition: GGSSimReader.h:232
CssGeoParams.h CssGeoParams class declaration.
Definition: CaloPDCalibrationAlgo.h:24
PsdHitsColl m_psdHitsColl
Definition: GGSSimReader.h:382
void SetSideStkFirstStripID(std::array< int, 4 > sideStkFirstStripID)
Set the GGS volID of the first strip for each side STK detector.
Definition: GGSSimReader.h:212
PsdParticleHitsColl m_psdParticleHitsColl
Definition: GGSSimReader.h:385
void SetSideScdFirstStripID(std::array< int, 4 > sideScdFirstStripID)
Set the GGS volID of the first strip for each side SCD detector.
Definition: GGSSimReader.h:224
SiliconDetectorType
Definition: GGSSimReader.h:297
std::string name
Definition: GGSSimReader.h:231
std::shared_ptr< GGSTRootReader > m_ggsreader
Definition: GGSSimReader.h:244
Definition: GGSSimReader.h:363
ObjectWrapper GetScdWaferHits()
Definition: GGSSimReader.h:350
ObjectWrapper GetScdWaferParticleHits()
Definition: GGSSimReader.h:358
ObjectWrapper GetStkStripHits()
Definition: GGSSimReader.h:325
unsigned int m_currEv
Definition: GGSSimReader.h:240
ScdParticleHitsColl m_scdWaferParticleHitsColl
Definition: GGSSimReader.h:355
Side
Aliases for the five sides. RefFrame.h common/RefFrame.h.
Definition: RefFrame.h:104
std::array< int, 4 > m_sideStkFirstStripID
Definition: GGSSimReader.h:316
ObjectWrapper GetStkWaferParticleHits()
Definition: GGSSimReader.h:330
std::function< ObjectWrapper(GGSSimReader *)> retriever
Definition: GGSSimReader.h:234
std::vector< int > m_sidePsdDetIndexes
Definition: GGSSimReader.h:378
void SetSideFitFirstVolumeID(std::array< int, 4 > sideFitFirstVolumeID)
Set the GGS volID of the first volume for each side FIT detector.
Definition: GGSSimReader.h:198
PsdType
Definition: GGSSimReader.h:226
SidePsdSegmentation
Definition: GGSSimReader.h:361
std::array< int, 4 > m_sideFitFirstVolumeID
Definition: GGSSimReader.h:287
std::vector< ObjDescriptor > m_knownObjects
Definition: GGSSimReader.h:238
ScdHitsColl m_scdHitsColl
Definition: GGSSimReader.h:347
RefFrame::Side _side
Definition: GGSSimReader.h:366
void SetPsdType(PsdType type)
Definition: GGSSimReader.h:227
bool isOnSource
Definition: GGSSimReader.h:233
void SetSideScdFirstWaferID(std::array< int, 4 > sideScdFirstWaferID)
Set the GGS volID of the first wafer for each side SCD detector.
Definition: GGSSimReader.h:218
FitHitsColl m_fitHitsColl
Definition: GGSSimReader.h:290
unsigned int _ID
Definition: GGSSimReader.h:364
std::string m_fileName
Definition: GGSSimReader.h:243
unsigned int m_currReadEv
Definition: GGSSimReader.h:241
MCTruth m_mcTruth
Definition: GGSSimReader.h:265
FitParticleHitsColl m_fitParticleHitsColl
Definition: GGSSimReader.h:293
CaloHits m_caloHits
Definition: GGSSimReader.h:272
std::array< int, 4 > m_sideScdFirstWaferID
Definition: GGSSimReader.h:343
std::function< bool(GGSSimReader *)> checker
Definition: GGSSimReader.h:235
std::array< int, 4 > m_sideStkFirstWaferID
Definition: GGSSimReader.h:315
bool IsFileValid()
Check if reader is connected to a valid simulation file.
Definition: GGSSimReader.h:140
Information about particle generation in MC simulation.
Definition: MCGenerationInfo.h:27
std::function< unsigned int(const float *)> m_caloVolIDFromGGSPos
Definition: GGSSimReader.h:270
Data structure for the Monte Carlo truth of each event.
Definition: MCTruth.h:24
SiliconDetectorName
Definition: GGSSimReader.h:299
MCGenerationInfo m_mcGenInfo
Definition: GGSSimReader.h:256
void SetSideStkFirstWaferID(std::array< int, 4 > sideStkFirstWaferID)
Set the GGS volID of the first wafer for each side STK detector.
Definition: GGSSimReader.h:206
ObjectWrapper GetScdStripHits()
Definition: GGSSimReader.h:353
ObjectWrapper GetStkWaferHits()
Definition: GGSSimReader.h:322
StkHitsColl m_stkHitsColl
Definition: GGSSimReader.h:319
Base class for DataReaders.
Definition: DataReader.h:38
void SetFileName(std::string fileName)
Set the filename of the current DataSource of the dataprovider.
Definition: GGSSimReader.h:149
StkParticleHitsColl m_stkWaferParticleHitsColl
Definition: GGSSimReader.h:327
Container for the hits of a single CALO detector.
std::array< int, 4 > m_sideScdFirstStripID
Definition: GGSSimReader.h:344
unsigned int _layer
Definition: GGSSimReader.h:365
Definition: GGSSimReader.h:230