43 double maxmimumTrajectoryDistanceFront = 0;
44 double maxmimumTrajectoryDistanceBack = 0;
45 double maxmimumHitDistanceFront = 0;
46 double maxmimumHitDistanceBack = 0;
48 double hitsInSameRegion = 0;
49 double hitsInCommon = 0;
55 const CDCTrajectory3D& trajectoryTrack3D = track->getStartTrajectory3D();
61 maxmimumTrajectoryDistanceBack = trajectoryTrack2D.
getDist2D(back.getWireHit().getRefPos2D());
66 if (segment->getStereoKind() == EStereoKind::c_Axial) {
68 if (not trajectoryTrack2D.
isFitted()) {
70 fitter.update(trajectorySegment, *segment);
79 observations.
fill(s, z);
82 if (observations.
size() > 3) {
86 double startZTrack = szTrajectoryTrack.
getZ0();
87 double startZSegments = szTrajectorySegments.
getZ0();
89 var<
named(
"z_distance")>() = startZTrack - startZSegments;
95 const ROOT::Math::XYZVector& frontRecoPos3D = front.
reconstruct3D(trajectoryTrack2D);
96 const ROOT::Math::XYZVector& backRecoPos3D = back.reconstruct3D(trajectoryTrack2D);
98 if (segment->getStereoKind() != EStereoKind::c_Axial) {
102 if (frontRecoPos3D.z() > forwardZ or frontRecoPos3D.z() < backwardZ or backRecoPos3D.z() > forwardZ
103 or backRecoPos3D.z() < backwardZ) {
109 double perpSOfFront = trajectoryTrack2D.
calcArcLength2D(segment->front().getRecoPos2D());
110 double perpSOfBack = trajectoryTrack2D.
calcArcLength2D(segment->back().getRecoPos2D());
112 double perpSMinimum = std::min(perpSOfFront, perpSOfBack);
113 double perpSMaximum = std::max(perpSOfFront, perpSOfBack);
117 if (recoHit.getArcLength2D() < 0.8 * perpSMinimum or
118 recoHit.getArcLength2D() > 1.2 * perpSMaximum) {
121 if (recoHit.getISuperLayer() == segment->getISuperLayer()) {
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;
128 double distanceBack = (back.getWireHit().getRefPos2D() - recoHit.getRecoPos2D()).R();
129 if (distanceBack > maxmimumHitDistanceBack) {
130 maxmimumHitDistanceBack = distanceBack;
137 if (std::find_if(segment->begin(), segment->end(), [&trackHit](
const CDCRecoHit2D & segmentHit) {
138 return segmentHit.getWireHit().getHit() == trackHit.getWireHit().getHit();
139 }) != segment->end()) {
149 bool isAxialSegment = segment->getStereoKind() != EStereoKind::c_Axial;
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());
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);
167 const CDCTrajectorySZ& trajectorySZ = track->getStartTrajectory3D().getTrajectorySZ();
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;
175 if (hasZInformation) {
176 double thetaFirstSegmentHit = -10;
179 ROOT::Math::XYZVector reconstructedPosition = recoHit2D.reconstruct3D(trajectoryTrack2D);
180 const ROOT::Math::XYVector& recoPos2D = recoHit2D.getRecoPos2D();
184 double current_z_distance = std::abs(trajectorySZ.
getZDist(perpS, reconstructedPosition.z()));
185 if (std::isnan(current_z_distance)) {
189 if (thetaFirstSegmentHit == -10) {
190 thetaFirstSegmentHit = reconstructedPosition.Theta();
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;
199 stereo_quad_tree_distance = thetaTrack - thetaFirstSegmentHit;
204 if (isAxialSegment) {
205 observationsFull.
fill(recoHit.getRecoPos2D());
206 observationsNeigh.
fill(recoHit.getRecoPos2D());
212 observationsFull.
fill(s, z);
213 observationsNeigh.
fill(s, z);
220 if (segment->getStereoKind() == EStereoKind::c_Axial) {
222 var<
named(
"fit_full")>() = fitter.fit(observationsFull).getPValue();
225 var<
named(
"fit_full")>() = toFinite(fitter.fit(observationsFull).getPValue(), 0);
227 if (observationsNeigh.
size() > 3) {
228 var<
named(
"fit_neigh")>() = toFinite(fitter.fit(observationsNeigh).getPValue(), 0);
234 if (observationsFull.
size() == observationsNeigh.
size()) {
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);
246 var<
named(
"track_is_curler")>() = VectorUtil::hasNAN(trajectoryTrack2D.
getExit());
248 var<
named(
"superlayer_already_full")>() = not VectorUtil::hasNAN(trajectoryTrack2D.
getOuterExit()) and hitsInSameRegion > 5;
250 var<
named(
"maxmimum_trajectory_distance_front")>() = toFinite(maxmimumTrajectoryDistanceFront, 999);
251 var<
named(
"maxmimum_trajectory_distance_back")>() = toFinite(maxmimumTrajectoryDistanceBack, 999);
253 var<
named(
"maxmimum_hit_distance_front")>() = maxmimumHitDistanceFront;
254 var<
named(
"maxmimum_hit_distance_back")>() = maxmimumHitDistanceBack;
256 var<
named(
"out_of_CDC")>() = outOfCDC;
257 var<
named(
"hits_in_same_region")>() = hitsInSameRegion;
259 var<
named(
"number_of_hits_in_common")>() = hitsInCommon;
261 var<
named(
"segment_super_layer")>() = segment->getISuperLayer();
263 double phiBetweenTrackAndSegment = ROOT::Math::VectorUtil::DeltaPhi(trajectoryTrack2D.
getMom2DAtSupport(),
264 segment->front().getRecoPos2D());
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);