Project
Loading...
Searching...
No Matches
Digitizer.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#ifndef ALICEO2_TRD_DIGITIZER_H_
13#define ALICEO2_TRD_DIGITIZER_H_
14
16
18#include "TRDBase/PadResponse.h"
21
25
28
29#include <array>
30#include <deque>
31#include <unordered_map>
32#include <vector>
33#include <string>
34
35namespace o2
36{
37namespace trd
38{
39
40class Geometry;
41class SimParam;
42
43using DigitContainer = std::vector<Digit>;
44using SignalContainer = std::unordered_map<int, SignalArray>;
46
48{
49 public:
50 Digitizer() = default;
51 ~Digitizer() = default;
52 void init(); // setup everything
53
54 void process(std::vector<Hit> const&);
57 void pileup();
58 void clearPileupSignals() { mPileupSignals.clear(); }
59 const std::deque<std::array<SignalContainer, constants::MAXCHAMBER>>& getPileupSignals() const { return mPileupSignals; }
60 void setEventTime(double timeNS) { mTime = timeNS; }
61 void setTriggerTime(double t) { mCurrentTriggerTime = t; }
62 void setEventID(int entryID) { mEventID = entryID; }
63 void setSrcID(int sourceID) { mSrcID = sourceID; }
64 void setCalibrations(Calibrations* calibrations) { mCalib = calibrations; }
65 void setCreateSharedDigits(bool flag) { mCreateSharedDigits = flag; }
66 int getEventTime() const { return mTime; }
67 int getEventID() const { return mEventID; }
68 int getSrcID() const { return mSrcID; }
69 bool getCreateSharedDigits() const { return mCreateSharedDigits; }
70 std::string dumpFlaggedChambers() const;
71
72 private:
73 Geometry* mGeo = nullptr; // access to Geometry
74 PadResponse mPRF{}; // access to PadResponse
75 SimParam mSimParam{}; // simulation parameters
76 Calibrations* mCalib = nullptr; // access to Calibrations in CCDB
77 PileupTool pileupTool;
78
79 // number of digitizer threads
80 int mNumThreads = 1;
81
82 // we create one such service structure per thread
83 std::vector<math_utils::RandomRing<>> mGausRandomRings; // pre-generated normal distributed random numbers
84 std::vector<math_utils::RandomRing<>> mFlatRandomRings; // pre-generated flat distributed random numbers
85 std::vector<math_utils::RandomRing<>> mLogRandomRings; // pre-generated exp distributed random number
86 std::vector<DiffusionAndTimeStructEstimator> mDriftEstimators; // use one estimator per thread (works on different chamber with possibly different vDrift and profits from cached values)
87
88 double mTime = 0.; // time in nanoseconds of the hits currently being processed
89 double mCurrentTriggerTime = 0.; // time in nanoseconds of the current trigger
90 int mEventID = 0; // event id
91 int mSrcID = 0; // source id
92
93 // Digitization parameters
94 static constexpr float AmWidth = Geometry::amThick(); // Width of the amplification region
95 static constexpr float DrWidth = Geometry::drThick(); // Width of the drift retion
96 static constexpr float DrMin = -0.5 * AmWidth; // Drift + Amplification region
97 static constexpr float DrMax = DrWidth + 0.5 * AmWidth; // Drift + Amplification region
98 float mSamplingRate = 0; // The sampling rate
99 float mElAttachProp = 0; // Propability for electron attachment (for 1m)
100 int mNpad = 0; // Number of pads included in the pad response
101 int mTimeBinTRFend = 0; // time bin TRF ends
102 int mMaxTimeBins = 30; // Maximum number of time bins for processing signals, usually set at 30 tb = 3 microseconds
103 int mMaxTimeBinsTRAP = 30; // Maximum number of time bins for processing adcs; should be read from the CCDB or the TRAP config
104 bool mCreateSharedDigits = true; // flag if copies should be created of digits from pads which are shared between MCMs
105
106 // Digitization containers
107 std::vector<Hit> mHitContainer; // the container of hits in a given detector
108 std::vector<MCLabel> mMergedLabels; // temporary label container
109 std::array<SignalContainer, constants::MAXCHAMBER> mSignalsMapCollection; // container for caching signals over a timeframe
110 std::deque<std::array<SignalContainer, constants::MAXCHAMBER>> mPileupSignals; // container for piled up signals
111 std::array<bool, constants::MAXCHAMBER> mFlagVdriftOutOfRange{}; // flag chambers in which the drift velocity is out of range for which a parameterization exists
112
113 void getHitContainerPerDetector(const std::vector<Hit>&, std::array<std::vector<Hit>, constants::MAXCHAMBER>&);
114 void setSimulationParameters();
115
116 // Digitization chain methods
117 int triggerEventProcessing(DigitContainer&, o2::dataformats::MCTruthContainer<MCLabel>&);
118 SignalContainer addSignalsFromPileup();
119 void clearContainers();
120 bool convertHits(const int, const std::vector<Hit>&, SignalContainer&, int thread = 0); // True if hit-to-signal conversion is successful
121 bool convertSignalsToADC(SignalContainer&, DigitContainer&, int thread = 0); // True if signal-to-ADC conversion is successful
122 void addLabel(const int&, std::vector<MCLabel>&, std::unordered_set<int>&); // add a MC label, check if trackId is already registered
123 bool diffusion(float, float, float, float, float, float, double&, double&, double&, int thread = 0); // True if diffusion is applied successfully
124
125 // Helpers for signal handling
126 static constexpr int KEY_MIN = 0;
127 static constexpr int KEY_MAX = 2211727;
128 int calculateKey(const int det, const int row, const int col)
129 {
130 int key = ((det << 12) | (row << 8) | col);
131 assert(!(key < KEY_MIN || key > KEY_MAX));
132 return key;
133 }
134 int getDetectorFromKey(const int key) { return (key >> 12) & 0xFFF; }
135 int getRowFromKey(const int key) { return (key >> 8) & 0xF; }
136 int getColFromKey(const int key) { return key & 0xFF; }
137};
138} // namespace trd
139} // namespace o2
140#endif
Global TRD definitions and constants.
Definition of a container to keep Monte Carlo truth external to simulation objects.
uint32_t col
Definition RawData.h:4
StringRef key
A container to hold and manage MC truth information/labels.
~Digitizer()=default
void setCreateSharedDigits(bool flag)
Definition Digitizer.h:65
void setSrcID(int sourceID)
Definition Digitizer.h:63
void setTriggerTime(double t)
Definition Digitizer.h:61
void setEventID(int entryID)
Definition Digitizer.h:62
const std::deque< std::array< SignalContainer, constants::MAXCHAMBER > > & getPileupSignals() const
Definition Digitizer.h:59
void dumpLabels(const SignalContainer &, o2::dataformats::MCTruthContainer< MCLabel > &)
int getEventTime() const
Definition Digitizer.h:66
void flush(DigitContainer &, o2::dataformats::MCTruthContainer< MCLabel > &)
Definition Digitizer.cxx:84
void setEventTime(double timeNS)
Definition Digitizer.h:60
void clearPileupSignals()
Definition Digitizer.h:58
void setCalibrations(Calibrations *calibrations)
Definition Digitizer.h:64
int getSrcID() const
Definition Digitizer.h:68
std::string dumpFlaggedChambers() const
bool getCreateSharedDigits() const
Definition Digitizer.h:69
int getEventID() const
Definition Digitizer.h:67
constexpr int MAXCHAMBER
the maximum number of installed chambers
Definition Constants.h:30
std::unordered_map< int, SignalArray > SignalContainer
Definition Digitizer.h:44
std::vector< Digit > DigitContainer
Definition Digitizer.h:43
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
std::vector< int > row