61 if (!
m_fitter.empty() && track.perigeeParameters() && track.measurementsOnTrack() && track.measurementsOnTrack()->size() > 3) {
64 std::vector<const Trk::MeasurementBase*>
vec;
66 for (; measIter != track.measurementsOnTrack()->end(); ++measIter) {
67 const Amg::Vector3D& position = (*measIter)->globalPosition();
69 vec.push_back((*measIter));
71 ATH_MSG_DEBUG(
"Refitting ID-part of track, meast vector of size " <<
vec.size());
72 refittedTrack =
m_fitter->fit(Gaudi::Hive::currentContext(),
74 *(track.perigeeParameters()),
79 Gaudi::Hive::currentContext(), track,
false,
Trk::muon).release();
81 fullTrack = refittedTrack;
83 ATH_MSG_DEBUG(
"Detected slimmed track, " << (refittedTrack ?
"refit was successful" :
"but could not refit it!"));
92 unsigned measurements = 0;
93 double neighbourRadius = 0.;
94 double neighbourSignificance = 0.;
95 unsigned neighbours = 0;
96 unsigned scatterers = 0;
97 unsigned startMeasurement = 0;
98 std::vector<bool> isMeasurement;
99 std::vector<unsigned> measurementNumber;
100 std::vector<double> radii;
101 std::vector<double> sigmas;
102 double significance = 0.;
103 double totalSigma = 0.;
104 double weightedRadius = 0.;
108 if ((**s).measurementOnTrack()) {
110 }
else if (!measurements)
114 if (!(**s).materialEffectsOnTrack())
continue;
116 const Amg::Vector3D& position = (**s).materialEffectsOnTrack()->associatedSurface().globalReferencePoint();
124 if (!scattering)
continue;
127 double radius = (**s).trackParameters()->position().perp();
129 if ((**s).measurementOnTrack()) {
130 isMeasurement.push_back(
true);
132 isMeasurement.push_back(
false);
134 measurementNumber.push_back(measurements);
139 significance += sigma;
140 weightedRadius += sigma * radius;
141 if (neighbours > 1 && measurements > startMeasurement) {
142 double norm = 1. / sqrt(
static_cast<double>(neighbours));
143 if (norm * fabs(significance) > fabs(neighbourSignificance)) {
144 if (significance == 0.) {
145 neighbourRadius = radius;
147 neighbourRadius = weightedRadius / significance;
149 neighbourSignificance = norm * significance;
150 ATH_MSG_VERBOSE(
" current maximum for neighbourSignificance " << neighbourSignificance <<
" from " << neighbours
151 <<
" scatterers at radius " << neighbourRadius);
153 ATH_MSG_VERBOSE(
" reset neighbour after " << significance <<
" /sqrt(" << neighbours <<
") at radius " << radius);
156 startMeasurement = measurements;
158 if (isMeasurement.back()) {
160 significance += sigma;
161 weightedRadius += sigma * radius;
165 radii.push_back(radius);
166 sigmas.push_back(sigma);
169 ATH_MSG_VERBOSE(scatterers <<
" " << measurements <<
" " << isMeasurement.back() <<
" radius "
170 << (**s).trackParameters()->position().perp() <<
" deltaPhi " << scattering->
deltaPhi()
171 <<
" significance " << sigma <<
" integralSignificance " << totalSigma);
175 delete refittedTrack;
177 while (scatterers && measurementNumber.back() == measurements && !isMeasurement.back()) {
179 totalSigma -= sigmas.back();
180 isMeasurement.pop_back();
181 measurementNumber.pop_back();
195 double curvatureSignificance = totalSigma;
196 double curvatureRadius = *radii.rbegin();
197 unsigned index = scatterers - 1;
199 ATH_MSG_VERBOSE(
" scatteringAngleSignificance " << totalSigma <<
" at radius " << radii[
index] <<
" at scatterer " << scatterers
200 <<
" sigmas.size() " << sigmas.size());
202 for (std::vector<double>::const_reverse_iterator
r = sigmas.rbegin();
r != sigmas.rend(); ++
r, --
index) {
203 totalSigma -= 2. * (*r);
205 ATH_MSG_VERBOSE(
" scatteringAngleSignificance " << totalSigma <<
" at radius " << radii[
index - 1] <<
" at scatterer "
208 if (fabs(totalSigma) > fabs(curvatureSignificance) &&
index > 1) {
209 curvatureSignificance = totalSigma;
210 curvatureRadius = radii[
index - 1];
215 curvatureSignificance /= sqrt(
static_cast<double>(scatterers));
217 ATH_MSG_DEBUG(
" scatteringAngleSignificance" << std::setiosflags(std::ios::fixed) << std::setw(7) << std::setprecision(2)
218 << curvatureSignificance <<
" at radius " << std::setw(6) << std::setprecision(1)
219 << curvatureRadius <<
" neighbourSignificance " << std::setw(7) << std::setprecision(2)
220 << neighbourSignificance <<
" at radius " << std::setw(6) << std::setprecision(1)
221 << neighbourRadius <<
" from " << scatterers <<
" scatterers");