diff --git a/Common/Core/PID/PIDResponse.h b/Common/Core/PID/PIDResponse.h index c38e76a908d..399b4d4a184 100644 --- a/Common/Core/PID/PIDResponse.h +++ b/Common/Core/PID/PIDResponse.h @@ -25,6 +25,7 @@ #include "Framework/ASoA.h" #include "Framework/AnalysisDataModel.h" #include "ReconstructionDataFormats/PID.h" +#include "Framework/Logger.h" namespace o2::aod { @@ -45,8 +46,6 @@ void packInTable(const float& separation, tableType& table, const float& lowest, } } -static constexpr float defaultNSigma = -999.f; /// Default return value in case N sigma measurement is not available - template using hasTOFEl = decltype(std::declval().tofNSigmaEl()); template @@ -66,66 +65,291 @@ using hasTOFHe = decltype(std::declval().tofNSigmaHe()); template using hasTOFAl = decltype(std::declval().tofNSigmaAl()); +// PID index as template argument +template +const auto tofNSigma(const TrackType& track) +{ + if constexpr (index == o2::track::PID::Electron) { + return track.tofNSigmaEl(); + } else if constexpr (index == o2::track::PID::Muon) { + return track.tofNSigmaMu(); + } else if constexpr (index == o2::track::PID::Pion) { + return track.tofNSigmaPi(); + } else if constexpr (index == o2::track::PID::Kaon) { + return track.tofNSigmaKa(); + } else if constexpr (index == o2::track::PID::Proton) { + return track.tofNSigmaPr(); + } else if constexpr (index == o2::track::PID::Deuteron) { + return track.tofNSigmaDe(); + } else if constexpr (index == o2::track::PID::Triton) { + return track.tofNSigmaTr(); + } else if constexpr (index == o2::track::PID::Helium3) { + return track.tofNSigmaHe(); + } else if constexpr (index == o2::track::PID::Alpha) { + return track.tofNSigmaAl(); + } +} + +// PID index as template argument +template +const auto tofExpSigma(const TrackType& track) +{ + if constexpr (index == o2::track::PID::Electron) { + return track.tofExpSigmaEl(); + } else if constexpr (index == o2::track::PID::Muon) { + return track.tofExpSigmaMu(); + } else if constexpr (index == o2::track::PID::Pion) { + return track.tofExpSigmaPi(); + } else if constexpr (index == o2::track::PID::Kaon) { + return track.tofExpSigmaKa(); + } else if constexpr (index == o2::track::PID::Proton) { + return track.tofExpSigmaPr(); + } else if constexpr (index == o2::track::PID::Deuteron) { + return track.tofExpSigmaDe(); + } else if constexpr (index == o2::track::PID::Triton) { + return track.tofExpSigmaTr(); + } else if constexpr (index == o2::track::PID::Helium3) { + return track.tofExpSigmaHe(); + } else if constexpr (index == o2::track::PID::Alpha) { + return track.tofExpSigmaAl(); + } +} + +// PID index as template argument +template +const auto tofExpSignal(const TrackType& track) +{ + if constexpr (index == o2::track::PID::Electron) { + return track.tofExpSignalEl(); + } else if constexpr (index == o2::track::PID::Muon) { + return track.tofExpSignalMu(); + } else if constexpr (index == o2::track::PID::Pion) { + return track.tofExpSignalPi(); + } else if constexpr (index == o2::track::PID::Kaon) { + return track.tofExpSignalKa(); + } else if constexpr (index == o2::track::PID::Proton) { + return track.tofExpSignalPr(); + } else if constexpr (index == o2::track::PID::Deuteron) { + return track.tofExpSignalDe(); + } else if constexpr (index == o2::track::PID::Triton) { + return track.tofExpSignalTr(); + } else if constexpr (index == o2::track::PID::Helium3) { + return track.tofExpSignalHe(); + } else if constexpr (index == o2::track::PID::Alpha) { + return track.tofExpSignalAl(); + } +} + +// PID index as template argument +template +const auto tofExpSignalDiff(const TrackType& track) +{ + if constexpr (index == o2::track::PID::Electron) { + return track.tofExpSignalDiffEl(); + } else if constexpr (index == o2::track::PID::Muon) { + return track.tofExpSignalDiffMu(); + } else if constexpr (index == o2::track::PID::Pion) { + return track.tofExpSignalDiffPi(); + } else if constexpr (index == o2::track::PID::Kaon) { + return track.tofExpSignalDiffKa(); + } else if constexpr (index == o2::track::PID::Proton) { + return track.tofExpSignalDiffPr(); + } else if constexpr (index == o2::track::PID::Deuteron) { + return track.tofExpSignalDiffDe(); + } else if constexpr (index == o2::track::PID::Triton) { + return track.tofExpSignalDiffTr(); + } else if constexpr (index == o2::track::PID::Helium3) { + return track.tofExpSignalDiffHe(); + } else if constexpr (index == o2::track::PID::Alpha) { + return track.tofExpSignalDiffAl(); + } +} + +// PID index as function argument template -const auto tofNSigma(const o2::track::PID::ID& index, const TrackType& track) +const auto tofNSigma(const o2::track::PID::ID index, const TrackType& track) { switch (index) { case o2::track::PID::Electron: if constexpr (std::experimental::is_detected::value) { return track.tofNSigmaEl(); - } else { - return defaultNSigma; } case o2::track::PID::Muon: if constexpr (std::experimental::is_detected::value) { return track.tofNSigmaMu(); - } else { - return defaultNSigma; } case o2::track::PID::Pion: if constexpr (std::experimental::is_detected::value) { return track.tofNSigmaPi(); - } else { - return defaultNSigma; } case o2::track::PID::Kaon: if constexpr (std::experimental::is_detected::value) { return track.tofNSigmaKa(); - } else { - return defaultNSigma; } case o2::track::PID::Proton: if constexpr (std::experimental::is_detected::value) { return track.tofNSigmaPr(); - } else { - return defaultNSigma; } case o2::track::PID::Deuteron: if constexpr (std::experimental::is_detected::value) { return track.tofNSigmaDe(); - } else { - return defaultNSigma; } case o2::track::PID::Triton: if constexpr (std::experimental::is_detected::value) { return track.tofNSigmaTr(); - } else { - return defaultNSigma; } case o2::track::PID::Helium3: if constexpr (std::experimental::is_detected::value) { return track.tofNSigmaHe(); - } else { - return defaultNSigma; } case o2::track::PID::Alpha: if constexpr (std::experimental::is_detected::value) { return track.tofNSigmaAl(); - } else { - return defaultNSigma; } default: - return defaultNSigma; + LOGF(fatal, "TOF PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); + return 0.f; + } +} + +// PID index as function argument +template +const auto tofExpSigma(const o2::track::PID::ID index, const TrackType& track) +{ + switch (index) { + case o2::track::PID::Electron: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSigmaEl(); + } + case o2::track::PID::Muon: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSigmaMu(); + } + case o2::track::PID::Pion: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSigmaPi(); + } + case o2::track::PID::Kaon: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSigmaKa(); + } + case o2::track::PID::Proton: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSigmaPr(); + } + case o2::track::PID::Deuteron: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSigmaDe(); + } + case o2::track::PID::Triton: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSigmaTr(); + } + case o2::track::PID::Helium3: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSigmaHe(); + } + case o2::track::PID::Alpha: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSigmaAl(); + } + default: + LOGF(fatal, "TOF PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); + return 0.f; + } +} + +// PID index as function argument +template +const auto tofExpSignal(const o2::track::PID::ID index, const TrackType& track) +{ + switch (index) { + case o2::track::PID::Electron: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalEl(); + } + case o2::track::PID::Muon: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalMu(); + } + case o2::track::PID::Pion: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalPi(); + } + case o2::track::PID::Kaon: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalKa(); + } + case o2::track::PID::Proton: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalPr(); + } + case o2::track::PID::Deuteron: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDe(); + } + case o2::track::PID::Triton: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalTr(); + } + case o2::track::PID::Helium3: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalHe(); + } + case o2::track::PID::Alpha: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalAl(); + } + default: + LOGF(fatal, "TOF PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); + return 0.f; + } +} + +// PID index as function argument +template +const auto tofExpSignalDiff(const o2::track::PID::ID index, const TrackType& track) +{ + switch (index) { + case o2::track::PID::Electron: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDiffEl(); + } + case o2::track::PID::Muon: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDiffMu(); + } + case o2::track::PID::Pion: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDiffPi(); + } + case o2::track::PID::Kaon: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDiffKa(); + } + case o2::track::PID::Proton: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDiffPr(); + } + case o2::track::PID::Deuteron: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDiffDe(); + } + case o2::track::PID::Triton: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDiffTr(); + } + case o2::track::PID::Helium3: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDiffHe(); + } + case o2::track::PID::Alpha: + if constexpr (std::experimental::is_detected::value) { + return track.tofExpSignalDiffAl(); + } + default: + LOGF(fatal, "TOF PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); + return 0.f; } } @@ -148,66 +372,291 @@ using hasTPCHe = decltype(std::declval().tpcNSigmaHe()); template using hasTPCAl = decltype(std::declval().tpcNSigmaAl()); +// PID index as template argument +template +const auto tpcNSigma(const TrackType& track) +{ + if constexpr (index == o2::track::PID::Electron) { + return track.tpcNSigmaEl(); + } else if constexpr (index == o2::track::PID::Muon) { + return track.tpcNSigmaMu(); + } else if constexpr (index == o2::track::PID::Pion) { + return track.tpcNSigmaPi(); + } else if constexpr (index == o2::track::PID::Kaon) { + return track.tpcNSigmaKa(); + } else if constexpr (index == o2::track::PID::Proton) { + return track.tpcNSigmaPr(); + } else if constexpr (index == o2::track::PID::Deuteron) { + return track.tpcNSigmaDe(); + } else if constexpr (index == o2::track::PID::Triton) { + return track.tpcNSigmaTr(); + } else if constexpr (index == o2::track::PID::Helium3) { + return track.tpcNSigmaHe(); + } else if constexpr (index == o2::track::PID::Alpha) { + return track.tpcNSigmaAl(); + } +} + +// PID index as template argument +template +const auto tpcExpSigma(const TrackType& track) +{ + if constexpr (index == o2::track::PID::Electron) { + return track.tpcExpSigmaEl(); + } else if constexpr (index == o2::track::PID::Muon) { + return track.tpcExpSigmaMu(); + } else if constexpr (index == o2::track::PID::Pion) { + return track.tpcExpSigmaPi(); + } else if constexpr (index == o2::track::PID::Kaon) { + return track.tpcExpSigmaKa(); + } else if constexpr (index == o2::track::PID::Proton) { + return track.tpcExpSigmaPr(); + } else if constexpr (index == o2::track::PID::Deuteron) { + return track.tpcExpSigmaDe(); + } else if constexpr (index == o2::track::PID::Triton) { + return track.tpcExpSigmaTr(); + } else if constexpr (index == o2::track::PID::Helium3) { + return track.tpcExpSigmaHe(); + } else if constexpr (index == o2::track::PID::Alpha) { + return track.tpcExpSigmaAl(); + } +} + +// PID index as template argument +template +const auto tpcExpSignal(const TrackType& track) +{ + if constexpr (index == o2::track::PID::Electron) { + return track.tpcExpSignalEl(); + } else if constexpr (index == o2::track::PID::Muon) { + return track.tpcExpSignalMu(); + } else if constexpr (index == o2::track::PID::Pion) { + return track.tpcExpSignalPi(); + } else if constexpr (index == o2::track::PID::Kaon) { + return track.tpcExpSignalKa(); + } else if constexpr (index == o2::track::PID::Proton) { + return track.tpcExpSignalPr(); + } else if constexpr (index == o2::track::PID::Deuteron) { + return track.tpcExpSignalDe(); + } else if constexpr (index == o2::track::PID::Triton) { + return track.tpcExpSignalTr(); + } else if constexpr (index == o2::track::PID::Helium3) { + return track.tpcExpSignalHe(); + } else if constexpr (index == o2::track::PID::Alpha) { + return track.tpcExpSignalAl(); + } +} + +// PID index as template argument +template +const auto tpcExpSignalDiff(const TrackType& track) +{ + if constexpr (index == o2::track::PID::Electron) { + return track.tpcExpSignalDiffEl(); + } else if constexpr (index == o2::track::PID::Muon) { + return track.tpcExpSignalDiffMu(); + } else if constexpr (index == o2::track::PID::Pion) { + return track.tpcExpSignalDiffPi(); + } else if constexpr (index == o2::track::PID::Kaon) { + return track.tpcExpSignalDiffKa(); + } else if constexpr (index == o2::track::PID::Proton) { + return track.tpcExpSignalDiffPr(); + } else if constexpr (index == o2::track::PID::Deuteron) { + return track.tpcExpSignalDiffDe(); + } else if constexpr (index == o2::track::PID::Triton) { + return track.tpcExpSignalDiffTr(); + } else if constexpr (index == o2::track::PID::Helium3) { + return track.tpcExpSignalDiffHe(); + } else if constexpr (index == o2::track::PID::Alpha) { + return track.tpcExpSignalDiffAl(); + } +} + +// PID index as function argument template -const auto tpcNSigma(const o2::track::PID::ID& index, const TrackType& track) +const auto tpcNSigma(const o2::track::PID::ID index, const TrackType& track) { switch (index) { case o2::track::PID::Electron: if constexpr (std::experimental::is_detected::value) { return track.tpcNSigmaEl(); - } else { - return defaultNSigma; } case o2::track::PID::Muon: if constexpr (std::experimental::is_detected::value) { return track.tpcNSigmaMu(); - } else { - return defaultNSigma; } case o2::track::PID::Pion: if constexpr (std::experimental::is_detected::value) { return track.tpcNSigmaPi(); - } else { - return defaultNSigma; } case o2::track::PID::Kaon: if constexpr (std::experimental::is_detected::value) { return track.tpcNSigmaKa(); - } else { - return defaultNSigma; } case o2::track::PID::Proton: if constexpr (std::experimental::is_detected::value) { return track.tpcNSigmaPr(); - } else { - return defaultNSigma; } case o2::track::PID::Deuteron: if constexpr (std::experimental::is_detected::value) { return track.tpcNSigmaDe(); - } else { - return defaultNSigma; } case o2::track::PID::Triton: if constexpr (std::experimental::is_detected::value) { return track.tpcNSigmaTr(); - } else { - return defaultNSigma; } case o2::track::PID::Helium3: if constexpr (std::experimental::is_detected::value) { return track.tpcNSigmaHe(); - } else { - return defaultNSigma; } case o2::track::PID::Alpha: if constexpr (std::experimental::is_detected::value) { return track.tpcNSigmaAl(); - } else { - return defaultNSigma; } default: - return defaultNSigma; + LOGF(fatal, "TPC PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); + return 0.f; + } +} + +// PID index as function argument +template +const auto tpcExpSigma(const o2::track::PID::ID index, const TrackType& track) +{ + switch (index) { + case o2::track::PID::Electron: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSigmaEl(); + } + case o2::track::PID::Muon: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSigmaMu(); + } + case o2::track::PID::Pion: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSigmaPi(); + } + case o2::track::PID::Kaon: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSigmaKa(); + } + case o2::track::PID::Proton: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSigmaPr(); + } + case o2::track::PID::Deuteron: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSigmaDe(); + } + case o2::track::PID::Triton: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSigmaTr(); + } + case o2::track::PID::Helium3: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSigmaHe(); + } + case o2::track::PID::Alpha: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSigmaAl(); + } + default: + LOGF(fatal, "TPC PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); + return 0.f; + } +} + +// PID index as function argument +template +const auto tpcExpSignal(const o2::track::PID::ID index, const TrackType& track) +{ + switch (index) { + case o2::track::PID::Electron: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalEl(); + } + case o2::track::PID::Muon: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalMu(); + } + case o2::track::PID::Pion: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalPi(); + } + case o2::track::PID::Kaon: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalKa(); + } + case o2::track::PID::Proton: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalPr(); + } + case o2::track::PID::Deuteron: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDe(); + } + case o2::track::PID::Triton: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalTr(); + } + case o2::track::PID::Helium3: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalHe(); + } + case o2::track::PID::Alpha: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalAl(); + } + default: + LOGF(fatal, "TPC PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); + return 0.f; + } +} + +// PID index as function argument +template +const auto tpcExpSignalDiff(const o2::track::PID::ID index, const TrackType& track) +{ + switch (index) { + case o2::track::PID::Electron: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDiffEl(); + } + case o2::track::PID::Muon: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDiffMu(); + } + case o2::track::PID::Pion: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDiffPi(); + } + case o2::track::PID::Kaon: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDiffKa(); + } + case o2::track::PID::Proton: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDiffPr(); + } + case o2::track::PID::Deuteron: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDiffDe(); + } + case o2::track::PID::Triton: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDiffTr(); + } + case o2::track::PID::Helium3: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDiffHe(); + } + case o2::track::PID::Alpha: + if constexpr (std::experimental::is_detected::value) { + return track.tpcExpSignalDiffAl(); + } + default: + LOGF(fatal, "TPC PID table for PID index %i (%s) is not available", index, o2::track::PID::getName(index)); + return 0.f; } }