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