Belle II Software  release-05-02-19
SubRecoTrackExtractor.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2017 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Sebastian Racs *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #pragma once
12 
13 #include <tracking/trackFindingVXD/variableExtractors/VariableExtractor.h>
14 #include <tracking/dataobjects/RecoTrack.h>
15 #include <tracking/spacePointCreation/SpacePointTrackCand.h>
16 
17 #include <genfit/MeasuredStateOnPlane.h>
18 #include <root/TVector3.h>
19 #include <root/TMatrixDSym.h>
20 
21 namespace Belle2 {
26  class SubRecoTrackExtractor : public VariableExtractor {
28  public:
29 
31  explicit SubRecoTrackExtractor(std::vector<Named<float*>>& variableSet):
32  VariableExtractor()
33  {
34  addVariable("CDC_QI", variableSet);
35  addVariable("SVD_QI", variableSet);
36  addVariable("PXD_QI", variableSet);
37 
38  addVariable("SVD_has_SPTC", variableSet);
39  addVariable("SVD_FitSuccessful", variableSet);
40  addVariable("CDC_FitSuccessful", variableSet);
41 
42  initializeStats("SVD_CDC_CDCwall_Pos", variableSet);
43  initializeStats("SVD_CDC_CDCwall_Mom", variableSet);
44  initializeStats("SVD_CDC_POCA_Pos", variableSet);
45  initializeStats("SVD_CDC_POCA_Mom", variableSet);
46 
47  addVariable("SVD_CDC_CDCwall_Chi2", variableSet);
48  }
49 
51  void extractVariables(RecoTrack const* CDCRecoTrack,
52  RecoTrack const* SVDRecoTrack,
53  RecoTrack const* PXDRecoTrack)
54  {
55  if (PXDRecoTrack) {
56  const float pxdQI = PXDRecoTrack->getQualityIndicator();
57  m_variables.at("PXD_QI") = isnan(pxdQI) ? 0. : pxdQI;
58  } else {
59  m_variables.at("PXD_QI") = -1.;
60  }
61 
62  if (CDCRecoTrack) {
63  const float cdcQI = CDCRecoTrack->getQualityIndicator();
64  m_variables.at("CDC_QI") = isnan(cdcQI) ? 0. : cdcQI;
65  m_variables.at("CDC_FitSuccessful") = CDCRecoTrack->wasFitSuccessful();
66  } else {
67  m_variables.at("CDC_QI") = -1.;
68  m_variables.at("CDC_FitSuccessful") = -1.;
69  }
70 
71  if (SVDRecoTrack) {
72  m_variables.at("SVD_QI") = SVDRecoTrack->getQualityIndicator();
73  m_variables.at("SVD_FitSuccessful") = SVDRecoTrack->wasFitSuccessful();
74  m_variables.at("SVD_has_SPTC") = bool(SVDRecoTrack->getRelatedTo<SpacePointTrackCand>("SPTrackCands"));
75  } else {
76  m_variables.at("SVD_QI") = -1.;
77  m_variables.at("SVD_has_SPTC") = -1.;
78  m_variables.at("SVD_FitSuccessful") = -1.;
79  }
80 
81  if (SVDRecoTrack and CDCRecoTrack and SVDRecoTrack->wasFitSuccessful() and CDCRecoTrack->wasFitSuccessful()) {
82  extractVariablesAtExtrapolationToCDCWall(CDCRecoTrack, SVDRecoTrack);
83  extractVariablesAtExtrapolationToPOCA(CDCRecoTrack, SVDRecoTrack);
84  } else {
85  setCDCSVDTrackDifferenceVariables("SVD_CDC_CDCwall_Pos", nullptr, nullptr);
86  setCDCSVDTrackDifferenceVariables("SVD_CDC_CDCwall_Mom", nullptr, nullptr);
87  m_variables.at("SVD_CDC_CDCwall_Chi2") = -1.;
88  setCDCSVDTrackDifferenceVariables("SVD_CDC_POCA_Pos", nullptr, nullptr);
89  setCDCSVDTrackDifferenceVariables("SVD_CDC_POCA_Mom", nullptr, nullptr);
90  }
91 
92  }
93 
94  protected:
96  void initializeStats(const std::string& prefix, std::vector<Named<float*>>& variables)
97  {
98  addVariable(prefix + "_diff_Z", variables);
99  addVariable(prefix + "_diff_Pt", variables);
100  addVariable(prefix + "_diff_Theta", variables);
101  addVariable(prefix + "_diff_Phi", variables);
102  addVariable(prefix + "_diff_Mag", variables);
103  addVariable(prefix + "_diff_Eta", variables);
104  }
105 
107  void setCDCSVDTrackDifferenceVariables(const std::string& prefix,
108  const TVector3* svdTrackVector,
109  const TVector3* cdcTrackVector)
110  {
111  if (not(svdTrackVector and cdcTrackVector)) {
112  m_variables.at(prefix + "_diff_Z") = -1.;
113  m_variables.at(prefix + "_diff_Pt") = -1.;
114  m_variables.at(prefix + "_diff_Theta") = -1.;
115  m_variables.at(prefix + "_diff_Phi") = -1.;
116  m_variables.at(prefix + "_diff_Mag") = -1.;
117  m_variables.at(prefix + "_diff_Eta") = -1.;
118  return;
119  }
120  m_variables.at(prefix + "_diff_Z") = fabs(cdcTrackVector->Z() - svdTrackVector->Z());
121  m_variables.at(prefix + "_diff_Pt") = fabs(cdcTrackVector->Pt() - svdTrackVector->Pt());
122  m_variables.at(prefix + "_diff_Theta") = fabs(cdcTrackVector->Theta() - svdTrackVector->Theta());
123  m_variables.at(prefix + "_diff_Phi") = fabs(cdcTrackVector->Phi() - svdTrackVector->Phi());
124  m_variables.at(prefix + "_diff_Mag") = fabs(cdcTrackVector->Mag() - svdTrackVector->Mag());
125  m_variables.at(prefix + "_diff_Eta") = fabs(cdcTrackVector->Eta() - svdTrackVector->Eta());
126  }
127 
131  void extractVariablesAtExtrapolationToCDCWall(RecoTrack const* CDCRecoTrack, RecoTrack const* SVDRecoTrack)
132  {
133  // position and momentum used for extrapolations to the CDC Wall
134  TVector3 center(0., 0., 0.);
135  TVector3 direction(0., 0., 1.);
136 
137  genfit::MeasuredStateOnPlane svdTrackStateOnPlane;
138  genfit::MeasuredStateOnPlane cdcTrackStateOnPlane;
139  try {
140  // do extrapolation of SVD and CDC onto CDCwall
141  svdTrackStateOnPlane = SVDRecoTrack->getMeasuredStateOnPlaneFromLastHit();
142  cdcTrackStateOnPlane = CDCRecoTrack->getMeasuredStateOnPlaneFromFirstHit();
143  cdcTrackStateOnPlane.extrapolateToCylinder(m_CDC_wall_radius, center, direction);
144  svdTrackStateOnPlane.extrapolateToPlane(cdcTrackStateOnPlane.getPlane());
145  } catch (genfit::Exception const& e) {
146  // extrapolation not possible, skip this track
147  B2WARNING("SubRecoTrackExtractor: SVDRecoTrack and/or CDCRecoTrack extrapolation to the CDCwall failed!\n"
148  << "-->" << e.what());
149  setCDCSVDTrackDifferenceVariables("SVD_CDC_CDCwall_Pos", nullptr, nullptr);
150  setCDCSVDTrackDifferenceVariables("SVD_CDC_CDCwall_Mom", nullptr, nullptr);
151  m_variables.at("SVD_CDC_CDCwall_Chi2") = -1.;
152  return;
153  }
154 
155  // set differences in Position and Momentum
156  const TVector3 svdTrackPositionOnPlaneAtCDCWall = svdTrackStateOnPlane.getPos();
157  const TVector3 svdTrackMomentumOnPlaneAtCDCWall = svdTrackStateOnPlane.getMom();
158  const TVector3 cdcTrackPositionOnPlaneAtCDCWall = cdcTrackStateOnPlane.getPos();
159  const TVector3 cdcTrackMomentumOnPlaneAtCDCWall = cdcTrackStateOnPlane.getMom();
160  setCDCSVDTrackDifferenceVariables("SVD_CDC_CDCwall_Pos", &svdTrackPositionOnPlaneAtCDCWall, &cdcTrackPositionOnPlaneAtCDCWall);
161  setCDCSVDTrackDifferenceVariables("SVD_CDC_CDCwall_Mom", &svdTrackMomentumOnPlaneAtCDCWall, &cdcTrackMomentumOnPlaneAtCDCWall);
162  try {
163  // calculate chi2 between SVD and CDC (like in VXDCDCTrackMerger)
164  const TMatrixDSym invCovariance = (svdTrackStateOnPlane.getCov() + cdcTrackStateOnPlane.getCov()).Invert();
165  TVectorD stateDifference = cdcTrackStateOnPlane.getState() - svdTrackStateOnPlane.getState();
166  stateDifference *= invCovariance;
167  const float chi2 = stateDifference * (cdcTrackStateOnPlane.getState() - svdTrackStateOnPlane.getState());
168  m_variables.at("SVD_CDC_CDCwall_Chi2") = chi2;
169 
170  } catch (genfit::Exception const& e) {
171  // extrapolation not possible, skip this track
172  B2WARNING("SubRecoTrackExtractor: Matrix is singular!\n"
173  << "-->" << e.what());
174  m_variables.at("SVD_CDC_CDCwall_Chi2") = -1.;
175  return;
176  }
177  }
178 
182  void extractVariablesAtExtrapolationToPOCA(RecoTrack const* CDCRecoTrack, RecoTrack const* SVDRecoTrack)
183  {
184  // position and momentum used for extrapolations to the CDC Wall
185  const TVector3 linePoint(0., 0., 0.);
186  const TVector3 lineDirection(0., 0., 1.);
187 
188  genfit::MeasuredStateOnPlane svdTrackStateOnPlane;
189  genfit::MeasuredStateOnPlane cdcTrackStateOnPlane;
190  try {
191  // do extrapolation of SVD and CDC onto CDCwall
192  svdTrackStateOnPlane = SVDRecoTrack->getMeasuredStateOnPlaneFromFirstHit();
193  cdcTrackStateOnPlane = CDCRecoTrack->getMeasuredStateOnPlaneFromFirstHit();
194  cdcTrackStateOnPlane.extrapolateToLine(linePoint, lineDirection);
195  svdTrackStateOnPlane.extrapolateToLine(linePoint, lineDirection);
196  } catch (genfit::Exception const& e) {
197  // extrapolation not possible, skip this track
198  B2WARNING("SubRecoTrackExtractor: SVDRecoTrack and/or CDCRecoTrack extrapolation to POCA failed!\n"
199  << "-->" << e.what());
200  setCDCSVDTrackDifferenceVariables("SVD_CDC_POCA_Pos", nullptr, nullptr);
201  setCDCSVDTrackDifferenceVariables("SVD_CDC_POCA_Mom", nullptr, nullptr);
202  return;
203  }
204 
205  // set differences in Position and Momentum
206  const TVector3 svdTrackPositionOnPlaneAtPOCA = svdTrackStateOnPlane.getPos();
207  const TVector3 svdTrackMomentumOnPlaneAtPOCA = svdTrackStateOnPlane.getMom();
208  const TVector3 cdcTrackPositionOnPlaneAtPOCA = cdcTrackStateOnPlane.getPos();
209  const TVector3 cdcTrackMomentumOnPlaneAtPOCA = cdcTrackStateOnPlane.getMom();
210  setCDCSVDTrackDifferenceVariables("SVD_CDC_POCA_Pos", &svdTrackPositionOnPlaneAtPOCA, &cdcTrackPositionOnPlaneAtPOCA);
211  setCDCSVDTrackDifferenceVariables("SVD_CDC_POCA_Mom", &svdTrackMomentumOnPlaneAtPOCA, &cdcTrackMomentumOnPlaneAtPOCA);
212  }
213 
214  private:
216  const double m_CDC_wall_radius = 16.25;
217  };
219 }
genfit::Exception
Exception class for error handling in GENFIT (provides storage for diagnostic information)
Definition: Exception.h:48
Belle2::SubRecoTrackExtractor::SubRecoTrackExtractor
SubRecoTrackExtractor(std::vector< Named< float * >> &variableSet)
Define names of variables that get extracted.
Definition: SubRecoTrackExtractor.h:39
Belle2::SubRecoTrackExtractor::extractVariablesAtExtrapolationToCDCWall
void extractVariablesAtExtrapolationToCDCWall(RecoTrack const *CDCRecoTrack, RecoTrack const *SVDRecoTrack)
Extrapolate fitted RecoTracks from CDC standalone and VXDTF2 tracking to the CDC wall and extract the...
Definition: SubRecoTrackExtractor.h:139
Belle2::RecoTrack::getQualityIndicator
float getQualityIndicator() const
Get the quality index attached to this RecoTrack given by one of the reconstruction algorithms....
Definition: RecoTrack.h:730
Belle2::RecoTrack::wasFitSuccessful
bool wasFitSuccessful(const genfit::AbsTrackRep *representation=nullptr) const
Returns true if the last fit with the given representation was successful.
Definition: RecoTrack.cc:326
Belle2::SubRecoTrackExtractor::setCDCSVDTrackDifferenceVariables
void setCDCSVDTrackDifferenceVariables(const std::string &prefix, const TVector3 *svdTrackVector, const TVector3 *cdcTrackVector)
calculated differences and saves them in variable set
Definition: SubRecoTrackExtractor.h:115
prepareAsicCrosstalkSimDB.e
e
aux.
Definition: prepareAsicCrosstalkSimDB.py:53
genfit::MeasuredStateOnPlane
#StateOnPlane with additional covariance matrix.
Definition: MeasuredStateOnPlane.h:39
Belle2::SubRecoTrackExtractor::extractVariables
void extractVariables(RecoTrack const *CDCRecoTrack, RecoTrack const *SVDRecoTrack, RecoTrack const *PXDRecoTrack)
extract the actual variables and write into a variable set
Definition: SubRecoTrackExtractor.h:59
Belle2::SubRecoTrackExtractor::m_CDC_wall_radius
const double m_CDC_wall_radius
Radius of the inner CDC wall in centimeters.
Definition: SubRecoTrackExtractor.h:224
Belle2::SubRecoTrackExtractor::initializeStats
void initializeStats(const std::string &prefix, std::vector< Named< float * >> &variables)
initialize statistics subsets of variables from clusters that get combined for SPTC
Definition: SubRecoTrackExtractor.h:104
Belle2::RelationsInterface::getRelatedTo
TO * getRelatedTo(const std::string &name="", const std::string &namedRelation="") const
Get the object to which this object has a relation.
Definition: RelationsObject.h:250
Belle2::RecoTrack
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:78
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::VariableExtractor::m_variables
std::unordered_map< std::string, float > m_variables
unordered_map to associate float value with a string name
Definition: VariableExtractor.h:45
Belle2::SubRecoTrackExtractor::extractVariablesAtExtrapolationToPOCA
void extractVariablesAtExtrapolationToPOCA(RecoTrack const *CDCRecoTrack, RecoTrack const *SVDRecoTrack)
Extrapolate fitted RecoTracks from CDC standalone and VXDTF2 tracking to the POCA and extract the dif...
Definition: SubRecoTrackExtractor.h:190
Belle2::VariableExtractor::addVariable
void addVariable(const std::string &identifier, std::vector< Named< float * >> &variables)
add a variable to the variable set
Definition: VariableExtractor.h:37