11 #include <tracking/ckf/svd/filters/states/SVDStateVarSet.h>
12 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory3D.h>
13 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectory2D.h>
14 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCTrajectorySZ.h>
15 #include <tracking/dataobjects/RecoTrack.h>
19 using namespace TrackFindingCDC;
23 template<
class APredicate>
27 unsigned int numberOfHits = 0;
30 const SpacePoint* spacePoint = walkState->getHit();
34 for (
auto& cluster : spacePoint->getRelationsTo<
SVDCluster>()) {
40 return sum / numberOfHits;
44 template<
class APredicate>
47 double minimalValue = NAN;
50 const SpacePoint* spacePoint = walkState->getHit();
54 for (
auto& cluster : spacePoint->getRelationsTo<
SVDCluster>()) {
55 double currentValue = t(cluster);
56 if (std::isnan(minimalValue)) {
57 minimalValue = currentValue;
59 minimalValue = std::min(currentValue, minimalValue);
68 template<
class APredicate>
72 double sumSquared = 0;
73 unsigned int numberOfHits = 0;
76 const SpacePoint* spacePoint = walkState->getHit();
80 for (
auto& cluster : spacePoint->getRelationsTo<
SVDCluster>()) {
82 const auto& currentValue = t(cluster);
84 sumSquared += currentValue * currentValue;
88 return std::sqrt((sumSquared - sum / numberOfHits) / numberOfHits - 1);
94 const std::vector<TrackFindingCDC::WithWeight<const CKFToSVDState*>>& previousStates = pair->first;
97 const RecoTrack* cdcTrack = previousStates.front()->getSeed();
98 B2ASSERT(
"Path without seed?", cdcTrack);
101 B2ASSERT(
"Path without hit?", spacePoint);
103 std::vector<TrackFindingCDC::WithWeight<const CKFToSVDState*>> allStates = previousStates;
104 allStates.emplace_back(state, 0);
108 var<named(
"seed_cdc_hits")>() = cdcHits.size();
109 var<named(
"seed_lowest_cdc_layer")>() = cdcHits.front()->getICLayer();
115 B2ASSERT(
"Previous state was not fitted?", previousStates.back()->mSoPSet());
116 firstMeasurement = previousStates.back()->getMeasuredStateOnPlane();
122 const CDCTrajectory3D trajectory(position, 0, momentum, cdcTrack->
getChargeSeed());
126 const double arcLength = trajectory.calcArcLength2D(hitPosition);
127 const Vector2D& trackPositionAtHit2D = trajectory.getTrajectory2D().getPos2DAtArcLength2D(arcLength);
128 const double trackPositionAtHitZ = trajectory.getTrajectorySZ().mapSToZ(arcLength);
130 Vector3D trackPositionAtHit(trackPositionAtHit2D, trackPositionAtHitZ);
132 const auto calculateCharge = [](
const auto & s) {
133 return s.getCharge();
135 const auto calculateSeedCharge = [](
const auto & s) {
136 return s.getSeedCharge();
138 const auto calculateSize = [](
const auto & s) {
141 const auto calculateSNR = [](
const auto & s) {
144 const auto calculateChargeSizeRatio = [](
const auto & s) {
145 return s.getCharge() / s.getSize();
148 if (spacePoint->
getType() == VXD::SensorInfoBase::SensorType::SVD) {
151 B2ASSERT(
"Must be related to exactly 2 clusters", clusters.size() == 2);
153 const SVDCluster* secondCluster = clusters[1];
155 var<named(
"cluster_1_charge")>() = calculateCharge(*firstCluster);
156 var<named(
"cluster_2_charge")>() = calculateCharge(*secondCluster);
157 var<named(
"mean_rest_cluster_charge")>() = meanOver(allStates, calculateCharge);
158 var<named(
"min_rest_cluster_charge")>() = minOver(allStates, calculateCharge);
159 var<named(
"std_rest_cluster_charge")>() = stdOver(allStates, calculateCharge);
161 var<named(
"cluster_1_seed_charge")>() = calculateSeedCharge(*firstCluster);
162 var<named(
"cluster_2_seed_charge")>() = calculateSeedCharge(*secondCluster);
163 var<named(
"mean_rest_cluster_seed_charge")>() = meanOver(allStates, calculateSeedCharge);
164 var<named(
"min_rest_cluster_seed_charge")>() = minOver(allStates, calculateSeedCharge);
165 var<named(
"std_rest_cluster_seed_charge")>() = stdOver(allStates, calculateSeedCharge);
167 var<named(
"cluster_1_size")>() = calculateSize(*firstCluster);
168 var<named(
"cluster_2_size")>() = calculateSize(*secondCluster);
169 var<named(
"mean_rest_cluster_size")>() = meanOver(allStates, calculateSize);
170 var<named(
"min_rest_cluster_size")>() = meanOver(allStates, calculateSize);
171 var<named(
"std_rest_cluster_size")>() = stdOver(allStates, calculateSize);
173 var<named(
"cluster_1_snr")>() = calculateSNR(*firstCluster);
174 var<named(
"cluster_2_snr")>() = calculateSNR(*secondCluster);
175 var<named(
"mean_rest_cluster_snr")>() = meanOver(allStates, calculateSNR);
176 var<named(
"min_rest_cluster_snr")>() = minOver(allStates, calculateSNR);
177 var<named(
"std_rest_cluster_snr")>() = stdOver(allStates, calculateSNR);
179 var<named(
"cluster_1_charge_over_size")>() = calculateChargeSizeRatio(*firstCluster);
180 var<named(
"cluster_2_charge_over_size")>() = calculateChargeSizeRatio(*secondCluster);
181 var<named(
"mean_rest_cluster_charge_over_size")>() = meanOver(allStates, calculateChargeSizeRatio);
182 var<named(
"min_rest_cluster_charge_over_size")>() = minOver(allStates, calculateChargeSizeRatio);
183 var<named(
"std_rest_cluster_charge_over_size")>() = stdOver(allStates, calculateChargeSizeRatio);
186 std::vector<const SpacePoint*> spacePoints;
190 spacePoints.push_back(sp);
194 if (spacePoints.size() >= 3) {
195 var<named(
"quality_index_triplet")>() = m_qualityTriplet.estimateQuality(spacePoints);
196 var<named(
"quality_index_circle")>() = m_qualityCircle.estimateQuality(spacePoints);
197 var<named(
"quality_index_helix")>() = m_qualityHelix.estimateQuality(spacePoints);
199 var<named(
"quality_index_triplet")>() = 0;
200 var<named(
"quality_index_circle")>() = 0;
201 var<named(
"quality_index_helix")>() = 0;