Project
Loading...
Searching...
No Matches
Digitizer.cxx
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
15
16#include "TH3.h"
17
25#include "TPCSimulation/Point.h"
29#include "TPCBase/Mapper.h"
31
32#include <fairlogger/Logger.h>
33
35
36using namespace o2::tpc;
37
38Digitizer::~Digitizer() = default;
39
40Digitizer::Digitizer() = default;
41
43{
44 auto& gemAmplification = GEMAmplification::instance();
45 gemAmplification.updateParameters();
46 auto& electronTransport = ElectronTransport::instance();
47 electronTransport.updateParameters(mVDrift);
48 auto& sampaProcessing = SAMPAProcessing::instance();
49 sampaProcessing.updateParameters(mVDrift);
50}
51
52void Digitizer::process(const std::vector<o2::tpc::HitGroup>& hits,
53 const int eventID, const int sourceID)
54{
55 const Mapper& mapper = Mapper::instance();
56 auto& detParam = ParameterDetector::Instance();
57 auto& eleParam = ParameterElectronics::Instance();
58 auto& gemParam = ParameterGEM::Instance();
59
60 auto& gemAmplification = GEMAmplification::instance();
61 auto& electronTransport = ElectronTransport::instance();
62 auto& sampaProcessing = SAMPAProcessing::instance();
63
64 const int nShapedPoints = eleParam.NShapedPoints;
65 const auto amplificationMode = gemParam.AmplMode;
66 static std::vector<float> signalArray;
67 signalArray.resize(nShapedPoints);
68
70 mDigitContainer.reserve(sampaProcessing.getTimeBinFromTime(mEventTime - mOutputDigitTimeOffset));
71
73 float maxEleTime = (int(mDigitContainer.size()) - nShapedPoints) * eleParam.ZbinWidth;
74
75 for (auto& hitGroup : hits) {
76 const int MCTrackID = hitGroup.GetTrackID();
77 for (size_t hitindex = 0; hitindex < hitGroup.getSize(); ++hitindex) {
78 const auto& eh = hitGroup.getHit(hitindex);
79
80 GlobalPosition3D posEle(eh.GetX(), eh.GetY(), eh.GetZ());
81
82 // Distort the electron position in case space-charge distortions are used
83 if (mDistortionScaleType == 1) {
84 mSpaceCharge->distortElectron(posEle);
85 } else if (mDistortionScaleType == 2) {
86 mSpaceCharge->distortElectron(posEle, (mUseScaledDistortions ? nullptr : mSpaceChargeDer.get()), mLumiScaleFactor);
87 }
88
91 if (electronTransport.isCompletelyOutOfSectorCoarseElectronDrift(posEle, mSector)) {
92 continue;
93 }
94
96 const int nPrimaryElectrons = static_cast<int>(eh.GetEnergyLoss());
97 const float hitTime = eh.GetTime() * 0.001;
98 float driftTime = 0.f;
99
101
103 for (int iEle = 0; iEle < nPrimaryElectrons; ++iEle) {
104
106 const GlobalPosition3D posEleDiff = electronTransport.getElectronDrift(posEle, driftTime);
107 const float eleTime = driftTime + hitTime;
108 if (eleTime >= maxEleTime) {
109 // LOG(warning) << "Skipping electron with driftTime " << driftTime << " from hit at time " << hitTime;
110 continue;
111 }
112 const float absoluteTime = eleTime + mTDriftOffset + (mEventTime - mOutputDigitTimeOffset);
113
116 if (!(absoluteTime >= 0 /* && absoluteTime <= timeframelength */)) {
117 continue;
118 }
119
121 if (electronTransport.isElectronAttachment(driftTime)) {
122 continue;
123 }
124
126 if (std::abs(posEleDiff.Z()) > detParam.TPClength) {
127 continue;
128 }
129
131 if (mapper.isOutOfSector(posEleDiff, mSector)) {
132 continue;
133 }
134
136 const DigitPos digiPadPos = mapper.findDigitPosFromGlobalPosition(posEleDiff, mSector);
137 if (!digiPadPos.isValid()) {
138 continue;
139 }
140
142 if (digiPadPos.getCRU().sector() != mSector) {
143 continue;
144 }
145
147 const int nElectronsGEM = gemAmplification.getStackAmplification(digiPadPos.getCRU(), digiPadPos.getPadPos(), amplificationMode);
148 if (nElectronsGEM == 0) {
149 continue;
150 }
151
152 const GlobalPadNumber globalPad = mapper.globalPadNumber(digiPadPos.getGlobalPadPos());
153 const float ADCsignal = sampaProcessing.getADCvalue(static_cast<float>(nElectronsGEM));
154 const MCCompLabel label(MCTrackID, eventID, sourceID, false);
155 sampaProcessing.getShapedSignal(ADCsignal, absoluteTime, signalArray);
156 for (float i = 0; i < nShapedPoints; ++i) {
157 const float time = absoluteTime + i * eleParam.ZbinWidth;
158 mDigitContainer.addDigit(label, digiPadPos.getCRU(), sampaProcessing.getTimeBinFromTime(time), globalPad,
159 signalArray[i]);
160 }
162 }
164 }
165 }
166}
167
168void Digitizer::flush(std::vector<o2::tpc::Digit>& digits,
170 std::vector<o2::tpc::CommonMode>& commonModeOutput,
171 bool finalFlush)
172{
173 SAMPAProcessing& sampaProcessing = SAMPAProcessing::instance();
174 mDigitContainer.fillOutputContainer(digits, labels, commonModeOutput, mSector, sampaProcessing.getTimeBinFromTime(mEventTime - mOutputDigitTimeOffset), mIsContinuous, finalFlush);
175 // flushing debug output to file
176 if (((finalFlush && mIsContinuous) || (!mIsContinuous)) && mSpaceCharge) {
177 o2::utils::DebugStreamer::instance()->flush();
178 }
179}
180
181void Digitizer::setUseSCDistortions(const SCDistortionType& distortionType, const TH3* hisInitialSCDensity)
182{
183 mUseSCDistortions = true;
184 if (!mSpaceCharge) {
185 mSpaceCharge = std::make_unique<SC>();
186 }
187 mSpaceCharge->setSCDistortionType(distortionType);
188 if (hisInitialSCDensity) {
189 mSpaceCharge->fillChargeDensityFromHisto(*hisInitialSCDensity);
190 mSpaceCharge->setUseInitialSCDensity(true);
191 }
192}
193
195{
196 mUseSCDistortions = true;
197 mSpaceCharge.reset(spaceCharge);
198 mSpaceCharge->initAfterReadingFromFile();
199 mSpaceCharge->printMetaData();
200}
201
203{
204 mSpaceChargeDer.reset(spaceCharge);
205 mSpaceChargeDer->initAfterReadingFromFile();
206 mSpaceChargeDer->printMetaData();
207}
208
209void Digitizer::setUseSCDistortions(std::string_view finp)
210{
211 mUseSCDistortions = true;
212 if (!mSpaceCharge) {
213 mSpaceCharge = std::make_unique<SC>();
214 }
215
216 // in case analytical distortions are loaded from file they are applied
217 mSpaceCharge->setAnalyticalCorrectionsDistortionsFromFile(finp);
218 if (!mSpaceCharge->getUseAnalyticalDistCorr()) {
219 mSpaceCharge->setGlobalDistortionsFromFile(finp, Side::A);
220 mSpaceCharge->setGlobalDistortionsFromFile(finp, Side::C);
221 }
222}
223
225{
226 // this is setting the first timebin index for the digit container
227 // note that negative times w.r.t start of timeframe/data-taking == mOutputDigitTimeOffset
228 // will yield the 0-th bin (due to casting logic in sampaProcessing)
229 SAMPAProcessing& sampaProcessing = SAMPAProcessing::instance();
230 sampaProcessing.updateParameters(mVDrift);
231 const auto timediff = time - mOutputDigitTimeOffset;
232 const auto starttimebin = sampaProcessing.getTimeBinFromTime(timediff);
233 mDigitContainer.setStartTime(starttimebin);
234}
235
237{
238 mLumiScaleFactor = (CorrMapParam::Instance().lumiInst - mSpaceCharge->getMeanLumi()) / mSpaceChargeDer->getMeanLumi();
239 LOGP(info, "Setting Lumi scale factor: lumiInst: {} lumi mean: {} lumi mean derivative: {} lumi scale factor: {}", CorrMapParam::Instance().lumiInst, mSpaceCharge->getMeanLumi(), mSpaceChargeDer->getMeanLumi(), mLumiScaleFactor);
240}
241
243{
244 mSpaceCharge->setMeanLumi(meanLumi);
245}
246
248{
249 mSpaceChargeDer->setMeanLumi(meanLumi);
250}
251
253{
254 if (!mSpaceCharge || !mSpaceChargeDer) {
255 LOGP(info, "Average or derivative distortions not set");
256 return;
257 }
258
259 // recalculate distortions only in case the inst lumi differs from the avg lumi
260 if (mSpaceCharge->getMeanLumi() != CorrMapParam::Instance().lumiInst) {
261 for (int iside = 0; iside < 2; ++iside) {
262 const o2::tpc::Side side = (iside == 0) ? Side::A : Side::C;
263 // this needs to be done only once
264 LOGP(info, "Calculating corrections for average distortions");
265 mSpaceCharge->calcGlobalCorrWithGlobalDistIterative(side, nullptr, 0);
266
267 LOGP(info, "Calculating corrections for derivative distortions");
268 mSpaceChargeDer->calcGlobalCorrWithGlobalDistIterative(side, nullptr, 0);
269
270 LOGP(info, "Calculating scaled distortions with scaling factor {}", mLumiScaleFactor);
271 mSpaceCharge->calcGlobalDistWithGlobalCorrIterativeLinearCartesian(side, mSpaceChargeDer.get(), mLumiScaleFactor);
272 }
273 // set new lumi of avg map
274 mSpaceCharge->setMeanLumi(CorrMapParam::Instance().lumiInst);
275 } else {
276 LOGP(info, "Inst. lumi {} is same as mean lumi {}. Skip recalculation of distortions", CorrMapParam::Instance().lumiInst, mSpaceCharge->getMeanLumi());
277 }
278
279 mUseScaledDistortions = true;
280}
Simple interface to the CDB manager.
Implementation of the parameter class for the CorrectionMapsLoader options.
Definition of the electron transport.
int16_t time
Definition RawEventData.h:4
Definition of the GEM amplification.
int32_t i
Definition of the parameter class for the detector.
Definition of the parameter class for the detector electronics.
Definition of the parameter class for the GEM stack.
Definition of the parameter class for the detector gas.
Class for TPC Point.
uint32_t side
Definition RawData.h:0
Definition of the SAMPA response.
This class contains the algorithms for calculation the distortions and corrections.
Definition of the ALICE TPC digitizer.
ClassImp(o2::tpc::Digitizer)
A container to hold and manage MC truth information/labels.
const Sector sector() const
Definition CRU.h:65
void setStartTime(TimeBin time)
size_t size() const
Get the size of the container for one event.
void fillOutputContainer(std::vector< Digit > &output, dataformats::MCTruthContainer< MCCompLabel > &mcTruth, std::vector< CommonMode > &commonModeOutput, const Sector &sector, TimeBin eventTimeBin=0, bool isContinuous=true, bool finalFlush=false)
void addDigit(const MCCompLabel &label, const CRU &cru, TimeBin timeBin, GlobalPadNumber globalPad, float signal)
void reserve(TimeBin eventTimeBin)
Reserve space in the container for a given event.
const CRU & getCRU() const
Definition DigitPos.h:30
bool isValid() const
Definition DigitPos.h:38
PadPos getGlobalPadPos() const
Definition DigitPos.cxx:20
PadPos getPadPos() const
Definition DigitPos.h:32
void setMeanLumiDistortions(float meanLumi)
void setUseSCDistortions(const SCDistortionType &distortionType, const TH3 *hisInitialSCDensity)
void setMeanLumiDistortionsDerivative(float meanLumi)
void flush(std::vector< o2::tpc::Digit > &digits, o2::dataformats::MCTruthContainer< o2::MCCompLabel > &labels, std::vector< o2::tpc::CommonMode > &commonModeOutput, bool finalFlush=false)
void setSCDistortionsDerivative(SC *spaceCharge)
void setStartTime(double time)
void recalculateDistortions()
in case of scaled distortions, the distortions can be recalculated to ensure consistent distortions a...
void process(const std::vector< o2::tpc::HitGroup > &hits, const int eventID, const int sourceID=0)
Definition Digitizer.cxx:52
~Digitizer()
Destructor.
void init()
Initializer.
Definition Digitizer.cxx:42
Digitizer()
Default constructor.
static ElectronTransport & instance()
static GEMAmplification & instance()
Default constructor.
GlobalPadNumber globalPadNumber(const PadPos &globalPadPosition) const
Definition Mapper.h:56
const DigitPos findDigitPosFromGlobalPosition(const GlobalPosition3D &pos) const
Definition Mapper.h:716
bool isOutOfSector(GlobalPosition3D posEle, const Sector &sector, const float margin=0.f) const
Definition Mapper.h:739
static Mapper & instance(const std::string mappingDir="")
Definition Mapper.h:44
static SAMPAProcessing & instance()
void updateParameters(float vdrift=0)
Update the OCDB parameters cached in the class. To be called once per event.
TimeBin getTimeBinFromTime(float time) const
GLuint GLsizei const GLchar * label
Definition glcorearb.h:2519
Global TPC definitions and constants.
Definition SimTraits.h:167
Side
TPC readout sidE.
Definition Defs.h:35
@ A
Definition Defs.h:35
@ C
Definition Defs.h:36
unsigned short GlobalPadNumber
global pad number
Definition Defs.h:129
SCDistortionType
Enumerator for setting the space-charge distortion mode.
Definition SpaceCharge.h:57
std::vector< Digit > digits