Belle II Software  release-05-01-25
CDCPathBasicVarSet.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2019 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Simon Kurz, Nils Braun *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #include <tracking/ckf/cdc/filters/paths/CDCPathBasicVarSet.h>
11 
12 #include <tracking/ckf/cdc/entities/CDCCKFState.h>
13 
14 #include <tracking/dataobjects/RecoTrack.h>
15 
16 #include <tracking/trackFindingCDC/topology/CDCWire.h>
17 #include <tracking/trackFindingCDC/topology/CDCWireTopology.h>
18 
19 using namespace std;
20 using namespace Belle2;
21 
22 bool CDCPathBasicVarSet::extract(const BaseCDCPathFilter::Object* path)
23 {
24  // check if hit belongs to same seed
25  const auto& seed = path->front();
26  const auto* seedRecoTrack = seed.getSeed();
27 
28  double arcLength_total = 0.;
29  std::vector<double> arcLengths;
30  arcLengths.reserve(path->size() - 1);
31  std::vector<double> hitDistances;
32  hitDistances.reserve(path->size() - 1);
33  std::vector<double> flipPos(8, 0);
34 
35  unsigned int chargeFlip = 0;
36  int lastCharge = seedRecoTrack->getChargeSeed();
37 
38  for (auto const& state : *path) {
39  if (state.isSeed()) {
40  continue;
41  }
42 
43  arcLengths.push_back(state.getArcLength() - arcLength_total);
44  arcLength_total = state.getArcLength();
45 
46  hitDistances.push_back(state.getHitDistance());
47 
48 
49  // check how many times genfit changed the charge and where it occured
50  genfit::MeasuredStateOnPlane trackState = state.getTrackState();
51  int stateCharge = trackState.getCharge();
52  if (lastCharge != stateCharge) {
53  if (chargeFlip < flipPos.size()) {
54  flipPos[chargeFlip] = state.getWireHit()->getWire().getICLayer();
55  }
56 
57  chargeFlip += 1;
58  lastCharge = stateCharge;
59  }
60  }
61 
62  // general stuff
63  var<named("eventNumber")>() = m_eventMetaData->getEvent();
64 
65  // track properties
66  var<named("totalHits")>() = path->size() - 1;
67  var<named("chargeFlip")>() = chargeFlip;
68 
69  bool reachedEnd = false;
70  if (path->size() > 1) {
71  if (path->back().getWireHit()->getWire().getICLayer() == 0) {
72  reachedEnd = true;
73  }
74  }
75  var<named("reachedEnd")>() = reachedEnd;
76 
77  var<named("flipPos0")>() = flipPos[0];
78  var<named("flipPos1")>() = flipPos[1];
79  var<named("flipPos2")>() = flipPos[2];
80  var<named("flipPos3")>() = flipPos[3];
81 
82  // seed properties
83  TVector3 seedPos = seedRecoTrack->getPositionSeed();
84  TVector3 seedMom = seedRecoTrack->getMomentumSeed();
85  var<named("seed_r")>() = seedPos.Perp();
86  var<named("seed_z")>() = seedPos.Z();
87  var<named("seed_x")>() = seedPos.X();
88  var<named("seed_y")>() = seedPos.Y();
89  var<named("seed_p")>() = seedMom.Mag();
90  var<named("seed_theta")>() = seedMom.Theta() * 180. / M_PI;
91  var<named("seed_pt")>() = seedMom.Perp();
92  var<named("seed_pz")>() = seedMom.Z();
93  var<named("seed_px")>() = seedMom.X();
94  var<named("seed_py")>() = seedMom.Y();
95  var<named("seed_charge")>() = seedRecoTrack->getChargeSeed();
96 
97  var<named("totalHitsSeedTrack")>() = seedRecoTrack->getNumberOfCDCHits();
98 
99  // get ICLayer assigned to seed (only really defined for ECL seeds)
100  const auto& wireTopology = TrackFindingCDC::CDCWireTopology::getInstance();
101  const auto& wires = wireTopology.getWires();
102  const float maxForwardZ = wires.back().getForwardZ(); // 157.615
103  const float maxBackwardZ = wires.back().getBackwardZ(); // -72.0916
104 
105  int seedICLayer = -1;
106  const float seedPosZ = seedPos.z();
107  if (seedPosZ < maxForwardZ && seedPosZ > maxBackwardZ) {
108  seedICLayer = 56;
109  } else {
110  // do straight extrapolation of seed momentum to CDC outer walls
111  TVector3 seedMomZOne(seedMom * (1. / seedMom.Z()));
112 
113  // find closest iCLayer
114  float minDist = 99999;
115  for (const auto& wire : wires) {
116  const float maxZ = seedPosZ > 0 ? wire.getForwardZ() : wire.getBackwardZ();
117 
118  const auto distance = wire.getDistance(TrackFindingCDC::Vector3D(seedPos - seedMomZOne * (seedPosZ - maxZ)));
119  if (distance < minDist) {
120  minDist = distance;
121  seedICLayer = wire.getICLayer();
122  }
123  }
124  }
125  var<named("seedICLayer")>() = seedICLayer;
126 
127 
128  // track representation
129  TVector3 trackMom(0, 0, 0);
130  int trackCharge = 0;
131  float firstChi2 = 0;
132  float lastChi2 = 0;
133  float firstICLayer = 0;
134  float lastICLayer = 0;
135  if (path->size() > 1) {
136  genfit::MeasuredStateOnPlane trackState = path->back().getTrackState();
137 
138  trackMom = trackState.getMom();
139  trackCharge = trackState.getCharge();
140 
141  firstChi2 = path->at(1).getChi2();
142  lastChi2 = path->back().getChi2();
143 
144  firstICLayer = path->at(1).getWireHit()->getWire().getICLayer();
145  lastICLayer = path->back().getWireHit()->getWire().getICLayer();
146  }
147  var<named("track_theta")>() = trackMom.Theta() * 180. / M_PI;
148  var<named("track_p")>() = trackMom.Mag();
149  var<named("track_pt")>() = trackMom.Perp();
150  var<named("track_pz")>() = trackMom.Z();
151  var<named("track_px")>() = trackMom.X();
152  var<named("track_py")>() = trackMom.Y();
153  var<named("track_charge")>() = trackCharge;
154 
155  var<named("firstChi2")>() = firstChi2;
156  var<named("lastChi2")>() = lastChi2;
157 
158  var<named("firstICLayer")>() = firstICLayer;
159  var<named("lastICLayer")>() = lastICLayer;
160 
161  if (path->size() > 3) {
162  int lastN = path->size() - 1;
163  var<named("ICLayerLast0")>() = path->at(lastN).getWireHit()->getWire().getICLayer();
164  var<named("ICLayerLast1")>() = path->at(lastN - 1).getWireHit()->getWire().getICLayer();
165  var<named("ICLayerLast2")>() = path->at(lastN - 2).getWireHit()->getWire().getICLayer();
166  var<named("IWireLast0")>() = path->at(lastN).getWireHit()->getWire().getIWire();
167  var<named("IWireLast1")>() = path->at(lastN - 1).getWireHit()->getWire().getIWire();
168  var<named("IWireLast2")>() = path->at(lastN - 2).getWireHit()->getWire().getIWire();
169  } else {
170  var<named("ICLayerLast0")>() = -1;
171  var<named("ICLayerLast1")>() = -1;
172  var<named("ICLayerLast2")>() = -1;
173  var<named("IWireLast0")>() = -1;
174  var<named("IWireLast1")>() = -1;
175  var<named("IWireLast2")>() = -1;
176  }
177 
178  if (path->size() > 10) {
179  var<named("hitDistance0")>() = hitDistances[0];
180  var<named("hitDistance1")>() = hitDistances[1];
181  var<named("hitDistance2")>() = hitDistances[2];
182  var<named("hitDistance3")>() = hitDistances[3];
183  var<named("hitDistance4")>() = hitDistances[4];
184  var<named("hitDistance5")>() = hitDistances[5];
185  var<named("hitDistance6")>() = hitDistances[6];
186  var<named("hitDistance7")>() = hitDistances[7];
187  var<named("hitDistance8")>() = hitDistances[8];
188  var<named("hitDistance9")>() = hitDistances[9];
189  var<named("arcLength0")>() = arcLengths[0];
190  var<named("arcLength1")>() = arcLengths[1];
191  var<named("arcLength2")>() = arcLengths[2];
192  var<named("arcLength3")>() = arcLengths[3];
193  var<named("arcLength4")>() = arcLengths[4];
194  var<named("arcLength5")>() = arcLengths[5];
195  var<named("arcLength6")>() = arcLengths[6];
196  var<named("arcLength7")>() = arcLengths[7];
197  var<named("arcLength8")>() = arcLengths[8];
198  var<named("arcLength9")>() = arcLengths[9];
199  } else {
200  var<named("hitDistance0")>() = -1;
201  var<named("hitDistance1")>() = -1;
202  var<named("hitDistance2")>() = -1;
203  var<named("hitDistance3")>() = -1;
204  var<named("hitDistance4")>() = -1;
205  var<named("hitDistance5")>() = -1;
206  var<named("hitDistance6")>() = -1;
207  var<named("hitDistance7")>() = -1;
208  var<named("hitDistance8")>() = -1;
209  var<named("hitDistance9")>() = -1;
210  var<named("arcLength0")>() = -1;
211  var<named("arcLength1")>() = -1;
212  var<named("arcLength2")>() = -1;
213  var<named("arcLength3")>() = -1;
214  var<named("arcLength4")>() = -1;
215  var<named("arcLength5")>() = -1;
216  var<named("arcLength6")>() = -1;
217  var<named("arcLength7")>() = -1;
218  var<named("arcLength8")>() = -1;
219  var<named("arcLength9")>() = -1;
220  }
221 
222  return true;
223 }
genfit::MeasuredStateOnPlane
#StateOnPlane with additional covariance matrix.
Definition: MeasuredStateOnPlane.h:39
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::TrackFindingCDC::Filter::Object
AObject Object
Type of the object to be analysed.
Definition: Filter.dcl.h:43