2121#define COMMON_DATAMODEL_PIDRESPONSETOF_H_
2222
2323#include " Common/Core/PID/PIDTOF.h"
24+ #include " Common/Core/PID/PIDTOFParamService.h"
2425
2526#include < Framework/ASoA.h>
2627#include < Framework/AnalysisDataModel.h>
@@ -274,42 +275,42 @@ namespace pidtof
274275{
275276// Expected signals
276277DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalEl, tofExpSignalEl, // ! Expected time for electron
277- [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; });
278+ [](float nsigma, float sigma, float tofsignal) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : tofsignal - nsigma * sigma; });
278279DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalMu, tofExpSignalMu, // ! Expected time for muon
279- [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; });
280+ [](float nsigma, float sigma, float tofsignal) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : tofsignal - nsigma * sigma; });
280281DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalPi, tofExpSignalPi, // ! Expected time for pion
281- [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; });
282+ [](float nsigma, float sigma, float tofsignal) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : tofsignal - nsigma * sigma; });
282283DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalKa, tofExpSignalKa, // ! Expected time for kaon
283- [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; });
284+ [](float nsigma, float sigma, float tofsignal) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : tofsignal - nsigma * sigma; });
284285DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalPr, tofExpSignalPr, // ! Expected time for proton
285- [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; });
286+ [](float nsigma, float sigma, float tofsignal) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : tofsignal - nsigma * sigma; });
286287DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalDe, tofExpSignalDe, // ! Expected time for deuteron
287- [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; });
288+ [](float nsigma, float sigma, float tofsignal) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : tofsignal - nsigma * sigma; });
288289DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalTr, tofExpSignalTr, // ! Expected time for triton
289- [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; });
290+ [](float nsigma, float sigma, float tofsignal) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : tofsignal - nsigma * sigma; });
290291DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalHe, tofExpSignalHe, // ! Expected time for helium3
291- [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; });
292+ [](float nsigma, float sigma, float tofsignal) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : tofsignal - nsigma * sigma; });
292293DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalAl, tofExpSignalAl, // ! Expected time for alpha
293- [](float nsigma, float sigma, float tofsignal) -> float { return tofsignal - nsigma * sigma; });
294+ [](float nsigma, float sigma, float tofsignal) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : tofsignal - nsigma * sigma; });
294295// Delta with respect to signal
295296DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalDiffEl, tofExpSignalDiffEl, // ! Difference between signal and expected for electron
296- [](float nsigma, float sigma) -> float { return nsigma * sigma; });
297+ [](float nsigma, float sigma) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : nsigma * sigma; });
297298DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalDiffMu, tofExpSignalDiffMu, // ! Difference between signal and expected for muon
298- [](float nsigma, float sigma) -> float { return nsigma * sigma; });
299+ [](float nsigma, float sigma) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : nsigma * sigma; });
299300DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalDiffPi, tofExpSignalDiffPi, // ! Difference between signal and expected for pion
300- [](float nsigma, float sigma) -> float { return nsigma * sigma; });
301+ [](float nsigma, float sigma) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : nsigma * sigma; });
301302DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalDiffKa, tofExpSignalDiffKa, // ! Difference between signal and expected for kaon
302- [](float nsigma, float sigma) -> float { return nsigma * sigma; });
303+ [](float nsigma, float sigma) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : nsigma * sigma; });
303304DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalDiffPr, tofExpSignalDiffPr, // ! Difference between signal and expected for proton
304- [](float nsigma, float sigma) -> float { return nsigma * sigma; });
305+ [](float nsigma, float sigma) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : nsigma * sigma; });
305306DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalDiffDe, tofExpSignalDiffDe, // ! Difference between signal and expected for deuteron
306- [](float nsigma, float sigma) -> float { return nsigma * sigma; });
307+ [](float nsigma, float sigma) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : nsigma * sigma; });
307308DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalDiffTr, tofExpSignalDiffTr, // ! Difference between signal and expected for triton
308- [](float nsigma, float sigma) -> float { return nsigma * sigma; });
309+ [](float nsigma, float sigma) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : nsigma * sigma; });
309310DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalDiffHe, tofExpSignalDiffHe, // ! Difference between signal and expected for helium3
310- [](float nsigma, float sigma) -> float { return nsigma * sigma; });
311+ [](float nsigma, float sigma) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : nsigma * sigma; });
311312DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSignalDiffAl, tofExpSignalDiffAl, // ! Difference between signal and expected for alpha
312- [](float nsigma, float sigma) -> float { return nsigma * sigma; });
313+ [](float nsigma, float sigma) -> float { return sigma <= 0 . f ? o2::pid::tof::defaultReturnValue : nsigma * sigma; });
313314// Expected sigma
314315DECLARE_SOA_COLUMN (TOFExpSigmaEl, tofExpSigmaEl, float ); // ! Expected resolution with the TOF detector for electron
315316DECLARE_SOA_COLUMN (TOFExpSigmaMu, tofExpSigmaMu, float ); // ! Expected resolution with the TOF detector for muon
@@ -331,8 +332,83 @@ DECLARE_SOA_COLUMN(TOFNSigmaTr, tofNSigmaTr, float); //! Nsigma separation with
331332DECLARE_SOA_COLUMN (TOFNSigmaHe, tofNSigmaHe, float ); // ! Nsigma separation with the TOF detector for helium3
332333DECLARE_SOA_COLUMN (TOFNSigmaAl, tofNSigmaAl, float ); // ! Nsigma separation with the TOF detector for alpha
333334
335+ // ! Expected resolution with the TOF detector for electron (computed on the fly)
336+ #define PERSPECIES_TOF_SIGMA_COLUMN (name, id ) \
337+ DECLARE_SOA_DYNAMIC_COLUMN (TOFExpSigma##name##Imp, tofExpSigma2##name, \
338+ [](float tofSignal, \
339+ float tofExpMom, \
340+ float momentum, \
341+ float eta, \
342+ float tofEvTimeErr) -> float { \
343+ return o2::pid::tof::TOFResponseImpl::expectedSigma<id>(tofSignal, \
344+ tofExpMom, \
345+ momentum, \
346+ eta, \
347+ tofEvTimeErr); \
348+ });
349+
350+ PERSPECIES_TOF_SIGMA_COLUMN (El, o2::track::PID::Electron);
351+ PERSPECIES_TOF_SIGMA_COLUMN (Mu, o2::track::PID::Muon);
352+ PERSPECIES_TOF_SIGMA_COLUMN (Pi, o2::track::PID::Pion);
353+ PERSPECIES_TOF_SIGMA_COLUMN (Ka, o2::track::PID::Kaon);
354+ PERSPECIES_TOF_SIGMA_COLUMN (Pr, o2::track::PID::Proton);
355+ PERSPECIES_TOF_SIGMA_COLUMN (De, o2::track::PID::Deuteron);
356+ PERSPECIES_TOF_SIGMA_COLUMN (Tr, o2::track::PID::Triton);
357+ PERSPECIES_TOF_SIGMA_COLUMN (He, o2::track::PID::Helium3);
358+ PERSPECIES_TOF_SIGMA_COLUMN (Al, o2::track::PID::Alpha);
359+ #undef PERSPECIES_TOF_SIGMA_COLUMN
360+
361+ #define PERSPECIES_TOF_SEPARATION_COLUMN (name, id ) \
362+ DECLARE_SOA_DYNAMIC_COLUMN (TOFNSigma##name##Imp, tofNSigma2##name, \
363+ [](const float tofSignal, \
364+ const float tofExpMom, \
365+ const float length, \
366+ const float momentum, \
367+ const float eta, \
368+ const float tofEvTime, \
369+ const float tofEvTimeErr) -> float { \
370+ return o2::pid::tof::TOFResponseImpl::nSigma<id>(tofSignal, \
371+ tofExpMom, \
372+ length, \
373+ momentum, \
374+ eta, \
375+ tofEvTime, \
376+ tofEvTimeErr); \
377+ });
378+
379+ PERSPECIES_TOF_SEPARATION_COLUMN (El, o2::track::PID::Electron);
380+ PERSPECIES_TOF_SEPARATION_COLUMN (Mu, o2::track::PID::Muon);
381+ PERSPECIES_TOF_SEPARATION_COLUMN (Pi, o2::track::PID::Pion);
382+ PERSPECIES_TOF_SEPARATION_COLUMN (Ka, o2::track::PID::Kaon);
383+ PERSPECIES_TOF_SEPARATION_COLUMN (Pr, o2::track::PID::Proton);
384+ PERSPECIES_TOF_SEPARATION_COLUMN (De, o2::track::PID::Deuteron);
385+ PERSPECIES_TOF_SEPARATION_COLUMN (Tr, o2::track::PID::Triton);
386+ PERSPECIES_TOF_SEPARATION_COLUMN (He, o2::track::PID::Helium3);
387+ PERSPECIES_TOF_SEPARATION_COLUMN (Al, o2::track::PID::Alpha);
388+ #undef PERSPECIES_TOF_SEPARATION_COLUMN
389+
334390} // namespace pidtof
335391
392+ using TOFExpSigma2El = pidtof::TOFExpSigmaElImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::P, track::Eta, pidtofevtime::TOFEvTimeErr>;
393+ using TOFExpSigma2Mu = pidtof::TOFExpSigmaMuImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::P, track::Eta, pidtofevtime::TOFEvTimeErr>;
394+ using TOFExpSigma2Pi = pidtof::TOFExpSigmaPiImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::P, track::Eta, pidtofevtime::TOFEvTimeErr>;
395+ using TOFExpSigma2Ka = pidtof::TOFExpSigmaKaImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::P, track::Eta, pidtofevtime::TOFEvTimeErr>;
396+ using TOFExpSigma2Pr = pidtof::TOFExpSigmaPrImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::P, track::Eta, pidtofevtime::TOFEvTimeErr>;
397+ using TOFExpSigma2De = pidtof::TOFExpSigmaDeImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::P, track::Eta, pidtofevtime::TOFEvTimeErr>;
398+ using TOFExpSigma2Tr = pidtof::TOFExpSigmaTrImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::P, track::Eta, pidtofevtime::TOFEvTimeErr>;
399+ using TOFExpSigma2He = pidtof::TOFExpSigmaHeImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::P, track::Eta, pidtofevtime::TOFEvTimeErr>;
400+ using TOFExpSigma2Al = pidtof::TOFExpSigmaAlImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::P, track::Eta, pidtofevtime::TOFEvTimeErr>;
401+
402+ using TOFNSigma2El = pidtof::TOFNSigmaElImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::Length, track::P, track::Eta, pidtofevtime::TOFEvTime, pidtofevtime::TOFEvTimeErr>;
403+ using TOFNSigma2Mu = pidtof::TOFNSigmaMuImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::Length, track::P, track::Eta, pidtofevtime::TOFEvTime, pidtofevtime::TOFEvTimeErr>;
404+ using TOFNSigma2Pi = pidtof::TOFNSigmaPiImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::Length, track::P, track::Eta, pidtofevtime::TOFEvTime, pidtofevtime::TOFEvTimeErr>;
405+ using TOFNSigma2Ka = pidtof::TOFNSigmaKaImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::Length, track::P, track::Eta, pidtofevtime::TOFEvTime, pidtofevtime::TOFEvTimeErr>;
406+ using TOFNSigma2Pr = pidtof::TOFNSigmaPrImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::Length, track::P, track::Eta, pidtofevtime::TOFEvTime, pidtofevtime::TOFEvTimeErr>;
407+ using TOFNSigma2De = pidtof::TOFNSigmaDeImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::Length, track::P, track::Eta, pidtofevtime::TOFEvTime, pidtofevtime::TOFEvTimeErr>;
408+ using TOFNSigma2Tr = pidtof::TOFNSigmaTrImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::Length, track::P, track::Eta, pidtofevtime::TOFEvTime, pidtofevtime::TOFEvTimeErr>;
409+ using TOFNSigma2He = pidtof::TOFNSigmaHeImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::Length, track::P, track::Eta, pidtofevtime::TOFEvTime, pidtofevtime::TOFEvTimeErr>;
410+ using TOFNSigma2Al = pidtof::TOFNSigmaAlImp<pidtofsignal::TOFSignal, track::TOFExpMom, track::Length, track::P, track::Eta, pidtofevtime::TOFEvTime, pidtofevtime::TOFEvTimeErr>;
411+
336412namespace pidtof_tiny
337413{
338414struct binning {
0 commit comments