153 if (startLayer >= endLayer)
154 return STATUS_CODE_INVALID_PARAMETER;
157 const unsigned int listSize(orderedCaloHitList.
size());
160 return STATUS_CODE_NOT_INITIALIZED;
163 return STATUS_CODE_OUT_OF_RANGE;
168 const unsigned int pseudoLayer(layerIter.first);
170 if (startLayer > pseudoLayer)
173 if (endLayer < pseudoLayer)
176 const unsigned int nCaloHits(layerIter.second->size());
181 float cellLengthScaleSum(0.f), cellEnergySum(0.f);
184 for (
const CaloHit *
const pCaloHit : *layerIter.second)
186 cellLengthScaleSum += pCaloHit->GetCellLengthScale();
187 cellNormalVectorSum += pCaloHit->GetCellNormalVector();
188 cellEnergySum += pCaloHit->GetInputEnergy();
192 cellLengthScaleSum /
static_cast<float>(nCaloHits), cellEnergySum /
static_cast<float>(nCaloHits), pseudoLayer));
195 return FitPoints(clusterFitPointList, clusterFitResult);
242 std::sort(clusterFitPointList.begin(), clusterFitPointList.end());
245 double sumP(0.), sumQ(0.), sumR(0.), sumWeights(0.);
246 double sumPR(0.), sumQR(0.), sumRR(0.);
250 const double sinTheta(std::sin(std::acos(cosTheta)));
257 const CartesianVector position(clusterFitPoint.GetPosition() - centralPosition);
258 const double weight(1.);
260 const double p( (cosTheta + rotationAxis.
GetX() * rotationAxis.
GetX() * (1. - cosTheta)) * position.
GetX() +
261 (rotationAxis.
GetX() * rotationAxis.
GetY() * (1. - cosTheta) - rotationAxis.
GetZ() * sinTheta) * position.
GetY() +
262 (rotationAxis.
GetX() * rotationAxis.
GetZ() * (1. - cosTheta) + rotationAxis.
GetY() * sinTheta) * position.
GetZ() );
263 const double q( (rotationAxis.
GetY() * rotationAxis.
GetX() * (1. - cosTheta) + rotationAxis.
GetZ() * sinTheta) * position.
GetX() +
264 (cosTheta + rotationAxis.
GetY() * rotationAxis.
GetY() * (1. - cosTheta)) * position.
GetY() +
265 (rotationAxis.
GetY() * rotationAxis.
GetZ() * (1. - cosTheta) - rotationAxis.
GetX() * sinTheta) * position.
GetZ() );
266 const double r( (rotationAxis.
GetZ() * rotationAxis.
GetX() * (1. - cosTheta) - rotationAxis.
GetY() * sinTheta) * position.
GetX() +
267 (rotationAxis.
GetZ() * rotationAxis.
GetY() * (1. - cosTheta) + rotationAxis.
GetX() * sinTheta) * position.
GetY() +
268 (cosTheta + rotationAxis.
GetZ() * rotationAxis.
GetZ() * (1. - cosTheta)) * position.
GetZ() );
270 sumP += p * weight; sumQ += q * weight; sumR += r * weight;
271 sumPR += p * r * weight; sumQR += q * r * weight; sumRR += r * r * weight;
272 sumWeights += weight;
276 const double denominatorR(sumR * sumR - sumWeights * sumRR);
278 if (std::fabs(denominatorR) < std::numeric_limits<double>::epsilon())
279 return STATUS_CODE_FAILURE;
281 const double aP((sumR * sumP - sumWeights * sumPR) / denominatorR);
282 const double bP((sumP - aP * sumR) / sumWeights);
283 const double aQ((sumR * sumQ - sumWeights * sumQR) / denominatorR);
284 const double bQ((sumQ - aQ * sumR) / sumWeights);
287 const double magnitude(std::sqrt(1. + aP * aP + aQ * aQ));
288 const double dirP(aP / magnitude), dirQ(aQ / magnitude), dirR(1. / magnitude);
291 static_cast<float>((cosTheta + rotationAxis.
GetX() * rotationAxis.
GetX() * (1. - cosTheta)) * dirP +
292 (rotationAxis.
GetX() * rotationAxis.
GetY() * (1. - cosTheta) + rotationAxis.
GetZ() * sinTheta) * dirQ +
293 (rotationAxis.
GetX() * rotationAxis.
GetZ() * (1. - cosTheta) - rotationAxis.
GetY() * sinTheta) * dirR),
294 static_cast<float>((rotationAxis.
GetY() * rotationAxis.
GetX() * (1. - cosTheta) - rotationAxis.
GetZ() * sinTheta) * dirP +
295 (cosTheta + rotationAxis.
GetY() * rotationAxis.
GetY() * (1. - cosTheta)) * dirQ +
296 (rotationAxis.
GetY() * rotationAxis.
GetZ() * (1. - cosTheta) + rotationAxis.
GetX() * sinTheta) * dirR),
297 static_cast<float>((rotationAxis.
GetZ() * rotationAxis.
GetX() * (1. - cosTheta) + rotationAxis.
GetY() * sinTheta) * dirP +
298 (rotationAxis.
GetZ() * rotationAxis.
GetY() * (1. - cosTheta) - rotationAxis.
GetX() * sinTheta) * dirQ +
299 (cosTheta + rotationAxis.
GetZ() * rotationAxis.
GetZ() * (1. - cosTheta)) * dirR) );
302 static_cast<float>((cosTheta + rotationAxis.
GetX() * rotationAxis.
GetX() * (1. - cosTheta)) * bP +
303 (rotationAxis.
GetX() * rotationAxis.
GetY() * (1. - cosTheta) + rotationAxis.
GetZ() * sinTheta) * bQ),
304 static_cast<float>((rotationAxis.
GetY() * rotationAxis.
GetX() * (1. - cosTheta) - rotationAxis.
GetZ() * sinTheta) * bP +
305 (cosTheta + rotationAxis.
GetY() * rotationAxis.
GetY() * (1. - cosTheta)) * bQ),
306 static_cast<float>((rotationAxis.
GetZ() * rotationAxis.
GetX() * (1. - cosTheta) + rotationAxis.
GetY() * sinTheta) * bP +
307 (rotationAxis.
GetZ() * rotationAxis.
GetY() * (1. - cosTheta) - rotationAxis.
GetX() * sinTheta) * bQ) ));
315 direction = direction * -1.f;
319 double chi2_P(0.), chi2_Q(0.), rms(0.);
320 double sumA(0.), sumL(0.), sumAL(0.), sumLL(0.);
324 const CartesianVector position(clusterFitPoint.GetPosition() - centralPosition);
326 const double p( (cosTheta + rotationAxis.
GetX() * rotationAxis.
GetX() * (1. - cosTheta)) * position.
GetX() +
327 (rotationAxis.
GetX() * rotationAxis.
GetY() * (1. - cosTheta) - rotationAxis.
GetZ() * sinTheta) * position.
GetY() +
328 (rotationAxis.
GetX() * rotationAxis.
GetZ() * (1. - cosTheta) + rotationAxis.
GetY() * sinTheta) * position.
GetZ() );
329 const double q( (rotationAxis.
GetY() * rotationAxis.
GetX() * (1. - cosTheta) + rotationAxis.
GetZ() * sinTheta) * position.
GetX() +
330 (cosTheta + rotationAxis.
GetY() * rotationAxis.
GetY() * (1. - cosTheta)) * position.
GetY() +
331 (rotationAxis.
GetY() * rotationAxis.
GetZ() * (1. - cosTheta) - rotationAxis.
GetX() * sinTheta) * position.
GetZ() );
332 const double r( (rotationAxis.
GetZ() * rotationAxis.
GetX() * (1. - cosTheta) - rotationAxis.
GetY() * sinTheta) * position.
GetX() +
333 (rotationAxis.
GetZ() * rotationAxis.
GetY() * (1. - cosTheta) + rotationAxis.
GetX() * sinTheta) * position.
GetY() +
334 (cosTheta + rotationAxis.
GetZ() * rotationAxis.
GetZ() * (1. - cosTheta)) * position.
GetZ() );
336 const double error(clusterFitPoint.GetCellSize() / 3.46);
337 const double chiP((p - aP * r - bP) / error);
338 const double chiQ((q - aQ * r - bQ) / error);
340 chi2_P += chiP * chiP;
341 chi2_Q += chiQ * chiQ;
343 const CartesianVector difference(clusterFitPoint.GetPosition() - intercept);
347 const float l(
static_cast<float>(clusterFitPoint.GetPseudoLayer()));
348 sumA += a; sumL += l; sumAL += a * l; sumLL += l * l;
351 const double nPoints(
static_cast<double>(clusterFitPointList.size()));
352 const double denominatorL(sumL * sumL - nPoints * sumLL);
354 if (std::fabs(denominatorL) > std::numeric_limits<double>::epsilon())
356 if (0. > ((sumL * sumA - nPoints * sumAL) / denominatorL))
357 direction = direction * -1.f;
362 clusterFitResult.
SetChi2(
static_cast<float>((chi2_P + chi2_Q) / nPoints));
363 clusterFitResult.
SetRms(
static_cast<float>(std::sqrt(rms / nPoints)));
367 return STATUS_CODE_SUCCESS;