Belle II Software development
DedxVariables.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9// needed to build variables here
10#include <cdc/variables/DedxVariables.h>
11#include <analysis/VariableManager/Manager.h>
12
13// framework - DataStore
14#include <framework/gearbox/Const.h>
15#include <framework/logging/Logger.h>
16#include <framework/utilities/Conversion.h>
17
18// dataobjects
19#include <analysis/dataobjects/Particle.h>
20#include <mdst/dataobjects/Track.h>
21#include <cdc/dataobjects/CDCDedxTrack.h>
22
23#include <TString.h>
24
25#include <cmath>
26
27namespace Belle2 {
37 {
38 const Track* track = particle->getTrack();
39 if (!track) {
40 return nullptr;
41 }
42
43 const CDCDedxTrack* dedxTrack = track->getRelatedTo<CDCDedxTrack>();
44 if (!dedxTrack) {
45 return nullptr;
46 }
47
48 return dedxTrack;
49 }
50
51 namespace Variable {
52
53 double CDCdedx(const Particle* part)
54 {
55 const CDCDedxTrack* dedxTrack = getDedxFromParticle(part);
56 if (!dedxTrack) {
57 return -999.0;
58 } else {
59 return dedxTrack->getDedx();
60 }
61 }
62
63 double CDCdedxnosat(const Particle* part)
64 {
65 const CDCDedxTrack* dedxTrack = getDedxFromParticle(part);
66 if (!dedxTrack) {
67 return -999.0;
68 } else {
69 return dedxTrack->getDedxNoSat();
70 }
71 }
72
73 double pCDC(const Particle* part)
74 {
75 const CDCDedxTrack* dedxTrack = getDedxFromParticle(part);
76 if (!dedxTrack) {
77 return -999.0;
78 } else {
79 return dedxTrack->getMomentum();
80 }
81 }
82
83 double costhCDC(const Particle* part)
84 {
85 const CDCDedxTrack* dedxTrack = getDedxFromParticle(part);
86 if (!dedxTrack) {
87 return -999.0;
88 } else {
89 return dedxTrack->getCosTheta();
90 }
91 }
92
93
94 double CDCdEdx_nhits(const Particle* part)
95 {
96 const CDCDedxTrack* dedxTrack = getDedxFromParticle(part);
97 if (!dedxTrack) {
98 return -999.0;
99 } else {
100 return dedxTrack->size();
101 }
102 }
103
104 double CDCdEdx_lnhits(const Particle* part)
105 {
106 const CDCDedxTrack* dedxTrack = getDedxFromParticle(part);
107 if (!dedxTrack) {
108 return -999.0;
109 } else {
110 return dedxTrack->getNLayerHits();
111 }
112 }
113
114 double CDCdEdx_lnhitsused(const Particle* part)
115 {
116 const CDCDedxTrack* dedxTrack = getDedxFromParticle(part);
117 if (!dedxTrack) {
118 return -999.0;
119 } else {
120 return dedxTrack->getNLayerHitsUsed();
121 }
122 }
123
124 Manager::FunctionPtr CDCdEdx_PIDvars(const std::vector<std::string>& arguments)
125 {
126 if (arguments.size() < 2) {
127 B2ERROR("Min two arguments required to get variables related chi, predicted mean and reso");
128 return nullptr;
129 }
130
131 TString var = "";
132 try {
133 var = arguments[0];
134 } catch (std::invalid_argument& e) {
135 B2ERROR("First argument of variable must be a variable name (chi or pmean or preso)");
136 return nullptr;
137 }
138
139 int pdgCode;
140 try {
141 pdgCode = Belle2::convertString<int>(arguments[1]);
142 } catch (std::invalid_argument& e) {
143 B2ERROR("Second argument of variable must be a PDG code");
144 return nullptr;
145 }
146
147 int index = -999;
148 if (abs(pdgCode) == Const::electron.getPDGCode())index = 0;
149 else if (abs(pdgCode) == Const::muon.getPDGCode())index = 1;
150 else if (abs(pdgCode) == Const::pion.getPDGCode())index = 2;
151 else if (abs(pdgCode) == Const::kaon.getPDGCode())index = 3;
152 else if (abs(pdgCode) == Const::proton.getPDGCode())index = 4;
153 else if (abs(pdgCode) == Const::deuteron.getPDGCode())index = 5;
154
155 auto func = [index, var](const Particle * part) -> double {
156 const CDCDedxTrack* dedxTrack = getDedxFromParticle(part);
157 if (!dedxTrack)
158 {
159 return std::numeric_limits<float>::quiet_NaN();
160 } else
161 {
162 if (var == "chi") return dedxTrack->getChi(index);
163 else if (var == "pmean") return dedxTrack->getPmean(index);
164 else if (var == "preso") return dedxTrack->getPreso(index);
165 else return std::numeric_limits<float>::quiet_NaN();
166 }
167 };
168 return func;
169 }
170
171 double CDCdEdx_chiE(const Particle* part)
172 {
173 static Manager::FunctionPtr pidFunction = CDCdEdx_PIDvars({"chi", "11"});
174 return std::get<double>(pidFunction(part));
175 }
176
177 double CDCdEdx_chiMu(const Particle* part)
178 {
179 static Manager::FunctionPtr pidFunction = CDCdEdx_PIDvars({"chi", "13"});
180 return std::get<double>(pidFunction(part));
181 }
182
183 double CDCdEdx_chiPi(const Particle* part)
184 {
185 static Manager::FunctionPtr pidFunction = CDCdEdx_PIDvars({"chi", "211"});
186 return std::get<double>(pidFunction(part));
187 }
188
189 double CDCdEdx_chiK(const Particle* part)
190 {
191 static Manager::FunctionPtr pidFunction = CDCdEdx_PIDvars({"chi", "321"});
192 return std::get<double>(pidFunction(part));
193 }
194
195 double CDCdEdx_chiP(const Particle* part)
196 {
197 static Manager::FunctionPtr pidFunction = CDCdEdx_PIDvars({"chi", "2212"});
198 return std::get<double>(pidFunction(part));
199 }
200
201 double CDCdEdx_chiD(const Particle* part)
202 {
203 static Manager::FunctionPtr pidFunction = CDCdEdx_PIDvars({"chi", "1000010020"});
204 return std::get<double>(pidFunction(part));
205 }
206
207 VARIABLE_GROUP("CDC dEdx");
208
209 REGISTER_VARIABLE("CDCdEdx", CDCdedx, "CDC dE/dx truncated mean");
210 REGISTER_VARIABLE("CDCdEdxnosat", CDCdedxnosat,
211 "CDC dE/dx truncated mean without saturation correction (NA for current track level MC)");
212 REGISTER_VARIABLE("pCDC", pCDC, "Momentum valid in the CDC");
213 REGISTER_VARIABLE("costhCDC", costhCDC, "costheta valid in the CDC");
214 REGISTER_VARIABLE("CDCdEdx_nhits", CDCdEdx_nhits, "total hits of dedx track");
215 REGISTER_VARIABLE("CDCdEdx_lnhits", CDCdEdx_lnhits, "layer hits for dedx track");
216 REGISTER_VARIABLE("CDCdEdx_lnhitsused", CDCdEdx_lnhitsused, "truncated hits of dedx track");
217
218 REGISTER_METAVARIABLE("CDCdEdx_PIDvars(var,PDG) var (= chi or pmean or preso) and PDG is of charged particles", CDCdEdx_PIDvars,
219 "advance CDC dEdx PID related variables for charged particle", Manager::VariableDataType::c_double);
220
221 REGISTER_VARIABLE("CDCdEdx_chiE", CDCdEdx_chiE, "Chi value of electrons from CDC dEdx");
222 REGISTER_VARIABLE("CDCdEdx_chiMu", CDCdEdx_chiMu, "Chi value of muons from CDC dEdx");
223 REGISTER_VARIABLE("CDCdEdx_chiPi", CDCdEdx_chiPi, "Chi value of pions from CDC dEdx");
224 REGISTER_VARIABLE("CDCdEdx_chiK", CDCdEdx_chiK, "Chi value of kaons from CDC dEdx");
225 REGISTER_VARIABLE("CDCdEdx_chiP", CDCdEdx_chiP, "Chi value of protons from CDC dEdx");
226 REGISTER_VARIABLE("CDCdEdx_chiD", CDCdEdx_chiD, "Chi value of duetrons from CDC dEdx");
227 }
229}
Debug output for CDCDedxPID module.
Definition: CDCDedxTrack.h:25
static const ChargedStable muon
muon particle
Definition: Const.h:660
static const ChargedStable pion
charged pion particle
Definition: Const.h:661
static const ChargedStable proton
proton particle
Definition: Const.h:663
static const ChargedStable kaon
charged kaon particle
Definition: Const.h:662
static const ChargedStable electron
electron particle
Definition: Const.h:659
static const ChargedStable deuteron
deuteron particle
Definition: Const.h:664
Class to store reconstructed particles.
Definition: Particle.h:76
Class that bundles various TrackFitResults.
Definition: Track.h:25
std::function< VarVariant(const Particle *)> FunctionPtr
functions stored take a const Particle* and return VarVariant.
Definition: Manager.h:112
CDCDedxTrack const * getDedxFromParticle(Particle const *particle)
CDC dEdx value from particle.
Abstract base class for different kinds of events.