51 const auto slotLengthTF = ic.options().get<uint32_t>(
"tf-per-slot");
52 const auto slotLengthSeconds = ic.options().get<
int>(
"seconds-per-slot");
53 const auto maxDelay = ic.options().get<uint32_t>(
"max-delay");
54 const auto minEntries = ic.options().get<
int>(
"min-entries");
55 mCalibIntervalExtensionMS = ic.options().get<uint32_t>(
"calib-interval-extension") * 1000l;
57 const auto minEntriesSector = ic.options().get<
int>(
"min-entries-sector");
58 const auto minEntries1D = ic.options().get<
int>(
"min-entries-1d");
59 const auto minEntries2D = ic.options().get<
int>(
"min-entries-2d");
60 const auto fitPasses = ic.options().get<
int>(
"fit-passes");
61 const auto fitThreshold = ic.options().get<
float>(
"fit-threshold");
62 const auto fitThresholdLowFactor = ic.options().get<
float>(
"fit-threshold-low-factor");
64 const auto dEdxBins = ic.options().get<
int>(
"dedxbins");
65 const auto mindEdx = ic.options().get<
float>(
"min-dedx");
66 const auto maxdEdx = ic.options().get<
float>(
"max-dedx");
67 const auto angularBins = ic.options().get<
int>(
"angularbins");
68 const auto fitSnp = ic.options().get<
bool>(
"fit-snp");
70 const auto dumpData = ic.options().get<
bool>(
"file-dump");
71 const auto dumpHistograms = ic.options().get<uint32_t>(
"dump-histograms");
72 const auto trackDebug = ic.options().get<
bool>(
"track-debug");
73 const bool makeGaussianFits = !ic.options().get<
bool>(
"disable-gaussian-fits");
75 mCalibrator = std::make_unique<tpc::CalibratordEdx>();
76 mCalibrator->setHistParams(dEdxBins, mindEdx, maxdEdx, angularBins, fitSnp);
77 mCalibrator->setApplyCuts(
false);
78 mCalibrator->setFitThresholds(minEntriesSector, minEntries1D, minEntries2D);
79 mCalibrator->setMinEntries(minEntries);
80 mCalibrator->setSlotLength(slotLengthTF);
81 mCalibrator->setSlotLengthInSeconds(slotLengthSeconds);
82 mCalibrator->setMaxSlotsDelay(maxDelay);
83 mCalibrator->setElectronCut({fitThreshold, fitPasses, fitThresholdLowFactor});
84 mCalibrator->setMaterialType(mMatType);
85 mCalibrator->setDumpHistograms(dumpHistograms);
86 mCalibrator->setTrackDebug(trackDebug);
87 mCalibrator->setMakeGaussianFits(makeGaussianFits);
89 const auto& gpuConfig = GPU_GET_CONFIG(GPUSettingsO2);
90 mCustomdEdxFileName = gpuConfig.dEdxCorrFile;
91 mDisableTimeGain = gpuConfig.dEdxDisableResidualGain;
93 if (mDisableTimeGain) {
94 LOGP(info,
"TimeGain correction was disabled via GPU_global.dEdxDisableResidualGain=1");
97 if (!mDisableTimeGain && !mCustomdEdxFileName.empty()) {
98 std::unique_ptr<TFile> fdEdxCustom(TFile::Open(mCustomdEdxFileName.data()));
99 if (!fdEdxCustom || !fdEdxCustom->IsOpen() || fdEdxCustom->IsZombie()) {
100 LOGP(error,
"Could not open custom TimeGain file {}", mCustomdEdxFileName);
104 LOGP(error,
"Could not load 'CalibdEdxCorrection' from file {}", mCustomdEdxFileName);
106 mTimeGain = *timeGain;
108 LOGP(info,
"Loaded custom TimeGain from file {} with {} dimensions and mean qTot Params {}", mCustomdEdxFileName, mTimeGain.getDims(),
utils::elementsToString(meanParamTot));
114 const auto dumpDataName = ic.options().get<std::string>(
"file-dump-name");
115 mCalibrator->enableDebugOutput(dumpDataName);
137 static bool slotLengthSet =
false;
138 if (!slotLengthSet) {
140 mCalibrator->checkSlotLength();
141 slotLengthSet =
true;
144 auto& slotTF = mCalibrator->getSlotForTF(mCalibrator->getCurrentTFInfo().tfCounter);
145 auto calib = slotTF.getContainer();
147 const auto calibInEnties = calib->getCalibrationInput().getEntries(stackID,
ChargeType::Tot);
148 calib->setCalibrationInput(mTimeGain);
150 const auto meanParamTot = calib->getCalibrationInput().getMeanParams(
ChargeType::Tot);
151 LOGP(info,
"Updating TimeGain with {} dimensions and mean qTot Params {} for slot with TF range {} <=TF<= {}",
152 calib->getCalibrationInput().getDims(),
utils::elementsToString(meanParamTot), slotTF.getTFStart(), slotTF.getTFEnd());
155 const auto tracks = pc.inputs().get<gsl::span<tpc::TrackTPC>>(
"tracks");
156 LOGP(detail,
"Processing TF {} with {} tracks", mCalibrator->getCurrentTFInfo().tfCounter, tracks.size());
157 mRunNumber = mCalibrator->getCurrentTFInfo().runNumber;
158 mCalibrator->process(tracks);
159 sendOutput(pc.outputs());
161 const auto& infoVec = mCalibrator->getTFinterval();
162 LOGP(detail,
"Created {} objects for TF {}", infoVec.size(), mCalibrator->getCurrentTFInfo().tfCounter);
187 LOGP(info,
"Sending object {} / {} of size {} bytes, valid for {} : {} ", info.getPath(), info.getFileName(),
image->size(), info.getStartValidityTimestamp(), info.getEndValidityTimestamp());