Belle II Software  release-06-02-00
BremFindingMatchCompute.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 //This module
10 #include <ecl/modules/eclTrackBremFinder/BremFindingMatchCompute.h>
11 
12 //Framework
13 #include <framework/utilities/Angle.h>
14 
15 //MDST
16 #include <mdst/dataobjects/ECLCluster.h>
17 
18 //genfit
19 #include <genfit/MeasuredStateOnPlane.h>
20 
21 using namespace std;
22 using namespace Belle2;
23 
24 bool BremFindingMatchCompute::isMatch()
25 {
26  auto fitted_state = m_measuredStateOnPlane;
27 
28  auto clusterPosition = m_eclCluster.getClusterPosition();
29 
30  auto fitted_pos = fitted_state.getPos();
31  auto fitted_mom = fitted_state.getMom();
32 
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();
40 
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;
44 
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]);
53 
54 
55  const auto hit_theta = fitted_mom.Theta();
56  double hit_phi = fitted_mom.Phi();
57  if (hit_phi < 0) hit_phi += TMath::TwoPi();
58 
59  PhiAngle hitPhi(hit_phi, err_phi);
60  ThetaAngle hitTheta(hit_theta, err_theta);
61 
62  PhiAngle clusterPhi(0, 0);
63 
64  if ((clusterPosition - fitted_pos).Phi() >= 0) {
65  clusterPhi = PhiAngle((clusterPosition - fitted_pos).Phi(), m_eclCluster.getUncertaintyPhi());
66  } else {
67  clusterPhi = PhiAngle((clusterPosition - fitted_pos).Phi() + TMath::TwoPi(), m_eclCluster.getUncertaintyPhi());
68  }
69  ThetaAngle clusterTheta = ThetaAngle((clusterPosition - fitted_pos).Theta(), m_eclCluster.getUncertaintyTheta());
70 
71  if (clusterPhi.containsIn(hitPhi, m_clusterAcceptanceFactor) &&
72  clusterTheta.containsIn(hitTheta, m_clusterAcceptanceFactor)) {
73 
74  TVector3 hitV;
75  hitV.SetMagThetaPhi(1.0f, hitTheta.getAngle(), hitPhi.getAngle());
76  TVector3 clusterV;
77  clusterV.SetMagThetaPhi(1.0f, clusterTheta.getAngle(), clusterPhi.getAngle());
78 
79  auto distV = hitV - clusterV;
80 
81  m_distanceHitCluster = distV.Mag();
82 
83  // set the effective acceptance factor
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;
90  }
91 
92  return (true);
93 
94  // todo: can use weight here to signal assigment confidence
95 
96  } else {
97  return (false);
98  }
99 }
double getAngle() const
Getter for the angle.
Definition: Angle.h:37
bool containsIn(const PhiAngle &angle, double sigma) const
Check if two angles are compatible.
Definition: Angle.h:175
bool containsIn(const ThetaAngle &angle, double sigma) const
Check if two angles are compatible.
Definition: Angle.h:132
Abstract base class for different kinds of events.