Garfield++ 5.0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
TrackDegrade.hh
Go to the documentation of this file.
1#ifndef G_TRACK_DEGRADE_H
2#define G_TRACK_DEGRADE_H
3
4#include <array>
5#include <utility>
6
7#include "Track.hh"
8
9namespace Garfield {
10
11/// Interface to Degrade.
12
13class TrackDegrade : public Track {
14 public:
15 struct Electron {
16 double x = 0.;
17 double y = 0.;
18 double z = 0.;
19 double t = 0.;
20 double energy = 0.;
21 double dx = 0.;
22 double dy = 0.;
23 double dz = 0.;
24 };
25
26 struct Excitation {
27 double x = 0.;
28 double y = 0.;
29 double z = 0.;
30 double t = 0.;
31 double energy = 0.;
32 };
33
34 struct Cluster {
35 double x, y, z, t;
36 std::vector<Electron> deltaElectrons;
37 std::vector<Electron> electrons;
38 std::vector<Excitation> excitations;
39 };
40
41 /// Default constructor
42 TrackDegrade() : TrackDegrade(nullptr) {}
43 /// Constructor
44 TrackDegrade(Sensor* sensor);
45 /// Destructor
46 virtual ~TrackDegrade() {}
47
48 bool NewTrack(const double x0, const double y0, const double z0,
49 const double t0, const double dx0, const double dy0,
50 const double dz0) override;
51 bool GetCluster(double& xc, double& yc, double& zc,
52 double& tc, int& ne, double& ec, double& extra) override;
53 const std::vector<Cluster>& GetClusters() const { return m_clusters; }
54 double GetClusterDensity() override;
55 double GetStoppingPower() override;
56
57 bool Initialise(Medium* medium, const bool verbose = false);
58
59 /// Set the energy down to which electrons are tracked (default: 2 eV).
60 void SetThresholdEnergy(const double eth);
61 /// Store excitations in the cluster or not (off by default).
62 void StoreExcitations(const bool on = true, const double thr = 4.) {
64 m_ethrExc = std::max(thr, 1.e-3);
65 }
66 /// Enable or disable bremsstrahlung.
67 void EnableBremsstrahlung(const bool on = true) { m_bremsStrahlung = on; }
68 /// Enable or disable detailed simulation of the deexcitation cascade.
69 void EnableFullCascade(const bool on = true) { m_fullCascade = on; }
70
71 void SetParticle(const std::string& particle) override;
72
73 protected:
74 std::vector<Cluster> m_clusters;
75 size_t m_cluster = 0;
76
77 bool m_penning = true;
78 bool m_bremsStrahlung = true;
79 bool m_fullCascade = true;
80 bool m_storeExcitations = false;
81 // Energy threshold for storing excitations.
82 double m_ethrExc = 4.;
83 // Energy threshold for tracking electrons.
84 double m_ethr = 2.;
85
86 double m_pressure = -1.;
87 double m_temperature = -1.;
88 std::string m_mediumName = "";
89 unsigned int m_nGas = 0;
90
91 double m_dedx = -1.;
92 double m_clusterDensity = -1.;
93
94 std::array<double, 6> m_rPenning;
95 std::array<double, 6> m_dPenning;
96
97 std::pair<std::vector<Electron>,
98 std::vector<Excitation> > TransportDeltaElectron(
99 const double x0, const double y0, const double z0, const double t0,
100 const double e0, const double dx, const double dy, const double dz);
101
102 void SetupPenning(Medium* medium, std::array<double, 6>& rP,
103 std::array<double, 6>& dP);
104 bool IsInside(const double x, const double y, const double z);
105};
106}
107
108#endif
Abstract base class for media.
Definition Medium.hh:16
virtual ~TrackDegrade()
Destructor.
std::array< double, 6 > m_dPenning
void SetThresholdEnergy(const double eth)
Set the energy down to which electrons are tracked (default: 2 eV).
void EnableFullCascade(const bool on=true)
Enable or disable detailed simulation of the deexcitation cascade.
double GetClusterDensity() override
std::pair< std::vector< Electron >, std::vector< Excitation > > TransportDeltaElectron(const double x0, const double y0, const double z0, const double t0, const double e0, const double dx, const double dy, const double dz)
std::vector< Cluster > m_clusters
double GetStoppingPower() override
Get the stopping power (mean energy loss [eV] per cm).
TrackDegrade()
Default constructor.
void EnableBremsstrahlung(const bool on=true)
Enable or disable bremsstrahlung.
void SetupPenning(Medium *medium, std::array< double, 6 > &rP, std::array< double, 6 > &dP)
std::array< double, 6 > m_rPenning
bool GetCluster(double &xc, double &yc, double &zc, double &tc, int &ne, double &ec, double &extra) override
bool NewTrack(const double x0, const double y0, const double z0, const double t0, const double dx0, const double dy0, const double dz0) override
void SetParticle(const std::string &particle) override
bool IsInside(const double x, const double y, const double z)
const std::vector< Cluster > & GetClusters() const
bool Initialise(Medium *medium, const bool verbose=false)
void StoreExcitations(const bool on=true, const double thr=4.)
Store excitations in the cluster or not (off by default).
Track()=delete
Default constructor.
std::vector< Electron > electrons
std::vector< Electron > deltaElectrons
std::vector< Excitation > excitations