Belle II Software  release-05-01-25
SimpleSVDStateFilter.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2017 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Nils Braun *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #include <tracking/ckf/svd/filters/states/SimpleSVDStateFilter.h>
11 
12 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory3D.h>
13 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
14 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectorySZ.h>
15 #include <tracking/trackFindingCDC/geometry/Vector3D.h>
16 
17 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCBFieldUtil.h>
18 #include <tracking/spacePointCreation/SpacePoint.h>
19 #include <tracking/dataobjects/RecoTrack.h>
20 
21 using namespace Belle2;
22 using namespace TrackFindingCDC;
23 
24 namespace {
26  unsigned int getPTRange(const TrackFindingCDC::Vector3D& momentum)
27  {
28  const double pT = momentum.xy().norm();
29  if (pT > 0.4) {
30  return 0;
31  } else if (pT > 0.2) {
32  return 1;
33  } else {
34  return 2;
35  }
36  }
37 }
38 
39 constexpr const double SimpleSVDStateFilter::m_param_maximumHelixDistance[][3];
40 constexpr const double SimpleSVDStateFilter::m_param_maximumResidual[][3];
41 constexpr const double SimpleSVDStateFilter::m_param_maximumResidual2[][3];
42 
44 {
46 }
47 
49 {
50  const std::vector<TrackFindingCDC::WithWeight<const CKFToSVDState*>>& previousStates = pair.first;
51  CKFToSVDState* currentState = pair.second;
52 
53  const auto* spacePoint = currentState->getHit();
54 
55  genfit::MeasuredStateOnPlane firstMeasurement;
56  if (currentState->mSoPSet()) {
57  firstMeasurement = currentState->getMeasuredStateOnPlane();
58  } else {
59  firstMeasurement = previousStates.back()->getMeasuredStateOnPlane();
60  }
61 
62  Vector3D position = Vector3D(firstMeasurement.getPos());
63  Vector3D momentum = Vector3D(firstMeasurement.getMom());
64 
65  const Vector3D hitPosition = static_cast<Vector3D>(spacePoint->getPosition());
66 
67  const bool sameHemisphere = fabs(position.phi() - hitPosition.phi()) < TMath::PiOver2();
68  if (not sameHemisphere) {
69  return NAN;
70  }
71 
72 
73  double valueToCheck;
74  const MaximalValueArray* maximumValues;
75 
76  if (not currentState->isFitted() and not currentState->mSoPSet()) {
77  // Filter 1
78  const RecoTrack* cdcTrack = previousStates.front()->getSeed();
79 
80  B2ASSERT("A path without a seed?", cdcTrack);
81 
82  const CDCTrajectory3D trajectory(position, 0, momentum, cdcTrack->getChargeSeed(), m_cachedBField);
83 
84  const double arcLength = trajectory.calcArcLength2D(hitPosition);
85  const Vector2D& trackPositionAtHit2D = trajectory.getTrajectory2D().getPos2DAtArcLength2D(arcLength);
86  const double trackPositionAtHitZ = trajectory.getTrajectorySZ().mapSToZ(arcLength);
87  const Vector3D trackPositionAtHit(trackPositionAtHit2D, trackPositionAtHitZ);
88  const Vector3D differenceHelix = trackPositionAtHit - hitPosition;
89 
90  valueToCheck = differenceHelix.norm();
91  maximumValues = &m_param_maximumHelixDistance;
92  } else {
93  // Filter 2 + 3
94  const double residual = m_kalmanStepper.calculateResidual(firstMeasurement, *currentState);
95  valueToCheck = residual;
96  if (currentState->isFitted()) {
97  maximumValues = &m_param_maximumResidual2;
98  } else {
99  maximumValues = &m_param_maximumResidual;
100  }
101  }
102 
103  const unsigned int layer = currentState->getGeometricalLayer();
104  if (valueToCheck > (*maximumValues)[layer - 3][getPTRange(momentum)]) {
105  return NAN;
106  }
107 
108  return valueToCheck;
109 }
Belle2::Vector3D
HepGeom::Vector3D< double > Vector3D
3D Vector
Definition: Cell.h:35
Belle2::SimpleSVDStateFilter::m_param_maximumResidual2
static constexpr const MaximalValueArray m_param_maximumResidual2
Maximum distance calculated with normal extrapolation in filter 2. Numbers calculated on MC.
Definition: SimpleSVDStateFilter.h:67
genfit::MeasuredStateOnPlane
#StateOnPlane with additional covariance matrix.
Definition: MeasuredStateOnPlane.h:39
Belle2::CKFState::getMeasuredStateOnPlane
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlane() const
Get the mSoP if already set during extrapolation (or fitting)
Definition: CKFState.h:103
Belle2::CKFState::mSoPSet
bool mSoPSet() const
Is the mSoP already set? (= state was already extrapolated)
Definition: CKFState.h:116
Belle2::SimpleSVDStateFilter::MaximalValueArray
double[4][3] MaximalValueArray
Shortcut for a 4x3 array.
Definition: SimpleSVDStateFilter.h:47
Belle2::RecoTrack
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:78
Belle2::SimpleSVDStateFilter::beginRun
void beginRun() final
Set the cached B field.
Definition: SimpleSVDStateFilter.cc:43
Belle2::CKFToSVDState::getGeometricalLayer
unsigned int getGeometricalLayer() const
Extract the real layer this state sits on.
Definition: CKFToSVDState.cc:33
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TrackFindingCDC::Vector3D
A three dimensional vector.
Definition: Vector3D.h:34
Belle2::SimpleSVDStateFilter::m_param_maximumResidual
static constexpr const MaximalValueArray m_param_maximumResidual
Maximum distance calculated with normal extrapolation in filter 3. Numbers calculated on MC.
Definition: SimpleSVDStateFilter.h:59
Belle2::SimpleSVDStateFilter::operator()
TrackFindingCDC::Weight operator()(const BaseSVDStateFilter::Object &pair) final
Function to evaluate the object.
Definition: SimpleSVDStateFilter.cc:48
Belle2::TrackFindingCDC::CDCBFieldUtil::getBFieldZ
static double getBFieldZ()
Getter for the signed magnetic field stength in z direction at the origin ( in Tesla )
Definition: CDCBFieldUtil.cc:40
Belle2::CKFState::getHit
const Hit * getHit() const
Return the SP this state is related to. May be nullptr.
Definition: CKFState.h:76
Belle2::CKFState::isFitted
bool isFitted() const
Check if state was already fitted.
Definition: CKFState.h:110
Belle2::SimpleSVDStateFilter::m_param_maximumHelixDistance
static constexpr const MaximalValueArray m_param_maximumHelixDistance
Maximum distance calculated with helix extrapolation in filter 1. Numbers calculated on MC.
Definition: SimpleSVDStateFilter.h:50
Belle2::RecoTrack::getChargeSeed
short int getChargeSeed() const
Return the charge seed stored in the reco track. ATTENTION: This is not the fitted charge.
Definition: RecoTrack.h:497
Belle2::CKFToSVDState
Specialized CKF State for extrapolating into the SVD.
Definition: CKFToSVDState.h:29
Belle2::TrackFindingCDC::Filter::Object
AObject Object
Type of the object to be analysed.
Definition: Filter.dcl.h:43