]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TFluka/TFlukaGeo.cxx
Fixed IsNewTrack()
[u/mrichter/AliRoot.git] / TFluka / TFlukaGeo.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id$ */
17
18 #include <Riostream.h>
19
20 #include "TClonesArray.h"
21 #include "TFlukaGeo.h"
22 #include "TCallf77.h"      //For the fortran calls
23 #include "Fdblprc.h"       //(DBLPRC) fluka common
24 #include "Fepisor.h"       //(EPISOR) fluka common
25 #include "Ffinuc.h"        //(FINUC) fluka common
26 #include "Fiounit.h"       //(IOUNIT) fluka common
27 #include "Fpaprop.h"       //(PAPROP) fluka common
28 #include "Fpart.h"         //(PART)   fluka common
29 #include "Ftrackr.h"       //(TRACKR) fluka common
30 #include "Fpaprop.h"       //(PAPROP) fluka common
31 #include "Ffheavy.h"       //(FHEAVY) fluka common
32
33 #include "TVirtualMC.h"
34 #include "TGeoManager.h"
35 #include "TFlukaMCGeometry.h"
36
37 #include "TLorentzVector.h"
38
39 // Fluka methods that may be needed.
40 #ifndef WIN32 
41 # define flukam  flukam_
42 # define fluka_openinp fluka_openinp_
43 # define fluka_closeinp fluka_closeinp_
44 # define mcihad mcihad_
45 # define mpdgha mpdgha_
46 #else 
47 # define flukam  FLUKAM
48 # define fluka_openinp FLUKA_OPENINP
49 # define fluka_closeinp FLUKA_CLOSEINP
50 # define mcihad MCIHAD
51 # define mpdgha MPDGHA
52 #endif
53
54 extern "C" 
55 {
56   //
57   // Prototypes for FLUKA functions
58   //
59   void type_of_call flukam(const int&);
60   void type_of_call fluka_openinp(const int&, DEFCHARA);
61   void type_of_call fluka_closeinp(const int&);
62   int  type_of_call mcihad(const int&);
63   int  type_of_call mpdgha(const int&);
64 }
65
66 //
67 // Class implementation for ROOT
68 //
69 ClassImp(TFluka)
70
71 //
72 //----------------------------------------------------------------------------
73 // TFluka constructors and destructors.
74 //______________________________________________________________________________
75 TFluka::TFluka()
76   :TVirtualMC(),
77    fVerbosityLevel(0),
78    sInputFileName("")
79
80   //
81   // Default constructor
82   //
83    fNVolumes = 0;
84    fCurrentFlukaRegion = -1;
85    fGeom = 0;
86
87  
88 //______________________________________________________________________________ 
89 TFluka::TFluka(const char *title, Int_t verbosity, Bool_t isRootGeometrySupported)
90   :TVirtualMC("TFluka",title, isRootGeometrySupported),
91    fVerbosityLevel(verbosity),
92    sInputFileName(""),
93    fTrackIsEntering(0),
94    fTrackIsExiting(0),
95    fTrackIsNew(0)
96 {
97   // create geometry interface
98   if (fVerbosityLevel >=3)
99     cout << "<== TFluka::TFluka(" << title << ") constructor called." << endl;
100
101    fNVolumes      = 0;
102    fCurrentFlukaRegion = -1;
103    fGeom = new TFlukaMCGeometry("geom", "ALICE geometry");
104 }
105
106 //______________________________________________________________________________ 
107 TFluka::~TFluka() {
108   if (fVerbosityLevel >=3)
109     cout << "==> TFluka::~TFluka() destructor called." << endl;
110
111   delete fGeom;
112
113   if (fVerbosityLevel >=3)
114     cout << "<== TFluka::~TFluka() destructor called." << endl;
115 }
116
117 //
118 //______________________________________________________________________________
119 // TFluka control methods
120 //______________________________________________________________________________ 
121 void TFluka::Init() {
122
123   if (fVerbosityLevel >=3)
124     cout << "==> TFluka::Init() called." << endl;
125
126    if (!gGeoManager) new TGeoManager("geom", "FLUKA geometry");
127    fApplication->ConstructGeometry();
128    TGeoVolume *top = (TGeoVolume*)gGeoManager->GetListOfVolumes()->First();
129    gGeoManager->SetTopVolume(top);
130    gGeoManager->CloseGeometry("di");
131    gGeoManager->DefaultColors();  // to be removed
132    fNVolumes = fGeom->NofVolumes();
133    printf("== Number of volumes: %i\n ==", fNVolumes);
134    fGeom->CreateFlukaMatFile("flukaMat.inp");   
135   cout << "\t* InitPhysics() - Prepare input file to be called" << endl; 
136   // now we have TGeo geometry created and we have to patch alice.inp
137   // with the material mapping file FlukaMat.inp
138   InitPhysics(); // prepare input file with the current physics settings
139     cout << "\t* InitPhysics() - Prepare input file was called" << endl; 
140
141   if (fVerbosityLevel >=2)
142     cout << "\t* Changing lfdrtr = (" << (GLOBAL.lfdrtr?'T':'F')
143          << ") in fluka..." << endl;
144   GLOBAL.lfdrtr = true;
145
146   if (fVerbosityLevel >=2)
147     cout << "\t* Opening file " << sInputFileName << endl;
148   const char* fname = sInputFileName;
149   fluka_openinp(lunin, PASSCHARA(fname));
150
151   if (fVerbosityLevel >=2)
152     cout << "\t* Calling flukam..." << endl;
153   flukam(1);
154
155   if (fVerbosityLevel >=2)
156     cout << "\t* Closing file " << sInputFileName << endl;
157   fluka_closeinp(lunin);
158
159   FinishGeometry();
160
161   if (fVerbosityLevel >=3)
162     cout << "<== TFluka::Init() called." << endl;
163 }
164
165 //______________________________________________________________________________ 
166 void TFluka::FinishGeometry() {
167 //
168 // Build-up table with region to medium correspondance
169 //
170   if (fVerbosityLevel >=3)
171     cout << "==> TFluka::FinishGeometry() called." << endl;
172
173    printf("----FinishGeometry - nothing to do with TGeo\n");
174   
175   if (fVerbosityLevel >=3)
176     cout << "<== TFluka::FinishGeometry() called." << endl;
177
178
179 //______________________________________________________________________________ 
180 void TFluka::BuildPhysics() {
181   if (fVerbosityLevel >=3)
182     cout << "==> TFluka::BuildPhysics() called." << endl;
183
184
185   if (fVerbosityLevel >=3)
186     cout << "<== TFluka::BuildPhysics() called." << endl;
187 }  
188
189 //______________________________________________________________________________ 
190 void TFluka::ProcessEvent() {
191   if (fVerbosityLevel >=3)
192     cout << "==> TFluka::ProcessEvent() called." << endl;
193   fApplication->GeneratePrimaries();
194   EPISOR.lsouit = true;
195   flukam(1);
196   if (fVerbosityLevel >=3)
197     cout << "<== TFluka::ProcessEvent() called." << endl;
198 }
199
200 //______________________________________________________________________________ 
201 void TFluka::ProcessRun(Int_t nevent) {
202   if (fVerbosityLevel >=3)
203     cout << "==> TFluka::ProcessRun(" << nevent << ") called." 
204          << endl;
205
206   if (fVerbosityLevel >=2) {
207     cout << "\t* GLOBAL.fdrtr = " << (GLOBAL.lfdrtr?'T':'F') << endl;
208     cout << "\t* Calling flukam again..." << endl;
209   }
210   fApplication->InitGeometry();
211   fApplication->BeginEvent();
212   ProcessEvent();
213   fApplication->FinishEvent();
214   if (fVerbosityLevel >=3)
215     cout << "<== TFluka::ProcessRun(" << nevent << ") called." 
216          << endl;
217
218 }
219
220 //_____________________________________________________________________________
221 // methods for building/management of geometry
222
223 // functions from GCONS 
224 //____________________________________________________________________________ 
225 void TFluka::Gfmate(Int_t imat, char *name, Float_t &a, Float_t &z,  
226                     Float_t &dens, Float_t &radl, Float_t &absl,
227                     Float_t* ubuf, Int_t& nbuf) {
228 //
229   fGeom->Gfmate(imat, name, a, z, dens, radl, absl, ubuf, nbuf);
230
231
232 //______________________________________________________________________________ 
233 void TFluka::Gfmate(Int_t imat, char *name, Double_t &a, Double_t &z,  
234                     Double_t &dens, Double_t &radl, Double_t &absl,
235                     Double_t* ubuf, Int_t& nbuf) {
236 //
237   fGeom->Gfmate(imat, name, a, z, dens, radl, absl, ubuf, nbuf);
238
239
240 // detector composition
241 //______________________________________________________________________________ 
242 void TFluka::Material(Int_t& kmat, const char* name, Double_t a, 
243                       Double_t z, Double_t dens, Double_t radl, Double_t absl,
244                       Float_t* buf, Int_t nwbuf) {
245 //
246    fGeom->Material(kmat, name, a, z, dens, radl, absl, buf, nwbuf);
247
248
249 //______________________________________________________________________________ 
250 void TFluka::Material(Int_t& kmat, const char* name, Double_t a, 
251                       Double_t z, Double_t dens, Double_t radl, Double_t absl,
252                       Double_t* buf, Int_t nwbuf) {
253 //
254    fGeom->Material(kmat, name, a, z, dens, radl, absl, buf, nwbuf);
255
256
257 //______________________________________________________________________________ 
258 void TFluka::Mixture(Int_t& kmat, const char *name, Float_t *a, 
259                      Float_t *z, Double_t dens, Int_t nlmat, Float_t *wmat) {
260 //
261    fGeom->Mixture(kmat, name, a, z, dens, nlmat, wmat); 
262
263
264 //______________________________________________________________________________ 
265 void TFluka::Mixture(Int_t& kmat, const char *name, Double_t *a, 
266                      Double_t *z, Double_t dens, Int_t nlmat, Double_t *wmat) {
267 //
268    fGeom->Mixture(kmat, name, a, z, dens, nlmat, wmat); 
269
270
271 //______________________________________________________________________________ 
272 void TFluka::Medium(Int_t& kmed, const char *name, Int_t nmat, 
273                     Int_t isvol, Int_t ifield, Double_t fieldm, Double_t tmaxfd, 
274                     Double_t stemax, Double_t deemax, Double_t epsil, 
275                     Double_t stmin, Float_t* ubuf, Int_t nbuf) { 
276   //
277   fGeom->Medium(kmed, name, nmat, isvol, ifield, fieldm, tmaxfd, stemax, deemax, 
278              epsil, stmin, ubuf, nbuf);
279
280
281 //______________________________________________________________________________ 
282 void TFluka::Medium(Int_t& kmed, const char *name, Int_t nmat, 
283                     Int_t isvol, Int_t ifield, Double_t fieldm, Double_t tmaxfd, 
284                     Double_t stemax, Double_t deemax, Double_t epsil, 
285                     Double_t stmin, Double_t* ubuf, Int_t nbuf) { 
286   //
287   fGeom->Medium(kmed, name, nmat, isvol, ifield, fieldm, tmaxfd, stemax, deemax, 
288              epsil, stmin, ubuf, nbuf);
289
290
291 //______________________________________________________________________________ 
292 void TFluka::Matrix(Int_t& krot, Double_t thetaX, Double_t phiX, 
293                     Double_t thetaY, Double_t phiY, Double_t thetaZ, 
294                     Double_t phiZ) {
295 //                   
296   fGeom->Matrix(krot, thetaX, phiX, thetaY, phiY, thetaZ, phiZ); 
297
298
299 //______________________________________________________________________________ 
300 void TFluka::Gstpar(Int_t /*itmed*/, const char */*param*/, Double_t /*parval*/) {
301 //
302 // Is it needed with TGeo ??? - to clear-up
303    Warning("Gstpar", "Not implemented with TGeo");
304 }    
305
306 // functions from GGEOM 
307 //_____________________________________________________________________________
308 void TFluka::Gsatt(const char *name, const char *att, Int_t val)
309
310    fGeom->Gsatt(name,att, val);
311 }
312
313 //______________________________________________________________________________ 
314 Int_t TFluka::Gsvolu(const char *name, const char *shape, Int_t nmed,  
315                      Float_t *upar, Int_t np)  {
316 //
317     return fGeom->Gsvolu(name, shape, nmed, upar, np); 
318 }
319
320 //______________________________________________________________________________ 
321 Int_t TFluka::Gsvolu(const char *name, const char *shape, Int_t nmed,  
322                      Double_t *upar, Int_t np)  {
323 //
324     return fGeom->Gsvolu(name, shape, nmed, upar, np); 
325 }
326  
327 //______________________________________________________________________________ 
328 void TFluka::Gsdvn(const char *name, const char *mother, Int_t ndiv, 
329                    Int_t iaxis) {
330 //
331     fGeom->Gsdvn(name, mother, ndiv, iaxis); 
332
333
334 //______________________________________________________________________________ 
335 void TFluka::Gsdvn2(const char *name, const char *mother, Int_t ndiv, 
336                     Int_t iaxis, Double_t c0i, Int_t numed) {
337 //
338     fGeom->Gsdvn2(name, mother, ndiv, iaxis, c0i, numed); 
339
340
341 //______________________________________________________________________________ 
342 void TFluka::Gsdvt(const char *name, const char *mother, Double_t step, 
343                    Int_t iaxis, Int_t numed, Int_t ndvmx) {
344 //      
345     fGeom->Gsdvt(name, mother, step, iaxis, numed, ndvmx); 
346
347
348 //______________________________________________________________________________ 
349 void TFluka::Gsdvt2(const char *name, const char *mother, Double_t step, 
350                     Int_t iaxis, Double_t c0, Int_t numed, Int_t ndvmx) { 
351 //
352     fGeom->Gsdvt2(name, mother, step, iaxis, c0, numed, ndvmx); 
353
354
355 //______________________________________________________________________________ 
356 void TFluka::Gsord(const char * /*name*/, Int_t /*iax*/) {
357 //
358 // Nothing to do with TGeo
359
360
361 //______________________________________________________________________________ 
362 void TFluka::Gspos(const char *name, Int_t nr, const char *mother,  
363                    Double_t x, Double_t y, Double_t z, Int_t irot, 
364                    const char *konly) {
365 //
366   fGeom->Gspos(name, nr, mother, x, y, z, irot, konly); 
367
368
369 //______________________________________________________________________________ 
370 void TFluka::Gsposp(const char *name, Int_t nr, const char *mother,  
371                     Double_t x, Double_t y, Double_t z, Int_t irot,
372                     const char *konly, Float_t *upar, Int_t np)  {
373   //
374   fGeom->Gsposp(name, nr, mother, x, y, z, irot, konly, upar, np); 
375
376
377 //______________________________________________________________________________ 
378 void TFluka::Gsposp(const char *name, Int_t nr, const char *mother,  
379                     Double_t x, Double_t y, Double_t z, Int_t irot,
380                     const char *konly, Double_t *upar, Int_t np)  {
381   //
382   fGeom->Gsposp(name, nr, mother, x, y, z, irot, konly, upar, np); 
383
384
385 //______________________________________________________________________________ 
386 void TFluka::Gsbool(const char* /*onlyVolName*/, const char* /*manyVolName*/) {
387 //
388 // Nothing to do with TGeo
389    Warning("Gsbool", "Not implemented with TGeo");
390 }
391
392 //______________________________________________________________________________ 
393 void TFluka::SetCerenkov(Int_t /*itmed*/, Int_t /*npckov*/, Float_t */*ppckov*/,
394                          Float_t * /*absco*/, Float_t * /*effic*/, Float_t * /*rindex*/) {
395 //
396 // Not implemented with TGeo - what G4 did ? Any FLUKA card generated?
397    Warning("SetCerenkov", "Not implemented with TGeo");
398 }  
399
400 //______________________________________________________________________________ 
401 void TFluka::SetCerenkov(Int_t /*itmed*/, Int_t /*npckov*/, Double_t * /*ppckov*/,
402                          Double_t * /*absco*/, Double_t * /*effic*/, Double_t * /*rindex*/) {
403 //
404 // Not implemented with TGeo - what G4 did ? Any FLUKA card generated?
405    Warning("SetCerenkov", "Not implemented with TGeo");
406 }  
407     
408 // Euclid
409 //______________________________________________________________________________ 
410 void TFluka::WriteEuclid(const char* /*fileName*/, const char* /*topVol*/, 
411                           Int_t /*number*/, Int_t /*nlevel*/) {
412 //
413 // Not with TGeo
414    Warning("WriteEuclid", "Not implemented with TGeo");
415
416
417
418
419 //_____________________________________________________________________________
420 // methods needed by the stepping
421 //____________________________________________________________________________ 
422
423 Int_t TFluka::GetMedium() const {
424 //
425 //  Get the medium number for the current fluka region
426 //
427     return fGeom->GetMedium(); // this I need to check due to remapping !!!
428 }
429
430
431
432 //____________________________________________________________________________ 
433 // particle table usage
434 // ID <--> PDG transformations
435 //_____________________________________________________________________________
436 Int_t TFluka::IdFromPDG(Int_t pdg) const 
437 {
438     //
439     // Return Fluka code from PDG and pseudo ENDF code
440     
441     // Catch the feedback photons
442     if (pdg == 50000051) return (-1);
443     // MCIHAD() goes from pdg to fluka internal.
444     Int_t intfluka = mcihad(pdg);
445     // KPTOIP array goes from internal to official
446     return GetFlukaKPTOIP(intfluka);
447 }
448
449 //______________________________________________________________________________ 
450 Int_t TFluka::PDGFromId(Int_t id) const 
451 {
452   //
453   // Return PDG code and pseudo ENDF code from Fluka code
454
455   // IPTOKP array goes from official to internal
456
457     if (id == -1) {
458 // Cerenkov photon
459         if (fVerbosityLevel >= 1)
460             printf("\n PDGFromId: Cerenkov Photon \n");
461         return  50000050;
462     }
463 // Error id    
464     if (id == 0) {
465         if (fVerbosityLevel >= 1)
466             printf("PDGFromId: Error id = 0\n");
467         return -1;
468     }
469 // Good id    
470     Int_t intfluka = GetFlukaIPTOKP(id);
471     if (intfluka == 0) {
472         if (fVerbosityLevel >= 1)
473             printf("PDGFromId: Error intfluka = 0: %d\n", id);
474         return -1;
475     } else if (intfluka < 0) {
476         if (fVerbosityLevel >= 1)
477             printf("PDGFromId: Error intfluka < 0: %d\n", id);
478         return -1;
479     }
480     if (fVerbosityLevel >= 3)
481         printf("mpdgha called with %d %d \n", id, intfluka);
482     // MPDGHA() goes from fluka internal to pdg.
483     return mpdgha(intfluka);
484 }
485
486 //_____________________________________________________________________________
487 // methods for physics management
488 //____________________________________________________________________________ 
489 //
490 // set methods
491 //
492
493 //______________________________________________________________________________ 
494 void TFluka::SetProcess(const char* flagName, Int_t flagValue)
495 {
496   Int_t i;
497   if (iNbOfProc < 100) {
498     for (i=0; i<iNbOfProc; i++) {
499       if (strcmp(&sProcessFlag[i][0],flagName) == 0) {
500         iProcessValue[iNbOfProc] = flagValue;
501         goto fin;
502       }
503     }
504     strcpy(&sProcessFlag[iNbOfProc][0],flagName);
505     iProcessValue[iNbOfProc++] = flagValue;
506   }
507   else
508     cout << "Nb of SetProcess calls exceeds 100 - ignored" << endl;
509 fin:
510   iNbOfProc = iNbOfProc;
511 }
512
513 //______________________________________________________________________________ 
514 void TFluka::SetCut(const char* cutName, Double_t cutValue)
515 {
516   Int_t i;
517   if (iNbOfCut < 100) {
518     for (i=0; i<iNbOfCut; i++) {
519       if (strcmp(&sCutFlag[i][0],cutName) == 0) {
520         fCutValue[iNbOfCut] = cutValue;
521         goto fin;
522       }
523     }
524     strcpy(&sCutFlag[iNbOfCut][0],cutName);
525     fCutValue[iNbOfCut++] = cutValue;
526   }
527   else
528     cout << "Nb of SetCut calls exceeds 100 - ignored" << endl;
529 fin:
530   iNbOfCut = iNbOfCut;
531 }
532
533 //______________________________________________________________________________ 
534 Double_t TFluka::Xsec(char*, Double_t, Int_t, Int_t)
535 {
536   printf("WARNING: Xsec not yet implemented !\n"); return -1.;
537 }
538
539
540 //______________________________________________________________________________ 
541 void TFluka::InitPhysics()
542 {
543 // Last material number taken from the "corealice.inp" file, presently 31
544 // !!! it should be available from Flugg !!!
545   Int_t i, j, k;
546   Double_t fCut;
547   Float_t fLastMaterial = fGeom->GetLastMaterialIndex();
548   printf("   last FLUKA material is %g\n", fLastMaterial);
549
550 // construct file names
551   TString sAliceCoreInp = getenv("ALICE_ROOT");
552   sAliceCoreInp +="/TFluka/input/";
553   TString sAliceTmp = "flukaMat.inp";
554   TString sAliceInp = GetInputFileName();
555   sAliceCoreInp += GetCoreInputFileName();
556   ifstream AliceCoreInp(sAliceCoreInp.Data());
557   ifstream AliceFlukaMat(sAliceTmp.Data());
558   ofstream AliceInp(sAliceInp.Data());
559
560 // copy core input file 
561   Char_t sLine[255];
562   Float_t fEventsPerRun;
563
564   while (AliceCoreInp.getline(sLine,255)) {
565     if (strncmp(sLine,"GEOEND",6) != 0)
566       AliceInp << sLine << endl; // copy until GEOEND card
567     else {
568       AliceInp << "GEOEND" << endl; // add GEOEND card
569       goto flukamat;
570     }
571   } // end of while until GEOEND card
572
573 flukamat:
574   while (AliceFlukaMat.getline(sLine,255)) { // copy flukaMat.inp file
575         AliceInp << sLine << endl;
576   }
577
578   while (AliceCoreInp.getline(sLine,255)) {
579     if (strncmp(sLine,"START",5) != 0)
580       AliceInp << sLine << endl;
581     else {
582       sscanf(sLine+10,"%10f",&fEventsPerRun);
583       goto fin;
584     }
585   } //end of while until START card
586
587 fin:
588 // in G3 the process control values meaning can be different for
589 // different processes, but for most of them is:
590 //   0  process is not activated
591 //   1  process is activated WITH generation of secondaries
592 //   2  process is activated WITHOUT generation of secondaries
593 // if process does not generate secondaries => 1 same as 2
594 //
595 // Exceptions:
596 //   MULS:  also 3
597 //   LOSS:  also 3, 4
598 //   RAYL:  only 0,1
599 //   HADR:  may be > 2
600 //
601  
602 // Loop over number of SetProcess calls  
603   AliceInp << "*----------------------------------------------------------------------------- "; 
604   AliceInp << endl;
605   AliceInp << "*----- The following data are generated from SetProcess and SetCut calls ----- "; 
606   AliceInp << endl;
607   AliceInp << "*----------------------------------------------------------------------------- "; 
608     AliceInp << endl;
609   for (i=0; i<iNbOfProc; i++) {
610
611     // annihilation
612     // G3 default value: 1
613     // G4 processes: G4eplusAnnihilation/G4IeplusAnnihilation
614     // Particles: e+
615     // Physics:   EM
616     // flag = 0 no annihilation
617     // flag = 1 annihilation, decays processed
618     // flag = 2 annihilation, no decay product stored
619     // gMC ->SetProcess("ANNI",1); // EMFCUT   -1.   0.  0. 3. lastmat 0. ANNH-THR
620     if (strncmp(&sProcessFlag[i][0],"ANNI",4) == 0) {
621       if (iProcessValue[i] == 1 || iProcessValue[i] == 2) {
622         AliceInp << "*"; 
623         AliceInp << endl;
624         AliceInp << "*Kinetic energy threshold (GeV) for e+ annihilation - resets to default=0."; 
625         AliceInp << endl;
626         AliceInp << "*Generated from call: SetProcess('ANNI',1) or SetProcess('ANNI',2)"; 
627         AliceInp << endl;
628         AliceInp << setw(10) << "EMFCUT    "; 
629         AliceInp << setiosflags(ios::scientific) << setprecision(5);
630         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
631         AliceInp << setw(10) << -1.0; // kinetic energy threshold (GeV) for e+ annihilation (resets to default=0)
632         AliceInp << setw(10) << 0.0;  // not used
633         AliceInp << setw(10) << 0.0;  // not used
634         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
635         AliceInp << setw(10) << setprecision(2);
636         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
637         AliceInp << setprecision(1);
638         AliceInp << setw(10) << 1.0;  // step length in assigning indices
639         AliceInp << setw(8)  << "ANNH-THR"; 
640         AliceInp << endl;
641       }
642       else if (iProcessValue[i] == 0) {
643         AliceInp << "*"; 
644         AliceInp << endl;
645         AliceInp << "*No annihilation - no FLUKA card generated"; 
646         AliceInp << endl;
647         AliceInp << "*Generated from call: SetProcess('ANNI',0)"; 
648         AliceInp << endl;
649       }
650       else  {
651         AliceInp << "*"; 
652         AliceInp << endl;
653         AliceInp << "*Illegal flag value in SetProcess('ANNI',?) call."; 
654         AliceInp << endl;
655         AliceInp << "*No FLUKA card generated"; 
656         AliceInp << endl;
657       }
658     }
659     
660     // bremsstrahlung and pair production are both activated
661     // G3 default value: 1
662     // G4 processes: G4eBremsstrahlung/G4IeBremsstrahlung,
663     //               G4MuBremsstrahlung/G4IMuBremsstrahlung,
664     //               G4LowEnergyBremstrahlung
665     // Particles: e-/e+; mu+/mu-
666     // Physics:   EM
667     // flag = 0 no bremsstrahlung
668     // flag = 1 bremsstrahlung, photon processed
669     // flag = 2 bremsstrahlung, no photon stored
670     // gMC ->SetProcess("BREM",1); // PAIRBREM  2.   0.  0. 3. lastmat
671                                  // EMFCUT   -1.   0.  0. 3. lastmat 0. ELPO-THR
672     // G3 default value: 1
673     // G4 processes: G4GammaConversion,
674     //               G4MuPairProduction/G4IMuPairProduction
675     //               G4LowEnergyGammaConversion
676     // Particles: gamma, mu
677     // Physics:   EM
678     // flag = 0 no delta rays
679     // flag = 1 delta rays, secondaries processed
680     // flag = 2 delta rays, no secondaries stored
681     // gMC ->SetProcess("PAIR",1); // PAIRBREM  1.   0.  0. 3. lastmat
682                                  // EMFCUT    0.   0. -1. 3. lastmat 0. PHOT-THR
683     else if ((strncmp(&sProcessFlag[i][0],"PAIR",4) == 0) && (iProcessValue[i] == 1 || iProcessValue[i] == 2)) {
684       for (j=0; j<iNbOfProc; j++) {
685         if ((strncmp(&sProcessFlag[j][0],"BREM",4) == 0) && (iProcessValue[j] == 1 || iProcessValue[j] == 2)) {
686           AliceInp << "*"; 
687           AliceInp << endl;
688           AliceInp << "*Bremsstrahlung and pair production by muons and charged hadrons both activated"; 
689           AliceInp << endl;
690           AliceInp << "*Generated from call: SetProcess('BREM',1) and SetProcess('PAIR',1)"; 
691           AliceInp << endl;
692           AliceInp << "*Energy threshold set by call SetCut('BCUTM',cut) or set to 0."; 
693           AliceInp << endl;
694           AliceInp << "*Energy threshold set by call SetCut('PPCUTM',cut) or set to 0."; 
695           AliceInp << endl;
696           AliceInp << setw(10) << "PAIRBREM  "; 
697           AliceInp << setiosflags(ios::scientific) << setprecision(5);
698           AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
699           AliceInp << setw(10) << 3.0; // bremsstrahlung and pair production by muons and charged hadrons both are activated
700           // direct pair production by muons
701           // G4 particles: "e-", "e+"
702           // G3 default value: 0.01 GeV
703           //gMC ->SetCut("PPCUTM",cut); // total energy cut for direct pair prod. by muons
704           fCut = 0.0;
705           for (k=0; k<iNbOfCut; k++) {
706             if (strncmp(&sCutFlag[k][0],"PPCUTM",6) == 0) fCut = fCutValue[k];
707           }
708           AliceInp << setiosflags(ios::scientific) << setprecision(5);
709           AliceInp << setw(10) << fCut; // e+, e- kinetic energy threshold (in GeV) for explicit pair production.
710           // muon and hadron bremsstrahlung
711           // G4 particles: "gamma"
712           // G3 default value: CUTGAM=0.001 GeV
713           //gMC ->SetCut("BCUTM",cut);  // cut for muon and hadron bremsstrahlung
714           fCut = 0.0;
715           for (k=0; k<iNbOfCut; k++) {
716             if (strncmp(&sCutFlag[k][0],"BCUTM",5) == 0) fCut = fCutValue[k];
717           }
718           AliceInp << setiosflags(ios::scientific) << setprecision(5);
719           AliceInp << setw(10) << fCut; // photon energy threshold (GeV) for explicit bremsstrahlung production
720           AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
721           AliceInp << setw(10) << 3.0; // lower bound of the material indices in which the respective thresholds apply
722           AliceInp << setw(10) << setprecision(2);
723           AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
724           AliceInp << endl;
725           
726           // for e+ and e-
727           AliceInp << "*"; 
728           AliceInp << endl;
729           AliceInp << "*Kinetic energy threshold (GeV) for e+/e- bremsstrahlung - resets to default=0."; 
730           AliceInp << endl;
731           AliceInp << "*Generated from call: SetProcess('BREM',1);"; 
732           AliceInp << endl;
733           AliceInp << setw(10) << "EMFCUT    "; 
734           fCut = -1.0;
735           for (k=0; k<iNbOfCut; k++) {
736             if (strncmp(&sCutFlag[k][0],"BCUTE",5) == 0) fCut = fCutValue[k];
737           }
738           AliceInp << setiosflags(ios::scientific) << setprecision(5);
739           AliceInp << setw(10) << fCut; // kinetic energy threshold (GeV) for e+/e- bremsstrahlung (resets to default=0)
740           AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
741           AliceInp << setw(10) << 0.0;  // not used
742           AliceInp << setw(10) << 0.0;  // not used
743           AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
744           AliceInp << setw(10) << setprecision(2);
745           AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
746           AliceInp << setprecision(1);
747           AliceInp << setw(10) << 1.0; // step length in assigning indices
748           AliceInp << setw(8)  << "ELPO-THR"; 
749           AliceInp << endl;
750       
751           // for e+ and e-
752           AliceInp << "*"; 
753           AliceInp << endl;
754           AliceInp << "*Pair production by electrons is activated"; 
755           AliceInp << endl;
756           AliceInp << "*Generated from call: SetProcess('PAIR',1);"; 
757           AliceInp << endl;
758           AliceInp << setw(10) << "EMFCUT    "; 
759           AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
760           AliceInp << setw(10) << 0.0;  // energy threshold (GeV) for Compton scattering (= 0.0 : ignored)
761           AliceInp << setw(10) << 0.0;  // energy threshold (GeV) for Photoelectric (= 0.0 : ignored)
762           fCut = -1.0;
763           for (j=0; j<iNbOfCut; j++) {
764             if (strncmp(&sCutFlag[j][0],"CUTGAM",6) == 0) fCut = fCutValue[j];
765           }
766           AliceInp << setiosflags(ios::scientific) << setprecision(5);
767           AliceInp << setw(10) << fCut; // energy threshold (GeV) for gamma pair production (< 0.0 : resets to default, = 0.0 : ignored)
768           AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
769           AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
770           AliceInp << setprecision(2);
771           AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
772           AliceInp << setprecision(1);
773           AliceInp << setw(10) << 1.0;  // step length in assigning indices
774           AliceInp << setw(8) << "PHOT-THR"; 
775           AliceInp << endl;
776           goto BOTH;
777         } // end of if for BREM
778       } // end of loop for BREM
779
780       // only pair production by muons and charged hadrons is activated
781       AliceInp << "*"; 
782       AliceInp << endl;
783       AliceInp << "*Pair production by muons and charged hadrons is activated"; 
784       AliceInp << endl;
785       AliceInp << "*Generated from call: SetProcess('PAIR',1) or SetProcess('PAIR',2)"; 
786       AliceInp << endl;
787       AliceInp << "*Energy threshold set by call SetCut('PPCUTM',cut) or set to 0."; 
788       AliceInp << endl;
789       AliceInp << setw(10) << "PAIRBREM  "; 
790       AliceInp << setiosflags(ios::scientific) << setprecision(5);
791       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
792       AliceInp << setw(10) << 1.0; // pair production by muons and charged hadrons is activated
793       // direct pair production by muons
794       // G4 particles: "e-", "e+"
795       // G3 default value: 0.01 GeV
796       //gMC ->SetCut("PPCUTM",cut); // total energy cut for direct pair prod. by muons
797       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
798       AliceInp << setw(10) << 0.0; // e+, e- kinetic energy threshold (in GeV) for explicit pair production.
799       AliceInp << setw(10) << 0.0; // no explicit bremsstrahlung production is simulated
800       AliceInp << setw(10) << 3.0; // lower bound of the material indices in which the respective thresholds apply
801       AliceInp << setprecision(2);
802       AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
803       AliceInp << endl;
804       
805       // for e+ and e-
806       AliceInp << "*"; 
807       AliceInp << endl;
808       AliceInp << "*Pair production by electrons is activated"; 
809       AliceInp << endl;
810       AliceInp << "*Generated from call: SetProcess('PAIR',1) or SetProcess('PAIR',2)"; 
811       AliceInp << endl;
812       AliceInp << setw(10) << "EMFCUT    "; 
813       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
814       AliceInp << setw(10) << 0.0;  // energy threshold (GeV) for Compton scattering (= 0.0 : ignored)
815       AliceInp << setw(10) << 0.0;  // energy threshold (GeV) for Photoelectric (= 0.0 : ignored)
816
817       fCut = -1.0;
818       for (j=0; j<iNbOfCut; j++) {
819         if (strncmp(&sCutFlag[j][0],"CUTGAM",6) == 0) fCut = fCutValue[j];
820       }
821       AliceInp << setiosflags(ios::scientific) << setprecision(5);
822       AliceInp << setw(10) << fCut; // energy threshold (GeV) for gamma pair production (< 0.0 : resets to default, = 0.0 : ignored)
823       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
824       AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
825       AliceInp << setprecision(2);
826       AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
827       AliceInp << setprecision(1);
828       AliceInp << setw(10) << 1.0;  // step length in assigning indices
829       AliceInp << setw(8) << "PHOT-THR"; 
830       AliceInp << endl;
831
832 BOTH:
833     k = 0;
834     } // end of if for PAIR
835
836
837
838     // bremsstrahlung
839     // G3 default value: 1
840     // G4 processes: G4eBremsstrahlung/G4IeBremsstrahlung,
841     //               G4MuBremsstrahlung/G4IMuBremsstrahlung,
842     //               G4LowEnergyBremstrahlung
843     // Particles: e-/e+; mu+/mu-
844     // Physics:   EM
845     // flag = 0 no bremsstrahlung
846     // flag = 1 bremsstrahlung, photon processed
847     // flag = 2 bremsstrahlung, no photon stored
848     // gMC ->SetProcess("BREM",1); // PAIRBREM  2.   0.  0. 3. lastmat
849                                  // EMFCUT   -1.   0.  0. 3. lastmat 0. ELPO-THR
850     else if (strncmp(&sProcessFlag[i][0],"BREM",4) == 0) {
851       for (j=0; j<iNbOfProc; j++) {
852         if ((strncmp(&sProcessFlag[j][0],"PAIR",4) == 0) && iProcessValue[j] == 1) goto NOBREM;
853       }
854       if (iProcessValue[i] == 1 || iProcessValue[i] == 2) { 
855         AliceInp << "*"; 
856         AliceInp << endl;
857         AliceInp << "*Bremsstrahlung by muons and charged hadrons is activated"; 
858         AliceInp << endl;
859         AliceInp << "*Generated from call: SetProcess('BREM',1) or SetProcess('BREM',2)"; 
860         AliceInp << endl;
861         AliceInp << "*Energy threshold set by call SetCut('BCUTM',cut) or set to 0."; 
862         AliceInp << endl;
863         AliceInp << setw(10) << "PAIRBREM  "; 
864         AliceInp << setiosflags(ios::scientific) << setprecision(5);
865         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
866         AliceInp << setw(10) << 2.0; // bremsstrahlung by muons and charged hadrons is activated
867         AliceInp << setw(10) << 0.0; // no meaning
868         // muon and hadron bremsstrahlung
869         // G4 particles: "gamma"
870         // G3 default value: CUTGAM=0.001 GeV
871         //gMC ->SetCut("BCUTM",cut);  // cut for muon and hadron bremsstrahlung
872         fCut = 0.0;
873         for (j=0; j<iNbOfCut; j++) {
874           if (strncmp(&sCutFlag[j][0],"BCUTM",5) == 0) fCut = fCutValue[j];
875         }
876         AliceInp << setw(10) << fCut; // photon energy threshold (GeV) for explicit bremsstrahlung production
877         AliceInp << setw(10) << 3.0; // lower bound of the material indices in which the respective thresholds apply
878         AliceInp << setw(10) << setprecision(2);
879         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
880         AliceInp << endl;
881  
882         // for e+ and e-
883         AliceInp << "*"; 
884         AliceInp << endl;
885         AliceInp << "*Kinetic energy threshold (GeV) for e+/e- bremsstrahlung - resets to default=0."; 
886         AliceInp << endl;
887         AliceInp << "*Generated from call: SetProcess('BREM',1);"; 
888         AliceInp << endl;
889         AliceInp << setw(10) << "EMFCUT    "; 
890         AliceInp << setiosflags(ios::scientific) << setprecision(5);
891         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
892         AliceInp << setw(10) << -1.0; // kinetic energy threshold (GeV) for e+/e- bremsstrahlung (resets to default=0)
893         AliceInp << setw(10) << 0.0;  // not used
894         AliceInp << setw(10) << 0.0;  // not used
895         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
896         AliceInp << setw(10) << setprecision(2);
897         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
898         AliceInp << setprecision(1);
899         AliceInp << setw(10) << 1.0; // step length in assigning indices
900         AliceInp << setw(8)  << "ELPO-THR"; 
901         AliceInp << endl;
902       }
903       else if (iProcessValue[i] == 0) {
904         AliceInp << "*"; 
905         AliceInp << endl;
906         AliceInp << "*No bremsstrahlung - no FLUKA card generated"; 
907         AliceInp << endl;
908         AliceInp << "*Generated from call: SetProcess('BREM',0)"; 
909         AliceInp << endl;
910       }
911       else  {
912         AliceInp << "*"; 
913         AliceInp << endl;
914         AliceInp << "*Illegal flag value in SetProcess('BREM',?) call."; 
915         AliceInp << endl;
916         AliceInp << "*No FLUKA card generated"; 
917         AliceInp << endl;
918       }
919 NOBREM:
920       j = 0;
921     } // end of else if (strncmp(&sProcessFlag[i][0],"BREM",4) == 0)
922
923     
924     // Cerenkov photon generation
925     // G3 default value: 0
926     // G4 process: G4Cerenkov
927     // 
928     // Particles: charged
929     // Physics:   Optical
930     // flag = 0 no Cerenkov photon generation
931     // flag = 1 Cerenkov photon generation
932     // flag = 2 Cerenkov photon generation with primary stopped at each step
933     //xx gMC ->SetProcess("CKOV",1); // ??? Cerenkov photon generation
934     else if (strncmp(&sProcessFlag[i][0],"CKOV",4) == 0) {
935       if (iProcessValue[i] == 1 || iProcessValue[i] == 2) { 
936         AliceInp << "*"; 
937         AliceInp << endl;
938         AliceInp << "*Cerenkov photon generation"; 
939         AliceInp << endl;
940         AliceInp << "*Generated from call: SetProcess('CKOV',1) or SetProcess('CKOV',2)"; 
941         AliceInp << endl;
942         AliceInp << setw(10) << "OPT-PROD  "; 
943         AliceInp << setiosflags(ios::scientific) << setprecision(5);
944         AliceInp << setw(10) <<  2.07e-9 ; //  minimum Cerenkov photon emission energy (in GeV!). Default: 2.07E-9 GeV (corresponding to 600 nm)
945         AliceInp << setw(10) << 4.96e-9;  // maximum Cerenkov photon emission energy (in GeV!). Default: 4.96E-9 GeV (corresponding to 250 nm)
946         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
947         AliceInp << setw(10) << 0.0;  // not used
948         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
949         AliceInp << setprecision(2);
950         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
951         AliceInp << setprecision(1);
952         AliceInp << setw(10) << 1.0; // step length in assigning indices
953         AliceInp << setw(8) << "CERENKOV"; 
954         AliceInp << endl;
955       }
956       else if (iProcessValue[i] == 0) {
957         AliceInp << "*"; 
958         AliceInp << endl;
959         AliceInp << "*No Cerenkov photon generation"; 
960         AliceInp << endl;
961         AliceInp << "*Generated from call: SetProcess('CKOV',0)"; 
962         AliceInp << endl;
963         AliceInp << setw(10) << "OPT-PROD  "; 
964         AliceInp << setiosflags(ios::scientific) << setprecision(5);
965         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
966         AliceInp << setw(10) << 0.0;  // not used
967         AliceInp << setw(10) << 0.0;  // not used
968         AliceInp << setw(10) << 0.0;  // not used
969         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
970         AliceInp << setprecision(2);
971         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
972         AliceInp << setprecision(1);
973         AliceInp << setw(10) << 1.0; // step length in assigning indices
974         AliceInp << setw(8) << "CERE-OFF"; 
975         AliceInp << endl;
976       }
977       else  {
978         AliceInp << "*"; 
979         AliceInp << endl;
980         AliceInp << "*Illegal flag value in SetProcess('CKOV',?) call."; 
981         AliceInp << endl;
982         AliceInp << "*No FLUKA card generated"; 
983         AliceInp << endl;
984       }
985     } // end of else if (strncmp(&sProcessFlag[i][0],"CKOV",4) == 0)
986             
987
988     // Compton scattering
989     // G3 default value: 1
990     // G4 processes: G4ComptonScattering,
991     //               G4LowEnergyCompton,
992     //               G4PolarizedComptonScattering
993     // Particles: gamma
994     // Physics:   EM
995     // flag = 0 no Compton scattering
996     // flag = 1 Compton scattering, electron processed
997     // flag = 2 Compton scattering, no electron stored
998     // gMC ->SetProcess("COMP",1); // EMFCUT   -1.   0.  0. 3. lastmat 0. PHOT-THR
999     else if (strncmp(&sProcessFlag[i][0],"COMP",4) == 0) {
1000       if (iProcessValue[i] == 1 || iProcessValue[i] == 2) { 
1001         AliceInp << "*"; 
1002         AliceInp << endl;
1003         AliceInp << "*Energy threshold (GeV) for Compton scattering - resets to default=0."; 
1004         AliceInp << endl;
1005         AliceInp << "*Generated from call: SetProcess('COMP',1);"; 
1006         AliceInp << endl;
1007         AliceInp << setw(10) << "EMFCUT    "; 
1008         AliceInp << setiosflags(ios::scientific) << setprecision(5);
1009         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1010         AliceInp << setw(10) << -1.0; // energy threshold (GeV) for Compton scattering - resets to default=0.
1011         AliceInp << setw(10) << 0.0;  // not used
1012         AliceInp << setw(10) << 0.0;  // not used
1013         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
1014         AliceInp << setprecision(2);
1015         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1016         AliceInp << setprecision(1);
1017         AliceInp << setw(10) << 1.0; // step length in assigning indices
1018         AliceInp << setw(8) << "PHOT-THR"; 
1019         AliceInp << endl;
1020       }
1021       else if (iProcessValue[i] == 0) {
1022         AliceInp << "*"; 
1023         AliceInp << endl;
1024         AliceInp << "*No Compton scattering - no FLUKA card generated"; 
1025         AliceInp << endl;
1026         AliceInp << "*Generated from call: SetProcess('COMP',0)"; 
1027         AliceInp << endl;
1028       }
1029       else  {
1030         AliceInp << "*"; 
1031         AliceInp << endl;
1032         AliceInp << "*Illegal flag value in SetProcess('COMP',?) call."; 
1033         AliceInp << endl;
1034         AliceInp << "*No FLUKA card generated"; 
1035         AliceInp << endl;
1036       }
1037     } // end of else if (strncmp(&sProcessFlag[i][0],"COMP",4) == 0)
1038
1039     // decay
1040     // G3 default value: 1
1041     // G4 process: G4Decay
1042     // 
1043     // Particles: all which decay is applicable for
1044     // Physics:   General
1045     // flag = 0 no decays
1046     // flag = 1 decays, secondaries processed
1047     // flag = 2 decays, no secondaries stored
1048     //gMC ->SetProcess("DCAY",1); // not available
1049     else if ((strncmp(&sProcessFlag[i][0],"DCAY",4) == 0) && iProcessValue[i] == 1) 
1050       cout << "SetProcess for flag=" << &sProcessFlag[i][0] << " value=" << iProcessValue[i] << " not avaliable!" << endl;
1051       
1052     // delta-ray
1053     // G3 default value: 2
1054     // !! G4 treats delta rays in different way
1055     // G4 processes: G4eIonisation/G4IeIonization,
1056     //               G4MuIonisation/G4IMuIonization,
1057     //               G4hIonisation/G4IhIonisation
1058     // Particles: charged
1059     // Physics:   EM
1060     // flag = 0 no energy loss
1061     // flag = 1 restricted energy loss fluctuations
1062     // flag = 2 complete energy loss fluctuations
1063     // flag = 3 same as 1
1064     // flag = 4 no energy loss fluctuations
1065     // gMC ->SetProcess("DRAY",0); // DELTARAY 1.E+6 0.  0. 3. lastmat 0.
1066     else if (strncmp(&sProcessFlag[i][0],"DRAY",4) == 0) {
1067       if (iProcessValue[i] == 0 || iProcessValue[i] == 4) {
1068         AliceInp << "*"; 
1069         AliceInp << endl;
1070         AliceInp << "*Kinetic energy threshold (GeV) for delta ray production"; 
1071         AliceInp << endl;
1072         AliceInp << "*Generated from call: SetProcess('DRAY',0) or SetProcess('DRAY',4)"; 
1073         AliceInp << endl;
1074         AliceInp << "*No delta ray production by muons - threshold set artificially high"; 
1075         AliceInp << endl;
1076         AliceInp << setw(10) << "DELTARAY  "; 
1077         AliceInp << setiosflags(ios::scientific) << setprecision(5);
1078         AliceInp << setw(10) << 1.0e+6; // kinetic energy threshold (GeV) for delta ray production (discrete energy transfer)
1079         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1080         AliceInp << setw(10) << 0.0; // ignored
1081         AliceInp << setw(10) << 0.0; // ignored
1082         AliceInp << setw(10) << 3.0; // lower bound of the material indices in which the respective thresholds apply
1083         AliceInp << setw(10) << setprecision(2);
1084         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1085         AliceInp << setprecision(1);
1086         AliceInp << setw(10) << 1.0; // step length in assigning indices
1087         AliceInp << endl;
1088       }
1089       else if (iProcessValue[i] == 1 || iProcessValue[i] == 2 || iProcessValue[i] == 3) {
1090         AliceInp << "*"; 
1091         AliceInp << endl;
1092         AliceInp << "*Kinetic energy threshold (GeV) for delta ray production"; 
1093         AliceInp << endl;
1094         AliceInp << "*Generated from call: SetProcess('DRAY',flag), flag=1,2,3"; 
1095         AliceInp << endl;
1096         AliceInp << "*Delta ray production by muons switched on"; 
1097         AliceInp << endl;
1098         AliceInp << "*Energy threshold set by call SetCut('DCUTM',cut) or set to 0."; 
1099         AliceInp << endl;
1100         AliceInp << setw(10) << "DELTARAY  "; 
1101         AliceInp << setiosflags(ios::scientific) << setprecision(5);
1102         fCut = 1.0e+6;
1103         for (j=0; j<iNbOfCut; j++) {
1104           if (strncmp(&sCutFlag[j][0],"DCUTM",5) == 0) fCut = fCutValue[j];
1105         }
1106         AliceInp << setw(10) << fCut; // kinetic energy threshold (GeV) for delta ray production (discrete energy transfer)
1107         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1108         AliceInp << setw(10) << 0.0; // ignored
1109         AliceInp << setw(10) << 0.0; // ignored
1110         AliceInp << setw(10) << 3.0; // lower bound of the material indices in which the respective thresholds apply
1111         AliceInp << setw(10) << setprecision(2);
1112         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1113         AliceInp << setprecision(1);
1114         AliceInp << setw(10) << 1.0; // step length in assigning indices
1115         AliceInp << endl;
1116       }
1117       else  {
1118         AliceInp << "*"; 
1119         AliceInp << endl;
1120         AliceInp << "*Illegal flag value in SetProcess('DRAY',?) call."; 
1121         AliceInp << endl;
1122         AliceInp << "*No FLUKA card generated"; 
1123         AliceInp << endl;
1124       }
1125     } // end of else if (strncmp(&sProcessFlag[i][0],"DRAY",4) == 0)
1126     
1127     // hadronic process
1128     // G3 default value: 1
1129     // G4 processes: all defined by TG4PhysicsConstructorHadron
1130     //  
1131     // Particles: hadrons
1132     // Physics:   Hadron
1133     // flag = 0 no multiple scattering
1134     // flag = 1 hadronic interactions, secondaries processed
1135     // flag = 2 hadronic interactions, no secondaries stored
1136     // gMC ->SetProcess("HADR",1); // ??? hadronic process
1137     //Select pure GEANH (HADR 1) or GEANH/NUCRIN (HADR 3) ?????
1138     else if (strncmp(&sProcessFlag[i][0],"HADR",4) == 0) {
1139       if (iProcessValue[i] == 1 || iProcessValue[i] == 2) {
1140         AliceInp << "*"; 
1141         AliceInp << endl;
1142         AliceInp << "*Hadronic interaction is ON by default in FLUKA"; 
1143         AliceInp << endl;
1144         AliceInp << "*No FLUKA card generated"; 
1145         AliceInp << endl;
1146       }
1147       else if (iProcessValue[i] == 0) {
1148         AliceInp << "*"; 
1149         AliceInp << endl;
1150         AliceInp << "*Hadronic interaction is set OFF"; 
1151         AliceInp << endl;
1152         AliceInp << "*Generated from call: SetProcess('HADR',0);"; 
1153         AliceInp << endl;
1154         AliceInp << setw(10) << "MULSOPT  "; 
1155         AliceInp << setiosflags(ios::scientific) << setprecision(5);
1156         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1157         AliceInp << setw(10) << 0.0;  // ignored
1158         AliceInp << setw(10) << 3.0;  // multiple scattering for hadrons and muons is completely suppressed
1159         AliceInp << setw(10) << 0.0;  // no spin-relativistic corrections
1160         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
1161         AliceInp << setprecision(2);
1162         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1163         AliceInp << endl;
1164
1165       }
1166       else  {
1167         AliceInp << "*"; 
1168         AliceInp << endl;
1169         AliceInp << "*Illegal flag value in SetProcess('HADR',?) call."; 
1170         AliceInp << endl;
1171         AliceInp << "*No FLUKA card generated"; 
1172         AliceInp << endl;
1173       }
1174     } // end of else if (strncmp(&sProcessFlag[i][0],"HADR",4) == 0)
1175
1176
1177     // energy loss
1178     // G3 default value: 2
1179     // G4 processes: G4eIonisation/G4IeIonization,
1180     //               G4MuIonisation/G4IMuIonization,
1181     //               G4hIonisation/G4IhIonisation
1182     // 
1183     // Particles: charged
1184     // Physics:   EM
1185     // flag=0 no energy loss
1186     // flag=1 restricted energy loss fluctuations
1187     // flag=2 complete energy loss fluctuations
1188     // flag=3 same as 1
1189     // flag=4 no energy loss fluctuations
1190     // If the value ILOSS is changed, then (in G3) cross-sections and energy
1191     // loss tables must be recomputed via the command 'PHYSI'
1192     // gMC ->SetProcess("LOSS",2); // ??? IONFLUCT ? energy loss
1193     else if (strncmp(&sProcessFlag[i][0],"LOSS",4) == 0) {
1194       if (iProcessValue[i] == 2) { // complete energy loss fluctuations
1195         AliceInp << "*"; 
1196         AliceInp << endl;
1197         AliceInp << "*Complete energy loss fluctuations do not exist in FLUKA"; 
1198         AliceInp << endl;
1199         AliceInp << "*Generated from call: SetProcess('LOSS',2);"; 
1200         AliceInp << endl;
1201         AliceInp << "*flag=2=complete energy loss fluctuations"; 
1202         AliceInp << endl;
1203         AliceInp << "*No input card generated"; 
1204         AliceInp << endl;
1205       }
1206       else if (iProcessValue[i] == 1 || iProcessValue[i] == 3) { // restricted energy loss fluctuations
1207         AliceInp << "*"; 
1208         AliceInp << endl;
1209         AliceInp << "*Restricted energy loss fluctuations"; 
1210         AliceInp << endl;
1211         AliceInp << "*Generated from call: SetProcess('LOSS',1) or SetProcess('LOSS',3)"; 
1212         AliceInp << endl;
1213         AliceInp << setw(10) << "IONFLUCT  "; 
1214         AliceInp << setiosflags(ios::scientific) << setprecision(5);
1215         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1216         AliceInp << setw(10) << 1.0;  // restricted energy loss fluctuations (for hadrons and muons) switched on
1217         AliceInp << setw(10) << 1.0;  // restricted energy loss fluctuations (for e+ and e-) switched on
1218         AliceInp << setw(10) << 1.0;  // minimal accuracy
1219         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
1220         AliceInp << setprecision(2);
1221         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1222         AliceInp << endl;
1223       }
1224       else if (iProcessValue[i] == 4) { // no energy loss fluctuations
1225         AliceInp << "*"; 
1226         AliceInp << endl;
1227         AliceInp << "*No energy loss fluctuations"; 
1228         AliceInp << endl;
1229         AliceInp << "*Generated from call: SetProcess('LOSS',4)"; 
1230         AliceInp << endl;
1231         AliceInp << setw(10) << -1.0;  // restricted energy loss fluctuations (for hadrons and muons) switched off
1232         AliceInp << setw(10) << -1.0;  // restricted energy loss fluctuations (for e+ and e-) switched off
1233         AliceInp << setw(10) << 1.0;  // minimal accuracy
1234         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
1235         AliceInp << setprecision(2);
1236         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1237         AliceInp << endl;
1238       }
1239       else  {
1240         AliceInp << "*"; 
1241         AliceInp << endl;
1242         AliceInp << "*Illegal flag value in SetProcess('LOSS',?) call."; 
1243         AliceInp << endl;
1244         AliceInp << "*No FLUKA card generated"; 
1245         AliceInp << endl;
1246       }
1247     } // end of else if (strncmp(&sProcessFlag[i][0],"LOSS",4) == 0)
1248         
1249  
1250     // multiple scattering
1251     // G3 default value: 1
1252     // G4 process: G4MultipleScattering/G4IMultipleScattering
1253     // 
1254     // Particles: charged
1255     // Physics:   EM
1256     // flag = 0 no multiple scattering
1257     // flag = 1 Moliere or Coulomb scattering
1258     // flag = 2 Moliere or Coulomb scattering
1259     // flag = 3 Gaussian scattering
1260     // gMC ->SetProcess("MULS",1); // MULSOPT multiple scattering
1261     else if (strncmp(&sProcessFlag[i][0],"MULS",4) == 0) {
1262       if (iProcessValue[i] == 1 || iProcessValue[i] == 2 || iProcessValue[i] == 3) {
1263         AliceInp << "*"; 
1264         AliceInp << endl;
1265         AliceInp << "*Multiple scattering is ON by default for e+e- and for hadrons/muons"; 
1266         AliceInp << endl;
1267         AliceInp << "*No FLUKA card generated"; 
1268         AliceInp << endl;
1269       }
1270       else if (iProcessValue[i] == 0) {
1271         AliceInp << "*"; 
1272         AliceInp << endl;
1273         AliceInp << "*Multiple scattering is set OFF"; 
1274         AliceInp << endl;
1275         AliceInp << "*Generated from call: SetProcess('MULS',0);"; 
1276         AliceInp << endl;
1277         AliceInp << setw(10) << "MULSOPT  "; 
1278         AliceInp << setiosflags(ios::scientific) << setprecision(5);
1279         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1280         AliceInp << setw(10) << 0.0;  // ignored
1281         AliceInp << setw(10) << 3.0;  // multiple scattering for hadrons and muons is completely suppressed
1282         AliceInp << setw(10) << 3.0;  // multiple scattering for e+ and e- is completely suppressed
1283         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
1284         AliceInp << setprecision(2);
1285         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1286         AliceInp << endl;
1287       }
1288       else  {
1289         AliceInp << "*"; 
1290         AliceInp << endl;
1291         AliceInp << "*Illegal flag value in SetProcess('MULS',?) call."; 
1292         AliceInp << endl;
1293         AliceInp << "*No FLUKA card generated"; 
1294         AliceInp << endl;
1295       }
1296     } // end of else if (strncmp(&sProcessFlag[i][0],"MULS",4) == 0)
1297
1298
1299     // muon nuclear interaction
1300     // G3 default value: 0
1301     // G4 processes: G4MuNuclearInteraction,
1302     // G4MuonMinusCaptureAtRest
1303     // 
1304     // Particles: mu
1305     // Physics:   Not set
1306     // flag = 0 no muon-nuclear interaction
1307     // flag = 1 nuclear interaction, secondaries processed
1308     // flag = 2 nuclear interaction, secondaries not processed
1309     // gMC ->SetProcess("MUNU",1); // MUPHOTON  1.   0.  0. 3. lastmat
1310     else if (strncmp(&sProcessFlag[i][0],"MUNU",4) == 0) {
1311       if (iProcessValue[i] == 1) {
1312         AliceInp << "*"; 
1313         AliceInp << endl;
1314         AliceInp << "*Muon nuclear interactions with production of secondary hadrons"; 
1315         AliceInp << endl;
1316         AliceInp << "*Generated from call: SetProcess('MUNU',1);"; 
1317         AliceInp << endl;
1318         AliceInp << setw(10) << "MUPHOTON  "; 
1319         AliceInp << setiosflags(ios::scientific) << setprecision(5);
1320         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1321         AliceInp << setw(10) << 1.0;  // full simulation of muon nuclear interactions and production of secondary hadrons
1322         AliceInp << setw(10) << 0.0; // ratio of longitudinal to transverse virtual photon cross-section - Default = 0.25.
1323         AliceInp << setw(10) << 0.0; // fraction of rho-like interactions ( must be < 1) - Default = 0.75.
1324         AliceInp << setprecision(1);
1325         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
1326         AliceInp << setprecision(2);
1327         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1328         AliceInp << endl;
1329       }
1330       else if (iProcessValue[i] == 2) {
1331         AliceInp << "*"; 
1332         AliceInp << endl;
1333         AliceInp << "*Muon nuclear interactions without production of secondary hadrons"; 
1334         AliceInp << endl;
1335         AliceInp << "*Generated from call: SetProcess('MUNU',2);"; 
1336         AliceInp << endl;
1337         AliceInp << setw(10) << "MUPHOTON  "; 
1338         AliceInp << setiosflags(ios::scientific) << setprecision(5);
1339         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1340         AliceInp << setw(10) << 2.0; // full simulation of muon nuclear interactions and production of secondary hadrons
1341         AliceInp << setw(10) << 0.0; // ratio of longitudinal to transverse virtual photon cross-section - Default = 0.25.
1342         AliceInp << setw(10) << 0.0; // fraction of rho-like interactions ( must be < 1) - Default = 0.75.
1343         AliceInp << setprecision(1);
1344         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
1345         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1346         AliceInp << endl;
1347       }
1348       else if (iProcessValue[i] == 0) {
1349         AliceInp << "*"; 
1350         AliceInp << endl;
1351         AliceInp << "*No muon nuclear interaction - no FLUKA card generated"; 
1352         AliceInp << endl;
1353         AliceInp << "*Generated from call: SetProcess('MUNU',0)"; 
1354         AliceInp << endl;
1355       }
1356       else  {
1357         AliceInp << "*"; 
1358         AliceInp << endl;
1359         AliceInp << "*Illegal flag value in SetProcess('MUNU',?) call."; 
1360         AliceInp << endl;
1361         AliceInp << "*No FLUKA card generated"; 
1362         AliceInp << endl;
1363       }
1364     } // end of else if (strncmp(&sProcessFlag[i][0],"MUNU",4) == 0)
1365
1366
1367     // photofission
1368     // G3 default value: 0
1369     // G4 process: ??
1370     //
1371     // Particles: gamma
1372     // Physics:   ??
1373     // gMC ->SetProcess("PFIS",0); // PHOTONUC -1.   0.  0. 3. lastmat 0.
1374     // flag = 0 no photon fission
1375     // flag = 1 photon fission, secondaries processed
1376     // flag = 2 photon fission, no secondaries stored
1377     else if (strncmp(&sProcessFlag[i][0],"PFIS",4) == 0) {
1378       if (iProcessValue[i] == 0) {
1379         AliceInp << "*"; 
1380         AliceInp << endl;
1381         AliceInp << "*No photonuclear interactions";
1382         AliceInp << endl;
1383         AliceInp << "*Generated from call: SetProcess('PFIS',0);"; 
1384         AliceInp << endl;
1385         AliceInp << setw(10) << "PHOTONUC  "; 
1386         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1387         AliceInp << setw(10) << -1.0; // no photonuclear interactions
1388         AliceInp << setw(10) << 0.0;  // not used
1389         AliceInp << setw(10) << 0.0;  // not used
1390         AliceInp << setw(10) << 3.0;  // upper bound of the material indices in which the respective thresholds apply
1391         AliceInp << setprecision(2); 
1392         AliceInp << setw(10) << fLastMaterial;
1393         AliceInp << setprecision(1);  // upper bound of the material indices in which the respective thresholds apply
1394         AliceInp << setprecision(1);
1395         AliceInp << setw(10) << 1.0;  // step length in assigning indices
1396         AliceInp << endl;
1397       }
1398       else if (iProcessValue[i] == 1) {
1399         AliceInp << "*"; 
1400         AliceInp << endl;
1401         AliceInp << "*Photon nuclear interactions are activated at all energies";
1402         AliceInp << endl;
1403         AliceInp << "*Generated from call: SetProcess('PFIS',1);"; 
1404         AliceInp << endl;
1405         AliceInp << setw(10) << "PHOTONUC  "; 
1406         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1407         AliceInp << setw(10) << 1.0; // photonuclear interactions are activated at all energies
1408         AliceInp << setw(10) << 0.0; // not used
1409         AliceInp << setw(10) << 0.0; // not used
1410         AliceInp << setprecision(2); 
1411         AliceInp << setw(10) << 3.0; // upper bound of the material indices in which the respective thresholds apply
1412         AliceInp << setw(10) << fLastMaterial;
1413         AliceInp << setprecision(1); // upper bound of the material indices in which the respective thresholds apply
1414         AliceInp << setprecision(1);
1415         AliceInp << setw(10) << 1.0; // step length in assigning indices
1416         AliceInp << endl;
1417       }
1418       else if (iProcessValue[i] == 0) {
1419         AliceInp << "*"; 
1420         AliceInp << endl;
1421         AliceInp << "*No photofission - no FLUKA card generated"; 
1422         AliceInp << endl;
1423         AliceInp << "*Generated from call: SetProcess('PFIS',0)"; 
1424         AliceInp << endl;
1425       }
1426       else {
1427         AliceInp << "*"; 
1428         AliceInp << endl;
1429         AliceInp << "*Illegal flag value in SetProcess('PFIS',?) call."; 
1430         AliceInp << endl;
1431         AliceInp << "*No FLUKA card generated"; 
1432         AliceInp << endl;
1433       }
1434     }
1435
1436  
1437     // photo electric effect
1438     // G3 default value: 1
1439     // G4 processes: G4PhotoElectricEffect
1440     //               G4LowEnergyPhotoElectric
1441     // Particles: gamma
1442     // Physics:   EM
1443     // flag = 0 no photo electric effect
1444     // flag = 1 photo electric effect, electron processed
1445     // flag = 2 photo electric effect, no electron stored
1446     // gMC ->SetProcess("PHOT",1); // EMFCUT    0.  -1.  0. 3. lastmat 0. PHOT-THR
1447     else if (strncmp(&sProcessFlag[i][0],"PHOT",4) == 0) {
1448       if (iProcessValue[i] == 1 || iProcessValue[i] == 2) {
1449         AliceInp << "*"; 
1450         AliceInp << endl;
1451         AliceInp << "*Photo electric effect is activated"; 
1452         AliceInp << endl;
1453         AliceInp << "*Generated from call: SetProcess('PHOT',1);"; 
1454         AliceInp << endl;
1455         AliceInp << setw(10) << "EMFCUT    "; 
1456         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1457         AliceInp << setw(10) << 0.0;  // ignored
1458         AliceInp << setw(10) << -1.0; // resets to default=0.
1459         AliceInp << setw(10) << 0.0;  // ignored
1460         AliceInp << setw(10) << 3.0;  // upper bound of the material indices in which the respective thresholds apply
1461         AliceInp << setprecision(2);
1462         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1463         AliceInp << setprecision(1);
1464         AliceInp << setw(10) << 1.0;  // step length in assigning indices
1465         AliceInp << setw(8) << "PHOT-THR"; 
1466         AliceInp << endl;
1467       }
1468       else if (iProcessValue[i] == 0) {
1469         AliceInp << "*"; 
1470         AliceInp << endl;
1471         AliceInp << "*No photo electric effect - no FLUKA card generated"; 
1472         AliceInp << endl;
1473         AliceInp << "*Generated from call: SetProcess('PHOT',0)"; 
1474         AliceInp << endl;
1475       }
1476       else {
1477         AliceInp << "*"; 
1478         AliceInp << endl;
1479         AliceInp << "*Illegal flag value in SetProcess('PHOT',?) call."; 
1480         AliceInp << endl;
1481         AliceInp << "*No FLUKA card generated"; 
1482         AliceInp << endl;
1483       }
1484     } // else if (strncmp(&sProcessFlag[i][0],"PHOT",4) == 0)
1485
1486
1487     // Rayleigh scattering
1488     // G3 default value: 0
1489     // G4 process: G4OpRayleigh
1490     // 
1491     // Particles: optical photon
1492     // Physics:   Optical
1493     // flag = 0 Rayleigh scattering off
1494     // flag = 1 Rayleigh scattering on
1495     //xx gMC ->SetProcess("RAYL",1);
1496     else if (strncmp(&sProcessFlag[i][0],"RAYL",4) == 0) {
1497       if (iProcessValue[i] == 1) {
1498         AliceInp << "*"; 
1499         AliceInp << endl;
1500         AliceInp << "*Rayleigh scattering is ON by default in FLUKA"; 
1501         AliceInp << endl;
1502         AliceInp << "*No FLUKA card generated"; 
1503         AliceInp << endl;
1504       }
1505       else if (iProcessValue[i] == 0) {
1506         AliceInp << "*"; 
1507         AliceInp << endl;
1508         AliceInp << "*Rayleigh scattering is set OFF"; 
1509         AliceInp << endl;
1510         AliceInp << "*Generated from call: SetProcess('RAYL',0);"; 
1511         AliceInp << endl;
1512         AliceInp << setw(10) << "EMFRAY    "; 
1513         AliceInp << setiosflags(ios::scientific) << setprecision(5);
1514         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1515         AliceInp << setw(10) << -1.0;  // no Rayleigh scattering and no binding corrections for Compton
1516         AliceInp << setw(10) << 3.0;  // lower bound of the material indices in which the respective thresholds apply
1517         AliceInp << setprecision(2);
1518         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1519         AliceInp << endl;
1520       }
1521       else  {
1522         AliceInp << "*"; 
1523         AliceInp << endl;
1524         AliceInp << "*Illegal flag value in SetProcess('RAYL',?) call."; 
1525         AliceInp << endl;
1526         AliceInp << "*No FLUKA card generated"; 
1527         AliceInp << endl;
1528       }
1529     } // end of else if (strncmp(&sProcessFlag[i][0],"RAYL",4) == 0)
1530
1531
1532     // synchrotron radiation in magnetic field
1533     // G3 default value: 0
1534     // G4 process: G4SynchrotronRadiation
1535     // 
1536     // Particles: ??
1537     // Physics:   Not set
1538     // flag = 0 no synchrotron radiation
1539     // flag = 1 synchrotron radiation
1540     //xx gMC ->SetProcess("SYNC",1); // synchrotron radiation generation
1541     else if (strncmp(&sProcessFlag[i][0],"SYNC",4) == 0) {
1542         AliceInp << "*"; 
1543         AliceInp << endl;
1544         AliceInp << "*Synchrotron radiation generation is NOT implemented in FLUKA"; 
1545         AliceInp << endl;
1546         AliceInp << "*No FLUKA card generated"; 
1547         AliceInp << endl;
1548     }
1549         
1550
1551     // Automatic calculation of tracking medium parameters
1552     // flag = 0 no automatic calculation
1553     // flag = 1 automatic calculation
1554     //xx gMC ->SetProcess("AUTO",1); // ??? automatic computation of the tracking medium parameters
1555     else if (strncmp(&sProcessFlag[i][0],"AUTO",4) == 0) {
1556         AliceInp << "*"; 
1557         AliceInp << endl;
1558         AliceInp << "*Automatic calculation of tracking medium parameters is always ON in FLUKA"; 
1559         AliceInp << endl;
1560         AliceInp << "*No FLUKA card generated"; 
1561         AliceInp << endl;
1562     }
1563         
1564
1565     // To control energy loss fluctuation model
1566     // flag = 0 Urban model
1567     // flag = 1 PAI model
1568     // flag = 2 PAI+ASHO model (not active at the moment)
1569     //xx gMC ->SetProcess("STRA",1); // ??? energy fluctuation model
1570     else if (strncmp(&sProcessFlag[i][0],"STRA",4) == 0) {
1571       if (iProcessValue[i] == 0 || iProcessValue[i] == 2 || iProcessValue[i] == 3) {
1572         AliceInp << "*";
1573         AliceInp << endl;
1574         AliceInp << "*Ionization energy losses calculation is activated";
1575         AliceInp << endl;
1576         AliceInp << "*Generated from call: SetProcess('STRA',n);, n=0,1,2";
1577         AliceInp << endl;
1578         AliceInp << setw(10) << "IONFLUCT  ";
1579         AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1580         AliceInp << setw(10) << 1.0;  // restricted energy loss fluctuations
1581                                       // (for hadrons and muons) switched on
1582         AliceInp << setw(10) << 1.0;  // restricted energy loss fluctuations
1583                                       // (for e+ and e-) switched on
1584         AliceInp << setw(10) << 1.0;  // minimal accuracy
1585         AliceInp << setw(10) << 3.0;  // upper bound of the material indices in
1586                                       // which the respective thresholds apply
1587         AliceInp << setprecision(2);
1588         AliceInp << setw(10) << fLastMaterial; // upper bound of the material indices in which the respective thresholds apply
1589         AliceInp << setprecision(1);
1590         AliceInp << setw(10) << 1.0;  // step length in assigning indices
1591         AliceInp << endl;
1592       }
1593       else {
1594         AliceInp << "*";
1595         AliceInp << endl;
1596         AliceInp << "*Illegal flag value in SetProcess('STRA',?) call.";
1597         AliceInp << endl;
1598         AliceInp << "*No FLUKA card generated";
1599         AliceInp << endl;
1600       }
1601     } // else if (strncmp(&sProcessFlag[i][0],"STRA",4) == 0)
1602
1603
1604
1605
1606     else { // processes not yet treated
1607
1608     // light photon absorption (Cerenkov photons)
1609     // it is turned on when Cerenkov process is turned on
1610     // G3 default value: 0
1611     // G4 process: G4OpAbsorption, G4OpBoundaryProcess
1612     // 
1613     // Particles: optical photon
1614     // Physics:   Optical
1615     // flag = 0 no absorption of Cerenkov photons
1616     // flag = 1 absorption of Cerenkov photons
1617     // gMC ->SetProcess("LABS",2); // ??? Cerenkov light absorption
1618
1619
1620
1621       cout << "SetProcess for flag=" << &sProcessFlag[i][0] << " value=" << iProcessValue[i] << " not yet implemented!" << endl;
1622     }
1623   } //end of loop number of SetProcess calls
1624
1625  
1626 // Loop over number of SetCut calls  
1627   for (Int_t i=0; i<iNbOfCut; i++) {
1628
1629     // cuts used in SetProcess calls
1630     if (strncmp(&sCutFlag[i][0],"BCUTM",5) == 0) continue;
1631     else if (strncmp(&sCutFlag[i][0],"BCUTE",5) == 0) continue;
1632     else if (strncmp(&sCutFlag[i][0],"DCUTM",5) == 0) continue;
1633     else if (strncmp(&sCutFlag[i][0],"PPCUTM",6) == 0) continue;
1634
1635     // gammas
1636     // G4 particles: "gamma"
1637     // G3 default value: 0.001 GeV
1638     //gMC ->SetCut("CUTGAM",cut); // cut for gammas
1639     else if (strncmp(&sCutFlag[i][0],"CUTGAM",6) == 0) {
1640       AliceInp << "*"; 
1641       AliceInp << endl;
1642       AliceInp << "*Cut for gamma"; 
1643       AliceInp << endl;
1644       AliceInp << "*Generated from call: SetCut('CUTGAM',cut);"; 
1645       AliceInp << endl;
1646       AliceInp << setw(10) << "PART-THR  "; 
1647       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1648       AliceInp << setw(10) << -fCutValue[i];
1649       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1650       AliceInp << setw(10) << 7.0;
1651       AliceInp << endl;
1652     }
1653
1654     // electrons
1655     // G4 particles: "e-"
1656     // ?? positrons
1657     // G3 default value: 0.001 GeV
1658     //gMC ->SetCut("CUTELE",cut); // cut for e+,e-
1659     else if (strncmp(&sCutFlag[i][0],"CUTELE",6) == 0) {
1660       AliceInp << "*"; 
1661       AliceInp << endl;
1662       AliceInp << "*Cut for electrons"; 
1663       AliceInp << endl;
1664       AliceInp << "*Generated from call: SetCut('CUTELE',cut);"; 
1665       AliceInp << endl;
1666       AliceInp << setw(10) << "PART-THR  "; 
1667       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1668       AliceInp << setw(10) << -fCutValue[i];
1669       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1670       AliceInp << setw(10) << 3.0;
1671       AliceInp << setw(10) << 4.0;
1672       AliceInp << setw(10) << 1.0;
1673       AliceInp << endl;
1674     }
1675
1676     // neutral hadrons
1677     // G4 particles: of type "baryon", "meson", "nucleus" with zero charge
1678     // G3 default value: 0.01 GeV
1679     //gMC ->SetCut("CUTNEU",cut); // cut for neutral hadrons
1680     else if (strncmp(&sCutFlag[i][0],"CUTNEU",6) == 0) {
1681       AliceInp << "*"; 
1682       AliceInp << endl;
1683       AliceInp << "*Cut for neutral hadrons"; 
1684       AliceInp << endl;
1685       AliceInp << "*Generated from call: SetCut('CUTNEU',cut);"; 
1686       AliceInp << endl;
1687       AliceInp << setw(10) << "PART-THR  "; 
1688       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1689       AliceInp << setw(10) << -fCutValue[i];
1690       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1691       AliceInp << setw(10) << 8.0; // Neutron
1692       AliceInp << setw(10) << 9.0; // Antineutron
1693       AliceInp << endl;
1694       AliceInp << setw(10) << "PART-THR  "; 
1695       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1696       AliceInp << setw(10) << -fCutValue[i];
1697       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1698       AliceInp << setw(10) << 12.0; // Kaon zero long
1699       AliceInp << setw(10) << 12.0; // Kaon zero long
1700       AliceInp << endl;
1701       AliceInp << setw(10) << "PART-THR  "; 
1702       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1703       AliceInp << setw(10) << -fCutValue[i];
1704       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1705       AliceInp << setw(10) << 17.0; // Lambda, 18=Antilambda
1706       AliceInp << setw(10) << 19.0; // Kaon zero short
1707       AliceInp << endl;
1708       AliceInp << setw(10) << "PART-THR  "; 
1709       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1710       AliceInp << setw(10) << -fCutValue[i];
1711       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1712       AliceInp << setw(10) << 22.0; // Sigma zero, Pion zero, Kaon zero
1713       AliceInp << setw(10) << 25.0; // Antikaon zero
1714       AliceInp << endl;
1715       AliceInp << setw(10) << "PART-THR  "; 
1716       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1717       AliceInp << setw(10) << -fCutValue[i];
1718       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1719       AliceInp << setw(10) << 32.0; // Antisigma zero
1720       AliceInp << setw(10) << 32.0; // Antisigma zero
1721       AliceInp << endl;
1722       AliceInp << setw(10) << "PART-THR  "; 
1723       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1724       AliceInp << setw(10) << -fCutValue[i];
1725       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1726       AliceInp << setw(10) << 34.0; // Xi zero
1727       AliceInp << setw(10) << 35.0; // AntiXi zero
1728       AliceInp << endl;
1729       AliceInp << setw(10) << "PART-THR  "; 
1730       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1731       AliceInp << setw(10) << -fCutValue[i];
1732       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1733       AliceInp << setw(10) << 47.0; // D zero
1734       AliceInp << setw(10) << 48.0; // AntiD zero
1735       AliceInp << endl;
1736       AliceInp << setw(10) << "PART-THR  "; 
1737       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1738       AliceInp << setw(10) << -fCutValue[i];
1739       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1740       AliceInp << setw(10) << 53.0; // Xi_c zero
1741       AliceInp << setw(10) << 53.0; // Xi_c zero
1742       AliceInp << endl;
1743       AliceInp << setw(10) << "PART-THR  "; 
1744       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1745       AliceInp << setw(10) << -fCutValue[i];
1746       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1747       AliceInp << setw(10) << 55.0; // Xi'_c zero
1748       AliceInp << setw(10) << 56.0; // Omega_c zero
1749       AliceInp << endl;
1750       AliceInp << setw(10) << "PART-THR  "; 
1751       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1752       AliceInp << setw(10) << -fCutValue[i];
1753       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1754       AliceInp << setw(10) << 59.0; // AntiXi_c zero
1755       AliceInp << setw(10) << 59.0; // AntiXi_c zero
1756       AliceInp << endl;
1757       AliceInp << setw(10) << "PART-THR  "; 
1758       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1759       AliceInp << setw(10) << -fCutValue[i];
1760       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1761       AliceInp << setw(10) << 61.0; // AntiXi'_c zero
1762       AliceInp << setw(10) << 62.0; // AntiOmega_c zero
1763       AliceInp << endl;
1764     }
1765
1766     // charged hadrons
1767     // G4 particles: of type "baryon", "meson", "nucleus" with non-zero charge
1768     // G3 default value: 0.01 GeV
1769     //gMC ->SetCut("CUTHAD",cut); // cut for charged hadrons
1770     else if (strncmp(&sCutFlag[i][0],"CUTHAD",6) == 0) {
1771       AliceInp << "*"; 
1772       AliceInp << endl;
1773       AliceInp << "*Cut for charged hadrons"; 
1774       AliceInp << endl;
1775       AliceInp << "*Generated from call: SetCut('CUTHAD',cut);"; 
1776       AliceInp << endl;
1777       AliceInp << setw(10) << "PART-THR  "; 
1778       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1779       AliceInp << setw(10) << -fCutValue[i];
1780       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1781       AliceInp << setw(10) << 1.0; // Proton
1782       AliceInp << setw(10) << 2.0; // Antiproton
1783       AliceInp << endl;
1784       AliceInp << setw(10) << "PART-THR  "; 
1785       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1786       AliceInp << setw(10) << -fCutValue[i];
1787       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1788       AliceInp << setw(10) << 13.0; // Positive Pion, Negative Pion, Positive Kaon
1789       AliceInp << setw(10) << 16.0; // Negative Kaon
1790       AliceInp << endl;
1791       AliceInp << setw(10) << "PART-THR  "; 
1792       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1793       AliceInp << setw(10) << -fCutValue[i];
1794       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1795       AliceInp << setw(10) << 20.0; // Negative Sigma
1796       AliceInp << setw(10) << 16.0; // Positive Sigma
1797       AliceInp << endl;
1798       AliceInp << setw(10) << "PART-THR  "; 
1799       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1800       AliceInp << setw(10) << -fCutValue[i];
1801       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1802       AliceInp << setw(10) << 31.0; // Antisigma minus
1803       AliceInp << setw(10) << 33.0; // Antisigma plus
1804       AliceInp << setprecision(1);
1805       AliceInp << setw(10) << 2.0;  // step length
1806       AliceInp << endl;
1807       AliceInp << setw(10) << "PART-THR  "; 
1808       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1809       AliceInp << setw(10) << -fCutValue[i];
1810       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1811       AliceInp << setw(10) << 36.0; // Negative Xi, Positive Xi, Omega minus
1812       AliceInp << setw(10) << 39.0; // Antiomega
1813       AliceInp << endl;
1814       AliceInp << setw(10) << "PART-THR  "; 
1815       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1816       AliceInp << setw(10) << -fCutValue[i];
1817       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1818       AliceInp << setw(10) << 45.0; // D plus
1819       AliceInp << setw(10) << 46.0; // D minus
1820       AliceInp << endl;
1821       AliceInp << setw(10) << "PART-THR  "; 
1822       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1823       AliceInp << setw(10) << -fCutValue[i];
1824       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1825       AliceInp << setw(10) << 49.0; // D_s plus, D_s minus, Lambda_c plus
1826       AliceInp << setw(10) << 52.0; // Xi_c plus
1827       AliceInp << endl;
1828       AliceInp << setw(10) << "PART-THR  "; 
1829       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1830       AliceInp << setw(10) << -fCutValue[i];
1831       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1832       AliceInp << setw(10) << 54.0; // Xi'_c plus
1833       AliceInp << setw(10) << 60.0; // AntiXi'_c minus
1834       AliceInp << setprecision(1);
1835       AliceInp << setw(10) << 6.0;  // step length
1836       AliceInp << endl;
1837       AliceInp << setw(10) << "PART-THR  "; 
1838       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1839       AliceInp << setw(10) << -fCutValue[i];
1840       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2);
1841       AliceInp << setw(10) << 57.0; // Antilambda_c minus
1842       AliceInp << setw(10) << 58.0; // AntiXi_c minus
1843       AliceInp << endl;
1844     }
1845
1846     // muons
1847     // G4 particles: "mu+", "mu-"
1848     // G3 default value: 0.01 GeV
1849     //gMC ->SetCut("CUTMUO",cut); // cut for mu+, mu-
1850     else if (strncmp(&sCutFlag[i][0],"CUTMUO",6) == 0) {
1851       AliceInp << "*"; 
1852       AliceInp << endl;
1853       AliceInp << "*Cut for muons"; 
1854       AliceInp << endl;
1855       AliceInp << "*Generated from call: SetCut('CUTMUO',cut);"; 
1856       AliceInp << endl;
1857       AliceInp << setw(10) << "PART-THR  "; 
1858       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1859       AliceInp << setw(10) << -fCutValue[i];
1860       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1861       AliceInp << setprecision(2);
1862       AliceInp << setw(10) << 10.0;
1863       AliceInp << setw(10) << 11.0;
1864       AliceInp << endl;
1865     }
1866     // delta-rays by electrons
1867     // G4 particles: "e-"
1868     // G3 default value: 10**4 GeV
1869     // gMC ->SetCut("DCUTE",cut);  // cut for deltarays by electrons ???????????????
1870     else if (strncmp(&sCutFlag[i][0],"DCUTE",5) == 0) {
1871       AliceInp << "*"; 
1872       AliceInp << endl;
1873       AliceInp << "*Cut for delta rays by electrons ????????????";
1874       AliceInp << endl;
1875       AliceInp << "*Generated from call: SetCut('DCUTE',cut);";
1876       AliceInp << endl;
1877       AliceInp << setw(10) << "EMFCUT    ";
1878       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1879       AliceInp << setw(10) << -fCutValue[i];
1880       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1881       AliceInp << setw(10) << 0.0;
1882       AliceInp << setw(10) << 0.0;
1883       AliceInp << setw(10) << 3.0;
1884       AliceInp << setprecision(2);
1885       AliceInp << setw(10) << fLastMaterial;
1886       AliceInp << setprecision(1);
1887       AliceInp << setw(10) << 1.0;
1888       AliceInp << endl;
1889     }
1890     
1891     //
1892     // time of flight cut in seconds
1893     // G4 particles: all
1894     // G3 default value: 0.01 GeV
1895     //gMC ->SetCut("TOFMAX",tofmax); // time of flight cuts in seconds
1896     else if (strncmp(&sCutFlag[i][0],"TOFMAX",6) == 0) {
1897       AliceInp << "*"; 
1898       AliceInp << endl;
1899       AliceInp << "*Time of flight cuts in seconds"; 
1900       AliceInp << endl;
1901       AliceInp << "*Generated from call: SetCut('TOFMAX',tofmax);"; 
1902       AliceInp << endl;
1903       AliceInp << setw(10) << "TIME-CUT  "; 
1904       AliceInp << setiosflags(ios::scientific) << setprecision(5);
1905       AliceInp << setw(10) << fCutValue[i]*1.e9;
1906       AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1);
1907       AliceInp << setw(10) << 0.0;
1908       AliceInp << setw(10) << 0.0;
1909       AliceInp << setw(10) << -6.0; // lower bound of the particle numbers for which the transport time cut-off and/or the start signal is to be applied
1910       AliceInp << setprecision(2);
1911       AliceInp << setw(10) << 64.0; // upper bound of the particle numbers for which the transport time cut-off and/or the start signal is to be applied
1912       AliceInp << setprecision(1);
1913       AliceInp << setw(10) << 1.0; // step length in assigning numbers
1914       AliceInp << endl;
1915     }
1916
1917     else {
1918       cout << "SetCut for flag=" << &sCutFlag[i][0] << " value=" << fCutValue[i] << " not yet implemented!" << endl;
1919     }
1920   } //end of loop over SeCut calls
1921     
1922 // Add START and STOP card
1923    AliceInp << setw(10) << "START     "; 
1924    AliceInp << setiosflags(ios::fixed) << setiosflags(ios::showpoint);
1925    AliceInp << setw(10) << fEventsPerRun;
1926    AliceInp << endl;
1927    AliceInp << setw(10) << "STOP      "; 
1928    AliceInp << endl;
1929
1930 } // end of InitPhysics
1931
1932
1933 //______________________________________________________________________________ 
1934 void TFluka::SetMaxStep(Double_t)
1935 {
1936 // SetMaxStep is dummy procedure in TFluka !
1937   if (fVerbosityLevel >=3)
1938   cout << "SetMaxStep is dummy procedure in TFluka !" << endl;
1939 }
1940
1941 //______________________________________________________________________________ 
1942 void TFluka::SetMaxNStep(Int_t)
1943 {
1944 // SetMaxNStep is dummy procedure in TFluka !
1945   if (fVerbosityLevel >=3)
1946   cout << "SetMaxNStep is dummy procedure in TFluka !" << endl;
1947 }
1948
1949 //______________________________________________________________________________ 
1950 void TFluka::SetUserDecay(Int_t)
1951 {
1952 // SetUserDecay is dummy procedure in TFluka !
1953   if (fVerbosityLevel >=3)
1954   cout << "SetUserDecay is dummy procedure in TFluka !" << endl;
1955 }
1956
1957 //
1958 // dynamic properties
1959 //
1960 //______________________________________________________________________________ 
1961 void TFluka::TrackPosition(TLorentzVector& position) const
1962 {
1963 // Return the current position in the master reference frame of the
1964 // track being transported
1965 // TRACKR.atrack = age of the particle
1966 // TRACKR.xtrack = x-position of the last point
1967 // TRACKR.ytrack = y-position of the last point
1968 // TRACKR.ztrack = z-position of the last point
1969   Int_t caller = GetCaller();
1970   if (caller == 3 || caller == 6 || caller == 11 || caller == 12) { //bxdraw,endraw,usdraw
1971     position.SetX(GetXsco());
1972     position.SetY(GetYsco());
1973     position.SetZ(GetZsco());
1974     position.SetT(TRACKR.atrack);
1975   }
1976   else if (caller == 4) { // mgdraw
1977     position.SetX(TRACKR.xtrack[TRACKR.ntrack]);
1978     position.SetY(TRACKR.ytrack[TRACKR.ntrack]);
1979     position.SetZ(TRACKR.ztrack[TRACKR.ntrack]);
1980     position.SetT(TRACKR.atrack);
1981   }
1982   else if (caller == 5) { // sodraw
1983     position.SetX(TRACKR.xtrack[TRACKR.ntrack]);
1984     position.SetY(TRACKR.ytrack[TRACKR.ntrack]);
1985     position.SetZ(TRACKR.ztrack[TRACKR.ntrack]);
1986     position.SetT(0);
1987   }
1988   else
1989     Warning("TrackPosition","position not available");
1990 }
1991
1992 //______________________________________________________________________________ 
1993 void TFluka::TrackPosition(Double_t& x, Double_t& y, Double_t& z) const
1994 {
1995 // Return the current position in the master reference frame of the
1996 // track being transported
1997 // TRACKR.atrack = age of the particle
1998 // TRACKR.xtrack = x-position of the last point
1999 // TRACKR.ytrack = y-position of the last point
2000 // TRACKR.ztrack = z-position of the last point
2001   Int_t caller = GetCaller();
2002   if (caller == 3 || caller == 6 || caller == 11 || caller == 12) { //bxdraw,endraw,usdraw
2003     x = GetXsco();
2004     y = GetYsco();
2005     z = GetZsco();
2006   }
2007   else if (caller == 4) { // mgdraw
2008     x = TRACKR.xtrack[TRACKR.ntrack];
2009     y = TRACKR.ytrack[TRACKR.ntrack];
2010     z = TRACKR.ztrack[TRACKR.ntrack];
2011   }
2012   else if (caller == 5) { // sodraw
2013     x = TRACKR.xtrack[TRACKR.ntrack];
2014     y = TRACKR.ytrack[TRACKR.ntrack];
2015     z = TRACKR.ztrack[TRACKR.ntrack];
2016   }
2017   else
2018     Warning("TrackPosition","position not available");
2019 }
2020
2021 //______________________________________________________________________________ 
2022 void TFluka::TrackMomentum(TLorentzVector& momentum) const
2023 {
2024 // Return the direction and the momentum (GeV/c) of the track
2025 // currently being transported
2026 // TRACKR.ptrack = momentum of the particle (not always defined, if
2027 //               < 0 must be obtained from etrack) 
2028 // TRACKR.cx,y,ztrck = direction cosines of the current particle
2029 // TRACKR.etrack = total energy of the particle
2030 // TRACKR.jtrack = identity number of the particle
2031 // PAPROP.am[TRACKR.jtrack] = particle mass in gev
2032   Int_t caller = GetCaller();
2033   if (caller != 2) { // not eedraw 
2034     if (TRACKR.ptrack >= 0) {
2035       momentum.SetPx(TRACKR.ptrack*TRACKR.cxtrck);
2036       momentum.SetPy(TRACKR.ptrack*TRACKR.cytrck);
2037       momentum.SetPz(TRACKR.ptrack*TRACKR.cztrck);
2038       momentum.SetE(TRACKR.etrack);
2039       return;
2040     }
2041     else {
2042       Double_t p = sqrt(TRACKR.etrack*TRACKR.etrack - PAPROP.am[TRACKR.jtrack+6]*PAPROP.am[TRACKR.jtrack+6]);
2043       momentum.SetPx(p*TRACKR.cxtrck);
2044       momentum.SetPy(p*TRACKR.cytrck);
2045       momentum.SetPz(p*TRACKR.cztrck);
2046       momentum.SetE(TRACKR.etrack);
2047       return;
2048     }
2049   }
2050   else
2051     Warning("TrackMomentum","momentum not available");
2052 }
2053
2054 //______________________________________________________________________________ 
2055 void TFluka::TrackMomentum(Double_t& px, Double_t& py, Double_t& pz, Double_t& e) const
2056 {
2057 // Return the direction and the momentum (GeV/c) of the track
2058 // currently being transported
2059 // TRACKR.ptrack = momentum of the particle (not always defined, if
2060 //               < 0 must be obtained from etrack) 
2061 // TRACKR.cx,y,ztrck = direction cosines of the current particle
2062 // TRACKR.etrack = total energy of the particle
2063 // TRACKR.jtrack = identity number of the particle
2064 // PAPROP.am[TRACKR.jtrack] = particle mass in gev
2065   Int_t caller = GetCaller();
2066   if (caller != 2) { // not eedraw 
2067     if (TRACKR.ptrack >= 0) {
2068       px = TRACKR.ptrack*TRACKR.cxtrck;
2069       py = TRACKR.ptrack*TRACKR.cytrck;
2070       pz = TRACKR.ptrack*TRACKR.cztrck;
2071       e = TRACKR.etrack;
2072       return;
2073     }
2074     else {
2075       Double_t p = sqrt(TRACKR.etrack*TRACKR.etrack - PAPROP.am[TRACKR.jtrack+6]*PAPROP.am[TRACKR.jtrack+6]);
2076       px = p*TRACKR.cxtrck;
2077       py = p*TRACKR.cytrck;
2078       pz = p*TRACKR.cztrck;
2079       e = TRACKR.etrack;
2080       return;
2081     }
2082   }
2083   else
2084     Warning("TrackMomentum","momentum not available");
2085 }
2086
2087 //______________________________________________________________________________ 
2088 Double_t TFluka::TrackStep() const
2089 {
2090 // Return the length in centimeters of the current step
2091 // TRACKR.ctrack = total curved path
2092   Int_t caller = GetCaller();
2093   if (caller == 11 || caller==12 || caller == 3 || caller == 6) //bxdraw,endraw,usdraw
2094     return 0.0;
2095   else if (caller == 4) //mgdraw
2096     return TRACKR.ctrack;
2097   else
2098     return -1.0;
2099 }
2100
2101 //______________________________________________________________________________ 
2102 Double_t TFluka::TrackLength() const
2103 {
2104 // TRACKR.cmtrck = cumulative curved path since particle birth
2105   Int_t caller = GetCaller();
2106   if (caller == 11 || caller==12 || caller == 3 || caller == 4 || caller == 6) //bxdraw,endraw,mgdraw,usdraw
2107     return TRACKR.cmtrck;
2108   else 
2109     return -1.0;
2110 }
2111
2112 //______________________________________________________________________________ 
2113 Double_t TFluka::TrackTime() const
2114 {
2115 // Return the current time of flight of the track being transported
2116 // TRACKR.atrack = age of the particle
2117   Int_t caller = GetCaller();
2118   if (caller == 11 || caller==12 || caller == 3 || caller == 4 || caller == 6) //bxdraw,endraw,mgdraw,usdraw
2119     return TRACKR.atrack;
2120   else 
2121     return -1;
2122 }
2123
2124 //______________________________________________________________________________ 
2125 Double_t TFluka::Edep() const
2126 {
2127 // Energy deposition
2128 // if TRACKR.ntrack = 0, TRACKR.mtrack = 0:
2129 // -->local energy deposition (the value and the point are not recorded in TRACKR)
2130 //    but in the variable "rull" of the procedure "endraw.cxx"
2131 // if TRACKR.ntrack > 0, TRACKR.mtrack = 0:
2132 // -->no energy loss along the track
2133 // if TRACKR.ntrack > 0, TRACKR.mtrack > 0:
2134 // -->energy loss distributed along the track
2135 // TRACKR.dtrack = energy deposition of the jth deposition even
2136
2137   // If coming from bxdraw we have 2 steps of 0 length and 0 edep
2138   Int_t caller = GetCaller();
2139   if (caller == 11 || caller==12) return 0.0;
2140   Double_t sum = 0;
2141   for ( Int_t j=0;j<TRACKR.mtrack;j++) {
2142     sum +=TRACKR.dtrack[j];  
2143   }
2144   if (TRACKR.ntrack == 0 && TRACKR.mtrack == 0)
2145     return fRull + sum;
2146   else {
2147     return sum;
2148   }
2149 }
2150
2151 //______________________________________________________________________________ 
2152 Int_t TFluka::TrackPid() const
2153 {
2154 // Return the id of the particle transported
2155 // TRACKR.jtrack = identity number of the particle
2156   Int_t caller = GetCaller();
2157   if (caller != 2)  // not eedraw 
2158     return PDGFromId(TRACKR.jtrack);
2159   else
2160     return -1000;
2161 }
2162
2163 //______________________________________________________________________________ 
2164 Double_t TFluka::TrackCharge() const
2165 {
2166 // Return charge of the track currently transported
2167 // PAPROP.ichrge = electric charge of the particle
2168 // TRACKR.jtrack = identity number of the particle
2169   Int_t caller = GetCaller();
2170   if (caller != 2)  // not eedraw 
2171     return PAPROP.ichrge[TRACKR.jtrack+6];
2172   else
2173     return -1000.0;
2174 }
2175
2176 //______________________________________________________________________________ 
2177 Double_t TFluka::TrackMass() const
2178 {
2179 // PAPROP.am = particle mass in GeV
2180 // TRACKR.jtrack = identity number of the particle
2181   Int_t caller = GetCaller();
2182   if (caller != 2)  // not eedraw 
2183     return PAPROP.am[TRACKR.jtrack+6];
2184   else
2185     return -1000.0;
2186 }
2187
2188 //______________________________________________________________________________ 
2189 Double_t TFluka::Etot() const
2190 {
2191 // TRACKR.etrack = total energy of the particle
2192   Int_t caller = GetCaller();
2193   if (caller != 2)  // not eedraw
2194     return TRACKR.etrack;
2195   else
2196     return -1000.0;
2197 }
2198
2199 //
2200 // track status
2201 //
2202 //______________________________________________________________________________ 
2203 Bool_t   TFluka::IsNewTrack() const
2204 {
2205 // Return true for the first call of Stepping()
2206 /*
2207 // True if the track has positive cummulative length
2208   Int_t caller = GetCaller();
2209   if (caller != 2) { // not eedraw
2210     if (TRACKR.cmtrck > 0.0)
2211       return 1; 
2212     else
2213       return 0; 
2214   }
2215   else
2216     return 0;
2217 */    
2218    return fTrackIsNew;
2219 }
2220
2221 //______________________________________________________________________________ 
2222 Bool_t   TFluka::IsTrackInside() const
2223 {
2224 // True if the track is not at the boundary of the current volume
2225 // In Fluka a step is always inside one kind of material
2226 // If the step would go behind the region of one material,
2227 // it will be shortened to reach only the boundary.
2228 // Therefore IsTrackInside() is always true.
2229   Int_t caller = GetCaller();
2230   if (caller == 11 || caller==12)  // bxdraw
2231     return 0;
2232   else
2233     return 1;
2234 }
2235
2236 //______________________________________________________________________________ 
2237 Bool_t   TFluka::IsTrackEntering() const
2238 {
2239 // True if this is the first step of the track in the current volume
2240
2241   Int_t caller = GetCaller();
2242   if (caller == 11)  // bxdraw entering
2243     return 1;
2244   else return 0;
2245 }
2246
2247 //______________________________________________________________________________ 
2248 Bool_t   TFluka::IsTrackExiting() const
2249 {
2250   Int_t caller = GetCaller();
2251   if (caller == 12)  // bxdraw exiting
2252     return 1;
2253   else return 0;
2254 }
2255
2256 //______________________________________________________________________________ 
2257 Bool_t   TFluka::IsTrackOut() const
2258 {
2259 // True if the track is out of the setup
2260 // means escape
2261 // Icode = 14: escape - call from Kaskad
2262 // Icode = 23: escape - call from Emfsco
2263 // Icode = 32: escape - call from Kasneu
2264 // Icode = 40: escape - call from Kashea
2265 // Icode = 51: escape - call from Kasoph
2266   if (fIcode == 14 ||
2267       fIcode == 23 ||
2268       fIcode == 32 ||
2269       fIcode == 40 ||
2270       fIcode == 51) return 1;
2271   else return 0;
2272 }
2273
2274 //______________________________________________________________________________ 
2275 Bool_t   TFluka::IsTrackDisappeared() const
2276 {
2277 // means all inelastic interactions and decays
2278 // fIcode from usdraw
2279   if (fIcode == 101 || // inelastic interaction
2280       fIcode == 102 || // particle decay
2281       fIcode == 214 || // in-flight annihilation
2282       fIcode == 215 || // annihilation at rest
2283       fIcode == 217 || // pair production
2284       fIcode == 221) return 1;
2285   else return 0;
2286 }
2287
2288 //______________________________________________________________________________ 
2289 Bool_t   TFluka::IsTrackStop() const
2290 {
2291 // True if the track energy has fallen below the threshold
2292 // means stopped by signal or below energy threshold
2293 // Icode = 12: stopping particle       - call from Kaskad
2294 // Icode = 15: time kill               - call from Kaskad
2295 // Icode = 21: below threshold, iarg=1 - call from Emfsco
2296 // Icode = 22: below threshold, iarg=2 - call from Emfsco
2297 // Icode = 24: time kill               - call from Emfsco
2298 // Icode = 31: below threshold         - call from Kasneu
2299 // Icode = 33: time kill               - call from Kasneu
2300 // Icode = 41: time kill               - call from Kashea
2301 // Icode = 52: time kill               - call from Kasoph
2302   if (fIcode == 12 ||
2303       fIcode == 15 ||
2304       fIcode == 21 ||
2305       fIcode == 22 ||
2306       fIcode == 24 ||
2307       fIcode == 31 ||
2308       fIcode == 33 ||
2309       fIcode == 41 ||
2310       fIcode == 52) return 1;
2311   else return 0;
2312 }
2313
2314 //______________________________________________________________________________ 
2315 Bool_t   TFluka::IsTrackAlive() const
2316 {
2317 // means not disappeared or not out
2318   if (IsTrackDisappeared() || IsTrackOut() ) return 0;
2319   else return 1;
2320 }
2321
2322 //
2323 // secondaries
2324 //
2325
2326 //______________________________________________________________________________ 
2327 Int_t TFluka::NSecondaries() const
2328 // Number of secondary particles generated in the current step
2329 // FINUC.np = number of secondaries except light and heavy ions
2330 // FHEAVY.npheav = number of secondaries for light and heavy secondary ions
2331 {
2332   Int_t caller = GetCaller();
2333   if (caller == 6)  // valid only after usdraw
2334     return FINUC.np + FHEAVY.npheav;
2335   else
2336     return 0;
2337 } // end of NSecondaries
2338
2339 //______________________________________________________________________________ 
2340 void TFluka::GetSecondary(Int_t isec, Int_t& particleId,
2341                 TLorentzVector& position, TLorentzVector& momentum)
2342 {
2343   Int_t caller = GetCaller();
2344   if (caller == 6) {  // valid only after usdraw
2345     if (isec >= 0 && isec < FINUC.np) {
2346       particleId = PDGFromId(FINUC.kpart[isec]);
2347       position.SetX(fXsco);
2348       position.SetY(fYsco);
2349       position.SetZ(fZsco);
2350       position.SetT(TRACKR.atrack);
2351 //    position.SetT(TRACKR.atrack+FINUC.agesec[isec]); //not yet implem.
2352       momentum.SetPx(FINUC.plr[isec]*FINUC.cxr[isec]);
2353       momentum.SetPy(FINUC.plr[isec]*FINUC.cyr[isec]);
2354       momentum.SetPz(FINUC.plr[isec]*FINUC.czr[isec]);
2355       momentum.SetE(FINUC.tki[isec] + PAPROP.am[FINUC.kpart[isec]+6]);
2356     }
2357     else if (isec >= FINUC.np && isec < FINUC.np + FHEAVY.npheav) {
2358       Int_t jsec = isec - FINUC.np;
2359       particleId = FHEAVY.kheavy[jsec]; // this is Fluka id !!!
2360       position.SetX(fXsco);
2361       position.SetY(fYsco);
2362       position.SetZ(fZsco);
2363       position.SetT(TRACKR.atrack);
2364 //    position.SetT(TRACKR.atrack+FHEAVY.agheav[jsec]); //not yet implem.
2365       momentum.SetPx(FHEAVY.pheavy[jsec]*FHEAVY.cxheav[jsec]);
2366       momentum.SetPy(FHEAVY.pheavy[jsec]*FHEAVY.cyheav[jsec]);
2367       momentum.SetPz(FHEAVY.pheavy[jsec]*FHEAVY.czheav[jsec]);
2368       if (FHEAVY.tkheav[jsec] >= 3 && FHEAVY.tkheav[jsec] <= 6) 
2369         momentum.SetE(FHEAVY.tkheav[jsec] + PAPROP.am[jsec+6]);
2370       else if (FHEAVY.tkheav[jsec] > 6)
2371         momentum.SetE(FHEAVY.tkheav[jsec] + FHEAVY.amnhea[jsec]); // to be checked !!!
2372     }
2373     else
2374       Warning("GetSecondary","isec out of range");
2375   }
2376   else
2377     Warning("GetSecondary","no secondaries available");
2378 } // end of GetSecondary
2379
2380 //______________________________________________________________________________ 
2381 TMCProcess TFluka::ProdProcess(Int_t) const
2382 // Name of the process that has produced the secondary particles
2383 // in the current step
2384 {
2385     const TMCProcess kIpNoProc = kPNoProcess;
2386     const TMCProcess kIpPDecay = kPDecay;
2387     const TMCProcess kIpPPair = kPPair;
2388 //  const TMCProcess kIpPPairFromPhoton = kPPairFromPhoton;
2389 //  const TMCProcess kIpPPairFromVirtualPhoton = kPPairFromVirtualPhoton;
2390     const TMCProcess kIpPCompton = kPCompton;
2391     const TMCProcess kIpPPhotoelectric = kPPhotoelectric;
2392     const TMCProcess kIpPBrem = kPBrem;
2393 //  const TMCProcess kIpPBremFromHeavy = kPBremFromHeavy;
2394 //  const TMCProcess kIpPBremFromElectronOrPositron = kPBremFromElectronOrPositron;
2395     const TMCProcess kIpPDeltaRay = kPDeltaRay;
2396 //  const TMCProcess kIpPMoller = kPMoller;
2397 //  const TMCProcess kIpPBhabha = kPBhabha;
2398     const TMCProcess kIpPAnnihilation = kPAnnihilation;
2399 //  const TMCProcess kIpPAnnihilInFlight = kPAnnihilInFlight;
2400 //  const TMCProcess kIpPAnnihilAtRest = kPAnnihilAtRest;
2401     const TMCProcess kIpPHadronic = kPHadronic;
2402     const TMCProcess kIpPMuonNuclear = kPMuonNuclear;
2403     const TMCProcess kIpPPhotoFission = kPPhotoFission;
2404     const TMCProcess kIpPRayleigh = kPRayleigh;
2405 //  const TMCProcess kIpPCerenkov = kPCerenkov;
2406 //  const TMCProcess kIpPSynchrotron = kPSynchrotron;
2407
2408     Int_t mugamma = TRACKR.jtrack == 7 || TRACKR.jtrack == 10 || TRACKR.jtrack == 11;
2409     if (fIcode == 102) return kIpPDecay;
2410     else if (fIcode == 104 || fIcode == 217) return kIpPPair;
2411 //  else if (fIcode == 104) return kIpPairFromPhoton;
2412 //  else if (fIcode == 217) return kIpPPairFromVirtualPhoton;
2413     else if (fIcode == 219) return kIpPCompton;
2414     else if (fIcode == 221) return kIpPPhotoelectric;
2415     else if (fIcode == 105 || fIcode == 208) return kIpPBrem;
2416 //  else if (fIcode == 105) return kIpPBremFromHeavy;
2417 //  else if (fIcode == 208) return kPBremFromElectronOrPositron;
2418     else if (fIcode == 103 || fIcode == 400) return kIpPDeltaRay;
2419     else if (fIcode == 210 || fIcode == 212) return kIpPDeltaRay;
2420 //  else if (fIcode == 210) return kIpPMoller;
2421 //  else if (fIcode == 212) return kIpPBhabha;
2422     else if (fIcode == 214 || fIcode == 215) return kIpPAnnihilation;
2423 //  else if (fIcode == 214) return kIpPAnnihilInFlight;
2424 //  else if (fIcode == 215) return kIpPAnnihilAtRest;
2425     else if (fIcode == 101) return kIpPHadronic;
2426     else if (fIcode == 101) {
2427       if (!mugamma) return kIpPHadronic;
2428       else if (TRACKR.jtrack == 7) return kIpPPhotoFission;
2429       else return kIpPMuonNuclear;
2430     }
2431     else if (fIcode == 225) return kIpPRayleigh;
2432 // Fluka codes 100, 300 and 400 still to be investigasted
2433     else return kIpNoProc;
2434 }
2435
2436 //Int_t StepProcesses(TArrayI &proc) const
2437 // Return processes active in the current step
2438 //{
2439 //ck = total energy of the particl ???????????????? 
2440 //}
2441
2442
2443 //______________________________________________________________________________ 
2444 Int_t TFluka::VolId2Mate(Int_t id) const
2445 {
2446 //
2447 // Returns the material number for a given volume ID
2448 //
2449    return fGeom->VolId2Mate(id);
2450 }
2451
2452 //______________________________________________________________________________ 
2453 const char* TFluka::VolName(Int_t id) const
2454 {
2455 //
2456 // Returns the volume name for a given volume ID
2457 //
2458    return fGeom->VolName(id);
2459 }
2460
2461 //______________________________________________________________________________ 
2462 Int_t TFluka::VolId(const Text_t* volName) const
2463 {
2464 //
2465 // Converts from volume name to volume ID.
2466 // Time consuming. (Only used during set-up)
2467 // Could be replaced by hash-table
2468 //
2469    return fGeom->VolId(volName);
2470 }
2471
2472 //______________________________________________________________________________ 
2473 Int_t TFluka::CurrentVolID(Int_t& copyNo) const
2474 {
2475 //
2476 // Return the logical id and copy number corresponding to the current fluka region
2477 //
2478    return fGeom->CurrentVolID(copyNo);
2479
2480
2481 //______________________________________________________________________________ 
2482 Int_t TFluka::CurrentVolOffID(Int_t off, Int_t& copyNo) const
2483 {
2484 //
2485 // Return the logical id and copy number of off'th mother 
2486 // corresponding to the current fluka region
2487 //
2488    return fGeom->CurrentVolOffID(off, copyNo);
2489 }
2490
2491 //______________________________________________________________________________ 
2492 const char* TFluka::CurrentVolName() const
2493 {
2494 //
2495 // Return the current volume name
2496 //
2497    return fGeom->CurrentVolName();
2498 }
2499
2500 //______________________________________________________________________________ 
2501 const char* TFluka::CurrentVolOffName(Int_t off) const
2502 {
2503 //
2504 // Return the volume name of the off'th mother of the current volume
2505 //
2506    return fGeom->CurrentVolOffName(off);
2507 }
2508
2509 //______________________________________________________________________________ 
2510 Int_t TFluka::CurrentMaterial(Float_t & /*a*/, Float_t & /*z*/, 
2511                       Float_t & /*dens*/, Float_t & /*radl*/, Float_t & /*absl*/) const
2512 {
2513 //
2514 //  Return the current medium number  ??? what about material properties
2515 //
2516   Int_t copy;
2517   Int_t id  =  TFluka::CurrentVolID(copy);
2518   Int_t med =  TFluka::VolId2Mate(id);
2519   return med;
2520 }
2521
2522 //______________________________________________________________________________ 
2523 void TFluka::Gmtod(Float_t* xm, Float_t* xd, Int_t iflag)
2524 {
2525 // Transforms a position from the world reference frame
2526 // to the current volume reference frame.
2527 //
2528 //  Geant3 desription:
2529 //  ==================
2530 //       Computes coordinates XD (in DRS) 
2531 //       from known coordinates XM in MRS 
2532 //       The local reference system can be initialized by
2533 //         - the tracking routines and GMTOD used in GUSTEP
2534 //         - a call to GMEDIA(XM,NUMED)
2535 //         - a call to GLVOLU(NLEVEL,NAMES,NUMBER,IER) 
2536 //             (inverse routine is GDTOM) 
2537 //
2538 //        If IFLAG=1  convert coordinates 
2539 //           IFLAG=2  convert direction cosinus
2540 //
2541 // ---
2542    fGeom->Gmtod(xm,xd,iflag);   
2543 }
2544   
2545 //______________________________________________________________________________ 
2546 void TFluka::Gmtod(Double_t* xm, Double_t* xd, Int_t iflag)
2547 {
2548 // Transforms a position from the world reference frame
2549 // to the current volume reference frame.
2550 //
2551 //  Geant3 desription:
2552 //  ==================
2553 //       Computes coordinates XD (in DRS) 
2554 //       from known coordinates XM in MRS 
2555 //       The local reference system can be initialized by
2556 //         - the tracking routines and GMTOD used in GUSTEP
2557 //         - a call to GMEDIA(XM,NUMED)
2558 //         - a call to GLVOLU(NLEVEL,NAMES,NUMBER,IER) 
2559 //             (inverse routine is GDTOM) 
2560 //
2561 //        If IFLAG=1  convert coordinates 
2562 //           IFLAG=2  convert direction cosinus
2563 //
2564 // ---
2565    fGeom->Gmtod(xm,xd,iflag);   
2566 }
2567
2568 //______________________________________________________________________________ 
2569 void TFluka::Gdtom(Float_t* xd, Float_t* xm, Int_t iflag)
2570 {
2571 // Transforms a position from the current volume reference frame
2572 // to the world reference frame.
2573 //
2574 //  Geant3 desription:
2575 //  ==================
2576 //  Computes coordinates XM (Master Reference System
2577 //  knowing the coordinates XD (Detector Ref System)
2578 //  The local reference system can be initialized by
2579 //    - the tracking routines and GDTOM used in GUSTEP
2580 //    - a call to GSCMED(NLEVEL,NAMES,NUMBER)
2581 //        (inverse routine is GMTOD)
2582 // 
2583 //   If IFLAG=1  convert coordinates
2584 //      IFLAG=2  convert direction cosinus
2585 //
2586 // ---
2587    fGeom->Gdtom(xd,xm,iflag);   
2588 }
2589
2590 //______________________________________________________________________________ 
2591 void TFluka::Gdtom(Double_t* xd, Double_t* xm, Int_t iflag)
2592 {
2593 // Transforms a position from the current volume reference frame
2594 // to the world reference frame.
2595 //
2596 //  Geant3 desription:
2597 //  ==================
2598 //  Computes coordinates XM (Master Reference System
2599 //  knowing the coordinates XD (Detector Ref System)
2600 //  The local reference system can be initialized by
2601 //    - the tracking routines and GDTOM used in GUSTEP
2602 //    - a call to GSCMED(NLEVEL,NAMES,NUMBER)
2603 //        (inverse routine is GMTOD)
2604 // 
2605 //   If IFLAG=1  convert coordinates
2606 //      IFLAG=2  convert direction cosinus
2607 //
2608 // ---
2609    fGeom->Gdtom(xd,xm,iflag);   
2610 }
2611 //______________________________________________________________________________
2612 void TFluka::SetMreg(Int_t l) 
2613 {
2614 // Set current fluka region
2615    fCurrentFlukaRegion = l;
2616    fGeom->SetMreg(l);
2617 }
2618
2619 // ===============================================================
2620 void TFluka::FutoTest() 
2621 {
2622     Int_t icode, mreg, newreg, particleId;
2623     Double_t rull, xsco, ysco, zsco;
2624     TLorentzVector position, momentum;
2625     icode = GetIcode();
2626     if (icode == 0) {
2627         if (fVerbosityLevel >=3)
2628             cout << " icode=" << icode << endl;
2629     } else if (icode > 0 && icode <= 5) {
2630 // mgdraw
2631         mreg = GetMreg();
2632         if (fVerbosityLevel >=3)
2633             cout << " icode=" << icode
2634                  << " mreg=" << mreg
2635                  << endl;
2636         TrackPosition(position);
2637         TrackMomentum(momentum);
2638         if (fVerbosityLevel >=3) {
2639             cout << "TLorentzVector positionX=" << position.X()
2640                  << "positionY=" << position.Y()
2641                  << "positionZ=" << position.Z()
2642                  << "timeT=" << position.T() << endl;
2643             cout << "TLorentzVector momentumX=" << momentum.X()
2644                  << "momentumY=" << momentum.Y()
2645                  << "momentumZ=" << momentum.Z()
2646                  << "energyE=" << momentum.E() << endl;
2647             cout << "TrackStep=" << TrackStep() << endl;
2648             cout << "TrackLength=" << TrackLength() << endl;
2649             cout << "TrackTime=" << TrackTime() << endl;
2650             cout << "Edep=" << Edep() << endl;
2651             cout << "TrackPid=" << TrackPid() << endl;
2652             cout << "TrackCharge=" << TrackCharge() << endl;
2653             cout << "TrackMass=" << TrackMass() << endl;
2654             cout << "Etot=" << Etot() << endl;
2655             cout << "IsNewTrack=" << IsNewTrack() << endl;
2656             cout << "IsTrackInside=" << IsTrackInside() << endl;
2657             cout << "IsTrackEntering=" << IsTrackEntering() << endl;
2658             cout << "IsTrackExiting=" << IsTrackExiting() << endl;
2659             cout << "IsTrackOut=" << IsTrackOut() << endl;
2660             cout << "IsTrackDisappeared=" << IsTrackDisappeared() << endl;
2661             cout << "IsTrackAlive=" << IsTrackAlive() << endl;
2662         }
2663         
2664         Float_t x = position.X();
2665         Float_t y = position.Y();
2666         Float_t z = position.Z();
2667         Float_t xm[3];
2668         Float_t xd[3];
2669         xm[0] = x; xm[1] = y; xm[2] = z;
2670         if (fVerbosityLevel >= 3)
2671             printf("Global trackPosition: %f %f %f \n", x, y, z);
2672         Gmtod(xm, xd, 1);
2673         if (fVerbosityLevel >= 3)
2674             printf("Local trackPosition: %f %f %f \n", xd[0], xd[1], xd[2]);
2675         Gdtom(xd, xm, 1);
2676         if (fVerbosityLevel >= 3)
2677             printf("New trackPosition: %f %f %f \n", xm[0], xm[1], xm[2]);
2678     } else if((icode >= 10 && icode <= 15) ||
2679               (icode >= 20 && icode <= 24) ||
2680               (icode >= 30 && icode <= 33) ||
2681               (icode >= 40 && icode <= 41) ||
2682               (icode >= 50 && icode <= 52)) {
2683 // endraw
2684         mreg = GetMreg();
2685         rull = GetRull();
2686         xsco = GetXsco();
2687         ysco = GetYsco();
2688         zsco = GetZsco();
2689         
2690         if (fVerbosityLevel >=3) {     
2691             cout << " icode=" << icode
2692                  << " mreg=" << mreg
2693                  << " rull=" << rull
2694                  << " xsco=" << xsco
2695                  << " ysco=" << ysco
2696                  << " zsco=" << zsco << endl;
2697         }
2698         TrackPosition(position);
2699         TrackMomentum(momentum);
2700         if (fVerbosityLevel >=3) {
2701             cout << "Edep=" << Edep() << endl;
2702             cout << "Etot=" << Etot() << endl;
2703             cout << "TrackPid=" << TrackPid() << endl;
2704             cout << "TrackCharge=" << TrackCharge() << endl;
2705             cout << "TrackMass=" << TrackMass() << endl;
2706             cout << "IsTrackOut=" << IsTrackOut() << endl;
2707             cout << "IsTrackDisappeared=" << IsTrackDisappeared() << endl;
2708             cout << "IsTrackStop=" << IsTrackStop() << endl;
2709             cout << "IsTrackAlive=" << IsTrackAlive() << endl;
2710         }
2711     } else if((icode >= 100 && icode <= 105) ||
2712               (icode == 208) ||
2713               (icode == 210) ||
2714               (icode == 212) ||
2715               (icode >= 214 && icode <= 215) ||
2716               (icode == 217) ||
2717               (icode == 219) ||
2718               (icode == 221) ||
2719               (icode == 225) ||
2720               (icode == 300) ||
2721               (icode == 400)) {
2722 // usdraw
2723           mreg = GetMreg();
2724           xsco = GetXsco();
2725           ysco = GetYsco();
2726           zsco = GetZsco();
2727           
2728           if (fVerbosityLevel >=3) {
2729               cout << " icode=" << icode
2730                    << " mreg=" << mreg
2731                    << " xsco=" << xsco
2732                    << " ysco=" << ysco
2733                    << " zsco=" << zsco << endl;
2734               cout << "TrackPid=" << TrackPid() << endl;
2735               cout << "NSecondaries=" << NSecondaries() << endl;
2736           }
2737           
2738           for (Int_t isec=0; isec< NSecondaries(); isec++) {
2739               TFluka::GetSecondary(isec, particleId, position, momentum);
2740               if (fVerbosityLevel >=3) {
2741                   cout << "TLorentzVector positionX=" << position.X()
2742                        << "positionY=" << position.Y()
2743                        << "positionZ=" << position.Z()
2744                        << "timeT=" << position.T() << endl;
2745                   cout << "TLorentzVector momentumX=" << momentum.X()
2746                        << "momentumY=" << momentum.Y()
2747                        << "momentumZ=" << momentum.Z()
2748                        << "energyE=" << momentum.E() << endl;
2749                   cout << "TrackPid=" << particleId << endl;
2750               }
2751           }
2752     } else if((icode == 19) ||
2753               (icode == 29) ||
2754               (icode == 39) ||
2755               (icode == 49) ||
2756               (icode == 59)) {
2757         mreg = GetMreg();
2758         newreg = GetNewreg();
2759         xsco = GetXsco();
2760         ysco = GetYsco();
2761         zsco = GetZsco();
2762         if (fVerbosityLevel >=3) {
2763             cout << " icode=" << icode
2764                  << " mreg=" << mreg
2765                  << " newreg=" << newreg
2766                  << " xsco=" << xsco
2767                  << " ysco=" << ysco
2768                  << " zsco=" << zsco << endl;
2769         }
2770     }
2771 } // end of FutoTest
2772