8 #include <tracking/modules/V0Finder/V0FinderModule.h>
10 #include <framework/gearbox/Const.h>
11 #include <framework/logging/Logger.h>
12 #include <framework/core/ModuleParam.templateDetails.h>
14 #include <tracking/dataobjects/RecoTrack.h>
22 setDescription(
"This is a simple V0 finder for X = Ks, Lambda and converted fotons "
23 "which matches all positive tracks with all negative tracks, "
24 "fitting a vertex for each pair. "
25 "Depending on the outcome of each fit, a corresponding "
26 "Belle2::V0 is stored or not.\n\n"
27 "A loose cut on the invariant mass (``massRangeX``) is applied before the fit (not considering material effects), "
28 "then a vertex fit is performed and only pairs passing a chi^2 (``vertexChi2CutOutside``) "
29 "and a second cut on the invariant mass (``invMassRangeX``) are stored as Belle2::V0. \n\n"
30 "No V0s with vertex inside the beam pipe "
31 "are saved as they can be recovered at analysis level. ");
37 "RecoTrack StoreArray name (input)", std::string(
""));
39 "RecoTrack StoreArray name (used for track refitting)", std::string(
"CopiedRecoTracks"));
41 "Belle2::TrackFitResult StoreArray name (in- and output).\n"
42 "Note that the V0s use pointers indices into these arrays, so all hell may break loose, "
43 "if you change this.", std::string(
""));
45 "Belle2::Track StoreArray name (input).\n"
46 "Note that the V0s use pointers indices into these arrays, so all hell may break loose, "
47 "if you change this.", std::string(
""));
56 "Radius at which we switch between the two classes of cuts. "
57 "The default is a little inside the beam pipe to allow some tolerance.",
61 "Maximum chi^2 for the vertex fit (NDF = 1)", 10000.);
64 "mass range in GeV for reconstructed Kshort after removing material effects and inner hits",
m_invMassRangeKshort);
67 "mass range in GeV for reconstructed Lambda after removing material effects and inner hits",
m_invMassRangeLambda);
70 "mass range in GeV for reconstructed Photon after removing material effects and inner hits",
m_invMassRangePhoton);
73 "designate which fitAndStore function is called in V0Fitter.\n"
74 " 0: store V0 at the first vertex fit, regardless of inner hits; \n"
75 " 1: remove hits inside the V0 vertex position;\n"
76 " 2: mode 1 + don't use SVD hits if there is only one available SVD hit-pair",
80 "mass range in GeV for reconstructed Kshort used for pre-selection of candidates"
83 "mass range in GeV for reconstructed Lambda used for pre-selection of candidates"
85 addParam(
"precutRho",
m_precutRho,
"preselection cut on the transverse radius of the point-of-closest-approach of two tracks. "
86 "Set value to 0 to accept all.", 0.5);
88 "Those above this cut are always accepted.", 0.9);
97 m_tracks.requireRelationTo(recoTracks);
118 B2FATAL(
"The minimum has to be smaller than the maximum of the Kshort mass range! min = " << std::get<0>
122 B2FATAL(
"The minimum has to be smaller than the maximum of the Lambda mass range! min = " << std::get<0>
145 B2DEBUG(29,
m_tracks.getEntries() <<
" tracks in event.");
148 std::vector<const Track*> tracksPlus;
149 tracksPlus.reserve(
m_tracks.getEntries());
151 std::vector<const Track*> tracksMinus;
152 tracksMinus.reserve(
m_tracks.getEntries());
154 for (
const auto& track :
m_tracks) {
156 B2ASSERT(
"No RecoTrack available for given Track.", recoTrack);
159 tracksPlus.push_back(&track);
162 tracksMinus.push_back(&track);
167 if (tracksPlus.empty() or tracksMinus.empty()) {
168 B2DEBUG(29,
"No interesting track pairs. tracksPlus " << tracksPlus.size() <<
", tracksMinus " << tracksMinus.size());
173 for (
auto& trackPlus : tracksPlus) {
174 for (
auto& trackMinus : tracksMinus) {
190 B2INFO(
"===V0Finder summary=============================================================");
192 B2INFO(
"- Inner hits successfully removed in " <<
m_nHitRemoved <<
" V0s.");
193 B2INFO(
"- The hit removal failed in " <<
m_nForceStored <<
" V0s, instead V0s before removing inner hits saved.");
199 const double* range_m2_min =
nullptr;
200 const double* range_m2_max =
nullptr;
216 double m_plus = trackHypotheses.first.getMass();
218 double E_plus =
sqrt(m_plus * m_plus + p_plus * p_plus);
221 double m_minus = trackHypotheses.second.getMass();
223 double E_minus =
sqrt(m_minus * m_minus + p_minus * p_minus);
226 double sum_E2 = (E_minus + E_plus) * (E_minus + E_plus);
229 double candmass_min2 = sum_E2 - (p_plus + p_minus) * (p_plus + p_minus);
230 double candmass_max2 = sum_E2 - (p_plus - p_minus) * (p_plus - p_minus);
233 bool in_range = candmass_max2 > *range_m2_min and candmass_min2 < *range_m2_max;
244 if (not fit1)
return false;
245 auto r1 = fit1->getPosition();
246 auto k1 = fit1->getMomentum().Unit();
249 if (not fit2)
return false;
250 auto r2 = fit2->getPosition();
251 auto k2 = fit2->getMomentum().Unit();
253 double cosAlpha = k1.Dot(k2);
266 double D = cosAlpha * cosAlpha - 1;
267 if (D == 0)
return true;
270 double b1 = dr.Dot(k1);
271 double b2 = dr.Dot(k2);
272 double lam1 = (-b1 + b2 * cosAlpha) / D;
273 double lam2 = (b2 - b1 * cosAlpha) / D;
274 auto p1 = r1 + k1 * lam1;
275 auto p2 = r2 + k2 * lam2;
276 auto poca = (p1 + p2) / 2;
285 bool isForceStored =
false, isHitRemoved =
false;
287 bool ok =
m_newV0Fitter->fitAndStore(trackPlus, trackMinus, v0Hypothesis, isForceStored, isHitRemoved);
290 bool ok =
m_v0Fitter->fitAndStore(trackPlus, trackMinus, v0Hypothesis, isForceStored, isHitRemoved);
297 B2WARNING(
"Genfit exception caught. Skipping this track pair"
299 <<
LogVar(
"Genfit exception:", e.what()));
The ParticleType class for identifying different particle types.
int getPDGCode() const
PDG code.
static const ParticleType Lambda
Lambda particle.
static const ChargedStable pion
charged pion particle
static const ParticleType antiLambda
Anti-Lambda particle.
static const ParticleType Kshort
K^0_S particle.
static const ParticleType photon
photon particle
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
This is the Reconstruction Event-Data Model Track.
short int getChargeSeed() const
Return the charge seed stored in the reco track. ATTENTION: This is not the fitted charge.
ROOT::Math::XYZVector getMomentum() const
Getter for vector of momentum at closest approach of track in r/phi projection.
Class that bundles various TrackFitResults.
const TrackFitResult * getTrackFitResultWithClosestMass(const Const::ChargedStable &requestedType) const
Return the track fit for a fit hypothesis with the closest mass.
std::tuple< double, double > m_preFilterMassRangeKshort
range for reconstructed Kshort mass used for pre-selection
int m_allStored
counter for all saved V0s
std::string m_arrayNameCopiedRecoTrack
StoreArray name of the RecoTracks.
std::string m_arrayNameV0
StoreArray name of the V0 (Output).
void initialize() override
Registration of StoreArrays, Relations, check proper GenFit setup.
std::tuple< double, double > m_preFilterMassRangeLambda
range for reconstructed Lambda mass used for pre-selection
bool isTrackPairSelected(const Track *track1, const Track *track2)
Track pair preselection based on a point-of-closest-approach of two tracks.
void fitAndStore(const Track *trackPlus, const Track *trackMinus, const Const::ParticleType &v0Hypothesis)
V0 fitting and storing.
void event() override
Creates Belle2::V0s from Belle2::Tracks as described in the class documentation.
int m_nForceStored
counter for saved V0s failing to remove the inner hits
std::string m_arrayNameTFResult
StoreArray name of the TrackFitResults (In- and Output).
double m_mKshortMax2
pre-calculated maximum Kshort mass squared
bool m_useValidation
on true save also fitted vertices in V0ValidationVertex StoreArray
std::string m_arrayNameV0ValidationVertex
StoreArray name of the V0ValidationVertex.
void terminate() override
Prints status summary.
double m_mLambdaMin2
pre-calculated mininum Lambda mass squared
double m_beamPipeRadius
Radius where inside/outside beampipe is defined.
V0FinderModule()
Setting of module description, parameters.
double m_mLambdaMax2
pre-calculated maximum Lambda mass squared
std::tuple< double, double > m_invMassRangePhoton
range for reconstructed Photon mass used after removing material effects and inner hits
double m_precutRho
preselection cut on transverse radius of the track pair POCA
std::unique_ptr< V0Fitter > m_v0Fitter
Object containing the actual algorithm.
StoreArray< Track > m_tracks
Actually array of mdst Tracks.
bool m_useNewV0Fitter
toggle between old (false) and new (true) V0 fitter
int m_nHitRemoved
counter for saved V0s successfully removing the inner hits
double m_vertexChi2CutOutside
Chi2 cut for V0s outside of the beampipe. Applies to all.
std::string m_arrayNameRecoTrack
StoreArray name of the RecoTracks (Input).
bool preFilterTracks(const Track *trackPlus, const Track *trackMinus, const Const::ParticleType &v0Hypothesis)
Helper function that gets the approximate mass range for the two given tracks and rejects candidates ...
int m_v0FitterMode
fitter mode
std::unique_ptr< NewV0Fitter > m_newV0Fitter
Object containing the actual algorithm.
double m_precutCosAlpha
preselection cut on opening angle of the track pair
std::tuple< double, double > m_invMassRangeKshort
range for reconstructed Kshort mass used after removing material effects and inner hits
std::tuple< double, double > m_invMassRangeLambda
range for reconstructed Lambda mass used after removing material effects and inner hits
std::string m_arrayNameTrack
StoreArray name of the Tracks (Input).
double m_mKshortMin2
pre-calculated mininum Kshort mass squared
Class to store variables with their name which were sent to the logging service.
Exception class for error handling in GENFIT (provides storage for diagnostic information)
REG_MODULE(arichBtest)
Register the Module.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
double sqrt(double a)
sqrt for double
Abstract base class for different kinds of events.