]> git.uio.no Git - u/mrichter/AliRoot.git/blame - TFluka/TFluka.cxx
Region to media mapping corrected and improved.
[u/mrichter/AliRoot.git] / TFluka / TFluka.cxx
CommitLineData
03ca248b 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/*
17$Log$
6d4d27f2 18Revision 1.7 2002/12/06 12:21:32 morsch
19User stepping methods added (E. Futo)
20
fa3d1cc7 21Revision 1.6 2002/11/21 18:40:06 iglez2
22Media handling added
23
27b2f7fe 24Revision 1.5 2002/11/07 17:59:10 iglez2
25Included the geometry through geant4_vmc/FLUGG
26
bf3aa28e 27Revision 1.4 2002/11/04 16:00:46 iglez2
28The conversion between ID and PDG now uses Fluka routines and arrays which is more consistent.
29
f9cb2fec 30Revision 1.3 2002/10/22 15:12:14 alibrary
31Introducing Riostream.h
32
eae0fe66 33Revision 1.2 2002/10/14 14:57:40 hristov
34Merging the VirtualMC branch to the main development branch (HEAD)
35
b9d0a01d 36Revision 1.1.2.8 2002/10/08 16:33:17 iglez2
37LSOUIT is set to true before the second call to flukam.
38
39Revision 1.1.2.7 2002/10/08 09:30:37 iglez2
40Solved stupid missing ;
41
42Revision 1.1.2.6 2002/10/07 13:40:22 iglez2
43First implementations of the PDG <--> Fluka Id conversion routines
44
45Revision 1.1.2.5 2002/09/26 16:26:03 iglez2
46Added verbosity
47Call to gAlice->Generator()->Generate()
48
49Revision 1.1.2.4 2002/09/26 13:22:23 iglez2
50Naive implementation of ProcessRun and ProcessEvent
51Opening/Closing of input file (fInputFileName) with FORTRAN unit 5 before/after the first call to flukam inside Init()
52
53Revision 1.1.2.3 2002/09/20 15:35:51 iglez2
54Modification of LFDRTR. Value is passed to FLUKA !!!
55
56Revision 1.1.2.2 2002/09/18 14:34:44 iglez2
57Revised version with all pure virtual methods implemented
58
59Revision 1.1.2.1 2002/07/24 08:49:41 alibrary
60Adding TFluka to VirtualMC
61
62Revision 1.1 2002/07/05 13:10:07 morsch
63First commit of Fluka interface.
64
03ca248b 65*/
66
eae0fe66 67#include <Riostream.h>
b9d0a01d 68
6d4d27f2 69#include "TClonesArray.h"
03ca248b 70#include "TFluka.h"
b9d0a01d 71#include "TCallf77.h" //For the fortran calls
72#include "Fdblprc.h" //(DBLPRC) fluka common
b9d0a01d 73#include "Fepisor.h" //(EPISOR) fluka common
fa3d1cc7 74#include "Ffinuc.h" //(FINUC) fluka common
75#include "Fiounit.h" //(IOUNIT) fluka common
76#include "Fpaprop.h" //(PAPROP) fluka common
f9cb2fec 77#include "Fpart.h" //(PART) fluka common
fa3d1cc7 78#include "Ftrackr.h" //(TRACKR) fluka common
6d4d27f2 79#include "Fpaprop.h" //(PAPROP) fluka common
fa3d1cc7 80#include "Ffheavy.h" //(FHEAVY) fluka common
b9d0a01d 81
fa3d1cc7 82#include "TVirtualMC.h"
bf3aa28e 83#include "TG4GeometryManager.h" //For the geometry management
84#include "TG4DetConstruction.h" //For the detector construction
85
86#include "FGeometryInit.hh"
fa3d1cc7 87#include "TLorentzVector.h"
6d4d27f2 88#include "FlukaVolume.h"
bf3aa28e 89
b9d0a01d 90// Fluka methods that may be needed.
91#ifndef WIN32
92# define flukam flukam_
93# define fluka_openinp fluka_openinp_
94# define fluka_closeinp fluka_closeinp_
f9cb2fec 95# define mcihad mcihad_
96# define mpdgha mpdgha_
b9d0a01d 97#else
98# define flukam FLUKAM
99# define fluka_openinp FLUKA_OPENINP
100# define fluka_closeinp FLUKA_CLOSEINP
f9cb2fec 101# define mcihad MCIHAD
102# define mpdgha MPDGHA
b9d0a01d 103#endif
104
105extern "C"
106{
107 //
108 // Prototypes for FLUKA functions
109 //
110 void type_of_call flukam(const int&);
111 void type_of_call fluka_openinp(const int&, DEFCHARA);
112 void type_of_call fluka_closeinp(const int&);
f9cb2fec 113 int type_of_call mcihad(const int&);
114 int type_of_call mpdgha(const int&);
b9d0a01d 115}
116
117//
118// Class implementation for ROOT
119//
03ca248b 120ClassImp(TFluka)
b9d0a01d 121
122//
bf3aa28e 123//----------------------------------------------------------------------------
124// TFluka constructors and destructors.
b9d0a01d 125//____________________________________________________________________________
126TFluka::TFluka()
127 :TVirtualMC(),
128 fVerbosityLevel(0),
bf3aa28e 129 fInputFileName(""),
27b2f7fe 130 fDetector(0),
131 fCurrentFlukaRegion(-1)
b9d0a01d 132{
133 //
134 // Default constructor
135 //
136}
137
b9d0a01d 138TFluka::TFluka(const char *title, Int_t verbosity)
139 :TVirtualMC("TFluka",title),
140 fVerbosityLevel(verbosity),
bf3aa28e 141 fInputFileName(""),
27b2f7fe 142 fDetector(0),
143 fCurrentFlukaRegion(-1)
b9d0a01d 144{
145 if (fVerbosityLevel >=3)
146 cout << "==> TFluka::TFluka(" << title << ") constructor called." << endl;
147
bf3aa28e 148
149 // create geometry manager
150 if (fVerbosityLevel >=2)
151 cout << "\t* Creating G4 Geometry manager..." << endl;
152 fGeometryManager = new TG4GeometryManager();
153 if (fVerbosityLevel >=2)
154 cout << "\t* Creating G4 Detector..." << endl;
155 fDetector = new TG4DetConstruction();
156 FGeometryInit* geominit = FGeometryInit::GetInstance();
157 if (geominit)
158 geominit->setDetConstruction(fDetector);
159 else {
160 cerr << "ERROR: Could not create FGeometryInit!" << endl;
161 cerr << " Exiting!!!" << endl;
162 abort();
163 }
164
b9d0a01d 165 if (fVerbosityLevel >=3)
166 cout << "<== TFluka::TFluka(" << title << ") constructor called." << endl;
6d4d27f2 167
168 fVolumeMediaMap = new TClonesArray("FlukaVolume",1000);
169 fNVolumes = 0;
170 fMediaByRegion = 0;
b9d0a01d 171}
172
bf3aa28e 173TFluka::~TFluka() {
174 if (fVerbosityLevel >=3)
175 cout << "==> TFluka::~TFluka() destructor called." << endl;
176
177 delete fGeometryManager;
6d4d27f2 178 fVolumeMediaMap->Delete();
179 delete fVolumeMediaMap;
180
bf3aa28e 181
182 if (fVerbosityLevel >=3)
183 cout << "<== TFluka::~TFluka() destructor called." << endl;
184}
185
186//
187//_____________________________________________________________________________
188// TFluka control methods
b9d0a01d 189//____________________________________________________________________________
190void TFluka::Init() {
191 if (fVerbosityLevel >=3)
192 cout << "==> TFluka::Init() called." << endl;
193
194 if (fVerbosityLevel >=2)
195 cout << "\t* Changing lfdrtr = (" << (GLOBAL.lfdrtr?'T':'F')
196 << ") in fluka..." << endl;
197 GLOBAL.lfdrtr = true;
198
199 if (fVerbosityLevel >=2)
200 cout << "\t* Opening file " << fInputFileName << endl;
201 const char* fname = fInputFileName;
202 fluka_openinp(lunin, PASSCHARA(fname));
203
204 if (fVerbosityLevel >=2)
205 cout << "\t* Calling flukam..." << endl;
bf3aa28e 206 flukam(1);
b9d0a01d 207
208 if (fVerbosityLevel >=2)
209 cout << "\t* Closing file " << fInputFileName << endl;
210 fluka_closeinp(lunin);
211
212 if (fVerbosityLevel >=3)
213 cout << "<== TFluka::Init() called." << endl;
fa3d1cc7 214
6d4d27f2 215 FinishGeometry();
216
b9d0a01d 217}
218
bf3aa28e 219void TFluka::FinishGeometry() {
6d4d27f2 220//
221// Build-up table with region to medium correspondance
222//
223 char tmp[5];
224
bf3aa28e 225 if (fVerbosityLevel >=3)
226 cout << "==> TFluka::FinishGeometry() called." << endl;
227
6d4d27f2 228// fGeometryManager->Ggclos();
bf3aa28e 229
6d4d27f2 230 FGeometryInit* flugg = FGeometryInit::GetInstance();
231
232 fMediaByRegion = new Int_t[fNVolumes+2];
233 for (Int_t i = 0; i < fNVolumes; i++)
234 {
235 FlukaVolume* vol = dynamic_cast<FlukaVolume*>((*fVolumeMediaMap)[i]);
236 TString volName = vol->GetName();
237 Int_t media = vol->GetMedium();
238 printf("Finish Geometry: volName, media %d %s %d \n", i, volName.Data(), media);
239 strcpy(tmp, volName.Data());
240 tmp[4] = '\0';
241 flugg->SetMediumFromName(tmp, media);
27b2f7fe 242 }
6d4d27f2 243
244 flugg->BuildMediaMap();
27b2f7fe 245
bf3aa28e 246 if (fVerbosityLevel >=3)
247 cout << "<== TFluka::FinishGeometry() called." << endl;
248}
249
250void TFluka::BuildPhysics() {
251 if (fVerbosityLevel >=3)
252 cout << "==> TFluka::BuildPhysics() called." << endl;
253
254
255 if (fVerbosityLevel >=3)
256 cout << "<== TFluka::BuildPhysics() called." << endl;
257}
258
b9d0a01d 259void TFluka::ProcessEvent() {
260 if (fVerbosityLevel >=3)
261 cout << "==> TFluka::ProcessEvent() called." << endl;
262
263 if (fVerbosityLevel >=3)
264 cout << "<== TFluka::ProcessEvent() called." << endl;
265}
266
bf3aa28e 267
b9d0a01d 268void TFluka::ProcessRun(Int_t nevent) {
269 if (fVerbosityLevel >=3)
270 cout << "==> TFluka::ProcessRun(" << nevent << ") called."
271 << endl;
272
273 if (fVerbosityLevel >=2) {
274 cout << "\t* GLOBAL.fdrtr = " << (GLOBAL.lfdrtr?'T':'F') << endl;
275 cout << "\t* Calling flukam again..." << endl;
276 }
277 fApplication->GeneratePrimaries();
278 EPISOR.lsouit = true;
bf3aa28e 279 flukam(1);
b9d0a01d 280
281 if (fVerbosityLevel >=3)
282 cout << "<== TFluka::ProcessRun(" << nevent << ") called."
283 << endl;
284}
285
bf3aa28e 286//_____________________________________________________________________________
287// methods for building/management of geometry
288//____________________________________________________________________________
289// functions from GCONS
290void TFluka::Gfmate(Int_t imat, char *name, Float_t &a, Float_t &z,
291 Float_t &dens, Float_t &radl, Float_t &absl,
292 Float_t* ubuf, Int_t& nbuf) {
293//
294 fGeometryManager->Gfmate(imat, name, a, z, dens, radl, absl, ubuf, nbuf);
295}
296
297void TFluka::Gfmate(Int_t imat, char *name, Double_t &a, Double_t &z,
298 Double_t &dens, Double_t &radl, Double_t &absl,
299 Double_t* ubuf, Int_t& nbuf) {
300//
301 fGeometryManager->Gfmate(imat, name, a, z, dens, radl, absl, ubuf, nbuf);
302}
303
304// detector composition
305void TFluka::Material(Int_t& kmat, const char* name, Double_t a,
306 Double_t z, Double_t dens, Double_t radl, Double_t absl,
307 Float_t* buf, Int_t nwbuf) {
308//
309 fGeometryManager
310 ->Material(kmat, name, a, z, dens, radl, absl, buf, nwbuf);
311}
312void TFluka::Material(Int_t& kmat, const char* name, Double_t a,
313 Double_t z, Double_t dens, Double_t radl, Double_t absl,
314 Double_t* buf, Int_t nwbuf) {
315//
316 fGeometryManager
317 ->Material(kmat, name, a, z, dens, radl, absl, buf, nwbuf);
318}
319
320void TFluka::Mixture(Int_t& kmat, const char *name, Float_t *a,
321 Float_t *z, Double_t dens, Int_t nlmat, Float_t *wmat) {
322//
323 fGeometryManager
324 ->Mixture(kmat, name, a, z, dens, nlmat, wmat);
325}
326void TFluka::Mixture(Int_t& kmat, const char *name, Double_t *a,
327 Double_t *z, Double_t dens, Int_t nlmat, Double_t *wmat) {
328//
329 fGeometryManager
330 ->Mixture(kmat, name, a, z, dens, nlmat, wmat);
331}
332
333void TFluka::Medium(Int_t& kmed, const char *name, Int_t nmat,
334 Int_t isvol, Int_t ifield, Double_t fieldm, Double_t tmaxfd,
335 Double_t stemax, Double_t deemax, Double_t epsil,
336 Double_t stmin, Float_t* ubuf, Int_t nbuf) {
337 //
338 fGeometryManager
339 ->Medium(kmed, name, nmat, isvol, ifield, fieldm, tmaxfd, stemax, deemax,
340 epsil, stmin, ubuf, nbuf);
341}
342void TFluka::Medium(Int_t& kmed, const char *name, Int_t nmat,
343 Int_t isvol, Int_t ifield, Double_t fieldm, Double_t tmaxfd,
344 Double_t stemax, Double_t deemax, Double_t epsil,
345 Double_t stmin, Double_t* ubuf, Int_t nbuf) {
346 //
347 fGeometryManager
348 ->Medium(kmed, name, nmat, isvol, ifield, fieldm, tmaxfd, stemax, deemax,
349 epsil, stmin, ubuf, nbuf);
350}
351
352void TFluka::Matrix(Int_t& krot, Double_t thetaX, Double_t phiX,
353 Double_t thetaY, Double_t phiY, Double_t thetaZ,
354 Double_t phiZ) {
355//
356 fGeometryManager
357 ->Matrix(krot, thetaX, phiX, thetaY, phiY, thetaZ, phiZ);
358}
359
360void TFluka::Gstpar(Int_t itmed, const char *param, Double_t parval) {
361//
362 fGeometryManager->Gstpar(itmed, param, parval);
363}
364
365// functions from GGEOM
366Int_t TFluka::Gsvolu(const char *name, const char *shape, Int_t nmed,
367 Float_t *upar, Int_t np) {
368//
6d4d27f2 369// fVolumeMediaMap[TString(name)] = nmed;
370 TClonesArray &lvols = *fVolumeMediaMap;
371 new(lvols[fNVolumes++])
372 FlukaVolume(name, nmed);
373 return fGeometryManager->Gsvolu(name, shape, nmed, upar, np);
bf3aa28e 374}
375Int_t TFluka::Gsvolu(const char *name, const char *shape, Int_t nmed,
376 Double_t *upar, Int_t np) {
377//
6d4d27f2 378 TClonesArray &lvols = *fVolumeMediaMap;
379 new(lvols[fNVolumes++])
380 FlukaVolume(name, nmed);
381
382 return fGeometryManager->Gsvolu(name, shape, nmed, upar, np);
bf3aa28e 383}
384
385void TFluka::Gsdvn(const char *name, const char *mother, Int_t ndiv,
386 Int_t iaxis) {
387//
6d4d27f2 388 fGeometryManager->Gsdvn(name, mother, ndiv, iaxis);
bf3aa28e 389}
390
391void TFluka::Gsdvn2(const char *name, const char *mother, Int_t ndiv,
392 Int_t iaxis, Double_t c0i, Int_t numed) {
393//
6d4d27f2 394 TClonesArray &lvols = *fVolumeMediaMap;
395 new(lvols[fNVolumes++])
396 FlukaVolume(name, numed);
397 fGeometryManager->Gsdvn2(name, mother, ndiv, iaxis, c0i, numed);
bf3aa28e 398}
399
400void TFluka::Gsdvt(const char *name, const char *mother, Double_t step,
401 Int_t iaxis, Int_t numed, Int_t ndvmx) {
6d4d27f2 402//
403 TClonesArray &lvols = *fVolumeMediaMap;
404 new(lvols[fNVolumes++])
405 FlukaVolume(name, numed);
406 fGeometryManager->Gsdvt(name, mother, step, iaxis, numed, ndvmx);
bf3aa28e 407}
408
409void TFluka::Gsdvt2(const char *name, const char *mother, Double_t step,
410 Int_t iaxis, Double_t c0, Int_t numed, Int_t ndvmx) {
411//
6d4d27f2 412 TClonesArray &lvols = *fVolumeMediaMap;
413 new(lvols[fNVolumes++])
414 FlukaVolume(name, numed);
415 fGeometryManager->Gsdvt2(name, mother, step, iaxis, c0, numed, ndvmx);
bf3aa28e 416}
417
418void TFluka::Gsord(const char *name, Int_t iax) {
419//
420 fGeometryManager->Gsord(name, iax);
421}
422
423void TFluka::Gspos(const char *name, Int_t nr, const char *mother,
424 Double_t x, Double_t y, Double_t z, Int_t irot,
425 const char *konly) {
426//
427 fGeometryManager->Gspos(name, nr, mother, x, y, z, irot, konly);
428}
429
430void TFluka::Gsposp(const char *name, Int_t nr, const char *mother,
431 Double_t x, Double_t y, Double_t z, Int_t irot,
432 const char *konly, Float_t *upar, Int_t np) {
433 //
434 fGeometryManager->Gsposp(name, nr, mother, x, y, z, irot, konly, upar, np);
435}
436void TFluka::Gsposp(const char *name, Int_t nr, const char *mother,
437 Double_t x, Double_t y, Double_t z, Int_t irot,
438 const char *konly, Double_t *upar, Int_t np) {
439 //
440 fGeometryManager->Gsposp(name, nr, mother, x, y, z, irot, konly, upar, np);
441}
442
443void TFluka::Gsbool(const char* onlyVolName, const char* manyVolName) {
444//
445 fGeometryManager->Gsbool(onlyVolName, manyVolName);
446}
447
448void TFluka::SetCerenkov(Int_t itmed, Int_t npckov, Float_t *ppckov,
449 Float_t *absco, Float_t *effic, Float_t *rindex) {
450//
451 fGeometryManager->SetCerenkov(itmed, npckov, ppckov, absco, effic, rindex);
452}
453void TFluka::SetCerenkov(Int_t itmed, Int_t npckov, Double_t *ppckov,
454 Double_t *absco, Double_t *effic, Double_t *rindex) {
455//
456 fGeometryManager->SetCerenkov(itmed, npckov, ppckov, absco, effic, rindex);
457}
458
459// Euclid
460void TFluka::WriteEuclid(const char* fileName, const char* topVol,
461 Int_t number, Int_t nlevel) {
462//
463 fGeometryManager->WriteEuclid(fileName, topVol, number, nlevel);
464}
465
466
467
27b2f7fe 468//_____________________________________________________________________________
469// methods needed by the stepping
470//____________________________________________________________________________
6d4d27f2 471
27b2f7fe 472Int_t TFluka::GetMedium() const {
6d4d27f2 473 FGeometryInit* flugg = FGeometryInit::GetInstance();
474 return flugg->GetMedium(fCurrentFlukaRegion);
27b2f7fe 475}
bf3aa28e 476
477
478
479//____________________________________________________________________________
480// ID <--> PDG transformations
b9d0a01d 481//_____________________________________________________________________________
482Int_t TFluka::IdFromPDG(Int_t pdg) const
483{
484 //
f9cb2fec 485 // Return Fluka code from PDG and pseudo ENDF code
486
487 // MCIHAD() goes from pdg to fluka internal.
488 Int_t intfluka = mcihad(pdg);
489 // KPTOIP array goes from internal to official
490 return GetFlukaKPTOIP(intfluka);
b9d0a01d 491}
492
b9d0a01d 493Int_t TFluka::PDGFromId(Int_t id) const
494{
495 //
f9cb2fec 496 // Return PDG code and pseudo ENDF code from Fluka code
b9d0a01d 497
f9cb2fec 498 //IPTOKP array goes from official to internal
499 Int_t intfluka = GetFlukaIPTOKP(id);
500 //MPKDHA() goes from internal to PDG
501 return mpdgha(intfluka);
502
b9d0a01d 503}
6d4d27f2 504<<<<<<< TFluka.cxx
505
506
507
508//_____________________________________________________________________________
509// methods for step management
510//____________________________________________________________________________
511//
512// dynamic properties
513//
514void TFluka::TrackPosition(TLorentzVector& position) const
515{
516// Return the current position in the master reference frame of the
517// track being transported
518// TRACKR.atrack = age of the particle
519// TRACKR.xtrack = x-position of the last point
520// TRACKR.ytrack = y-position of the last point
521// TRACKR.ztrack = z-position of the last point
522 position.SetX(TRACKR.xtrack[TRACKR.ntrack]);
523 position.SetY(TRACKR.ytrack[TRACKR.ntrack]);
524 position.SetZ(TRACKR.ztrack[TRACKR.ntrack]);
525 position.SetT(TRACKR.atrack);
526}
527
528void TFluka::TrackMomentum(TLorentzVector& momentum) const
529{
530// Return the direction and the momentum (GeV/c) of the track
531// currently being transported
532// TRACKR.ptrack = momentum of the particle (not always defined, if
533// < 0 must be obtained from etrack)
534// TRACKR.cx,y,ztrck = direction cosines of the current particle
535// TRACKR.etrack = total energy of the particle
536// TRACKR.jtrack = identity number of the particle
537// PAPROP.am[TRACKR.jtrack] = particle mass in gev
538 if (TRACKR.ptrack >= 0) {
539 momentum.SetPx(TRACKR.ptrack*TRACKR.cxtrck);
540 momentum.SetPy(TRACKR.ptrack*TRACKR.cytrck);
541 momentum.SetPz(TRACKR.ptrack*TRACKR.cztrck);
542 momentum.SetE(TRACKR.etrack);
543 return;
544 }
545 else {
546 Double_t p = sqrt(TRACKR.etrack*TRACKR.etrack - PAPROP.am[TRACKR.jtrack]*PAPROP.am[TRACKR.jtrack]);
547 momentum.SetPx(p*TRACKR.cxtrck);
548 momentum.SetPy(p*TRACKR.cytrck);
549 momentum.SetPz(p*TRACKR.cztrck);
550 momentum.SetE(TRACKR.etrack);
551 return;
552 }
553}
554
555Double_t TFluka::TrackStep() const
556{
557// Return the length in centimeters of the current step
558// TRACKR.ctrack = total curved path
559 return TRACKR.ctrack;
560}
561
562Double_t TFluka::TrackLength() const
563{
564// It is wrong
565// should be the sum of all steps starting from the beginning of the track
566// for the time being returns only the length in centimeters of the current step
567 return TRACKR.ctrack;
568}
569
570Double_t TFluka::TrackTime() const
571{
572// Return the current time of flight of the track being transported
573// TRACKR.atrack = age of the particle
574 return TRACKR.atrack;
575}
576
577Double_t TFluka::Edep() const
578{
579// Energy deposition
580// if TRACKR.ntrack = 0, TRACKR.mtrack = 0:
581// -->local energy deposition (the value and the point are not recorded in TRACKR)
582// but in the variable "rull" of the procedure "endraw.cxx"
583// if TRACKR.ntrack > 0, TRACKR.mtrack = 0:
584// -->no energy loss along the track
585// if TRACKR.ntrack > 0, TRACKR.mtrack > 0:
586// -->energy loss distributed along the track
587// TRACKR.dtrack = energy deposition of the jth deposition even
588 if (TRACKR.ntrack == 0 && TRACKR.mtrack == 0)
589 return fRull;
590 else {
591 Double_t sum = 0;
592 for ( Int_t j=0;j<TRACKR.mtrack;j++) {
593 sum +=TRACKR.dtrack[j];
594 }
595 return sum;
596 }
597}
598
599Int_t TFluka::TrackPid() const
600{
601// Return the id of the particle transported
602// TRACKR.jtrack = identity number of the particle
603 return PDGFromId(TRACKR.jtrack);
604}
605
606Double_t TFluka::TrackCharge() const
607{
608// Return charge of the track currently transported
609// PAPROP.ichrge = electric charge of the particle
610 return PAPROP.ichrge[TRACKR.jtrack+6];
611}
612
613Double_t TFluka::TrackMass() const
614{
615// PAPROP.am = particle mass in GeV
616 return PAPROP.am[TRACKR.jtrack+6];
617}
618
619Double_t TFluka::Etot() const
620{
621// TRACKR.etrack = total energy of the particle
622 return TRACKR.etrack;
623}
624
625//
626// track status
627//
628Bool_t TFluka::IsNewTrack() const
629{
630// ???????????????,
631// True if the track is not at the boundary of the current volume
632 return 0;
633}
634
635Bool_t TFluka::IsTrackInside() const
636{
637// True if the track is not at the boundary of the current volume
638// In Fluka a step is always inside one kind of material
639// If the step would go behind the region of one material,
640// it will be shortened to reach only the boundary.
641// Therefore IsTrackInside() is always true.
642 return 1;
643}
644
645Bool_t TFluka::IsTrackEntering() const
646{
647// True if this is the first step of the track in the current volume
648// Boundary- (X) crossing
649// Icode = 19: boundary crossing - call from Kaskad
650// Icode = 29: boundary crossing - call from Emfsco
651// Icode = 39: boundary crossing - call from Kasneu
652// Icode = 49: boundary crossing - call from Kashea
653// Icode = 59: boundary crossing - call from Kasoph
654 if (fIcode == 19 ||
655 fIcode == 29 ||
656 fIcode == 39 ||
657 fIcode == 49 ||
658 fIcode == 59) return 1;
659 else return 0;
660}
661
662Bool_t TFluka::IsTrackExiting() const
663{
664// True if this is the last step of the track in the current volume
665// Boundary- (X) crossing
666// Icode = 19: boundary crossing - call from Kaskad
667// Icode = 29: boundary crossing - call from Emfsco
668// Icode = 39: boundary crossing - call from Kasneu
669// Icode = 49: boundary crossing - call from Kashea
670// Icode = 59: boundary crossing - call from Kasoph
671 if (fIcode == 19 ||
672 fIcode == 29 ||
673 fIcode == 39 ||
674 fIcode == 49 ||
675 fIcode == 59) return 1;
676 else return 0;
677}
678
679Bool_t TFluka::IsTrackOut() const
680{
681// True if the track is out of the setup
682// means escape
683// Icode = 14: escape - call from Kaskad
684// Icode = 23: escape - call from Emfsco
685// Icode = 32: escape - call from Kasneu
686// Icode = 40: escape - call from Kashea
687// Icode = 51: escape - call from Kasoph
688 if (fIcode == 14 ||
689 fIcode == 23 ||
690 fIcode == 32 ||
691 fIcode == 40 ||
692 fIcode == 51) return 1;
693 else return 0;
694}
695
696Bool_t TFluka::IsTrackDisappeared() const
697{
698// means all inelastic interactions and decays
699// Icode = 11: inelastic interaction recoil - call from Kaskad
700 if (fIcode == 11) return 1;
701 else return 0;
702}
703
704Bool_t TFluka::IsTrackStop() const
705{
706// True if the track energy has fallen below the threshold
707// means stopped by signal or below energy threshold
708// Icode = 12: stopping particle - call from Kaskad
709// Icode = 15: time kill - call from Kaskad
710// Icode = 21: below threshold, iarg=1 - call from Emfsco
711// Icode = 22: below threshold, iarg=2 - call from Emfsco
712// Icode = 24: time kill - call from Emfsco
713// Icode = 31: below threshold - call from Kasneu
714// Icode = 33: time kill - call from Kasneu
715// Icode = 41: time kill - call from Kashea
716// Icode = 52: time kill - call from Kasoph
717 if (fIcode == 12 ||
718 fIcode == 15 ||
719 fIcode == 21 ||
720 fIcode == 22 ||
721 fIcode == 24 ||
722 fIcode == 31 ||
723 fIcode == 33 ||
724 fIcode == 41 ||
725 fIcode == 52) return 1;
726 else return 0;
727}
728
729Bool_t TFluka::IsTrackAlive() const
730{
731// means not disappeared or not out
732 if (IsTrackDisappeared() || IsTrackOut() ) return 0;
733 else return 1;
734}
735
736//
737// secondaries
738//
739
740//Int_t NSecondaries() const
741// Number of secondary particles generated in the current step
742//{
743// return FINUC.np;
744//}
745
746//void GetSecondary(Int_t isec, Int_t& particleId, TLorentzVector& position,
747// TLorentzVector& momentum)
748//
749//{
750// will come from FINUC when called from USDRAW
751//}
752
753//TMCProcess ProdProcess(Int_t isec) const
754// Name of the process that has produced the secondary particles
755// in the current step
756//{
757// will come from FINUC when called from USDRAW
758//}
759
760//Int_t StepProcesses(TArrayI &proc) const
761// Return processes active in the current step
762//{
763//ck = total energy of the particl ????????????????
764//}
765
766
767void TFluka::FutoTest() const
768{
769 Int_t icode, mreg, newreg, medium;
770 Double_t rull, xsco, ysco, zsco;
771 icode = GetIcode();
772 medium = -1;
773
774 if (icode == 0)
775 cout << " icode=" << icode << endl;
776 else if (icode > 0 && icode <= 5) {
777 mreg = GetMreg();
778 medium = GetMedium();
779 cout << " icode=" << icode
780 << " mreg=" << mreg
781 << " medium=" << medium
782 << endl;
783 }
784 else if (icode >= 10 && icode <= 15) {
785 mreg = GetMreg();
786 medium = GetMedium();
787 rull = GetRull();
788 xsco = GetXsco();
789 ysco = GetYsco();
790 zsco = GetZsco();
791 cout << " icode=" << icode
792 << " mreg=" << mreg
793 << " medium=" << medium
794 << " rull=" << rull
795 << " xsco=" << xsco
796 << " ysco=" << ysco
797 << " zsco=" << zsco << endl;
798 }
799 else if (icode >= 20 && icode <= 24) {
800 mreg = GetMreg();
801 medium = GetMedium();
802 rull = GetRull();
803 xsco = GetXsco();
804 ysco = GetYsco();
805 zsco = GetZsco();
806 cout << " icode=" << icode
807 << " mreg=" << mreg
808 << " medium=" << medium
809 << " rull=" << rull
810 << " xsco=" << xsco
811 << " ysco=" << ysco
812 << " zsco=" << zsco << endl;
813 }
814 else if (icode >= 30 && icode <= 33) {
815 mreg = GetMreg();
816 medium = GetMedium();
817 rull = GetRull();
818 xsco = GetXsco();
819 ysco = GetYsco();
820 zsco = GetZsco();
821 cout << " icode=" << icode
822 << " mreg=" << mreg
823 << " medium=" << medium
824 << " rull=" << rull
825 << " xsco=" << xsco
826 << " ysco=" << ysco
827 << " zsco=" << zsco << endl;
828 }
829 else if (icode >= 40 && icode <= 41) {
830 mreg = GetMreg();
831 medium = GetMedium();
832 rull = GetRull();
833 xsco = GetXsco();
834 ysco = GetYsco();
835 zsco = GetZsco();
836 cout << " icode=" << icode
837 << " mreg=" << mreg
838 << " medium=" << medium
839 << " rull=" << rull
840 << " xsco=" << xsco
841 << " ysco=" << ysco
842 << " zsco=" << zsco << endl;
843 }
844 else if (icode >= 50 && icode <= 52) {
845 mreg = GetMreg();
846 medium = GetMedium();
847 rull = GetRull();
848 xsco = GetXsco();
849 ysco = GetYsco();
850 zsco = GetZsco();
851 cout << " icode=" << icode
852 << " mreg=" << mreg
853 << " medium=" << medium
854 << " rull=" << rull
855 << " xsco=" << xsco
856 << " ysco=" << ysco
857 << " zsco=" << zsco << endl;
858 }
859 else if (icode >= 100 && icode <= 105) {
860 mreg = GetMreg();
861 medium = GetMedium();
862 xsco = GetXsco();
863 ysco = GetYsco();
864 zsco = GetZsco();
865 cout << " icode=" << icode
866 << " mreg=" << mreg
867 << " medium=" << medium
868 << " xsco=" << xsco
869 << " ysco=" << ysco
870 << " zsco=" << zsco << endl;
871 }
872 else if (icode == 208) {
873 mreg = GetMreg();
874 medium = GetMedium();
875 xsco = GetXsco();
876 ysco = GetYsco();
877 zsco = GetZsco();
878 cout << " icode=" << icode
879 << " mreg=" << mreg
880 << " medium=" << medium
881 << " xsco=" << xsco
882 << " ysco=" << ysco
883 << " zsco=" << zsco << endl;
884 }
885 else if (icode == 210) {
886 mreg = GetMreg();
887 medium = GetMedium();
888 xsco = GetXsco();
889 ysco = GetYsco();
890 zsco = GetZsco();
891 cout << " icode=" << icode
892 << " mreg=" << mreg
893 << " medium=" << medium
894 << " xsco=" << xsco
895 << " ysco=" << ysco
896 << " zsco=" << zsco << endl;
897 }
898 else if (icode == 212) {
899 mreg = GetMreg();
900 medium = GetMedium();
901 xsco = GetXsco();
902 ysco = GetYsco();
903 zsco = GetZsco();
904 cout << " icode=" << icode
905 << " mreg=" << mreg
906 << " medium=" << medium
907 << " xsco=" << xsco
908 << " ysco=" << ysco
909 << " zsco=" << zsco << endl;
910 }
911 else if (icode >= 214 && icode <= 215) {
912 mreg = GetMreg();
913 medium = GetMedium();
914 xsco = GetXsco();
915 ysco = GetYsco();
916 zsco = GetZsco();
917 cout << " icode=" << icode
918 << " mreg=" << mreg
919 << " medium=" << medium
920 << " xsco=" << xsco
921 << " ysco=" << ysco
922 << " zsco=" << zsco << endl;
923 }
924 else if (icode == 217) {
925 mreg = GetMreg();
926 medium = GetMedium();
927 xsco = GetXsco();
928 ysco = GetYsco();
929 zsco = GetZsco();
930 cout << " icode=" << icode
931 << " mreg=" << mreg
932 << " medium=" << medium
933 << " xsco=" << xsco
934 << " ysco=" << ysco
935 << " zsco=" << zsco << endl;
936 }
937 else if (icode == 219) {
938 mreg = GetMreg();
939 medium = GetMedium();
940 xsco = GetXsco();
941 ysco = GetYsco();
942 zsco = GetZsco();
943 cout << " icode=" << icode
944 << " mreg=" << mreg
945 << " medium=" << medium
946 << " xsco=" << xsco
947 << " ysco=" << ysco
948 << " zsco=" << zsco << endl;
949 }
950 else if (icode == 221) {
951 mreg = GetMreg();
952 medium = GetMedium();
953 xsco = GetXsco();
954 ysco = GetYsco();
955 zsco = GetZsco();
956 cout << " icode=" << icode
957 << " mreg=" << mreg
958 << " medium=" << medium
959 << " xsco=" << xsco
960 << " ysco=" << ysco
961 << " zsco=" << zsco << endl;
962 }
963 else if (icode == 225) {
964 mreg = GetMreg();
965 medium = GetMedium();
966 xsco = GetXsco();
967 ysco = GetYsco();
968 zsco = GetZsco();
969 cout << " icode=" << icode
970 << " mreg=" << mreg
971 << " medium=" << medium
972 << " xsco=" << xsco
973 << " ysco=" << ysco
974 << " zsco=" << zsco << endl;
975 }
976 else if (icode == 300) {
977 mreg = GetMreg();
978 medium = GetMedium();
979 xsco = GetXsco();
980 ysco = GetYsco();
981 zsco = GetZsco();
982 cout << " icode=" << icode
983 << " mreg=" << mreg
984 << " medium=" << medium
985 << " xsco=" << xsco
986 << " ysco=" << ysco
987 << " zsco=" << zsco << endl;
988 }
989 else if (icode == 400) {
990 mreg = GetMreg();
991 medium = GetMedium();
992 xsco = GetXsco();
993 ysco = GetYsco();
994 zsco = GetZsco();
995 cout << " icode=" << icode
996 << " mreg=" << mreg
997 << " medium=" << medium
998 << " xsco=" << xsco
999 << " ysco=" << ysco
1000 << " zsco=" << zsco << endl;
1001 }
1002 else if (icode == 19) {
1003 mreg = GetMreg();
1004 medium = GetMedium();
1005 newreg = GetNewreg();
1006 xsco = GetXsco();
1007 ysco = GetYsco();
1008 zsco = GetZsco();
1009 cout << " icode=" << icode
1010 << " mreg=" << mreg
1011 << " medium=" << medium
1012 << " newreg=" << newreg
1013 << " xsco=" << xsco
1014 << " ysco=" << ysco
1015 << " zsco=" << zsco << endl;
1016 }
1017 else if (icode == 29) {
1018 mreg = GetMreg();
1019 medium = GetMedium();
1020 newreg = GetNewreg();
1021 xsco = GetXsco();
1022 ysco = GetYsco();
1023 zsco = GetZsco();
1024 cout << " icode=" << icode
1025 << " mreg=" << mreg
1026 << " medium=" << medium
1027 << " newreg=" << newreg
1028 << " xsco=" << xsco
1029 << " ysco=" << ysco
1030 << " zsco=" << zsco << endl;
1031 }
1032 else if (icode == 39) {
1033 mreg = GetMreg();
1034 medium = GetMedium();
1035 newreg = GetNewreg();
1036 xsco = GetXsco();
1037 ysco = GetYsco();
1038 zsco = GetZsco();
1039 cout << " icode=" << icode
1040 << " mreg=" << mreg
1041 << " medium=" << medium
1042 << " newreg=" << newreg
1043 << " xsco=" << xsco
1044 << " ysco=" << ysco
1045 << " zsco=" << zsco << endl;
1046 }
1047 else if (icode == 49) {
1048 mreg = GetMreg();
1049 medium = GetMedium();
1050 newreg = GetNewreg();
1051 xsco = GetXsco();
1052 ysco = GetYsco();
1053 zsco = GetZsco();
1054 cout << " icode=" << icode
1055 << " mreg=" << mreg
1056 << " medium=" << medium
1057 << " newreg=" << newreg
1058 << " xsco=" << xsco
1059 << " ysco=" << ysco
1060 << " zsco=" << zsco << endl;
1061 }
1062 else if (icode == 59) {
1063 mreg = GetMreg();
1064 medium = GetMedium();
1065 newreg = GetNewreg();
1066 xsco = GetXsco();
1067 ysco = GetYsco();
1068 zsco = GetZsco();
1069 cout << " icode=" << icode
1070 << " mreg=" << mreg
1071 << " medium=" << medium
1072 << " newreg=" << newreg
1073 << " xsco=" << xsco
1074 << " ysco=" << ysco
1075 << " zsco=" << zsco << endl;
1076 }
1077
1078
1079} // end of FutoTest
1080
1081=======
fa3d1cc7 1082
1083
1084
1085//_____________________________________________________________________________
1086// methods for step management
1087//____________________________________________________________________________
1088//
1089// dynamic properties
1090//
1091void TFluka::TrackPosition(TLorentzVector& position) const
1092{
1093// Return the current position in the master reference frame of the
1094// track being transported
1095// TRACKR.atrack = age of the particle
1096// TRACKR.xtrack = x-position of the last point
1097// TRACKR.ytrack = y-position of the last point
1098// TRACKR.ztrack = z-position of the last point
1099 position.SetX(TRACKR.xtrack[TRACKR.ntrack]);
1100 position.SetY(TRACKR.ytrack[TRACKR.ntrack]);
1101 position.SetZ(TRACKR.ztrack[TRACKR.ntrack]);
1102 position.SetT(TRACKR.atrack);
1103}
1104
1105void TFluka::TrackMomentum(TLorentzVector& momentum) const
1106{
1107// Return the direction and the momentum (GeV/c) of the track
1108// currently being transported
1109// TRACKR.ptrack = momentum of the particle (not always defined, if
1110// < 0 must be obtained from etrack)
1111// TRACKR.cx,y,ztrck = direction cosines of the current particle
1112// TRACKR.etrack = total energy of the particle
1113// TRACKR.jtrack = identity number of the particle
1114// PAPROP.am[TRACKR.jtrack] = particle mass in gev
1115 if (TRACKR.ptrack >= 0) {
1116 momentum.SetPx(TRACKR.ptrack*TRACKR.cxtrck);
1117 momentum.SetPy(TRACKR.ptrack*TRACKR.cytrck);
1118 momentum.SetPz(TRACKR.ptrack*TRACKR.cztrck);
1119 momentum.SetE(TRACKR.etrack);
1120 return;
1121 }
1122 else {
1123 Double_t p = sqrt(TRACKR.etrack*TRACKR.etrack - PAPROP.am[TRACKR.jtrack]*PAPROP.am[TRACKR.jtrack]);
1124 momentum.SetPx(p*TRACKR.cxtrck);
1125 momentum.SetPy(p*TRACKR.cytrck);
1126 momentum.SetPz(p*TRACKR.cztrck);
1127 momentum.SetE(TRACKR.etrack);
1128 return;
1129 }
1130}
1131
1132Double_t TFluka::TrackStep() const
1133{
1134// Return the length in centimeters of the current step
1135// TRACKR.ctrack = total curved path
1136 return TRACKR.ctrack;
1137}
1138
1139Double_t TFluka::TrackLength() const
1140{
1141// It is wrong
1142// should be the sum of all steps starting from the beginning of the track
1143// for the time being returns only the length in centimeters of the current step
1144 return TRACKR.ctrack;
1145}
1146
1147Double_t TFluka::TrackTime() const
1148{
1149// Return the current time of flight of the track being transported
1150// TRACKR.atrack = age of the particle
1151 return TRACKR.atrack;
1152}
1153
1154Double_t TFluka::Edep() const
1155{
1156// Energy deposition
1157// if TRACKR.ntrack = 0, TRACKR.mtrack = 0:
1158// -->local energy deposition (the value and the point are not recorded in TRACKR)
1159// but in the variable "rull" of the procedure "endraw.cxx"
1160// if TRACKR.ntrack > 0, TRACKR.mtrack = 0:
1161// -->no energy loss along the track
1162// if TRACKR.ntrack > 0, TRACKR.mtrack > 0:
1163// -->energy loss distributed along the track
1164// TRACKR.dtrack = energy deposition of the jth deposition even
1165 if (TRACKR.ntrack == 0 && TRACKR.mtrack == 0)
1166 return fRull;
1167 else {
1168 Double_t sum = 0;
1169 for ( Int_t j=0;j<TRACKR.mtrack;j++) {
1170 sum +=TRACKR.dtrack[j];
1171 }
1172 return sum;
1173 }
1174}
1175
1176Int_t TFluka::TrackPid() const
1177{
1178// Return the id of the particle transported
1179// TRACKR.jtrack = identity number of the particle
1180 return PDGFromId(TRACKR.jtrack);
1181}
1182
1183Double_t TFluka::TrackCharge() const
1184{
1185// Return charge of the track currently transported
1186// PAPROP.ichrge = electric charge of the particle
1187 return PAPROP.ichrge[TRACKR.jtrack+6];
1188}
1189
1190Double_t TFluka::TrackMass() const
1191{
1192// PAPROP.am = particle mass in GeV
1193 return PAPROP.am[TRACKR.jtrack+6];
1194}
1195
1196Double_t TFluka::Etot() const
1197{
1198// TRACKR.etrack = total energy of the particle
1199 return TRACKR.etrack;
1200}
1201
1202//
1203// track status
1204//
1205Bool_t TFluka::IsNewTrack() const
1206{
1207// ???????????????,
1208// True if the track is not at the boundary of the current volume
1209// Not true in some cases in bxdraw - to be solved
1210 return 1;
1211}
1212
1213Bool_t TFluka::IsTrackInside() const
1214{
1215// True if the track is not at the boundary of the current volume
1216// In Fluka a step is always inside one kind of material
1217// If the step would go behind the region of one material,
1218// it will be shortened to reach only the boundary.
1219// Therefore IsTrackInside() is always true.
1220// Not true in some cases in bxdraw - to be solved
1221 return 1;
1222}
1223
1224Bool_t TFluka::IsTrackEntering() const
1225{
1226// True if this is the first step of the track in the current volume
1227// Boundary- (X) crossing
1228// Icode = 19: boundary crossing - call from Kaskad
1229// Icode = 29: boundary crossing - call from Emfsco
1230// Icode = 39: boundary crossing - call from Kasneu
1231// Icode = 49: boundary crossing - call from Kashea
1232// Icode = 59: boundary crossing - call from Kasoph
1233 if (fIcode == 19 ||
1234 fIcode == 29 ||
1235 fIcode == 39 ||
1236 fIcode == 49 ||
1237 fIcode == 59) return 1;
1238 else return 0;
1239}
1240
1241Bool_t TFluka::IsTrackExiting() const
1242{
1243// True if this is the last step of the track in the current volume
1244// Boundary- (X) crossing
1245// Icode = 19: boundary crossing - call from Kaskad
1246// Icode = 29: boundary crossing - call from Emfsco
1247// Icode = 39: boundary crossing - call from Kasneu
1248// Icode = 49: boundary crossing - call from Kashea
1249// Icode = 59: boundary crossing - call from Kasoph
1250 if (fIcode == 19 ||
1251 fIcode == 29 ||
1252 fIcode == 39 ||
1253 fIcode == 49 ||
1254 fIcode == 59) return 1;
1255 else return 0;
1256}
1257
1258Bool_t TFluka::IsTrackOut() const
1259{
1260// True if the track is out of the setup
1261// means escape
1262// Icode = 14: escape - call from Kaskad
1263// Icode = 23: escape - call from Emfsco
1264// Icode = 32: escape - call from Kasneu
1265// Icode = 40: escape - call from Kashea
1266// Icode = 51: escape - call from Kasoph
1267 if (fIcode == 14 ||
1268 fIcode == 23 ||
1269 fIcode == 32 ||
1270 fIcode == 40 ||
1271 fIcode == 51) return 1;
1272 else return 0;
1273}
1274
1275Bool_t TFluka::IsTrackDisappeared() const
1276{
1277// means all inelastic interactions and decays
1278// fIcode from usdraw
1279 if (fIcode == 101 || // inelastic interaction
1280 fIcode == 102 || // particle decay
1281 fIcode == 214 || // in-flight annihilation
1282 fIcode == 215 || // annihilation at rest
1283 fIcode == 217 || // pair production
1284 fIcode == 221) return 1;
1285 else return 0;
1286}
1287
1288Bool_t TFluka::IsTrackStop() const
1289{
1290// True if the track energy has fallen below the threshold
1291// means stopped by signal or below energy threshold
1292// Icode = 12: stopping particle - call from Kaskad
1293// Icode = 15: time kill - call from Kaskad
1294// Icode = 21: below threshold, iarg=1 - call from Emfsco
1295// Icode = 22: below threshold, iarg=2 - call from Emfsco
1296// Icode = 24: time kill - call from Emfsco
1297// Icode = 31: below threshold - call from Kasneu
1298// Icode = 33: time kill - call from Kasneu
1299// Icode = 41: time kill - call from Kashea
1300// Icode = 52: time kill - call from Kasoph
1301 if (fIcode == 12 ||
1302 fIcode == 15 ||
1303 fIcode == 21 ||
1304 fIcode == 22 ||
1305 fIcode == 24 ||
1306 fIcode == 31 ||
1307 fIcode == 33 ||
1308 fIcode == 41 ||
1309 fIcode == 52) return 1;
1310 else return 0;
1311}
1312
1313Bool_t TFluka::IsTrackAlive() const
1314{
1315// means not disappeared or not out
1316 if (IsTrackDisappeared() || IsTrackOut() ) return 0;
1317 else return 1;
1318}
1319
1320//
1321// secondaries
1322//
1323
1324Int_t TFluka::NSecondaries() const
1325// Number of secondary particles generated in the current step
1326// fIcode = 100 = elastic interaction
1327// fIcode = 101 = inelastic interaction
1328// fIcode = 102 = particle decay
1329// fIcode = 103 = delta ray
1330// fIcode = 104 = pair production
1331// fIcode = 105 = bremsstrahlung
1332{
1333 if (fIcode >= 100 && fIcode <= 105)
1334 return FINUC.np + FHEAVY.npheav;
1335 else
1336 return -1;
1337}
1338
1339void TFluka::GetSecondary(Int_t isec, Int_t& particleId,
1340 TLorentzVector& position, TLorentzVector& momentum)
1341//
1342// fIcode = 100 = elastic interaction
1343// fIcode = 101 = inelastic interaction
1344// fIcode = 102 = particle decay
1345// fIcode = 103 = delta ray
1346// fIcode = 104 = pair production
1347// fIcode = 105 = bremsstrahlung
1348{
1349 if (fIcode >= 100 && fIcode <= 105) {
1350 if (isec >= 0 && isec < FINUC.np) {
1351 particleId = PDGFromId(FINUC.kpart[isec]);
1352 position.SetX(fXsco);
1353 position.SetY(fYsco);
1354 position.SetZ(fZsco);
1355 position.SetT(FINUC.agesec[isec]);
1356 momentum.SetPx(FINUC.plr[isec]*FINUC.cxr[isec]);
1357 momentum.SetPy(FINUC.plr[isec]*FINUC.cyr[isec]);
1358 momentum.SetPz(FINUC.plr[isec]*FINUC.czr[isec]);
1359 momentum.SetE(FINUC.tki[isec] + PAPROP.am[FINUC.kpart[isec]+6]);
1360 }
1361 if (isec >= FINUC.np && isec < FINUC.np + FHEAVY.npheav) {
1362 Int_t jsec = isec - FINUC.np;
1363 particleId = FHEAVY.kheavy[jsec]; // this is Fluka id !!!
1364 position.SetX(fXsco);
1365 position.SetY(fYsco);
1366 position.SetZ(fZsco);
1367 position.SetT(FHEAVY.agheav[jsec]);
1368 momentum.SetPx(FHEAVY.pheavy[jsec]*FHEAVY.cxheav[jsec]);
1369 momentum.SetPy(FHEAVY.pheavy[jsec]*FHEAVY.cyheav[jsec]);
1370 momentum.SetPz(FHEAVY.pheavy[jsec]*FHEAVY.czheav[jsec]);
1371 if (FHEAVY.tkheav[jsec] >= 3 && FHEAVY.tkheav[jsec] <= 6)
1372 momentum.SetE(FHEAVY.tkheav[jsec] + PAPROP.am[jsec+6]);
1373 else if (FHEAVY.tkheav[jsec] > 6)
1374 momentum.SetE(FHEAVY.tkheav[jsec] + FHEAVY.amnhea[jsec]); // to be checked !!!
1375 }
1376 }
1377}
1378
1379//TMCProcess ProdProcess(Int_t isec) const
1380// Name of the process that has produced the secondary particles
1381// in the current step
1382//{
1383// will come from FINUC when called from USDRAW
1384//}
1385
1386//Int_t StepProcesses(TArrayI &proc) const
1387// Return processes active in the current step
1388//{
1389//ck = total energy of the particl ????????????????
1390//}
1391
1392
1393// ===============================================================
1394void TFluka::FutoTest()
1395{
1396 Int_t icode, mreg, newreg, particleId;
1397// Int_t medium;
1398 Double_t rull, xsco, ysco, zsco;
1399 TLorentzVector position, momentum;
1400 icode = GetIcode();
1401 if (icode == 0) {
1402 cout << " icode=" << icode << endl;
1403 /*
1404 cout << "TLorentzVector positionX=" << position.X()
1405 << "positionY=" << position.Y()
1406 << "positionZ=" << position.Z()
1407 << "timeT=" << position.T() << endl;
1408 cout << "TLorentzVector momentumX=" << momentum.X()
1409 << "momentumY=" << momentum.Y()
1410 << "momentumZ=" << momentum.Z()
1411 << "energyE=" << momentum.E() << endl;
1412 cout << "TrackPid=" << TrackPid() << endl;
1413 */
1414 }
1415
1416 else if (icode > 0 && icode <= 5) {
1417// mgdraw
1418 mreg = GetMreg();
1419// medium = GetMedium();
1420 cout << " icode=" << icode
1421 << " mreg=" << mreg
1422// << " medium=" << medium
1423 << endl;
1424 TrackPosition(position);
1425 TrackMomentum(momentum);
1426 cout << "TLorentzVector positionX=" << position.X()
1427 << "positionY=" << position.Y()
1428 << "positionZ=" << position.Z()
1429 << "timeT=" << position.T() << endl;
1430 cout << "TLorentzVector momentumX=" << momentum.X()
1431 << "momentumY=" << momentum.Y()
1432 << "momentumZ=" << momentum.Z()
1433 << "energyE=" << momentum.E() << endl;
1434 cout << "TrackStep=" << TrackStep() << endl;
1435 cout << "TrackLength=" << TrackLength() << endl;
1436 cout << "TrackTime=" << TrackTime() << endl;
1437 cout << "Edep=" << Edep() << endl;
1438 cout << "TrackPid=" << TrackPid() << endl;
1439 cout << "TrackCharge=" << TrackCharge() << endl;
1440 cout << "TrackMass=" << TrackMass() << endl;
1441 cout << "Etot=" << Etot() << endl;
1442 cout << "IsNewTrack=" << IsNewTrack() << endl;
1443 cout << "IsTrackInside=" << IsTrackInside() << endl;
1444 cout << "IsTrackEntering=" << IsTrackEntering() << endl;
1445 cout << "IsTrackExiting=" << IsTrackExiting() << endl;
1446 cout << "IsTrackOut=" << IsTrackOut() << endl;
1447 cout << "IsTrackDisappeared=" << IsTrackDisappeared() << endl;
1448 cout << "IsTrackAlive=" << IsTrackAlive() << endl;
1449 }
1450
1451 else if((icode >= 10 && icode <= 15) ||
1452 (icode >= 20 && icode <= 24) ||
1453 (icode >= 30 && icode <= 33) ||
1454 (icode >= 40 && icode <= 41) ||
1455 (icode >= 50 && icode <= 52)) {
1456// endraw
1457 mreg = GetMreg();
1458// medium = GetMedium();
1459 rull = GetRull();
1460 xsco = GetXsco();
1461 ysco = GetYsco();
1462 zsco = GetZsco();
1463 cout << " icode=" << icode
1464 << " mreg=" << mreg
1465// << " medium=" << medium
1466 << " rull=" << rull
1467 << " xsco=" << xsco
1468 << " ysco=" << ysco
1469 << " zsco=" << zsco << endl;
1470 TrackPosition(position);
1471 TrackMomentum(momentum);
1472 cout << "Edep=" << Edep() << endl;
1473 cout << "Etot=" << Etot() << endl;
1474 cout << "TrackPid=" << TrackPid() << endl;
1475 cout << "TrackCharge=" << TrackCharge() << endl;
1476 cout << "TrackMass=" << TrackMass() << endl;
1477 cout << "IsTrackOut=" << IsTrackOut() << endl;
1478 cout << "IsTrackDisappeared=" << IsTrackDisappeared() << endl;
1479 cout << "IsTrackStop=" << IsTrackStop() << endl;
1480 cout << "IsTrackAlive=" << IsTrackAlive() << endl;
1481 }
1482
1483 else if((icode >= 100 && icode <= 105) ||
1484 (icode == 208) ||
1485 (icode == 210) ||
1486 (icode == 212) ||
1487 (icode >= 214 && icode <= 215) ||
1488 (icode == 217) ||
1489 (icode == 219) ||
1490 (icode == 221) ||
1491 (icode == 225) ||
1492 (icode == 300) ||
1493 (icode == 400)) {
1494// usdraw
1495 mreg = GetMreg();
1496// medium = GetMedium();
1497 xsco = GetXsco();
1498 ysco = GetYsco();
1499 zsco = GetZsco();
1500 cout << " icode=" << icode
1501 << " mreg=" << mreg
1502// << " medium=" << medium
1503 << " xsco=" << xsco
1504 << " ysco=" << ysco
1505 << " zsco=" << zsco << endl;
1506 cout << "TrackPid=" << TrackPid() << endl;
1507 cout << "NSecondaries=" << NSecondaries() << endl;
1508 for (Int_t isec=0; isec< NSecondaries(); isec++) {
1509//void TFluka::GetSecondary(Int_t isec, Int_t& particleId,
1510// TLorentzVector& position, TLorentzVector& momentum)
1511 TFluka::GetSecondary(isec, particleId, position, momentum);
1512 cout << "TLorentzVector positionX=" << position.X()
1513 << "positionY=" << position.Y()
1514 << "positionZ=" << position.Z()
1515 << "timeT=" << position.T() << endl;
1516 cout << "TLorentzVector momentumX=" << momentum.X()
1517 << "momentumY=" << momentum.Y()
1518 << "momentumZ=" << momentum.Z()
1519 << "energyE=" << momentum.E() << endl;
1520 cout << "TrackPid=" << particleId << endl;
1521
1522 }
1523 }
1524
1525 else if((icode == 19) ||
1526 (icode == 29) ||
1527 (icode == 39) ||
1528 (icode == 49) ||
1529 (icode == 59)) {
1530 mreg = GetMreg();
1531// medium = GetMedium();
1532 newreg = GetNewreg();
1533 xsco = GetXsco();
1534 ysco = GetYsco();
1535 zsco = GetZsco();
1536 cout << " icode=" << icode
1537 << " mreg=" << mreg
1538// << " medium=" << medium
1539 << " newreg=" << newreg
1540 << " xsco=" << xsco
1541 << " ysco=" << ysco
1542 << " zsco=" << zsco << endl;
1543 }
1544//
1545// ====================================================================
1546//
1547
1548
1549
1550} // end of FutoTest