Skip to content

Commit 3d91be9

Browse files
committed
[PID TOF] Realign naming before upgrade
1 parent 2523ab3 commit 3d91be9

4 files changed

Lines changed: 242 additions & 87 deletions

File tree

Common/Core/PID/PIDTOF.h

Lines changed: 152 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,140 @@ class TOFResoParamsV2 : public o2::tof::Parameters<13>
178178
// LOG(info) << "TOFResoParamsV2 shift: correction for eta " << eta << " is for index " << etaIndex << " = " << shift;
179179
return mContent.at(etaIndex);
180180
}
181+
182+
void printMomentumChargeShiftParameters() const
183+
{
184+
LOG(info) << "TOF momentum shift parameters";
185+
LOG(info) << "etaN: " << mEtaN;
186+
LOG(info) << "etaStart: " << mEtaStart;
187+
LOG(info) << "etaStop: " << mEtaStop;
188+
LOG(info) << "content size " << mContent.size();
189+
for (int i = 0; i < mEtaN; ++i) {
190+
LOG(info) << "etaC" << i << ": " << mContent[i];
191+
}
192+
}
193+
194+
// Time shift for post calibration
195+
void setTimeShiftParameters(std::unordered_map<std::string, float> const& pars, bool positive)
196+
{
197+
std::string baseOpt = positive ? "TimeShift.Pos." : "TimeShift.Neg.";
198+
199+
if (pars.count(baseOpt + "GetN") == 0) { // If the map does not contain the number of eta bins, we assume that no correction has to be applied
200+
return;
201+
}
202+
const int nPoints = static_cast<int>(pars.at(baseOpt + "GetN"));
203+
if (nPoints <= 0) {
204+
LOG(fatal) << "TOFResoParamsV2 shift: time must be positive";
205+
}
206+
TGraph graph;
207+
for (int i = 0; i < nPoints; ++i) {
208+
graph.AddPoint(pars.at(Form("TimeShift.eta%i", i)), pars.at(Form("TimeShift.cor%i", i)));
209+
}
210+
setTimeShiftParameters(&graph, positive);
211+
}
212+
void setTimeShiftParameters(std::string const& filename, std::string const& objname, bool positive)
213+
{
214+
TFile f(filename.c_str(), "READ");
215+
if (f.IsOpen()) {
216+
if (positive) {
217+
f.GetObject(objname.c_str(), gPosEtaTimeCorr);
218+
} else {
219+
f.GetObject(objname.c_str(), gNegEtaTimeCorr);
220+
}
221+
f.Close();
222+
}
223+
LOG(info) << "Set the Time Shift parameters from file " << filename << " and object " << objname << " for " << (positive ? "positive" : "negative");
224+
}
225+
void setTimeShiftParameters(TGraph* g, bool positive)
226+
{
227+
if (positive) {
228+
gPosEtaTimeCorr = g;
229+
} else {
230+
gNegEtaTimeCorr = g;
231+
}
232+
LOG(info) << "Set the Time Shift parameters from object " << g->GetName() << " " << g->GetTitle() << " for " << (positive ? "positive" : "negative");
233+
}
234+
float getTimeShift(float eta, int16_t sign) const
235+
{
236+
if (sign > 0) {
237+
if (!gPosEtaTimeCorr) {
238+
return 0.f;
239+
}
240+
return gPosEtaTimeCorr->Eval(eta);
241+
}
242+
if (!gNegEtaTimeCorr) {
243+
return 0.f;
244+
}
245+
return gNegEtaTimeCorr->Eval(eta);
246+
}
247+
248+
private:
249+
// Charge calibration
250+
int mEtaN = 0; // Number of eta bins, 0 means no correction
251+
float mEtaStart = 0.f;
252+
float mEtaStop = 0.f;
253+
float mInvEtaWidth = 9999.f;
254+
std::vector<float> mContent;
255+
256+
// Time shift for post calibration
257+
TGraph* gPosEtaTimeCorr = nullptr; /// Time shift correction for positive tracks
258+
TGraph* gNegEtaTimeCorr = nullptr; /// Time shift correction for negative tracks
259+
};
260+
261+
/// \brief Next implementation class to store TOF response parameters for exp. times
262+
class TOFResoParamsV3 : public o2::tof::Parameters<13>
263+
{
264+
public:
265+
TOFResoParamsV3() : Parameters(std::array<std::string, 13>{"TrkRes.Pi.P0", "TrkRes.Pi.P1", "TrkRes.Pi.P2", "TrkRes.Pi.P3", "time_resolution",
266+
"TrkRes.Ka.P0", "TrkRes.Ka.P1", "TrkRes.Ka.P2", "TrkRes.Ka.P3",
267+
"TrkRes.Pr.P0", "TrkRes.Pr.P1", "TrkRes.Pr.P2", "TrkRes.Pr.P3"},
268+
"TOFResoParamsV3")
269+
{
270+
setParameters(std::array<float, 13>{0.008, 0.008, 0.002, 40.0, 60.0,
271+
0.008, 0.008, 0.002, 40.0,
272+
0.008, 0.008, 0.002, 40.0});
273+
} // Default constructor with default parameters
274+
275+
~TOFResoParamsV3() = default;
276+
277+
// Momentum shift for charge calibration
278+
void setMomentumChargeShiftParameters(std::unordered_map<std::string, float> const& pars)
279+
{
280+
if (pars.count("Shift.etaN") == 0) { // If the map does not contain the number of eta bins, we assume that no correction has to be applied
281+
mEtaN = 0;
282+
return;
283+
}
284+
mEtaN = static_cast<int>(pars.at("Shift.etaN"));
285+
if (mEtaN <= 0) {
286+
LOG(fatal) << "TOFResoParamsV3 shift: etaN must be positive";
287+
}
288+
mEtaStart = pars.at("Shift.etaStart");
289+
mEtaStop = pars.at("Shift.etaStop");
290+
if (mEtaStart >= mEtaStop) {
291+
LOG(fatal) << "TOFResoParamsV3 shift: etaStart must be smaller than etaStop";
292+
}
293+
mInvEtaWidth = 1.f / ((mEtaStop - mEtaStart) / mEtaN);
294+
mContent.clear();
295+
mContent.resize(mEtaN);
296+
for (int i = 0; i < mEtaN; ++i) {
297+
mContent[i] = pars.at(Form("Shift.etaC%i", i));
298+
}
299+
}
181300
// To remove
182-
float getShift(float eta) const
301+
void setShiftParameters(std::unordered_map<std::string, float> const& pars)
302+
{
303+
setMomentumChargeShiftParameters(pars);
304+
}
305+
306+
float getMomentumChargeShift(float eta) const
183307
{
184-
return getMomentumChargeShift(eta);
308+
if (mEtaN == 0) { // No correction
309+
// LOG(info) << "TOFResoParamsV3 shift: no correction mEtaN is " << mEtaN;
310+
return 0.f;
311+
}
312+
const int& etaIndex = (eta <= mEtaStart) ? 0 : (eta >= mEtaStop ? (mEtaN - 1) : (eta - mEtaStart) * mInvEtaWidth);
313+
// LOG(info) << "TOFResoParamsV3 shift: correction for eta " << eta << " is for index " << etaIndex << " = " << shift;
314+
return mContent.at(etaIndex);
185315
}
186316

187317
void printMomentumChargeShiftParameters() const
@@ -195,12 +325,25 @@ class TOFResoParamsV2 : public o2::tof::Parameters<13>
195325
LOG(info) << "etaC" << i << ": " << mContent[i];
196326
}
197327
}
198-
// To remove
199-
void printShiftParameters() const
328+
329+
// Time shift for post calibration
330+
void setTimeShiftParameters(std::unordered_map<std::string, float> const& pars, bool positive)
200331
{
201-
printMomentumChargeShiftParameters();
202-
}
332+
std::string baseOpt = positive ? "TimeShift.Pos." : "TimeShift.Neg.";
203333

334+
if (pars.count(baseOpt + "GetN") == 0) { // If the map does not contain the number of eta bins, we assume that no correction has to be applied
335+
return;
336+
}
337+
const int nPoints = static_cast<int>(pars.at(baseOpt + "GetN"));
338+
if (nPoints <= 0) {
339+
LOG(fatal) << "TOFResoParamsV3 shift: time must be positive";
340+
}
341+
TGraph graph;
342+
for (int i = 0; i < nPoints; ++i) {
343+
graph.AddPoint(pars.at(Form("TimeShift.eta%i", i)), pars.at(Form("TimeShift.cor%i", i)));
344+
}
345+
setTimeShiftParameters(&graph, positive);
346+
}
204347
void setTimeShiftParameters(std::string const& filename, std::string const& objname, bool positive)
205348
{
206349
TFile f(filename.c_str(), "READ");
@@ -285,10 +428,10 @@ class ExpTimes
285428
return defaultReturnValue;
286429
}
287430
if (track.trackType() == o2::aod::track::Run2Track) {
288-
return ComputeExpectedTime(track.tofExpMom() * kCSPEDDInv / (1.f + track.sign() * parameters.getShift(track.eta())), track.length());
431+
return ComputeExpectedTime(track.tofExpMom() * kCSPEDDInv / (1.f + track.sign() * parameters.getMomentumChargeShift(track.eta())), track.length());
289432
}
290-
LOG(debug) << "TOF exp. mom. " << track.tofExpMom() << " shifted = " << track.tofExpMom() / (1.f + track.sign() * parameters.getShift(track.eta()));
291-
return ComputeExpectedTime(track.tofExpMom() / (1.f + track.sign() * parameters.getShift(track.eta())), track.length()) + parameters.getTimeShift(track.eta(), track.sign());
433+
LOG(debug) << "TOF exp. mom. " << track.tofExpMom() << " shifted = " << track.tofExpMom() / (1.f + track.sign() * parameters.getMomentumChargeShift(track.eta()));
434+
return ComputeExpectedTime(track.tofExpMom() / (1.f + track.sign() * parameters.getMomentumChargeShift(track.eta())), track.length()) + parameters.getTimeShift(track.eta(), track.sign());
292435
}
293436

294437
/// Gets the expected resolution of the t-texp-t0

Common/DataModel/PIDResponse.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,10 @@ DECLARE_SOA_DYNAMIC_COLUMN(IsEvTimeTOFT0AC, isEvTimeTOFT0AC, //! True if the Eve
403403

404404
namespace pidtofsignal
405405
{
406-
DECLARE_SOA_COLUMN(TOFSignal, tofSignal, float); //! TOF signal from track time
406+
DECLARE_SOA_COLUMN(TOFSignal, tofSignal, float); //! TOF signal from track time
407+
DECLARE_SOA_DYNAMIC_COLUMN(EventCollisionTime, eventCollisionTime, //! Event collision time used for the track. Needs the TOF
408+
[](float signal, float tMinusTexp, float texp) -> float { return texp + tMinusTexp - signal; });
409+
407410
} // namespace pidtofsignal
408411

409412
namespace pidtofbeta
@@ -528,7 +531,8 @@ DEFINE_UNWRAP_NSIGMA_COLUMN(TOFNSigmaAl, tofNSigmaAl); //! Unwrapped (float) nsi
528531
} // namespace pidtof_tiny
529532

530533
DECLARE_SOA_TABLE(TOFSignal, "AOD", "TOFSignal", //! Table of the TOF signal
531-
pidtofsignal::TOFSignal);
534+
pidtofsignal::TOFSignal,
535+
pidtofsignal::EventCollisionTime<pidtofsignal::TOFSignal>);
532536

533537
DECLARE_SOA_TABLE(pidTOFFlags, "AOD", "pidTOFFlags", //! Table of the flags for TOF signal quality on the track level
534538
pidflags::GoodTOFMatch);

Common/TableProducer/PID/pidTOFBase.cxx

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
#include "Common/DataModel/EventSelection.h"
3131
#include "Common/DataModel/FT0Corrected.h"
3232
#include "Common/DataModel/Multiplicity.h"
33+
#include "Framework/HistogramRegistry.h"
34+
#include "Framework/runDataProcessing.h"
3335
#include "TableHelper.h"
3436
#include "pidTOFBase.h"
3537

@@ -39,15 +41,6 @@ using namespace o2::pid;
3941
using namespace o2::framework::expressions;
4042
using namespace o2::track;
4143

42-
void customize(std::vector<o2::framework::ConfigParamSpec>& workflowOptions)
43-
{
44-
std::vector<ConfigParamSpec> options{{"add-qa", VariantType::Int, 0, {"Legacy. No effect."}},
45-
{"evtime", VariantType::Int, 1, {"Produce the table for the Event Time"}}};
46-
std::swap(workflowOptions, options);
47-
}
48-
49-
#include "Framework/runDataProcessing.h"
50-
5144
/// Selection criteria for tracks used for TOF event time
5245
float trackDistanceForGoodMatch = 999.f;
5346
float trackDistanceForGoodMatchLowMult = 999.f;
@@ -69,6 +62,8 @@ bool isTrackGoodMatchForTOFPID(const Run3Trks::iterator& tr, const Run3Cols& /*e
6962
struct tofSignal {
7063
o2::framework::Produces<o2::aod::TOFSignal> table;
7164
o2::framework::Produces<o2::aod::pidTOFFlags> tableFlags;
65+
HistogramRegistry histos{"Histos", {}, OutputObjHandlingPolicy::AnalysisObject};
66+
7267
bool enableTable = false; // Flag to check if the TOF signal table is requested or not
7368
bool enableTableFlags = false; // Flag to check if the TOF signal flags table is requested or not
7469
// CCDB configuration
@@ -78,6 +73,7 @@ struct tofSignal {
7873
Configurable<float> distanceForGoodMatch{"distanceForGoodMatch", 999.f, "Maximum distance to consider a good match"};
7974
Configurable<float> distanceForGoodMatchLowMult{"distanceForGoodMatchLowMult", 999.f, "Maximum distance to consider a good match for low multiplicity events"};
8075
Configurable<int> multThreshold{"multThreshold", 0, "Multiplicity threshold to consider a low multiplicity event"};
76+
Configurable<bool> enableQaHistograms{"enableQaHistograms", false, "Flag to enable the QA histograms"};
8177

8278
void init(o2::framework::InitContext& initContext)
8379
{
@@ -101,6 +97,13 @@ struct tofSignal {
10197
trackDistanceForGoodMatchLowMult = distanceForGoodMatchLowMult;
10298
multiplicityThreshold = multThreshold;
10399
LOG(info) << "Configuring selections for good match: " << trackDistanceForGoodMatch << " low mult " << trackDistanceForGoodMatchLowMult << " mult. threshold " << multiplicityThreshold;
100+
if (!enableQaHistograms) {
101+
return;
102+
}
103+
histos.add("tofSignal", "tofSignal", kTH1D, {{1000, -1000, 1000000, "tofSignal (ps)"}});
104+
if (enableTableFlags) {
105+
histos.add("goodForPIDFlags", "goodForPIDFlags", kTH1D, {{3, 0, 3, "flags"}});
106+
}
104107
}
105108
void processRun3(Run3Trks const& tracks, Run3Cols const& collisions)
106109
{
@@ -112,11 +115,19 @@ struct tofSignal {
112115
tableFlags.reserve(tracks.size());
113116
}
114117
for (auto& t : tracks) {
115-
table(o2::pid::tof::TOFSignal<Run3Trks::iterator>::GetTOFSignal(t));
118+
const auto s = o2::pid::tof::TOFSignal<Run3Trks::iterator>::GetTOFSignal(t);
119+
if (enableQaHistograms) {
120+
histos.fill(HIST("tofSignal"), s);
121+
}
122+
table(s);
116123
if (!enableTableFlags) {
117124
continue;
118125
}
119-
tableFlags(isTrackGoodMatchForTOFPID(t, collisions));
126+
const auto b = isTrackGoodMatchForTOFPID(t, collisions);
127+
if (enableQaHistograms) {
128+
histos.fill(HIST("goodForPIDFlags"), s);
129+
}
130+
tableFlags(b);
120131
}
121132
}
122133
PROCESS_SWITCH(tofSignal, processRun3, "Process Run3 data i.e. input is TrackIU", true);
@@ -537,9 +548,6 @@ struct tofEventTime {
537548
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
538549
{
539550
auto workflow = WorkflowSpec{adaptAnalysisTask<tofSignal>(cfgc)};
540-
if (!cfgc.options().get<int>("evtime")) {
541-
return workflow;
542-
}
543551
workflow.push_back(adaptAnalysisTask<tofEventTime>(cfgc));
544552
return workflow;
545553
}

0 commit comments

Comments
 (0)