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:
347a momentum-binned selection including requirements on impact parameter of, and
348angle between the daughter pions as well as separation from the vertex and
349flight 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.
363It 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
367significance of a :math:`\Lambda^0` sample without any proton PID cut. However, it might still be beneficial to apply a proton PID
368cut 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
383energy 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.
424The 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}}}
429Since 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).
476Belle 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
double sqrt(double a)
sqrt for double
Abstract base class for different kinds of events.