|
| 1 | +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. |
| 2 | +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. |
| 3 | +// All rights not expressly granted are reserved. |
| 4 | +// |
| 5 | +// This software is distributed under the terms of the GNU General Public |
| 6 | +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". |
| 7 | +// |
| 8 | +// In applying this license CERN does not waive the privileges and immunities |
| 9 | +// granted to it by virtue of its status as an Intergovernmental Organization |
| 10 | +// or submit itself to any jurisdiction. |
| 11 | + |
| 12 | +/// \file HfMlResponseLcToPKPi.h |
| 13 | +/// \brief Class to compute the ML response for Lc+ → p K- π+ analysis selections |
| 14 | +/// \author Grazia Luparello <grazia.luparello@cern.ch> |
| 15 | + |
| 16 | +#ifndef PWGHF_CORE_HFMLRESPONSELCTOPKPI_H_ |
| 17 | +#define PWGHF_CORE_HFMLRESPONSELCTOPKPI_H_ |
| 18 | + |
| 19 | +#include <vector> |
| 20 | + |
| 21 | +#include "PWGHF/Core/HfMlResponse.h" |
| 22 | + |
| 23 | +// Fill the map of available input features |
| 24 | +// the key is the feature's name (std::string) |
| 25 | +// the value is the corresponding value in EnumInputFeatures |
| 26 | +#define FILL_MAP_LCTOPKPI(FEATURE) \ |
| 27 | + { \ |
| 28 | +#FEATURE, static_cast < uint8_t>(InputFeaturesLcToPKPi::FEATURE) \ |
| 29 | + } |
| 30 | + |
| 31 | +// Check if the index of mCachedIndices (index associated to a FEATURE) |
| 32 | +// matches the entry in EnumInputFeatures associated to this FEATURE |
| 33 | +// if so, the inputFeatures vector is filled with the FEATURE's value |
| 34 | +// by calling the corresponding GETTER from OBJECT |
| 35 | +#define CHECK_AND_FILL_VEC_LCTOPKPI_FULL(OBJECT, FEATURE, GETTER) \ |
| 36 | + case static_cast<uint8_t>(InputFeaturesLcToPKPi::FEATURE): { \ |
| 37 | + inputFeatures.emplace_back(OBJECT.GETTER()); \ |
| 38 | + break; \ |
| 39 | + } |
| 40 | + |
| 41 | +// Specific case of CHECK_AND_FILL_VEC_LCTOPKPI_FULL(OBJECT, FEATURE, GETTER) |
| 42 | +// where OBJECT is named candidate and FEATURE = GETTER |
| 43 | +#define CHECK_AND_FILL_VEC_LCTOPKPI(GETTER) \ |
| 44 | + case static_cast<uint8_t>(InputFeaturesLcToPKPi::GETTER): { \ |
| 45 | + inputFeatures.emplace_back(candidate.GETTER()); \ |
| 46 | + break; \ |
| 47 | + } |
| 48 | + |
| 49 | +// Variation of CHECK_AND_FILL_VEC_LCTOPKPI_FULL(OBJECT, FEATURE, GETTER) |
| 50 | +// where GETTER is a method of hfHelper |
| 51 | +#define CHECK_AND_FILL_VEC_LCTOPKPI_HFHELPER(OBJECT, FEATURE, GETTER) \ |
| 52 | + case static_cast<uint8_t>(InputFeaturesLcToPKPi::FEATURE): { \ |
| 53 | + inputFeatures.emplace_back(hfHelper.GETTER(OBJECT)); \ |
| 54 | + break; \ |
| 55 | + } |
| 56 | + |
| 57 | +namespace o2::analysis |
| 58 | +{ |
| 59 | +enum class InputFeaturesLcToPKPi : uint8_t { |
| 60 | + ptProng0 = 0, |
| 61 | + ptProng1, |
| 62 | + ptProng2, |
| 63 | + impactParameterXY0, |
| 64 | + impactParameterXY1, |
| 65 | + impactParameterXY2, |
| 66 | + decayLength, |
| 67 | + decayLengthXY, |
| 68 | + decayLengthXYNormalised, |
| 69 | + cpa, |
| 70 | + cpaXY, |
| 71 | + tpcNSigmaP0, // 0 |
| 72 | + tpcNSigmaKa0, // 0 |
| 73 | + tpcNSigmaPi0, // 0 |
| 74 | + tpcNSigmaP1, // 1 |
| 75 | + tpcNSigmaKa1, // 1 |
| 76 | + tpcNSigmaPi1, // 1 |
| 77 | + tpcNSigmaP2, // 2 |
| 78 | + tpcNSigmaKa2, // 2 |
| 79 | + tpcNSigmaPi2, // 2 |
| 80 | + tofNSigmaP0, // |
| 81 | + tofNSigmaKa0, // |
| 82 | + tofNSigmaPi0, // |
| 83 | + tofNSigmaP1, |
| 84 | + tofNSigmaKa1, |
| 85 | + tofNSigmaPi1, |
| 86 | + tofNSigmaP2, |
| 87 | + tofNSigmaKa2, |
| 88 | + tofNSigmaPi2, |
| 89 | + tpcTofNSigmaPi0, |
| 90 | + tpcTofNSigmaPi1, |
| 91 | + tpcTofNSigmaPi2, |
| 92 | + tpcTofNSigmaKa0, |
| 93 | + tpcTofNSigmaKa1, |
| 94 | + tpcTofNSigmaKa2, |
| 95 | + tpcTofNSigmaPr0, |
| 96 | + tpcTofNSigmaPr1, |
| 97 | + tpcTofNSigmaPr2 |
| 98 | +}; |
| 99 | + |
| 100 | +template <typename TypeOutputScore = float> |
| 101 | +class HfMlResponseLcToPKPi : public HfMlResponse<TypeOutputScore> |
| 102 | +{ |
| 103 | + public: |
| 104 | + /// Default constructor |
| 105 | + HfMlResponseLcToPKPi() = default; |
| 106 | + /// Default destructor |
| 107 | + virtual ~HfMlResponseLcToPKPi() = default; |
| 108 | + |
| 109 | + /// Method to get the input features vector needed for ML inference |
| 110 | + /// \param candidate is the Lc candidate |
| 111 | + /// \param prong0 is the candidate's prong0 |
| 112 | + /// \param prong1 is the candidate's prong1 |
| 113 | + /// \param prong2 is the candidate's prong2 |
| 114 | + /// \return inputFeatures vector |
| 115 | + template <typename T1, typename T2> |
| 116 | + std::vector<float> getInputFeatures(T1 const& candidate, |
| 117 | + T2 const& prong0, T2 const& prong1, T2 const& prong2) |
| 118 | + { |
| 119 | + std::vector<float> inputFeatures; |
| 120 | + |
| 121 | + for (const auto& idx : MlResponse<TypeOutputScore>::mCachedIndices) { |
| 122 | + switch (idx) { |
| 123 | + CHECK_AND_FILL_VEC_LCTOPKPI(ptProng0); |
| 124 | + CHECK_AND_FILL_VEC_LCTOPKPI(ptProng1); |
| 125 | + CHECK_AND_FILL_VEC_LCTOPKPI(ptProng2); |
| 126 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, impactParameterXY0, impactParameter0); |
| 127 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, impactParameterXY1, impactParameter1); |
| 128 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(candidate, impactParameterXY2, impactParameter2); |
| 129 | + CHECK_AND_FILL_VEC_LCTOPKPI(decayLength); |
| 130 | + CHECK_AND_FILL_VEC_LCTOPKPI(decayLengthXY); |
| 131 | + CHECK_AND_FILL_VEC_LCTOPKPI(decayLengthXYNormalised); |
| 132 | + CHECK_AND_FILL_VEC_LCTOPKPI(cpa); |
| 133 | + CHECK_AND_FILL_VEC_LCTOPKPI(cpaXY); |
| 134 | + // TPC PID variables |
| 135 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcNSigmaP0, tpcNSigmaPr); |
| 136 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcNSigmaKa0, tpcNSigmaKa); |
| 137 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcNSigmaPi0, tpcNSigmaPi); |
| 138 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcNSigmaP1, tpcNSigmaPr); |
| 139 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcNSigmaKa1, tpcNSigmaKa); |
| 140 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcNSigmaPi1, tpcNSigmaPi); |
| 141 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcNSigmaP2, tpcNSigmaPr); |
| 142 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcNSigmaKa2, tpcNSigmaKa); |
| 143 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcNSigmaPi2, tpcNSigmaPi); |
| 144 | + // TOF PID variables |
| 145 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tofNSigmaP0, tofNSigmaPr); |
| 146 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tofNSigmaKa0, tofNSigmaKa); |
| 147 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tofNSigmaPi0, tofNSigmaPi); |
| 148 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tofNSigmaP1, tofNSigmaPr); |
| 149 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tofNSigmaKa1, tofNSigmaKa); |
| 150 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tofNSigmaPi1, tofNSigmaPi); |
| 151 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tofNSigmaP2, tofNSigmaPr); |
| 152 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tofNSigmaKa2, tofNSigmaKa); |
| 153 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tofNSigmaPi2, tofNSigmaPi); |
| 154 | + // Combined PID variables |
| 155 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcTofNSigmaPi0, tpcTofNSigmaPi); |
| 156 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcTofNSigmaPi1, tpcTofNSigmaPi); |
| 157 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcTofNSigmaPi2, tpcTofNSigmaPi); |
| 158 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcTofNSigmaKa0, tpcTofNSigmaKa); |
| 159 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcTofNSigmaKa1, tpcTofNSigmaKa); |
| 160 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcTofNSigmaKa2, tpcTofNSigmaKa); |
| 161 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong0, tpcTofNSigmaPr0, tpcTofNSigmaPr); |
| 162 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong1, tpcTofNSigmaPr1, tpcTofNSigmaPr); |
| 163 | + CHECK_AND_FILL_VEC_LCTOPKPI_FULL(prong2, tpcTofNSigmaPr2, tpcTofNSigmaPr); |
| 164 | + } |
| 165 | + } |
| 166 | + |
| 167 | + return inputFeatures; |
| 168 | + } |
| 169 | + |
| 170 | + protected: |
| 171 | + /// Method to fill the map of available input features |
| 172 | + void setAvailableInputFeatures() |
| 173 | + { |
| 174 | + MlResponse<TypeOutputScore>::mAvailableInputFeatures = { |
| 175 | + FILL_MAP_LCTOPKPI(ptProng0), |
| 176 | + FILL_MAP_LCTOPKPI(ptProng1), |
| 177 | + FILL_MAP_LCTOPKPI(ptProng2), |
| 178 | + FILL_MAP_LCTOPKPI(impactParameterXY0), |
| 179 | + FILL_MAP_LCTOPKPI(impactParameterXY1), |
| 180 | + FILL_MAP_LCTOPKPI(impactParameterXY2), |
| 181 | + FILL_MAP_LCTOPKPI(decayLength), |
| 182 | + FILL_MAP_LCTOPKPI(decayLengthXY), |
| 183 | + FILL_MAP_LCTOPKPI(decayLengthXYNormalised), |
| 184 | + FILL_MAP_LCTOPKPI(cpa), |
| 185 | + FILL_MAP_LCTOPKPI(cpaXY), |
| 186 | + // TPC PID variables |
| 187 | + FILL_MAP_LCTOPKPI(tpcNSigmaP0), |
| 188 | + FILL_MAP_LCTOPKPI(tpcNSigmaKa0), |
| 189 | + FILL_MAP_LCTOPKPI(tpcNSigmaPi0), |
| 190 | + FILL_MAP_LCTOPKPI(tpcNSigmaP1), |
| 191 | + FILL_MAP_LCTOPKPI(tpcNSigmaKa1), |
| 192 | + FILL_MAP_LCTOPKPI(tpcNSigmaPi1), |
| 193 | + FILL_MAP_LCTOPKPI(tpcNSigmaP2), |
| 194 | + FILL_MAP_LCTOPKPI(tpcNSigmaKa2), |
| 195 | + FILL_MAP_LCTOPKPI(tpcNSigmaPi2), |
| 196 | + // TOF PID variables |
| 197 | + FILL_MAP_LCTOPKPI(tofNSigmaP0), |
| 198 | + FILL_MAP_LCTOPKPI(tofNSigmaKa0), |
| 199 | + FILL_MAP_LCTOPKPI(tofNSigmaPi0), |
| 200 | + FILL_MAP_LCTOPKPI(tofNSigmaP1), |
| 201 | + FILL_MAP_LCTOPKPI(tofNSigmaKa1), |
| 202 | + FILL_MAP_LCTOPKPI(tofNSigmaPi1), |
| 203 | + FILL_MAP_LCTOPKPI(tofNSigmaP2), |
| 204 | + FILL_MAP_LCTOPKPI(tofNSigmaKa2), |
| 205 | + FILL_MAP_LCTOPKPI(tofNSigmaPi2), |
| 206 | + // Combined PID variables |
| 207 | + FILL_MAP_LCTOPKPI(tpcTofNSigmaPi0), |
| 208 | + FILL_MAP_LCTOPKPI(tpcTofNSigmaPi1), |
| 209 | + FILL_MAP_LCTOPKPI(tpcTofNSigmaPi2), |
| 210 | + FILL_MAP_LCTOPKPI(tpcTofNSigmaKa0), |
| 211 | + FILL_MAP_LCTOPKPI(tpcTofNSigmaKa1), |
| 212 | + FILL_MAP_LCTOPKPI(tpcTofNSigmaKa2), |
| 213 | + FILL_MAP_LCTOPKPI(tpcTofNSigmaPr0), |
| 214 | + FILL_MAP_LCTOPKPI(tpcTofNSigmaPr1), |
| 215 | + FILL_MAP_LCTOPKPI(tpcTofNSigmaPr2)}; |
| 216 | + } |
| 217 | +}; |
| 218 | + |
| 219 | +} // namespace o2::analysis |
| 220 | + |
| 221 | +#undef FILL_MAP_LCTOPKPI |
| 222 | +#undef CHECK_AND_FILL_VEC_LCTOPKPI_FULL |
| 223 | +#undef CHECK_AND_FILL_VEC_LCTOPKPI |
| 224 | +#undef CHECK_AND_FILL_VEC_LCTOPKPI_HFHELPER |
| 225 | + |
| 226 | +#endif // PWGHF_CORE_HFMLRESPONSELCTOPKPI_H_ |
0 commit comments