32#include <fairlogger/Logger.h>
45 gemAmplification.updateParameters();
47 electronTransport.updateParameters(mVDrift);
49 sampaProcessing.updateParameters(mVDrift);
53 const int eventID,
const int sourceID)
64 const int nShapedPoints = eleParam.NShapedPoints;
65 const auto amplificationMode = gemParam.AmplMode;
66 static std::vector<float> signalArray;
67 signalArray.resize(nShapedPoints);
70 mDigitContainer.
reserve(sampaProcessing.getTimeBinFromTime(mEventTime - mOutputDigitTimeOffset));
73 float maxEleTime = (
int(mDigitContainer.
size()) - nShapedPoints) * eleParam.ZbinWidth;
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);
83 if (mDistortionScaleType == 1) {
84 mSpaceCharge->distortElectron(posEle);
85 }
else if (mDistortionScaleType == 2) {
86 mSpaceCharge->distortElectron(posEle, (mUseScaledDistortions ?
nullptr : mSpaceChargeDer.get()), mLumiScaleFactor);
91 if (electronTransport.isCompletelyOutOfSectorCoarseElectronDrift(posEle, mSector)) {
96 const int nPrimaryElectrons =
static_cast<int>(eh.GetEnergyLoss());
97 const float hitTime = eh.GetTime() * 0.001;
98 float driftTime = 0.f;
103 for (
int iEle = 0; iEle < nPrimaryElectrons; ++iEle) {
106 const GlobalPosition3D posEleDiff = electronTransport.getElectronDrift(posEle, driftTime);
107 const float eleTime = driftTime + hitTime;
108 if (eleTime >= maxEleTime) {
112 const float absoluteTime = eleTime + mTDriftOffset + (mEventTime - mOutputDigitTimeOffset);
116 if (!(absoluteTime >= 0 )) {
121 if (electronTransport.isElectronAttachment(driftTime)) {
126 if (std::abs(posEleDiff.Z()) > detParam.TPClength) {
147 const int nElectronsGEM = gemAmplification.getStackAmplification(digiPadPos.
getCRU(), digiPadPos.
getPadPos(), amplificationMode);
148 if (nElectronsGEM == 0) {
153 const float ADCsignal = sampaProcessing.getADCvalue(
static_cast<float>(nElectronsGEM));
155 sampaProcessing.getShapedSignal(ADCsignal, absoluteTime, signalArray);
156 for (
float i = 0;
i < nShapedPoints; ++
i) {
157 const float time = absoluteTime +
i * eleParam.ZbinWidth;
170 std::vector<o2::tpc::CommonMode>& commonModeOutput,
176 if (((finalFlush && mIsContinuous) || (!mIsContinuous)) && mSpaceCharge) {
177 o2::utils::DebugStreamer::instance()->flush();
183 mUseSCDistortions =
true;
185 mSpaceCharge = std::make_unique<SC>();
187 mSpaceCharge->setSCDistortionType(distortionType);
188 if (hisInitialSCDensity) {
189 mSpaceCharge->fillChargeDensityFromHisto(*hisInitialSCDensity);
190 mSpaceCharge->setUseInitialSCDensity(
true);
196 mUseSCDistortions =
true;
197 mSpaceCharge.reset(spaceCharge);
198 mSpaceCharge->initAfterReadingFromFile();
199 mSpaceCharge->printMetaData();
204 mSpaceChargeDer.reset(spaceCharge);
205 mSpaceChargeDer->initAfterReadingFromFile();
206 mSpaceChargeDer->printMetaData();
211 mUseSCDistortions =
true;
213 mSpaceCharge = std::make_unique<SC>();
217 mSpaceCharge->setAnalyticalCorrectionsDistortionsFromFile(finp);
218 if (!mSpaceCharge->getUseAnalyticalDistCorr()) {
219 mSpaceCharge->setGlobalDistortionsFromFile(finp,
Side::A);
220 mSpaceCharge->setGlobalDistortionsFromFile(finp,
Side::C);
231 const auto timediff =
time - mOutputDigitTimeOffset;
239 LOGP(info,
"Setting Lumi scale factor: lumiInst: {} lumi mean: {} lumi mean derivative: {} lumi scale factor: {}",
CorrMapParam::Instance().lumiInst, mSpaceCharge->getMeanLumi(), mSpaceChargeDer->getMeanLumi(), mLumiScaleFactor);
244 mSpaceCharge->setMeanLumi(meanLumi);
249 mSpaceChargeDer->setMeanLumi(meanLumi);
254 if (!mSpaceCharge || !mSpaceChargeDer) {
255 LOGP(info,
"Average or derivative distortions not set");
261 for (
int iside = 0; iside < 2; ++iside) {
264 LOGP(info,
"Calculating corrections for average distortions");
265 mSpaceCharge->calcGlobalCorrWithGlobalDistIterative(
side,
nullptr, 0);
267 LOGP(info,
"Calculating corrections for derivative distortions");
268 mSpaceChargeDer->calcGlobalCorrWithGlobalDistIterative(
side,
nullptr, 0);
270 LOGP(info,
"Calculating scaled distortions with scaling factor {}", mLumiScaleFactor);
271 mSpaceCharge->calcGlobalDistWithGlobalCorrIterativeLinearCartesian(
side, mSpaceChargeDer.get(), mLumiScaleFactor);
276 LOGP(info,
"Inst. lumi {} is same as mean lumi {}. Skip recalculation of distortions",
CorrMapParam::Instance().lumiInst, mSpaceCharge->getMeanLumi());
279 mUseScaledDistortions =
true;
Simple interface to the CDB manager.
Implementation of the parameter class for the CorrectionMapsLoader options.
Definition of the electron transport.
Definition of the GEM amplification.
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.
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)
static const ParameterDetector & Instance()
const Sector sector() const
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 §or, 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
PadPos getGlobalPadPos() const
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 setLumiScaleFactor()
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)
Digitizer()
Default constructor.
static ElectronTransport & instance()
static GEMAmplification & instance()
Default constructor.
GlobalPadNumber globalPadNumber(const PadPos &globalPadPosition) const
const DigitPos findDigitPosFromGlobalPosition(const GlobalPosition3D &pos) const
bool isOutOfSector(GlobalPosition3D posEle, const Sector §or, const float margin=0.f) const
static Mapper & instance(const std::string mappingDir="")
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
Global TPC definitions and constants.
unsigned short GlobalPadNumber
global pad number
SCDistortionType
Enumerator for setting the space-charge distortion mode.
std::vector< Digit > digits