1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
18 Revision 1.40 2000/12/06 10:06:58 morsch
19 Add all D and B baryons produced by HIJING to PDG DataBase.
21 Revision 1.39 2000/11/30 07:12:54 alibrary
22 Introducing new Rndm and QA classes
24 Revision 1.38 2000/10/30 15:19:06 morsch
25 Xi(b) (pdg code 5232) added to Pdg data base.
27 Revision 1.37 2000/10/02 21:28:16 fca
28 Removal of useless dependecies via forward declarations
30 Revision 1.36 2000/09/14 07:08:41 fca
31 Introducing glvolu in the interface
33 Revision 1.35 2000/09/12 14:27:10 morsch
34 No instance of AliDecayer created to initialize fDecayer.
36 Revision 1.34 2000/09/07 12:12:01 morsch
37 Comment inside comment removed.
39 Revision 1.33 2000/09/06 16:03:42 morsch
40 Set ExternalDecayer, Decayer and SetForceDecay methods added.
41 Gspart calls for charmed and bottom hadrons added.
42 Decay mode definitions for charmed and beauty hadrons have been taken out.
43 They will be handled by an external decayer.
45 Revision 1.32 2000/08/24 16:28:53 hristov
46 TGeant3::IsNewTrack corrected by F.Carminati
48 Revision 1.31 2000/07/13 16:19:10 fca
49 Mainly coding conventions + some small bug fixes
51 Revision 1.30 2000/07/12 08:56:30 fca
52 Coding convention correction and warning removal
54 Revision 1.29 2000/07/11 18:24:59 fca
55 Coding convention corrections + few minor bug fixes
57 Revision 1.28 2000/06/29 10:51:55 morsch
58 Add some charmed and bottom baryons to the particle list (TDatabasePDG). This
59 is needed by Hijing. Should be part of a future review of TDatabasePDG.
61 Revision 1.27 2000/06/21 17:40:15 fca
62 Adding possibility to set ISTRA, PAI model
64 Revision 1.26 2000/05/16 13:10:41 fca
65 New method IsNewTrack and fix for a problem in Father-Daughter relations
67 Revision 1.25 2000/04/07 11:12:35 fca
68 G4 compatibility changes
70 Revision 1.24 2000/02/28 21:03:57 fca
71 Some additions to improve the compatibility with G4
73 Revision 1.23 2000/02/23 16:25:25 fca
74 AliVMC and AliGeant3 classes introduced
75 ReadEuclid moved from AliRun to AliModule
77 Revision 1.22 2000/01/18 15:40:13 morsch
78 Interface to GEANT3 routines GFTMAT, GBRELM and GPRELM added
79 Define geant particle type 51: Feedback Photon with Cherenkov photon properties.
81 Revision 1.21 2000/01/17 19:41:17 fca
84 Revision 1.20 2000/01/12 11:29:27 fca
87 Revision 1.19 1999/12/17 09:03:12 fca
88 Introduce a names array
90 Revision 1.18 1999/11/26 16:55:39 fca
91 Reimplement CurrentVolName() to avoid memory leaks
93 Revision 1.17 1999/11/03 16:58:28 fca
94 Correct source of address violation in creating character string
96 Revision 1.16 1999/11/03 13:17:08 fca
97 Have ProdProcess return const char*
99 Revision 1.15 1999/10/26 06:04:50 fca
100 Introduce TLorentzVector in AliMC::GetSecondary. Thanks to I.Hrivnacova
102 Revision 1.14 1999/09/29 09:24:30 fca
103 Introduction of the Copyright and cvs Log
107 ///////////////////////////////////////////////////////////////////////////////
109 // Interface Class to the Geant3.21 MonteCarlo //
113 <img src="picts/TGeant3Class.gif">
118 ///////////////////////////////////////////////////////////////////////////////
124 #include <TDatabasePDG.h>
125 #include "AliCallf77.h"
126 #include "AliDecayer.h"
127 #include "TLorentzVector.h"
130 # define gzebra gzebra_
131 # define grfile grfile_
132 # define gpcxyz gpcxyz_
133 # define ggclos ggclos_
134 # define glast glast_
135 # define ginit ginit_
136 # define gcinit gcinit_
138 # define gtrig gtrig_
139 # define gtrigc gtrigc_
140 # define gtrigi gtrigi_
141 # define gwork gwork_
142 # define gzinit gzinit_
143 # define gfmate gfmate_
144 # define gfpart gfpart_
145 # define gftmed gftmed_
146 # define gftmat gftmat_
147 # define gmate gmate_
148 # define gpart gpart_
150 # define gsmate gsmate_
151 # define gsmixt gsmixt_
152 # define gspart gspart_
153 # define gstmed gstmed_
154 # define gsckov gsckov_
155 # define gstpar gstpar_
156 # define gfkine gfkine_
157 # define gfvert gfvert_
158 # define gskine gskine_
159 # define gsvert gsvert_
160 # define gphysi gphysi_
161 # define gdebug gdebug_
162 # define gekbin gekbin_
163 # define gfinds gfinds_
164 # define gsking gsking_
165 # define gskpho gskpho_
166 # define gsstak gsstak_
167 # define gsxyz gsxyz_
168 # define gtrack gtrack_
169 # define gtreve gtreve_
170 # define gtreveroot gtreveroot_
171 # define grndm grndm_
172 # define grndmq grndmq_
173 # define gdtom gdtom_
174 # define glmoth glmoth_
175 # define gmedia gmedia_
176 # define gmtod gmtod_
177 # define gsdvn gsdvn_
178 # define gsdvn2 gsdvn2_
179 # define gsdvs gsdvs_
180 # define gsdvs2 gsdvs2_
181 # define gsdvt gsdvt_
182 # define gsdvt2 gsdvt2_
183 # define gsord gsord_
184 # define gspos gspos_
185 # define gsposp gsposp_
186 # define gsrotm gsrotm_
187 # define gprotm gprotm_
188 # define gsvolu gsvolu_
189 # define gprint gprint_
190 # define gdinit gdinit_
191 # define gdopt gdopt_
192 # define gdraw gdraw_
193 # define gdrayt gdrayt_
194 # define gdrawc gdrawc_
195 # define gdrawx gdrawx_
196 # define gdhead gdhead_
197 # define gdwmn1 gdwmn1_
198 # define gdwmn2 gdwmn2_
199 # define gdwmn3 gdwmn3_
200 # define gdxyz gdxyz_
201 # define gdcxyz gdcxyz_
202 # define gdman gdman_
203 # define gdspec gdspec_
204 # define gdtree gdtree_
205 # define gdelet gdelet_
206 # define gdclos gdclos_
207 # define gdshow gdshow_
208 # define gdopen gdopen_
209 # define dzshow dzshow_
210 # define gsatt gsatt_
211 # define gfpara gfpara_
212 # define gckpar gckpar_
213 # define gckmat gckmat_
214 # define glvolu glvolu_
215 # define geditv geditv_
216 # define mzdrop mzdrop_
218 # define ertrak ertrak_
219 # define ertrgo ertrgo_
221 # define setbomb setbomb_
222 # define setclip setclip_
223 # define gcomad gcomad_
225 # define gbrelm gbrelm_
226 # define gprelm gprelm_
228 # define gzebra GZEBRA
229 # define grfile GRFILE
230 # define gpcxyz GPCXYZ
231 # define ggclos GGCLOS
234 # define gcinit GCINIT
237 # define gtrigc GTRIGC
238 # define gtrigi GTRIGI
240 # define gzinit GZINIT
241 # define gfmate GFMATE
242 # define gfpart GFPART
243 # define gftmed GFTMED
244 # define gftmat GFTMAT
248 # define gsmate GSMATE
249 # define gsmixt GSMIXT
250 # define gspart GSPART
251 # define gstmed GSTMED
252 # define gsckov GSCKOV
253 # define gstpar GSTPAR
254 # define gfkine GFKINE
255 # define gfvert GFVERT
256 # define gskine GSKINE
257 # define gsvert GSVERT
258 # define gphysi GPHYSI
259 # define gdebug GDEBUG
260 # define gekbin GEKBIN
261 # define gfinds GFINDS
262 # define gsking GSKING
263 # define gskpho GSKPHO
264 # define gsstak GSSTAK
266 # define gtrack GTRACK
267 # define gtreve GTREVE
268 # define gtreveroot GTREVEROOT
270 # define grndmq GRNDMQ
272 # define glmoth GLMOTH
273 # define gmedia GMEDIA
276 # define gsdvn2 GSDVN2
278 # define gsdvs2 GSDVS2
280 # define gsdvt2 GSDVT2
283 # define gsposp GSPOSP
284 # define gsrotm GSROTM
285 # define gprotm GPROTM
286 # define gsvolu GSVOLU
287 # define gprint GPRINT
288 # define gdinit GDINIT
291 # define gdrayt GDRAYT
292 # define gdrawc GDRAWC
293 # define gdrawx GDRAWX
294 # define gdhead GDHEAD
295 # define gdwmn1 GDWMN1
296 # define gdwmn2 GDWMN2
297 # define gdwmn3 GDWMN3
299 # define gdcxyz GDCXYZ
301 # define gdfspc GDFSPC
302 # define gdspec GDSPEC
303 # define gdtree GDTREE
304 # define gdelet GDELET
305 # define gdclos GDCLOS
306 # define gdshow GDSHOW
307 # define gdopen GDOPEN
308 # define dzshow DZSHOW
310 # define gfpara GFPARA
311 # define gckpar GCKPAR
312 # define gckmat GCKMAT
313 # define glvolu GLVOLU
314 # define geditv GEDITV
315 # define mzdrop MZDROP
317 # define ertrak ERTRAK
318 # define ertrgo ERTRGO
320 # define setbomb SETBOMB
321 # define setclip SETCLIP
322 # define gcomad GCOMAD
324 # define gbrelm GBRELM
325 # define gprelm GPRELM
329 //____________________________________________________________________________
333 // Prototypes for GEANT functions
335 void type_of_call gzebra(const int&);
337 void type_of_call gpcxyz();
339 void type_of_call ggclos();
341 void type_of_call glast();
343 void type_of_call ginit();
345 void type_of_call gcinit();
347 void type_of_call grun();
349 void type_of_call gtrig();
351 void type_of_call gtrigc();
353 void type_of_call gtrigi();
355 void type_of_call gwork(const int&);
357 void type_of_call gzinit();
359 void type_of_call gmate();
361 void type_of_call gpart();
363 void type_of_call gsdk(Int_t &, Float_t *, Int_t *);
365 void type_of_call gfkine(Int_t &, Float_t *, Float_t *, Int_t &,
366 Int_t &, Float_t *, Int_t &);
368 void type_of_call gfvert(Int_t &, Float_t *, Int_t &, Int_t &,
369 Float_t &, Float_t *, Int_t &);
371 void type_of_call gskine(Float_t *,Int_t &, Int_t &, Float_t *,
374 void type_of_call gsvert(Float_t *,Int_t &, Int_t &, Float_t *,
377 void type_of_call gphysi();
379 void type_of_call gdebug();
381 void type_of_call gekbin();
383 void type_of_call gfinds();
385 void type_of_call gsking(Int_t &);
387 void type_of_call gskpho(Int_t &);
389 void type_of_call gsstak(Int_t &);
391 void type_of_call gsxyz();
393 void type_of_call gtrack();
395 void type_of_call gtreve();
397 void type_of_call gtreveroot();
399 void type_of_call grndm(Float_t *r, const Int_t &n)
402 void type_of_call grndmq(Int_t &, Int_t &, const Int_t &,
404 {/*printf("Dummy grndmq called\n");*/}
406 void type_of_call gdtom(Float_t *, Float_t *, Int_t &);
408 void type_of_call glmoth(DEFCHARD, Int_t &, Int_t &, Int_t *,
409 Int_t *, Int_t * DEFCHARL);
411 void type_of_call gmedia(Float_t *, Int_t &);
413 void type_of_call gmtod(Float_t *, Float_t *, Int_t &);
415 void type_of_call gsrotm(const Int_t &, const Float_t &, const Float_t &,
416 const Float_t &, const Float_t &, const Float_t &,
419 void type_of_call gprotm(const Int_t &);
421 void type_of_call grfile(const Int_t&, DEFCHARD,
422 DEFCHARD DEFCHARL DEFCHARL);
424 void type_of_call gfmate(const Int_t&, DEFCHARD, Float_t &, Float_t &,
425 Float_t &, Float_t &, Float_t &, Float_t *,
428 void type_of_call gfpart(const Int_t&, DEFCHARD, Int_t &, Float_t &,
429 Float_t &, Float_t &, Float_t *, Int_t & DEFCHARL);
431 void type_of_call gftmed(const Int_t&, DEFCHARD, Int_t &, Int_t &, Int_t &,
432 Float_t &, Float_t &, Float_t &, Float_t &,
433 Float_t &, Float_t &, Float_t *, Int_t * DEFCHARL);
435 void type_of_call gftmat(const Int_t&, const Int_t&, DEFCHARD, const Int_t&,
437 ,Float_t *, Int_t & DEFCHARL);
439 void type_of_call gsmate(const Int_t&, DEFCHARD, Float_t &, Float_t &,
440 Float_t &, Float_t &, Float_t &, Float_t *,
443 void type_of_call gsmixt(const Int_t&, DEFCHARD, Float_t *, Float_t *,
444 Float_t &, Int_t &, Float_t * DEFCHARL);
446 void type_of_call gspart(const Int_t&, DEFCHARD, Int_t &, Float_t &,
447 Float_t &, Float_t &, Float_t *, Int_t & DEFCHARL);
450 void type_of_call gstmed(const Int_t&, DEFCHARD, Int_t &, Int_t &, Int_t &,
451 Float_t &, Float_t &, Float_t &, Float_t &,
452 Float_t &, Float_t &, Float_t *, Int_t & DEFCHARL);
454 void type_of_call gsckov(Int_t &itmed, Int_t &npckov, Float_t *ppckov,
455 Float_t *absco, Float_t *effic, Float_t *rindex);
456 void type_of_call gstpar(const Int_t&, DEFCHARD, Float_t & DEFCHARL);
458 void type_of_call gsdvn(DEFCHARD,DEFCHARD, Int_t &, Int_t &
461 void type_of_call gsdvn2(DEFCHARD,DEFCHARD, Int_t &, Int_t &, Float_t &,
462 Int_t & DEFCHARL DEFCHARL);
464 void type_of_call gsdvs(DEFCHARD,DEFCHARD, Float_t &, Int_t &, Int_t &
467 void type_of_call gsdvs2(DEFCHARD,DEFCHARD, Float_t &, Int_t &, Float_t &,
468 Int_t & DEFCHARL DEFCHARL);
470 void type_of_call gsdvt(DEFCHARD,DEFCHARD, Float_t &, Int_t &, Int_t &,
471 Int_t & DEFCHARL DEFCHARL);
473 void type_of_call gsdvt2(DEFCHARD,DEFCHARD, Float_t &, Int_t &, Float_t&,
474 Int_t &, Int_t & DEFCHARL DEFCHARL);
476 void type_of_call gsord(DEFCHARD, Int_t & DEFCHARL);
478 void type_of_call gspos(DEFCHARD, Int_t &, DEFCHARD, Float_t &, Float_t &,
479 Float_t &, Int_t &, DEFCHARD DEFCHARL DEFCHARL
482 void type_of_call gsposp(DEFCHARD, Int_t &, DEFCHARD, Float_t &, Float_t &,
483 Float_t &, Int_t &, DEFCHARD,
484 Float_t *, Int_t & DEFCHARL DEFCHARL DEFCHARL);
486 void type_of_call gsvolu(DEFCHARD, DEFCHARD, Int_t &, Float_t *, Int_t &,
487 Int_t & DEFCHARL DEFCHARL);
489 void type_of_call gsatt(DEFCHARD, DEFCHARD, Int_t & DEFCHARL DEFCHARL);
491 void type_of_call gfpara(DEFCHARD , Int_t&, Int_t&, Int_t&, Int_t&, Float_t*,
494 void type_of_call gckpar(Int_t&, Int_t&, Float_t*);
496 void type_of_call gckmat(Int_t&, DEFCHARD DEFCHARL);
498 void type_of_call glvolu(Int_t&, Int_t*, Int_t*, Int_t&);
500 void type_of_call gprint(DEFCHARD,const int& DEFCHARL);
502 void type_of_call gdinit();
504 void type_of_call gdopt(DEFCHARD,DEFCHARD DEFCHARL DEFCHARL);
506 void type_of_call gdraw(DEFCHARD,Float_t &,Float_t &, Float_t &,Float_t &,
507 Float_t &, Float_t &, Float_t & DEFCHARL);
508 void type_of_call gdrayt(DEFCHARD,Float_t &,Float_t &, Float_t &,Float_t &,
509 Float_t &, Float_t &, Float_t & DEFCHARL);
510 void type_of_call gdrawc(DEFCHARD,Int_t &, Float_t &, Float_t &, Float_t &,
511 Float_t &, Float_t & DEFCHARL);
512 void type_of_call gdrawx(DEFCHARD,Float_t &, Float_t &, Float_t &, Float_t &,
513 Float_t &, Float_t &, Float_t &, Float_t &,
515 void type_of_call gdhead(Int_t &,DEFCHARD, Float_t & DEFCHARL);
516 void type_of_call gdxyz(Int_t &);
517 void type_of_call gdcxyz();
518 void type_of_call gdman(Float_t &, Float_t &);
519 void type_of_call gdwmn1(Float_t &, Float_t &);
520 void type_of_call gdwmn2(Float_t &, Float_t &);
521 void type_of_call gdwmn3(Float_t &, Float_t &);
522 void type_of_call gdspec(DEFCHARD DEFCHARL);
523 void type_of_call gdfspc(DEFCHARD, Int_t &, Int_t & DEFCHARL) {;}
524 void type_of_call gdtree(DEFCHARD, Int_t &, Int_t & DEFCHARL);
526 void type_of_call gdopen(Int_t &);
527 void type_of_call gdclos();
528 void type_of_call gdelet(Int_t &);
529 void type_of_call gdshow(Int_t &);
530 void type_of_call geditv(Int_t &) {;}
533 void type_of_call dzshow(DEFCHARD,const int&,const int&,DEFCHARD,const int&,
534 const int&, const int&, const int& DEFCHARL
537 void type_of_call mzdrop(Int_t&, Int_t&, DEFCHARD DEFCHARL);
539 void type_of_call setbomb(Float_t &);
540 void type_of_call setclip(DEFCHARD, Float_t &,Float_t &,Float_t &,Float_t &,
541 Float_t &, Float_t & DEFCHARL);
542 void type_of_call gcomad(DEFCHARD, Int_t*& DEFCHARL);
544 void type_of_call ertrak(const Float_t *const x1, const Float_t *const p1,
545 const Float_t *x2, const Float_t *p2,
546 const Int_t &ipa, DEFCHARD DEFCHARL);
548 void type_of_call ertrgo();
550 float type_of_call gbrelm(const Float_t &z, const Float_t& t, const Float_t& cut);
551 float type_of_call gprelm(const Float_t &z, const Float_t& t, const Float_t& cut);
555 // Geant3 global pointer
557 static const Int_t kDefSize = 600;
561 //____________________________________________________________________________
565 // Default constructor
569 //____________________________________________________________________________
570 TGeant3::TGeant3(const char *title, Int_t nwgeant)
571 :AliMC("TGeant3",title)
574 // Standard constructor for TGeant3 with ZEBRA initialisation
585 // Load Address of Geant3 commons
588 // Zero number of particles
593 //____________________________________________________________________________
594 Int_t TGeant3::CurrentMaterial(Float_t &a, Float_t &z, Float_t &dens,
595 Float_t &radl, Float_t &absl) const
598 // Return the parameters of the current material during transport
602 dens = fGcmate->dens;
603 radl = fGcmate->radl;
604 absl = fGcmate->absl;
605 return 1; //this could be the number of elements in mixture
608 //____________________________________________________________________________
609 void TGeant3::DefaultRange()
612 // Set range of current drawing pad to 20x20 cm
618 gHigz->Range(0,0,20,20);
621 //____________________________________________________________________________
622 void TGeant3::InitHIGZ()
633 //____________________________________________________________________________
634 void TGeant3::LoadAddress()
637 // Assigns the address of the GEANT common blocks to the structures
638 // that allow their access from C++
641 gcomad(PASSCHARD("QUEST"), (int*&) fQuest PASSCHARL("QUEST"));
642 gcomad(PASSCHARD("GCBANK"),(int*&) fGcbank PASSCHARL("GCBANK"));
643 gcomad(PASSCHARD("GCLINK"),(int*&) fGclink PASSCHARL("GCLINK"));
644 gcomad(PASSCHARD("GCCUTS"),(int*&) fGccuts PASSCHARL("GCCUTS"));
645 gcomad(PASSCHARD("GCMULO"),(int*&) fGcmulo PASSCHARL("GCMULO"));
646 gcomad(PASSCHARD("GCFLAG"),(int*&) fGcflag PASSCHARL("GCFLAG"));
647 gcomad(PASSCHARD("GCKINE"),(int*&) fGckine PASSCHARL("GCKINE"));
648 gcomad(PASSCHARD("GCKING"),(int*&) fGcking PASSCHARL("GCKING"));
649 gcomad(PASSCHARD("GCKIN2"),(int*&) fGckin2 PASSCHARL("GCKIN2"));
650 gcomad(PASSCHARD("GCKIN3"),(int*&) fGckin3 PASSCHARL("GCKIN3"));
651 gcomad(PASSCHARD("GCMATE"),(int*&) fGcmate PASSCHARL("GCMATE"));
652 gcomad(PASSCHARD("GCTMED"),(int*&) fGctmed PASSCHARL("GCTMED"));
653 gcomad(PASSCHARD("GCTRAK"),(int*&) fGctrak PASSCHARL("GCTRAK"));
654 gcomad(PASSCHARD("GCTPOL"),(int*&) fGctpol PASSCHARL("GCTPOL"));
655 gcomad(PASSCHARD("GCVOLU"),(int*&) fGcvolu PASSCHARL("GCVOLU"));
656 gcomad(PASSCHARD("GCNUM"), (int*&) fGcnum PASSCHARL("GCNUM"));
657 gcomad(PASSCHARD("GCSETS"),(int*&) fGcsets PASSCHARL("GCSETS"));
658 gcomad(PASSCHARD("GCPHYS"),(int*&) fGcphys PASSCHARL("GCPHYS"));
659 gcomad(PASSCHARD("GCPHLT"),(int*&) fGcphlt PASSCHARL("GCPHLT"));
660 gcomad(PASSCHARD("GCOPTI"),(int*&) fGcopti PASSCHARL("GCOPTI"));
661 gcomad(PASSCHARD("GCTLIT"),(int*&) fGctlit PASSCHARL("GCTLIT"));
662 gcomad(PASSCHARD("GCVDMA"),(int*&) fGcvdma PASSCHARL("GCVDMA"));
665 gcomad(PASSCHARD("ERTRIO"),(int*&) fErtrio PASSCHARL("ERTRIO"));
666 gcomad(PASSCHARD("EROPTS"),(int*&) fEropts PASSCHARL("EROPTS"));
667 gcomad(PASSCHARD("EROPTC"),(int*&) fEroptc PASSCHARL("EROPTC"));
668 gcomad(PASSCHARD("ERWORK"),(int*&) fErwork PASSCHARL("ERWORK"));
670 // Variables for ZEBRA store
671 gcomad(PASSCHARD("IQ"), addr PASSCHARL("IQ"));
673 gcomad(PASSCHARD("LQ"), addr PASSCHARL("LQ"));
678 //_____________________________________________________________________________
679 void TGeant3::GeomIter()
682 // Geometry iterator for moving upward in the geometry tree
683 // Initialise the iterator
685 fNextVol=fGcvolu->nlevel;
688 //____________________________________________________________________________
689 void TGeant3::FinishGeometry()
691 //Close the geometry structure
695 //____________________________________________________________________________
696 Int_t TGeant3::NextVolUp(Text_t *name, Int_t ©)
699 // Geometry iterator for moving upward in the geometry tree
700 // Return next volume up
705 gname=fGcvolu->names[fNextVol];
706 copy=fGcvolu->number[fNextVol];
707 i=fGcvolu->lvolum[fNextVol];
708 name = fVolNames[i-1];
709 if(gname == fZiq[fGclink->jvolum+i]) return i;
710 else printf("GeomTree: Volume %s not found in bank\n",name);
715 //_____________________________________________________________________________
716 void TGeant3::BuildPhysics()
721 //_____________________________________________________________________________
722 Int_t TGeant3::CurrentVolID(Int_t ©) const
725 // Returns the current volume ID and copy number
728 if( (i=fGcvolu->nlevel-1) < 0 ) {
729 Warning("CurrentVolID","Stack depth only %d\n",fGcvolu->nlevel);
731 gname=fGcvolu->names[i];
732 copy=fGcvolu->number[i];
733 i=fGcvolu->lvolum[i];
734 if(gname == fZiq[fGclink->jvolum+i]) return i;
735 else Warning("CurrentVolID","Volume %4s not found\n",(char*)&gname);
740 //_____________________________________________________________________________
741 Int_t TGeant3::CurrentVolOffID(Int_t off, Int_t ©) const
744 // Return the current volume "off" upward in the geometrical tree
745 // ID and copy number
748 if( (i=fGcvolu->nlevel-off-1) < 0 ) {
749 Warning("CurrentVolOffID","Offset requested %d but stack depth %d\n",
750 off,fGcvolu->nlevel);
752 gname=fGcvolu->names[i];
753 copy=fGcvolu->number[i];
754 i=fGcvolu->lvolum[i];
755 if(gname == fZiq[fGclink->jvolum+i]) return i;
756 else Warning("CurrentVolOffID","Volume %4s not found\n",(char*)&gname);
761 //_____________________________________________________________________________
762 const char* TGeant3::CurrentVolName() const
765 // Returns the current volume name
768 if( (i=fGcvolu->nlevel-1) < 0 ) {
769 Warning("CurrentVolName","Stack depth %d\n",fGcvolu->nlevel);
771 gname=fGcvolu->names[i];
772 i=fGcvolu->lvolum[i];
773 if(gname == fZiq[fGclink->jvolum+i]) return fVolNames[i-1];
774 else Warning("CurrentVolName","Volume %4s not found\n",(char*) &gname);
779 //_____________________________________________________________________________
780 const char* TGeant3::CurrentVolOffName(Int_t off) const
783 // Return the current volume "off" upward in the geometrical tree
784 // ID, name and copy number
785 // if name=0 no name is returned
788 if( (i=fGcvolu->nlevel-off-1) < 0 ) {
789 Warning("CurrentVolOffName",
790 "Offset requested %d but stack depth %d\n",off,fGcvolu->nlevel);
792 gname=fGcvolu->names[i];
793 i=fGcvolu->lvolum[i];
794 if(gname == fZiq[fGclink->jvolum+i]) return fVolNames[i-1];
795 else Warning("CurrentVolOffName","Volume %4s not found\n",(char*)&gname);
800 //_____________________________________________________________________________
801 Int_t TGeant3::IdFromPDG(Int_t pdg) const
804 // Return Geant3 code from PDG and pseudo ENDF code
806 for(Int_t i=0;i<fNPDGCodes;++i)
807 if(pdg==fPDGCode[i]) return i;
811 //_____________________________________________________________________________
812 Int_t TGeant3::PDGFromId(Int_t id) const
815 // Return PDG code and pseudo ENDF code from Geant3 code
817 if(id>0 && id<fNPDGCodes) return fPDGCode[id];
821 //_____________________________________________________________________________
822 void TGeant3::DefineParticles()
825 // Define standard Geant 3 particles
828 // Load standard numbers for GEANT particles and PDG conversion
829 fPDGCode[fNPDGCodes++]=-99; // 0 = unused location
830 fPDGCode[fNPDGCodes++]=22; // 1 = photon
831 fPDGCode[fNPDGCodes++]=-11; // 2 = positron
832 fPDGCode[fNPDGCodes++]=11; // 3 = electron
833 fPDGCode[fNPDGCodes++]=12; // 4 = neutrino e
834 fPDGCode[fNPDGCodes++]=-13; // 5 = muon +
835 fPDGCode[fNPDGCodes++]=13; // 6 = muon -
836 fPDGCode[fNPDGCodes++]=111; // 7 = pi0
837 fPDGCode[fNPDGCodes++]=211; // 8 = pi+
838 fPDGCode[fNPDGCodes++]=-211; // 9 = pi-
839 fPDGCode[fNPDGCodes++]=130; // 10 = Kaon Long
840 fPDGCode[fNPDGCodes++]=321; // 11 = Kaon +
841 fPDGCode[fNPDGCodes++]=-321; // 12 = Kaon -
842 fPDGCode[fNPDGCodes++]=2112; // 13 = Neutron
843 fPDGCode[fNPDGCodes++]=2212; // 14 = Proton
844 fPDGCode[fNPDGCodes++]=-2212; // 15 = Anti Proton
845 fPDGCode[fNPDGCodes++]=310; // 16 = Kaon Short
846 fPDGCode[fNPDGCodes++]=221; // 17 = Eta
847 fPDGCode[fNPDGCodes++]=3122; // 18 = Lambda
848 fPDGCode[fNPDGCodes++]=3222; // 19 = Sigma +
849 fPDGCode[fNPDGCodes++]=3212; // 20 = Sigma 0
850 fPDGCode[fNPDGCodes++]=3112; // 21 = Sigma -
851 fPDGCode[fNPDGCodes++]=3322; // 22 = Xi0
852 fPDGCode[fNPDGCodes++]=3312; // 23 = Xi-
853 fPDGCode[fNPDGCodes++]=3334; // 24 = Omega-
854 fPDGCode[fNPDGCodes++]=-2112; // 25 = Anti Proton
855 fPDGCode[fNPDGCodes++]=-3122; // 26 = Anti Proton
856 fPDGCode[fNPDGCodes++]=-3222; // 27 = Anti Sigma -
857 fPDGCode[fNPDGCodes++]=-3212; // 28 = Anti Sigma 0
858 fPDGCode[fNPDGCodes++]=-3112; // 29 = Anti Sigma 0
859 fPDGCode[fNPDGCodes++]=-3322; // 30 = Anti Xi 0
860 fPDGCode[fNPDGCodes++]=-3312; // 31 = Anti Xi +
861 fPDGCode[fNPDGCodes++]=-3334; // 32 = Anti Omega +
868 /* --- Define additional particles */
869 Gspart(33, "OMEGA(782)", 3, 0.782, 0., 7.836e-23);
870 fPDGCode[fNPDGCodes++]=223; // 33 = Omega(782)
872 Gspart(34, "PHI(1020)", 3, 1.019, 0., 1.486e-22);
873 fPDGCode[fNPDGCodes++]=333; // 34 = PHI (1020)
875 Gspart(35, "D +", 4, 1.87, 1., 1.066e-12);
876 fPDGCode[fNPDGCodes++]=411; // 35 = D+
878 Gspart(36, "D -", 4, 1.87, -1., 1.066e-12);
879 fPDGCode[fNPDGCodes++]=-411; // 36 = D-
881 Gspart(37, "D 0", 3, 1.865, 0., 4.2e-13);
882 fPDGCode[fNPDGCodes++]=421; // 37 = D0
884 Gspart(38, "ANTI D 0", 3, 1.865, 0., 4.2e-13);
885 fPDGCode[fNPDGCodes++]=-421; // 38 = D0 bar
887 fPDGCode[fNPDGCodes++]=-99; // 39 = unassigned
889 fPDGCode[fNPDGCodes++]=-99; // 40 = unassigned
891 fPDGCode[fNPDGCodes++]=-99; // 41 = unassigned
893 Gspart(42, "RHO +", 4, 0.768, 1., 4.353e-24);
894 fPDGCode[fNPDGCodes++]=213; // 42 = RHO+
896 Gspart(43, "RHO -", 4, 0.768, -1., 4.353e-24);
897 fPDGCode[fNPDGCodes++]=-213; // 43 = RHO-
899 Gspart(44, "RHO 0", 3, 0.768, 0., 4.353e-24);
900 fPDGCode[fNPDGCodes++]=113; // 44 = RHO0
903 // Use ENDF-6 mapping for ions = 10000*z+10*a+iso
905 // and numbers above 5 000 000 for special applications
908 const Int_t kion=10000000;
910 const Int_t kspe=50000000;
912 TDatabasePDG *pdgDB = TDatabasePDG::Instance();
914 const Double_t kAu2Gev=0.9314943228;
915 const Double_t khSlash = 1.0545726663e-27;
916 const Double_t kErg2Gev = 1/1.6021773349e-3;
917 const Double_t khShGev = khSlash*kErg2Gev;
918 const Double_t kYear2Sec = 3600*24*365.25;
921 // mass and life-time from PDG
922 pdgDB->AddParticle("B(s)*0","B(s)*0",
923 5.4163, kTRUE, 0.047, +0.,"Meson", 533);
925 pdgDB->AddParticle("B(s)*0 bar","B(s)*0 bar",
926 5.4163, kTRUE, 0.047, -0.,"Meson", -533);
930 // value for mass used by Hijing
931 pdgDB->AddParticle("Sigma(c)*+","Sigma(c)*+",
932 2.4536, kTRUE, -1., +1.,"Baryon", 4214);
934 pdgDB->AddParticle("Sigma(c)*-","Sigma(c)*-",
935 2.4536, kTRUE, -1., -1.,"Baryon", -4214);
936 // equivalent to 4312 ? Hijing uses m=2.55
937 pdgDB->AddParticle("Xsi(c)0","Xsi(c)0",
938 2.4703, kTRUE, -1., +0.,"Baryon", 4132);
940 pdgDB->AddParticle("Xsi(c)0 bar","Xsi(c)0 bar",
941 2.4703, kTRUE, -1., -0.,"Baryon", -4132);
942 // equivalent to 4322 ? Hijing uses m=2.55
943 pdgDB->AddParticle("Xi(c)+","Xi(c)+",
944 2.4656, kFALSE, -1., +1.,"Baryon", 4232);
946 pdgDB->AddParticle("Xi(c)-","Xi(c)-",
947 2.4656, kFALSE, -1., -1.,"Baryon", -4232);
948 // mass values from Hijing
950 pdgDB->AddParticle("Xsi(c)*0","Xsi(c)*0",
951 2.63, kTRUE, -1., +0.,"Baryon", 4314);
953 pdgDB->AddParticle("Xsi(c)*0 bar","Xsi(c)*0 bar",
954 2.63, kTRUE, -1., -0.,"Baryon", -4314);
956 pdgDB->AddParticle("Xsi(c)*+","Xsi(c)*+",
957 2.63, kTRUE, -1., +1.,"Baryon", 4324);
959 pdgDB->AddParticle("Xsi(c)*-","Xsi(c)*-",
960 2.63, kTRUE, -1., -1.,"Baryon", -4324);
962 // pdg mass value, Hijing uses m=2.73.
963 pdgDB->AddParticle("Omega(c)0","Omega(c)0",
964 2.7040, kFALSE, khShGev/0.064e-12, +0.,"Baryon", 4332);
966 pdgDB->AddParticle("Omega(c)0 bar","Omega(c)0 bar",
967 2.7040, kFALSE, khShGev/0.064e-12, -0.,"Baryon", -4332);
968 // mass value from Hijing
969 pdgDB->AddParticle("Omega(c)*0","Omega(c)*0",
970 2.8000, kFALSE, -1., +0.,"Baryon", 4334);
972 pdgDB->AddParticle("Omega(c)*0 bar","Omega(c)*0",
973 2.8000, kFALSE, -1., -0.,"Baryon", -4334);
978 pdgDB->AddParticle("Xsi(cc)+","Xsi(cc)+",
979 3.60, kTRUE, -1., +1.,"Baryon", 4412);
981 pdgDB->AddParticle("Xsi(cc) bar-","Xsi(cc) bar-",
982 3.60, kTRUE, -1., -1.,"Baryon", -4412);
984 pdgDB->AddParticle("Xsi*(cc)+","Xsi*(cc)+",
985 3.66, kTRUE, -1., +1.,"Baryon", 4414);
987 pdgDB->AddParticle("Xsi*(cc) bar-","Xsi*(cc) bar-",
988 3.66, kTRUE, -1., -1.,"Baryon", -4414);
991 pdgDB->AddParticle("Xsi(cc)++","Xsi(cc)++",
992 3.60, kTRUE, -1., +2.,"Baryon", 4422);
994 pdgDB->AddParticle("Xsi(cc) bar--","Xsi(cc) bar--",
995 3.60, kTRUE, -1., -2.,"Baryon", -4422);
998 pdgDB->AddParticle("Xsi*(cc)++","Xsi*(cc)++",
999 3.66, kTRUE, -1., +2.,"Baryon", 4424);
1001 pdgDB->AddParticle("Xsi*(cc) bar-","Xsi*(cc) bar-",
1002 3.66, kTRUE, -1., -2.,"Baryon", -4424);
1004 pdgDB->AddParticle("Omega(cc)+","Omega(cc)+",
1005 3.78, kTRUE, -1., +1.,"Baryon", 4432);
1007 pdgDB->AddParticle("Omega(cc) bar-","Omega(cc) bar-",
1008 3.78, kTRUE, -1., -1.,"Baryon", -4432);
1010 pdgDB->AddParticle("Omega*(cc)+","Omega*(cc)+",
1011 3.82, kTRUE, -1., +1.,"Baryon", 4434);
1013 pdgDB->AddParticle("Omega*(cc) bar-","Omega*(cc) bar-",
1014 3.82, kTRUE, -1., -1.,"Baryon", -4434);
1017 pdgDB->AddParticle("Omega*(ccc)+","Omega*(cc)++",
1018 4.91, kTRUE, -1., +2.,"Baryon", 4444);
1020 pdgDB->AddParticle("Omega*(ccc) bar--","Omega*(cc) bar--",
1021 4.91, kTRUE, -1., -2.,"Baryon", -4444);
1027 // mass value from Hijing
1028 pdgDB->AddParticle("Sigma(b)*+","Sigma(b)*+",
1029 5.8100, kFALSE, -1., +1.,"Baryon", 5224);
1031 pdgDB->AddParticle("Sigma(b)*-","Sigma(b)*-",
1032 5.8100, kFALSE, -1., -1.,"Baryon", -5224);
1035 pdgDB->AddParticle("Xi(b)0","Xi(b)0",
1036 5.8400, kFALSE, -1., +0.,"Baryon", 5232);
1038 pdgDB->AddParticle("Xi(b)0 bar","Xi(b)0 bar",
1039 5.8100, kFALSE, -1., -0.,"Baryon", -5232);
1042 pdgDB->AddParticle("Xi'(b)-","Xi'(b)-",
1043 5.9600, kFALSE, -1., -1.,"Baryon", 5312);
1045 pdgDB->AddParticle("Xi'(b) bar+","Xi'(b) bar+",
1046 5.9600, kFALSE, -1., 1.,"Baryon", -5312);
1048 pdgDB->AddParticle("Xi*(b)-","Xi*(b)-",
1049 5.9700, kFALSE, -1., -1.,"Baryon", 5314);
1051 pdgDB->AddParticle("Xi*(b) bar+","Xi*(b) bar+",
1052 5.9700, kFALSE, -1., 1.,"Baryon", -5314);
1054 pdgDB->AddParticle("Xi'(b)0","Xi'(b)0",
1055 5.9600, kFALSE, -1., -0.,"Baryon", 5322);
1057 pdgDB->AddParticle("Xi'(b) bar0","Xi'(b) bar0",
1058 5.9600, kFALSE, -1., 0.,"Baryon", -5322);
1060 pdgDB->AddParticle("Xi*(b)0","Xi*(b)0",
1061 5.9700, kFALSE, -1., -0.,"Baryon", 5324);
1063 pdgDB->AddParticle("Xi*(b) bar0","Xi*(b) bar0",
1064 5.9700, kFALSE, -1., 0.,"Baryon", -5324);
1066 pdgDB->AddParticle("Omega(b)-","Omega(b)-",
1067 6.1200, kFALSE, -1., -1.,"Baryon", 5332);
1069 pdgDB->AddParticle("Omega(b) bar+","Omega(b) bar+",
1070 6.1200, kFALSE, -1., 1.,"Baryon", -5332);
1072 pdgDB->AddParticle("Omega*(b)-","Omega*(b)-",
1073 6.1300, kFALSE, -1., -1.,"Baryon", 5334);
1075 pdgDB->AddParticle("Omega*(b) bar+","Omega*(b) bar+",
1076 6.1300, kFALSE, -1., 1.,"Baryon", -5334);
1079 pdgDB->AddParticle("Omega*(b)-","Omega*(b)-",
1080 6.1300, kFALSE, -1., -1.,"Baryon", 5334);
1082 pdgDB->AddParticle("Omega*(b) bar+","Omega*(b) bar+",
1083 6.1300, kFALSE, -1., 1.,"Baryon", -5334);
1087 pdgDB->AddParticle("Omega(bc)0","Omega(bc)0",
1088 7.1900, kFALSE, -1., -0.,"Baryon", 5342);
1090 pdgDB->AddParticle("Omega(bc) bar0","Omega(bc) bar0",
1091 7.1900, kFALSE, -1., 0.,"Baryon", -5342);
1093 pdgDB->AddParticle("Xi'(bc)0","Xi'(bc)0",
1094 7.0400, kFALSE, -1., -0.,"Baryon", 5412);
1096 pdgDB->AddParticle("Xi'(bc) bar0","Xi'(bc) bar0",
1097 7.0400, kFALSE, -1., 0.,"Baryon", -5412);
1099 pdgDB->AddParticle("Xi*(bc)0","Xi*(bc)0",
1100 7.0500, kFALSE, -1., -0.,"Baryon", 5414);
1102 pdgDB->AddParticle("Xi*(bc) bar0","Xi*(bc) bar0",
1103 7.0500, kFALSE, -1., 0.,"Baryon", -5414);
1105 pdgDB->AddParticle("Xi'(bc)+","Xi'(bc)+",
1106 7.0400, kFALSE, -1., +1.,"Baryon", 5422);
1108 pdgDB->AddParticle("Xi'(bc) bar-","Xi'(bc) bar-",
1109 7.0400, kFALSE, -1., -1.,"Baryon", -5422);
1111 pdgDB->AddParticle("Xi*(bc)+","Xi*(bc)+",
1112 7.0500, kFALSE, -1., +1.,"Baryon", 5424);
1114 pdgDB->AddParticle("Xi*(bc) bar-","Xi*(bc) bar-",
1115 7.0500, kFALSE, -1., -1.,"Baryon", -5424);
1117 pdgDB->AddParticle("Omega'(bc)0","Omega'(bc)0",
1118 7.2100, kFALSE, -1., -0.,"Baryon", 5432);
1120 pdgDB->AddParticle("Omega'(bc) bar0","Omega'(bc) bar0",
1121 7.2100, kFALSE, -1., 0.,"Baryon", -5432);
1123 pdgDB->AddParticle("Omega*(bc)0","Omega*(bc)0",
1124 7.2200, kFALSE, -1., -0.,"Baryon", 5434);
1126 pdgDB->AddParticle("Omega*(bc) bar0","Omega*(bc) bar0",
1127 7.2200, kFALSE, -1., 0.,"Baryon", -5434);
1129 pdgDB->AddParticle("Omega(bcc)+","Omega(bcc)+",
1130 8.3100, kFALSE, -1., +1.,"Baryon", 5442);
1132 pdgDB->AddParticle("Omega(bcc) bar-","Omega(bcc) bar-",
1133 8.3100, kFALSE, -1., -1.,"Baryon", -5442);
1135 pdgDB->AddParticle("Omega*(bcc)+","Omega*(bcc)+",
1136 8.3100, kFALSE, -1., +1.,"Baryon", 5444);
1138 pdgDB->AddParticle("Omega*(bcc) bar-","Omega*(bcc) bar-",
1139 8.3100, kFALSE, -1., -1.,"Baryon", -5444);
1146 pdgDB->AddParticle("Xsi(bb)-","Xsi(bb)-",
1147 10.4200, kFALSE, -1., -1.,"Baryon", 5512);
1149 pdgDB->AddParticle("Xsi(bb) bar+","Xsi(bb) bar+",
1150 10.4200, kFALSE, -1., +1.,"Baryon", -5512);
1152 pdgDB->AddParticle("Xsi*(bb)-","Xsi*(bb)-",
1153 10.4400, kFALSE, -1., -1.,"Baryon", 5514);
1155 pdgDB->AddParticle("Xsi*(bb) bar+","Xsi*(bb) bar+",
1156 10.4400, kFALSE, -1., +1.,"Baryon", -5514);
1158 pdgDB->AddParticle("Xsi(bb)0","Xsi(bb)0",
1159 10.4200, kFALSE, -1., -0.,"Baryon", 5522);
1161 pdgDB->AddParticle("Xsi(bb) bar0","Xsi(bb) bar0",
1162 10.4200, kFALSE, -1., +0.,"Baryon", -5522);
1164 pdgDB->AddParticle("Xsi*(bb)0","Xsi*(bb)0",
1165 10.4400, kFALSE, -1., -0.,"Baryon", 5524);
1167 pdgDB->AddParticle("Xsi*(bb) bar0","Xsi*(bb) bar0",
1168 10.4400, kFALSE, -1., +0.,"Baryon", -5524);
1170 pdgDB->AddParticle("Omega*(bb)-","Omega(bb)-",
1171 10.6000, kFALSE, -1., -1.,"Baryon", 5532);
1173 pdgDB->AddParticle("Omega(bb) bar+","Omega(bb) bar+",
1174 10.6000, kFALSE, -1., +1.,"Baryon", -5532);
1176 pdgDB->AddParticle("Omega*(bb)-","Omega*(bb)-",
1177 10.6000, kFALSE, -1., -1.,"Baryon", 5534);
1179 pdgDB->AddParticle("Omega*(bb) bar+","Omega*(bb) bar+",
1180 10.6000, kFALSE, -1., +1.,"Baryon", -5534);
1184 pdgDB->AddParticle("Omega(bbc)0","Omega(bbc)0",
1185 11.7100, kFALSE, -1., -0.,"Baryon", 5542);
1187 pdgDB->AddParticle("Omega(bbc) bar0","Omega(bbc) bar0",
1188 11.7100, kFALSE, -1., +0.,"Baryon", -5542);
1190 pdgDB->AddParticle("Omega*(bbc)0","Omega*(bbc)0",
1191 11.7100, kFALSE, -1., -0.,"Baryon", 5544);
1193 pdgDB->AddParticle("Omega*(bbc) bar0","Omega*(bbc) bar0",
1194 11.7100, kFALSE, -1., +0.,"Baryon", -5544);
1197 pdgDB->AddParticle("Omega*(bbb)-","Omega*(bbb)-",
1198 15.1000, kFALSE, -1., -1.,"Baryon", 5544);
1200 pdgDB->AddParticle("Omega*(bbb) bar+","Omega*(bbb) bar+",
1201 15.100, kFALSE, -1., +1.,"Baryon", -5544);
1205 pdgDB->AddParticle("Deuteron","Deuteron",2*kAu2Gev+8.071e-3,kTRUE,
1206 0,1,"Ion",kion+10020);
1207 fPDGCode[fNPDGCodes++]=kion+10020; // 45 = Deuteron
1209 pdgDB->AddParticle("Triton","Triton",3*kAu2Gev+14.931e-3,kFALSE,
1210 khShGev/(12.33*kYear2Sec),1,"Ion",kion+10030);
1211 fPDGCode[fNPDGCodes++]=kion+10030; // 46 = Triton
1213 pdgDB->AddParticle("Alpha","Alpha",4*kAu2Gev+2.424e-3,kTRUE,
1214 khShGev/(12.33*kYear2Sec),2,"Ion",kion+20040);
1215 fPDGCode[fNPDGCodes++]=kion+20040; // 47 = Alpha
1217 fPDGCode[fNPDGCodes++]=0; // 48 = geantino mapped to rootino
1219 pdgDB->AddParticle("HE3","HE3",3*kAu2Gev+14.931e-3,kFALSE,
1220 0,2,"Ion",kion+20030);
1221 fPDGCode[fNPDGCodes++]=kion+20030; // 49 = HE3
1223 pdgDB->AddParticle("Cherenkov","Cherenkov",0,kFALSE,
1224 0,0,"Special",kspe+50);
1225 fPDGCode[fNPDGCodes++]=kspe+50; // 50 = Cherenkov
1227 Gspart(51, "FeedbackPhoton", 7, 0., 0.,1.e20 );
1228 pdgDB->AddParticle("FeedbackPhoton","FeedbackPhoton",0,kFALSE,
1229 0,0,"Special",kspe+51);
1230 fPDGCode[fNPDGCodes++]=kspe+51; // 51 = FeedbackPhoton
1231 Gspart(52, "Lambda_c+", 4, 2.2849, +1., 2.06e-13);
1232 fPDGCode[fNPDGCodes++]=4122; //52 = Lambda_c+
1234 Gspart(53, "Lambda_c-", 4, 2.2849, -1., 2.06e-13);
1235 fPDGCode[fNPDGCodes++]=-4122; //53 = Lambda_c-
1237 Gspart(54, "D_s+", 4, 1.9685, +1., 4.67e-13);
1238 fPDGCode[fNPDGCodes++]=431; //54 = D_s+
1240 Gspart(55, "D_s-", 4, 1.9685, -1., 4.67e-13);
1241 fPDGCode[fNPDGCodes++]=-431; //55 = D_s-
1243 Gspart(56, "Tau+", 5, 1.77705, +1., 2.9e-13);
1244 fPDGCode[fNPDGCodes++]=15; //56 = Tau+
1246 Gspart(57, "Tau-", 5, 1.77705, -1., 2.9e-13);
1247 fPDGCode[fNPDGCodes++]=-15; //57 = Tau-
1249 Gspart(58, "B0", 3, 5.2792, +0., 1.56e-12);
1250 fPDGCode[fNPDGCodes++]=511; //58 = B0
1252 Gspart(59, "B0 bar", 3, 5.2792, -0., 1.56e-12);
1253 fPDGCode[fNPDGCodes++]=-511; //58 = B0bar
1255 Gspart(60, "B+", 4, 5.2789, +1., 1.65e-12);
1256 fPDGCode[fNPDGCodes++]=521; //60 = B+
1258 Gspart(61, "B-", 4, 5.2789, -1., 1.65e-12);
1259 fPDGCode[fNPDGCodes++]=-521; //61 = B-
1261 Gspart(62, "Bs", 3, 5.3693, +0., 1.54e-12);
1262 fPDGCode[fNPDGCodes++]=521; //62 = B_s
1264 Gspart(63, "Bs bar", 3, 5.3693, -0., 1.54e-12);
1265 fPDGCode[fNPDGCodes++]=-521; //63 = B_s bar
1267 Gspart(64, "Lambda_b", 3, 5.624, +0., 1.24e-12);
1268 fPDGCode[fNPDGCodes++]=5122; //64 = Lambda_b
1270 Gspart(65, "Lambda_b bar", 3, 5.624, -0., 1.24e-12);
1271 fPDGCode[fNPDGCodes++]=-5122; //65 = Lambda_b bar
1273 Gspart(66, "J/Psi", 3.09688, 3, 0., 0.);
1274 fPDGCode[fNPDGCodes++]=443; // 66 = J/Psi
1276 Gspart(67, "Psi Prime", 3, 3.686, 0., 0.);
1277 fPDGCode[fNPDGCodes++]=20443; // 67 = Psi prime
1279 Gspart(68, "Upsilon(1S)", 9.46037, 3, 0., 0.);
1280 fPDGCode[fNPDGCodes++]=553; // 68 = Upsilon(1S)
1282 Gspart(69, "Upsilon(2S)", 10.0233, 3, 0., 0.);
1283 fPDGCode[fNPDGCodes++]=20553; // 69 = Upsilon(2S)
1285 Gspart(70, "Upsilon(3S)", 10.3553, 3, 0., 0.);
1286 fPDGCode[fNPDGCodes++]=30553; // 70 = Upsilon(3S)
1288 /* --- Define additional decay modes --- */
1289 /* --- omega(783) --- */
1290 for (kz = 0; kz < 6; ++kz) {
1301 Gsdk(ipa, bratio, mode);
1302 /* --- phi(1020) --- */
1303 for (kz = 0; kz < 6; ++kz) {
1318 Gsdk(ipa, bratio, mode);
1321 for (kz = 0; kz < 6; ++kz) {
1334 Gsdk(ipa, bratio, mode);
1338 for (kz = 0; kz < 6; ++kz) {
1351 Gsdk(ipa, bratio, mode);
1355 for (kz = 0; kz < 6; ++kz) {
1366 Gsdk(ipa, bratio, mode);
1368 /* --- Anti D0 --- */
1370 for (kz = 0; kz < 6; ++kz) {
1381 Gsdk(ipa, bratio, mode);
1384 for (kz = 0; kz < 6; ++kz) {
1391 Gsdk(ipa, bratio, mode);
1393 for (kz = 0; kz < 6; ++kz) {
1400 Gsdk(ipa, bratio, mode);
1402 for (kz = 0; kz < 6; ++kz) {
1409 Gsdk(ipa, bratio, mode);
1412 for (kz = 0; kz < 6; ++kz) {
1421 Gsdk(ipa, bratio, mode);
1424 Gsdk(ipa, bratio, mode);
1427 Gsdk(ipa, bratio, mode);
1432 //_____________________________________________________________________________
1433 Int_t TGeant3::VolId(const Text_t *name) const
1436 // Return the unique numeric identifier for volume name
1439 strncpy((char *) &gname, name, 4);
1440 for(i=1; i<=fGcnum->nvolum; i++)
1441 if(gname == fZiq[fGclink->jvolum+i]) return i;
1442 printf("VolId: Volume %s not found\n",name);
1446 //_____________________________________________________________________________
1447 Int_t TGeant3::NofVolumes() const
1450 // Return total number of volumes in the geometry
1452 return fGcnum->nvolum;
1455 //_____________________________________________________________________________
1456 Int_t TGeant3::VolId2Mate(Int_t id) const
1459 // Return material number for a given volume id
1461 if(id<1 || id > fGcnum->nvolum || fGclink->jvolum<=0)
1464 Int_t jvo = fZlq[fGclink->jvolum-id];
1465 return Int_t(fZq[jvo+4]);
1469 //_____________________________________________________________________________
1470 const char* TGeant3::VolName(Int_t id) const
1473 // Return the volume name given the volume identifier
1475 if(id<1 || id > fGcnum->nvolum || fGclink->jvolum<=0)
1476 return fVolNames[fGcnum->nvolum];
1478 return fVolNames[id-1];
1481 //_____________________________________________________________________________
1482 void TGeant3::SetCut(const char* cutName, Float_t cutValue)
1485 // Set transport cuts for particles
1487 if(!strcmp(cutName,"CUTGAM"))
1488 fGccuts->cutgam=cutValue;
1489 else if(!strcmp(cutName,"CUTGAM"))
1490 fGccuts->cutele=cutValue;
1491 else if(!strcmp(cutName,"CUTELE"))
1492 fGccuts->cutneu=cutValue;
1493 else if(!strcmp(cutName,"CUTHAD"))
1494 fGccuts->cuthad=cutValue;
1495 else if(!strcmp(cutName,"CUTMUO"))
1496 fGccuts->cutmuo=cutValue;
1497 else if(!strcmp(cutName,"BCUTE"))
1498 fGccuts->bcute=cutValue;
1499 else if(!strcmp(cutName,"BCUTM"))
1500 fGccuts->bcutm=cutValue;
1501 else if(!strcmp(cutName,"DCUTE"))
1502 fGccuts->dcute=cutValue;
1503 else if(!strcmp(cutName,"DCUTM"))
1504 fGccuts->dcutm=cutValue;
1505 else if(!strcmp(cutName,"PPCUTM"))
1506 fGccuts->ppcutm=cutValue;
1507 else if(!strcmp(cutName,"TOFMAX"))
1508 fGccuts->tofmax=cutValue;
1509 else Warning("SetCut","Cut %s not implemented\n",cutName);
1512 //_____________________________________________________________________________
1513 void TGeant3::SetProcess(const char* flagName, Int_t flagValue)
1516 // Set thresholds for different processes
1518 if(!strcmp(flagName,"PAIR"))
1519 fGcphys->ipair=flagValue;
1520 else if(!strcmp(flagName,"COMP"))
1521 fGcphys->icomp=flagValue;
1522 else if(!strcmp(flagName,"PHOT"))
1523 fGcphys->iphot=flagValue;
1524 else if(!strcmp(flagName,"PFIS"))
1525 fGcphys->ipfis=flagValue;
1526 else if(!strcmp(flagName,"DRAY"))
1527 fGcphys->idray=flagValue;
1528 else if(!strcmp(flagName,"ANNI"))
1529 fGcphys->ianni=flagValue;
1530 else if(!strcmp(flagName,"BREM"))
1531 fGcphys->ibrem=flagValue;
1532 else if(!strcmp(flagName,"HADR"))
1533 fGcphys->ihadr=flagValue;
1534 else if(!strcmp(flagName,"MUNU"))
1535 fGcphys->imunu=flagValue;
1536 else if(!strcmp(flagName,"DCAY"))
1537 fGcphys->idcay=flagValue;
1538 else if(!strcmp(flagName,"LOSS"))
1539 fGcphys->iloss=flagValue;
1540 else if(!strcmp(flagName,"MULS"))
1541 fGcphys->imuls=flagValue;
1542 else if(!strcmp(flagName,"RAYL"))
1543 fGcphys->irayl=flagValue;
1544 else if(!strcmp(flagName,"STRA"))
1545 fGcphlt->istra=flagValue;
1546 else if(!strcmp(flagName,"SYNC"))
1547 fGcphlt->isync=flagValue;
1548 else Warning("SetFlag","Flag %s not implemented\n",flagName);
1551 //_____________________________________________________________________________
1552 Float_t TGeant3::Xsec(char* reac, Float_t /* energy */,
1553 Int_t part, Int_t /* mate */)
1556 // Calculate X-sections -- dummy for the moment
1558 if(!strcmp(reac,"PHOT"))
1561 Error("Xsec","Can calculate photoelectric only for photons\n");
1567 //_____________________________________________________________________________
1568 void TGeant3::TrackPosition(TLorentzVector &xyz) const
1571 // Return the current position in the master reference frame of the
1572 // track being transported
1574 xyz[0]=fGctrak->vect[0];
1575 xyz[1]=fGctrak->vect[1];
1576 xyz[2]=fGctrak->vect[2];
1577 xyz[3]=fGctrak->tofg;
1580 //_____________________________________________________________________________
1581 Float_t TGeant3::TrackTime() const
1584 // Return the current time of flight of the track being transported
1586 return fGctrak->tofg;
1589 //_____________________________________________________________________________
1590 void TGeant3::TrackMomentum(TLorentzVector &xyz) const
1593 // Return the direction and the momentum (GeV/c) of the track
1594 // currently being transported
1596 Double_t ptot=fGctrak->vect[6];
1597 xyz[0]=fGctrak->vect[3]*ptot;
1598 xyz[1]=fGctrak->vect[4]*ptot;
1599 xyz[2]=fGctrak->vect[5]*ptot;
1600 xyz[3]=fGctrak->getot;
1603 //_____________________________________________________________________________
1604 Float_t TGeant3::TrackCharge() const
1607 // Return charge of the track currently transported
1609 return fGckine->charge;
1612 //_____________________________________________________________________________
1613 Float_t TGeant3::TrackMass() const
1616 // Return the mass of the track currently transported
1618 return fGckine->amass;
1621 //_____________________________________________________________________________
1622 Int_t TGeant3::TrackPid() const
1625 // Return the id of the particle transported
1627 return PDGFromId(fGckine->ipart);
1630 //_____________________________________________________________________________
1631 Float_t TGeant3::TrackStep() const
1634 // Return the length in centimeters of the current step
1636 return fGctrak->step;
1639 //_____________________________________________________________________________
1640 Float_t TGeant3::TrackLength() const
1643 // Return the length of the current track from its origin
1645 return fGctrak->sleng;
1648 //_____________________________________________________________________________
1649 Bool_t TGeant3::IsNewTrack() const
1652 // True if the track is not at the boundary of the current volume
1654 return (fGctrak->sleng==0);
1657 //_____________________________________________________________________________
1658 Bool_t TGeant3::IsTrackInside() const
1661 // True if the track is not at the boundary of the current volume
1663 return (fGctrak->inwvol==0);
1666 //_____________________________________________________________________________
1667 Bool_t TGeant3::IsTrackEntering() const
1670 // True if this is the first step of the track in the current volume
1672 return (fGctrak->inwvol==1);
1675 //_____________________________________________________________________________
1676 Bool_t TGeant3::IsTrackExiting() const
1679 // True if this is the last step of the track in the current volume
1681 return (fGctrak->inwvol==2);
1684 //_____________________________________________________________________________
1685 Bool_t TGeant3::IsTrackOut() const
1688 // True if the track is out of the setup
1690 return (fGctrak->inwvol==3);
1693 //_____________________________________________________________________________
1694 Bool_t TGeant3::IsTrackStop() const
1697 // True if the track energy has fallen below the threshold
1699 return (fGctrak->istop==2);
1702 //_____________________________________________________________________________
1703 Int_t TGeant3::NSecondaries() const
1706 // Number of secondary particles generated in the current step
1708 return fGcking->ngkine;
1711 //_____________________________________________________________________________
1712 Int_t TGeant3::CurrentEvent() const
1715 // Number of the current event
1717 return fGcflag->idevt;
1720 //_____________________________________________________________________________
1721 AliMCProcess TGeant3::ProdProcess() const
1724 // Name of the process that has produced the secondary particles
1725 // in the current step
1727 const Int_t kIpMec[13] = { 5,6,7,8,9,10,11,12,21,23,25,105,108 };
1728 const Int_t kIpProc[13] = { kPDecay, kPPair, kPCompton,
1729 kPPhotoelectric, kPBrem, kPDeltaRay,
1730 kPAnnihilation, kPHadronic,
1731 kPMuonNuclear, kPPhotoFission,
1732 kPRayleigh, kPCerenkov, kPSynchrotron};
1735 if(fGcking->ngkine>0)
1736 for (km = 0; km < fGctrak->nmec; ++km)
1737 for (im = 0; im < 13; ++im)
1738 if (fGctrak->lmec[km] == kIpMec[im])
1739 return (AliMCProcess) kIpProc[im];
1741 return (AliMCProcess) kPNoProcess;
1744 //_____________________________________________________________________________
1745 void TGeant3::GetSecondary(Int_t isec, Int_t& ipart,
1746 TLorentzVector &x, TLorentzVector &p)
1749 // Get the parameters of the secondary track number isec produced
1750 // in the current step
1753 if(-1<isec && isec<fGcking->ngkine) {
1754 ipart=Int_t (fGcking->gkin[isec][4] +0.5);
1756 x[i]=fGckin3->gpos[isec][i];
1757 p[i]=fGcking->gkin[isec][i];
1759 x[3]=fGcking->tofd[isec];
1760 p[3]=fGcking->gkin[isec][3];
1762 printf(" * TGeant3::GetSecondary * Secondary %d does not exist\n",isec);
1763 x[0]=x[1]=x[2]=x[3]=p[0]=p[1]=p[2]=p[3]=0;
1768 //_____________________________________________________________________________
1769 void TGeant3::InitLego()
1772 // Set switches for lego transport
1775 SetDEBU(0,0,0); //do not print a message
1778 //_____________________________________________________________________________
1779 Bool_t TGeant3::IsTrackDisappeared() const
1782 // True if the current particle has disappered
1783 // either because it decayed or because it underwent
1784 // an inelastic collision
1786 return (fGctrak->istop==1);
1789 //_____________________________________________________________________________
1790 Bool_t TGeant3::IsTrackAlive() const
1793 // True if the current particle is alive and will continue to be
1796 return (fGctrak->istop==0);
1799 //_____________________________________________________________________________
1800 void TGeant3::StopTrack()
1803 // Stop the transport of the current particle and skip to the next
1808 //_____________________________________________________________________________
1809 void TGeant3::StopEvent()
1812 // Stop simulation of the current event and skip to the next
1817 //_____________________________________________________________________________
1818 Float_t TGeant3::MaxStep() const
1821 // Return the maximum step length in the current medium
1823 return fGctmed->stemax;
1826 //_____________________________________________________________________________
1827 void TGeant3::SetMaxStep(Float_t maxstep)
1830 // Set the maximum step allowed till the particle is in the current medium
1832 fGctmed->stemax=maxstep;
1835 //_____________________________________________________________________________
1836 void TGeant3::SetMaxNStep(Int_t maxnstp)
1839 // Set the maximum number of steps till the particle is in the current medium
1841 fGctrak->maxnst=maxnstp;
1844 //_____________________________________________________________________________
1845 Int_t TGeant3::GetMaxNStep() const
1848 // Maximum number of steps allowed in current medium
1850 return fGctrak->maxnst;
1853 //_____________________________________________________________________________
1854 void TGeant3::Material(Int_t& kmat, const char* name, Float_t a, Float_t z,
1855 Float_t dens, Float_t radl, Float_t absl, Float_t* buf,
1859 // Defines a Material
1861 // kmat number assigned to the material
1862 // name material name
1863 // a atomic mass in au
1865 // dens density in g/cm3
1866 // absl absorbtion length in cm
1867 // if >=0 it is ignored and the program
1868 // calculates it, if <0. -absl is taken
1869 // radl radiation length in cm
1870 // if >=0 it is ignored and the program
1871 // calculates it, if <0. -radl is taken
1872 // buf pointer to an array of user words
1873 // nbuf number of user words
1875 Int_t jmate=fGclink->jmate;
1881 for(i=1; i<=ns; i++) {
1882 if(fZlq[jmate-i]==0) {
1888 gsmate(kmat,PASSCHARD(name), a, z, dens, radl, absl, buf,
1889 nwbuf PASSCHARL(name));
1892 //_____________________________________________________________________________
1893 void TGeant3::Mixture(Int_t& kmat, const char* name, Float_t* a, Float_t* z,
1894 Float_t dens, Int_t nlmat, Float_t* wmat)
1897 // Defines mixture OR COMPOUND IMAT as composed by
1898 // THE BASIC NLMAT materials defined by arrays A,Z and WMAT
1900 // If NLMAT > 0 then wmat contains the proportion by
1901 // weights of each basic material in the mixture.
1903 // If nlmat < 0 then WMAT contains the number of atoms
1904 // of a given kind into the molecule of the COMPOUND
1905 // In this case, WMAT in output is changed to relative
1908 Int_t jmate=fGclink->jmate;
1914 for(i=1; i<=ns; i++) {
1915 if(fZlq[jmate-i]==0) {
1921 gsmixt(kmat,PASSCHARD(name), a, z,dens, nlmat,wmat PASSCHARL(name));
1924 //_____________________________________________________________________________
1925 void TGeant3::Medium(Int_t& kmed, const char* name, Int_t nmat, Int_t isvol,
1926 Int_t ifield, Float_t fieldm, Float_t tmaxfd,
1927 Float_t stemax, Float_t deemax, Float_t epsil,
1928 Float_t stmin, Float_t* ubuf, Int_t nbuf)
1931 // kmed tracking medium number assigned
1932 // name tracking medium name
1933 // nmat material number
1934 // isvol sensitive volume flag
1935 // ifield magnetic field
1936 // fieldm max. field value (kilogauss)
1937 // tmaxfd max. angle due to field (deg/step)
1938 // stemax max. step allowed
1939 // deemax max. fraction of energy lost in a step
1940 // epsil tracking precision (cm)
1941 // stmin min. step due to continuos processes (cm)
1943 // ifield = 0 if no magnetic field; ifield = -1 if user decision in guswim;
1944 // ifield = 1 if tracking performed with grkuta; ifield = 2 if tracking
1945 // performed with ghelix; ifield = 3 if tracking performed with ghelx3.
1947 Int_t jtmed=fGclink->jtmed;
1953 for(i=1; i<=ns; i++) {
1954 if(fZlq[jtmed-i]==0) {
1960 gstmed(kmed, PASSCHARD(name), nmat, isvol, ifield, fieldm, tmaxfd, stemax,
1961 deemax, epsil, stmin, ubuf, nbuf PASSCHARL(name));
1964 //_____________________________________________________________________________
1965 void TGeant3::Matrix(Int_t& krot, Float_t thex, Float_t phix, Float_t they,
1966 Float_t phiy, Float_t thez, Float_t phiz)
1969 // krot rotation matrix number assigned
1970 // theta1 polar angle for axis i
1971 // phi1 azimuthal angle for axis i
1972 // theta2 polar angle for axis ii
1973 // phi2 azimuthal angle for axis ii
1974 // theta3 polar angle for axis iii
1975 // phi3 azimuthal angle for axis iii
1977 // it defines the rotation matrix number irot.
1979 Int_t jrotm=fGclink->jrotm;
1985 for(i=1; i<=ns; i++) {
1986 if(fZlq[jrotm-i]==0) {
1992 gsrotm(krot, thex, phix, they, phiy, thez, phiz);
1995 //_____________________________________________________________________________
1996 Int_t TGeant3::GetMedium() const
1999 // Return the number of the current medium
2001 return fGctmed->numed;
2004 //_____________________________________________________________________________
2005 Float_t TGeant3::Edep() const
2008 // Return the energy lost in the current step
2010 return fGctrak->destep;
2013 //_____________________________________________________________________________
2014 Float_t TGeant3::Etot() const
2017 // Return the total energy of the current track
2019 return fGctrak->getot;
2022 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2024 // Functions from GBASE
2026 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2028 //____________________________________________________________________________
2029 void TGeant3::Gfile(const char *filename, const char *option)
2032 // Routine to open a GEANT/RZ data base.
2034 // LUN logical unit number associated to the file
2036 // CHFILE RZ file name
2038 // CHOPT is a character string which may be
2039 // N To create a new file
2040 // U to open an existing file for update
2041 // " " to open an existing file for read only
2042 // Q The initial allocation (default 1000 records)
2043 // is given in IQUEST(10)
2044 // X Open the file in exchange format
2045 // I Read all data structures from file to memory
2046 // O Write all data structures from memory to file
2049 // If options "I" or "O" all data structures are read or
2050 // written from/to file and the file is closed.
2051 // See routine GRMDIR to create subdirectories
2052 // See routines GROUT,GRIN to write,read objects
2054 grfile(21, PASSCHARD(filename), PASSCHARD(option) PASSCHARL(filename)
2058 //____________________________________________________________________________
2059 void TGeant3::Gpcxyz()
2062 // Print track and volume parameters at current point
2067 //_____________________________________________________________________________
2068 void TGeant3::Ggclos()
2071 // Closes off the geometry setting.
2072 // Initializes the search list for the contents of each
2073 // volume following the order they have been positioned, and
2074 // inserting the content '0' when a call to GSNEXT (-1) has
2075 // been required by the user.
2076 // Performs the development of the JVOLUM structure for all
2077 // volumes with variable parameters, by calling GGDVLP.
2078 // Interprets the user calls to GSORD, through GGORD.
2079 // Computes and stores in a bank (next to JVOLUM mother bank)
2080 // the number of levels in the geometrical tree and the
2081 // maximum number of contents per level, by calling GGNLEV.
2082 // Sets status bit for CONCAVE volumes, through GGCAVE.
2083 // Completes the JSET structure with the list of volume names
2084 // which identify uniquely a given physical detector, the
2085 // list of bit numbers to pack the corresponding volume copy
2086 // numbers, and the generic path(s) in the JVOLUM tree,
2087 // through the routine GHCLOS.
2090 // Create internal list of volumes
2091 fVolNames = new char[fGcnum->nvolum+1][5];
2093 for(i=0; i<fGcnum->nvolum; ++i) {
2094 strncpy(fVolNames[i], (char *) &fZiq[fGclink->jvolum+i+1], 4);
2095 fVolNames[i][4]='\0';
2097 strcpy(fVolNames[fGcnum->nvolum],"NULL");
2100 //_____________________________________________________________________________
2101 void TGeant3::Glast()
2104 // Finish a Geant run
2109 //_____________________________________________________________________________
2110 void TGeant3::Gprint(const char *name)
2113 // Routine to print data structures
2114 // CHNAME name of a data structure
2118 gprint(PASSCHARD(vname),0 PASSCHARL(vname));
2121 //_____________________________________________________________________________
2122 void TGeant3::Grun()
2125 // Steering function to process one run
2130 //_____________________________________________________________________________
2131 void TGeant3::Gtrig()
2134 // Steering function to process one event
2139 //_____________________________________________________________________________
2140 void TGeant3::Gtrigc()
2143 // Clear event partition
2148 //_____________________________________________________________________________
2149 void TGeant3::Gtrigi()
2152 // Initialises event partition
2157 //_____________________________________________________________________________
2158 void TGeant3::Gwork(Int_t nwork)
2161 // Allocates workspace in ZEBRA memory
2166 //_____________________________________________________________________________
2167 void TGeant3::Gzinit()
2170 // To initialise GEANT/ZEBRA data structures
2175 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2177 // Functions from GCONS
2179 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2181 //_____________________________________________________________________________
2182 void TGeant3::Gfmate(Int_t imat, char *name, Float_t &a, Float_t &z,
2183 Float_t &dens, Float_t &radl, Float_t &absl,
2184 Float_t* ubuf, Int_t& nbuf)
2187 // Return parameters for material IMAT
2189 gfmate(imat, PASSCHARD(name), a, z, dens, radl, absl, ubuf, nbuf
2193 //_____________________________________________________________________________
2194 void TGeant3::Gfpart(Int_t ipart, char *name, Int_t &itrtyp,
2195 Float_t &amass, Float_t &charge, Float_t &tlife)
2198 // Return parameters for particle of type IPART
2202 Int_t igpart = IdFromPDG(ipart);
2203 gfpart(igpart, PASSCHARD(name), itrtyp, amass, charge, tlife, ubuf, nbuf
2207 //_____________________________________________________________________________
2208 void TGeant3::Gftmed(Int_t numed, char *name, Int_t &nmat, Int_t &isvol,
2209 Int_t &ifield, Float_t &fieldm, Float_t &tmaxfd,
2210 Float_t &stemax, Float_t &deemax, Float_t &epsil,
2211 Float_t &stmin, Float_t *ubuf, Int_t *nbuf)
2214 // Return parameters for tracking medium NUMED
2216 gftmed(numed, PASSCHARD(name), nmat, isvol, ifield, fieldm, tmaxfd, stemax,
2217 deemax, epsil, stmin, ubuf, nbuf PASSCHARL(name));
2221 void TGeant3::Gftmat(Int_t imate, Int_t ipart, char *chmeca, Int_t kdim,
2222 Float_t* tkin, Float_t* value, Float_t* pcut,
2226 // Return parameters for tracking medium NUMED
2228 gftmat(imate, ipart, PASSCHARD(chmeca), kdim,
2229 tkin, value, pcut, ixst PASSCHARL(chmeca));
2233 //_____________________________________________________________________________
2234 Float_t TGeant3::Gbrelm(Float_t z, Float_t t, Float_t bcut)
2237 // To calculate energy loss due to soft muon BREMSSTRAHLUNG
2239 return gbrelm(z,t,bcut);
2242 //_____________________________________________________________________________
2243 Float_t TGeant3::Gprelm(Float_t z, Float_t t, Float_t bcut)
2246 // To calculate DE/DX in GeV*barn/atom for direct pair production by muons
2248 return gprelm(z,t,bcut);
2251 //_____________________________________________________________________________
2252 void TGeant3::Gmate()
2255 // Define standard GEANT materials
2260 //_____________________________________________________________________________
2261 void TGeant3::Gpart()
2264 // Define standard GEANT particles plus selected decay modes
2265 // and branching ratios.
2270 //_____________________________________________________________________________
2271 void TGeant3::Gsdk(Int_t ipart, Float_t *bratio, Int_t *mode)
2273 // Defines branching ratios and decay modes for standard
2275 gsdk(ipart,bratio,mode);
2278 //_____________________________________________________________________________
2279 void TGeant3::Gsmate(Int_t imat, const char *name, Float_t a, Float_t z,
2280 Float_t dens, Float_t radl, Float_t absl)
2283 // Defines a Material
2285 // kmat number assigned to the material
2286 // name material name
2287 // a atomic mass in au
2289 // dens density in g/cm3
2290 // absl absorbtion length in cm
2291 // if >=0 it is ignored and the program
2292 // calculates it, if <0. -absl is taken
2293 // radl radiation length in cm
2294 // if >=0 it is ignored and the program
2295 // calculates it, if <0. -radl is taken
2296 // buf pointer to an array of user words
2297 // nbuf number of user words
2301 gsmate(imat,PASSCHARD(name), a, z, dens, radl, absl, ubuf, nbuf
2305 //_____________________________________________________________________________
2306 void TGeant3::Gsmixt(Int_t imat, const char *name, Float_t *a, Float_t *z,
2307 Float_t dens, Int_t nlmat, Float_t *wmat)
2310 // Defines mixture OR COMPOUND IMAT as composed by
2311 // THE BASIC NLMAT materials defined by arrays A,Z and WMAT
2313 // If NLMAT.GT.0 then WMAT contains the PROPORTION BY
2314 // WEIGTHS OF EACH BASIC MATERIAL IN THE MIXTURE.
2316 // If NLMAT.LT.0 then WMAT contains the number of atoms
2317 // of a given kind into the molecule of the COMPOUND
2318 // In this case, WMAT in output is changed to relative
2321 gsmixt(imat,PASSCHARD(name), a, z,dens, nlmat,wmat PASSCHARL(name));
2324 //_____________________________________________________________________________
2325 void TGeant3::Gspart(Int_t ipart, const char *name, Int_t itrtyp,
2326 Float_t amass, Float_t charge, Float_t tlife)
2329 // Store particle parameters
2331 // ipart particle code
2332 // name particle name
2333 // itrtyp transport method (see GEANT manual)
2334 // amass mass in GeV/c2
2335 // charge charge in electron units
2336 // tlife lifetime in seconds
2340 gspart(ipart,PASSCHARD(name), itrtyp, amass, charge, tlife, ubuf, nbuf
2344 //_____________________________________________________________________________
2345 void TGeant3::Gstmed(Int_t numed, const char *name, Int_t nmat, Int_t isvol,
2346 Int_t ifield, Float_t fieldm, Float_t tmaxfd,
2347 Float_t stemax, Float_t deemax, Float_t epsil,
2351 // NTMED Tracking medium number
2352 // NAME Tracking medium name
2353 // NMAT Material number
2354 // ISVOL Sensitive volume flag
2355 // IFIELD Magnetic field
2356 // FIELDM Max. field value (Kilogauss)
2357 // TMAXFD Max. angle due to field (deg/step)
2358 // STEMAX Max. step allowed
2359 // DEEMAX Max. fraction of energy lost in a step
2360 // EPSIL Tracking precision (cm)
2361 // STMIN Min. step due to continuos processes (cm)
2363 // IFIELD = 0 if no magnetic field; IFIELD = -1 if user decision in GUSWIM;
2364 // IFIELD = 1 if tracking performed with GRKUTA; IFIELD = 2 if tracking
2365 // performed with GHELIX; IFIELD = 3 if tracking performed with GHELX3.
2369 gstmed(numed,PASSCHARD(name), nmat, isvol, ifield, fieldm, tmaxfd, stemax,
2370 deemax, epsil, stmin, ubuf, nbuf PASSCHARL(name));
2373 //_____________________________________________________________________________
2374 void TGeant3::Gsckov(Int_t itmed, Int_t npckov, Float_t *ppckov,
2375 Float_t *absco, Float_t *effic, Float_t *rindex)
2378 // Stores the tables for UV photon tracking in medium ITMED
2379 // Please note that it is the user's responsability to
2380 // provide all the coefficients:
2383 // ITMED Tracking medium number
2384 // NPCKOV Number of bins of each table
2385 // PPCKOV Value of photon momentum (in GeV)
2386 // ABSCO Absorbtion coefficients
2387 // dielectric: absorbtion length in cm
2388 // metals : absorbtion fraction (0<=x<=1)
2389 // EFFIC Detection efficiency for UV photons
2390 // RINDEX Refraction index (if=0 metal)
2392 gsckov(itmed,npckov,ppckov,absco,effic,rindex);
2395 //_____________________________________________________________________________
2396 void TGeant3::Gstpar(Int_t itmed, const char *param, Float_t parval)
2399 // To change the value of cut or mechanism "CHPAR"
2400 // to a new value PARVAL for tracking medium ITMED
2401 // The data structure JTMED contains the standard tracking
2402 // parameters (CUTS and flags to control the physics processes) which
2403 // are used by default for all tracking media. It is possible to
2404 // redefine individually with GSTPAR any of these parameters for a
2405 // given tracking medium.
2406 // ITMED tracking medium number
2407 // CHPAR is a character string (variable name)
2408 // PARVAL must be given as a floating point.
2410 gstpar(itmed,PASSCHARD(param), parval PASSCHARL(param));
2413 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2415 // Functions from GCONS
2417 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2419 //_____________________________________________________________________________
2420 void TGeant3::Gfkine(Int_t itra, Float_t *vert, Float_t *pvert, Int_t &ipart,
2423 // Storing/Retrieving Vertex and Track parameters
2424 // ----------------------------------------------
2426 // Stores vertex parameters.
2427 // VERT array of (x,y,z) position of the vertex
2428 // NTBEAM beam track number origin of the vertex
2429 // =0 if none exists
2430 // NTTARG target track number origin of the vertex
2431 // UBUF user array of NUBUF floating point numbers
2433 // NVTX new vertex number (=0 in case of error).
2434 // Prints vertex parameters.
2435 // IVTX for vertex IVTX.
2436 // (For all vertices if IVTX=0)
2437 // Stores long life track parameters.
2438 // PLAB components of momentum
2439 // IPART type of particle (see GSPART)
2440 // NV vertex number origin of track
2441 // UBUF array of NUBUF floating point user parameters
2443 // NT track number (if=0 error).
2444 // Retrieves long life track parameters.
2445 // ITRA track number for which parameters are requested
2446 // VERT vector origin of the track
2447 // PVERT 4 momentum components at the track origin
2448 // IPART particle type (=0 if track ITRA does not exist)
2449 // NVERT vertex number origin of the track
2450 // UBUF user words stored in GSKINE.
2451 // Prints initial track parameters.
2452 // ITRA for track ITRA
2453 // (For all tracks if ITRA=0)
2457 gfkine(itra,vert,pvert,ipart,nvert,ubuf,nbuf);
2460 //_____________________________________________________________________________
2461 void TGeant3::Gfvert(Int_t nvtx, Float_t *v, Int_t &ntbeam, Int_t &nttarg,
2465 // Retrieves the parameter of a vertex bank
2466 // Vertex is generated from tracks NTBEAM NTTARG
2467 // NVTX is the new vertex number
2471 gfvert(nvtx,v,ntbeam,nttarg,tofg,ubuf,nbuf);
2474 //_____________________________________________________________________________
2475 Int_t TGeant3::Gskine(Float_t *plab, Int_t ipart, Int_t nv, Float_t *buf,
2479 // Store kinematics of track NT into data structure
2480 // Track is coming from vertex NV
2483 gskine(plab, ipart, nv, buf, nwbuf, nt);
2487 //_____________________________________________________________________________
2488 Int_t TGeant3::Gsvert(Float_t *v, Int_t ntbeam, Int_t nttarg, Float_t *ubuf,
2492 // Creates a new vertex bank
2493 // Vertex is generated from tracks NTBEAM NTTARG
2494 // NVTX is the new vertex number
2497 gsvert(v, ntbeam, nttarg, ubuf, nwbuf, nwtx);
2501 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2503 // Functions from GPHYS
2505 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2507 //_____________________________________________________________________________
2508 void TGeant3::Gphysi()
2511 // Initialise material constants for all the physics
2512 // mechanisms used by GEANT
2517 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2519 // Functions from GTRAK
2521 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2523 //_____________________________________________________________________________
2524 void TGeant3::Gdebug()
2527 // Debug the current step
2532 //_____________________________________________________________________________
2533 void TGeant3::Gekbin()
2536 // To find bin number in kinetic energy table
2537 // stored in ELOW(NEKBIN)
2542 //_____________________________________________________________________________
2543 void TGeant3::Gfinds()
2546 // Returns the set/volume parameters corresponding to
2547 // the current space point in /GCTRAK/
2548 // and fill common /GCSETS/
2550 // IHSET user set identifier
2551 // IHDET user detector identifier
2552 // ISET set number in JSET
2553 // IDET detector number in JS=LQ(JSET-ISET)
2554 // IDTYPE detector type (1,2)
2555 // NUMBV detector volume numbers (array of length NVNAME)
2556 // NVNAME number of volume levels
2561 //_____________________________________________________________________________
2562 void TGeant3::Gsking(Int_t igk)
2565 // Stores in stack JSTAK either the IGKth track of /GCKING/,
2566 // or the NGKINE tracks when IGK is 0.
2571 //_____________________________________________________________________________
2572 void TGeant3::Gskpho(Int_t igk)
2575 // Stores in stack JSTAK either the IGKth Cherenkov photon of
2576 // /GCKIN2/, or the NPHOT tracks when IGK is 0.
2581 //_____________________________________________________________________________
2582 void TGeant3::Gsstak(Int_t iflag)
2585 // Stores in auxiliary stack JSTAK the particle currently
2586 // described in common /GCKINE/.
2588 // On request, creates also an entry in structure JKINE :
2590 // 0 : No entry in JKINE structure required (user)
2591 // 1 : New entry in JVERTX / JKINE structures required (user)
2592 // <0 : New entry in JKINE structure at vertex -IFLAG (user)
2593 // 2 : Entry in JKINE structure exists already (from GTREVE)
2598 //_____________________________________________________________________________
2599 void TGeant3::Gsxyz()
2602 // Store space point VECT in banks JXYZ
2607 //_____________________________________________________________________________
2608 void TGeant3::Gtrack()
2611 // Controls tracking of current particle
2616 //_____________________________________________________________________________
2617 void TGeant3::Gtreve()
2620 // Controls tracking of all particles belonging to the current event
2625 //_____________________________________________________________________________
2626 void TGeant3::GtreveRoot()
2629 // Controls tracking of all particles belonging to the current event
2634 //_____________________________________________________________________________
2635 void TGeant3::Grndm(Float_t *rvec, const Int_t len) const
2638 // To generate a vector RVECV of LEN random numbers
2639 // Copy of the CERN Library routine RANECU
2643 //_____________________________________________________________________________
2644 void TGeant3::Grndmq(Int_t &/*is1*/, Int_t &/*is2*/, const Int_t /*iseq*/,
2645 const Text_t */*chopt*/)
2648 // To set/retrieve the seed of the random number generator
2650 /*printf("Dummy grndmq called\n");*/
2653 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2655 // Functions from GDRAW
2657 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2659 //_____________________________________________________________________________
2660 void TGeant3::Gdxyz(Int_t it)
2663 // Draw the points stored with Gsxyz relative to track it
2668 //_____________________________________________________________________________
2669 void TGeant3::Gdcxyz()
2672 // Draw the position of the current track
2677 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2679 // Functions from GGEOM
2681 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2683 //_____________________________________________________________________________
2684 void TGeant3::Gdtom(Float_t *xd, Float_t *xm, Int_t iflag)
2687 // Computes coordinates XM (Master Reference System
2688 // knowing the coordinates XD (Detector Ref System)
2689 // The local reference system can be initialized by
2690 // - the tracking routines and GDTOM used in GUSTEP
2691 // - a call to GSCMED(NLEVEL,NAMES,NUMBER)
2692 // (inverse routine is GMTOD)
2694 // If IFLAG=1 convert coordinates
2695 // IFLAG=2 convert direction cosinus
2697 gdtom(xd, xm, iflag);
2700 //_____________________________________________________________________________
2701 void TGeant3::Glmoth(const char* iudet, Int_t iunum, Int_t &nlev, Int_t *lvols,
2705 // Loads the top part of the Volume tree in LVOLS (IVO's),
2706 // LINDX (IN indices) for a given volume defined through
2707 // its name IUDET and number IUNUM.
2709 // The routine stores only upto the last level where JVOLUM
2710 // data structure is developed. If there is no development
2711 // above the current level, it returns NLEV zero.
2713 glmoth(PASSCHARD(iudet), iunum, nlev, lvols, lindx, idum PASSCHARL(iudet));
2716 //_____________________________________________________________________________
2717 void TGeant3::Gmedia(Float_t *x, Int_t &numed)
2720 // Finds in which volume/medium the point X is, and updates the
2721 // common /GCVOLU/ and the structure JGPAR accordingly.
2723 // NUMED returns the tracking medium number, or 0 if point is
2724 // outside the experimental setup.
2729 //_____________________________________________________________________________
2730 void TGeant3::Gmtod(Float_t *xm, Float_t *xd, Int_t iflag)
2733 // Computes coordinates XD (in DRS)
2734 // from known coordinates XM in MRS
2735 // The local reference system can be initialized by
2736 // - the tracking routines and GMTOD used in GUSTEP
2737 // - a call to GMEDIA(XM,NUMED)
2738 // - a call to GLVOLU(NLEVEL,NAMES,NUMBER,IER)
2739 // (inverse routine is GDTOM)
2741 // If IFLAG=1 convert coordinates
2742 // IFLAG=2 convert direction cosinus
2744 gmtod(xm, xd, iflag);
2747 //_____________________________________________________________________________
2748 void TGeant3::Gsdvn(const char *name, const char *mother, Int_t ndiv,
2752 // Create a new volume by dividing an existing one
2755 // MOTHER Mother volume name
2756 // NDIV Number of divisions
2759 // X,Y,Z of CAXIS will be translated to 1,2,3 for IAXIS.
2760 // It divides a previously defined volume.
2765 Vname(mother,vmother);
2766 gsdvn(PASSCHARD(vname), PASSCHARD(vmother), ndiv, iaxis PASSCHARL(vname)
2767 PASSCHARL(vmother));
2770 //_____________________________________________________________________________
2771 void TGeant3::Gsdvn2(const char *name, const char *mother, Int_t ndiv,
2772 Int_t iaxis, Float_t c0i, Int_t numed)
2775 // Create a new volume by dividing an existing one
2777 // Divides mother into ndiv divisions called name
2778 // along axis iaxis starting at coordinate value c0.
2779 // the new volume created will be medium number numed.
2784 Vname(mother,vmother);
2785 gsdvn2(PASSCHARD(vname), PASSCHARD(vmother), ndiv, iaxis, c0i, numed
2786 PASSCHARL(vname) PASSCHARL(vmother));
2789 //_____________________________________________________________________________
2790 void TGeant3::Gsdvs(const char *name, const char *mother, Float_t step,
2791 Int_t iaxis, Int_t numed)
2794 // Create a new volume by dividing an existing one
2799 Vname(mother,vmother);
2800 gsdvs(PASSCHARD(vname), PASSCHARD(vmother), step, iaxis, numed
2801 PASSCHARL(vname) PASSCHARL(vmother));
2804 //_____________________________________________________________________________
2805 void TGeant3::Gsdvs2(const char *name, const char *mother, Float_t step,
2806 Int_t iaxis, Float_t c0, Int_t numed)
2809 // Create a new volume by dividing an existing one
2814 Vname(mother,vmother);
2815 gsdvs2(PASSCHARD(vname), PASSCHARD(vmother), step, iaxis, c0, numed
2816 PASSCHARL(vname) PASSCHARL(vmother));
2819 //_____________________________________________________________________________
2820 void TGeant3::Gsdvt(const char *name, const char *mother, Float_t step,
2821 Int_t iaxis, Int_t numed, Int_t ndvmx)
2824 // Create a new volume by dividing an existing one
2826 // Divides MOTHER into divisions called NAME along
2827 // axis IAXIS in steps of STEP. If not exactly divisible
2828 // will make as many as possible and will centre them
2829 // with respect to the mother. Divisions will have medium
2830 // number NUMED. If NUMED is 0, NUMED of MOTHER is taken.
2831 // NDVMX is the expected maximum number of divisions
2832 // (If 0, no protection tests are performed)
2837 Vname(mother,vmother);
2838 gsdvt(PASSCHARD(vname), PASSCHARD(vmother), step, iaxis, numed, ndvmx
2839 PASSCHARL(vname) PASSCHARL(vmother));
2842 //_____________________________________________________________________________
2843 void TGeant3::Gsdvt2(const char *name, const char *mother, Float_t step,
2844 Int_t iaxis, Float_t c0, Int_t numed, Int_t ndvmx)
2847 // Create a new volume by dividing an existing one
2849 // Divides MOTHER into divisions called NAME along
2850 // axis IAXIS starting at coordinate value C0 with step
2852 // The new volume created will have medium number NUMED.
2853 // If NUMED is 0, NUMED of mother is taken.
2854 // NDVMX is the expected maximum number of divisions
2855 // (If 0, no protection tests are performed)
2860 Vname(mother,vmother);
2861 gsdvt2(PASSCHARD(vname), PASSCHARD(vmother), step, iaxis, c0,
2862 numed, ndvmx PASSCHARL(vname) PASSCHARL(vmother));
2865 //_____________________________________________________________________________
2866 void TGeant3::Gsord(const char *name, Int_t iax)
2869 // Flags volume CHNAME whose contents will have to be ordered
2870 // along axis IAX, by setting the search flag to -IAX
2874 // IAX = 4 Rxy (static ordering only -> GTMEDI)
2875 // IAX = 14 Rxy (also dynamic ordering -> GTNEXT)
2876 // IAX = 5 Rxyz (static ordering only -> GTMEDI)
2877 // IAX = 15 Rxyz (also dynamic ordering -> GTNEXT)
2878 // IAX = 6 PHI (PHI=0 => X axis)
2879 // IAX = 7 THETA (THETA=0 => Z axis)
2883 gsord(PASSCHARD(vname), iax PASSCHARL(vname));
2886 //_____________________________________________________________________________
2887 void TGeant3::Gspos(const char *name, Int_t nr, const char *mother, Float_t x,
2888 Float_t y, Float_t z, Int_t irot, const char *konly)
2891 // Position a volume into an existing one
2894 // NUMBER Copy number of the volume
2895 // MOTHER Mother volume name
2896 // X X coord. of the volume in mother ref. sys.
2897 // Y Y coord. of the volume in mother ref. sys.
2898 // Z Z coord. of the volume in mother ref. sys.
2899 // IROT Rotation matrix number w.r.t. mother ref. sys.
2900 // ONLY ONLY/MANY flag
2902 // It positions a previously defined volume in the mother.
2908 Vname(mother,vmother);
2909 gspos(PASSCHARD(vname), nr, PASSCHARD(vmother), x, y, z, irot,
2910 PASSCHARD(konly) PASSCHARL(vname) PASSCHARL(vmother)
2914 //_____________________________________________________________________________
2915 void TGeant3::Gsposp(const char *name, Int_t nr, const char *mother,
2916 Float_t x, Float_t y, Float_t z, Int_t irot,
2917 const char *konly, Float_t *upar, Int_t np )
2920 // Place a copy of generic volume NAME with user number
2921 // NR inside MOTHER, with its parameters UPAR(1..NP)
2926 Vname(mother,vmother);
2927 gsposp(PASSCHARD(vname), nr, PASSCHARD(vmother), x, y, z, irot,
2928 PASSCHARD(konly), upar, np PASSCHARL(vname) PASSCHARL(vmother)
2932 //_____________________________________________________________________________
2933 void TGeant3::Gsrotm(Int_t nmat, Float_t theta1, Float_t phi1, Float_t theta2,
2934 Float_t phi2, Float_t theta3, Float_t phi3)
2937 // nmat Rotation matrix number
2938 // THETA1 Polar angle for axis I
2939 // PHI1 Azimuthal angle for axis I
2940 // THETA2 Polar angle for axis II
2941 // PHI2 Azimuthal angle for axis II
2942 // THETA3 Polar angle for axis III
2943 // PHI3 Azimuthal angle for axis III
2945 // It defines the rotation matrix number IROT.
2947 gsrotm(nmat, theta1, phi1, theta2, phi2, theta3, phi3);
2950 //_____________________________________________________________________________
2951 void TGeant3::Gprotm(Int_t nmat)
2954 // To print rotation matrices structure JROTM
2955 // nmat Rotation matrix number
2960 //_____________________________________________________________________________
2961 Int_t TGeant3::Gsvolu(const char *name, const char *shape, Int_t nmed,
2962 Float_t *upar, Int_t npar)
2966 // SHAPE Volume type
2967 // NUMED Tracking medium number
2968 // NPAR Number of shape parameters
2969 // UPAR Vector containing shape parameters
2971 // It creates a new volume in the JVOLUM data structure.
2977 Vname(shape,vshape);
2978 gsvolu(PASSCHARD(vname), PASSCHARD(vshape), nmed, upar, npar, ivolu
2979 PASSCHARL(vname) PASSCHARL(vshape));
2983 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2985 // T H E D R A W I N G P A C K A G E
2986 // ======================================
2987 // Drawing functions. These functions allow the visualization in several ways
2988 // of the volumes defined in the geometrical data structure. It is possible
2989 // to draw the logical tree of volumes belonging to the detector (DTREE),
2990 // to show their geometrical specification (DSPEC,DFSPC), to draw them
2991 // and their cut views (DRAW, DCUT). Moreover, it is possible to execute
2992 // these commands when the hidden line removal option is activated; in
2993 // this case, the volumes can be also either translated in the space
2994 // (SHIFT), or clipped by boolean operation (CVOL). In addition, it is
2995 // possible to fill the surfaces of the volumes
2996 // with solid colours when the shading option (SHAD) is activated.
2997 // Several tools (ZOOM, LENS) have been developed to zoom detailed parts
2998 // of the detectors or to scan physical events as well.
2999 // Finally, the command MOVE will allow the rotation, translation and zooming
3000 // on real time parts of the detectors or tracks and hits of a simulated event.
3001 // Ray-tracing commands. In case the command (DOPT RAYT ON) is executed,
3002 // the drawing is performed by the Geant ray-tracing;
3003 // automatically, the color is assigned according to the tracking medium of each
3004 // volume and the volumes with a density lower/equal than the air are considered
3005 // transparent; if the option (USER) is set (ON) (again via the command (DOPT)),
3006 // the user can set color and visibility for the desired volumes via the command
3007 // (SATT), as usual, relatively to the attributes (COLO) and (SEEN).
3008 // The resolution can be set via the command (SATT * FILL VALUE), where (VALUE)
3009 // is the ratio between the number of pixels drawn and 20 (user coordinates).
3010 // Parallel view and perspective view are possible (DOPT PROJ PARA/PERS); in the
3011 // first case, we assume that the first mother volume of the tree is a box with
3012 // dimensions 10000 X 10000 X 10000 cm and the view point (infinetely far) is
3013 // 5000 cm far from the origin along the Z axis of the user coordinates; in the
3014 // second case, the distance between the observer and the origin of the world
3015 // reference system is set in cm by the command (PERSP NAME VALUE); grand-angle
3016 // or telescopic effects can be achieved changing the scale factors in the command
3017 // (DRAW). When the final picture does not occupy the full window,
3018 // mapping the space before tracing can speed up the drawing, but can also
3019 // produce less precise results; values from 1 to 4 are allowed in the command
3020 // (DOPT MAPP VALUE), the mapping being more precise for increasing (VALUE); for
3021 // (VALUE = 0) no mapping is performed (therefore max precision and lowest speed).
3022 // The command (VALCUT) allows the cutting of the detector by three planes
3023 // ortogonal to the x,y,z axis. The attribute (LSTY) can be set by the command
3024 // SATT for any desired volume and can assume values from 0 to 7; it determines
3025 // the different light processing to be performed for different materials:
3026 // 0 = dark-matt, 1 = bright-matt, 2 = plastic, 3 = ceramic, 4 = rough-metals,
3027 // 5 = shiny-metals, 6 = glass, 7 = mirror. The detector is assumed to be in the
3028 // dark, the ambient light luminosity is 0.2 for each basic hue (the saturation
3029 // is 0.9) and the observer is assumed to have a light source (therefore he will
3030 // produce parallel light in the case of parallel view and point-like-source
3031 // light in the case of perspective view).
3033 //*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
3035 //_____________________________________________________________________________
3036 void TGeant3::Gsatt(const char *name, const char *att, Int_t val)
3040 // IOPT Name of the attribute to be set
3041 // IVAL Value to which the attribute is to be set
3043 // name= "*" stands for all the volumes.
3044 // iopt can be chosen among the following :
3046 // WORK 0=volume name is inactive for the tracking
3047 // 1=volume name is active for the tracking (default)
3049 // SEEN 0=volume name is invisible
3050 // 1=volume name is visible (default)
3051 // -1=volume invisible with all its descendants in the tree
3052 // -2=volume visible but not its descendants in the tree
3054 // LSTY line style 1,2,3,... (default=1)
3055 // LSTY=7 will produce a very precise approximation for
3056 // revolution bodies.
3058 // LWID line width -7,...,1,2,3,..7 (default=1)
3059 // LWID<0 will act as abs(LWID) was set for the volume
3060 // and for all the levels below it. When SHAD is 'ON', LWID
3061 // represent the linewidth of the scan lines filling the surfaces
3062 // (whereas the FILL value represent their number). Therefore
3063 // tuning this parameter will help to obtain the desired
3064 // quality/performance ratio.
3066 // COLO colour code -166,...,1,2,..166 (default=1)
3068 // n=2=red; n=17+m, m=0,25, increasing luminosity according to 'm';
3069 // n=3=green; n=67+m, m=0,25, increasing luminosity according to 'm';
3070 // n=4=blue; n=117+m, m=0,25, increasing luminosity according to 'm';
3071 // n=5=yellow; n=42+m, m=0,25, increasing luminosity according to 'm';
3072 // n=6=violet; n=142+m, m=0,25, increasing luminosity according to 'm';
3073 // n=7=lightblue; n=92+m, m=0,25, increasing luminosity according to 'm';
3074 // colour=n*10+m, m=1,2,...9, will produce the same colour
3075 // as 'n', but with increasing luminosity according to 'm';
3076 // COLO<0 will act as if abs(COLO) was set for the volume
3077 // and for all the levels below it.
3078 // When for a volume the attribute FILL is > 1 (and the
3079 // option SHAD is on), the ABS of its colour code must be < 8
3080 // because an automatic shading of its faces will be
3083 // FILL (1992) fill area -7,...,0,1,...7 (default=0)
3084 // when option SHAD is "on" the FILL attribute of any
3085 // volume can be set different from 0 (normal drawing);
3086 // if it is set to 1, the faces of such volume will be filled
3087 // with solid colours; if ABS(FILL) is > 1, then a light
3088 // source is placed along the observer line, and the faces of
3089 // such volumes will be painted by colours whose luminosity
3090 // will depend on the amount of light reflected;
3091 // if ABS(FILL) = 1, then it is possible to use all the 166
3092 // colours of the colour table, becouse the automatic shading
3093 // is not performed;
3094 // for increasing values of FILL the drawing will be performed
3095 // with higher and higher resolution improving the quality (the
3096 // number of scan lines used to fill the faces increases with FILL);
3097 // it is possible to set different values of FILL
3098 // for different volumes, in order to optimize at the same time
3099 // the performance and the quality of the picture;
3100 // FILL<0 will act as if abs(FILL) was set for the volume
3101 // and for all the levels below it.
3102 // This kind of drawing can be saved in 'picture files'
3103 // or in view banks.
3104 // 0=drawing without fill area
3105 // 1=faces filled with solid colours and resolution = 6
3106 // 2=lowest resolution (very fast)
3107 // 3=default resolution
3108 // 4=.................
3109 // 5=.................
3110 // 6=.................
3112 // Finally, if a coloured background is desired, the FILL
3113 // attribute for the first volume of the tree must be set
3114 // equal to -abs(colo), colo being >0 and <166.
3116 // SET set number associated to volume name
3117 // DET detector number associated to volume name
3118 // DTYP detector type (1,2)
3125 gsatt(PASSCHARD(vname), PASSCHARD(vatt), val PASSCHARL(vname)
3129 //_____________________________________________________________________________
3130 void TGeant3::Gfpara(const char *name, Int_t number, Int_t intext, Int_t& npar,
3131 Int_t& natt, Float_t* par, Float_t* att)
3134 // Find the parameters of a volume
3136 gfpara(PASSCHARD(name), number, intext, npar, natt, par, att
3140 //_____________________________________________________________________________
3141 void TGeant3::Gckpar(Int_t ish, Int_t npar, Float_t* par)
3144 // Check the parameters of a shape
3146 gckpar(ish,npar,par);
3149 //_____________________________________________________________________________
3150 void TGeant3::Gckmat(Int_t itmed, char* natmed)
3153 // Check the parameters of a tracking medium
3155 gckmat(itmed, PASSCHARD(natmed) PASSCHARL(natmed));
3158 //_____________________________________________________________________________
3159 Int_t TGeant3::Glvolu(Int_t nlev, Int_t *lnam,Int_t *lnum)
3162 // nlev number of leveles deap into the volume tree
3163 // size of the arrays lnam and lnum
3164 // lnam an integer array whos 4 bytes contain the askii code for the
3166 // lnum an integer array containing the copy numbers for that specific
3169 // This routine fills the volulme paramters in common /gcvolu/ for a
3170 // physical tree, specified by the list lnam and lnum of volume names
3171 // and numbers, and for all its ascendants up to level 1. This routine
3172 // is optimsed and does not re-compute the part of the history already
3173 // available in GCVOLU. This means that if it is used in user programs
3174 // outside the usual framwork of the tracking, the user has to initilise
3175 // to zero NLEVEL in the common GCVOLU. It return 0 if there were no
3176 // problems in make the call.
3179 glvolu(nlev, lnam, lnum, ier);
3183 //_____________________________________________________________________________
3184 void TGeant3::Gdelete(Int_t iview)
3187 // IVIEW View number
3189 // It deletes a view bank from memory.
3194 //_____________________________________________________________________________
3195 void TGeant3::Gdopen(Int_t iview)
3198 // IVIEW View number
3200 // When a drawing is very complex and requires a long time to be
3201 // executed, it can be useful to store it in a view bank: after a
3202 // call to DOPEN and the execution of the drawing (nothing will
3203 // appear on the screen), and after a necessary call to DCLOSE,
3204 // the contents of the bank can be displayed in a very fast way
3205 // through a call to DSHOW; therefore, the detector can be easily
3206 // zoomed many times in different ways. Please note that the pictures
3207 // with solid colours can now be stored in a view bank or in 'PICTURE FILES'
3214 //_____________________________________________________________________________
3215 void TGeant3::Gdclose()
3218 // It closes the currently open view bank; it must be called after the
3219 // end of the drawing to be stored.
3224 //_____________________________________________________________________________
3225 void TGeant3::Gdshow(Int_t iview)
3228 // IVIEW View number
3230 // It shows on the screen the contents of a view bank. It
3231 // can be called after a view bank has been closed.
3236 //_____________________________________________________________________________
3237 void TGeant3::Gdopt(const char *name,const char *value)
3241 // VALUE Option value
3243 // To set/modify the drawing options.
3246 // THRZ ON Draw tracks in R vs Z
3247 // OFF (D) Draw tracks in X,Y,Z
3250 // PROJ PARA (D) Parallel projection
3252 // TRAK LINE (D) Trajectory drawn with lines
3253 // POIN " " with markers
3254 // HIDE ON Hidden line removal using the CG package
3255 // OFF (D) No hidden line removal
3256 // SHAD ON Fill area and shading of surfaces.
3257 // OFF (D) Normal hidden line removal.
3258 // RAYT ON Ray-tracing on.
3259 // OFF (D) Ray-tracing off.
3260 // EDGE OFF Does not draw contours when shad is on.
3261 // ON (D) Normal shading.
3262 // MAPP 1,2,3,4 Mapping before ray-tracing.
3263 // 0 (D) No mapping.
3264 // USER ON User graphics options in the raytracing.
3265 // OFF (D) Automatic graphics options.
3271 Vname(value,vvalue);
3272 gdopt(PASSCHARD(vname), PASSCHARD(vvalue) PASSCHARL(vname)
3276 //_____________________________________________________________________________
3277 void TGeant3::Gdraw(const char *name,Float_t theta, Float_t phi, Float_t psi,
3278 Float_t u0,Float_t v0,Float_t ul,Float_t vl)
3283 // THETA Viewing angle theta (for 3D projection)
3284 // PHI Viewing angle phi (for 3D projection)
3285 // PSI Viewing angle psi (for 2D rotation)
3286 // U0 U-coord. (horizontal) of volume origin
3287 // V0 V-coord. (vertical) of volume origin
3288 // SU Scale factor for U-coord.
3289 // SV Scale factor for V-coord.
3291 // This function will draw the volumes,
3292 // selected with their graphical attributes, set by the Gsatt
3293 // facility. The drawing may be performed with hidden line removal
3294 // and with shading effects according to the value of the options HIDE
3295 // and SHAD; if the option SHAD is ON, the contour's edges can be
3296 // drawn or not. If the option HIDE is ON, the detector can be
3297 // exploded (BOMB), clipped with different shapes (CVOL), and some
3298 // of its parts can be shifted from their original
3299 // position (SHIFT). When HIDE is ON, if
3300 // the drawing requires more than the available memory, the program
3301 // will evaluate and display the number of missing words
3302 // (so that the user can increase the
3303 // size of its ZEBRA store). Finally, at the end of each drawing (with HIDE on),
3304 // the program will print messages about the memory used and
3305 // statistics on the volumes' visibility.
3306 // The following commands will produce the drawing of a green
3307 // volume, specified by NAME, without using the hidden line removal
3308 // technique, using the hidden line removal technique,
3309 // with different linewidth and colour (red), with
3310 // solid colour, with shading of surfaces, and without edges.
3311 // Finally, some examples are given for the ray-tracing. (A possible
3312 // string for the NAME of the volume can be found using the command DTREE).
3318 if (fGcvdma->raytra != 1) {
3319 gdraw(PASSCHARD(vname), theta,phi,psi,u0,v0,ul,vl PASSCHARL(vname));
3321 gdrayt(PASSCHARD(vname), theta,phi,psi,u0,v0,ul,vl PASSCHARL(vname));
3325 //_____________________________________________________________________________
3326 void TGeant3::Gdrawc(const char *name,Int_t axis, Float_t cut,Float_t u0,
3327 Float_t v0,Float_t ul,Float_t vl)
3332 // CUTVAL Cut plane distance from the origin along the axis
3334 // U0 U-coord. (horizontal) of volume origin
3335 // V0 V-coord. (vertical) of volume origin
3336 // SU Scale factor for U-coord.
3337 // SV Scale factor for V-coord.
3339 // The cut plane is normal to caxis (X,Y,Z), corresponding to iaxis (1,2,3),
3340 // and placed at the distance cutval from the origin.
3341 // The resulting picture is seen from the the same axis.
3342 // When HIDE Mode is ON, it is possible to get the same effect with
3343 // the CVOL/BOX function.
3349 gdrawc(PASSCHARD(vname), axis,cut,u0,v0,ul,vl PASSCHARL(vname));
3352 //_____________________________________________________________________________
3353 void TGeant3::Gdrawx(const char *name,Float_t cutthe, Float_t cutphi,
3354 Float_t cutval, Float_t theta, Float_t phi, Float_t u0,
3355 Float_t v0,Float_t ul,Float_t vl)
3359 // CUTTHE Theta angle of the line normal to cut plane
3360 // CUTPHI Phi angle of the line normal to cut plane
3361 // CUTVAL Cut plane distance from the origin along the axis
3363 // THETA Viewing angle theta (for 3D projection)
3364 // PHI Viewing angle phi (for 3D projection)
3365 // U0 U-coord. (horizontal) of volume origin
3366 // V0 V-coord. (vertical) of volume origin
3367 // SU Scale factor for U-coord.
3368 // SV Scale factor for V-coord.
3370 // The cut plane is normal to the line given by the cut angles
3371 // cutthe and cutphi and placed at the distance cutval from the origin.
3372 // The resulting picture is seen from the viewing angles theta,phi.
3378 gdrawx(PASSCHARD(vname), cutthe,cutphi,cutval,theta,phi,u0,v0,ul,vl
3382 //_____________________________________________________________________________
3383 void TGeant3::Gdhead(Int_t isel, const char *name, Float_t chrsiz)
3388 // ISEL Option flag D=111110
3390 // CHRSIZ Character size (cm) of title NAME D=0.6
3393 // 0 to have only the header lines
3394 // xxxxx1 to add the text name centered on top of header
3395 // xxxx1x to add global detector name (first volume) on left
3396 // xxx1xx to add date on right
3397 // xx1xxx to select thick characters for text on top of header
3398 // x1xxxx to add the text 'EVENT NR x' on top of header
3399 // 1xxxxx to add the text 'RUN NR x' on top of header
3400 // NOTE that ISEL=x1xxx1 or ISEL=1xxxx1 are illegal choices,
3401 // i.e. they generate overwritten text.
3403 gdhead(isel,PASSCHARD(name),chrsiz PASSCHARL(name));
3406 //_____________________________________________________________________________
3407 void TGeant3::Gdman(Float_t u, Float_t v, const char *type)
3410 // Draw a 2D-man at position (U0,V0)
3412 // U U-coord. (horizontal) of the centre of man' R
3413 // V V-coord. (vertical) of the centre of man' R
3414 // TYPE D='MAN' possible values: 'MAN,WM1,WM2,WM3'
3416 // CALL GDMAN(u,v),CALL GDWMN1(u,v),CALL GDWMN2(u,v),CALL GDWMN2(u,v)
3417 // It superimposes the picure of a man or of a woman, chosen among
3418 // three different ones, with the same scale factors as the detector
3419 // in the current drawing.
3422 if (opt.Contains("WM1")) {
3424 } else if (opt.Contains("WM3")) {
3426 } else if (opt.Contains("WM2")) {
3433 //_____________________________________________________________________________
3434 void TGeant3::Gdspec(const char *name)
3439 // Shows 3 views of the volume (two cut-views and a 3D view), together with
3440 // its geometrical specifications. The 3D drawing will
3441 // be performed according the current values of the options HIDE and
3442 // SHAD and according the current SetClipBox clipping parameters for that
3449 gdspec(PASSCHARD(vname) PASSCHARL(vname));
3452 //_____________________________________________________________________________
3453 void TGeant3::DrawOneSpec(const char *name)
3456 // Function called when one double-clicks on a volume name
3457 // in a TPavelabel drawn by Gdtree.
3459 THIGZ *higzSave = gHigz;
3460 higzSave->SetName("higzSave");
3461 THIGZ *higzSpec = (THIGZ*)gROOT->FindObject("higzSpec");
3462 //printf("DrawOneSpec, gHigz=%x, higzSpec=%x\n",gHigz,higzSpec);
3463 if (higzSpec) gHigz = higzSpec;
3464 else higzSpec = new THIGZ(kDefSize);
3465 higzSpec->SetName("higzSpec");
3470 gdspec(PASSCHARD(vname) PASSCHARL(vname));
3473 higzSave->SetName("higz");
3477 //_____________________________________________________________________________
3478 void TGeant3::Gdtree(const char *name,Int_t levmax, Int_t isel)
3482 // LEVMAX Depth level
3485 // This function draws the logical tree,
3486 // Each volume in the tree is represented by a TPaveTree object.
3487 // Double-clicking on a TPaveTree draws the specs of the corresponding volume.
3488 // Use TPaveTree pop-up menu to select:
3491 // - drawing tree of parent
3497 gdtree(PASSCHARD(vname), levmax, isel PASSCHARL(vname));
3498 gHigz->SetPname("");
3501 //_____________________________________________________________________________
3502 void TGeant3::GdtreeParent(const char *name,Int_t levmax, Int_t isel)
3506 // LEVMAX Depth level
3509 // This function draws the logical tree of the parent of name.
3513 // Scan list of volumes in JVOLUM
3515 Int_t gname, i, jvo, in, nin, jin, num;
3516 strncpy((char *) &gname, name, 4);
3517 for(i=1; i<=fGcnum->nvolum; i++) {
3518 jvo = fZlq[fGclink->jvolum-i];
3519 nin = Int_t(fZq[jvo+3]);
3520 if (nin == -1) nin = 1;
3521 for (in=1;in<=nin;in++) {
3523 num = Int_t(fZq[jin+2]);
3524 if(gname == fZiq[fGclink->jvolum+num]) {
3525 strncpy(vname,(char*)&fZiq[fGclink->jvolum+i],4);
3527 gdtree(PASSCHARD(vname), levmax, isel PASSCHARL(vname));
3528 gHigz->SetPname("");
3535 //_____________________________________________________________________________
3536 void TGeant3::SetABAN(Int_t par)
3539 // par = 1 particles will be stopped according to their residual
3540 // range if they are not in a sensitive material and are
3541 // far enough from the boundary
3542 // 0 particles are transported normally
3544 fGcphys->dphys1 = par;
3548 //_____________________________________________________________________________
3549 void TGeant3::SetANNI(Int_t par)
3552 // To control positron annihilation.
3553 // par =0 no annihilation
3554 // =1 annihilation. Decays processed.
3555 // =2 annihilation. No decay products stored.
3557 fGcphys->ianni = par;
3561 //_____________________________________________________________________________
3562 void TGeant3::SetAUTO(Int_t par)
3565 // To control automatic calculation of tracking medium parameters:
3566 // par =0 no automatic calculation;
3567 // =1 automati calculation.
3569 fGctrak->igauto = par;
3573 //_____________________________________________________________________________
3574 void TGeant3::SetBOMB(Float_t boom)
3577 // BOOM : Exploding factor for volumes position
3579 // To 'explode' the detector. If BOOM is positive (values smaller
3580 // than 1. are suggested, but any value is possible)
3581 // all the volumes are shifted by a distance
3582 // proportional to BOOM along the direction between their centre
3583 // and the origin of the MARS; the volumes which are symmetric
3584 // with respect to this origin are simply not shown.
3585 // BOOM equal to 0 resets the normal mode.
3586 // A negative (greater than -1.) value of
3587 // BOOM will cause an 'implosion'; for even lower values of BOOM
3588 // the volumes' positions will be reflected respect to the origin.
3589 // This command can be useful to improve the 3D effect for very
3590 // complex detectors. The following commands will make explode the
3597 //_____________________________________________________________________________
3598 void TGeant3::SetBREM(Int_t par)
3601 // To control bremstrahlung.
3602 // par =0 no bremstrahlung
3603 // =1 bremstrahlung. Photon processed.
3604 // =2 bremstrahlung. No photon stored.
3606 fGcphys->ibrem = par;
3610 //_____________________________________________________________________________
3611 void TGeant3::SetCKOV(Int_t par)
3614 // To control Cerenkov production
3615 // par =0 no Cerenkov;
3617 // =2 Cerenkov with primary stopped at each step.
3619 fGctlit->itckov = par;
3623 //_____________________________________________________________________________
3624 void TGeant3::SetClipBox(const char *name,Float_t xmin,Float_t xmax,
3625 Float_t ymin,Float_t ymax,Float_t zmin,Float_t zmax)
3628 // The hidden line removal technique is necessary to visualize properly
3629 // very complex detectors. At the same time, it can be useful to visualize
3630 // the inner elements of a detector in detail. This function allows
3631 // subtractions (via boolean operation) of BOX shape from any part of
3632 // the detector, therefore showing its inner contents.
3633 // If "*" is given as the name of the
3634 // volume to be clipped, all volumes are clipped by the given box.
3635 // A volume can be clipped at most twice.
3636 // if a volume is explicitely clipped twice,
3637 // the "*" will not act on it anymore. Giving "." as the name
3638 // of the volume to be clipped will reset the clipping.
3640 // NAME Name of volume to be clipped
3642 // XMIN Lower limit of the Shape X coordinate
3643 // XMAX Upper limit of the Shape X coordinate
3644 // YMIN Lower limit of the Shape Y coordinate
3645 // YMAX Upper limit of the Shape Y coordinate
3646 // ZMIN Lower limit of the Shape Z coordinate
3647 // ZMAX Upper limit of the Shape Z coordinate
3649 // This function performs a boolean subtraction between the volume
3650 // NAME and a box placed in the MARS according the values of the given
3656 setclip(PASSCHARD(vname),xmin,xmax,ymin,ymax,zmin,zmax PASSCHARL(vname));
3659 //_____________________________________________________________________________
3660 void TGeant3::SetCOMP(Int_t par)
3663 // To control Compton scattering
3664 // par =0 no Compton
3665 // =1 Compton. Electron processed.
3666 // =2 Compton. No electron stored.
3669 fGcphys->icomp = par;
3672 //_____________________________________________________________________________
3673 void TGeant3::SetCUTS(Float_t cutgam,Float_t cutele,Float_t cutneu,
3674 Float_t cuthad,Float_t cutmuo ,Float_t bcute ,
3675 Float_t bcutm ,Float_t dcute ,Float_t dcutm ,
3676 Float_t ppcutm, Float_t tofmax)
3679 // CUTGAM Cut for gammas D=0.001
3680 // CUTELE Cut for electrons D=0.001
3681 // CUTHAD Cut for charged hadrons D=0.01
3682 // CUTNEU Cut for neutral hadrons D=0.01
3683 // CUTMUO Cut for muons D=0.01
3684 // BCUTE Cut for electron brems. D=-1.
3685 // BCUTM Cut for muon brems. D=-1.
3686 // DCUTE Cut for electron delta-rays D=-1.
3687 // DCUTM Cut for muon delta-rays D=-1.
3688 // PPCUTM Cut for e+e- pairs by muons D=0.01
3689 // TOFMAX Time of flight cut D=1.E+10
3691 // If the default values (-1.) for BCUTE ,BCUTM ,DCUTE ,DCUTM
3692 // are not modified, they will be set to CUTGAM,CUTGAM,CUTELE,CUTELE
3694 // If one of the parameters from CUTGAM to PPCUTM included
3695 // is modified, cross-sections and energy loss tables must be
3696 // recomputed via the function Gphysi.
3698 fGccuts->cutgam = cutgam;
3699 fGccuts->cutele = cutele;
3700 fGccuts->cutneu = cutneu;
3701 fGccuts->cuthad = cuthad;
3702 fGccuts->cutmuo = cutmuo;
3703 fGccuts->bcute = bcute;
3704 fGccuts->bcutm = bcutm;
3705 fGccuts->dcute = dcute;
3706 fGccuts->dcutm = dcutm;
3707 fGccuts->ppcutm = ppcutm;
3708 fGccuts->tofmax = tofmax;
3711 //_____________________________________________________________________________
3712 void TGeant3::SetDCAY(Int_t par)
3715 // To control Decay mechanism.
3716 // par =0 no decays.
3717 // =1 Decays. secondaries processed.
3718 // =2 Decays. No secondaries stored.
3720 fGcphys->idcay = par;
3724 //_____________________________________________________________________________
3725 void TGeant3::SetDEBU(Int_t emin, Int_t emax, Int_t emod)
3728 // Set the debug flag and frequency
3729 // Selected debug output will be printed from
3730 // event emin to even emax each emod event
3732 fGcflag->idemin = emin;
3733 fGcflag->idemax = emax;
3734 fGcflag->itest = emod;
3738 //_____________________________________________________________________________
3739 void TGeant3::SetDRAY(Int_t par)
3742 // To control delta rays mechanism.
3743 // par =0 no delta rays.
3744 // =1 Delta rays. secondaries processed.
3745 // =2 Delta rays. No secondaries stored.
3747 fGcphys->idray = par;
3750 //_____________________________________________________________________________
3751 void TGeant3::SetERAN(Float_t ekmin, Float_t ekmax, Int_t nekbin)
3754 // To control cross section tabulations
3755 // ekmin = minimum kinetic energy in GeV
3756 // ekmax = maximum kinetic energy in GeV
3757 // nekbin = number of logatithmic bins (<200)
3759 fGcmulo->ekmin = ekmin;
3760 fGcmulo->ekmax = ekmax;
3761 fGcmulo->nekbin = nekbin;
3764 //_____________________________________________________________________________
3765 void TGeant3::SetHADR(Int_t par)
3768 // To control hadronic interactions.
3769 // par =0 no hadronic interactions.
3770 // =1 Hadronic interactions. secondaries processed.
3771 // =2 Hadronic interactions. No secondaries stored.
3773 fGcphys->ihadr = par;
3776 //_____________________________________________________________________________
3777 void TGeant3::SetKINE(Int_t kine, Float_t xk1, Float_t xk2, Float_t xk3,
3778 Float_t xk4, Float_t xk5, Float_t xk6, Float_t xk7,
3779 Float_t xk8, Float_t xk9, Float_t xk10)
3782 // Set the variables in /GCFLAG/ IKINE, PKINE(10)
3783 // Their meaning is user defined
3785 fGckine->ikine = kine;
3786 fGckine->pkine[0] = xk1;
3787 fGckine->pkine[1] = xk2;
3788 fGckine->pkine[2] = xk3;
3789 fGckine->pkine[3] = xk4;
3790 fGckine->pkine[4] = xk5;
3791 fGckine->pkine[5] = xk6;
3792 fGckine->pkine[6] = xk7;
3793 fGckine->pkine[7] = xk8;
3794 fGckine->pkine[8] = xk9;
3795 fGckine->pkine[9] = xk10;
3798 //_____________________________________________________________________________
3799 void TGeant3::SetLOSS(Int_t par)
3802 // To control energy loss.
3803 // par =0 no energy loss;
3804 // =1 restricted energy loss fluctuations;
3805 // =2 complete energy loss fluctuations;
3807 // =4 no energy loss fluctuations.
3808 // If the value ILOSS is changed, then cross-sections and energy loss
3809 // tables must be recomputed via the command 'PHYSI'.
3811 fGcphys->iloss = par;
3815 //_____________________________________________________________________________
3816 void TGeant3::SetMULS(Int_t par)
3819 // To control multiple scattering.
3820 // par =0 no multiple scattering.
3821 // =1 Moliere or Coulomb scattering.
3822 // =2 Moliere or Coulomb scattering.
3823 // =3 Gaussian scattering.
3825 fGcphys->imuls = par;
3829 //_____________________________________________________________________________
3830 void TGeant3::SetMUNU(Int_t par)
3833 // To control muon nuclear interactions.
3834 // par =0 no muon-nuclear interactions.
3835 // =1 Nuclear interactions. Secondaries processed.
3836 // =2 Nuclear interactions. Secondaries not processed.
3838 fGcphys->imunu = par;
3841 //_____________________________________________________________________________
3842 void TGeant3::SetOPTI(Int_t par)
3845 // This flag controls the tracking optimisation performed via the
3847 // 1 no optimisation at all; GSORD calls disabled;
3848 // 0 no optimisation; only user calls to GSORD kept;
3849 // 1 all non-GSORDered volumes are ordered along the best axis;
3850 // 2 all volumes are ordered along the best axis.
3852 fGcopti->ioptim = par;
3855 //_____________________________________________________________________________
3856 void TGeant3::SetPAIR(Int_t par)
3859 // To control pair production mechanism.
3860 // par =0 no pair production.
3861 // =1 Pair production. secondaries processed.
3862 // =2 Pair production. No secondaries stored.
3864 fGcphys->ipair = par;
3868 //_____________________________________________________________________________
3869 void TGeant3::SetPFIS(Int_t par)
3872 // To control photo fission mechanism.
3873 // par =0 no photo fission.
3874 // =1 Photo fission. secondaries processed.
3875 // =2 Photo fission. No secondaries stored.
3877 fGcphys->ipfis = par;
3880 //_____________________________________________________________________________
3881 void TGeant3::SetPHOT(Int_t par)
3884 // To control Photo effect.
3885 // par =0 no photo electric effect.
3886 // =1 Photo effect. Electron processed.
3887 // =2 Photo effect. No electron stored.
3889 fGcphys->iphot = par;
3892 //_____________________________________________________________________________
3893 void TGeant3::SetRAYL(Int_t par)
3896 // To control Rayleigh scattering.
3897 // par =0 no Rayleigh scattering.
3900 fGcphys->irayl = par;
3903 //_____________________________________________________________________________
3904 void TGeant3::SetSTRA(Int_t par)
3907 // To control energy loss fluctuations
3908 // with the PhotoAbsorption Ionisation model.
3909 // par =0 no Straggling.
3910 // =1 Straggling yes => no Delta rays.
3912 fGcphlt->istra = par;
3915 //_____________________________________________________________________________
3916 void TGeant3::SetSWIT(Int_t sw, Int_t val)
3920 // val New switch value
3922 // Change one element of array ISWIT(10) in /GCFLAG/
3924 if (sw <= 0 || sw > 10) return;
3925 fGcflag->iswit[sw-1] = val;
3929 //_____________________________________________________________________________
3930 void TGeant3::SetTRIG(Int_t nevents)
3933 // Set number of events to be run
3935 fGcflag->nevent = nevents;
3938 //_____________________________________________________________________________
3939 void TGeant3::SetUserDecay(Int_t pdg)
3942 // Force the decays of particles to be done with Pythia
3943 // and not with the Geant routines.
3944 // just kill pointers doing mzdrop
3946 Int_t ipart = IdFromPDG(pdg);
3948 printf("Particle %d not in geant\n",pdg);
3951 Int_t jpart=fGclink->jpart;
3952 Int_t jpa=fZlq[jpart-ipart];
3955 Int_t jpa1=fZlq[jpa-1];
3957 mzdrop(fGcbank->ixcons,jpa1,PASSCHARD(" ") PASSCHARL(" "));
3958 Int_t jpa2=fZlq[jpa-2];
3960 mzdrop(fGcbank->ixcons,jpa2,PASSCHARD(" ") PASSCHARL(" "));
3964 //______________________________________________________________________________
3965 void TGeant3::Vname(const char *name, char *vname)
3968 // convert name to upper case. Make vname at least 4 chars
3970 Int_t l = strlen(name);
3973 for (i=0;i<l;i++) vname[i] = toupper(name[i]);
3974 for (i=l;i<4;i++) vname[i] = ' ';
3978 //______________________________________________________________________________
3979 void TGeant3::Ertrgo()
3982 // Perform the tracking of the track Track parameters are in VECT
3987 //______________________________________________________________________________
3988 void TGeant3::Ertrak(const Float_t *const x1, const Float_t *const p1,
3989 const Float_t *x2, const Float_t *p2,
3990 Int_t ipa, Option_t *chopt)
3992 //************************************************************************
3994 //* Perform the tracking of the track from point X1 to *
3996 //* (Before calling this routine the user should also provide *
3997 //* the input informations in /EROPTS/ and /ERTRIO/ *
3998 //* using subroutine EUFIL(L/P/V) *
3999 //* X1 - Starting coordinates (Cartesian) *
4000 //* P1 - Starting 3-momentum (Cartesian) *
4001 //* X2 - Final coordinates (Cartesian) *
4002 //* P2 - Final 3-momentum (Cartesian) *
4003 //* IPA - Particle code (a la GEANT) of the track *
4006 //* 'B' 'Backward tracking' - i.e. energy loss *
4007 //* added to the current energy *
4008 //* 'E' 'Exact' calculation of errors assuming *
4009 //* helix (i.e. pathlength not *
4010 //* assumed as infinitesimal) *
4011 //* 'L' Tracking upto prescribed Lengths reached *
4012 //* 'M' 'Mixed' prediction (not yet coded) *
4013 //* 'O' Tracking 'Only' without calculating errors *
4014 //* 'P' Tracking upto prescribed Planes reached *
4015 //* 'V' Tracking upto prescribed Volumes reached *
4016 //* 'X' Tracking upto prescribed Point approached *
4018 //* Interface with GEANT : *
4019 //* Track parameters are in /CGKINE/ and /GCTRAK/ *
4021 //* ==>Called by : USER *
4022 //* Authors M.Maire, E.Nagy ********//* *
4024 //************************************************************************
4025 ertrak(x1,p1,x2,p2,ipa,PASSCHARD(chopt) PASSCHARL(chopt));
4028 //_____________________________________________________________________________
4029 void TGeant3::WriteEuclid(const char* filnam, const char* topvol,
4030 Int_t number, Int_t nlevel)
4034 // ******************************************************************
4036 // * Write out the geometry of the detector in EUCLID file format *
4038 // * filnam : will be with the extension .euc *
4039 // * topvol : volume name of the starting node *
4040 // * number : copy number of topvol (relevant for gsposp) *
4041 // * nlevel : number of levels in the tree structure *
4042 // * to be written out, starting from topvol *
4044 // * Author : M. Maire *
4046 // ******************************************************************
4048 // File filnam.tme is written out with the definitions of tracking
4049 // medias and materials.
4050 // As to restore original numbers for materials and medias, program
4051 // searches in the file euc_medi.dat and comparing main parameters of
4052 // the mat. defined inside geant and the one in file recognizes them
4053 // and is able to take number from file. If for any material or medium,
4054 // this procedure fails, ordering starts from 1.
4055 // Arrays IOTMED and IOMATE are used for this procedure
4057 const char kShape[][5]={"BOX ","TRD1","TRD2","TRAP","TUBE","TUBS","CONE",
4058 "CONS","SPHE","PARA","PGON","PCON","ELTU","HYPE",
4060 Int_t i, end, itm, irm, jrm, k, nmed;
4064 char *filext, *filetme;
4065 char natmed[21], namate[21];
4066 char natmedc[21], namatec[21];
4067 char key[5], name[5], mother[5], konly[5];
4069 Int_t iadvol, iadtmd, iadrot, nwtot, iret;
4070 Int_t mlevel, numbr, natt, numed, nin, ndata;
4071 Int_t iname, ivo, ish, jvo, nvstak, ivstak;
4072 Int_t jdiv, ivin, in, jin, jvin, irot;
4073 Int_t jtm, imat, jma, flag=0, imatc;
4074 Float_t az, dens, radl, absl, a, step, x, y, z;
4075 Int_t npar, ndvmx, left;
4076 Float_t zc, densc, radlc, abslc, c0, tmaxfd;
4078 Int_t iomate[100], iotmed[100];
4079 Float_t par[50], att[20], ubuf[50];
4082 Int_t level, ndiv, iaxe;
4083 Int_t itmedc, nmatc, isvolc, ifieldc, nwbufc, isvol, nmat, ifield, nwbuf;
4084 Float_t fieldmc, tmaxfdc, stemaxc, deemaxc, epsilc, stminc, fieldm;
4085 Float_t tmaxf, stemax, deemax, epsil, stmin;
4086 const char *k10000="!\n%s\n!\n";
4087 //Open the input file
4089 for(i=0;i<end;i++) if(filnam[i]=='.') {
4093 filext=new char[end+5];
4094 filetme=new char[end+5];
4095 strncpy(filext,filnam,end);
4096 strncpy(filetme,filnam,end);
4098 // *** The output filnam name will be with extension '.euc'
4099 strcpy(&filext[end],".euc");
4100 strcpy(&filetme[end],".tme");
4101 lun=fopen(filext,"w");
4103 // *** Initialisation of the working space
4104 iadvol=fGcnum->nvolum;
4105 iadtmd=iadvol+fGcnum->nvolum;
4106 iadrot=iadtmd+fGcnum->ntmed;
4107 if(fGclink->jrotm) {
4108 fGcnum->nrotm=fZiq[fGclink->jrotm-2];
4112 nwtot=iadrot+fGcnum->nrotm;
4113 qws = new float[nwtot+1];
4114 for (i=0;i<nwtot+1;i++) qws[i]=0;
4117 if(nlevel==0) mlevel=20;
4119 // *** find the top volume and put it in the stak
4120 numbr = number>0 ? number : 1;
4121 Gfpara(topvol,numbr,1,npar,natt,par,att);
4123 printf(" *** GWEUCL *** top volume : %s number : %3d can not be a valid root\n",
4128 // *** authorized shape ?
4129 strncpy((char *)&iname, topvol, 4);
4131 for(i=1; i<=fGcnum->nvolum; i++) if(fZiq[fGclink->jvolum+i]==iname) {
4135 jvo = fZlq[fGclink->jvolum-ivo];
4136 ish = Int_t (fZq[jvo+2]);
4138 printf(" *** GWEUCL *** top volume : %s number : %3d can not be a valid root\n",
4145 iws[iadvol+ivo] = level;
4148 //*** flag all volumes and fill the stak
4152 // pick the next volume in stak
4154 ivo = TMath::Abs(iws[ivstak]);
4155 jvo = fZlq[fGclink->jvolum - ivo];
4157 // flag the tracking medium
4158 numed = Int_t (fZq[jvo + 4]);
4159 iws[iadtmd + numed] = 1;
4161 // get the daughters ...
4162 level = iws[iadvol+ivo];
4163 if (level < mlevel) {
4165 nin = Int_t (fZq[jvo + 3]);
4167 // from division ...
4169 jdiv = fZlq[jvo - 1];
4170 ivin = Int_t (fZq[jdiv + 2]);
4172 iws[nvstak] = -ivin;
4173 iws[iadvol+ivin] = level;
4175 // from position ...
4176 } else if (nin > 0) {
4177 for(in=1; in<=nin; in++) {
4178 jin = fZlq[jvo - in];
4179 ivin = Int_t (fZq[jin + 2 ]);
4180 jvin = fZlq[fGclink->jvolum - ivin];
4181 ish = Int_t (fZq[jvin + 2]);
4182 // authorized shape ?
4184 // not yet flagged ?
4185 if (iws[iadvol+ivin]==0) {
4188 iws[iadvol+ivin] = level;
4190 // flag the rotation matrix
4191 irot = Int_t ( fZq[jin + 4 ]);
4192 if (irot > 0) iws[iadrot+irot] = 1;
4198 // next volume in stak ?
4199 if (ivstak < nvstak) goto L10;
4201 // *** restore original material and media numbers
4202 // file euc_medi.dat is needed to compare materials and medias
4204 FILE* luncor=fopen("euc_medi.dat","r");
4207 for(itm=1; itm<=fGcnum->ntmed; itm++) {
4208 if (iws[iadtmd+itm] > 0) {
4209 jtm = fZlq[fGclink->jtmed-itm];
4210 strncpy(natmed,(char *)&fZiq[jtm+1],20);
4211 imat = Int_t (fZq[jtm+6]);
4212 jma = fZlq[fGclink->jmate-imat];
4214 printf(" *** GWEUCL *** material not defined for tracking medium %5i %s\n",itm,natmed);
4217 strncpy(namate,(char *)&fZiq[jma+1],20);
4220 //** find the material original number
4223 iret=fscanf(luncor,"%4s,%130s",key,card);
4224 if(iret<=0) goto L26;
4226 if(!strcmp(key,"MATE")) {
4227 sscanf(card,"%d %s %f %f %f %f %f %d",&imatc,namatec,&az,&zc,&densc,&radlc,&abslc,&nparc);
4228 Gfmate(imat,namate,a,z,dens,radl,absl,par,npar);
4229 if(!strcmp(namatec,namate)) {
4230 if(az==a && zc==z && densc==dens && radlc==radl
4231 && abslc==absl && nparc==nparc) {
4234 printf("*** GWEUCL *** material : %3d '%s' restored as %3d\n",imat,namate,imatc);
4236 printf("*** GWEUCL *** different definitions for material: %s\n",namate);
4240 if(strcmp(key,"END") && !flag) goto L23;
4242 printf("*** GWEUCL *** cannot restore original number for material: %s\n",namate);
4246 //*** restore original tracking medium number
4249 iret=fscanf(luncor,"%4s,%130s",key,card);
4250 if(iret<=0) goto L26;
4252 if (!strcmp(key,"TMED")) {
4253 sscanf(card,"%d %s %d %d %d %f %f %f %f %f %f %d\n",
4254 &itmedc,natmedc,&nmatc,&isvolc,&ifieldc,&fieldmc,
4255 &tmaxfdc,&stemaxc,&deemaxc,&epsilc,&stminc,&nwbufc);
4256 Gftmed(itm,natmed,nmat,isvol,ifield,fieldm,tmaxf,stemax,deemax,
4257 epsil,stmin,ubuf,&nwbuf);
4258 if(!strcmp(natmedc,natmed)) {
4259 if (iomate[nmat]==nmatc && nwbuf==nwbufc) {
4262 printf("*** GWEUCL *** medium : %3d '%20s' restored as %3d\n",
4265 printf("*** GWEUCL *** different definitions for tracking medium: %s\n",natmed);
4269 if(strcmp(key,"END") && !flag) goto L24;
4271 printf("cannot restore original number for medium : %s\n",natmed);
4279 L26: printf("*** GWEUCL *** cannot read the data file\n");
4281 L29: if(luncor) fclose (luncor);
4284 // *** write down the tracking medium definition
4286 strcpy(card,"! Tracking medium");
4287 fprintf(lun,k10000,card);
4289 for(itm=1;itm<=fGcnum->ntmed;itm++) {
4290 if (iws[iadtmd+itm]>0) {
4291 jtm = fZlq[fGclink->jtmed-itm];
4292 strncpy(natmed,(char *)&fZiq[jtm+1],20);
4294 imat = Int_t (fZq[jtm+6]);
4295 jma = fZlq[fGclink->jmate-imat];
4296 //* order media from one, if comparing with database failed
4298 iotmed[itm]=++imxtmed;
4299 iomate[imat]=++imxmate;
4304 printf(" *** GWEUCL *** material not defined for tracking medium %5d %s\n",
4307 strncpy(namate,(char *)&fZiq[jma+1],20);
4310 fprintf(lun,"TMED %3d '%20s' %3d '%20s'\n",iotmed[itm],natmed,iomate[imat],namate);
4314 //* *** write down the rotation matrix
4316 strcpy(card,"! Reperes");
4317 fprintf(lun,k10000,card);
4319 for(irm=1;irm<=fGcnum->nrotm;irm++) {
4320 if (iws[iadrot+irm]>0) {
4321 jrm = fZlq[fGclink->jrotm-irm];
4322 fprintf(lun,"ROTM %3d",irm);
4323 for(k=11;k<=16;k++) fprintf(lun," %8.3f",fZq[jrm+k]);
4328 //* *** write down the volume definition
4330 strcpy(card,"! Volumes");
4331 fprintf(lun,k10000,card);
4333 for(ivstak=1;ivstak<=nvstak;ivstak++) {
4336 strncpy(name,(char *)&fZiq[fGclink->jvolum+ivo],4);
4338 jvo = fZlq[fGclink->jvolum-ivo];
4339 ish = Int_t (fZq[jvo+2]);
4340 nmed = Int_t (fZq[jvo+4]);
4341 npar = Int_t (fZq[jvo+5]);
4343 if (ivstak>1) for(i=0;i<npar;i++) par[i]=fZq[jvo+7+i];
4344 Gckpar (ish,npar,par);
4345 fprintf(lun,"VOLU '%4s' '%4s' %3d %3d\n",name,kShape[ish-1],iotmed[nmed],npar);
4346 for(i=0;i<(npar-1)/6+1;i++) {
4349 for(k=0;k<(left<6?left:6);k++) fprintf(lun," %11.5f",par[i*6+k]);
4353 fprintf(lun,"VOLU '%4s' '%4s' %3d %3d\n",name,kShape[ish-1],iotmed[nmed],npar);
4358 //* *** write down the division of volumes
4360 fprintf(lun,k10000,"! Divisions");
4361 for(ivstak=1;ivstak<=nvstak;ivstak++) {
4362 ivo = TMath::Abs(iws[ivstak]);
4363 jvo = fZlq[fGclink->jvolum-ivo];
4364 ish = Int_t (fZq[jvo+2]);
4365 nin = Int_t (fZq[jvo+3]);
4366 //* this volume is divided ...
4369 iaxe = Int_t ( fZq[jdiv+1]);
4370 ivin = Int_t ( fZq[jdiv+2]);
4371 ndiv = Int_t ( fZq[jdiv+3]);
4374 jvin = fZlq[fGclink->jvolum-ivin];
4375 nmed = Int_t ( fZq[jvin+4]);
4376 strncpy(mother,(char *)&fZiq[fGclink->jvolum+ivo ],4);
4378 strncpy(name,(char *)&fZiq[fGclink->jvolum+ivin],4);
4380 if ((step<=0.)||(ish>=11)) {
4381 //* volume with negative parameter or gsposp or pgon ...
4382 fprintf(lun,"DIVN '%4s' '%4s' %3d %3d\n",name,mother,ndiv,iaxe);
4383 } else if ((ndiv<=0)||(ish==10)) {
4384 //* volume with negative parameter or gsposp or para ...
4385 ndvmx = TMath::Abs(ndiv);
4386 fprintf(lun,"DIVT '%4s' '%4s' %11.5f %3d %3d %3d\n",
4387 name,mother,step,iaxe,iotmed[nmed],ndvmx);
4389 //* normal volume : all kind of division are equivalent
4390 fprintf(lun,"DVT2 '%4s' '%4s' %11.5f %3d %11.5f %3d %3d\n",
4391 name,mother,step,iaxe,c0,iotmed[nmed],ndiv);
4396 //* *** write down the the positionnement of volumes
4398 fprintf(lun,k10000,"! Positionnements\n");
4400 for(ivstak = 1;ivstak<=nvstak;ivstak++) {
4401 ivo = TMath::Abs(iws[ivstak]);
4402 strncpy(mother,(char*)&fZiq[fGclink->jvolum+ivo ],4);
4404 jvo = fZlq[fGclink->jvolum-ivo];
4405 nin = Int_t( fZq[jvo+3]);
4406 //* this volume has daughters ...
4408 for (in=1;in<=nin;in++) {
4410 ivin = Int_t (fZq[jin +2]);
4411 numb = Int_t (fZq[jin +3]);
4412 irot = Int_t (fZq[jin +4]);
4416 strcpy(konly,"ONLY");
4417 if (fZq[jin+8]!=1.) strcpy(konly,"MANY");
4418 strncpy(name,(char*)&fZiq[fGclink->jvolum+ivin],4);
4420 jvin = fZlq[fGclink->jvolum-ivin];
4421 ish = Int_t (fZq[jvin+2]);
4422 //* gspos or gsposp ?
4423 ndata = fZiq[jin-1];
4425 fprintf(lun,"POSI '%4s' %4d '%4s' %11.5f %11.5f %11.5f %3d '%4s'\n",
4426 name,numb,mother,x,y,z,irot,konly);
4428 npar = Int_t (fZq[jin+9]);
4429 for(i=0;i<npar;i++) par[i]=fZq[jin+10+i];
4430 Gckpar (ish,npar,par);
4431 fprintf(lun,"POSP '%4s' %4d '%4s' %11.5f %11.5f %11.5f %3d '%4s' %3d\n",
4432 name,numb,mother,x,y,z,irot,konly,npar);
4434 for(i=0;i<npar;i++) fprintf(lun," %11.5f",par[i]);
4441 fprintf(lun,"END\n");
4444 //****** write down the materials and medias *****
4446 lun=fopen(filetme,"w");
4448 for(itm=1;itm<=fGcnum->ntmed;itm++) {
4449 if (iws[iadtmd+itm]>0) {
4450 jtm = fZlq[fGclink->jtmed-itm];
4451 strncpy(natmed,(char*)&fZiq[jtm+1],4);
4452 imat = Int_t (fZq[jtm+6]);
4453 jma = Int_t (fZlq[fGclink->jmate-imat]);
4455 Gfmate (imat,namate,a,z,dens,radl,absl,par,npar);
4456 fprintf(lun,"MATE %4d '%20s'%11.5E %11.5E %11.5E %11.5E %11.5E %3d\n",
4457 iomate[imat],namate,a,z,dens,radl,absl,npar);
4461 for(i=0;i<npar;i++) fprintf(lun," %11.5f",par[i]);
4465 Gftmed(itm,natmed,nmat,isvol,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin,par,&npar);
4466 fprintf(lun,"TMED %4d '%20s' %3d %1d %3d %11.5f %11.5f %11.5f %11.5f %11.5f %11.5f %3d\n",
4467 iotmed[itm],natmed,iomate[nmat],isvol,ifield,
4468 fieldm,tmaxfd,stemax,deemax,epsil,stmin,npar);
4472 for(i=0;i<npar;i++) fprintf(lun," %11.5f",par[i]);
4478 fprintf(lun,"END\n");
4480 printf(" *** GWEUCL *** file: %s is now written out\n",filext);
4481 printf(" *** GWEUCL *** file: %s is now written out\n",filetme);
4490 //_____________________________________________________________________________
4491 void TGeant3::Streamer(TBuffer &R__b)
4494 // Stream an object of class TGeant3.
4496 if (R__b.IsReading()) {
4497 Version_t R__v = R__b.ReadVersion(); if (R__v) { }
4498 AliMC::Streamer(R__b);
4501 R__b.ReadStaticArray(fPDGCode);
4503 R__b.WriteVersion(TGeant3::IsA());
4504 AliMC::Streamer(R__b);
4507 R__b.WriteArray(fPDGCode, fNPDGCodes);