10 #include <ecl/modules/eclTrackBremFinder/BremFindingMatchCompute.h>
13 #include <framework/utilities/Angle.h>
16 #include <mdst/dataobjects/ECLCluster.h>
19 #include <genfit/MeasuredStateOnPlane.h>
24 bool BremFindingMatchCompute::isMatch()
26 auto fitted_state = m_measuredStateOnPlane;
28 auto clusterPosition = m_eclCluster.getClusterPosition();
30 auto fitted_pos = fitted_state.getPos();
31 auto fitted_mom = fitted_state.getMom();
33 auto cov = fitted_state.get6DCov();
34 const double err_px = cov[3][3];
35 const double err_py = cov[4][4];
36 const double err_pz = cov[5][5];
37 const double px = fitted_mom.X();
38 const double py = fitted_mom.Y();
39 const double pz = fitted_mom.Z();
41 const double square_perp = px * px + py * py ;
42 const double perp = std::sqrt(square_perp);
43 const double square_sum = square_perp + pz * pz;
45 const double err_phi = std::sqrt(pow((py / square_perp), 2) * err_px + pow((px / square_perp), 2) * err_py +
46 (py / square_perp) * (px / square_perp) * cov[3][4]);
47 const double err_theta = std::sqrt(pow(((px * pz) / (square_sum * perp)), 2) * err_px +
48 pow(((py * pz) / (square_sum * perp)), 2) * err_py +
49 pow((perp / square_sum), 2) * err_pz +
50 ((px * pz) / (square_sum * perp)) * ((py * pz) / (square_sum * perp)) * cov[3][4] +
51 ((px * pz) / (square_sum * perp)) * (perp / square_sum) * cov[3][5] +
52 ((py * pz) / (square_sum * perp)) * (perp / square_sum) * cov[4][5]);
55 const auto hit_theta = fitted_mom.Theta();
56 double hit_phi = fitted_mom.Phi();
57 if (hit_phi < 0) hit_phi += TMath::TwoPi();
64 if ((clusterPosition - fitted_pos).Phi() >= 0) {
65 clusterPhi =
PhiAngle((clusterPosition - fitted_pos).Phi(), m_eclCluster.getUncertaintyPhi());
67 clusterPhi =
PhiAngle((clusterPosition - fitted_pos).Phi() + TMath::TwoPi(), m_eclCluster.getUncertaintyPhi());
69 ThetaAngle clusterTheta =
ThetaAngle((clusterPosition - fitted_pos).Theta(), m_eclCluster.getUncertaintyTheta());
71 if (clusterPhi.
containsIn(hitPhi, m_clusterAcceptanceFactor) &&
72 clusterTheta.
containsIn(hitTheta, m_clusterAcceptanceFactor)) {
77 clusterV.SetMagThetaPhi(1.0f, clusterTheta.
getAngle(), clusterPhi.
getAngle());
79 auto distV = hitV - clusterV;
81 m_distanceHitCluster = distV.Mag();
84 double deltaTheta = abs(hitV.Y() - clusterV.Y());
85 m_effAcceptanceFactor = deltaTheta / (err_theta + m_eclCluster.getUncertaintyTheta());
86 double deltaPhi = abs(hitV.Z() - clusterV.Z());
87 double effFactor = deltaPhi / (err_phi + m_eclCluster.getUncertaintyPhi());
88 if (effFactor > m_effAcceptanceFactor) {
89 m_effAcceptanceFactor = effFactor;
double getAngle() const
Getter for the angle.
bool containsIn(const PhiAngle &angle, double sigma) const
Check if two angles are compatible.
bool containsIn(const ThetaAngle &angle, double sigma) const
Check if two angles are compatible.
Abstract base class for different kinds of events.