Belle II Software  release-05-01-25
MuidElementNumbers.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2020 Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Giacomo De Pietro *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 /* Own header. */
12 #include <klm/muid/MuidElementNumbers.h>
13 
14 /* Belle2 headers. */
15 #include <framework/gearbox/Const.h>
16 
17 using namespace Belle2;
18 
20 {
21 }
22 
24 {
25 }
26 
27 bool MuidElementNumbers::checkExtrapolationOutcome(unsigned int outcome, int lastLayer)
28 {
29  /* KLM volume not reached during the extrapolation. */
30  if (outcome == MuidElementNumbers::c_NotReached)
31  return false;
32  /* Barrel stop: never in layer 14. */
33  if ((outcome == MuidElementNumbers::c_StopInBarrel)
34  && (lastLayer > MuidElementNumbers::getMaximalBarrelLayer() - 1))
35  return false;
36  /* Forward endcap stop: never in layer 13. */
37  if ((outcome == MuidElementNumbers::c_StopInForwardEndcap)
39  return false;
40  /* Barrel exit: no layers greater than 15. */
41  if ((outcome == MuidElementNumbers::c_ExitBarrel)
43  return false;
44  /* Forward endcap exit: no layers greater than 14. */
45  if ((outcome == MuidElementNumbers::c_ExitForwardEndcap)
47  return false;
48  /* Backward endcap stop: never in layer 11. */
49  if ((outcome == MuidElementNumbers::c_StopInBackwardEndcap)
51  return false;
52  /* Backward endcap exit: no layers greater than 12. */
53  if ((outcome == MuidElementNumbers::c_ExitBackwardEndcap)
55  return false;
56  /* Like outcome == c_StopInForwardEndcap. */
57  if ((outcome >= MuidElementNumbers::c_CrossBarrelStopInForwardMin)
58  && (outcome <= MuidElementNumbers::c_CrossBarrelStopInForwardMax)
60  return false;
61  /* Like outcome == c_StopInBackwardEndcap. */
62  if ((outcome >= MuidElementNumbers::c_CrossBarrelStopInBackwardMin)
63  && (outcome <= MuidElementNumbers::c_CrossBarrelStopInBackwardMax)
65  return false;
66  /* Like outcome == c_ExitForwardEndcap. */
67  if ((outcome >= MuidElementNumbers::c_CrossBarrelExitForwardMin)
68  && (outcome <= MuidElementNumbers::c_CrossBarrelExitForwardMax)
70  return false;
71  /* Like outcome == c_ExitBackwardEndcap. */
72  if ((outcome >= MuidElementNumbers::c_CrossBarrelExitBackwardMin)
73  && (outcome <= MuidElementNumbers::c_CrossBarrelExitBackwardMax)
75  return false;
76  return true;
77 }
78 
79 unsigned int MuidElementNumbers::calculateExtrapolationOutcome(bool isForward, bool escaped, int lastBarrelLayer,
80  int lastEndcapLayer)
81 {
82  unsigned int outcome = MuidElementNumbers::c_NotReached;
83  if ((lastBarrelLayer >= 0) || (lastEndcapLayer >= 0)) {
84  /* Stop or exit in barrel. */
85  if (lastEndcapLayer < 0) {
86  if (escaped)
87  outcome = MuidElementNumbers::c_ExitBarrel;
88  else
89  outcome = MuidElementNumbers::c_StopInBarrel;
90  }
91  /* Stop or exit in endcap. */
92  else {
93  if (escaped) {
94  if (lastBarrelLayer < 0) { /* Exit in endcap with no barrel hits. */
95  if (isForward)
96  outcome = MuidElementNumbers::c_ExitForwardEndcap;
97  else
98  outcome = MuidElementNumbers::c_ExitBackwardEndcap;
99  } else { /* Exit in endcap with barrel hits. */
100  if (isForward)
101  outcome = MuidElementNumbers::c_CrossBarrelExitForwardMin + lastBarrelLayer;
102  else
103  outcome = MuidElementNumbers::c_CrossBarrelExitBackwardMin + lastBarrelLayer;
104  }
105  } else {
106  if (lastBarrelLayer < 0) { /* Stop in endcap with no barrel hits. */
107  if (isForward)
108  outcome = MuidElementNumbers::c_StopInForwardEndcap;
109  else
110  outcome = MuidElementNumbers::c_StopInBackwardEndcap;
111  } else { /* Stop in endcap with barrel hits. */
112  if (isForward)
113  outcome = MuidElementNumbers::c_CrossBarrelStopInForwardMin + lastBarrelLayer;
114  else
115  outcome = MuidElementNumbers::c_CrossBarrelStopInBackwardMin + lastBarrelLayer;
116  }
117  }
118  }
119  }
120  return outcome;
121 }
122 
124 {
125  /* For leptons, the sign of the PDG code is opposite to the charge. */
126  if (pdg == Const::electron.getPDGCode())
127  return MuidElementNumbers::c_Electron;
128  if (pdg == -Const::electron.getPDGCode())
129  return MuidElementNumbers::c_Positron;
130  if (pdg == Const::muon.getPDGCode())
131  return MuidElementNumbers::c_MuonMinus;
132  if (pdg == -Const::muon.getPDGCode())
133  return MuidElementNumbers::c_MuonPlus;
134  /* For hadrons, the sign of the PDG code is equal to the charge. */
135  if (pdg == Const::deuteron.getPDGCode())
136  return MuidElementNumbers::c_Deuteron;
137  if (pdg == -Const::deuteron.getPDGCode())
138  return MuidElementNumbers::c_AntiDeuteron;
139  if (pdg == Const::proton.getPDGCode())
140  return MuidElementNumbers::c_Proton;
141  if (pdg == -Const::proton.getPDGCode())
142  return MuidElementNumbers::c_AntiProton;
143  if (pdg == Const::pion.getPDGCode())
144  return MuidElementNumbers::c_PionPlus;
145  if (pdg == -Const::pion.getPDGCode())
146  return MuidElementNumbers::c_PionMinus;
147  if (pdg == Const::kaon.getPDGCode())
148  return MuidElementNumbers::c_KaonPlus;
149  if (pdg == -Const::kaon.getPDGCode())
150  return MuidElementNumbers::c_KaonMinus;
151  /* Only charged final state particles are supported. */
152  return MuidElementNumbers::c_NotValid;
153 }
154 
155 std::vector<int> MuidElementNumbers::getPDGVector(int charge)
156 {
157  std::vector<int> pdgVector;
158  for (const Const::ChargedStable particle : Const::chargedStableSet) {
159  if ((particle == Const::electron) || (particle == Const::muon))
160  pdgVector.push_back(-charge * particle.getPDGCode());
161  else
162  pdgVector.push_back(charge * particle.getPDGCode());
163  }
164  return pdgVector;
165 }
166 
168 {
169  std::vector<int> pdgVector = getPDGVector(1);
170  std::vector<int> temp = getPDGVector(-1);
171  pdgVector.insert(pdgVector.end(), temp.begin(), temp.end());
172  std::sort(pdgVector.begin(), pdgVector.end());
173  return pdgVector;
174 }
175 
176 int MuidElementNumbers::getLongitudinalID(int hypothesis, int outcome, int lastLayer)
177 {
178  int id = lastLayer;
179  id += (outcome << MuidElementNumbers::c_LastLayerBit);
181  return id;
182 }
183 
184 int MuidElementNumbers::getTransverseID(int hypothesis, int detector, int degreesOfFreedom)
185 {
186  int id = degreesOfFreedom;
187  id += (detector << MuidElementNumbers::c_DegreesOfFreedomBit);
189  return id;
190 }
Belle2::MuidElementNumbers::getLongitudinalID
static int getLongitudinalID(int hypothesis, int outcome, int lastLayer)
Get the unique longitudinal identifier for given hypothesis, outcome and last layer crossed.
Definition: MuidElementNumbers.cc:176
Belle2::MuidElementNumbers::c_DegreesOfFreedomBit
@ c_DegreesOfFreedomBit
Number of bits occupied by degreesOfFreedom in getTransverseID().
Definition: MuidElementNumbers.h:102
Belle2::Const::electron
static const ChargedStable electron
electron particle
Definition: Const.h:533
Belle2::MuidElementNumbers::c_OutcomeBit
@ c_OutcomeBit
Number of bits occupied by outcome in getLongitudinalID().
Definition: MuidElementNumbers.h:96
Belle2::MuidElementNumbers::Hypothesis
Hypothesis
Hypothesis number.
Definition: MuidElementNumbers.h:75
Belle2::MuidElementNumbers::checkExtrapolationOutcome
static bool checkExtrapolationOutcome(unsigned int outcome, int lastLayer)
Check the track extrapolation outcome.
Definition: MuidElementNumbers.cc:27
Belle2::Const::chargedStableSet
static const ParticleSet chargedStableSet
set of charged stable particles
Definition: Const.h:494
Belle2::MuidElementNumbers::calculateExtrapolationOutcome
static unsigned int calculateExtrapolationOutcome(bool isForward, bool escaped, int lastBarrelLayer, int lastEndcapLayer)
Calculate the track extrapolation outcome.
Definition: MuidElementNumbers.cc:79
Belle2::MuidElementNumbers::getMaximalBarrelLayer
static constexpr int getMaximalBarrelLayer()
Get maximal barrel layer number (0-based).
Definition: MuidElementNumbers.h:140
Belle2::Const::kaon
static const ChargedStable kaon
charged kaon particle
Definition: Const.h:536
Belle2::MuidElementNumbers::c_DetectorBit
@ c_DetectorBit
Number of bits occupied by detector in getTransverseID().
Definition: MuidElementNumbers.h:100
Belle2::Const::pion
static const ChargedStable pion
charged pion particle
Definition: Const.h:535
Belle2::MuidElementNumbers::c_LastLayerBit
@ c_LastLayerBit
Number of bits occupied by lastLayer in getLongitudinalID().
Definition: MuidElementNumbers.h:98
Belle2::MuidElementNumbers::calculateHypothesisFromPDG
static Hypothesis calculateHypothesisFromPDG(int pdg)
Calculate hypothesis number from PDG code.
Definition: MuidElementNumbers.cc:123
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::MuidElementNumbers::getPDGVector
static std::vector< int > getPDGVector()
Get a vector with all the hypothesis PDG codes used for Muid.
Definition: MuidElementNumbers.cc:167
Belle2::Const::deuteron
static const ChargedStable deuteron
deuteron particle
Definition: Const.h:538
Belle2::MuidElementNumbers::getMaximalEndcapForwardLayer
static constexpr int getMaximalEndcapForwardLayer()
Get maximal endcap-forward layer number (0-based).
Definition: MuidElementNumbers.h:148
Belle2::MuidElementNumbers::getMaximalEndcapBackwardLayer
static constexpr int getMaximalEndcapBackwardLayer()
Get maximal endcap-forward layer number (0-based).
Definition: MuidElementNumbers.h:156
Belle2::Const::proton
static const ChargedStable proton
proton particle
Definition: Const.h:537
Belle2::Const::ChargedStable
Provides a type-safe way to pass members of the chargedStableSet set.
Definition: Const.h:465
Belle2::MuidElementNumbers::~MuidElementNumbers
~MuidElementNumbers()
Destructor.
Definition: MuidElementNumbers.cc:23
Belle2::Const::muon
static const ChargedStable muon
muon particle
Definition: Const.h:534
Belle2::MuidElementNumbers::getTransverseID
static int getTransverseID(int hypothesis, int detector, int degreesOfFreedom)
Get the unique transverse identifier for given hypothesis, detector and degrees of freedom.
Definition: MuidElementNumbers.cc:184
Belle2::MuidElementNumbers::MuidElementNumbers
MuidElementNumbers()
Constructor.
Definition: MuidElementNumbers.cc:19