Garfield 0.3
Toolkit for the detailed simulation of particle detectors based on ionization measurement in gases and semiconductors
Loading...
Searching...
No Matches
TrackHeed.hh
Go to the documentation of this file.
1#ifndef G_TRACK_HEED_H
2#define G_TRACK_HEED_H
3
4#include <memory>
5#include <vector>
6
7#include "Garfield/Track.hh"
8
9namespace Heed {
10class gparticle;
11class particle_def;
12class HeedParticle;
13class HeedCondElectron;
14class HeedMatterDef;
15class GasDef;
16class MatterDef;
17class EnergyMesh;
18class EnTransfCS;
19class ElElasticScat;
20class ElElasticScatLowSigma;
21class PairProd;
22class HeedDeltaElectronCS;
23class HeedPhoton;
24} // namespace Heed
25
26namespace Garfield {
27
28class HeedChamber;
29class HeedFieldMap;
30class Medium;
31
33
34class TrackHeed : public Track {
35 public:
36 struct Electron {
37 double x = 0.;
38 double y = 0.;
39 double z = 0.;
40 double t = 0.;
41 double e = 0.;
42 double dx = 0.;
43 double dy = 0.;
44 double dz = 0.;
45 };
46
47 struct Photon {
48 double x = 0.;
49 double y = 0.;
50 double z = 0.;
51 double t = 0.;
52 double e = 0.;
53 double dx = 0.;
54 double dy = 0.;
55 double dz = 0.;
56 };
57
58 struct Cluster {
59 double x, y, z, t;
60 double energy;
61 double extra;
62 std::vector<Photon> photons;
63 std::vector<Electron> electrons;
64 std::vector<Electron> ions;
65 };
66
68 TrackHeed() : TrackHeed(nullptr) {}
70 TrackHeed(Sensor* sensor);
72 virtual ~TrackHeed();
73
74 bool NewTrack(const double x0, const double y0, const double z0,
75 const double t0, const double dx0, const double dy0,
76 const double dz0) override;
77 const std::vector<Cluster>& GetClusters() const { return m_clusters; }
78
79 bool GetCluster(double& xc, double& yc, double& zc, double& tc, int& nc,
80 double& ec, double& extra);
81 bool GetCluster(double& xc, double& yc, double& zc, double& tc, int& ne,
82 int& ni, double& ec, double& extra);
92 bool GetCluster(double& xc, double& yc, double& zc, double& tc, int& ne,
93 int& ni, int& np, double& ec, double& extra);
102 bool GetElectron(const unsigned int i, double& x, double& y, double& z,
103 double& t, double& e, double& dx, double& dy, double& dz);
109 bool GetIon(const unsigned int i, double& x, double& y, double& z,
110 double& t) const;
111
119 bool GetPhoton(const unsigned int i, double& x, double& y, double& z,
120 double& t, double& e, double& dx, double& dy,
121 double& dz) const;
122
123 double GetClusterDensity() override;
124 double GetStoppingPower() override;
126 double GetW() const;
128 double GetFanoFactor() const;
130 double GetPhotoAbsorptionCrossSection(const double e) const;
131
133 bool Initialise(Medium* medium, const bool verbose = false);
134
141 Cluster TransportDeltaElectron(const double x0, const double y0,
142 const double z0, const double t0,
143 const double e0, const double dx0,
144 const double dy0, const double dz0);
145
153 void TransportDeltaElectron(const double x0, const double y0, const double z0,
154 const double t0, const double e0,
155 const double dx0, const double dy0,
156 const double dz0, int& ne, int& ni);
164 void TransportDeltaElectron(const double x0, const double y0, const double z0,
165 const double t0, const double e0,
166 const double dx0, const double dy0,
167 const double dz0, int& ne);
168
175 Cluster TransportPhoton(const double x0, const double y0, const double z0,
176 const double t0, const double e0, const double dx0,
177 const double dy0, const double dz0);
178
188 void TransportPhoton(const double x0, const double y0, const double z0,
189 const double t0, const double e0, const double dx0,
190 const double dy0, const double dz0, int& ne, int& ni,
191 int& np);
192
201 void TransportPhoton(const double x0, const double y0, const double z0,
202 const double t0, const double e0, const double dx0,
203 const double dy0, const double dz0, int& ne, int& ni);
211 void TransportPhoton(const double x0, const double y0, const double z0,
212 const double t0, const double e0, const double dx0,
213 const double dy0, const double dz0, int& ne);
214
223
234 void SetSteppingLimits(const double maxStep, const double radStraight,
235 const double stepAngleStraight,
236 const double stepAngleCurved) {
237 m_maxStep = maxStep;
238 m_radStraight = radStraight;
239 m_stepAngleStraight = stepAngleStraight;
240 m_stepAngleCurved = stepAngleCurved;
241 }
242 void GetSteppingLimits(double& maxStep, double& radStraight,
243 double& stepAngleStraight, double& stepAngleCurved) {
244 maxStep = m_maxStep;
245 radStraight = m_radStraight;
246 stepAngleStraight = m_stepAngleStraight;
247 stepAngleCurved = m_stepAngleCurved;
248 }
249
250 void CrossInactiveMedia(const bool on = true) { m_crossInactiveMedia = on; }
251 void EnableCoulombScattering(const bool on = true) {
253 }
254
258
260 void EnablePhotonReabsorption(const bool on = true) {
262 }
263
266 m_usePacsOutput = on;
267 }
268
272 void SetEnergyMesh(const double e0, const double e1, const int nsteps);
273
276 void SetParticleUser(const double m, const double z);
277
278 void EnableOneStepFly(const bool on) { m_oneStepFly = on; }
279
280 private:
281 // Prevent usage of copy constructor and assignment operator
282 TrackHeed(const TrackHeed& heed);
284
285 bool m_oneStepFly = false;
286
287 bool m_ready = false;
288 bool m_hasActiveTrack = false;
289
290 double m_mediumDensity = -1.;
291 std::string m_mediumName = "";
292
293 bool m_usePacsOutput = false;
294
298 bool m_useBfieldAuto = true;
300
301 std::vector<Cluster> m_clusters;
302 size_t m_cluster = 0;
303
304 // Particle properties
305 std::unique_ptr<Heed::particle_def> m_particle_def;
306 // Material properties
307 std::unique_ptr<Heed::HeedMatterDef> m_matter;
308 std::unique_ptr<Heed::GasDef> m_gas;
309 std::unique_ptr<Heed::MatterDef> m_material;
310
311 // Energy mesh
312 double m_emin = 2.e-6;
313 double m_emax = 2.e-1;
314 unsigned int m_nEnergyIntervals = 200;
315 std::unique_ptr<Heed::EnergyMesh> m_energyMesh;
316
317 // Cross-sections
318 std::unique_ptr<Heed::EnTransfCS> m_transferCs;
319 std::unique_ptr<Heed::ElElasticScat> m_elScat;
320 std::unique_ptr<Heed::ElElasticScatLowSigma> m_lowSigma;
321 std::unique_ptr<Heed::PairProd> m_pairProd;
322 std::unique_ptr<Heed::HeedDeltaElectronCS> m_deltaCs;
323
324 // Interface classes
325 std::unique_ptr<HeedChamber> m_chamber;
326 std::unique_ptr<HeedFieldMap> m_fieldMap;
327
328 // Bounding box
329 double m_lX = 0., m_lY = 0., m_lZ = 0.;
330 double m_cX = 0., m_cY = 0., m_cZ = 0.;
331
332 // Stepping parameters.
334 double m_maxStep = 100.;
336 double m_radStraight = 1000.;
340 double m_stepAngleCurved = 0.2;
341
342 bool SetupGas(Medium* medium);
343 bool SetupMaterial(Medium* medium);
344 bool SetupDelta(const std::string& databasePath);
345 bool AddCluster(Heed::HeedPhoton* virtualPhoton,
346 std::vector<Cluster>& clusters);
348 const std::vector<Heed::HeedCondElectron>& conductionElectrons,
349 std::vector<Electron>& electrons);
350 bool IsInside(const double x, const double y, const double z);
351 bool UpdateBoundingBox(bool& update);
352};
353} // namespace Garfield
354
355#endif
void EnableMagneticField()
Take the magnetic field into account in the stepping algorithm.
std::string m_mediumName
Definition TrackHeed.hh:291
void SetEnergyMesh(const double e0, const double e1, const int nsteps)
Specify the energy mesh to be used.
void EnablePhotonReabsorption(const bool on=true)
Simulate (or not) the photons produced in the atomic relaxation cascade.
Definition TrackHeed.hh:260
std::unique_ptr< Heed::EnergyMesh > m_energyMesh
Definition TrackHeed.hh:315
void EnablePhotoAbsorptionCrossSectionOutput(const bool on)
Write the photoabsorption cross-sections used to a text file.
Definition TrackHeed.hh:265
std::unique_ptr< Heed::ElElasticScatLowSigma > m_lowSigma
Definition TrackHeed.hh:320
void EnableElectricField()
Take the electric field into account in the stepping algorithm.
bool GetCluster(double &xc, double &yc, double &zc, double &tc, int &ne, int &ni, double &ec, double &extra)
double m_stepAngleCurved
Angular step for curved lines.
Definition TrackHeed.hh:340
bool SetupGas(Medium *medium)
void AddElectrons(const std::vector< Heed::HeedCondElectron > &conductionElectrons, std::vector< Electron > &electrons)
void DisableMagneticField()
Do not take the magnetic field into account in the stepping algorithm.
std::unique_ptr< Heed::HeedDeltaElectronCS > m_deltaCs
Definition TrackHeed.hh:322
double GetPhotoAbsorptionCrossSection(const double e) const
Return the photoabsorption cross-section at a given energy.
void EnableOneStepFly(const bool on)
Definition TrackHeed.hh:278
bool IsInside(const double x, const double y, const double z)
Cluster TransportDeltaElectron(const double x0, const double y0, const double z0, const double t0, const double e0, const double dx0, const double dy0, const double dz0)
Simulate a delta electron.
bool UpdateBoundingBox(bool &update)
std::unique_ptr< Heed::GasDef > m_gas
Definition TrackHeed.hh:308
bool GetCluster(double &xc, double &yc, double &zc, double &tc, int &ne, int &ni, int &np, double &ec, double &extra)
Get the next "cluster" (ionising collision of the charged particle).
std::unique_ptr< HeedFieldMap > m_fieldMap
Definition TrackHeed.hh:326
bool SetupDelta(const std::string &databasePath)
void CrossInactiveMedia(const bool on=true)
Definition TrackHeed.hh:250
void TransportDeltaElectron(const double x0, const double y0, const double z0, const double t0, const double e0, const double dx0, const double dy0, const double dz0, int &ne, int &ni)
Simulate a delta electron.
void DisableDeltaElectronTransport()
Switch simulation of delta electrons off.
Definition TrackHeed.hh:257
double GetFanoFactor() const
Return the Fano factor of the medium (of the last simulated track).
std::unique_ptr< Heed::PairProd > m_pairProd
Definition TrackHeed.hh:321
void EnableCoulombScattering(const bool on=true)
Definition TrackHeed.hh:251
bool GetPhoton(const unsigned int i, double &x, double &y, double &z, double &t, double &e, double &dx, double &dy, double &dz) const
Retrieve the properties of an unabsorbed photon.
bool GetCluster(double &xc, double &yc, double &zc, double &tc, int &nc, double &ec, double &extra)
TrackHeed & operator=(const TrackHeed &heed)
bool NewTrack(const double x0, const double y0, const double z0, const double t0, const double dx0, const double dy0, const double dz0) override
Calculate a new track starting from (x0, y0, z0) at time t0 in direction (dx0, dy0,...
bool Initialise(Medium *medium, const bool verbose=false)
Compute the differential cross-section for a given medium.
std::unique_ptr< Heed::particle_def > m_particle_def
Definition TrackHeed.hh:305
void SetSteppingLimits(const double maxStep, const double radStraight, const double stepAngleStraight, const double stepAngleCurved)
Set parameters for calculating the particle trajectory.
Definition TrackHeed.hh:234
double m_stepAngleStraight
Angular step for curved trajectories approximated by straight-line steps.
Definition TrackHeed.hh:338
void EnableDeltaElectronTransport()
Switch simulation of delta electrons on.
Definition TrackHeed.hh:255
bool GetElectron(const unsigned int i, double &x, double &y, double &z, double &t, double &e, double &dx, double &dy, double &dz)
Retrieve the properties of a conduction or delta electron in the current cluster.
std::unique_ptr< HeedChamber > m_chamber
Definition TrackHeed.hh:325
void TransportDeltaElectron(const double x0, const double y0, const double z0, const double t0, const double e0, const double dx0, const double dy0, const double dz0, int &ne)
Simulate a delta electron.
void TransportPhoton(const double x0, const double y0, const double z0, const double t0, const double e0, const double dx0, const double dy0, const double dz0, int &ne, int &ni)
Simulate a photon.
std::vector< Cluster > m_clusters
Definition TrackHeed.hh:301
bool GetIon(const unsigned int i, double &x, double &y, double &z, double &t) const
Retrieve the properties of an ion in the current cluster.
unsigned int m_nEnergyIntervals
Definition TrackHeed.hh:314
std::unique_ptr< Heed::MatterDef > m_material
Definition TrackHeed.hh:309
const std::vector< Cluster > & GetClusters() const
Definition TrackHeed.hh:77
double m_maxStep
Max. step length.
Definition TrackHeed.hh:334
Cluster TransportPhoton(const double x0, const double y0, const double z0, const double t0, const double e0, const double dx0, const double dy0, const double dz0)
Simulate a photon.
TrackHeed()
Default constructor.
Definition TrackHeed.hh:68
double m_radStraight
Bending radius beyond which to use straight-line approximation.
Definition TrackHeed.hh:336
void TransportPhoton(const double x0, const double y0, const double z0, const double t0, const double e0, const double dx0, const double dy0, const double dz0, int &ne, int &ni, int &np)
Simulate a photon.
double GetW() const
Return the W value of the medium (of the last simulated track).
TrackHeed(const TrackHeed &heed)
bool SetupMaterial(Medium *medium)
TrackHeed(Sensor *sensor)
Constructor.
void SetParticleUser(const double m, const double z)
Define particle mass and charge (for exotic particles).
void TransportPhoton(const double x0, const double y0, const double z0, const double t0, const double e0, const double dx0, const double dy0, const double dz0, int &ne)
Simulate a photon.
std::unique_ptr< Heed::EnTransfCS > m_transferCs
Definition TrackHeed.hh:318
double GetClusterDensity() override
Get the cluster density (number of ionizing collisions per cm or inverse mean free path for ionizatio...
bool AddCluster(Heed::HeedPhoton *virtualPhoton, std::vector< Cluster > &clusters)
void DisableElectricField()
Do not take the electric field into account in the stepping algorithm.
virtual ~TrackHeed()
Destructor.
std::unique_ptr< Heed::ElElasticScat > m_elScat
Definition TrackHeed.hh:319
void GetSteppingLimits(double &maxStep, double &radStraight, double &stepAngleStraight, double &stepAngleCurved)
Definition TrackHeed.hh:242
double GetStoppingPower() override
Get the stopping power (mean energy loss [eV] per cm).
std::unique_ptr< Heed::HeedMatterDef > m_matter
Definition TrackHeed.hh:307
Track()=delete
Default constructor.
std::vector< Electron > ions
Definition TrackHeed.hh:64
std::vector< Photon > photons
Definition TrackHeed.hh:62
std::vector< Electron > electrons
Definition TrackHeed.hh:63