Belle II Software  release-08-01-10
EnergyLossEstimator.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 #include <tracking/trackFindingCDC/eventdata/utils/EnergyLossEstimator.h>
9 
10 #include <tracking/trackFindingCDC/eventdata/trajectories/CDCBFieldUtil.h>
11 
12 #include <tracking/trackFindingCDC/numerics/ESign.h>
13 
14 #include <geometry/GeometryManager.h>
15 
16 #include <framework/gearbox/Unit.h>
17 #include <framework/gearbox/Const.h>
18 #include <framework/logging/Logger.h>
19 
20 #include "G4ThreeVector.hh"
21 #include "G4Navigator.hh"
22 #include "G4VPhysicalVolume.hh"
23 #include "G4Material.hh"
24 
25 using namespace Belle2;
26 using namespace TrackFindingCDC;
27 
29 {
30 
31  // Look up material properties from the Belle2 geometry
32  G4Navigator g4Nav;
33  G4VPhysicalVolume* g4World = geometry::GeometryManager::getInstance().getTopVolume();
34  g4Nav.SetWorldVolume(g4World);
35 
36  // Choose position well inside the CDC
37  double posX = 0;
38  double posY = 50;
39  double posZ = 0;
40 
41  G4ThreeVector g4Pos(posX * CLHEP::cm, posY * CLHEP::cm, posZ * CLHEP::cm);
42  const G4VPhysicalVolume* g4Volume = g4Nav.LocateGlobalPointAndSetup(g4Pos);
43  const G4Material* g4Mat = g4Volume->GetLogicalVolume()->GetMaterial();
44 
45  double A = 0;
46  double Z = 0;
47 
48  if (g4Mat->GetNumberOfElements() == 1) {
49  A = g4Mat->GetA() * CLHEP::mole / CLHEP::g;
50  Z = g4Mat->GetZ();
51  } else {
52  // Calculate weight-averaged A, Z
53  for (unsigned i = 0; i < g4Mat->GetNumberOfElements(); ++i) {
54  const G4Element* element = (*g4Mat->GetElementVector())[i];
55  const double elementA = element->GetA() * CLHEP::mole / CLHEP::g;
56  const double elementZ = element->GetZ();
57  const double frac = g4Mat->GetFractionVector()[i];
58  B2RESULT("Part " << i << " Z=" << elementZ << " A=" << elementA << " (" << frac << ")");
59  Z += elementZ * frac;
60  A += elementA * frac;
61  }
62  }
63 
64  // Make sure to translate to Belle units from the Geant4 / CLHEP units
65  // Z has correct units (is unitless)
66  const double density = g4Mat->GetDensity() / CLHEP::g * CLHEP::cm3;
67  const double radiationLength = g4Mat->GetRadlen() / CLHEP::cm;
68  const double mEE = g4Mat->GetIonisation()->GetMeanExcitationEnergy() / CLHEP::GeV;
69 
70  B2RESULT("Received Z " << Z);
71  B2RESULT("Received A " << A);
72  B2RESULT("Received density " << density);
73  B2RESULT("Received radiation length " << radiationLength);
74  B2RESULT("Received mean excitation energy " << mEE);
75 
76  const double eDensity = Z * density / A;
77  B2RESULT("Received electron density " << eDensity);
78 
79  const double bZ = CDCBFieldUtil::getBFieldZ();
80 
81  return EnergyLossEstimator(eDensity, mEE, bZ);
82 }
83 
84 double EnergyLossEstimator::getMass(int pdgCode)
85 {
86  if (std::abs(pdgCode) == Const::electron.getPDGCode()) {
87  const double electronMass = 0.511 * Unit::MeV;
88  return electronMass;
89  } else if (std::abs(pdgCode) == Const::muon.getPDGCode()) {
90  const double muonMass = 105.658 * Unit::MeV;
91  return muonMass;
92  } else if (std::abs(pdgCode) == Const::kaon.getPDGCode()) {
93  const double kaonMass = 0.493677;
94  return kaonMass;
95  } else if (std::abs(pdgCode) == Const::pion.getPDGCode()) {
96  const double pionMass = 0.13957;
97  return pionMass;
98  } else if (std::abs(pdgCode) == Const::proton.getPDGCode()) {
99  const double protonMass = 0.938272;
100  return protonMass;
101  }
102  return NAN;
103 }
104 
106 {
107  if (std::abs(pdgCode) == Const::electron.getPDGCode()) {
108  return -sign(pdgCode);
109  } else if (std::abs(pdgCode) == Const::muon.getPDGCode()) {
110  return -sign(pdgCode);
111  } else if (std::abs(pdgCode) == Const::kaon.getPDGCode()) {
112  return sign(pdgCode);
113  } else if (std::abs(pdgCode) == Const::pion.getPDGCode()) {
114  return sign(pdgCode);
115  } else if (std::abs(pdgCode) == Const::proton.getPDGCode()) {
116  return sign(pdgCode);
117  }
118  return 0;
119 }
120 
121 EnergyLossEstimator::EnergyLossEstimator(double eDensity, double I, double bZ)
122  : m_eDensity(eDensity)
123  , m_I(I)
124  , m_bZ(bZ)
125 {
126 }
127 
128 double EnergyLossEstimator::getBetheStoppingPower(double p, int pdgCode) const
129 {
130  static const double eMass = getMass(11);
131 
132  const double M = getMass(pdgCode);
133 
134  const double E = std::sqrt(p * p + M * M);
135  const double gamma = E / M;
136  const double beta = p / E;
137 
138  const double beta2 = beta * beta;
139  const double gamma2 = gamma * gamma;
140 
141  const double Wmax = 2 * eMass * beta2 * gamma2 / (1 + 2 * gamma * eMass / M);
142  const double I2 = m_I * m_I;
143 
144  static const double K = 0.307075 * Unit::MeV * Unit::cm2;
145  const double dEdx = K * m_eDensity / beta2 *
146  (1.0 / 2.0 * std::log(2 * eMass * beta2 * gamma2 * Wmax / I2) - beta2);
147  return dEdx;
148 }
149 
150 double EnergyLossEstimator::getEnergyLoss(double p, int pdgCode, double arcLength) const
151 {
152  const double dEdx = getBetheStoppingPower(p, pdgCode);
153  const double eLoss = arcLength * dEdx;
154  return eLoss;
155 }
156 
157 double EnergyLossEstimator::getMomentumLossFactor(double p, int pdgCode, double arcLength) const
158 {
159  const double eLoss = getEnergyLoss(p, pdgCode, arcLength);
160  return (p - eLoss) / p;
161 
162  const double mass = getMass(pdgCode);
163 
164  const double eBefore = std::sqrt(p * p + mass * mass);
165  const double eAfter = eBefore - eLoss;
166  const double pAfter = std::sqrt(eAfter * eAfter - mass * mass);
167  return pAfter / p;
168 }
169 
170 double EnergyLossEstimator::getLossDist2D(double pt, int pdgCode, double arcLength2D) const
171 {
172  const double eLoss = getEnergyLoss(pt, pdgCode, arcLength2D);
173 
174  const int q = getCharge(pdgCode);
175  const double radius = q * CDCBFieldUtil::absMom2DToBendRadius(pt, m_bZ);;
176  return radius * eLoss / (pt - eLoss);
177 
178  // const double pFactor = getMomentumLossFactor(p, pdgCode, arcLength2D);
179  // return radius * (1 / pFactor - 1);
180 }
R E
internal precision of FFTW codelets
#define K(x)
macro autogenerated by FFTW
static const ChargedStable muon
muon particle
Definition: Const.h:651
static const ChargedStable pion
charged pion particle
Definition: Const.h:652
static const ChargedStable proton
proton particle
Definition: Const.h:654
static const ChargedStable kaon
charged kaon particle
Definition: Const.h:653
static const ChargedStable electron
electron particle
Definition: Const.h:650
static double getBFieldZ()
Getter for the signed magnetic field stength in z direction at the origin ( in Tesla )
static double absMom2DToBendRadius(double absMom2D, double bZ)
Conversion helper for momenta to two dimensional (absolute) bend radius.
Helper struct to provide consistent energy loss estimation throughout the CDC track finding.
double getLossDist2D(double pt, int pdgCode, double arcLength2D) const
Calculates a correction term for the two dimensional distance undoing the energy loss after the given...
double getMomentumLossFactor(double p, int pdgCode, double arcLength) const
Calculates a factor applicable scaling the current momentum to the momentum after traveling given arc...
static EnergyLossEstimator forCDC()
Create an energy loss estimator with the material properties of the CDC.
double m_eDensity
Electron density in mol / cm^3.
double m_bZ
B field to be used for the distance translation.
static int getCharge(int pdgCode)
Lookup the charge for the given pdg code.
double getEnergyLoss(double p, int pdgCode, double arcLength) const
Calculates the total energy loss after travelling the given distance.
static double getMass(int pdgCode)
Lookup the mass for the given pdg code.
double m_I
Mean excitation energy in GeV.
EnergyLossEstimator(double eDensity, double I, double bZ=NAN)
Constructor from the material properties.
double getBetheStoppingPower(double p, int pdgCode) const
Stopping power aka energy loss / arc length.
static const double MeV
[megaelectronvolt]
Definition: Unit.h:114
static const double cm2
[square centimeters]
Definition: Unit.h:78
static GeometryManager & getInstance()
Return a reference to the instance.
G4VPhysicalVolume * getTopVolume()
Return a pointer to the top volume.
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
Abstract base class for different kinds of events.