Garfield++ v1r0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
HeedDeltaElectron.cpp
Go to the documentation of this file.
9
10/*
112003, I. Smirnov
12*/
13
14#define USE_ADJUSTED_W
15#define RANDOM_POIS
16#define DIRECT_LOW_IF_LITTLE
17
18namespace Heed {
19
21
24
26 const vec& vel, vfloat time,
27 long fparent_particle_number,
28 //PassivePtr< gparticle > fparent_part
29 int fs_print_listing)
30 : eparticle(primvol, pt, vel, time, &electron_def),
31 //parent_part(fparent_part),
32 s_print_listing(fs_print_listing),
33 phys_mrange(0.0),
34 s_stop_eloss(0),
35 s_mult_low_path_length(0),
36 q_low_path_length(0.0),
37 s_path_length(0),
38 necessary_energy(0.0),
39 parent_particle_number(fparent_particle_number) {
40 mfunname("HeedDeltaElectron::HeedDeltaElectron(...)");
43 //if(particle_number == 247) // for debug of particular event
44 //s_print_listing = 1;
45 //set_count_references();
46
47}
48
49void HeedDeltaElectron::physics_mrange(double& fmrange) {
50 mfunname("void HeedDeltaElectron::physics_mrange(double& fmrange)");
51 if (s_print_listing == 1) {
52 mcout << "void HeedDeltaElectron::physics_mrange(double& fmrange)"
53 << std::endl;
54 }
57 s_path_length = 0;
58 if (fmrange <= 0.0) return;
59 if (curr_kin_energy == 0.0) {
60 fmrange = 0.0;
61 return;
62 }
63 const absvol* av = currpos.G_lavol(); // get least address of volume
64 const HeedDeltaElectronCSType* hmecst =
65 dynamic_cast<const HeedDeltaElectronCSType*>(av);
66 if (hmecst == NULL) return;
67 if (s_print_listing == 1) Iprintnf(mcout, fmrange);
68 // calculate eloss and mrange as follows from eloss
69 HeedDeltaElectronCS* hdecs = hmecst->hdecs.getver();
70 double ek = curr_kin_energy / MeV;
71 EnergyMesh* emesh = hdecs->hmd->energy_mesh.get();
72 long n1 = emesh->get_interval_number_between_centers(ek);
73 long qener = emesh->get_q();
74 if (n1 < 0) n1 = 0;
75 if (n1 > qener - 2) n1 = qener - 2;
76 long n2 = n1 + 1;
77 double dedx = hdecs->eLoss[n1] + (hdecs->eLoss[n2] - hdecs->eLoss[n1]) /
78 (emesh->get_ec(n2) - emesh->get_ec(n1)) *
79 (ek - emesh->get_ec(n1));
80 //double ek_reduced = ek * 0.9;
81 double eloss = 0.1 * ek; // MeV
82 if (eloss < 0.00005) eloss = 0.00005; // loss by 50eV
83 if (eloss > ek) {
84 eloss = ek;
85 s_stop_eloss = 1;
86 } else {
87 s_stop_eloss = 0;
88 }
89 double mrange = (eloss / dedx) * cm;
90 if (fmrange > mrange) fmrange = mrange;
91 if (s_print_listing == 1) {
92 Iprintnf(mcout, fmrange);
93 Iprintnf(mcout, ek);
94 }
95 double ek_restricted = ek;
96 if (ek_restricted < 0.0005) ek_restricted = 0.0005;
97 if (s_print_listing == 1) Iprintnf(mcout, ek_restricted / keV);
98
99 long n1r = emesh->get_interval_number_between_centers(ek_restricted);
100 if (n1r < 0) n1r = 0;
101 if (n1r > qener - 2) n1r = qener - 2;
102 long n2r = n1r + 1;
103 double low_path_length = 0.; // in internal units
104 if (s_low_mult_scattering == 1) {
105 low_path_length = (hdecs->low_lambda[n1r] +
106 (hdecs->low_lambda[n2r] - hdecs->low_lambda[n1r]) /
107 (emesh->get_ec(n2r) - emesh->get_ec(n1r)) *
108 (ek_restricted - emesh->get_ec(n1r))) * cm;
109 if (s_print_listing == 1) Iprintnf(mcout, low_path_length / cm);
110 long qscat = hdecs->eesls->get_qscat();
111 double sigma_ctheta = hdecs->get_sigma(ek_restricted, qscat);
112 // Reduce the number of scatterings, if the angle is too large.
113 if (sigma_ctheta > 0.3) qscat = long(qscat * 0.3 / sigma_ctheta);
114 double mult_low_path_length = qscat * low_path_length;
115 if (s_print_listing == 1) Iprintnf(mcout, mult_low_path_length);
116 if (fmrange > mult_low_path_length) {
117 fmrange = mult_low_path_length;
119 q_low_path_length = hdecs->eesls->get_qscat();
120 s_stop_eloss = 0;
121 } else {
123 q_low_path_length = fmrange / low_path_length;
124 }
125 if (s_print_listing == 1) {
126 Iprintnf(mcout, fmrange);
128 }
129 }
130
131 if (s_high_mult_scattering == 1) {
132 if (s_print_listing == 1) {
134 Iprintnf(mcout, n1r);
135 Iprintnf(mcout, n2r);
136 Iprintnf(mcout, ek_restricted);
137 Iprintnf(mcout, emesh->get_ec(n1r));
138 Iprintnf(mcout, emesh->get_ec(n2r));
139 }
140 double mean_path_length =
141 (hdecs->lambda[n1r] + (hdecs->lambda[n2r] - hdecs->lambda[n1r]) /
142 (emesh->get_ec(n2r) - emesh->get_ec(n1r)) *
143 (ek_restricted - emesh->get_ec(n1r))) * cm;
144 if (s_print_listing == 1) {
145 Iprintnf(mcout, mean_path_length);
146 Iprintnf(mcout, mean_path_length / cm);
147 }
148 double path_length = -mean_path_length * log(1.0 - SRANLUX());
149 if (s_print_listing == 1) Iprintnf(mcout, path_length);
150 if (fmrange > path_length) {
151 fmrange = path_length;
152 s_path_length = 1;
154 if (s_low_mult_scattering == 1) {
155 q_low_path_length = fmrange / low_path_length;
157 }
158 s_stop_eloss = 0;
159 } else {
160 s_path_length = 0;
161 }
162 if (s_print_listing == 1) Iprintnf(mcout, fmrange);
163 }
164 phys_mrange = fmrange;
165}
166
168 mfunname("void HeedDeltaElectron::physics_after_new_speed(void)");
169 if (s_print_listing == 1) {
170 mcout << "HeedDeltaElectron::physics_after_new_speed is started\n";
172 }
174 if (currpos.prange <= 0.0) {
175 if (curr_kin_energy == 0.0) {
176 // Get least address of volume.
177 absvol* av = currpos.G_lavol();
178 SensitiveVolume* asv = dynamic_cast<SensitiveVolume*>(av);
179 if (asv != NULL) {
180 if (s_print_listing == 1) {
181 mcout << "HeedDeltaElectron::physics_after_new_speed: \n";
182 mcout << "This is converted to conduction\n";
183 }
185 //HeedCondElectron hce(currpos.pt, currpos.ptloc, currpos.tid, this);
186 asv->conduction_electron_bank.append(hce);
187 //conduction_electron_bank.insert_after
188 //( conduction_electron_bank.get_last_node(), hce);
189 }
190 s_life = 0;
191 }
192 if (s_print_listing == 1) mcout << "exit due to currpos.prange <= 0.0\n";
193 return;
194 }
195 // Get least address of volume
196 const absvol* av = currpos.G_lavol();
197 const HeedDeltaElectronCSType* hmecst =
198 dynamic_cast<const HeedDeltaElectronCSType*>(av);
199 if (s_print_listing == 1)
200 mcout << "physics_after_new_speed: started" << std::endl;
201 if (hmecst == NULL) return;
202 HeedDeltaElectronCS* hdecs = hmecst->hdecs.get();
203 double ek = curr_kin_energy / MeV;
204 EnergyMesh* emesh = hdecs->hmd->energy_mesh.get();
205 long n1 = emesh->get_interval_number_between_centers(ek);
206 long qener = emesh->get_q();
207 if (n1 < 0) n1 = 0;
208 if (n1 > qener - 2) n1 = qener - 2;
209 long n2 = n1 + 1;
210 if (s_print_listing == 1) {
211 Iprintnf(mcout, ek);
212 Iprint2n(mcout, n1, n2);
214 }
215 /*
216 double dedx = hdecs->eLoss[n1] +
217 (hdecs->eLoss[n2] - hdecs->eLoss[n1])/
218 (emesh->get_ec(n2) - emesh->get_ec(n1)) *
219 (ek - emesh->get_ec(n1));
220 double Eloss = dedx * MeV/cm;
221 Eloss *= currpos.prange;
222 if(s_print_listing == 1) Iprintn(mcout, Eloss/eV);
223 total_Eloss += Eloss;
224 curr_kin_energy -= Eloss;
225 */
226 double dedx;
227 double Eloss;
228 if (s_stop_eloss == 1 && phys_mrange == currpos.prange) {
229 Eloss = curr_kin_energy;
230 curr_kin_energy = 0.0;
231 dedx = Eloss / currpos.prange / (MeV / cm);
232 } else {
233 dedx = hdecs->eLoss[n1] + (hdecs->eLoss[n2] - hdecs->eLoss[n1]) /
234 (emesh->get_ec(n2) - emesh->get_ec(n1)) *
235 (ek - emesh->get_ec(n1));
236 Eloss = dedx * MeV / cm;
237 Eloss *= currpos.prange;
238 total_Eloss += Eloss;
239 curr_kin_energy -= Eloss;
240 }
241 if (s_print_listing == 1)
242 Iprint3nf(mcout, prev_kin_energy / eV, curr_kin_energy / eV, Eloss / eV);
243 if (curr_kin_energy <= 0.0) {
244 if (s_print_listing == 1) {
245 mcout << "curr_kin_energy <= 0.0, curr_kin_energy=" << curr_kin_energy
246 << " curr_kin_energy/MeV=" << curr_kin_energy / MeV << '\n';
247 }
248 curr_kin_energy = 0.0;
249 curr_gamma_1 = 0.0;
250 currpos.speed = 0.0;
251 s_life = 0;
252 } else {
253 double resten = mass * c_squared;
254 curr_gamma_1 = curr_kin_energy / resten;
255 currpos.speed = c_light * lorbeta(curr_gamma_1);
256 }
257 absvol* vav = currpos.G_lavol();
258 SensitiveVolume* asv = dynamic_cast<SensitiveVolume*>(vav);
259 if (asv != NULL) {
260 if (s_print_listing == 1) {
261 mcout << "volume is sensitive\n";
262 Iprintnf(mcout, Eloss / eV);
264 }
265 if (Eloss > 0.0) {
266 if (Eloss >= necessary_energy) {
267 // can leave electrons
268 // there is no need to recalculate mean energy loss per 1 cm,
269 // since necessary_energy is not an addition
270 if (s_print_listing == 1) {
271 mcout << "\nstart to leave conduction electrons" << std::endl;
272 //Iprintnf(mcout, Eloss/eV);
273 //Iprintnf(mcout, necessary_energy/eV);
274 Iprintnf(mcout, dedx);
275 }
276 if (necessary_energy <= 0.0) {
277#ifdef USE_ADJUSTED_W
279 hdecs->pairprod->get_eloss(prev_kin_energy / eV) * eV;
280#else
281 necessary_energy = hdecs->pairprod->get_eloss() * eV;
282#endif
283 }
285 double Eloss_left = Eloss;
286 point curpt = prevpos.pt;
287 vec dir = prevpos.dir; // this approximation ignores curvature
288 double curr_kin_energy_for_cond = prev_kin_energy;
289 if (s_print_listing == 1) Iprintnf(mcout, curpt);
290 // then at each step necessary_energy is energy due to expend till
291 // next conduction electron
292 while (Eloss_left >= necessary_energy) {
293 // this condition provides
294 // also that the current electron energy is non negative
295 double step_length = necessary_energy / (dedx * MeV / cm);
296 if (s_print_listing == 1) Iprintnf(mcout, step_length);
297 curpt = curpt + dir * step_length;
298 if (s_print_listing == 1) Iprintf(mcout, curpt);
299 point ptloc = curpt;
300 prevpos.tid.up_absref(&ptloc);
301 if (s_print_listing == 1) mcout << "New conduction electron\n";
302 HeedCondElectron hce(ptloc, currpos.time);
303 //HeedCondElectron hce(curpt, ptloc, prevpos.tid, this);
304 asv->conduction_electron_bank.append(hce);
305 //conduction_electron_bank.insert_after
306 // ( conduction_electron_bank.get_last_node(), hce);
307 Eloss_left -= necessary_energy;
308 curr_kin_energy_for_cond -= necessary_energy;
309// generate next random energy
310#ifdef USE_ADJUSTED_W
312 eV * hdecs->pairprod->get_eloss(curr_kin_energy_for_cond / eV);
313#else
314 necessary_energy = hdecs->pairprod->get_eloss() * eV;
315#endif
316 if (s_print_listing == 1) {
317 Iprintnf(mcout, Eloss_left / eV);
318 Iprint2nf(mcout, curr_kin_energy_for_cond / eV,
319 necessary_energy / eV);
320 }
321 }
322 necessary_energy -= Eloss_left;
324 } else {
325 necessary_energy -= Eloss;
326 }
327 }
328 }
329 if (s_print_listing == 1) {
330 mcout << '\n';
332 }
333 if (s_life == 1) {
334 if (s_print_listing == 1) mcout << "\nstart to rotate by low angle\n";
335 double ek_restricted = ek;
336 if (ek_restricted < 0.0005) ek_restricted = 0.0005;
337 if (s_print_listing == 1) {
340 }
341 if (currpos.prange < phys_mrange) {
342 // recalculate scatterings
343 s_path_length = 0;
344 if (s_low_mult_scattering == 1) {
345 long n1r = emesh->get_interval_number_between_centers(ek_restricted);
346 if (n1r < 0) n1r = 0;
347 if (n1r > qener - 2) n1r = qener - 2;
348 long n2r = n1r + 1;
349 double low_path_length; // in internal units
350 if (s_low_mult_scattering == 1) {
351 low_path_length = (hdecs->low_lambda[n1r] +
352 (hdecs->low_lambda[n2r] - hdecs->low_lambda[n1r]) /
353 (emesh->get_ec(n2r) - emesh->get_ec(n1r)) *
354 (ek_restricted - emesh->get_ec(n1r))) * cm;
355 if (s_print_listing == 1) Iprintnf(mcout, low_path_length / cm);
357 q_low_path_length = currpos.prange / low_path_length;
359 }
360 }
361 }
363#ifdef RANDOM_POIS
364 long random_q_low_path_length = 0;
365 if (q_low_path_length > 0.0) {
366 int ierror = 0;
367 random_q_low_path_length = pois(q_low_path_length, ierror);
368 check_econd11a(ierror, == 1,
369 " q_low_path_length=" << q_low_path_length << '\n', mcerr);
370 q_low_path_length = long(random_q_low_path_length);
371 if (s_print_listing == 1) {
372 mcout << "After pois:\n";
374 }
375 }
376#endif
377 if (q_low_path_length > 0) {
378#ifdef DIRECT_LOW_IF_LITTLE
380 // direct modeling
381 if (s_print_listing == 1) {
382 mcout << "direct modeling of low scatterings\n";
384 }
385 long n1r = emesh->get_interval_number_between_centers(ek_restricted);
386 if (n1r < 0) n1r = 0;
387 if (n1r > qener - 1) n1r = qener - 1;
388 for (long nscat = 0; nscat < q_low_path_length; ++nscat) {
389 if (s_print_listing == 1) Iprintn(mcout, nscat);
390 double theta_rot =
391 hdecs->low_angular_points_ran[n1r].ran(SRANLUX()) / 180.0 * M_PI;
392 if (s_print_listing == 1)
393 Iprint2nf(mcout, theta_rot, theta_rot / M_PI * 180.0);
394 vec dir = currpos.dir;
395 //Iprint(mcout, dir);
396 basis temp(dir, "temp");
397 vec vturn;
398 vturn.random_round_vec();
399 vturn = vturn * sin(theta_rot);
400 vec new_dir(vturn.x, vturn.y, cos(theta_rot));
401 new_dir.down(&temp);
402 currpos.dir = new_dir;
403 if (s_print_listing == 1) Iprint(mcout, new_dir);
404 }
407 } else {
408#endif
409 double sigma_ctheta =
410 hdecs->get_sigma(ek_restricted, q_low_path_length);
411 // actually it is mean(1-cos(theta)) or
412 // sqrt( mean( square(1-cos(theta) ) ) ) depending on USE_MEAN_COEF
413
414 if (s_print_listing == 1) Iprintnf(mcout, sigma_ctheta);
415 /*
416 This is for Gauss.
417 But actually exponential distribution fits better.
418 float r1 = SRANLUX();
419 float r2 = SRANLUX();
420 float x1, x2;
421 rnorm(r1, r2, x1, x2);
422 //Iprintn(mcout, x1);
423 double ctheta = 1.0 - fabs(x1 * sigma_ctheta);
424 // By the way,
425 // it seems that there were no condition > -1.0, this is error.
426 */
427 // Exponential:
428 double ctheta = 0.0;
429 {
430#ifdef USE_MEAN_COEF
431#else
432 double sq2 = sqrt(2.0);
433#endif
434 do {
435 double y = 0.0;
436 do { // in order to avoid SRANLUX() = 1
437 y = SRANLUX();
438 if (s_print_listing == 1) Iprintnf(mcout, y);
439 } while (y == 1.0);
440#ifdef USE_MEAN_COEF
441 double x = sigma_ctheta * (-log(1.0 - y));
442#else
443 double x = sigma_ctheta * 1.0 / sq2 * (-log(1.0 - y));
444#endif
445 ctheta = 1.0 - x;
446 if (s_print_listing == 1) Iprint2nf(mcout, x, ctheta);
447 } while (ctheta <= -1.0); // avoid absurd cos(theta)
448 check_econd21(ctheta, < -1.0 ||, > 1.0, mcerr);
449 }
450 if (s_print_listing == 1) Iprintnf(mcout, ctheta);
451 double theta_rot = acos(ctheta);
452 if (s_print_listing == 1) {
453 Iprint2nf(mcout, theta_rot, theta_rot / M_PI * 180.0);
454 }
455 vec dir = currpos.dir;
456 //Iprint(mcout, dir);
457 basis temp(dir, "temp");
458 //long n1r = emesh->get_interval_number_between_centers(ek_restricted);
459 //double theta_rot = angular_points_ran[nr1].ran(SRANLUX());
460 //Iprintn(mcout, theta_rot);
461 //double phi = 2.0 * M_PI * SRANLUX();
462 vec vturn;
463 vturn.random_round_vec();
464 vturn = vturn * sin(theta_rot);
465 vec new_dir(vturn.x, vturn.y, cos(theta_rot));
466 new_dir.down(&temp);
467 currpos.dir = new_dir;
468 //Iprint(mcout, new_dir);
471 }
472#ifdef DIRECT_LOW_IF_LITTLE
473 }
474#endif
475 if (s_path_length == 1) {
476 if (s_print_listing == 1) {
477 mcout << "\nstarting to rotate by large angle" << std::endl;
479 }
480 long n1r = emesh->get_interval_number_between_centers(ek_restricted);
481 if (n1r < 0) n1r = 0;
482 if (n1r > qener - 1) n1r = qener - 1;
483 double theta_rot =
484 hdecs->angular_points_ran[n1r].ran(SRANLUX()) / 180.0 * M_PI;
485 if (s_print_listing == 1) Iprintnf(mcout, theta_rot);
486 vec dir = currpos.dir;
487 //Iprint(mcout, dir);
488 basis temp(dir, "temp");
489 vec vturn;
490 vturn.random_round_vec();
491 vturn = vturn * sin(theta_rot);
492 vec new_dir(vturn.x, vturn.y, cos(theta_rot));
493 new_dir.down(&temp);
494 currpos.dir = new_dir;
495 //Iprint(mcout, new_dir);
498 }
499 } else {
500 // no need to scater
501 absvol* vav = currpos.G_lavol(); // get least address of volume
502 SensitiveVolume* asv = dynamic_cast<SensitiveVolume*>(vav);
503 if (asv != NULL) {
504 if (s_print_listing == 1) mcout << "Last conduction electron\n";
506 //HeedCondElectron hce(currpos.pt, currpos.ptloc, currpos.tid, this);
507 asv->conduction_electron_bank.append(hce);
508 //conduction_electron_bank.insert_after
509 // ( conduction_electron_bank.get_last_node(), hce);
510 }
511 }
512 if (s_print_listing == 1) {
515 }
516}
517
518void HeedDeltaElectron::print(std::ostream& file, int l) const {
519 if (l >= 0) {
520 Ifile << "HeedDeltaElectron (l=" << l
521 << "): particle_number=" << particle_number << "\n";
522 if (l == 1) return;
523 indn.n += 2;
524 Ifile << "s_low_mult_scattering=" << s_low_mult_scattering
525 << " s_high_mult_scattering=" << s_high_mult_scattering << '\n';
526 Ifile << "phys_mrange=" << phys_mrange << " s_stop_eloss=" << s_stop_eloss
527 << " s_mult_low_path_length=" << s_mult_low_path_length << '\n';
528 Ifile << "q_low_path_length=" << q_low_path_length
529 << " s_path_length=" << s_path_length
530 << " necessary_energy/eV=" << necessary_energy / eV << '\n';
531 Ifile << " parent_particle_number=" << parent_particle_number << '\n';
532
533 mparticle::print(file, l - 1);
534 indn.n -= 2;
535 }
536}
537
538}
DoubleAc cos(const DoubleAc &f)
Definition: DoubleAc.cpp:431
DoubleAc sqrt(const DoubleAc &f)
Definition: DoubleAc.cpp:313
DoubleAc sin(const DoubleAc &f)
Definition: DoubleAc.cpp:383
DoubleAc acos(const DoubleAc &f)
Definition: DoubleAc.cpp:488
#define check_econd21(a, sign1_b1_sign0, sign2_b2, stream)
Definition: FunNameStack.h:428
#define check_econd11(a, signb, stream)
Definition: FunNameStack.h:366
#define check_econd11a(a, signb, add, stream)
Definition: FunNameStack.h:395
#define mfunname(string)
Definition: FunNameStack.h:67
long get_interval_number_between_centers(double ener)
Definition: EnergyMesh.cpp:93
long get_q() const
Definition: EnergyMesh.h:51
double get_ec(long n) const
Definition: EnergyMesh.h:57
PassivePtr< HeedDeltaElectronCS > hdecs
double get_sigma(double energy, double nscat) const
PassivePtr< HeedMatterDef > hmd
DynLinArr< double > lambda
PassivePtr< PairProd > pairprod
DynLinArr< PointsRan > angular_points_ran
PassivePtr< ElElasticScatLowSigma > eesls
DynLinArr< PointsRan > low_angular_points_ran
DynLinArr< double > low_lambda
virtual void physics_after_new_speed()
virtual void physics_mrange(double &fmrange)
virtual void print(std::ostream &file, int l) const
BlkArr< HeedCondElectron > conduction_electron_bank
double prev_kin_energy
Definition: mparticle.h:29
double curr_kin_energy
Definition: mparticle.h:31
double mass
Mass (not mass * speed_of_light^2)
Definition: mparticle.h:25
virtual void print(std::ostream &file, int l) const
Definition: mparticle.cpp:308
double curr_gamma_1
Definition: mparticle.h:32
Definition: volume.h:91
Definition: vec.h:397
stvpoint currpos
Definition: gparticle.h:188
stvpoint prevpos
Definition: gparticle.h:187
int s_life
Definition: gparticle.h:180
void up_absref(absref *f)
Definition: volume.cpp:37
Definition: vec.h:477
point pt
Definition: gparticle.h:33
point ptloc
Definition: gparticle.h:37
absvol * G_lavol() const
Definition: gparticle.h:63
vec dirloc
Definition: gparticle.h:39
vfloat prange
Definition: gparticle.h:54
manip_absvol_treeid tid
Definition: gparticle.h:43
vfloat time
Definition: gparticle.h:55
vec dir
Definition: gparticle.h:35
vfloat speed
Definition: gparticle.h:41
Definition: vec.h:248
vfloat y
Definition: vec.h:250
void down(const basis *fabas)
Definition: vec.cpp:247
void random_round_vec(void)
Definition: vec.cpp:311
vfloat x
Definition: vec.h:250
Definition: BGMesh.cpp:3
long last_particle_number
Definition: HeedParticle.h:26
double lorbeta(const double gamma_1)
Definition: lorgamma.cpp:22
const long max_q_low_path_length_for_direct
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:122
long pois(double AMU, int &IERROR)
Definition: pois.cpp:17
indentation indn
Definition: prstream.cpp:13
#define Iprint3nf(file, name1, name2, name3)
Definition: prstream.h:253
#define mcout
Definition: prstream.h:133
#define Iprint3n(file, name1, name2, name3)
Definition: prstream.h:249
#define Ifile
Definition: prstream.h:207
#define Iprint(file, name)
Definition: prstream.h:209
#define mcerr
Definition: prstream.h:135
#define Iprintn(file, name)
Definition: prstream.h:216
#define Iprintf(file, name)
Definition: prstream.h:211
#define Iprint2nf(file, name1, name2)
Definition: prstream.h:239
#define Iprint2n(file, name1, name2)
Definition: prstream.h:236
#define Iprintnf(file, name)
Definition: prstream.h:218
ffloat SRANLUX(void)
Definition: ranluxint.h:262
int vecerror
Definition: vec.cpp:31
double vfloat
Definition: vfloat.h:15