Belle II Software  release-08-01-10
SVDStateBasicVarSet.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 
9 #include <tracking/ckf/svd/filters/states/SVDStateBasicVarSet.h>
10 
11 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory3D.h>
12 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
13 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectorySZ.h>
14 #include <tracking/trackFindingCDC/geometry/Vector3D.h>
15 
16 #include <tracking/spacePointCreation/SpacePoint.h>
17 #include <tracking/dataobjects/RecoTrack.h>
18 
19 using namespace Belle2;
20 using namespace TrackFindingCDC;
21 
23 {
24  const std::vector<TrackFindingCDC::WithWeight<const CKFToSVDState*>>& previousStates = pair->first;
25  CKFToSVDState* state = pair->second;
26 
27  const RecoTrack* cdcTrack = previousStates.front()->getSeed();
28  B2ASSERT("Path without seed?", cdcTrack);
29 
30  const SpacePoint* spacePoint = state->getHit();
31  B2ASSERT("Path without hit?", spacePoint);
32 
33  genfit::MeasuredStateOnPlane firstMeasurement;
34  if (state->mSoPSet()) {
35  firstMeasurement = state->getMeasuredStateOnPlane();
36  } else {
37  B2ASSERT("Previous state was not fitted?", previousStates.back()->mSoPSet());
38  firstMeasurement = previousStates.back()->getMeasuredStateOnPlane();
39  }
40 
41  Vector3D position = Vector3D(firstMeasurement.getPos());
42  Vector3D momentum = Vector3D(firstMeasurement.getMom());
43 
44  const CDCTrajectory3D trajectory(position, 0, momentum, cdcTrack->getChargeSeed());
45 
46  const Vector3D& hitPosition = static_cast<Vector3D>(spacePoint->getPosition());
47 
48  const double arcLength = trajectory.calcArcLength2D(hitPosition);
49  const Vector2D& trackPositionAtHit2D = trajectory.getTrajectory2D().getPos2DAtArcLength2D(arcLength);
50  double trackPositionAtHitZ = trajectory.getTrajectorySZ().mapSToZ(arcLength);
51 
52  Vector3D trackPositionAtHit(trackPositionAtHit2D, trackPositionAtHitZ);
53  Vector3D distance = trackPositionAtHit - hitPosition;
54 
55  var<named("distance")>() = static_cast<Float_t>(distance.norm());
56  var<named("xy_distance")>() = static_cast<Float_t>(distance.xy().norm());
57  var<named("z_distance")>() = static_cast<Float_t>(distance.z());
58 
59  Vector3D mSoP_distance = position - hitPosition;
60 
61  var<named("mSoP_distance")>() = static_cast<Float_t>(mSoP_distance.norm());
62  var<named("mSoP_xy_distance")>() = static_cast<Float_t>(mSoP_distance.xy().norm());
63  var<named("mSoP_z_distance")>() = static_cast<Float_t>(mSoP_distance.z());
64 
65  var<named("same_hemisphere")>() = fabs(position.phi() - hitPosition.phi()) < TMath::PiOver2();
66 
67  var<named("arcLengthOfHitPosition")>() = static_cast<Float_t>(trajectory.calcArcLength2D(hitPosition));
68  var<named("arcLengthOfCenterPosition")>() = static_cast<Float_t>(trajectory.calcArcLength2D(Vector3D(0, 0, 0)));
69 
70  var<named("layer")>() = spacePoint->getVxdID().getLayerNumber();
71  var<named("number")>() = previousStates.size();
72 
73  var<named("pt")>() = static_cast<Float_t>(momentum.xy().norm());
74  var<named("tan_lambda")>() = static_cast<Float_t>(trajectory.getTanLambda());
75  var<named("phi")>() = static_cast<Float_t>(momentum.phi());
76 
77  const VxdID& sensorInfo = spacePoint->getVxdID();
78 
79  var<named("ladder")>() = sensorInfo.getLadderNumber();
80  var<named("sensor")>() = sensorInfo.getSensorNumber();
81  var<named("segment")>() = sensorInfo.getSegmentNumber();
82  var<named("id")>() = sensorInfo.getID();
83 
84  var<named("last_layer")>() = 0;
85  var<named("last_ladder")>() = 0;
86  var<named("last_sensor")>() = 0;
87  var<named("last_segment")>() = 0;
88  var<named("last_id")>() = 0;
89 
90  const CKFToSVDState* parent = previousStates.back();
91  const SpacePoint* parentSpacePoint = parent->getHit();
92  if (parentSpacePoint) {
93  const VxdID& parentSensorInfo = parentSpacePoint->getVxdID();
94 
95  var<named("last_layer")>() = parentSensorInfo.getLayerNumber();
96  var<named("last_ladder")>() = parentSensorInfo.getLadderNumber();
97  var<named("last_sensor")>() = parentSensorInfo.getSensorNumber();
98  var<named("last_segment")>() = parentSensorInfo.getSegmentNumber();
99  var<named("last_id")>() = parentSensorInfo.getID();
100  }
101 
102  const double residual = m_kalmanStepper.calculateResidual(firstMeasurement, *state);
103  var<named("residual")>() = residual;
104 
105  if (state->isFitted()) {
106  var<named("chi2")>() = static_cast<Float_t>(state->getChi2());
107  } else {
108  var<named("chi2")>() = -999;
109  }
110 
111  const TMatrixDSym& cov5 = firstMeasurement.getCov();
112  const Float_t sigmaUV = std::sqrt(std::max(cov5(4, 4), cov5(3, 3)));
113  var<named("sigma_uv")>() = sigmaUV;
114  var<named("residual_over_sigma")>() = residual / sigmaUV;
115 
116  return true;
117 }
double getChi2() const
Return the chi2 set during fitting. Is only valid after fitting.
Definition: CKFState.h:72
bool isFitted() const
Check if state was already fitted.
Definition: CKFState.h:100
const genfit::MeasuredStateOnPlane & getMeasuredStateOnPlane() const
Get the mSoP if already set during extrapolation (or fitting)
Definition: CKFState.h:93
const Hit * getHit() const
Return the SP this state is related to. May be nullptr.
Definition: CKFState.h:66
bool mSoPSet() const
Is the mSoP already set? (= state was already extrapolated)
Definition: CKFState.h:106
Specialized CKF State for extrapolating into the SVD.
Definition: CKFToSVDState.h:27
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:79
short int getChargeSeed() const
Return the charge seed stored in the reco track. ATTENTION: This is not the fitted charge.
Definition: RecoTrack.h:508
virtual bool extract(const BaseSVDStateFilter::Object *pair) override
Generate and assign the variables from the VXD-CDC-pair.
SpacePoint typically is build from 1 PXDCluster or 1-2 SVDClusters.
Definition: SpacePoint.h:42
const B2Vector3< double > & getPosition() const
return the position vector in global coordinates
Definition: SpacePoint.h:138
VxdID getVxdID() const
Return the VxdID of the sensor on which the the cluster of the SpacePoint lives.
Definition: SpacePoint.h:148
Vector2D getPos2DAtArcLength2D(double arcLength2D)
Getter for the position at a given two dimensional arc length.
Particle full three dimensional trajectory.
double calcArcLength2D(const Vector3D &point) const
Calculate the travel distance from the start position of the trajectory.
CDCTrajectory2D getTrajectory2D() const
Getter for the two dimensional trajectory.
CDCTrajectorySZ getTrajectorySZ() const
Getter for the sz trajectory.
double getTanLambda() const
Getter for the slope of z over the transverse travel distance s.
double mapSToZ(const double s=0) const
Translates the travel distance to the z coordinate.
AObject Object
Type of the object to be analysed.
Definition: Filter.dcl.h:33
A two dimensional vector which is equipped with functions for correct handeling of orientation relat...
Definition: Vector2D.h:35
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:33
baseType getID() const
Get the unique id.
Definition: VxdID.h:94
baseType getSensorNumber() const
Get the sensor id.
Definition: VxdID.h:100
baseType getSegmentNumber() const
Get the sensor segment.
Definition: VxdID.h:102
baseType getLadderNumber() const
Get the ladder id.
Definition: VxdID.h:98
baseType getLayerNumber() const
Get the layer id.
Definition: VxdID.h:96
#StateOnPlane with additional covariance matrix.
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
HepGeom::Vector3D< double > Vector3D
3D Vector
Definition: Cell.h:34
Abstract base class for different kinds of events.