Belle II Software  release-08-01-10
DeltaRayPDF.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 #include <top/reconstruction_cpp/DeltaRayPDF.h>
10 #include <top/reconstruction_cpp/TOPRecoManager.h>
11 #include <top/geometry/TOPGeometryPar.h>
12 #include <framework/logging/Logger.h>
13 #include <cmath>
14 
15 using namespace std;
16 
17 namespace Belle2 {
22  namespace TOP {
23 
24  DeltaRayPDF::DeltaRayPDF(int moduleID):
25  m_moduleID(moduleID), m_background(TOPRecoManager::getBackgroundPDF(moduleID))
26  {
27  if (not m_background) {
28  B2ERROR("TOP::DeltaRayPDF: background PDF not found");
29  return;
30  }
31 
32  const auto* yScanner = TOPRecoManager::getYScanner(moduleID);
33  if (not yScanner) {
34  B2ERROR("TOP::DeltaRayPDF: YScanner not found");
35  return;
36  }
37 
38  m_pixelPositions = &(yScanner->getPixelPositions());
39 
40  m_zD = yScanner->getPrism().zD;
41  m_zM = yScanner->getBars().back().zR;
42  double meanE = yScanner->getMeanEnergyBeta1();
43  double sigE = yScanner->getRMSEnergyBeta1();
46  double dng_de = TOPGeometryPar::Instance()->getGroupIndexDerivative(meanE);
47  m_dispersion = dng_de / m_groupIndex * sigE;
48 
49  const int N = 1000;
50  double dkz = 1.0 / N;
51  m_norms.push_back(0);
52  for (int i = 0; i < N; i++) {
53  double kz = (i + 0.5) * dkz;
54  m_angularNorm += angularDistr(kz) * dkz;
55  m_norms.push_back(m_angularNorm);
56  }
57  for (auto& norm : m_norms) norm /= m_angularNorm;
58 
59  const int Np = 101;
60  double dx = 6.0 / (Np - 1);
61  for (int i = 0; i < Np; i++) {
62  double x = i * dx - 3.0;
63  m_tableGaus.push_back(GausXY(x));
64  }
65  double sum = 0;
66  for (const auto& gaus : m_tableGaus) sum += gaus.y;
67  for (auto& gaus : m_tableGaus) gaus.y /= sum;
68  }
69 
70  void DeltaRayPDF::prepare(const TOPTrack& track, const Const::ChargedStable& hypothesis)
71  {
72  const auto& emi = track.getEmissionPoint().position;
73  m_xE = emi.X();
74  m_yE = emi.Y();
75  m_zE = emi.Z();
79  m_TOF = track.getTOF(hypothesis);
80 
81  if (m_dirT0 < 0) {
82  B2ERROR("TOP::DeltaRayPDF::prepare: T0 direct is negative -> set to 0");
83  m_dirT0 = 0;
84  }
85  if (m_reflT0 < 0) {
86  B2ERROR("TOP::DeltaRayPDF::prepare: T0 reflected is negative -> set to 0");
87  m_reflT0 = 0;
88  }
89 
90  double beta = track.getBeta(hypothesis);
91  int PDGCode = std::abs(hypothesis.getPDGCode());
92  if (PDGCode < 20) PDGCode = -PDGCode;
93  if (track.getCharge() < 0) PDGCode = -PDGCode;
94  double tlen = track.getLengthInQuartz();
95  double tmin = TOPRecoManager::getMinTime();
96  double tmax = TOPRecoManager::getMaxTime();
97  double relEffi = m_background->getEfficiency();
98  m_fraction = totalFraction(tmin, tmax);
99  m_numPhotons = photonYield(beta, PDGCode) * tlen * m_fraction * relEffi;
100 
101  for (const auto& pixel : m_pixelPositions->getPixels()) {
102  double dfi_dx = std::abs(m_zD - m_zE) / (pow(pixel.xc - m_xE, 2) + pow(pixel.yc - m_yE, 2) + pow(m_zD - m_zE, 2));
103  m_pixelAcceptances.push_back(dfi_dx * pixel.Dx);
104  }
105  double sum = 0;
106  const auto& pixelPDF = m_background->getPDF();
107  for (size_t k = 0; k < m_pixelAcceptances.size(); k++) {
108  sum += m_pixelAcceptances[k] * pixelPDF[k];
109  }
110  for (auto& x : m_pixelAcceptances) x /= sum;
111  }
112 
113  double DeltaRayPDF::getPDFValue(int pixelID, double time) const
114  {
115  const auto& pixelPDF = m_background->getPDF();
116  unsigned k = pixelID - 1;
117  if (k < pixelPDF.size()) {
118  const auto& pixel = m_pixelPositions->get(pixelID);
119  double t0 = sqrt(pow(pixel.xc - m_xE, 2) + pow(pixel.yc - m_yE, 2) + pow(m_zD - m_zE, 2))
121  return getPDFValue(time, t0 - m_dirT0, m_pixelAcceptances[k]) * pixelPDF[k];
122  }
123  return 0;
124  }
125 
126  double DeltaRayPDF::smearedTimeDistr(double t, double t0) const
127  {
128  const double sigma0 = 0.15;
129  double sigma = sqrt(pow(sigma0, 2) + pow(m_dispersion * t, 2));
130 
131  if (sigma < 0.001) return timeDistr(t, t0);
132 
133  double f = 0;
134  for (const auto& gaus : m_tableGaus) f += timeDistr(t - gaus.x * sigma, t0) * gaus.y;
135  return f;
136  }
137 
138  double DeltaRayPDF::peakFraction(double tmin, double tmax, double t0) const
139  {
140  int nt = m_norms.size() - 1;
141  int i1 = nt;
142  if (tmax > t0) i1 = t0 / tmax * nt;
143  int i2 = nt;
144  if (tmin > t0) i2 = t0 / tmin * nt;
145  return std::abs(m_norms[i2] - m_norms[i1]);
146  }
147 
148  double DeltaRayPDF::totalFraction(double tmin, double tmax) const
149  {
150  double dirPeak = peakFraction(tmin - m_TOF, tmax - m_TOF, m_dirT0);
151  double reflPeak = peakFraction(tmin - m_TOF, tmax - m_TOF, m_reflT0);
152  return m_dirFrac * dirPeak + (1 - m_dirFrac) * reflPeak;
153  }
154 
155  double DeltaRayPDF::directFraction(double z) const
156  {
157  // coefficients of 5th order polynom (from fit to MC, see B2GM/TOP Software status, June 2020)
158  const double par[] = {0.332741, -0.00331502, 2.0801e-05, -3.43689e-09, -6.35849e-10, 3.54556e-12};
159 
160  double x = 1;
161  double f = 0;
162  for (auto p : par) {
163  f += p * x;
164  x *= z;
165  }
166  return f;
167  }
168 
169  double DeltaRayPDF::photonYield(double beta, int PDGCode) const
170  {
171  // for parametrizations see B2GM/TOP Software status, June 2020
172  const double averagePDE = 1.06404889; // relative to nominal PDE
173  const double scaleFactor = 0.79;
174 
175  if (std::abs(PDGCode) == 11) { // electorns and positrons
176  return 5.30 * scaleFactor / averagePDE;
177  } else if (PDGCode == -2212) { // anti-protons
178  const double par[] = {13.5859, -28.0625, 17.2684};
179  double f = par[0] + par[1] * beta + par[2] * beta * beta;
180  return f * scaleFactor / averagePDE;
181  } else { // other charged particles
182  const double par[] = { -8.15871, 10.0082, -1.25140, -120.225, 120.210};
183  double f = exp(par[0] + par[1] * beta + par[2] * beta * beta) + exp(par[3] + par[4] * beta);
184  return f * scaleFactor / averagePDE;
185  }
186  }
187 
188  } // namespace TOP
190 } // namespace Belle2
Provides a type-safe way to pass members of the chargedStableSet set.
Definition: Const.h:580
int getPDGCode() const
PDG code.
Definition: Const.h:464
static const double speedOfLight
[cm/ns]
Definition: Const.h:686
const std::vector< double > & getPDF() const
Returns pixel part of PDF.
Definition: BackgroundPDF.h:50
double getEfficiency() const
Returns average of pixel relative efficiencies.
Definition: BackgroundPDF.h:56
double m_dispersion
dispersion coefficient
Definition: DeltaRayPDF.h:168
double m_dirT0
minimal propagation time of direct photons
Definition: DeltaRayPDF.h:178
double m_reflT0
minimal propagation time of reflected photons
Definition: DeltaRayPDF.h:179
double totalFraction(double tmin, double tmax) const
Total fraction of delta-ray photons within given propagation time interval.
Definition: DeltaRayPDF.cc:148
double directFraction(double z) const
Fraction of direct photons from delta-rays, e.g direct/(direct+reflected)
Definition: DeltaRayPDF.cc:155
double m_zD
detector (photo-cathode) position in z
Definition: DeltaRayPDF.h:164
double m_dirFrac
fraction of direct photons
Definition: DeltaRayPDF.h:177
void prepare(const TOPTrack &track, const Const::ChargedStable &hypothesis)
Prepare the object.
Definition: DeltaRayPDF.cc:70
double m_yE
average photon emission position in y
Definition: DeltaRayPDF.h:175
double m_TOF
time-of-flight of particle
Definition: DeltaRayPDF.h:180
double m_groupIndex
group refractive index
Definition: DeltaRayPDF.h:167
const BackgroundPDF * m_background
background PDF
Definition: DeltaRayPDF.h:162
double photonYield(double beta, int PDGCode) const
Photon yield from delta-rays per track length in quartz for nominal photon detection efficiency.
Definition: DeltaRayPDF.cc:169
std::vector< double > m_norms
relative angular distribution normalization constants (cumulative)
Definition: DeltaRayPDF.h:170
std::vector< GausXY > m_tableGaus
table of normal (Gaussian) distribution
Definition: DeltaRayPDF.h:171
double m_zM
spherical mirror position in z
Definition: DeltaRayPDF.h:165
double m_angularNorm
angular distribution normalization constant
Definition: DeltaRayPDF.h:169
double peakFraction(double tmin, double tmax, double t0) const
Fraction of delta-ray photons within given propagation time interval for single peak at t0.
Definition: DeltaRayPDF.cc:138
double m_fraction
fraction of delta-ray photons within time window
Definition: DeltaRayPDF.h:181
std::vector< double > m_pixelAcceptances
pixel angular acceptances for direct peak (index = pixelID - 1)
Definition: DeltaRayPDF.h:183
double m_phaseIndex
phase refractive index
Definition: DeltaRayPDF.h:166
double smearedTimeDistr(double t, double t0) const
Smeared time distribution of photons from delta rays (normalized).
Definition: DeltaRayPDF.cc:126
const PixelPositions * m_pixelPositions
pixel positions
Definition: DeltaRayPDF.h:163
double angularDistr(double kz) const
Angular distribution of photons from delta rays w/ total reflection requirement.
Definition: DeltaRayPDF.h:190
double m_zE
average photon emission position in z
Definition: DeltaRayPDF.h:176
double m_numPhotons
number of photons
Definition: DeltaRayPDF.h:182
double getPDFValue(int pixelID, double time) const
Returns PDF value at given time and pixel.
Definition: DeltaRayPDF.cc:113
double timeDistr(double t, double t0) const
Time distribution of photons from delta rays (normalized).
Definition: DeltaRayPDF.h:199
double m_xE
average photon emission position in x
Definition: DeltaRayPDF.h:174
const std::vector< PixelData > & getPixels() const
Returns pixel data of entire module.
const PixelData & get(int pixelID) const
Returns pixel data for given pixelID.
double getGroupIndexDerivative(double energy) const
Returns the derivative (dn_g/dE) of group refractive index of quartz at given photon energy.
static TOPGeometryPar * Instance()
Static method to obtain the pointer to its instance.
double getPhaseIndex(double energy) const
Returns phase refractive index of quartz at given photon energy.
double getGroupIndex(double energy) const
Returns group refractive index of quartz at given photon energy.
Singleton class providing pre-constructed reconstruction objects.
static double getMaxTime()
Returns time window upper edge.
static const YScanner * getYScanner(int moduleID)
Returns y-scanner of a given module.
static double getMinTime()
Returns time window lower edge.
Reconstructed track at TOP.
Definition: TOPTrack.h:39
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
Abstract base class for different kinds of events.
Normal (Gaussian) distribution: an entry for the table.
Definition: DeltaRayPDF.h:92