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