]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TFluka/stuprf.cxx
Update of the class ESDMuonFilter. New marcros for creating AOD with muon information...
[u/mrichter/AliRoot.git] / TFluka / stuprf.cxx
CommitLineData
f827183d 1#include <Riostream.h>
97b67dd4 2#include "TCallf77.h" //For the fortran calls
f827183d 3#ifndef WIN32
4# define stuprf stuprf_
97b67dd4 5# define usrdci usrdci_
f827183d 6#else
7# define stuprf STUPRF
97b67dd4 8# define usrdci USRDCI
f827183d 9#endif
10//
11// Fluka include
12#include "Fdimpar.h" //(DIMPAR) fluka include
13// Fluka commons
14#include "Fdblprc.h" //(DBLPRC) fluka common
15#include "Fevtflg.h" //(EVTFLG) fluka common
16#include "Fpaprop.h" //(PAPROP) fluka common
81f1d030 17#include "Fflkstk.h" //(FLKSTK) fluka common
f827183d 18#include "Ftrackr.h" //(TRACKR) fluka common
81f1d030 19#include "Fgenstk.h" //(GENSTK) fluka common
ca01d0af 20#include "Ffheavy.h" //(FHEAVY) fluka common
f827183d 21
18e0cabb 22
f827183d 23//Virtual MC
24#include "TFluka.h"
6d0e53bf 25#include "TFlukaIon.h"
f827183d 26#include "TVirtualMCStack.h"
27#include "TVirtualMCApplication.h"
28#include "TParticle.h"
29#include "TVector3.h"
30
31extern "C" {
97b67dd4 32
33 void type_of_call usrdci(int&, int&, int&, int&);
34
70541a80 35 void stuprf(Int_t& /*ij*/, Int_t& /*mreg*/,
18e0cabb 36 Double_t& xx, Double_t& yy, Double_t& zz,
37 Int_t& numsec, Int_t& npprmr)
f827183d 38{
39//*----------------------------------------------------------------------*
40//* *
41//* SeT User PRoperties for Fluka particles *
42//* *
43//*----------------------------------------------------------------------*
ca01d0af 44// Get the pointer to the VMC
45 TFluka* fluka = (TFluka*) gMC;
f827183d 46
81f1d030 47// FLKSTK.npflka = stack pointer
48// FLKSTK.louse = user flag
f827183d 49// TRACKR.llouse = user defined flag for the current particle
5834fcef 50
51 FLKSTK.louse[FLKSTK.npflka] = TRACKR.llouse;
f827183d 52
53// mkbmx1 = dimension for kwb real spare array in fluka stack in DIMPAR
54// mkbmx2 = dimension for kwb int. spare array in fluka stack in DIMPAR
81f1d030 55// FLKSTK.sparek = spare real variables available for k.w.burn
56// FLKSTK.ispark = spare integer variables available for k.w.burn
f827183d 57// TRACKR.spausr = user defined spare variables for the current particle
58// TRACKR.ispusr = user defined spare flags for the current particle
59 Int_t ispr;
5834fcef 60 if (numsec <= npprmr) {
61 for (ispr = 0; ispr <= mkbmx1 - 1; ispr++) {
62 FLKSTK.sparek[FLKSTK.npflka][ispr] = TRACKR.spausr[ispr];
5834fcef 63 }
64 for (ispr = 0; ispr <= mkbmx2 - 1; ispr++) {
65 FLKSTK.ispark[FLKSTK.npflka][ispr] = TRACKR.ispusr[ispr];
5834fcef 66 }
67 }
68
18e0cabb 69 // save parent info
5834fcef 70 FLKSTK.ispark[FLKSTK.npflka][mkbmx2 - 3] = TRACKR.jtrack; // fluka particle id
18e0cabb 71 FLKSTK.ispark[FLKSTK.npflka][mkbmx2 - 4] = TRACKR.ispusr[mkbmx2 - 1]; // current track number
5834fcef 72 FLKSTK.ispark[FLKSTK.npflka][mkbmx2 - 5] = npprmr; // flag npprmr>0
18e0cabb 73
ca01d0af 74
2bc4c610 75 Int_t verbosityLevel = fluka->GetVerbosityLevel();
5834fcef 76 Bool_t debug = (verbosityLevel>=3)? kTRUE:kFALSE;
15b1e45e 77
fbf08100 78 fluka->SetTrackIsNew(kTRUE);
79// TVirtualMC* fluka = TFluka::GetMC();
f827183d 80// Get the stack produced from the generator
81 TVirtualMCStack* cppstack = fluka->GetStack();
82
83// EVTFLG.ntrcks = track number
84// Increment the track number and put it into the last flag
81ee7392 85// was numsec -1
86// clarify with Alberto
18e0cabb 87
88// npprmr > 0, the secondary being loaded is actually still the interacting
89// particle (it can happen in some biasing situations)
90
15b1e45e 91 if (numsec > npprmr) {
642f15cf 92// Now call the PushTrack(...)
70541a80 93 Int_t done = 0;
81ee7392 94
41737358 95 Int_t parent = TRACKR.ispusr[mkbmx2-1];
5834fcef 96 Int_t kpart = GENSTK.kpart[numsec-1];
ca01d0af 97 Int_t pdg;
97b67dd4 98 Int_t a = 1;
99 Int_t z = 1;
100 Int_t ism = 0;
ca01d0af 101 if (kpart < -6) {
97b67dd4 102// kpart = -kpart;
103// z = kpart / 100000;
104// a = kpart - z * 100000;
105// a /= 100;
106 usrdci(kpart, a, z, ism);
6d0e53bf 107 pdg = TFlukaIon::GetIonPdg(z, a);
108 TFlukaIon::AddIon(a, z);
ca01d0af 109 } else {
110 pdg = fluka->PDGFromId(kpart);
111 }
112
81f1d030 113 Double_t px = GENSTK.plr[numsec-1] * GENSTK.cxr[numsec-1];
114 Double_t py = GENSTK.plr[numsec-1] * GENSTK.cyr[numsec-1];
115 Double_t pz = GENSTK.plr[numsec-1] * GENSTK.czr[numsec-1];
ca01d0af 116 Double_t e;
117
97b67dd4 118 if (a == 1) {
ca01d0af 119 e = GENSTK.tki[numsec-1] + PAPROP.am[GENSTK.kpart[numsec-1]+6];
120 } else {
121 e = GENSTK.tki[numsec-1] + Double_t(a) * 0.93149 + 8.071e-3;
122 }
123
124
f827183d 125 Double_t vx = xx;
126 Double_t vy = yy;
127 Double_t vz = zz;
18e0cabb 128
81ee7392 129 Double_t tof = TRACKR.atrack;
81f1d030 130 Double_t polx = GENSTK.cxrpol[numsec-1];
131 Double_t poly = GENSTK.cyrpol[numsec-1];
132 Double_t polz = GENSTK.czrpol[numsec-1];
15b1e45e 133
f827183d 134 TMCProcess mech = kPHadronic;
81ee7392 135 if (EVTFLG.ldecay == 1) {
18e0cabb 136 mech = kPDecay;
137 if (debug) cout << endl << "Decay" << endl;
4aba9d66 138 FLKSTK.nlattc[FLKSTK.npflka] = TRACKR.lt1trk;
81ee7392 139 } else if (EVTFLG.ldltry == 1) {
18e0cabb 140 mech = kPDeltaRay;
141 if( fluka->GetIcode() == kKASHEA ) {
142 // For all interactions secondaries are put on GENSTK common (kp=1,np)
143 // but for KASHEA delta ray generation where only the secondary elec-
144 // tron is present and stacked on FLKSTK common for kp=lstack
145 pdg = fluka->PDGFromId( FLKSTK.iloflk[FLKSTK.npflka] );
146 px = FLKSTK.pmoflk[FLKSTK.npflka] * FLKSTK.txflk[FLKSTK.npflka];
147 py = FLKSTK.pmoflk[FLKSTK.npflka] * FLKSTK.tyflk[FLKSTK.npflka];
148 pz = FLKSTK.pmoflk[FLKSTK.npflka] * FLKSTK.tzflk[FLKSTK.npflka];
149 e = FLKSTK.tkeflk[FLKSTK.npflka] + PAPROP.am[FLKSTK.iloflk[FLKSTK.npflka]+6];
150 polx = FLKSTK.txpol[FLKSTK.npflka];
151 poly = FLKSTK.typol[FLKSTK.npflka];
152 polz = FLKSTK.tzpol[FLKSTK.npflka];
153 if (debug) cout << endl << "Delta Ray from KASHEA...." << " pdg from FLKSTK=" << pdg << endl;
15b1e45e 154 } else {
155 if (debug) cout << endl << "Delta Ray" << endl;
156 }
81ee7392 157 } else if (EVTFLG.lpairp == 1) {
18e0cabb 158 mech = kPPair;
159 if (debug) cout << endl << "Pair Production" << endl;
81ee7392 160 } else if (EVTFLG.lbrmsp == 1) {
18e0cabb 161 mech = kPBrem;
162 if (debug) cout << endl << "Bremsstrahlung" << endl;
81ee7392 163 }
81ee7392 164
81f1d030 165 Double_t weight = GENSTK.wei[numsec-1];
f827183d 166 Int_t is = 0;
18e0cabb 167 Int_t ntr;
81ee7392 168 //
169 // Save particle in VMC stack
642f15cf 170 cppstack->PushTrack(done, parent, pdg,
15b1e45e 171 px, py, pz, e,
172 vx, vy, vz, tof,
173 polx, poly, polz,
174 mech, ntr, weight, is);
ca01d0af 175 if (debug) {
176
15b1e45e 177 cout << endl << " !!! stuprf: ntr=" << ntr << " pdg " << pdg << " parent=" << parent
178 << " parent_pdg="<< fluka->PDGFromId(TRACKR.jtrack) << " numsec "
5834fcef 179 << numsec << " npprmr " << npprmr << " icode=" << fluka->GetIcode()
180 << "kin. energy [keV] = " << GENSTK.tki[numsec-1] * 1.e6 << endl << endl;
15b1e45e 181
ca01d0af 182 }
183
18e0cabb 184
81ee7392 185//
186// Save current track number
81f1d030 187 FLKSTK.ispark[FLKSTK.npflka][mkbmx2-1] = ntr;
188 FLKSTK.ispark[FLKSTK.npflka][mkbmx2-2] = 0;
18e0cabb 189 } // end of if (numsec > npprmr)
190// else {
191// if(debug) {
192// cout << endl << " !!! stuprf: skipping pushtrack track=" << TRACKR.ispusr[mkbmx2-1]
193// << " pdg " << fluka->PDGFromId(TRACKR.jtrack) << " numsec=" << numsec<< " npprmr=" << npprmr
194// << " GENSTK pdg=" << fluka->PDGFromId(GENSTK.kpart[numsec-1]) << endl;
195// }
196// }
f827183d 197} // end of stuprf
97b67dd4 198
f827183d 199} // end of extern "C"
200