10 #include <tracking/trackFindingCDC/filters/segmentTrack/SegmentTrackVarSet.h>
12 #include <tracking/trackFindingCDC/fitting/CDCObservations2D.h>
13 #include <tracking/trackFindingCDC/fitting/CDCRiemannFitter.h>
14 #include <tracking/trackFindingCDC/fitting/CDCSZFitter.h>
16 #include <tracking/trackFindingCDC/eventdata/tracks/CDCTrack.h>
17 #include <tracking/trackFindingCDC/eventdata/segments/CDCSegment2D.h>
18 #include <tracking/trackFindingCDC/eventdata/hits/CDCWireHit.h>
19 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectorySZ.h>
21 #include <tracking/trackFindingCDC/topology/CDCWire.h>
23 #include <tracking/trackFindingCDC/numerics/ToFinite.h>
26 using namespace TrackFindingCDC;
30 const CDCTrack* track = testPair->getFrom();
36 double maxmimumTrajectoryDistanceFront = 0;
37 double maxmimumTrajectoryDistanceBack = 0;
38 double maxmimumHitDistanceFront = 0;
39 double maxmimumHitDistanceBack = 0;
41 double hitsInSameRegion = 0;
42 double hitsInCommon = 0;
48 const CDCTrajectory3D& trajectoryTrack3D = track->getStartTrajectory3D();
54 maxmimumTrajectoryDistanceBack = trajectoryTrack2D.
getDist2D(back.getWireHit().getRefPos2D());
59 if (segment->getStereoKind() == EStereoKind::c_Axial) {
61 if (not trajectoryTrack2D.
isFitted()) {
63 fitter.update(trajectorySegment, *segment);
72 observations.
fill(s, z);
75 if (observations.
size() > 3) {
79 double startZTrack = szTrajectoryTrack.
getZ0();
80 double startZSegments = szTrajectorySegments.
getZ0();
82 var<
named(
"z_distance")>() = startZTrack - startZSegments;
89 Vector3D backRecoPos3D = back.reconstruct3D(trajectoryTrack2D);
91 if (segment->getStereoKind() != EStereoKind::c_Axial) {
95 if (frontRecoPos3D.
z() > forwardZ or frontRecoPos3D.
z() < backwardZ or backRecoPos3D.
z() > forwardZ
96 or backRecoPos3D.
z() < backwardZ) {
102 double perpSOfFront = trajectoryTrack2D.
calcArcLength2D(segment->front().getRecoPos2D());
103 double perpSOfBack = trajectoryTrack2D.
calcArcLength2D(segment->back().getRecoPos2D());
105 double perpSMinimum = std::min(perpSOfFront, perpSOfBack);
106 double perpSMaximum = std::max(perpSOfFront, perpSOfBack);
110 if (recoHit.getArcLength2D() < 0.8 * perpSMinimum or
111 recoHit.getArcLength2D() > 1.2 * perpSMaximum) {
114 if (recoHit.getISuperLayer() == segment->getISuperLayer()) {
116 }
else if (abs(recoHit.getISuperLayer() - segment->getISuperLayer()) == 1) {
118 if (distanceFront > maxmimumHitDistanceFront) {
119 maxmimumHitDistanceFront = distanceFront;
121 double distanceBack = (back.getWireHit().getRefPos2D() - recoHit.getRecoPos2D()).norm();
122 if (distanceBack > maxmimumHitDistanceBack) {
123 maxmimumHitDistanceBack = distanceBack;
130 if (std::find_if(segment->begin(), segment->end(), [&trackHit](
const CDCRecoHit2D & segmentHit) {
131 return segmentHit.getWireHit().getHit() == trackHit.getWireHit().getHit();
132 }) != segment->end()) {
142 bool isAxialSegment = segment->getStereoKind() != EStereoKind::c_Axial;
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());
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);
160 const CDCTrajectorySZ& trajectorySZ = track->getStartTrajectory3D().getTrajectorySZ();
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;
168 if (hasZInformation) {
169 double thetaFirstSegmentHit = -10;
172 Vector3D reconstructedPosition = recoHit2D.reconstruct3D(trajectoryTrack2D);
173 const Vector2D& recoPos2D = recoHit2D.getRecoPos2D();
177 double current_z_distance = std::abs(trajectorySZ.
getZDist(perpS, reconstructedPosition.
z()));
178 if (std::isnan(current_z_distance)) {
182 if (thetaFirstSegmentHit == -10) {
183 thetaFirstSegmentHit = reconstructedPosition.
theta();
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;
192 stereo_quad_tree_distance = thetaTrack - thetaFirstSegmentHit;
197 if (isAxialSegment) {
198 observationsFull.
fill(recoHit.getRecoPos2D());
199 observationsNeigh.
fill(recoHit.getRecoPos2D());
205 observationsFull.
fill(s, z);
206 observationsNeigh.
fill(s, z);
213 if (segment->getStereoKind() == EStereoKind::c_Axial) {
215 var<
named(
"fit_full")>() = fitter.fit(observationsFull).getPValue();
218 var<
named(
"fit_full")>() = toFinite(fitter.fit(observationsFull).getPValue(), 0);
220 if (observationsNeigh.
size() > 3) {
221 var<
named(
"fit_neigh")>() = toFinite(fitter.fit(observationsNeigh).getPValue(), 0);
227 if (observationsFull.
size() == observationsNeigh.
size()) {
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);
243 var<
named(
"maxmimum_trajectory_distance_front")>() = toFinite(maxmimumTrajectoryDistanceFront, 999);
244 var<
named(
"maxmimum_trajectory_distance_back")>() = toFinite(maxmimumTrajectoryDistanceBack, 999);
246 var<
named(
"maxmimum_hit_distance_front")>() = maxmimumHitDistanceFront;
247 var<
named(
"maxmimum_hit_distance_back")>() = maxmimumHitDistanceBack;
249 var<
named(
"out_of_CDC")>() = outOfCDC;
250 var<
named(
"hits_in_same_region")>() = hitsInSameRegion;
252 var<
named(
"number_of_hits_in_common")>() = hitsInCommon;
254 var<
named(
"segment_super_layer")>() = segment->getISuperLayer();
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);