12 #include <tracking/trackFindingVXD/variableExtractors/VariableExtractor.h>
13 #include <tracking/dataobjects/RecoTrack.h>
14 #include <tracking/dataobjects/RecoHitInformation.h>
16 #include <genfit/KalmanFitterInfo.h>
17 #include <genfit/TrackPoint.h>
27 class HitInfoExtractor :
public VariableExtractor {
37 addVariable(
"N_TrackPoints_without_KalmanFitterInfo", variableSet);
38 addVariable(
"N_Hits_without_TrackPoint", variableSet);
49 std::vector<const genfit::KalmanFitterInfo*> kalmanFitterInfos;
50 kalmanFitterInfos.reserve(recoHitInformations.size());
52 int n_no_trackPoint = 0;
53 int n_no_KalmanFitterInfo = 0;
58 if (kalmanFitterInfo) {
59 kalmanFitterInfos.push_back(kalmanFitterInfo);
61 n_no_KalmanFitterInfo++;
67 m_variables.at(
"N_Hits_without_TrackPoint") = n_no_trackPoint;
68 m_variables.at(
"N_TrackPoints_without_KalmanFitterInfo") = n_no_KalmanFitterInfo;
72 const auto hitHasKalmanInfoAndIsFromDetector =
73 [&recoTrack,
this](
const auto & recoHitInformation,
76 and (recoHitInformation->getTrackingDetector() == trackingDetector));
78 const auto hitHasKalmanInfoAndIsFromCDC = std::bind(hitHasKalmanInfoAndIsFromDetector,
79 std::placeholders::_1,
80 RecoHitInformation::c_CDC);
81 const auto hitHasKalmanInfoAndIsFromSVD = std::bind(hitHasKalmanInfoAndIsFromDetector,
82 std::placeholders::_1,
83 RecoHitInformation::c_SVD);
86 const auto firstHitWithCDCKalmanInfoIter = std::find_if(recoHitInformations.begin(),
87 recoHitInformations.end(),
88 hitHasKalmanInfoAndIsFromCDC);
89 std::optional<float> weight_firstCDCHit;
90 std::optional<float> smoothedChi2_firstCDCHit;
91 if (firstHitWithCDCKalmanInfoIter != recoHitInformations.end()) {
93 weight_firstCDCHit = kalmanFitterInfo->
getWeights().front();
100 const auto lastHitWithSVDKalmanInfoIter = std::find_if(recoHitInformations.rbegin(),
101 recoHitInformations.rend(),
102 hitHasKalmanInfoAndIsFromSVD);
103 std::optional<float> weight_lastSVDHit;
104 std::optional<float> smoothedChi2_lastSVDHit;
105 if (lastHitWithSVDKalmanInfoIter != recoHitInformations.rend()) {
107 weight_lastSVDHit = kalmanFitterInfo->
getWeights().front();
113 std::vector<float> fitWeights;
114 std::vector<float> chi2Values;
115 fitWeights.reserve(kalmanFitterInfos.size());
116 chi2Values.reserve(kalmanFitterInfos.size());
117 for (
const auto& kalmanFitterInfo : kalmanFitterInfos) {
118 fitWeights.push_back(kalmanFitterInfo->
getWeights().front());
122 setStats(
"smoothedChi2", chi2Values);
127 void initializeStats(
const std::string& identifier, std::vector<Named<float*>>& variables)
136 addVariable(identifier +
"_lastSVDHit", variables);
141 (
const std::string& identifier, std::vector<float>& values)
143 int size = values.size();
144 if (values.size() == 0) {
156 std::sort(values.begin(), values.end());
158 float sum = std::accumulate(values.begin(), values.end(), 0.0);
159 float mean = sum / size;
163 for (
float value : values) {
164 variance += (value - mean) * (value - mean);
169 variance /= size - 1;
170 float stddev = std::sqrt(variance);
172 m_variables.at(identifier +
"_min") = values.front();
173 m_variables.at(identifier +
"_max") = values.back();
176 float median = (size % 2) ? values[size / 2] : 0.5 * (values[size / 2] + values[size / 2 - 1]);
183 const RecoHitInformation* recoHitInformation)
185 const genfit::TrackPoint* trackPointPtr = recoTrack.getCreatedTrackPoint(recoHitInformation);
197 return kalmanFitterInfo->getSmoothedChi2();
198 }
catch (
const std::exception& e) {
199 B2WARNING(
"HitInfoExtractor: Caught exception in kalmanFitterInfos[i]->getSmoothedChi2() \n"
200 <<
"-->" <<
e.what());