Generate and assign the contained variables.
36{
37 const CDCTrack* track = testPair->
getFrom();
38 const CDCSegment2D* segment = testPair->
getTo();
39
40 assert(segment);
41 assert(track);
42
43 double maxmimumTrajectoryDistanceFront = 0;
44 double maxmimumTrajectoryDistanceBack = 0;
45 double maxmimumHitDistanceFront = 0;
46 double maxmimumHitDistanceBack = 0;
47 double outOfCDC = 0;
48 double hitsInSameRegion = 0;
49 double hitsInCommon = 0;
50
51 const CDCRecoHit2D& front = segment->front();
52 const CDCRecoHit2D& back = segment->back();
53
54
55 const CDCTrajectory3D& trajectoryTrack3D = track->getStartTrajectory3D();
56 const CDCTrajectory2D& trajectoryTrack2D = trajectoryTrack3D.
getTrajectory2D();
57 const CDCTrajectorySZ& szTrajectoryTrack = trajectoryTrack3D.
getTrajectorySZ();
59
61 maxmimumTrajectoryDistanceBack = trajectoryTrack2D.
getDist2D(back.getWireHit().getRefPos2D());
62
65
66 if (segment->getStereoKind() == EStereoKind::c_Axial) {
67 CDCTrajectory2D& trajectorySegment = segment->getTrajectory2D();
68 if (not trajectoryTrack2D.
isFitted()) {
70 fitter.update(trajectorySegment, *segment);
71 }
72 } else {
73 CDCObservations2D observations;
74 for (const CDCRecoHit2D& recoHit : *segment) {
75 const CDCRLWireHit& rlWireHit = recoHit.getRLWireHit();
79 observations.
fill(s, z);
80 }
81
82 if (observations.
size() > 3) {
84 const CDCTrajectorySZ& szTrajectorySegments = fitter.fit(observations);
85
86 double startZTrack = szTrajectoryTrack.
getZ0();
87 double startZSegments = szTrajectorySegments.
getZ0();
88
89 var<
named(
"z_distance")>() = startZTrack - startZSegments;
91 }
92 }
93
94
95 const ROOT::Math::XYZVector& frontRecoPos3D = front.
reconstruct3D(trajectoryTrack2D);
96 const ROOT::Math::XYZVector& backRecoPos3D = back.reconstruct3D(trajectoryTrack2D);
97
98 if (segment->getStereoKind() != EStereoKind::c_Axial) {
101
102 if (frontRecoPos3D.z() > forwardZ or frontRecoPos3D.z() < backwardZ or backRecoPos3D.z() > forwardZ
103 or backRecoPos3D.z() < backwardZ) {
104 outOfCDC = 1.0;
105 }
106 }
107
108
109 double perpSOfFront = trajectoryTrack2D.
calcArcLength2D(segment->front().getRecoPos2D());
110 double perpSOfBack = trajectoryTrack2D.
calcArcLength2D(segment->back().getRecoPos2D());
111
112 double perpSMinimum = std::min(perpSOfFront, perpSOfBack);
113 double perpSMaximum = std::max(perpSOfFront, perpSOfBack);
114
115
116 for (const CDCRecoHit3D& recoHit : *track) {
117 if (recoHit.getArcLength2D() < 0.8 * perpSMinimum or
118 recoHit.getArcLength2D() > 1.2 * perpSMaximum) {
119 continue;
120 }
121 if (recoHit.getISuperLayer() == segment->getISuperLayer()) {
122 hitsInSameRegion++;
123 } else if (abs(recoHit.getISuperLayer() - segment->getISuperLayer()) == 1) {
124 double distanceFront = (front.
getWireHit().getRefPos2D() - recoHit.getRecoPos2D()).R();
125 if (distanceFront > maxmimumHitDistanceFront) {
126 maxmimumHitDistanceFront = distanceFront;
127 }
128 double distanceBack = (back.getWireHit().getRefPos2D() - recoHit.getRecoPos2D()).R();
129 if (distanceBack > maxmimumHitDistanceBack) {
130 maxmimumHitDistanceBack = distanceBack;
131 }
132 }
133 }
134
135
136 for (const CDCRecoHit3D& trackHit : *track) {
137 if (std::find_if(segment->begin(), segment->end(), [&trackHit](const CDCRecoHit2D & segmentHit) {
138 return segmentHit.getWireHit().getHit() == trackHit.getWireHit().getHit();
139 }) != segment->end()) {
140 hitsInCommon += 1;
141 }
142 }
143
144
145 CDCObservations2D observationsFull;
146 CDCObservations2D observationsNeigh;
147
148
149 bool isAxialSegment = segment->getStereoKind() != EStereoKind::c_Axial;
150
151 for (const CDCRecoHit3D& recoHit : *track) {
152 if (isAxialSegment and recoHit.getStereoKind() == EStereoKind::c_Axial) {
153 observationsFull.
fill(recoHit.getWireHit().getRefPos2D());
154 if (abs(recoHit.getISuperLayer() - segment->getISuperLayer()) < 3) {
155 observationsNeigh.
fill(recoHit.getWireHit().getRefPos2D());
156 }
157 } else if (not isAxialSegment and recoHit.getStereoKind() != EStereoKind::c_Axial) {
158 double s = recoHit.getArcLength2D();
159 double z = recoHit.getRecoZ();
160 observationsFull.
fill(s, z);
161 if (abs(recoHit.getISuperLayer() - segment->getISuperLayer()) < 3) {
162 observationsNeigh.
fill(s, z);
163 }
164 }
165 }
166
167 const CDCTrajectorySZ& trajectorySZ = track->getStartTrajectory3D().getTrajectorySZ();
169
170 bool hasZInformation = tanLambda != 0;
171 double max_hit_z_distance = -1;
172 double sum_hit_z_distance = 0;
173 double stereo_quad_tree_distance = 0;
174
175 if (hasZInformation) {
176 double thetaFirstSegmentHit = -10;
177
178 for (const CDCRecoHit2D& recoHit2D : *segment) {
179 ROOT::Math::XYZVector reconstructedPosition = recoHit2D.reconstruct3D(trajectoryTrack2D);
180 const ROOT::Math::XYVector& recoPos2D = recoHit2D.getRecoPos2D();
182
183
184 double current_z_distance = std::abs(trajectorySZ.
getZDist(perpS, reconstructedPosition.z()));
185 if (std::isnan(current_z_distance)) {
186 continue;
187 }
188
189 if (thetaFirstSegmentHit == -10) {
190 thetaFirstSegmentHit = reconstructedPosition.Theta();
191 }
192 sum_hit_z_distance += current_z_distance;
193 if (current_z_distance > max_hit_z_distance) {
194 max_hit_z_distance = current_z_distance;
195 }
196 }
197
199 stereo_quad_tree_distance = thetaTrack - thetaFirstSegmentHit;
200 }
201
202
203 for (const CDCRecoHit2D& recoHit : *segment) {
204 if (isAxialSegment) {
205 observationsFull.
fill(recoHit.getRecoPos2D());
206 observationsNeigh.
fill(recoHit.getRecoPos2D());
207 } else {
208 const CDCRLWireHit& rlWireHit = recoHit.getRLWireHit();
212 observationsFull.
fill(s, z);
213 observationsNeigh.
fill(s, z);
214 }
215 }
216
217
220 if (segment->getStereoKind() == EStereoKind::c_Axial) {
222 var<
named(
"fit_full")>() = fitter.fit(observationsFull).getPValue();
223 } else {
225 var<
named(
"fit_full")>() = toFinite(fitter.fit(observationsFull).getPValue(), 0);
226
227 if (observationsNeigh.
size() > 3) {
228 var<
named(
"fit_neigh")>() = toFinite(fitter.fit(observationsNeigh).getPValue(), 0);
229 } else {
231 }
232 }
233
234 if (observationsFull.
size() == observationsNeigh.
size()) {
236 }
237
238 var<
named(
"is_stereo")>() = segment->getStereoKind() != EStereoKind::c_Axial;
239 var<
named(
"segment_size")>() = segment->size();
240 var<
named(
"track_size")>() = track->size();
241 var<
named(
"mean_hit_z_distance")>() = sum_hit_z_distance;
242 var<
named(
"max_hit_z_distance")>() = max_hit_z_distance;
243 var<
named(
"stereo_quad_tree_distance")>() = toFinite(stereo_quad_tree_distance, 0);
244
246 var<
named(
"track_is_curler")>() = VectorUtil::hasNAN(trajectoryTrack2D.
getExit());
247
248 var<
named(
"superlayer_already_full")>() = not VectorUtil::hasNAN(trajectoryTrack2D.
getOuterExit()) and hitsInSameRegion > 5;
249
250 var<
named(
"maxmimum_trajectory_distance_front")>() = toFinite(maxmimumTrajectoryDistanceFront, 999);
251 var<
named(
"maxmimum_trajectory_distance_back")>() = toFinite(maxmimumTrajectoryDistanceBack, 999);
252
253 var<
named(
"maxmimum_hit_distance_front")>() = maxmimumHitDistanceFront;
254 var<
named(
"maxmimum_hit_distance_back")>() = maxmimumHitDistanceBack;
255
256 var<
named(
"out_of_CDC")>() = outOfCDC;
257 var<
named(
"hits_in_same_region")>() = hitsInSameRegion;
258
259 var<
named(
"number_of_hits_in_common")>() = hitsInCommon;
260
261 var<
named(
"segment_super_layer")>() = segment->getISuperLayer();
262
263 double phiBetweenTrackAndSegment = ROOT::Math::VectorUtil::DeltaPhi(trajectoryTrack2D.
getMom2DAtSupport(),
264 segment->front().getRecoPos2D());
265
266 var<
named(
"phi_between_track_and_segment")>() = toFinite(phiBetweenTrackAndSegment, 0);
267 var<
named(
"perp_s_of_front")>() = toFinite(perpSOfFront / radius, 0);
268 var<
named(
"perp_s_of_back")>() = toFinite(perpSOfBack / radius, 0);
269
270 return true;
271}
const WireLine & getWireLine() const
Getter for the wire line representation of the wire.
double backwardZ() const
Gives the backward z coordinate.
double forwardZ() const
Gives the forward z coordinate.
std::size_t fill(double x, double y, double signedRadius=0.0, double weight=1.0)
Appends the observed position.
std::size_t size() const
Returns the number of observations stored.
static const CDCRiemannFitter & getFitter()
Static getter for a general Riemann fitter.
static const CDCSZFitter & getFitter()
Getter for a standard sz line fitter instance.
const CDCWireHit & getWireHit() const
Getter for the wire hit associated with the reconstructed hit.
const CDC::CDCWire & getWire() const
Getter for the wire the reconstructed hit associated to.
ROOT::Math::XYZVector reconstruct3D(const CDCTrajectory2D &trajectory2D, const double z=0) const
Reconstruct the three dimensional position (especially of stereo hits) by determining the z coordinat...
static CDCRecoHit3D reconstruct(const CDCRecoHit2D &recoHit2D, const CDCTrajectory2D &trajectory2D)
Reconstructs the three dimensional hit from the two dimensional and the two dimensional trajectory.
double getRecoZ() const
Getter for the z coordinate of the reconstructed position.
double getArcLength2D() const
Getter for the travel distance in the xy projection.
PerigeeCircle getGlobalCircle() const
Getter for the circle in global coordinates.
double calcArcLength2D(const ROOT::Math::XYVector &point) const
Calculate the travel distance from the start position of the trajectory.
ROOT::Math::XYVector getOuterExit(double factor=1) const
Calculates the point where the trajectory meets the outer wall of the CDC.
double getAbsMom2D(double bZ) const
Get the estimation for the absolute value of the transvers momentum.
bool isFitted() const
Checks if the circle is already set to a valid value.
ROOT::Math::XYVector getExit() const
Calculates the point where the trajectory leaves the CDC.
ROOT::Math::XYVector getMom2DAtSupport(const double bZ) const
Get the momentum at the support point of the trajectory.
double getDist2D(const ROOT::Math::XYVector &point) const
Calculates the distance from the point to the trajectory as seen from the xy projection.
CDCTrajectory2D getTrajectory2D() const
Getter for the two dimensional trajectory.
CDCTrajectorySZ getTrajectorySZ() const
Getter for the sz trajectory.
ROOT::Math::XYZVector getFlightDirection3DAtSupport() const
Get the unit momentum at the start point of the trajectory.
double getTanLambda() const
Getter for the slope over the travel distance coordinate.
double getZDist(const double s, const double z) const
Calculates the distance along between the given point at the sz trajectory.
double getZ0() const
Getter for the z coordinate at zero travel distance.
const ROOT::Math::XYVector & getRefPos2D() const
The two dimensional reference position (z=0) of the underlying wire.
double absRadius() const
Gives the signed radius of the circle. If it was a line this will be infinity.
static constexpr int named(const char *name)
From * getFrom() const
Getter for the pointer to the from side object.
To * getTo() const
Getter for the pointer to the to side object.