Belle II Software development
NewV0Fitter.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#include <tracking/v0Finding/fitter/NewV0Fitter.h>
9#include <tracking/v0Finding/fitter/V0VertexFitterFactory.h>
10
11#include <framework/logging/Logger.h>
12#include <framework/geometry/BFieldManager.h>
13#include <tracking/trackFitting/fitter/base/TrackFitter.h>
14#include <tracking/trackFitting/trackBuilder/factories/TrackBuilder.h>
15
16#include <mdst/dataobjects/HitPatternVXD.h>
17#include <mdst/dataobjects/HitPatternCDC.h>
18
19#include <genfit/FieldManager.h>
20#include <genfit/MaterialEffects.h>
21
22using namespace Belle2;
23
24NewV0Fitter::NewV0Fitter(const std::string& trackFitResultsName, const std::string& v0sName,
25 const std::string& v0ValidationVerticesName, const std::string& recoTracksName,
26 const std::string& copiedRecoTracksName, bool enableValidation)
27 : m_recoTracksName(recoTracksName), m_vertexFitter(V0VertexFitterFactory::create("Rave")),
28 m_validation(enableValidation)
29{
30 B2ASSERT("V0Fitter: material effects not set up. Please use SetupGenfitExtrapolationModule.",
31 genfit::MaterialEffects::getInstance()->isInitialized());
32 B2ASSERT("V0Fitter: magnetic field not set up. Please use SetupGenfitExtrapolationModule.",
33 genfit::FieldManager::getInstance()->isInitialized());
34
36 m_trackFitResults.isRequired(trackFitResultsName);
37
39 m_copiedRecoTracks.registerInDataStore(copiedRecoTracksName, DataStore::c_ErrorIfAlreadyRegistered);
41 m_copiedRecoTracks.registerRelationTo(m_recoTracks);
42
43 if (m_validation) {
44 m_validationV0s.registerInDataStore(v0ValidationVerticesName, DataStore::c_ErrorIfAlreadyRegistered);
45 m_v0s.registerRelationTo(m_validationV0s);
46 }
47
48}
49
50
51void NewV0Fitter::initializeCuts(double vertexDistanceCut,
52 double vertexChi2Cut,
53 const std::tuple<double, double>& invMassRangeKshort,
54 const std::tuple<double, double>& invMassRangeLambda,
55 const std::tuple<double, double>& invMassRangePhoton)
56{
57 m_vertexDistanceCut = vertexDistanceCut;
58 m_vertexChi2Cut = vertexChi2Cut;
59 m_invMassCuts[22] = std::make_pair(std::get<0>(invMassRangePhoton), std::get<1>(invMassRangePhoton));
60 m_invMassCuts[310] = std::make_pair(std::get<0>(invMassRangeKshort), std::get<1>(invMassRangeKshort));
61 m_invMassCuts[3122] = std::make_pair(std::get<0>(invMassRangeLambda), std::get<1>(invMassRangeLambda));
62}
63
64
65std::pair<Const::ParticleType, Const::ParticleType> NewV0Fitter::getTrackHypotheses(const Const::ParticleType& v0Hypothesis)
66{
67 if (v0Hypothesis == Const::Kshort) {
68 return std::make_pair(Const::pion, Const::pion);
69 } else if (v0Hypothesis == Const::photon) {
70 return std::make_pair(Const::electron, Const::electron);
71 } else if (v0Hypothesis == Const::Lambda) {
72 return std::make_pair(Const::proton, Const::pion);
73 } else if (v0Hypothesis == Const::antiLambda) {
74 return std::make_pair(Const::pion, Const::proton);
75 }
76 B2FATAL("V0Fitter: given V0 hypothesis not available.");
77 return std::make_pair(Const::invalidParticle, Const::invalidParticle); // return something to avoid triggering cppcheck
78}
79
80
81bool NewV0Fitter::fitAndStore(const Track* trackPlus, const Track* trackMinus, const Const::ParticleType& v0Hypothesis,
82 bool& isForceStored, bool& isHitRemoved)
83{
85 isForceStored = false;
86 isHitRemoved = false;
87 m_trkPlus.recoTrack = nullptr;
88 m_trkMinus.recoTrack = nullptr;
89
91 const RecoTrack* recoTrackPlus = trackPlus->getRelated<RecoTrack>(m_recoTracksName);
92 if (not recoTrackPlus) return false;
93 const RecoTrack* recoTrackMinus = trackMinus->getRelated<RecoTrack>(m_recoTracksName);
94 if (not recoTrackMinus) return false;
95
97 auto trackHypotheses = getTrackHypotheses(v0Hypothesis);
98 auto ptypeTrackPlus = trackPlus->getTrackFitResultWithClosestMass(trackHypotheses.first)->getParticleType();
99 auto ptypeTrackMinus = trackMinus->getTrackFitResultWithClosestMass(trackHypotheses.second)->getParticleType();
100 int pdgTrackPlus = std::abs(ptypeTrackPlus.getPDGCode());
101 int pdgTrackMinus = std::abs(ptypeTrackMinus.getPDGCode());
102
104 int status = vertexFit(recoTrackPlus, recoTrackMinus, pdgTrackPlus, pdgTrackMinus, v0Hypothesis);
105 if (status < 0) return false;
106
107 if (m_fitterMode > 0) {
109 const RecoTrack* origRecoTrackPlus = recoTrackPlus;
110 const RecoTrack* origRecoTrackMinus = recoTrackMinus;
111 int counter = 0;
112 while (status != 0 and counter < 5) {
113 counter++;
116 const RecoTrack* trkPlus = recoTrackPlus;
117 if (status & c_BitTrackPlus) {
118 trkPlus = removeHitsAndRefit(origRecoTrackPlus, recoTrackPlus, ptypeTrackPlus);
119 if (not trkPlus) return false;
120 isHitRemoved = true;
121 }
122 const RecoTrack* trkMinus = recoTrackMinus;
123 if (status & c_BitTrackMinus) {
124 trkMinus = removeHitsAndRefit(origRecoTrackMinus, recoTrackMinus, ptypeTrackMinus);
125 if (not trkMinus) return false;
126 isHitRemoved = true;
127 }
128 if (trkPlus == recoTrackPlus and trkMinus == recoTrackMinus) break; // vertex fit already done, so exit the loop
129 status = vertexFit(trkPlus, trkMinus, pdgTrackPlus, pdgTrackMinus, v0Hypothesis);
130 if (status < 0) break; // save the results of the last successful iteration
131 recoTrackPlus = trkPlus;
132 recoTrackMinus = trkMinus;
133 }
134
135 isForceStored = (status != 0);
136 }
137
139 int sharedCluster = isInnermostClusterShared(recoTrackPlus, recoTrackMinus);
140 const auto* fitPlus = saveTrackFitResult(m_trkPlus, sharedCluster);
141 if (not fitPlus) return false;
142 const auto* fitMinus = saveTrackFitResult(m_trkMinus, sharedCluster);
143 if (not fitMinus) return false;
144
145 const auto* v0 = m_v0s.appendNew(std::make_pair(trackPlus, fitPlus),
146 std::make_pair(trackMinus, fitMinus),
147 m_fittedVertex.getPos().X(), m_fittedVertex.getPos().Y(), m_fittedVertex.getPos().Z());
148
149 if (m_validation) {
150 const auto* validationV0 = m_validationV0s.appendNew(std::make_pair(trackPlus, fitPlus),
151 std::make_pair(trackMinus, fitMinus),
152 ROOT::Math::XYZVector(m_fittedVertex.getPos()),
153 m_fittedVertex.getCov(),
155 m_fittedVertex.getChi2());
156 v0->addRelationTo(validationV0);
157 }
158
159 return true;
160}
161
162
163int NewV0Fitter::vertexFit(const RecoTrack* recoTrackPlus, const RecoTrack* recoTrackMinus,
164 int pdgTrackPlus, int pdgTrackMinus, const Const::ParticleType& v0Hypothesis)
165{
166
167 // get track representations for given PDG codes and check their existence
168
169 const auto* plusRepresentation = getTrackRepresentation(recoTrackPlus, pdgTrackPlus);
170 if (not plusRepresentation) return c_NoTrackRepresentation;
171
172 const auto* minusRepresentation = getTrackRepresentation(recoTrackMinus, pdgTrackMinus);
173 if (not minusRepresentation) return c_NoTrackRepresentation;
174
175 // make copies of genfit tracks which will be passed to vertex fit and set the cardinal representations
176
177 auto gfTrackPlus = recoTrackPlus->getGenfitTrack(); // a copy of
178 if (not setCardinalRep(gfTrackPlus, pdgTrackPlus)) return c_NoTrackRepresentation;
179
180 auto gfTrackMinus = recoTrackMinus->getGenfitTrack(); // a copy of
181 if (not setCardinalRep(gfTrackMinus, pdgTrackMinus)) return c_NoTrackRepresentation;
182
183 // fit vertex
184
185 genfit::GFRaveVertex vert;
186 if (not m_vertexFitter->fit(gfTrackPlus, gfTrackMinus, pdgTrackPlus, pdgTrackMinus, vert)) return c_VertexFitFailed;
187 auto vertexPos = ROOT::Math::XYZVector(vert.getPos());
188
189 // apply cuts on the vertex
190
191 if (vertexPos.Rho() < m_vertexDistanceCut) return c_NotSelected;
192 if (vert.getChi2() > m_vertexChi2Cut) return c_NotSelected;
193
194 // apply cut on the invariant mass
195
196 const auto& p1 = vert.getParameters(0)->getMom();
197 const auto& p2 = vert.getParameters(1)->getMom();
198 auto trackHypotheses = getTrackHypotheses(v0Hypothesis);
199 double mass1 = trackHypotheses.first.getMass();
200 double mass2 = trackHypotheses.second.getMass();
201 ROOT::Math::PxPyPzMVector fourVec1(p1.X(), p1.Y(), p1.Z(), mass1);
202 ROOT::Math::PxPyPzMVector fourVec2(p2.X(), p2.Y(), p2.Z(), mass2);
203 double invMass = (fourVec1 + fourVec2).M();
204 int pdgCode = abs(v0Hypothesis.getPDGCode());
205 const auto& cuts = m_invMassCuts[pdgCode];
206 if (invMass < cuts.first or invMass > cuts.second) return c_NotSelected;
207
208 // extrapolate tracks to fitted vertex; the return status, if positive, indicates whether there are inner hits
209
210 auto statePlus = recoTrackPlus->getMeasuredStateOnPlaneFromFirstHit(plusRepresentation); // a copy of
211 auto stateMinus = recoTrackMinus->getMeasuredStateOnPlaneFromFirstHit(minusRepresentation); // a copy of
212 int status = extrapolateToVertex(statePlus, stateMinus, vert);
213 if (status < 0) return c_ExtrapolationFailed;
214
215 // save fitted vertex and tracks
216
217 m_fittedVertex = vert;
218 m_momentum = (fourVec1 + fourVec2).P();
219 m_invMass = invMass;
220 m_trkPlus.set(recoTrackPlus, trackHypotheses.first, statePlus, plusRepresentation);
221 m_trkMinus.set(recoTrackMinus, trackHypotheses.second, stateMinus, minusRepresentation);
222
223 return status;
224}
225
226
227const genfit::AbsTrackRep* NewV0Fitter::getTrackRepresentation(const RecoTrack* recoTrack, int pdgCode)
228{
229 const auto* rep = recoTrack->getTrackRepresentationForPDG(pdgCode);
230 if (rep and recoTrack->wasFitSuccessful(rep)) return rep;
231
232 B2ERROR("V0Fitter: track hypothesis with closest mass not available. Should never happen!");
233 return nullptr;
234}
235
236
237bool NewV0Fitter::setCardinalRep(genfit::Track& gfTrack, int pdgCode)
238{
239 const auto& reps = gfTrack.getTrackReps();
240 for (unsigned id = 0; id < reps.size(); id++) {
241 if (abs(reps[id]->getPDG()) == pdgCode) {
242 gfTrack.setCardinalRep(id);
243 return true;
244 }
245 }
246
247 B2ERROR("V0Fitter: cannot set cardinal representation for PDG = " << pdgCode);
248 return false;
249}
250
251int NewV0Fitter::extrapolateToVertex(genfit::MeasuredStateOnPlane& statePlus, genfit::MeasuredStateOnPlane& stateMinus,
252 const genfit::GFRaveVertex& vertex)
253{
254 try {
257 double extralengthPlus = statePlus.extrapolateToPoint(vertex.getPos());
258 double extralengthMinus = stateMinus.extrapolateToPoint(vertex.getPos());
259 unsigned status = 0;
260 if (extralengthPlus > 0) status |= c_BitTrackPlus;
261 if (extralengthMinus > 0) status |= c_BitTrackMinus;
262 return status;
263 } catch (...) {
267 B2DEBUG(22, "Could not extrapolate track to vertex.");
269 }
270}
271
272
273const RecoTrack* NewV0Fitter::removeHitsAndRefit(const RecoTrack* origRecoTrack, const RecoTrack* lastRecoTrack,
274 const Const::ParticleType& ptype)
275{
276 // make a copy of useInFit flags
277 std::vector<bool> useInFit;
278 const auto& recoHitInformations = origRecoTrack->getRecoHitInformations(true); // true to get sorted hits info
279 useInFit.reserve(recoHitInformations.size());
280 for (const auto* hitInfo : recoHitInformations) useInFit.push_back(hitInfo->useInFit());
281
282 // get track representation for a given particle
283 const auto* rep = getTrackRepresentation(origRecoTrack, abs(ptype.getPDGCode()));
284 if (not rep) return lastRecoTrack;
285
286 // remove inner hits by setting useInFit flags to false
287 int removedHits = 0;
288 unsigned firstHit = 0;
289 for (unsigned i = 0; i < recoHitInformations.size(); i++) {
290 const auto* hitInfo = recoHitInformations[i];
291 if (not hitInfo->useInFit()) continue;
292 try {
293 auto state = origRecoTrack->getMeasuredStateOnPlaneFromRecoHit(hitInfo, rep); // a copy of
294 double extraLength = state.extrapolateToPoint(m_fittedVertex.getPos());
295 if (extraLength > 0) {
296 useInFit[i] = false;
297 removedHits++;
298 } else {
299 firstHit = i;
300 break;
301 }
302 } catch (NoTrackFitResult()) {
303 B2WARNING("V0Fitter exception: no FitterInfo assigned for TrackPoint created from this RecoHit.");
304 useInFit[i] = false;
305 removedHits++;
306 continue;
307 } catch (...) {
311 B2DEBUG(22, "Could not extrapolate track to vertex when removing inner hits.");
312 return lastRecoTrack;
313 }
314 }
315
316 if (m_fitterMode == 2) {
317 // remove SVD hits if there is only one or two left just after the vertex
318 std::vector<unsigned> svdIndex;
319 for (unsigned i = 0; i < useInFit.size(); i++) {
320 if (not useInFit[i]) continue;
321 const auto* hitInfo = recoHitInformations[i];
322 if (hitInfo->getTrackingDetector() == RecoHitInformation::c_SVD) svdIndex.push_back(i);
323 else break;
324 }
325 if (not svdIndex.empty() and svdIndex.size() < 3) {
326 for (unsigned i : svdIndex) {
327 useInFit[i] = false;
328 removedHits++;
329 }
330 }
331 }
332
333 if (removedHits == 0) return origRecoTrack; // in this case track doesn't need to be refitted
334
335 // count remaining hits and return if there is no hope for the fit to succeed
336 int nHits = 0;
337 for (auto x : useInFit) if (x) nHits++;
338 if (nHits < 5) return lastRecoTrack;
339
340 // make a copy of recoTrack
341 const auto& state = origRecoTrack->getMeasuredStateOnPlaneFromRecoHit(recoHitInformations[firstHit], rep);
342 auto* recoTrack_copy = copyRecoTrack(origRecoTrack, state);
343
344 // set useInFit flags in a copy of recoTrack
345 const auto& recoHitInfos = recoTrack_copy->getRecoHitInformations(true); // true to get sorted hits info
346 if (recoHitInfos.size() != useInFit.size()) {
347 B2ERROR("V0Fitter: copied recoTrack has different number of hits than the original one");
348 return lastRecoTrack;
349 }
350 for (unsigned i = 0; i < recoHitInfos.size(); i++) recoHitInfos[i]->setUseInFit(useInFit[i]);
351
352 // fit a copy of recoTrack
353 TrackFitter fitter;
354 bool ok = fitter.fit(*recoTrack_copy, ptype);
355 if (not ok) return lastRecoTrack;
356
357 return recoTrack_copy;
358}
359
360
361RecoTrack* NewV0Fitter::copyRecoTrack(const RecoTrack* origRecoTrack, const genfit::MeasuredStateOnPlane& state)
362{
363 RecoTrack* newRecoTrack = origRecoTrack->copyToStoreArrayUsing(m_copiedRecoTracks,
364 ROOT::Math::XYZVector(state.getPos()),
365 ROOT::Math::XYZVector(state.getMom()),
366 state.getCharge(),
367 state.get6DCov(), state.getTime());
368 newRecoTrack->addHitsFromRecoTrack(origRecoTrack);
369 newRecoTrack->addRelationTo(origRecoTrack);
370 return newRecoTrack;
371}
372
373
374int NewV0Fitter::isInnermostClusterShared(const RecoTrack* recoTrackPlus, const RecoTrack* recoTrackMinus)
375{
376 const auto& recoHitInformationsPlus = recoTrackPlus->getRecoHitInformations(true); // true to get sorted hits info
377 std::vector<RecoHitInformation*> innerHitsPlus;
378 for (const auto& hitInfo : recoHitInformationsPlus) {
379 if (hitInfo->useInFit()) innerHitsPlus.push_back(hitInfo);
380 if (innerHitsPlus.size() == 2) break;
381 }
382 if (innerHitsPlus.empty()) return 0;
383
384 const auto& recoHitInformationsMinus = recoTrackMinus->getRecoHitInformations(true); // true to get sorted hits info
385 std::vector<RecoHitInformation*> innerHitsMinus;
386 for (const auto& hitInfo : recoHitInformationsMinus) {
387 if (hitInfo->useInFit()) innerHitsMinus.push_back(hitInfo);
388 if (innerHitsMinus.size() == 2) break;
389 }
390 if (innerHitsMinus.empty()) return 0;
391
392 if (innerHitsPlus.front()->getTrackingDetector() != innerHitsMinus.front()->getTrackingDetector()) return 0;
393
394 if (innerHitsPlus.front()->getTrackingDetector() == RecoHitInformation::c_PXD) {
395 const auto* clusterPlus = innerHitsPlus.front()->getRelatedTo<PXDCluster>();
396 const auto* clusterMinus = innerHitsMinus.front()->getRelatedTo<PXDCluster>();
397 if (clusterPlus and clusterPlus == clusterMinus) return 0x03; // PXD cluster the same: set both bits
398 return 0;
399 }
400
401 int flag = 0;
402 VxdID sensorID = 0;
403 if (innerHitsPlus.front()->getTrackingDetector() == RecoHitInformation::c_SVD) {
404 const auto* clusterPlus = innerHitsPlus.front()->getRelatedTo<SVDCluster>();
405 const auto* clusterMinus = innerHitsMinus.front()->getRelatedTo<SVDCluster>();
406 if (clusterPlus and clusterPlus == clusterMinus) {
407 sensorID = clusterPlus->getSensorID();
408 if (clusterPlus->isUCluster()) flag = 0x01; // SVD U-cluster the same: set first bit
409 else flag = 0x02; // SVD V-cluster the same: set second bit
410 }
411 }
412
413 if (innerHitsPlus.size() != 2 or innerHitsMinus.size() != 2) return flag;
414
415 if (innerHitsPlus.back()->getTrackingDetector() == RecoHitInformation::c_SVD) {
416 const auto* clusterPlus = innerHitsPlus.back()->getRelatedTo<SVDCluster>();
417 const auto* clusterMinus = innerHitsMinus.back()->getRelatedTo<SVDCluster>();
418 if (clusterPlus and clusterPlus == clusterMinus and clusterPlus->getSensorID() == sensorID) {
419 if (clusterPlus->isUCluster()) flag |= 0x01; // SVD U-cluster the same: set first bit
420 else flag |= 0x02; // SVD V-cluster the same: set second bit
421 }
422 }
423
424 return flag;
425}
426
427
428const TrackFitResult* NewV0Fitter::saveTrackFitResult(const FittedTrack& trk, int sharedInnermostCluster)
429{
430
431 const auto* recoTrack = trk.recoTrack;
432 if (not recoTrack) {
433 B2ERROR("V0Fitter: bug in saving track fit result, recoTrack is nullptr");
434 return nullptr;
435 }
436
437 auto hitPatternCDC = TrackBuilder::getHitPatternCDCInitializer(*recoTrack);
438 auto hitPatternVXD = TrackBuilder::getHitPatternVXDInitializer(*recoTrack);
439 if (sharedInnermostCluster > 0) {
440 auto pattern = HitPatternVXD(hitPatternVXD);
441 pattern.setInnermostHitShareStatus(sharedInnermostCluster);
442 hitPatternVXD = pattern.getInteger();
443 }
444 double Bz = BFieldManager::getFieldInTesla({0, 0, 0}).Z();
445 const auto& state = trk.state;
446
447 auto* fit = m_trackFitResults.appendNew(ROOT::Math::XYZVector(state.getPos()), ROOT::Math::XYZVector(state.getMom()),
448 state.get6DCov(), state.getCharge(), trk.ptype, trk.pValue,
449 Bz, hitPatternCDC, hitPatternVXD, trk.Ndf);
450 return fit;
451}
static ROOT::Math::XYZVector getFieldInTesla(const ROOT::Math::XYZVector &pos)
return the magnetic field at a given position in Tesla.
The ParticleType class for identifying different particle types.
Definition Const.h:409
int getPDGCode() const
PDG code.
Definition Const.h:474
static const ParticleType Lambda
Lambda particle.
Definition Const.h:680
static const ChargedStable pion
charged pion particle
Definition Const.h:662
static const ParticleType antiLambda
Anti-Lambda particle.
Definition Const.h:681
static const ChargedStable proton
proton particle
Definition Const.h:664
static const ParticleType invalidParticle
Invalid particle, used internally.
Definition Const.h:682
static const ParticleType Kshort
K^0_S particle.
Definition Const.h:678
static const ParticleType photon
photon particle
Definition Const.h:674
static const ChargedStable electron
electron particle
Definition Const.h:660
@ c_WriteOut
Object/array should be saved by output modules.
Definition DataStore.h:70
@ c_ErrorIfAlreadyRegistered
If the object/array was already registered, produce an error (aborting initialisation).
Definition DataStore.h:72
Hit pattern of the VXD within a track.
StoreArray< V0ValidationVertex > m_validationV0s
V0ValidationVertex collection (optional)
StoreArray< RecoTrack > m_copiedRecoTracks
copied RecoTracks collection
FittedTrack m_trkPlus
positively charged track data of last successfully fitted vertex
bool m_validation
validation flag
StoreArray< V0 > m_v0s
V0s collection.
double m_vertexDistanceCut
cut on the transverse radius
double m_vertexChi2Cut
Chi2 cut.
StoreArray< TrackFitResult > m_trackFitResults
TrackFitResults collection.
bool fitAndStore(const Track *trackPlus, const Track *trackMinus, const Const::ParticleType &v0Hypothesis, bool &isForceStored, bool &isHitRemoved)
Fit V0 with given hypothesis and store results if fit is successful.
static int extrapolateToVertex(genfit::MeasuredStateOnPlane &statePlus, genfit::MeasuredStateOnPlane &stateMinus, const genfit::GFRaveVertex &vertex)
Extrapolation of both tracks to the vertex.
double m_momentum
momentum of last successfully fitted vertex
@ c_NoTrackRepresentation
no track representation for given PDG code
@ c_NotSelected
fitted vertex not passing the cuts
@ c_VertexFitFailed
vertex fit failed
@ c_ExtrapolationFailed
track extrapolation failed
static bool setCardinalRep(genfit::Track &gfTrack, int pdgCode)
Sets cardinal representation of a given genfit track and PDG code.
std::string m_recoTracksName
name of the RecoTracks collection
const TrackFitResult * saveTrackFitResult(const FittedTrack &trk, int sharedInnermostCluster)
Append track fit result to the collection.
int isInnermostClusterShared(const RecoTrack *recoTrackPlus, const RecoTrack *recoTrackMinus)
Returns bit flags indicating that the innermost cluster is shared between both tracks.
static const genfit::AbsTrackRep * getTrackRepresentation(const RecoTrack *recoTrack, int pdgCode)
Returns track representation for a given PDG code.
std::map< int, std::pair< double, double > > m_invMassCuts
invariant mass cuts, key = abs(PDG)
NewV0Fitter(const std::string &trackFitResultsName="", const std::string &v0sName="", const std::string &v0ValidationVerticesName="", const std::string &recoTracksName="", const std::string &copiedRecoTracksName="CopiedRecoTracks", bool enableValidation=false)
Constructor.
StoreArray< RecoTrack > m_recoTracks
RecoTracks collection.
genfit::GFRaveVertex m_fittedVertex
last successfully fitted vertex
static std::pair< Const::ParticleType, Const::ParticleType > getTrackHypotheses(const Const::ParticleType &v0Hypothesis)
Returns daughter particle types for a given V0 hypothesis.
std::unique_ptr< V0VertexFitter > m_vertexFitter
vertex fitter used to fit the V0 vertex
void initializeCuts(double vertexDistanceCut, double vertexChi2Cut, const std::tuple< double, double > &invMassRangeKshort, const std::tuple< double, double > &invMassRangeLambda, const std::tuple< double, double > &invMassRangePhoton)
Initialization of cuts applied during the fit and store process.
double m_invMass
invariant mass of last successfully fitted vertex
int m_fitterMode
fitter mode
FittedTrack m_trkMinus
negatively charged track data of last successfully fitted vertex
@ c_BitTrackMinus
negative track has inner hits
@ c_BitTrackPlus
positive track has inner hits
int vertexFit(const RecoTrack *recoTrackPlus, const RecoTrack *recoTrackMinus, int pdgTrackPlus, int pdgTrackMinus, const Const::ParticleType &v0Hypothesis)
Performs a vertex fit.
RecoTrack * copyRecoTrack(const RecoTrack *origRecoTrack, const genfit::MeasuredStateOnPlane &state)
Make a copy of reco track.
const RecoTrack * removeHitsAndRefit(const RecoTrack *origRecoTrack, const RecoTrack *lastRecoTrack, const Const::ParticleType &ptype)
Remove track inner hits and refit the track.
The PXD Cluster class This class stores all information about reconstructed PXD clusters The position...
Definition PXDCluster.h:30
This is the Reconstruction Event-Data Model Track.
Definition RecoTrack.h:79
size_t addHitsFromRecoTrack(const RecoTrack *recoTrack, unsigned int sortingParameterOffset=0, bool reversed=false, std::optional< double > optionalMinimalWeight=std::nullopt)
Add all hits from another RecoTrack to this RecoTrack.
Definition RecoTrack.cc:240
bool wasFitSuccessful(const genfit::AbsTrackRep *representation=nullptr) const
Returns true if the last fit with the given representation was successful.
Definition RecoTrack.cc:337
RecoTrack * copyToStoreArrayUsing(StoreArray< RecoTrack > &storeArray, const ROOT::Math::XYZVector &position, const ROOT::Math::XYZVector &momentum, short charge, const TMatrixDSym &covariance, double timeSeed) const
Append a new RecoTrack to the given store array and copy its general properties, but not the hits the...
Definition RecoTrack.cc:511
std::vector< RecoHitInformation * > getRecoHitInformations(bool getSorted=false) const
Return a list of all RecoHitInformations associated with the RecoTrack.
Definition RecoTrack.cc:558
static void registerRequiredRelations(const StoreArray< RecoTrack > &recoTracks, std::string const &pxdHitsStoreArrayName="", std::string const &svdHitsStoreArrayName="", std::string const &cdcHitsStoreArrayName="", std::string const &bklmHitsStoreArrayName="", std::string const &eklmHitsStoreArrayName="", std::string const &recoHitInformationStoreArrayName="")
Convenience method which registers all relations required to fully use a RecoTrack.
Definition RecoTrack.cc:53
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlaneFromFirstHit(const genfit::AbsTrackRep *representation=nullptr) const
Return genfit's MeasuredStateOnPlane for the first hit in a fit useful for extrapolation of measureme...
Definition RecoTrack.cc:606
genfit::AbsTrackRep * getTrackRepresentationForPDG(int pdgCode) const
Return an already created track representation of the given reco track for the PDG.
Definition RecoTrack.cc:476
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlaneFromRecoHit(const RecoHitInformation *recoHitInfo, const genfit::AbsTrackRep *representation=nullptr) const
Return genfit's MeasuredStateOnPlane on plane for associated with one RecoHitInformation.
Definition RecoTrack.cc:580
const genfit::Track & getGenfitTrack() const
Returns genfit track.
Definition RecoTrack.h:503
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
The SVD Cluster class This class stores all information about reconstructed SVD clusters.
Definition SVDCluster.h:29
VxdID getSensorID() const
Get the sensor ID.
Definition SVDCluster.h:102
static uint32_t getHitPatternVXDInitializer(const RecoTrack &recoTrack, const genfit::AbsTrackRep *representation=nullptr)
Get the HitPattern in the VXD.
static uint64_t getHitPatternCDCInitializer(const RecoTrack &recoTrack, const genfit::AbsTrackRep *representation=nullptr)
Get the HitPattern in the CDC.
Values of the result of a track fit with a given particle hypothesis.
Const::ParticleType getParticleType() const
Getter for ParticleType of the mass hypothesis of the track fit.
Algorithm class to handle the fitting of RecoTrack objects.
bool fit(RecoTrack &recoTrack, genfit::AbsTrackRep *trackRepresentation, bool resortHits=false) const
Fit a reco track with a given non-default track representation.
Class that bundles various TrackFitResults.
Definition Track.h:25
const TrackFitResult * getTrackFitResultWithClosestMass(const Const::ChargedStable &requestedType) const
Return the track fit for the fit hypothesis with the closest mass.
Definition Track.cc:104
Factory creating the V0VertexFitter selected at run time.
Class to uniquely identify a any structure of the PXD and SVD.
Definition VxdID.h:32
Abstract base class for different kinds of events.
Structure to save track data of the last successful iteration.
Definition NewV0Fitter.h:40
double pValue
p-value of track fit
Definition NewV0Fitter.h:44
genfit::MeasuredStateOnPlane state
measured state at first hit, extrapolated to fitted vertex
Definition NewV0Fitter.h:43
Const::ParticleType ptype
particle type of the V0 track
Definition NewV0Fitter.h:42
const RecoTrack * recoTrack
reco track
Definition NewV0Fitter.h:41
int Ndf
degrees-of-freedom of track fit
Definition NewV0Fitter.h:45