10 #include <analysis/variables/BelleVariables.h>
13 #include <analysis/VariableManager/Manager.h>
15 #include <analysis/dataobjects/Particle.h>
16 #include <analysis/variables/Variables.h>
17 #include <analysis/variables/VertexVariables.h>
18 #include <analysis/variables/ECLVariables.h>
19 #include <analysis/variables/TrackVariables.h>
20 #include <analysis/variables/V0DaughterTrackVariables.h>
21 #include <mdst/dataobjects/Track.h>
22 #include <analysis/variables/VertexVariables.h>
24 #include <framework/logging/Logger.h>
25 #include <framework/gearbox/Const.h>
27 #include <framework/database/DBObjPtr.h>
28 #include <mdst/dbobjects/BeamSpot.h>
30 #include <framework/datastore/StoreArray.h>
31 #include <b2bii/dataobjects/BelleTrkExtra.h>
43 bool goodBelleKshort(
const Particle* KS)
46 if (KS->getNDaughters() != 2) {
47 B2WARNING(
"goodBelleKshort is only defined for a particle with two daughters");
50 const Particle* d0 = KS->getDaughter(0);
51 const Particle* d1 = KS->getDaughter(1);
52 if ((d0->getCharge() == 0) || (d1->getCharge() == 0)) {
53 B2WARNING(
"goodBelleKshort is only defined for a particle with charged daughters");
57 B2WARNING(
"goodBelleKshort is being applied to a candidate with PDG " << KS->getPDGCode());
60 if (KS->hasExtraInfo(
"goodKs")) {
61 return bool(KS->getExtraInfo(
"goodKs"));
65 double p = particleP(KS);
66 double fl = particleDRho(KS);
67 double dphi = acos(((particleDX(KS) * particlePx(KS)) + (particleDY(KS) * particlePy(KS))) / (fl *
sqrt(particlePx(KS) * particlePx(
68 KS) + particlePy(KS) * particlePy(KS))));
70 double dr = std::min(abs(particleDRho(d0)), abs(particleDRho(d1)));
71 double zdist = v0DaughterZ0Diff(KS);
73 bool low = p < 0.5 && abs(zdist) < 0.8 && dr > 0.05 && dphi < 0.3;
74 bool mid = p < 1.5 && p > 0.5 && abs(zdist) < 1.8 && dr > 0.03 && dphi < 0.1 && fl > .08;
75 bool high = p > 1.5 && abs(zdist) < 2.4 && dr > 0.02 && dphi < 0.03 && fl > .22;
77 if (low || mid || high) {
84 double goodBelleLambda(
const Particle* Lambda)
86 if (Lambda->getNDaughters() != 2) {
87 B2WARNING(
"goodBelleLambda is only defined for a particle with two daughters");
90 const Particle* d0 = Lambda->getDaughter(0);
91 const Particle* d1 = Lambda->getDaughter(1);
92 if ((d0->getCharge() == 0) || (d1->getCharge() == 0)) {
93 B2WARNING(
"goodBelleLambda is only defined for a particle with charged daughters");
97 B2WARNING(
"goodBelleLambda is being applied to a candidate with PDG " << Lambda->getPDGCode());
100 if (Lambda->hasExtraInfo(
"goodLambda"))
101 return Lambda->getExtraInfo(
"goodLambda");
103 double p = particleP(Lambda);
104 double dr = std::min(abs(particleDRho(d0)), abs(particleDRho(d1)));
105 double zdist = v0DaughterZ0Diff(Lambda);
106 double dphi = acos(cosAngleBetweenMomentumAndVertexVectorInXYPlane(Lambda));
108 double fl = particleDRho(Lambda);
111 bool high1 = p >= 1.5 && abs(zdist) < 12.9 && dr > 0.008 && dphi < 0.09 && fl > 0.22;
112 bool mid1 = p >= 0.5 && p < 1.5 && abs(zdist) < 9.8 && dr > 0.01 && dphi < 0.18 && fl > 0.16;
113 bool low1 = p < 0.5 && abs(zdist) < 2.4 && dr > 0.027 && dphi < 1.2 && fl > 0.11;
116 bool high2 = p >= 1.5 && abs(zdist) < 7.7 && dr > 0.018 && dphi < 0.07 && fl > 0.35;
117 bool mid2 = p >= 0.5 && p < 1.5 && abs(zdist) < 2.1 && dr > 0.033 && dphi < 0.10 && fl > 0.24;
118 bool low2 = p < 0.5 && abs(zdist) < 1.9 && dr > 0.059 && dphi < 0.6 && fl > 0.17;
120 if (low2 || mid2 || high2) {
122 }
else if (low1 || mid1 || high1) {
130 bool isGoodBelleGamma(
int region,
double energy)
132 bool goodGammaRegion1, goodGammaRegion2, goodGammaRegion3;
133 goodGammaRegion1 = region == 1 && energy > 0.100;
134 goodGammaRegion2 = region == 2 && energy > 0.050;
135 goodGammaRegion3 = region == 3 && energy > 0.150;
137 return goodGammaRegion1 || goodGammaRegion2 || goodGammaRegion3;
140 bool goodBelleGamma(
const Particle* particle)
142 double energy = eclClusterE(particle);
143 int region = eclClusterDetectionRegion(particle);
145 return isGoodBelleGamma(region, energy);
148 BelleTrkExtra* getBelleTrkExtraInfoFromParticle(Particle
const* particle)
150 const Track* track = particle->getTrack();
154 auto belleTrkExtra = track->getRelatedTo<BelleTrkExtra>();
155 if (!belleTrkExtra) {
158 return belleTrkExtra;
161 double BelleFirstCDCHitX(
const Particle* particle)
163 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
164 if (!belleTrkExtra) {
165 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
168 return belleTrkExtra->getTrackFirstX();
171 double BelleFirstCDCHitY(
const Particle* particle)
173 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
174 if (!belleTrkExtra) {
175 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
178 return belleTrkExtra->getTrackFirstY();
181 double BelleFirstCDCHitZ(
const Particle* particle)
183 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
184 if (!belleTrkExtra) {
185 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
188 return belleTrkExtra->getTrackFirstZ();
191 double BelleLastCDCHitX(
const Particle* particle)
193 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
194 if (!belleTrkExtra) {
195 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
198 return belleTrkExtra->getTrackLastX();
201 double BelleLastCDCHitY(
const Particle* particle)
203 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
204 if (!belleTrkExtra) {
205 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
208 return belleTrkExtra->getTrackLastY();
211 double BelleLastCDCHitZ(
const Particle* particle)
213 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
214 if (!belleTrkExtra) {
215 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
218 return belleTrkExtra->getTrackLastZ();
221 double BellePi0InvariantMassSignificance(
const Particle* particle)
223 TMatrixFSym covarianceMatrix(Particle::c_DimMomentum);
224 for (
auto daughter : particle->getDaughters()) {
225 covarianceMatrix += daughter->getMomentumErrorMatrix();
228 TVectorF jacobian(Particle::c_DimMomentum);
229 jacobian[0] = -1.0 * particle->getPx() / particle->getMass();
230 jacobian[1] = -1.0 * particle->getPy() / particle->getMass();
231 jacobian[2] = -1.0 * particle->getPz() / particle->getMass();
232 jacobian[3] = 1.0 * particle->getEnergy() / particle->getMass();
234 double massErrSquared = jacobian * (covarianceMatrix * jacobian);
236 if (massErrSquared < 0.0)
239 double invMass = particleInvariantMassFromDaughters(particle);
240 double nomMass = particle->getPDGMass();
242 return (invMass - nomMass) /
sqrt(massErrSquared);
245 double BelleTof(
const Particle* particle)
247 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
248 if (!belleTrkExtra) {
249 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
252 return belleTrkExtra->getTof();
255 double BelleTofQuality(
const Particle* particle)
257 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
258 if (!belleTrkExtra) {
259 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
262 return belleTrkExtra->getTofQuality();
265 double BelleTofSigma(
const Particle* particle)
267 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
268 if (!belleTrkExtra) {
269 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
272 return belleTrkExtra->getTofSigma();
275 double BellePathLength(
const Particle* particle)
277 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
278 if (!belleTrkExtra) {
279 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
282 return belleTrkExtra->getPathLength();
285 double BelledEdx(
const Particle* particle)
287 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
288 if (!belleTrkExtra) {
289 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
292 return belleTrkExtra->getdEdx();
295 double BelledEdxQuality(
const Particle* particle)
297 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
298 if (!belleTrkExtra) {
299 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
302 return belleTrkExtra->getdEdxQuality();
305 double BelleACCnPe(
const Particle* particle)
307 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
308 if (!belleTrkExtra) {
309 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
312 return belleTrkExtra->getACCPe();
315 double BelleACCQuality(
const Particle* particle)
317 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
318 if (!belleTrkExtra) {
319 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
322 return belleTrkExtra->getACCQuality();
327 VARIABLE_GROUP(
"Belle Variables");
329 REGISTER_VARIABLE(
"goodBelleKshort", goodBelleKshort, R
"DOC(
330 [Legacy] GoodKs Returns true if a :math:`K_{S}^0\to\pi\pi` candidate passes the Belle algorithm:
331 a momentum-binned selection including requirements on impact parameter of, and
332 angle between the daughter pions as well as separation from the vertex and
333 flight distance in the transverse plane.
335 .. seealso:: `BELLE2-NOTE-PH-2018-017 <https://docs.belle2.org/record/957>`_
338 REGISTER_VARIABLE("goodBelleLambda", goodBelleLambda, R
"DOC(
339 [Legacy] Returns 2.0, 1.0, 0.0 as an indication of goodness of :math:`\Lambda^0` candidates,
342 * The distance of the two daughter tracks at their interception at z axis,
343 * the minimum distance of the daughter tracks and the IP in xy plane,
344 * the difference of the azimuthal angle of the vertex vector and the momentum vector,
345 * and the flight distance of the Lambda0 candidates in xy plane.
347 It reproduces the ``goodLambda()`` function in Belle.
349 ``goodBelleLambda`` selection 1 (selected with: ``goodBelleLambda>0``) maximizes the signal significance after applying
350 ``atcPIDBelle(4,2) > 0.6``, while ``goodBelleLambda`` selection 2 (``goodBelleLambda>1``) is tighter and maximizes the signal
351 significance of a :math:`\Lambda^0` sample without any proton PID cut. However, it might still be beneficial to apply a proton PID
352 cut on top of it. Which combination of proton PID cut and ``goodBelleLambda`` selection scenario is ideal, is probably
355 .. warning:: ``goodBelleLambda`` is not optimized or tested on Belle II data.
358 * `BN-684`_ Lambda selection at Belle. K F Chen et al.
359 * The ``FindLambda`` class can be found at ``/belle_legacy/findLambda/findLambda.h``
361 .. _BN-684: https://belle.kek.jp/secured/belle_note/gn684/bn684.ps.gz
365 REGISTER_VARIABLE("goodBelleGamma", goodBelleGamma, R
"DOC(
366 [Legacy] Returns 1.0 if the photon candidate passes the simple region dependent
367 energy selection for Belle data and MC.
371 E > 50 \textrm{ MeV; barrel}\\
372 E > 100 \textrm{ MeV; forward endcap}\\
373 E > 150 \textrm{ MeV; backward endcap}
376 REGISTER_VARIABLE("BelleFirstCDCHitX", BelleFirstCDCHitX, R
"DOC(
377 [Legacy] Returns x component of starting point of the track near the 1st SVD or CDC hit for SVD1 data (exp. 7 - 27) or the 1st CDC hit for SVD2 data (from exp. 31). (Belle only, originally stored in mdst_trk_fit.)
381 REGISTER_VARIABLE("BelleFirstCDCHitY", BelleFirstCDCHitY, R"DOC(
382 [Legacy] Returns y component of starting point of the track near the 1st SVD or CDC hit for SVD1 data (exp. 7 - 27) or the 1st CDC hit for SVD2 data (from exp. 31). (Belle only, originally stored in mdst_trk_fit.)
386 REGISTER_VARIABLE("BelleFirstCDCHitZ", BelleFirstCDCHitZ, R"DOC(
387 [Legacy] Returns z component of starting point of the track near the 1st SVD or CDC hit for SVD1 data (exp. 7 - 27) or the 1st CDC hit for SVD2 data (from exp. 31). (Belle only, originally stored in mdst_trk_fit.)
391 REGISTER_VARIABLE("BelleLastCDCHitX", BelleLastCDCHitX, R"DOC(
392 [Legacy] Returns x component of end point of the track near the last CDC hit. (Belle only, originally stored in mdst_trk_fit.)
396 REGISTER_VARIABLE("BelleLastCDCHitY", BelleLastCDCHitY, R"DOC(
397 [Legacy] Returns y component of end point of the track near the last CDC hit. (Belle only, originally stored in mdst_trk_fit.)
401 REGISTER_VARIABLE("BelleLastCDCHitZ", BelleLastCDCHitZ, R"DOC(
402 [Legacy] Returns z component of end point of the track near the last CDC hit. (Belle only, originally stored in mdst_trk_fit.)
406 REGISTER_VARIABLE("BellePi0SigM", BellePi0InvariantMassSignificance, R"DOC(
407 [Legacy] Returns the significance of the :math:`\pi^0` mass used in the FEI for B2BII.
408 The significance is calculated as the difference between the reconstructed and the nominal mass divided by the mass uncertainty:
411 \frac{m_{\gamma\gamma} - m_{\pi^0}^\textrm{PDG}}{\sigma_{m_{\gamma\gamma}}}
413 Since the :math:`\pi^0`'s covariance matrix for B2BII is empty, the latter is calculated using the photon daughters' covariance matrices.
416 REGISTER_VARIABLE("BelleTof", BelleTof, R
"DOC(
417 [Legacy] Returns the time of flight of a track. (Belle only).
421 REGISTER_VARIABLE(
"BelleTofQuality", BelleTofQuality, R
"DOC(
422 [Legacy] Returns the quality flag of the time of flight of a track. Original description from the panther table: 0 if consistency between z of hit by charge Q and corrected times, 1 if zhit from Q NOT consistent with zhit from and correct times. (Belle only).
425 REGISTER_VARIABLE("BelleTofSigma", BelleTofSigma, R
"DOC(
426 [Legacy] Returns the expected resolution on the time of flight of a track. (Belle only).
430 REGISTER_VARIABLE(
"BellePathLength", BellePathLength, R
"DOC(
431 [Legacy] Returns the track path length. This is defined from the closest point to the z-axis up to TOF counter. (Belle only).
435 REGISTER_VARIABLE(
"BelledEdx", BelledEdx, R
"DOC(
436 [Legacy] Returns the dE/dx measured in the CDC. (Belle only).
440 REGISTER_VARIABLE(
"BelledEdxQuality", BelledEdxQuality, R
"DOC(
441 [Legacy] Returns the quality flag of the dE/dx measured in the CDC. Sadly no information about the code meaning is given in the original panther tables. (Belle only).
444 REGISTER_VARIABLE("BelleACCnPe", BelleACCnPe, R
"DOC(
445 [Legacy] Returns the number of photo-electrons associated to the track in the ACC. (Belle only).
448 REGISTER_VARIABLE("BelleACCQuality", BelleACCQuality, R
"DOC(
449 [Legacy] Returns the ACC quality flag. Original definition in the panther tables: if 0 normal, if 1 the track is out of ACC acceptance. (Belle only).
454 REGISTER_VARIABLE(
"clusterBelleQuality", eclClusterDeltaL, R
"DOC(
455 [Legacy] Returns ECL cluster's quality indicating a good cluster in GSIM (stored in deltaL of ECL cluster object).
456 Belle analysis typically used clusters with quality == 0 in their :math:`E_{\text{extra ECL}}` (Belle only).
int getPDGCode() const
PDG code.
static const ParticleType Lambda
Lambda particle.
static const ParticleType Kshort
K^0_S particle.
static const double doubleNaN
quiet_NaN
double sqrt(double a)
sqrt for double
Abstract base class for different kinds of events.