]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TFluka/stupre.cxx
Cerenkov production switched off.
[u/mrichter/AliRoot.git] / TFluka / stupre.cxx
CommitLineData
f827183d 1#include <Riostream.h>
2#include "AliRun.h"
f827183d 3#ifndef WIN32
4# define stupre stupre_
5#else
6# define stupre STUPRE
7#endif
8//
9// Fluka include
10#include "Fdimpar.h" //(DIMPAR) fluka include
11// Fluka commons
12#include "Fdblprc.h" //(DBLPRC) fluka common
13#include "Femfstk.h" //(EMFSTK) fluka common
14#include "Fevtflg.h" //(EVTFLG) fluka common
15#include "Fpaprop.h" //(PAPROP) fluka common
16#include "Ftrackr.h" //(TRACKR) fluka common
17
18//Virtual MC
fbf08100 19
a7bb59a2 20#ifndef WITH_ROOT
f827183d 21#include "TFluka.h"
a7bb59a2 22#else
23#include "TFlukaGeo.h"
24#endif
25
f827183d 26#include "TVirtualMCStack.h"
27#include "TVirtualMCApplication.h"
28#include "TParticle.h"
29#include "TVector3.h"
30
31extern "C" {
32void stupre()
33{
34//*----------------------------------------------------------------------*
35//* *
36//* SeT User PRoperties for Emf particles *
37//* *
38//*----------------------------------------------------------------------*
39
40 Int_t lbhabh = 0;
41 if (EVTFLG.ldltry == 1) {
7dac99f1 42 if (EMFSTK.ichemf[EMFSTK.npemf-1] * EMFSTK.ichemf[EMFSTK.npemf-2] < 0) lbhabh = 1;
f827183d 43 }
44
45// mkbmx1 = dimension for kwb real spare array in fluka stack in DIMPAR
46// mkbmx2 = dimension for kwb int. spare array in fluka stack in DIMPAR
47// EMFSTK.espark = spare real variables available for
48// EMFSTK.iespak = spare integer variables available for
49// TRACKR.spausr = user defined spare variables for the current particle
50// TRACKR.ispusr = user defined spare flags for the current particle
51// EMFSTK.louemf = user flag
52// TRACKR.llouse = user defined flag for the current particle
53
54 Int_t npnw, ispr;
7dac99f1 55 for (npnw=EMFSTK.npstrt-1; npnw<=EMFSTK.npemf-1; npnw++) {
f827183d 56
57 for (ispr=0; ispr<=mkbmx1-1; ispr++)
58 EMFSTK.espark[npnw][ispr] = TRACKR.spausr[ispr];
59
60 for (ispr=0; ispr<=mkbmx2-1; ispr++)
61 EMFSTK.iespak[npnw][ispr] = TRACKR.ispusr[ispr];
62
63 EMFSTK.louemf[npnw] = TRACKR.llouse;
64 }
65
66// Get the pointer to the VMC
fbf08100 67 TFluka* fluka = (TFluka*) gMC;
68 fluka->SetTrackIsNew(kTRUE);
69// TVirtualMC* fluka = TFluka::GetMC();
f827183d 70// Get the stack produced from the generator
71 TVirtualMCStack* cppstack = fluka->GetStack();
72
73// EVTFLG.ntrcks = track number
74// Increment the track number and put it into the last flag
75
76 Int_t kp;
7dac99f1 77 for (kp = EMFSTK.npstrt - 1; kp <= EMFSTK.npemf - 1; kp++) {
f827183d 78
79//* save the parent track number and reset it at each loop
610cd189 80 Int_t done = 0;
81ee7392 81
82 Int_t parent = TRACKR.ispusr[mkbmx2-1];
f827183d 83
f827183d 84 Int_t flukaid = 0;
7dac99f1 85
86 if (EMFSTK.ichemf[kp] == -1) flukaid = 3;
87 else if (EMFSTK.ichemf[kp] == 0) flukaid = 7;
88 else if (EMFSTK.ichemf[kp] == 0) flukaid = 4;
d15554e0 89 Int_t pdg = fluka->PDGFromId(flukaid);
7dac99f1 90 Double_t e = EMFSTK.etemf[kp] * emvgev;
d15554e0 91 Double_t p = sqrt(e * e - PAPROP.am[flukaid+6] * PAPROP.am[flukaid+6]);
92 Double_t px = p * EMFSTK.u[kp];
93 Double_t pz = p * EMFSTK.v[kp];
94 Double_t py = p * EMFSTK.w[kp];
95 Double_t tof = EMFSTK.agemf[kp];
96 Double_t polx = EMFSTK.upol[kp];
97 Double_t poly = EMFSTK.vpol[kp];
98 Double_t polz = EMFSTK.wpol[kp];
99 Double_t vx = EMFSTK.x[kp];
100 Double_t vy = EMFSTK.y[kp];
101 Double_t vz = EMFSTK.z[kp];
7dac99f1 102 Double_t weight = EMFSTK.wtemf[kp];
103
f827183d 104 Int_t ntr;
105 TMCProcess mech;
106 Int_t is = 0;
107
108//* case of no parent left (pair, photoelectric, annihilation):
109//* all secondaries are true
110 if ((EVTFLG.lpairp == 1) || (EVTFLG.lphoel == 1) ||
111 (EVTFLG.lannfl == 1) || (EVTFLG.lannrs == 1)) {
81ee7392 112
113 if (EVTFLG.lpairp == 1) mech = kPPair;
114 else if (EVTFLG.lphoel == 1) mech = kPPhotoelectric;
115 else mech = kPAnnihilation;
642f15cf 116 cppstack->PushTrack(done, parent, pdg,
81ee7392 117 px, py, pz, e, vx, vy, vz, tof,
118 polx, poly, polz, mech, ntr, weight, is);
d15554e0 119 cout << endl << " !!! stupre (PAIR, ..) : ntr=" << ntr << "pdg " << pdg << " parent=" << parent << endl;
120
81ee7392 121 EMFSTK.iespak[kp][mkbmx2-1] = ntr;
f827183d 122 } // end of lpairp, lphoel, lannfl, lannrs
123
124//* Compton: secondary is true only if charged (e+, e-)
125 else if ((EVTFLG.lcmptn == 1)) {
7dac99f1 126
127 if (EMFSTK.ichemf[kp] != 0) {
81ee7392 128 mech = kPCompton;
642f15cf 129 cppstack->PushTrack(done, parent, pdg,
81ee7392 130 px, py, pz, e, vx, vy, vz, tof,
131 polx, poly, polz, mech, ntr, weight, is);
d15554e0 132 cout << endl << " !!! stupre (COMPTON) : ntr=" << ntr << "pdg " << pdg << " parent=" << parent << endl;
81ee7392 133 EMFSTK.iespak[kp][mkbmx2-1] = ntr;
134 }
f827183d 135 } // end of lcmptn
81ee7392 136
f827183d 137//* Bremsstrahlung: true secondary only if charge = 0 (photon)
138 else if ((EVTFLG.lbrmsp == 1)) {
7dac99f1 139 if (EMFSTK.ichemf[kp] == 0) {
81ee7392 140 mech = kPBrem;
642f15cf 141 cppstack->PushTrack(done, parent, pdg,
81ee7392 142 px, py, pz, e, vx, vy, vz, tof,
143 polx, poly, polz, mech, ntr, weight, is);
d15554e0 144 cout << endl << " !!! stupre (BREMS) : ntr=" << ntr << "pdg " << pdg << " parent=" << parent << endl;
81ee7392 145 EMFSTK.iespak[kp][mkbmx2-1] = ntr;
146 }
f827183d 147 } // end of lbrmsp
81ee7392 148
f827183d 149//* Delta ray: If Bhabha, true secondary only if negative (electron)
150 else if ((EVTFLG.ldltry == 1)) {
81ee7392 151 if (lbhabh == 1) {
7dac99f1 152 if (EMFSTK.ichemf[kp] == -1) {
81ee7392 153 mech = kPDeltaRay;
642f15cf 154 cppstack->PushTrack(done, parent, pdg,
81ee7392 155 px, py, pz, e, vx, vy, vz, tof,
156 polx, poly, polz, mech, ntr, weight, is);
157 EMFSTK.iespak[kp][mkbmx2-1] = ntr;
d15554e0 158 cout << endl << " !!! stupre (BHABA) : ntr=" << ntr << "pdg " << pdg << " parent=" << parent << endl;
81ee7392 159 } // end of Bhabha
d15554e0 160 } // lbhabh == 1
81ee7392 161
f827183d 162//* Delta ray: Otherwise Moller: true secondary is the electron with
163//* lower energy, which has been put higher in the stack
7dac99f1 164 else if (kp == EMFSTK.npemf-1) {
81ee7392 165 mech = kPDeltaRay;
642f15cf 166 cppstack->PushTrack(done, parent, pdg,
81ee7392 167 px, py, pz, e, vx, vy, vz, tof,
168 polx, poly, polz, mech, ntr, weight, is);
d15554e0 169 cout << endl << " !!! stupre (Moller) : ntr=" << ntr << "pdg " << pdg << " parent=" << parent << endl;
81ee7392 170 EMFSTK.iespak[kp][mkbmx2-1] = ntr;
171 } // end of Delta ray
f827183d 172 } // end of ldltry
81ee7392 173
f827183d 174 } // end of loop
81ee7392 175
f827183d 176// !!! TO BE CONFIRMED !!!
f827183d 177} // end of stupre
178} // end of extern "C"
179