1 #include <tracking/v0Finding/fitter/V0Fitter.h>
3 #include <framework/logging/Logger.h>
4 #include <framework/datastore/StoreArray.h>
5 #include <tracking/v0Finding/dataobjects/VertexVector.h>
6 #include <tracking/dataobjects/RecoTrack.h>
7 #include <tracking/trackFitting/fitter/base/TrackFitter.h>
8 #include <tracking/trackFitting/trackBuilder/factories/TrackBuilder.h>
10 #include <mdst/dataobjects/HitPatternVXD.h>
11 #include <mdst/dataobjects/HitPatternCDC.h>
12 #include <mdst/dataobjects/Track.h>
13 #include <mdst/dataobjects/TrackFitResult.h>
14 #include <cdc/dataobjects/CDCRecoHit.h>
15 #include <pxd/reconstruction/PXDRecoHit.h>
16 #include <svd/reconstruction/SVDRecoHit.h>
17 #include <svd/reconstruction/SVDRecoHit2D.h>
19 #include <genfit/Track.h>
20 #include <genfit/TrackPoint.h>
21 #include <genfit/MeasuredStateOnPlane.h>
22 #include <genfit/GFRaveVertexFactory.h>
23 #include <genfit/GFRaveVertex.h>
24 #include <genfit/FieldManager.h>
25 #include <genfit/MaterialEffects.h>
26 #include <genfit/FitStatus.h>
27 #include <genfit/KalmanFitStatus.h>
28 #include <genfit/KalmanFitterInfo.h>
30 #include <framework/utilities/IOIntercept.h>
35 const std::string& v0ValidationVerticesName,
const std::string& recoTracksName,
36 const std::string& copiedRecoTracksName,
bool enableValidation)
37 : m_validation(enableValidation), m_recoTracksName(recoTracksName), m_v0FitterMode(1), m_forcestore(false),
38 m_useOnlyOneSVDHitPair(true)
45 B2DEBUG(24,
"Register DataStore for validation.");
62 B2ASSERT(genfit::MaterialEffects::getInstance()->isInitialized(),
63 "Material effects not set up. Please use SetupGenfitExtrapolationModule.");
65 "Magnetic field not set up. Please use SetupGenfitExtrapolationModule.");
70 if (not(0 <= fitterMode && fitterMode <= 2)) {
71 B2FATAL(
"Invalid fitter mode!");
73 m_v0FitterMode = fitterMode;
86 double vertexChi2CutOutside)
95 const TVector3& posPlus = stPlus.getPos();
96 const TVector3& posMinus = stMinus.getPos();
98 const double Rstart = std::min(posPlus.Perp(), posMinus.Perp());
100 stPlus.extrapolateToCylinder(Rstart);
101 stMinus.extrapolateToCylinder(Rstart);
103 B2DEBUG(22,
"Extrapolation to cylinder failed.");
114 std::vector<genfit::Track*> trackPair {&trackPlus, &trackMinus};
122 vertexFactory.findVertices(&vertexVector.
v, trackPair);
124 B2ERROR(
"Exception during vertex fit.");
128 if (vertexVector.
size() != 1) {
129 B2DEBUG(21,
"Vertex fit failed. Size of vertexVector not 1, but: " << vertexVector.
size());
133 if ((*vertexVector[0]).getNTracks() != 2) {
134 B2DEBUG(20,
"Wrong number of tracks in vertex.");
138 vertex = *vertexVector[0];
145 const TVector3& vertexPosition,
unsigned int& hasInnerHitStatus)
148 hasInnerHitStatus = 0;
153 double extralengthPlus = stPlus.extrapolateToPoint(vertexPosition);
154 double extralengthMinus = stMinus.extrapolateToPoint(vertexPosition);
155 if (extralengthPlus > 0) hasInnerHitStatus |= 0x1;
156 if (extralengthMinus > 0) hasInnerHitStatus |= 0x2;
161 B2DEBUG(22,
"Could not extrapolate track to vertex.");
186 msop.get6DCov(), msop.getCharge(),
188 track.getFitStatus()->getPVal(),
189 Bz, hitPatternCDCInitializer, hitPatternVXDInitializer, track.getFitStatus()->getNdf());
190 return v0TrackFitResult;
204 B2FATAL(
"Given V0Hypothesis not available.");
219 unsigned int hasInnerHitStatus = 0;
222 TVector3 vertexPos(0, 0, 0);
240 bool failflag =
false;
241 unsigned int nRemoveHitsPlus = 0;
242 unsigned int nRemoveHitsMinus = 0;
254 if ((recoTrackPlus_forRefit ==
nullptr) or (recoTrackMinus_forRefit ==
nullptr))
257 while (hasInnerHitStatus != 0) {
262 if (hasInnerHitStatus & 0x1) {
266 if (not
removeInnerHits(recoTrackPlus, recoTrackPlus_forRefit, pdg_trackPlus, nRemoveHitsPlus)) {
273 if (hasInnerHitStatus & 0x2) {
277 if (not
removeInnerHits(recoTrackMinus, recoTrackMinus_forRefit, -1 * pdg_trackMinus, nRemoveHitsMinus)) {
284 hasInnerHitStatus = 0;
288 v0Hypothesis, hasInnerHitStatus, vertexPos,
false)) {
297 bool forcestore =
true;
299 hasInnerHitStatus, vertexPos, forcestore)) {
300 B2WARNING(
"original vertex fit fails. this should not happen.");
313 unsigned int& hasInnerHitStatus, TVector3& vertexPos,
314 const bool forceStore)
322 if ((plusRepresentation ==
nullptr) or (not recoTrackPlus->
wasFitSuccessful(plusRepresentation))) {
323 B2ERROR(
"Track hypothesis with closest mass not available. Should never happen, but I can continue savely anyway.");
331 if ((minusRepresentation ==
nullptr) or (not recoTrackMinus->
wasFitSuccessful(minusRepresentation))) {
332 B2ERROR(
"Track hypothesis with closest mass not available. Should never happen, but I can continue savely anyway.");
337 std::vector<genfit::AbsTrackRep*> repsPlus = gfTrackPlus.
getTrackReps();
338 std::vector<genfit::AbsTrackRep*> repsMinus = gfTrackMinus.
getTrackReps();
339 if (repsPlus.size() == repsMinus.size()) {
340 for (
unsigned int id = 0;
id < repsPlus.size();
id++) {
341 if (abs(repsPlus[
id]->getPDG()) == pdgTrackPlus)
342 gfTrackPlus.setCardinalRep(
id);
343 if (abs(repsMinus[
id]->getPDG()) == pdgTrackMinus)
344 gfTrackMinus.setCardinalRep(
id);
349 for (
unsigned int id = 0;
id < repsPlus.size();
id++) {
350 if (abs(repsPlus[
id]->getPDG()) == pdgTrackPlus)
351 gfTrackPlus.setCardinalRep(
id);
353 for (
unsigned int id = 0;
id < repsMinus.size();
id++) {
354 if (abs(repsMinus[
id]->getPDG()) == pdgTrackMinus)
355 gfTrackMinus.setCardinalRep(
id);
378 const TVector3& posVert(vert.
getPos());
387 B2DEBUG(22,
"Vertex outside beam pipe, chi^2 too large.");
392 B2DEBUG(22,
"Vertex accepted.");
399 if (forceStore || hasInnerHitStatus == 0) {
403 const TVector3 origin(0, 0, 0);
409 B2DEBUG(20,
"Creating new V0.");
410 auto v0 =
m_v0s.appendNew(std::make_pair(trackPlus, tfrPlusVtx),
411 std::make_pair(trackMinus, tfrMinusVtx));
414 B2DEBUG(24,
"Create StoreArray and Output for validation.");
417 TLorentzVector lv0, lv1;
419 lv0.SetVectM(tr0->getMom(), trackHypotheses.first.getMass());
420 lv1.SetVectM(tr1->getMom(), trackHypotheses.second.getMass());
422 std::make_pair(trackPlus, tfrPlusVtx),
423 std::make_pair(trackMinus, tfrMinusVtx),
430 v0->addRelationTo(validationV0);
449 if (not fitter.fit(*newRecoTrack, particleUsedForFitting)) {
450 B2WARNING(
"track fit failed for copied RecoTrack.");
453 B2WARNING(
"\t original track fit was also failed.");
461 const int trackPDG,
unsigned int& nRemoveHits)
470 if (recoHitInformations.size() < nRemoveHits) {
471 B2WARNING(
"N removed hits exceeds N hits in the track.");
474 for (
unsigned int i = 0 ; i < nRemoveHits ; ++i) {
475 recoHitInformations[i]->setUseInFit(
false);
479 if (recoHitInformations[nRemoveHits - 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD) {
480 if (recoHitInformations.size() < nRemoveHits + 1) {
481 B2WARNING(
"N removed hits exceeds N hits in the track.");
484 if (recoHitInformations[nRemoveHits]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD) {
485 const SVDCluster* lastRemovedSVDHit = recoHitInformations[nRemoveHits - 1]->getRelatedTo<
SVDCluster>();
487 if (lastRemovedSVDHit->
getSensorID() == nextSVDHit->getSensorID() &&
488 lastRemovedSVDHit->
isUCluster() && !(nextSVDHit->isUCluster())) {
489 recoHitInformations[nRemoveHits]->setUseInFit(
false);
497 recoHitInformations[nRemoveHits - 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
498 recoHitInformations.size() > nRemoveHits + 2) {
499 if (recoHitInformations[nRemoveHits ]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
500 recoHitInformations[nRemoveHits + 1]->getTrackingDetector() == RecoHitInformation::RecoHitDetector::c_SVD &&
501 recoHitInformations[nRemoveHits + 2]->getTrackingDetector() != RecoHitInformation::RecoHitDetector::c_SVD) {
502 recoHitInformations[nRemoveHits ]->setUseInFit(
false);
503 recoHitInformations[nRemoveHits + 1]->setUseInFit(
false);
510 if (not fitter.fit(*recoTrack, particleUsedForFitting)) {
511 B2WARNING(
"track fit failed.");
514 B2WARNING(
"\t original track fit was also failed.");