Garfield++ 3.0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
HeedParticle.cpp
Go to the documentation of this file.
1#include <iomanip>
2#include <numeric>
12
13// 2003-2008, I. Smirnov
14
15namespace Heed {
16
17using CLHEP::c_light;
18using CLHEP::c_squared;
19using CLHEP::cm;
20using CLHEP::MeV;
21
23 const vec& vel, vfloat ftime, particle_def* fpardef,
24 HeedFieldMap* fieldmap, const bool floss_only,
25 const bool fprint_listing)
26 : eparticle(primvol, pt, vel, ftime, fpardef, fieldmap),
27 m_print_listing(fprint_listing),
28 m_particle_number(last_particle_number++),
29 m_loss_only(floss_only) {
30
31 mfunname("HeedParticle::HeedParticle(...)");
32 m_etransf.reserve(100);
33 m_natom.reserve(100);
34 m_nshell.reserve(100);
35}
36
37void HeedParticle::physics(std::vector<gparticle*>& secondaries) {
38 mfunname("void HeedParticle::physics()");
39 if (m_print_listing) {
40 mcout << "HeedParticle::physics is started\n";
42 }
43 m_etransf.clear();
44 m_natom.clear();
45 m_nshell.clear();
46 if (m_currpos.prange <= 0.0) return;
47 // Get local volume.
48 const absvol* av = m_currpos.tid.G_lavol();
49 auto etcs = dynamic_cast<const EnTransfCS*>(av);
50 if (!etcs) return;
51 HeedMatterDef* hmd = etcs->hmd;
52 MatterDef* matter = hmd->matter;
53 EnergyMesh* emesh = hmd->energy_mesh;
54 const double* aetemp = emesh->get_ae();
55 PointCoorMesh<double, const double*> pcm(emesh->get_q() + 1, &(aetemp));
56 const long qa = matter->qatom();
57 if (m_print_listing) Iprintn(mcout, qa);
58 basis tempbas(m_currpos.dir, "tempbas");
59 for (long na = 0; na < qa; ++na) {
60 if (m_print_listing) Iprintn(mcout, na);
61 const long qs = hmd->apacs[na]->get_qshell();
62 for (long ns = 0; ns < qs; ++ns) {
63 if (m_print_listing) Iprintn(mcout, ns);
64 if (etcs->quan[na][ns] <= 0.0) continue;
65 // Sample the number of collisions for this shell.
66 int ierror = 0;
67 const long qt = pois(etcs->quan[na][ns] * m_currpos.prange / cm, ierror);
68 check_econd11a(ierror, == 1,
69 " etcs->quan[na][ns]=" << etcs->quan[na][ns]
70 << " currpos.prange/cm="
71 << m_currpos.prange / cm << '\n',
72 mcerr);
73 if (m_print_listing) Iprintn(mcout, qt);
74 if (qt <= 0) continue;
75 point curpt = m_prevpos.pt;
76 vec dir = unit_vec(m_currpos.pt - m_prevpos.pt);
77 const double range = (m_currpos.pt - m_prevpos.pt).length();
78 if (m_print_listing) Iprint3n(mcout, curpt, dir, range);
79 for (long nt = 0; nt < qt; ++nt) {
80 // Sample the energy transfer in this collision.
81 const double rn = SRANLUX();
82 if (m_print_listing) Iprint3n(mcout, rn, etcs, etcs->fadda[na][ns][1]);
83 const double r = t_hisran_step_ar<
84 double, std::vector<double>, PointCoorMesh<double, const double*> >(
85 pcm, etcs->fadda[na][ns], rn);
86
87 // Convert to internal units.
88 const double et = r * MeV;
89 m_etransf.push_back(et);
90 m_natom.push_back(na);
91 m_nshell.push_back(ns);
92 if (m_print_listing) Iprint2n(mcout, nt, et);
93 // Sample the position of the collision.
94 const double arange = SRANLUX() * range;
95 point pt = curpt + dir * arange;
96 point ptloc = pt;
97 m_prevpos.tid.up_absref(&ptloc);
98 if (m_loss_only) continue;
99 if (m_print_listing) mcout << "generating new cluster\n";
100 if (m_store_clusters) {
101 m_clusterBank.emplace_back(
102 HeedCluster(et, 0, pt, ptloc, m_prevpos.tid, na, ns));
103 }
104 // Generate a virtual photon.
105 const double Ep0 = m_mass * c_squared + m_curr_ekin;
106 const double Ep1 = Ep0 - m_etransf.back();
107 const double Mp = m_mass * c_squared;
108 const double Mt = electron_def.mass * c_squared;
109 double theta_p, theta_t;
110 theta_two_part(Ep0, Ep1, Mp, Mt, theta_p, theta_t);
111 vec vel;
112 vel.random_conic_vec(fabs(theta_t));
113 vel.down(&tempbas); // direction is OK
114 vel *= c_light;
115 const double t = m_prevpos.time + arange / m_prevpos.speed;
116 if (m_print_listing) mcout << "generating new virtual photon\n";
117 HeedPhoton* hp = new HeedPhoton(m_currpos.tid.eid[0], pt, vel, t,
118 m_particle_number, et, m_fieldMap);
119 hp->m_photon_absorbed = true;
120 hp->m_delta_generated = false;
121 hp->m_na_absorbing = na;
122 hp->m_ns_absorbing = ns;
123 secondaries.push_back(hp);
124 }
125 }
126 }
127 if (m_print_listing) {
128 const double sum = std::accumulate(m_etransf.begin(), m_etransf.end(), 0.);
129 Iprint2n(mcout, m_etransf.size(), sum);
130 mcout << "Exiting HeedParticle::physics\n";
131 }
132}
133
134void HeedParticle::print(std::ostream& file, int l) const {
135 if (l < 0) return;
136 Ifile << "HeedParticle (l=" << l << "): particle_number=" << m_particle_number
137 << " type=";
138 print_notation(file);
139 file << std::endl;
140 if (l == 1) return;
141 mparticle::print(file, l - 1);
142 const double sum = std::accumulate(m_etransf.begin(), m_etransf.end(), 0.);
143 Iprintn(mcout, sum);
144 Iprintn(mcout, m_etransf.size());
145 if (l >= 5) {
146 Ifile << " nt natom nshell transferred energy\n";
147 const long qt = m_etransf.size();
148 for (long nt = 0; nt < qt; nt++) {
149 Ifile << std::setw(3) << nt << ' ' << std::setw(3) << m_natom[nt] << ' '
150 << std::setw(3) << m_nshell[nt] << ' '
151 << std::setw(12) << m_etransf[nt] << '\n';
152 }
153 }
154}
155}
#define check_econd11a(a, signb, add, stream)
Definition: FunNameStack.h:172
#define mfunname(string)
Definition: FunNameStack.h:45
long qatom() const
Definition: AtomDef.h:133
const double * get_ae(void) const
Return all left sides.
Definition: EnergyMesh.h:52
long get_q() const
Return number of bins.
Definition: EnergyMesh.h:42
Retrieve electric and magnetic field from Sensor.
Definition: HeedFieldMap.h:15
std::vector< const AtomPhotoAbsCS * > apacs
Definition: HeedMatterDef.h:29
MatterDef * matter
Definition: HeedMatterDef.h:28
EnergyMesh * energy_mesh
Definition: HeedMatterDef.h:39
void print(std::ostream &file, int l) const override
Print-out.
void physics(std::vector< gparticle * > &secondaries) override
Apply any other processes (turn the trajectory, kill the particle, ...).
HeedParticle()
Default constructor.
Definition: HeedParticle.h:18
long m_na_absorbing
Index of absorbing atom.
Definition: HeedPhoton.h:42
long m_ns_absorbing
Index of absorbing shell.
Definition: HeedPhoton.h:44
bool m_photon_absorbed
Definition: HeedPhoton.h:40
bool m_delta_generated
Flag that delta-electrons are already generated (or cannot be created).
Definition: HeedPhoton.h:51
Basis.
Definition: vec.h:311
HeedFieldMap * m_fieldMap
Pointer to field map.
Definition: eparticle.h:34
stvpoint m_prevpos
Previous point.
Definition: gparticle.h:248
stvpoint m_currpos
Current point.
Definition: gparticle.h:250
void up_absref(absref *f)
Definition: volume.cpp:26
std::vector< manip_absvol * > eid
List of volumes.
Definition: volume.h:37
absvol * G_lavol() const
Get last address of volume.
Definition: volume.cpp:17
Abstract base classs for volume "manipulators".
Definition: volume.h:128
double m_curr_ekin
Current kinetic energy.
Definition: mparticle.h:73
void print(std::ostream &file, int l) const override
Print-out.
Definition: mparticle.cpp:243
double m_mass
Mass (not mass * speed_of_light^2)
Definition: mparticle.h:70
void print_notation(std::ostream &file) const
Point.
Definition: vec.h:366
vfloat time
Definition: gparticle.h:47
vec dir
Unit vector, in the first system in the tree.
Definition: gparticle.h:25
vfloat prange
Range from previous point.
Definition: gparticle.h:46
vfloat speed
Longitudinal velocity.
Definition: gparticle.h:31
point pt
Coordinates in the first system in the tree.
Definition: gparticle.h:23
manip_absvol_treeid tid
Definition: gparticle.h:32
Definition: vec.h:177
void random_conic_vec(double theta)
Definition: vec.cpp:236
void down(const basis *fabas)
Definition: vec.cpp:168
Definition: BGMesh.cpp:6
long last_particle_number
Definition: HeedParticle.h:9
long pois(const double amu, int &ierror)
Definition: pois.cpp:9
void theta_two_part(const double Ep0, const double Ep1, const double Mp, const double Mt, double &theta_p, double &theta_t)
Scattering angles as function of incident and final projectile energy.
Definition: kinem.cpp:28
T t_hisran_step_ar(const M &mesh, const D &integ_y, T rannum)
Definition: tline.h:1403
DoubleAc fabs(const DoubleAc &f)
Definition: DoubleAc.h:615
particle_def electron_def("electron", "e-", electron_mass_c2/c_squared, electron_charge, 1, 0, 0.5, spin_def(0.0, 0.0))
Definition: particle_def.h:99
double vfloat
Definition: vfloat.h:16
#define mcout
Definition: prstream.h:126
#define Iprint3n(file, name1, name2, name3)
Definition: prstream.h:233
#define Ifile
Definition: prstream.h:196
#define mcerr
Definition: prstream.h:128
#define Iprintn(file, name)
Definition: prstream.h:205
#define Iprint2n(file, name1, name2)
Definition: prstream.h:220