Generate and assign the contained variables.
29{
30 const CDCTrack* track = testPair->
getFrom();
31 const CDCSegment2D* segment = testPair->
getTo();
32
33 assert(segment);
34 assert(track);
35
36 double maxmimumTrajectoryDistanceFront = 0;
37 double maxmimumTrajectoryDistanceBack = 0;
38 double maxmimumHitDistanceFront = 0;
39 double maxmimumHitDistanceBack = 0;
40 double outOfCDC = 0;
41 double hitsInSameRegion = 0;
42 double hitsInCommon = 0;
43
44 const CDCRecoHit2D& front = segment->front();
45 const CDCRecoHit2D& back = segment->back();
46
47
48 const CDCTrajectory3D& trajectoryTrack3D = track->getStartTrajectory3D();
49 const CDCTrajectory2D& trajectoryTrack2D = trajectoryTrack3D.
getTrajectory2D();
50 const CDCTrajectorySZ& szTrajectoryTrack = trajectoryTrack3D.
getTrajectorySZ();
52
54 maxmimumTrajectoryDistanceBack = trajectoryTrack2D.
getDist2D(back.getWireHit().getRefPos2D());
55
58
59 if (segment->getStereoKind() == EStereoKind::c_Axial) {
60 CDCTrajectory2D& trajectorySegment = segment->getTrajectory2D();
61 if (not trajectoryTrack2D.
isFitted()) {
63 fitter.update(trajectorySegment, *segment);
64 }
65 } else {
66 CDCObservations2D observations;
67 for (const CDCRecoHit2D& recoHit : *segment) {
68 const CDCRLWireHit& rlWireHit = recoHit.getRLWireHit();
72 observations.
fill(s, z);
73 }
74
75 if (observations.
size() > 3) {
77 const CDCTrajectorySZ& szTrajectorySegments = fitter.fit(observations);
78
79 double startZTrack = szTrajectoryTrack.
getZ0();
80 double startZSegments = szTrajectorySegments.
getZ0();
81
82 var<
named(
"z_distance")>() = startZTrack - startZSegments;
84 }
85 }
86
87
89 Vector3D backRecoPos3D = back.reconstruct3D(trajectoryTrack2D);
90
91 if (segment->getStereoKind() != EStereoKind::c_Axial) {
94
95 if (frontRecoPos3D.
z() > forwardZ or frontRecoPos3D.
z() < backwardZ or backRecoPos3D.
z() > forwardZ
96 or backRecoPos3D.
z() < backwardZ) {
97 outOfCDC = 1.0;
98 }
99 }
100
101
102 double perpSOfFront = trajectoryTrack2D.
calcArcLength2D(segment->front().getRecoPos2D());
103 double perpSOfBack = trajectoryTrack2D.
calcArcLength2D(segment->back().getRecoPos2D());
104
105 double perpSMinimum = std::min(perpSOfFront, perpSOfBack);
106 double perpSMaximum = std::max(perpSOfFront, perpSOfBack);
107
108
109 for (const CDCRecoHit3D& recoHit : *track) {
110 if (recoHit.getArcLength2D() < 0.8 * perpSMinimum or
111 recoHit.getArcLength2D() > 1.2 * perpSMaximum) {
112 continue;
113 }
114 if (recoHit.getISuperLayer() == segment->getISuperLayer()) {
115 hitsInSameRegion++;
116 } else if (abs(recoHit.getISuperLayer() - segment->getISuperLayer()) == 1) {
117 double distanceFront = (front.
getWireHit().getRefPos2D() - recoHit.getRecoPos2D()).norm();
118 if (distanceFront > maxmimumHitDistanceFront) {
119 maxmimumHitDistanceFront = distanceFront;
120 }
121 double distanceBack = (back.getWireHit().getRefPos2D() - recoHit.getRecoPos2D()).norm();
122 if (distanceBack > maxmimumHitDistanceBack) {
123 maxmimumHitDistanceBack = distanceBack;
124 }
125 }
126 }
127
128
129 for (const CDCRecoHit3D& trackHit : *track) {
130 if (std::find_if(segment->begin(), segment->end(), [&trackHit](const CDCRecoHit2D & segmentHit) {
131 return segmentHit.getWireHit().getHit() == trackHit.getWireHit().getHit();
132 }) != segment->end()) {
133 hitsInCommon += 1;
134 }
135 }
136
137
138 CDCObservations2D observationsFull;
139 CDCObservations2D observationsNeigh;
140
141
142 bool isAxialSegment = segment->getStereoKind() != EStereoKind::c_Axial;
143
144 for (const CDCRecoHit3D& recoHit : *track) {
145 if (isAxialSegment and recoHit.getStereoKind() == EStereoKind::c_Axial) {
146 observationsFull.
fill(recoHit.getWireHit().getRefPos2D());
147 if (abs(recoHit.getISuperLayer() - segment->getISuperLayer()) < 3) {
148 observationsNeigh.
fill(recoHit.getWireHit().getRefPos2D());
149 }
150 } else if (not isAxialSegment and recoHit.getStereoKind() != EStereoKind::c_Axial) {
151 double s = recoHit.getArcLength2D();
152 double z = recoHit.getRecoZ();
153 observationsFull.
fill(s, z);
154 if (abs(recoHit.getISuperLayer() - segment->getISuperLayer()) < 3) {
155 observationsNeigh.
fill(s, z);
156 }
157 }
158 }
159
160 const CDCTrajectorySZ& trajectorySZ = track->getStartTrajectory3D().getTrajectorySZ();
162
163 bool hasZInformation = tanLambda != 0;
164 double max_hit_z_distance = -1;
165 double sum_hit_z_distance = 0;
166 double stereo_quad_tree_distance = 0;
167
168 if (hasZInformation) {
169 double thetaFirstSegmentHit = -10;
170
171 for (const CDCRecoHit2D& recoHit2D : *segment) {
172 Vector3D reconstructedPosition = recoHit2D.reconstruct3D(trajectoryTrack2D);
173 const Vector2D& recoPos2D = recoHit2D.getRecoPos2D();
175
176
177 double current_z_distance = std::abs(trajectorySZ.
getZDist(perpS, reconstructedPosition.
z()));
178 if (std::isnan(current_z_distance)) {
179 continue;
180 }
181
182 if (thetaFirstSegmentHit == -10) {
183 thetaFirstSegmentHit = reconstructedPosition.
theta();
184 }
185 sum_hit_z_distance += current_z_distance;
186 if (current_z_distance > max_hit_z_distance) {
187 max_hit_z_distance = current_z_distance;
188 }
189 }
190
192 stereo_quad_tree_distance = thetaTrack - thetaFirstSegmentHit;
193 }
194
195
196 for (const CDCRecoHit2D& recoHit : *segment) {
197 if (isAxialSegment) {
198 observationsFull.
fill(recoHit.getRecoPos2D());
199 observationsNeigh.
fill(recoHit.getRecoPos2D());
200 } else {
201 const CDCRLWireHit& rlWireHit = recoHit.getRLWireHit();
205 observationsFull.
fill(s, z);
206 observationsNeigh.
fill(s, z);
207 }
208 }
209
210
213 if (segment->getStereoKind() == EStereoKind::c_Axial) {
215 var<
named(
"fit_full")>() = fitter.fit(observationsFull).getPValue();
216 } else {
218 var<
named(
"fit_full")>() = toFinite(fitter.fit(observationsFull).getPValue(), 0);
219
220 if (observationsNeigh.
size() > 3) {
221 var<
named(
"fit_neigh")>() = toFinite(fitter.fit(observationsNeigh).getPValue(), 0);
222 } else {
224 }
225 }
226
227 if (observationsFull.
size() == observationsNeigh.
size()) {
229 }
230
231 var<
named(
"is_stereo")>() = segment->getStereoKind() != EStereoKind::c_Axial;
232 var<
named(
"segment_size")>() = segment->size();
233 var<
named(
"track_size")>() = track->size();
234 var<
named(
"mean_hit_z_distance")>() = sum_hit_z_distance;
235 var<
named(
"max_hit_z_distance")>() = max_hit_z_distance;
236 var<
named(
"stereo_quad_tree_distance")>() = toFinite(stereo_quad_tree_distance, 0);
237
240
242
243 var<
named(
"maxmimum_trajectory_distance_front")>() = toFinite(maxmimumTrajectoryDistanceFront, 999);
244 var<
named(
"maxmimum_trajectory_distance_back")>() = toFinite(maxmimumTrajectoryDistanceBack, 999);
245
246 var<
named(
"maxmimum_hit_distance_front")>() = maxmimumHitDistanceFront;
247 var<
named(
"maxmimum_hit_distance_back")>() = maxmimumHitDistanceBack;
248
249 var<
named(
"out_of_CDC")>() = outOfCDC;
250 var<
named(
"hits_in_same_region")>() = hitsInSameRegion;
251
252 var<
named(
"number_of_hits_in_common")>() = hitsInCommon;
253
254 var<
named(
"segment_super_layer")>() = segment->getISuperLayer();
255
257
258 var<
named(
"phi_between_track_and_segment")>() = toFinite(phiBetweenTrackAndSegment, 0);
259 var<
named(
"perp_s_of_front")>() = toFinite(perpSOfFront / radius, 0);
260 var<
named(
"perp_s_of_back")>() = toFinite(perpSOfBack / radius, 0);
261
262 return true;
263}
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.
Vector3D reconstruct3D(const CDCTrajectory2D &trajectory2D, const double z=0) const
Reconstruct the three dimensional position (especially of stereo hits) by determining the z coordinat...
const CDC::CDCWire & getWire() const
Getter for the wire the reconstructed hit associated to.
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.
Vector2D getMom2DAtSupport(const double bZ) const
Get the momentum at the support point of the trajectory.
PerigeeCircle getGlobalCircle() const
Getter for the circle in global coordinates.
Vector2D getOuterExit(double factor=1) const
Calculates the point where the trajectory meets the outer wall of the CDC.
double calcArcLength2D(const Vector2D &point) const
Calculate the travel distance from the start position of the trajectory.
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.
Vector2D getExit() const
Calculates the point where the trajectory leaves the CDC.
double getDist2D(const Vector2D &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.
Vector3D getFlightDirection3DAtSupport() const
Get the unit momentum at the start point of the trajectory.
CDCTrajectorySZ getTrajectorySZ() const
Getter for the sz 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)
bool hasNAN() const
Checks if one of the coordinates is NAN.
double angleWith(const Vector2D &rhs) const
The angle between this and rhs.
double z() const
Getter for the z coordinate.
double theta() const
Getter for the polar angle.
From * getFrom() const
Getter for the pointer to the from side object.
To * getTo() const
Getter for the pointer to the to side object.
HepGeom::Vector3D< double > Vector3D
3D Vector