Garfield++ 5.0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
TrackPAI.hh
Go to the documentation of this file.
1#ifndef G_TRACK_PAI
2#define G_TRACK_PAI
3
4#include <string>
5#include <array>
6
7#include "Track.hh"
8
9namespace Garfield {
10
11/// Energy loss calculation using the Photoabsorption-Ionisation Model.
12
13class TrackPAI : public Track {
14 public:
15 struct Cluster {
16 double x, y, z, t;
17 double energy;
18 };
19
20 // Constructor
21 TrackPAI();
22 // Destructor
23 virtual ~TrackPAI() {}
24
25 bool NewTrack(const double x0, const double y0, const double z0,
26 const double t0, const double dx0, const double dy0,
27 const double dz0) override;
28
29 bool GetCluster(double& xc, double& yc, double& zc, double& tc, int& nc,
30 double& ec, double& extra) override;
31 const std::vector<Cluster>& GetClusters() const { return m_clusters; }
32
33 double GetClusterDensity() override;
34 double GetStoppingPower() override;
35
36 private:
37 // Particle speed.
38 double m_speed = 0.;
39 // Max. energy transfer in a collision
40 double m_emax = 0.;
41
42 // Total inelastic mean free path
43 double m_imfp = 0.;
44 // Stopping power
45 double m_dedx = 0.;
46
47 // Dielectric function
48 static constexpr size_t m_nSteps = 1000;
49 std::array<double, m_nSteps> m_eps1;
50 std::array<double, m_nSteps> m_eps2;
51 std::array<double, m_nSteps> m_epsInt;
52
53 // Tables for interpolation of cumulative distribution functions
54 std::array<double, m_nSteps> m_energies;
55 std::array<double, m_nSteps> m_cdf;
56 std::array<double, m_nSteps> m_rutherford;
57
58 std::vector<Cluster> m_clusters;
59 size_t m_cluster = 0;
60
61 // Medium properties
62 std::string m_mediumName = "";
63 double m_mediumDensity = 0.;
64 double m_electronDensity = 0.;
65
66 bool SetupMedium(Medium* medium);
67 bool SetupCrossSectionTable();
68
69 double ComputeMaxTransfer() const;
70
71 double ComputeCsTail(const double emin, const double emax);
72 double ComputeDeDxTail(const double emin, const double emax);
73
74 std::pair<double, double> SampleEnergyDeposit(const double u) const;
75 double SampleAsymptoticCs(double u) const;
76 double SampleAsymptoticCsSpinZero(const double emin, double u) const;
77 double SampleAsymptoticCsSpinHalf(const double emin, double u) const;
78 double SampleAsymptoticCsSpinOne(const double emin, double u) const;
79 double SampleAsymptoticCsElectron(const double emin, double u) const;
80 double SampleAsymptoticCsPositron(const double emin, double u) const;
81
82 double LossFunction(const double eps1, const double eps2) const {
83 const double eps = eps1 * eps1 + eps2 * eps2;
84 return eps > 0. ? eps2 / eps : 0.;
85 }
86};
87}
88
89#endif
Abstract base class for media.
Definition Medium.hh:16
bool NewTrack(const double x0, const double y0, const double z0, const double t0, const double dx0, const double dy0, const double dz0) override
Definition TrackPAI.cc:16
bool GetCluster(double &xc, double &yc, double &zc, double &tc, int &nc, double &ec, double &extra) override
Definition TrackPAI.cc:106
double GetClusterDensity() override
Definition TrackPAI.cc:233
double GetStoppingPower() override
Get the stopping power (mean energy loss [eV] per cm).
Definition TrackPAI.cc:246
const std::vector< Cluster > & GetClusters() const
Definition TrackPAI.hh:31
virtual ~TrackPAI()
Definition TrackPAI.hh:23
Track()=delete
Default constructor.