Belle II Software  release-06-01-15
PlanarVXDMomentumMeasurement.h
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 #pragma once
10 
11 #include <tracking/trackFitting/measurementCreator/measurements/PlanarMomentumMeasurement.h>
12 #include <tracking/vxdMomentumEstimation/VXDMomentumEstimation.h>
13 #include <tracking/vxdMomentumEstimation/VXDMomentumEstimationTools.h>
14 #include <mdst/dataobjects/MCParticle.h>
15 #include <tracking/dataobjects/RecoTrack.h>
16 
17 namespace Belle2 {
26  template <class HitType>
28 
29  public:
34  PlanarVXDMomentumMeasurement(const genfit::PlanarMeasurement& parentElement, HitType* hit, const Belle2::RecoTrack* recoTrack) :
35  PlanarMomentumMeasurement(parentElement), m_hit(hit), m_recoTrack(recoTrack)
36  {
37  rawHitCoords_.ResizeTo(1);
38  rawHitCov_.ResizeTo(1, 1);
39 
40  setHitId(hit->getArrayIndex());
41  setDetId(getDetId());
42  }
43 
45  virtual genfit::AbsMeasurement* clone() const override {return new PlanarVXDMomentumMeasurement(*this);}
46 
48  virtual std::vector<genfit::MeasurementOnPlane*> constructMeasurementsOnPlane(const genfit::StateOnPlane& state) const override;
49 
52  {
53  m_correctionFitParameters = correctionFitParameters;
54  }
55 
57  void setSigma(double sigma)
58  {
59  m_sigma = sigma;
60  }
61 
64  {
65  m_fitParameters = fitParameters;
66  }
67 
69  void setUseMCInformation(bool useMCInformation)
70  {
71  m_useMCInformation = useMCInformation;
72  }
73 
75  void setUseThickness(bool useThickness)
76  {
77  m_useThickness = useThickness;
78  }
79 
81  void setUseTrackingSeeds(bool useTrackingSeeds)
82  {
83  m_useTrackingSeeds = useTrackingSeeds;
84  }
85 
87  HitType* getHit() const
88  {
89  return m_hit;
90  }
91 
92  private:
98  bool m_useThickness = false;
100  bool m_useMCInformation = true;
102  bool m_useTrackingSeeds = false;
104  double m_sigma = 0.03;
105 
107  HitType* m_hit = nullptr;
109  const RecoTrack* m_recoTrack = nullptr;
110 
112  int getDetId() const
113  {
114  return -1;
115  }
116  };
117 
121  template <class HitType>
123  const genfit::StateOnPlane& state) const
124  {
127 
128  TVectorD rawHitCoordinates(1);
129  TMatrixDSym rawHitCovariance(1);
130 
131  // Copy the information from the current state
132  const TVector3& statePosition(state.getPos());
133  const TVector3& stateMomentum(state.getMom());
134  short stateCharge = state.getCharge();
135 
136 
137  // Copy the information from the reco track.
138  const TVector3& trackPosition(m_recoTrack->getPositionSeed());
139  const TVector3& trackMomentum(m_recoTrack->getMomentumSeed());
140  short trackCharge = m_recoTrack->getChargeSeed();
141 
142  // Copy the information from the mc particle (if there is one)
143  MCParticle* relatedMCParticle = m_hit->template getRelated<MCParticle>("MCParticles");
144 
145  TVector3 mcMomentum;
146  TVector3 mcPostion;
147  short mcCharge;
148 
149  if (relatedMCParticle == nullptr) {
150  mcMomentum = trackMomentum;
151  mcPostion = trackPosition;
152  mcCharge = trackCharge;
153  } else {
154  mcMomentum = relatedMCParticle->getMomentum();
155  mcPostion = relatedMCParticle->getProductionVertex();
156  mcCharge = relatedMCParticle->getCharge();
157  }
158 
159  // Copy information from the mc hit
160  const TVector3& hitMCMomentum = momentumEstimationTools.getEntryMomentumOfMCParticle(*m_hit);
161  const TVector3& hitMCPosition = momentumEstimationTools.getEntryPositionOfMCParticle(*m_hit);
162 
163 
164  if (m_useThickness) {
165  rawHitCoordinates(0) = momentumEstimator.estimateQOverPWithThickness(*m_hit, stateCharge, m_fitParameters,
166  m_correctionFitParameters);
167  } else {
168  if (m_useTrackingSeeds) {
169  if (m_useMCInformation) {
170  rawHitCoordinates(0) = momentumEstimator.estimateQOverP(*m_hit, mcMomentum, mcPostion, mcCharge,
171  m_fitParameters,
172  m_correctionFitParameters);
173 
174  } else {
175  rawHitCoordinates(0) = momentumEstimator.estimateQOverP(*m_hit, trackMomentum, trackPosition, trackCharge,
176  m_fitParameters,
177  m_correctionFitParameters);
178  }
179  } else {
180  if (m_useMCInformation) {
181  rawHitCoordinates(0) = momentumEstimator.estimateQOverP(*m_hit, hitMCMomentum, hitMCPosition, stateCharge,
182  m_fitParameters,
183  m_correctionFitParameters);
184  } else {
185  rawHitCoordinates(0) = momentumEstimator.estimateQOverP(*m_hit, stateMomentum, statePosition, stateCharge,
186  m_fitParameters,
187  m_correctionFitParameters);
188  }
189  }
190  }
191 
192  rawHitCovariance(0, 0) = m_sigma;
193 
194  genfit::MeasurementOnPlane* mop = new genfit::MeasurementOnPlane(rawHitCoordinates, rawHitCovariance,
195  state.getPlane(), state.getRep(), constructHMatrix(state.getRep()));
196  return {mop};
197  }
198 
200  template<>
202 
204  template<>
206 
208 }
A Class to store the Monte Carlo particle information.
Definition: MCParticle.h:32
TVector3 getMomentum() const
Return momentum.
Definition: MCParticle.h:198
float getCharge() const
Return the particle charge defined in TDatabasePDG.
Definition: MCParticle.cc:34
TVector3 getProductionVertex() const
Return production vertex position.
Definition: MCParticle.h:189
Measurement class implementing a planar hit geometry (1 or 2D) with only a momentum measurement.
Measurement class implementing a planar hit geometry (1 or 2D) with a momentum measurement based on t...
void setUseTrackingSeeds(bool useTrackingSeeds)
Set whether to use tracking seeds not the current state.
VXDMomentumEstimation< HitType >::CorrectionFitParameters m_correctionFitParameters
Parameters for the correction function.
void setSigma(double sigma)
Set the measurement sigma.
bool m_useMCInformation
Use the seeds of the track finder or the seeds of the MC particles.
void setUseMCInformation(bool useMCInformation)
Set whether to use mc information.
const RecoTrack * m_recoTrack
RecoTrack for which the hit is created.
void setUseThickness(bool useThickness)
Set whether to use the thickness.
void setCorrectionFitParameters(const typename VXDMomentumEstimation< HitType >::CorrectionFitParameters &correctionFitParameters)
Set the correction fit parameters.
virtual genfit::AbsMeasurement * clone() const override
Clone the measurement.
PlanarVXDMomentumMeasurement(const genfit::PlanarMeasurement &parentElement, HitType *hit, const Belle2::RecoTrack *recoTrack)
Initialize the momentum measurement with a planar measurement as a parent, the corresponding hit and ...
bool m_useTrackingSeeds
Use the tracking seeds in the origin for calculating the path length rather than the current state.
VXDMomentumEstimation< HitType >::FitParameters m_fitParameters
Parameters for the main function.
double m_sigma
Value of the measurement sigma.
bool m_useThickness
Use the thickness of the clusters of the path length for estimating dX.
HitType * getHit() const
Get the underlaying hit (cluster).
void setFitParameters(const typename VXDMomentumEstimation< HitType >::FitParameters &fitParameters)
Set the fit parameters.
int getDetId() const
Return the detector ID.
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:76
Tools needed for the VXD momentum estimation to, e.g.
TVector3 getEntryPositionOfMCParticle(const ClusterType &) const
Return the entry position of the simulated MCParticle at this cluster (by using the TrueHit associate...
static const VXDMomentumEstimationTools & getInstance()
Use this class as singleton.
TVector3 getEntryMomentumOfMCParticle(const ClusterType &) const
Return the momentum of the simulated MCParticle at this cluster (by using the TrueHit associated with...
Class doing the momentum estimation from dEdX for SVDClusters and PXDClusters.
double estimateQOverP(const ClusterType &cluster, const TVector3 &momentum, const TVector3 &position, short charge, const FitParameters &fitParameters, const CorrectionFitParameters &correctionFitParameters) const
Main function: Estimate p over q for the given cluster and the path length calculated using the given...
double estimateQOverPWithThickness(const ClusterType &cluster, short charge, const FitParameters &fitParameters, const CorrectionFitParameters &correctionFitParameters) const
Main function: Estimate p over q for the given cluster and the thickness of the cluster with the fit ...
static const VXDMomentumEstimation & getInstance()
Use this class as a singleton.
Contains the measurement and covariance in raw detector coordinates.
Measured coordinates on a plane.
Measurement class implementing a planar hit geometry (1 or 2D).
A state with arbitrary dimension defined in a DetPlane.
Definition: StateOnPlane.h:47
virtual std::vector< genfit::MeasurementOnPlane * > constructMeasurementsOnPlane(const genfit::StateOnPlane &state) const override
Construct the measurement on the plane set in the parent element.
Abstract base class for different kinds of events.