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 BelleTofMass(
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 double time = belleTrkExtra->getTof();
293 double length = belleTrkExtra->getPathLength();
294 double p = particle->getP();
296 double tofmass = p * sqrt(1. / (tofbeta * tofbeta) - 1.);
301 double BelledEdx(
const Particle* particle)
303 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
304 if (!belleTrkExtra) {
305 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
308 return belleTrkExtra->getdEdx();
311 double BelledEdxQuality(
const Particle* particle)
313 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
314 if (!belleTrkExtra) {
315 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
318 return belleTrkExtra->getdEdxQuality();
321 double BelleACCnPe(
const Particle* particle)
323 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
324 if (!belleTrkExtra) {
325 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
328 return belleTrkExtra->getACCPe();
331 double BelleACCQuality(
const Particle* particle)
333 auto belleTrkExtra = getBelleTrkExtraInfoFromParticle(particle);
334 if (!belleTrkExtra) {
335 B2WARNING(
"Cannot find BelleTrkExtra, did you forget to enable BelleTrkExtra during the conversion?");
338 return belleTrkExtra->getACCQuality();
343 VARIABLE_GROUP(
"Belle Variables");
345 REGISTER_VARIABLE(
"goodBelleKshort", goodBelleKshort, R
"DOC(
346 [Legacy] GoodKs Returns true if a :math:`K_{S}^0\to\pi\pi` candidate passes the Belle algorithm:
347 a momentum-binned selection including requirements on impact parameter of, and
348 angle between the daughter pions as well as separation from the vertex and
349 flight distance in the transverse plane.
351 .. seealso:: `BELLE2-NOTE-PH-2018-017 <https://docs.belle2.org/record/957>`_
354 REGISTER_VARIABLE("goodBelleLambda", goodBelleLambda, R
"DOC(
355 [Legacy] Returns 2.0, 1.0, 0.0 as an indication of goodness of :math:`\Lambda^0` candidates,
358 * The distance of the two daughter tracks at their interception at z axis,
359 * the minimum distance of the daughter tracks and the IP in xy plane,
360 * the difference of the azimuthal angle of the vertex vector and the momentum vector,
361 * and the flight distance of the Lambda0 candidates in xy plane.
363 It reproduces the ``goodLambda()`` function in Belle.
365 ``goodBelleLambda`` selection 1 (selected with: ``goodBelleLambda>0``) maximizes the signal significance after applying
366 ``atcPIDBelle(4,2) > 0.6``, while ``goodBelleLambda`` selection 2 (``goodBelleLambda>1``) is tighter and maximizes the signal
367 significance of a :math:`\Lambda^0` sample without any proton PID cut. However, it might still be beneficial to apply a proton PID
368 cut on top of it. Which combination of proton PID cut and ``goodBelleLambda`` selection scenario is ideal, is probably
371 .. warning:: ``goodBelleLambda`` is not optimized or tested on Belle II data.
374 * `BN-684`_ Lambda selection at Belle. K F Chen et al.
375 * The ``FindLambda`` class can be found at ``/belle_legacy/findLambda/findLambda.h``
377 .. _BN-684: https://belle.kek.jp/secured/belle_note/gn684/bn684.ps.gz
381 REGISTER_VARIABLE("goodBelleGamma", goodBelleGamma, R
"DOC(
382 [Legacy] Returns 1.0 if the photon candidate passes the simple region dependent
383 energy selection for Belle data and MC.
387 E > 50 \textrm{ MeV; barrel}\\
388 E > 100 \textrm{ MeV; forward endcap}\\
389 E > 150 \textrm{ MeV; backward endcap}
392 REGISTER_VARIABLE("BelleFirstCDCHitX", BelleFirstCDCHitX, R
"DOC(
393 [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.)
397 REGISTER_VARIABLE("BelleFirstCDCHitY", BelleFirstCDCHitY, R"DOC(
398 [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.)
402 REGISTER_VARIABLE("BelleFirstCDCHitZ", BelleFirstCDCHitZ, R"DOC(
403 [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.)
407 REGISTER_VARIABLE("BelleLastCDCHitX", BelleLastCDCHitX, R"DOC(
408 [Legacy] Returns x component of end point of the track near the last CDC hit. (Belle only, originally stored in mdst_trk_fit.)
412 REGISTER_VARIABLE("BelleLastCDCHitY", BelleLastCDCHitY, R"DOC(
413 [Legacy] Returns y component of end point of the track near the last CDC hit. (Belle only, originally stored in mdst_trk_fit.)
417 REGISTER_VARIABLE("BelleLastCDCHitZ", BelleLastCDCHitZ, R"DOC(
418 [Legacy] Returns z component of end point of the track near the last CDC hit. (Belle only, originally stored in mdst_trk_fit.)
422 REGISTER_VARIABLE("BellePi0SigM", BellePi0InvariantMassSignificance, R"DOC(
423 [Legacy] Returns the significance of the :math:`\pi^0` mass used in the FEI for B2BII.
424 The significance is calculated as the difference between the reconstructed and the nominal mass divided by the mass uncertainty:
427 \frac{m_{\gamma\gamma} - m_{\pi^0}^\textrm{PDG}}{\sigma_{m_{\gamma\gamma}}}
429 Since the :math:`\pi^0`'s covariance matrix for B2BII is empty, the latter is calculated using the photon daughters' covariance matrices.
432 REGISTER_VARIABLE("BelleTof", BelleTof, R
"DOC(
433 [Legacy] Returns the time of flight of a track. (Belle only).
437 REGISTER_VARIABLE(
"BelleTofQuality", BelleTofQuality, R
"DOC(
438 [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).
441 REGISTER_VARIABLE("BelleTofSigma", BelleTofSigma, R
"DOC(
442 [Legacy] Returns the expected resolution on the time of flight of a track. (Belle only).
446 REGISTER_VARIABLE(
"BellePathLength", BellePathLength, R
"DOC(
447 [Legacy] Returns the track path length. This is defined from the closest point to the z-axis up to TOF counter. (Belle only).
451 REGISTER_VARIABLE(
"BelleTofMass", BelleTofMass, R
"DOC(
452 [Legacy] Returns the TOF mass calculated from the time of flight and path length. (Belle only).
453 )DOC", "GeV/:math:`\\text{c}^2`");
455 REGISTER_VARIABLE(
"BelledEdx", BelledEdx, R
"DOC(
456 [Legacy] Returns the dE/dx measured in the CDC. (Belle only).
460 REGISTER_VARIABLE(
"BelledEdxQuality", BelledEdxQuality, R
"DOC(
461 [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).
464 REGISTER_VARIABLE("BelleACCnPe", BelleACCnPe, R
"DOC(
465 [Legacy] Returns the number of photo-electrons associated to the track in the ACC. (Belle only).
468 REGISTER_VARIABLE("BelleACCQuality", BelleACCQuality, R
"DOC(
469 [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).
474 REGISTER_VARIABLE(
"clusterBelleQuality", eclClusterDeltaL, R
"DOC(
475 [Legacy] Returns ECL cluster's quality indicating a good cluster in GSIM (stored in deltaL of ECL cluster object).
476 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 double speedOfLight
[cm/ns]
static const ParticleType Kshort
K^0_S particle.
static const double doubleNaN
quiet_NaN
Abstract base class for different kinds of events.