]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TFluka/mgdraw.cxx
Primary ionisation electrons come now correctly ordered from FLUKA.
[u/mrichter/AliRoot.git] / TFluka / mgdraw.cxx
1 #include <Riostream.h>
2 #include "TVirtualMCApplication.h"
3 #include "TVirtualMCStack.h"
4 #include "TFluka.h"
5 #include "TFlukaCodes.h"
6
7 // Fluka includes
8 #include "Fdimpar.h"  //(DIMPAR) 
9 #include "Fdblprc.h"  //(DBLPRC) 
10 #include "Ftrackr.h"  //(TRACKR) 
11 #include "Fopphst.h"  //(OPPHST) 
12 #include "Fflkstk.h"  //(FLKSTK) 
13 #include "Fltclcm.h"  //(LTCLCM) 
14 #include "Fpaprop.h"  //(PAPROP) 
15 #include "Falldlt.h"  //(ALLDLT) 
16 #include "Fdpdxcm.h"  //(DPDXCM) 
17 #include "Fflkmat.h"  //(FLKMAT) 
18
19 #include "TGeoManager.h"
20
21 #ifndef WIN32
22 # define mgdraw mgdraw_
23 #else
24 # define mgdraw MGDRAW
25 #endif
26
27 extern "C" {
28 void mgdraw(Int_t& icode, Int_t& mreg)
29 {
30     TFluka* fluka =  (TFluka*) gMC;
31     if (mreg == fluka->GetDummyRegion()) return;
32 //
33 //  Make sure that stack has currrent track Id
34 //
35     Int_t trackId = -1;
36     TVirtualMCStack* cppstack = fluka->GetStack();
37     
38     if (TRACKR.jtrack == -1) {
39         trackId = OPPHST.louopp[OPPHST.lstopp];
40         if (trackId == 0) {
41             trackId = FLKSTK.ispark[FLKSTK.npflka][mkbmx2-1];
42         }
43     } else {
44         trackId = TRACKR.ispusr[mkbmx2-1];
45     }
46     
47     Int_t verbosityLevel = fluka->GetVerbosityLevel();
48
49     if (TRACKR.jtrack < -6) {
50        // from -7 to -12 = "heavy" fragment
51        // assing parent id
52        // id < -6 was skipped in stuprf =>   if (kpart < -6) return;
53        if (verbosityLevel >= 3) {
54           cout << "mgdraw: (heavy fragment) jtrack < -6 =" << TRACKR.jtrack
55                << " assign parent pdg=" << fluka->PDGFromId(TRACKR.ispusr[mkbmx2 - 3]) << endl;
56        }
57        TRACKR.jtrack = TRACKR.ispusr[mkbmx2 - 3];
58     }
59     
60     cppstack->SetCurrentTrack(trackId);
61 //
62 //    
63     Int_t mlttc = TRACKR.lt1trk; // LTCLCM.mlatm1;
64     fluka->SetMreg(mreg, mlttc);
65     fluka->SetIcode((FlukaProcessCode_t) icode);
66     fluka->SetCaller(kMGDRAW);
67
68     Int_t nodeId;
69     Int_t volId   = fluka->CurrentVolID(nodeId);
70     Int_t crtlttc = gGeoManager->GetCurrentNodeId()+1;
71
72     // check region lattice consistency (debug Ernesto)
73     // *****************************************************
74     if(verbosityLevel>=3 && mreg != volId  && !gGeoManager->IsOutside() ) {
75        cout << "  mgdraw:   track=" << trackId << " pdg=" << fluka->PDGFromId(TRACKR.jtrack)
76             << " icode=" << icode << " gNstep=" << fluka->GetNstep() << endl
77             << "               fluka   mreg=" << mreg << " mlttc=" << mlttc << endl
78             << "               TGeo   volId=" << volId << " crtlttc=" << crtlttc << endl
79             << "     common TRACKR   lt1trk=" << TRACKR.lt1trk << " lt2trk=" << TRACKR.lt2trk << endl
80             << "     common LTCLCM   newlat=" << LTCLCM.newlat << " mlatld=" <<  LTCLCM.mlatld << endl
81             << "                     mlatm1=" << LTCLCM.mlatm1 << " mltsen=" <<  LTCLCM.mltsen << endl
82             << "                     mltsm1=" << LTCLCM.mltsm1 << " mlattc=" << LTCLCM.mlattc << endl;
83         if( mlttc == crtlttc ) cout << "   *************************************************************" << endl;
84     }
85     // *****************************************************
86
87     
88     Int_t med   = FLKMAT.medium[mreg - 1];  // Medium
89     Int_t msd   = DPDXCM.msdpdx[med  - 1];  // Iionisation model
90
91     if (!TRACKR.ispusr[mkbmx2 - 2]) {
92         if (verbosityLevel >= 3) {
93             cout << endl << "mgdraw: energy deposition for:" << trackId
94                  << " icode=" << icode
95                  << " pdg=" << fluka->PDGFromId(TRACKR.jtrack)
96                  << " flukaid="<< TRACKR.jtrack
97                  << " mreg=" << mreg
98                  << " np  =" << ALLDLT.nalldl
99                  << endl;
100                  
101         }
102
103         if (msd > 0) {
104 //
105 // Primary ionsiations
106             Int_t nprim = ALLDLT.nalldl;
107             if (nprim >= mxalld) {
108                 nprim = mxalld;
109                 Warning("mgdraw", "nprim > mxalld, nprim: %6d  pdg: %6d mreg %6d p %13.3f step %13.3f\n", 
110                         ALLDLT.nalldl, 
111                         fluka->PDGFromId(TRACKR.jtrack), 
112                         mreg, 
113                         TRACKR.ptrack, 
114                         TRACKR.ctrack);
115             }
116             fluka->PrimaryIonisationStepping(nprim);
117         } else {
118             // Single step
119             (TVirtualMCApplication::Instance())->Stepping();
120             fluka->SetTrackIsNew(kFALSE);
121         }
122         
123     } else {
124         //
125         // Tracking is being resumed after secondary tracking
126         //
127         if (verbosityLevel >= 3) {
128             cout << endl << "mgdraw: resuming Stepping(): " << trackId << endl;
129         }
130
131         fluka->SetTrackIsNew(kTRUE);
132         fluka->SetCaller(kMGResumedTrack);
133         (TVirtualMCApplication::Instance())->Stepping();
134
135         // Reset flag and stored values
136         TRACKR.ispusr[mkbmx2 - 2] = 0;
137         for (Int_t i = 0; i < 9; i++) TRACKR.spausr[i] = -1.;
138
139
140         if (verbosityLevel >= 3) {
141             cout << endl << " !!! I am in mgdraw - first Stepping() after resume: " << icode << endl;
142             cout << " Track= " << trackId << " region = " << mreg << endl;
143         }
144
145         fluka->SetTrackIsNew(kFALSE);
146         fluka->SetCaller(kMGDRAW);
147         if (msd == 0) {
148             (TVirtualMCApplication::Instance())->Stepping();
149         } else {
150             Int_t nprim = ALLDLT.nalldl;
151 // Protection against nprim > mxalld
152             if (nprim >= mxalld) {
153                 nprim = mxalld;
154                 Warning("mgdraw", "nprim > mxalld, nprim: %6d  pdg: %6d mreg %6d p %13.3f step %13.3f\n", 
155                         ALLDLT.nalldl, 
156                         fluka->PDGFromId(TRACKR.jtrack), 
157                         mreg, 
158                         TRACKR.ptrack, 
159                         TRACKR.ctrack);
160             }
161             fluka->PrimaryIonisationStepping(nprim);
162         } // primary ionisation switched on
163     } // tracking resumed
164 } // end of mgdraw
165 } // end of extern "C"
166