Garfield++ 5.0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
TrackSimple.cc
Go to the documentation of this file.
1#include <iostream>
2
5#include "Garfield/Random.hh"
6#include "Garfield/Sensor.hh"
8
9namespace Garfield {
10
12 m_sensor = sensor;
13}
14
15void TrackSimple::SetClusterDensity(const double d) {
16 if (d < Small) {
17 std::cerr << m_className << "::SetClusterDensity:\n"
18 << " Cluster density (number of clusters per cm)"
19 << " must be positive.\n";
20 return;
21 }
22 m_mfp = 1. / d;
23}
24
25double TrackSimple::GetClusterDensity() { return 1. / m_mfp; }
26
27void TrackSimple::SetStoppingPower(const double dedx) {
28 if (dedx < Small) {
29 std::cerr << m_className << "::SetStoppingPower:\n"
30 << " Stopping power (average energy loss [eV] per cm)"
31 << " must be positive.\n";
32 return;
33 }
34 m_eloss = dedx;
35}
36
38
39bool TrackSimple::NewTrack(const double x0, const double y0, const double z0,
40 const double t0, const double dx0, const double dy0,
41 const double dz0) {
42
43 m_clusters.clear();
44 m_cluster = 0;
45 // Make sure the sensor is defined.
46 if (!m_sensor) {
47 std::cerr << m_className << "::NewTrack: Sensor is not defined.\n";
48 return false;
49 }
50
51 // Make sure we are inside a medium.
52 Medium* medium = m_sensor->GetMedium(x0, y0, z0);
53 if (!medium) {
54 std::cerr << m_className << "::NewTrack: No medium at initial position.\n";
55 return false;
56 }
57
58 double x = x0;
59 double y = y0;
60 double z = z0;
61 double t = t0;
62
63 // Normalise the direction.
64 double dx = dx0;
65 double dy = dy0;
66 double dz = dz0;
67 const double d = sqrt(dx * dx + dy * dy + dz * dz);
68 if (d < Small) {
69 // Choose a random direction.
70 RndmDirection(dx, dy, dz);
71 } else {
72 const double scale = 1. / d;
73 dx *= scale;
74 dy *= scale;
75 dz *= scale;
76 }
77 bool ok = true;
78 while (ok) {
80 x += dx * m_mfp;
81 y += dy * m_mfp;
82 z += dz * m_mfp;
83 } else {
84 const double step = -m_mfp * log(RndmUniformPos());
85 x += dx * step;
86 y += dy * step;
87 z += dz * step;
88 }
89
90 medium = m_sensor->GetMedium(x, y, z);
91 if (!medium) {
92 if (m_debug) {
93 std::cout << m_className << "::NewTrack: Particle left the medium.\n";
94 }
95 break;
96 }
97 Cluster cluster;
98 cluster.x = x;
99 cluster.y = y;
100 cluster.z = z;
101 cluster.t = t;
102 cluster.energy = m_eloss * m_mfp;
103 m_clusters.push_back(std::move(cluster));
104 }
105 m_cluster = 0;
106 return true;
107}
108
109bool TrackSimple::GetCluster(double& xc, double& yc, double& zc, double& tc,
110 int& ne, double& ec, double& extra) {
111 xc = yc = zc = tc = ec = extra = 0.;
112 ne = 0;
113 if (m_clusters.empty() || m_cluster >= m_clusters.size()) return false;
114 const auto& cluster = m_clusters[m_cluster];
115 xc = cluster.x;
116 yc = cluster.y;
117 zc = cluster.z;
118 tc = cluster.t;
119 ec = cluster.energy;
120 ne = 1;
121 ++m_cluster;
122 return true;
123}
124
125}
Abstract base class for media.
Definition Medium.hh:16
void SetStoppingPower(const double dedx)
Set the stopping power (dE/dx).
virtual double GetClusterDensity()
virtual double GetStoppingPower()
Get the stopping power (mean energy loss [eV] per cm).
void SetClusterDensity(const double d)
Set the cluster density (inverse mean free path).
virtual bool GetCluster(double &xc, double &yc, double &zc, double &tc, int &ne, double &ec, double &extra)
TrackSimple()
Default constructor.
std::vector< Cluster > m_clusters
virtual bool NewTrack(const double x0, const double y0, const double z0, const double t0, const double dx0, const double dy0, const double dz0)
Sensor * m_sensor
Definition Track.hh:114
std::string m_className
Definition Track.hh:104
Track()=delete
Default constructor.
void RndmDirection(double &dx, double &dy, double &dz, const double length=1.)
Draw a random (isotropic) direction vector.
Definition Random.hh:128
double RndmUniformPos()
Draw a random number uniformly distributed in the range (0, 1).
Definition Random.hh:17