User routines stupre and stuprf added.
[u/mrichter/AliRoot.git] / TFluka / stuprf.cxx
1 #include <Riostream.h>
2 #include "AliRun.h"
3 #include "TFluka.h"
4 #ifndef WIN32
5 # define stuprf stuprf_
6 #else
7 # define stuprf STUPRF
8 #endif
9 //
10 // Fluka include
11 #include "Fdimpar.h"  //(DIMPAR) fluka include
12 // Fluka commons
13 #include "Fdblprc.h"  //(DBLPRC) fluka common
14 #include "Fevtflg.h"  //(EVTFLG) fluka common
15 #include "Fpaprop.h"  //(PAPROP) fluka common
16 #include "Fstack.h"   //(STACK)  fluka common
17 #include "Ftrackr.h"  //(TRACKR) fluka common
18 #include "Ffinuc.h"   //(FINUC)  fluka common
19
20 //Virtual MC
21 #include "TFluka.h"
22 #include "TVirtualMCStack.h"
23 #include "TVirtualMCApplication.h"
24 #include "TParticle.h"
25 #include "TVector3.h"
26
27 extern "C" {
28 void stuprf(Int_t& ij, Int_t& mreg,
29             Double_t& xx, Double_t& yy, Double_t& zz,
30             Int_t& numsec, Int_t& npprmr)
31 {
32 //*----------------------------------------------------------------------*
33 //*                                                                      *
34 //*  SeT User PRoperties for Fluka particles                             *
35 //*                                                                      *
36 //*----------------------------------------------------------------------*
37
38 // STACK.lstack  = stack pointer
39 // STACK.louse   = user flag
40 // TRACKR.llouse = user defined flag for the current particle
41   STACK.louse[STACK.lstack] = TRACKR.llouse;
42
43 // mkbmx1 = dimension for kwb real spare array in fluka stack in DIMPAR
44 // mkbmx2 = dimension for kwb int. spare array in fluka stack in DIMPAR
45 // STACK.sparek  = spare real variables available for k.w.burn
46 // STACK.ispark  = spare integer variables available for k.w.burn
47 // TRACKR.spausr = user defined spare variables for the current particle
48 // TRACKR.ispusr = user defined spare flags for the current particle
49   Int_t ispr;
50   for (ispr=0; ispr<=mkbmx1-1; ispr++) {
51     STACK.sparek[STACK.lstack][ispr] = TRACKR.spausr[ispr];
52   }  
53   for (ispr=0; ispr<=mkbmx2-1; ispr++) {
54     STACK.ispark[STACK.lstack][ispr] = TRACKR.ispusr[ispr];
55   }  
56  
57 // Get the pointer to the VMC
58   TVirtualMC* fluka = TFluka::GetMC();
59 // Get the stack produced from the generator
60   TVirtualMCStack* cppstack = fluka->GetStack();
61   
62 // EVTFLG.ntrcks = track number
63 // Increment the track number and put it into the last flag
64   if (numsec-1 > npprmr) {
65 // Now call the SetTrack(...)
66     Int_t done = 0;
67     Int_t parent = TRACKR.ispusr[mkbmx2-1];
68     Int_t pdg = fluka->PDGFromId(ij);
69     
70     Double_t px = FINUC.plr[numsec-1]*FINUC.cxr[numsec-1];
71     Double_t pz = FINUC.plr[numsec-1]*FINUC.cyr[numsec-1];
72     Double_t py = FINUC.plr[numsec-1]*FINUC.czr[numsec-1];
73     Double_t e  = FINUC.tki[numsec-1] + PAPROP.am[FINUC.kpart[numsec-1]+6];
74     Double_t vx = xx;
75     Double_t vy = yy;
76     Double_t vz = zz;
77     Double_t tof = TRACKR.atrack;
78     Double_t polx = FINUC.cxrpol[numsec-1];
79     Double_t poly = FINUC.cyrpol[numsec-1];
80     Double_t polz = FINUC.czrpol[numsec-1];
81
82     TMCProcess mech = kPHadronic;
83     if (EVTFLG.ldecay == 1) mech = kPDecay;
84     else if (EVTFLG.ldltry == 1) mech = kPDeltaRay;
85     else if (EVTFLG.lpairp == 1) mech = kPPair;
86     else if (EVTFLG.lbrmsp == 1) mech = kPBrem;
87     Double_t weight = FINUC.wei[numsec-1];
88     Int_t is = 0;
89     Int_t ntr;  
90
91 //virtual void SetTrack(Int_t done, Int_t parent, Int_t pdg,
92 //Double_t px, Double_t py, Double_t pz, Double_t e,
93 //Double_t vx, Double_t vy, Double_t vz, Double_t tof,
94 //Double_t polx, Double_t poly, Double_t polz,
95 //TMCProcess mech, Int_t& ntr, Double_t weight,
96 //Int_t is) = 0;
97
98     
99     cppstack->SetTrack(done, parent, pdg,
100                     px, py, pz, e,
101                     vx, vy, vz, tof,
102                     polx, poly, polz,
103                     mech, ntr, weight, is);
104
105 cout << endl << " !!! stuprf: ntr=" << ntr << endl;
106     EVTFLG.ntrcks = ntr;
107     STACK.ispark[STACK.lstack][mkbmx2-1] = EVTFLG.ntrcks;
108   } // end of if (numsec-1 > npprmr)
109
110 } // end of stuprf
111 } // end of extern "C"
112