TrackPid returns PDG now
[u/mrichter/AliRoot.git] / TGeant3 / TGeant3.cxx
CommitLineData
fe4da5cc 1///////////////////////////////////////////////////////////////////////////////
2// //
3// Interface Class to the Geant3.21 MonteCarlo //
4// //
5//Begin_Html
6/*
1439f98e 7<img src="picts/TGeant3Class.gif">
fe4da5cc 8*/
9//End_Html
10// //
11// //
12///////////////////////////////////////////////////////////////////////////////
13
14#include "TGeant3.h"
15#include "TROOT.h"
16#include "THIGZ.h"
17#include "ctype.h"
1578254f 18#include <TDatabasePDG.h>
fe4da5cc 19#include "AliCallf77.h"
20
21#ifndef WIN32
22# define gzebra gzebra_
23# define grfile grfile_
24# define gpcxyz gpcxyz_
25# define ggclos ggclos_
26# define glast glast_
27# define ginit ginit_
28# define gcinit gcinit_
29# define grun grun_
30# define gtrig gtrig_
31# define gtrigc gtrigc_
32# define gtrigi gtrigi_
33# define gwork gwork_
34# define gzinit gzinit_
35# define gfmate gfmate_
36# define gfpart gfpart_
37# define gftmed gftmed_
38# define gmate gmate_
39# define gpart gpart_
40# define gsdk gsdk_
41# define gsmate gsmate_
42# define gsmixt gsmixt_
43# define gspart gspart_
44# define gstmed gstmed_
45# define gsckov gsckov_
46# define gstpar gstpar_
47# define gfkine gfkine_
48# define gfvert gfvert_
49# define gskine gskine_
50# define gsvert gsvert_
51# define gphysi gphysi_
52# define gdebug gdebug_
53# define gekbin gekbin_
54# define gfinds gfinds_
55# define gsking gsking_
56# define gskpho gskpho_
57# define gsstak gsstak_
58# define gsxyz gsxyz_
59# define gtrack gtrack_
60# define gtreve gtreve_
1578254f 61# define gtreve_root gtreve_root_
fe4da5cc 62# define grndm grndm_
63# define grndmq grndmq_
64# define gdtom gdtom_
65# define glmoth glmoth_
66# define gmedia gmedia_
67# define gmtod gmtod_
68# define gsdvn gsdvn_
69# define gsdvn2 gsdvn2_
70# define gsdvs gsdvs_
71# define gsdvs2 gsdvs2_
72# define gsdvt gsdvt_
73# define gsdvt2 gsdvt2_
74# define gsord gsord_
75# define gspos gspos_
76# define gsposp gsposp_
77# define gsrotm gsrotm_
78# define gprotm gprotm_
79# define gsvolu gsvolu_
80# define gprint gprint_
81# define gdinit gdinit_
82# define gdopt gdopt_
83# define gdraw gdraw_
84# define gdrayt gdrayt_
85# define gdrawc gdrawc_
86# define gdrawx gdrawx_
87# define gdhead gdhead_
88# define gdwmn1 gdwmn1_
89# define gdwmn2 gdwmn2_
90# define gdwmn3 gdwmn3_
91# define gdxyz gdxyz_
92# define gdcxyz gdcxyz_
93# define gdman gdman_
94# define gdspec gdspec_
95# define gdtree gdtree_
96# define gdelet gdelet_
97# define gdclos gdclos_
98# define gdshow gdshow_
99# define gdopen gdopen_
100# define dzshow dzshow_
101# define gsatt gsatt_
102# define gfpara gfpara_
103# define gckpar gckpar_
104# define gckmat gckmat_
105# define geditv geditv_
7ac3f11b 106# define mzdrop mzdrop_
fe4da5cc 107
108# define setbomb setbomb_
109# define setclip setclip_
110# define gcomad gcomad_
111
112#else
113# define gzebra GZEBRA
114# define grfile GRFILE
115# define gpcxyz GPCXYZ
116# define ggclos GGCLOS
117# define glast GLAST
118# define ginit GINIT
119# define gcinit GCINIT
120# define grun GRUN
121# define gtrig GTRIG
122# define gtrigc GTRIGC
123# define gtrigi GTRIGI
124# define gwork GWORK
125# define gzinit GZINIT
126# define gfmate GFMATE
127# define gfpart GFPART
128# define gftmed GFTMED
129# define gmate GMATE
130# define gpart GPART
131# define gsdk GSDK
132# define gsmate GSMATE
133# define gsmixt GSMIXT
134# define gspart GSPART
135# define gstmed GSTMED
136# define gsckov GSCKOV
137# define gstpar GSTPAR
138# define gfkine GFKINE
139# define gfvert GFVERT
140# define gskine GSKINE
141# define gsvert GSVERT
142# define gphysi GPHYSI
143# define gdebug GDEBUG
144# define gekbin GEKBIN
145# define gfinds GFINDS
146# define gsking GSKING
147# define gskpho GSKPHO
148# define gsstak GSSTAK
149# define gsxyz GSXYZ
150# define gtrack GTRACK
151# define gtreve GTREVE
1578254f 152# define gtreve_root GTREVE_ROOT
fe4da5cc 153# define grndm GRNDM
154# define grndmq GRNDMQ
155# define gdtom GDTOM
156# define glmoth GLMOTH
157# define gmedia GMEDIA
158# define gmtod GMTOD
159# define gsdvn GSDVN
160# define gsdvn2 GSDVN2
161# define gsdvs GSDVS
162# define gsdvs2 GSDVS2
163# define gsdvt GSDVT
164# define gsdvt2 GSDVT2
165# define gsord GSORD
166# define gspos GSPOS
167# define gsposp GSPOSP
168# define gsrotm GSROTM
169# define gprotm GPROTM
170# define gsvolu GSVOLU
171# define gprint GPRINT
172# define gdinit GDINIT
173# define gdopt GDOPT
174# define gdraw GDRAW
175# define gdrayt GDRAYT
176# define gdrawc GDRAWC
177# define gdrawx GDRAWX
178# define gdhead GDHEAD
179# define gdwmn1 GDWMN1
180# define gdwmn2 GDWMN2
181# define gdwmn3 GDWMN3
182# define gdxyz GDXYZ
183# define gdcxyz GDCXYZ
184# define gdman GDMAN
185# define gdfspc GDFSPC
186# define gdspec GDSPEC
187# define gdtree GDTREE
188# define gdelet GDELET
189# define gdclos GDCLOS
190# define gdshow GDSHOW
191# define gdopen GDOPEN
192# define dzshow DZSHOW
193# define gsatt GSATT
194# define gfpara GFPARA
195# define gckpar GCKPAR
196# define gckmat GCKMAT
197# define geditv GEDITV
7ac3f11b 198# define mzdrop MZDROP
fe4da5cc 199
200# define setbomb SETBOMB
201# define setclip SETCLIP
7ac3f11b 202# define gcomad GCOMAD
fe4da5cc 203
204#endif
205
206//____________________________________________________________________________
207extern "C"
208{
209 //
210 // Prototypes for GEANT functions
211 //
212 void type_of_call gzebra(const int&);
213
214 void type_of_call gpcxyz();
215
216 void type_of_call ggclos();
217
218 void type_of_call glast();
219
220 void type_of_call ginit();
221
222 void type_of_call gcinit();
223
224 void type_of_call grun();
225
226 void type_of_call gtrig();
227
228 void type_of_call gtrigc();
229
230 void type_of_call gtrigi();
231
232 void type_of_call gwork(const int&);
233
234 void type_of_call gzinit();
235
236 void type_of_call gmate();
237
238 void type_of_call gpart();
239
240 void type_of_call gsdk(Int_t &, Float_t *, Int_t *);
241
242 void type_of_call gfkine(Int_t &, Float_t *, Float_t *, Int_t &,
243 Int_t &, Float_t *, Int_t &);
244
245 void type_of_call gfvert(Int_t &, Float_t *, Int_t &, Int_t &,
246 Float_t &, Float_t *, Int_t &);
247
248 void type_of_call gskine(Float_t *,Int_t &, Int_t &, Float_t *,
249 Int_t &, Int_t &);
250
251 void type_of_call gsvert(Float_t *,Int_t &, Int_t &, Float_t *,
252 Int_t &, Int_t &);
253
254 void type_of_call gphysi();
255
256 void type_of_call gdebug();
257
258 void type_of_call gekbin();
259
260 void type_of_call gfinds();
261
262 void type_of_call gsking(Int_t &);
263
264 void type_of_call gskpho(Int_t &);
265
266 void type_of_call gsstak(Int_t &);
267
268 void type_of_call gsxyz();
269
270 void type_of_call gtrack();
271
272 void type_of_call gtreve();
273
1578254f 274 void type_of_call gtreve_root();
275
fe4da5cc 276 void type_of_call grndm(Float_t *, const Int_t &);
277
278 void type_of_call grndmq(Int_t &, Int_t &, const Int_t &,
279 DEFCHARD DEFCHARL);
280
281 void type_of_call gdtom(Float_t *, Float_t *, Int_t &);
282
283 void type_of_call glmoth(DEFCHARD, Int_t &, Int_t &, Int_t *,
284 Int_t *, Int_t * DEFCHARL);
285
286 void type_of_call gmedia(Float_t *, Int_t &);
287
288 void type_of_call gmtod(Float_t *, Float_t *, Int_t &);
289
290 void type_of_call gsrotm(const Int_t &, const Float_t &, const Float_t &,
291 const Float_t &, const Float_t &, const Float_t &,
292 const Float_t &);
293
294 void type_of_call gprotm(const Int_t &);
295
296 void type_of_call grfile(const Int_t&, DEFCHARD,
297 DEFCHARD DEFCHARL DEFCHARL);
298
299 void type_of_call gfmate(const Int_t&, DEFCHARD, Float_t &, Float_t &,
300 Float_t &, Float_t &, Float_t &, Float_t *,
301 Int_t& DEFCHARL);
302
303 void type_of_call gfpart(const Int_t&, DEFCHARD, Int_t &, Float_t &,
304 Float_t &, Float_t &, Float_t *, Int_t & DEFCHARL);
305
306 void type_of_call gftmed(const Int_t&, DEFCHARD, Int_t &, Int_t &, Int_t &,
307 Float_t &, Float_t &, Float_t &, Float_t &,
308 Float_t &, Float_t &, Float_t *, Int_t * DEFCHARL);
309
310 void type_of_call gsmate(const Int_t&, DEFCHARD, Float_t &, Float_t &,
311 Float_t &, Float_t &, Float_t &, Float_t *,
312 Int_t & DEFCHARL);
313
314 void type_of_call gsmixt(const Int_t&, DEFCHARD, Float_t *, Float_t *,
315 Float_t &, Int_t &, Float_t * DEFCHARL);
316
317 void type_of_call gspart(const Int_t&, DEFCHARD, Int_t &, Float_t &,
318 Float_t &, Float_t &, Float_t *, Int_t & DEFCHARL);
319
320
321 void type_of_call gstmed(const Int_t&, DEFCHARD, Int_t &, Int_t &, Int_t &,
322 Float_t &, Float_t &, Float_t &, Float_t &,
323 Float_t &, Float_t &, Float_t *, Int_t & DEFCHARL);
324
325 void type_of_call gsckov(Int_t &itmed, Int_t &npckov, Float_t *ppckov,
326 Float_t *absco, Float_t *effic, Float_t *rindex);
327 void type_of_call gstpar(const Int_t&, DEFCHARD, Float_t & DEFCHARL);
328
329 void type_of_call gsdvn(DEFCHARD,DEFCHARD, Int_t &, Int_t &
330 DEFCHARL DEFCHARL);
331
332 void type_of_call gsdvn2(DEFCHARD,DEFCHARD, Int_t &, Int_t &, Float_t &,
333 Int_t & DEFCHARL DEFCHARL);
334
335 void type_of_call gsdvs(DEFCHARD,DEFCHARD, Float_t &, Int_t &, Int_t &
336 DEFCHARL DEFCHARL);
337
338 void type_of_call gsdvs2(DEFCHARD,DEFCHARD, Float_t &, Int_t &, Float_t &,
339 Int_t & DEFCHARL DEFCHARL);
340
341 void type_of_call gsdvt(DEFCHARD,DEFCHARD, Float_t &, Int_t &, Int_t &,
342 Int_t & DEFCHARL DEFCHARL);
343
344 void type_of_call gsdvt2(DEFCHARD,DEFCHARD, Float_t &, Int_t &, Float_t&,
345 Int_t &, Int_t & DEFCHARL DEFCHARL);
346
347 void type_of_call gsord(DEFCHARD, Int_t & DEFCHARL);
348
349 void type_of_call gspos(DEFCHARD, Int_t &, DEFCHARD, Float_t &, Float_t &,
350 Float_t &, Int_t &, DEFCHARD DEFCHARL DEFCHARL
351 DEFCHARL);
352
353 void type_of_call gsposp(DEFCHARD, Int_t &, DEFCHARD, Float_t &, Float_t &,
354 Float_t &, Int_t &, DEFCHARD,
355 Float_t *, Int_t & DEFCHARL DEFCHARL DEFCHARL);
356
357 void type_of_call gsvolu(DEFCHARD, DEFCHARD, Int_t &, Float_t *, Int_t &,
358 Int_t & DEFCHARL DEFCHARL);
359
360 void type_of_call gsatt(DEFCHARD, DEFCHARD, Int_t & DEFCHARL DEFCHARL);
361
362 void type_of_call gfpara(DEFCHARD , Int_t&, Int_t&, Int_t&, Int_t&, Float_t*,
363 Float_t* DEFCHARL);
364
365 void type_of_call gckpar(Int_t&, Int_t&, Float_t*);
366
367 void type_of_call gckmat(Int_t&, DEFCHARD DEFCHARL);
368
369 void type_of_call gprint(DEFCHARD,const int& DEFCHARL);
370
371 void type_of_call gdinit();
372
373 void type_of_call gdopt(DEFCHARD,DEFCHARD DEFCHARL DEFCHARL);
374
375 void type_of_call gdraw(DEFCHARD,Float_t &,Float_t &, Float_t &,Float_t &,
376 Float_t &, Float_t &, Float_t & DEFCHARL);
377 void type_of_call gdrayt(DEFCHARD,Float_t &,Float_t &, Float_t &,Float_t &,
378 Float_t &, Float_t &, Float_t & DEFCHARL);
379 void type_of_call gdrawc(DEFCHARD,Int_t &, Float_t &, Float_t &, Float_t &,
380 Float_t &, Float_t & DEFCHARL);
381 void type_of_call gdrawx(DEFCHARD,Float_t &, Float_t &, Float_t &, Float_t &,
382 Float_t &, Float_t &, Float_t &, Float_t &,
383 Float_t & DEFCHARL);
384 void type_of_call gdhead(Int_t &,DEFCHARD, Float_t & DEFCHARL);
385 void type_of_call gdxyz(Int_t &);
386 void type_of_call gdcxyz();
387 void type_of_call gdman(Float_t &, Float_t &);
388 void type_of_call gdwmn1(Float_t &, Float_t &);
389 void type_of_call gdwmn2(Float_t &, Float_t &);
390 void type_of_call gdwmn3(Float_t &, Float_t &);
391 void type_of_call gdspec(DEFCHARD DEFCHARL);
392 void type_of_call gdfspc(DEFCHARD, Int_t &, Int_t & DEFCHARL) {;}
393 void type_of_call gdtree(DEFCHARD, Int_t &, Int_t & DEFCHARL);
394
395 void type_of_call gdopen(Int_t &);
396 void type_of_call gdclos();
397 void type_of_call gdelet(Int_t &);
398 void type_of_call gdshow(Int_t &);
399 void type_of_call geditv(Int_t &) {;}
400
401
402 void type_of_call dzshow(DEFCHARD,const int&,const int&,DEFCHARD,const int&,
403 const int&, const int&, const int& DEFCHARL
404 DEFCHARL);
405
7ac3f11b 406 void type_of_call mzdrop(Int_t&, Int_t&, DEFCHARD DEFCHARL);
407
fe4da5cc 408 void type_of_call setbomb(Float_t &);
409 void type_of_call setclip(DEFCHARD, Float_t &,Float_t &,Float_t &,Float_t &,
410 Float_t &, Float_t & DEFCHARL);
411 void type_of_call gcomad(DEFCHARD, Int_t*& DEFCHARL);
412}
413
414//
415// Geant3 global pointer
416//
417static Int_t defSize = 600;
418
419ClassImp(TGeant3)
420
421//____________________________________________________________________________
1578254f 422TGeant3::TGeant3()
fe4da5cc 423{
424 //
425 // Default constructor
426 //
427}
428
429//____________________________________________________________________________
430TGeant3::TGeant3(const char *title, Int_t nwgeant)
431 :AliMC("TGeant3",title)
432{
433 //
434 // Standard constructor for TGeant3 with ZEBRA initialisation
435 //
436
437 if(nwgeant) {
438 gzebra(nwgeant);
439 ginit();
440 gzinit();
441 } else {
442 gcinit();
443 }
444 //
445 // Load Address of Geant3 commons
446 LoadAddress();
1578254f 447 //
448 // Zero number of particles
449 fNPDGCodes=0;
fe4da5cc 450}
451
452//____________________________________________________________________________
453Int_t TGeant3::CurrentMaterial(Float_t &a, Float_t &z, Float_t &dens,
454 Float_t &radl, Float_t &absl) const
455{
456 //
457 // Return the parameters of the current material during transport
458 //
459 z = fGcmate->z;
460 a = fGcmate->a;
461 dens = fGcmate->dens;
462 radl = fGcmate->radl;
463 absl = fGcmate->absl;
464 return 1; //this could be the number of elements in mixture
465}
466
467//____________________________________________________________________________
468void TGeant3::DefaultRange()
469{
470 //
471 // Set range of current drawing pad to 20x20 cm
472 //
473 if (!higz) {
474 new THIGZ(defSize);
475 gdinit();
476 }
477 higz->Range(0,0,20,20);
478}
479
480//____________________________________________________________________________
481void TGeant3::InitHIGZ()
482{
483 //
484 // Initialise HIGZ
485 //
486 if (!higz) {
487 new THIGZ(defSize);
488 gdinit();
489 }
490}
491
492//____________________________________________________________________________
493void TGeant3::LoadAddress()
494{
495 //
496 // Assigns the address of the GEANT common blocks to the structures
497 // that allow their access from C++
498 //
499 Int_t *addr;
500 gcomad(PASSCHARD("QUEST"), (int*&) fQuest PASSCHARL("QUEST"));
7ac3f11b 501 gcomad(PASSCHARD("GCBANK"),(int*&) fGcbank PASSCHARL("GCBANK"));
fe4da5cc 502 gcomad(PASSCHARD("GCLINK"),(int*&) fGclink PASSCHARL("GCLINK"));
503 gcomad(PASSCHARD("GCCUTS"),(int*&) fGccuts PASSCHARL("GCCUTS"));
504 gcomad(PASSCHARD("GCFLAG"),(int*&) fGcflag PASSCHARL("GCFLAG"));
505 gcomad(PASSCHARD("GCKINE"),(int*&) fGckine PASSCHARL("GCKINE"));
506 gcomad(PASSCHARD("GCKING"),(int*&) fGcking PASSCHARL("GCKING"));
507 gcomad(PASSCHARD("GCKIN2"),(int*&) fGckin2 PASSCHARL("GCKIN2"));
508 gcomad(PASSCHARD("GCKIN3"),(int*&) fGckin3 PASSCHARL("GCKIN3"));
509 gcomad(PASSCHARD("GCMATE"),(int*&) fGcmate PASSCHARL("GCMATE"));
510 gcomad(PASSCHARD("GCTMED"),(int*&) fGctmed PASSCHARL("GCTMED"));
511 gcomad(PASSCHARD("GCTRAK"),(int*&) fGctrak PASSCHARL("GCTRAK"));
512 gcomad(PASSCHARD("GCTPOL"),(int*&) fGctpol PASSCHARL("GCTPOL"));
513 gcomad(PASSCHARD("GCVOLU"),(int*&) fGcvolu PASSCHARL("GCVOLU"));
514 gcomad(PASSCHARD("GCNUM"), (int*&) fGcnum PASSCHARL("GCNUM"));
515 gcomad(PASSCHARD("GCSETS"),(int*&) fGcsets PASSCHARL("GCSETS"));
516 gcomad(PASSCHARD("GCPHYS"),(int*&) fGcphys PASSCHARL("GCPHYS"));
517 gcomad(PASSCHARD("GCOPTI"),(int*&) fGcopti PASSCHARL("GCOPTI"));
518 gcomad(PASSCHARD("GCTLIT"),(int*&) fGctlit PASSCHARL("GCTLIT"));
519 gcomad(PASSCHARD("GCVDMA"),(int*&) fGcvdma PASSCHARL("GCVDMA"));
520
521 gcomad(PASSCHARD("IQ"), addr PASSCHARL("IQ"));
522 fZiq = addr;
523 gcomad(PASSCHARD("LQ"), addr PASSCHARL("LQ"));
524 fZlq = addr;
525 fZq = (float*)fZiq;
526}
527
528//_____________________________________________________________________________
529void TGeant3::GeomIter()
530{
531 //
532 // Geometry iterator for moving upward in the geometry tree
533 // Initialise the iterator
534 //
535 fNextVol=fGcvolu->nlevel;
536}
537
538//____________________________________________________________________________
539Int_t TGeant3::NextVolUp(Text_t *name, Int_t &copy)
540{
541 //
542 // Geometry iterator for moving upward in the geometry tree
543 // Return next volume up
544 //
545 Int_t i, gname;
546 fNextVol--;
547 if(fNextVol>=0) {
548 gname=fGcvolu->names[fNextVol];
549 strncpy(name,(char *) &gname, 4);
550 name[4]='\0';
551 copy=fGcvolu->number[fNextVol];
552 i=fGcvolu->lvolum[fNextVol];
553 if(gname == fZiq[fGclink->jvolum+i]) return i;
554 else printf("GeomTree: Volume %s not found in bank\n",name);
555 }
556 return 0;
557}
558
559//_____________________________________________________________________________
0a6d8768 560Int_t TGeant3::CurrentVolID(Int_t &copy) const
fe4da5cc 561{
562 //
0a6d8768 563 // Returns the current volume ID and copy number
fe4da5cc 564 //
565 Int_t i, gname;
566 if( (i=fGcvolu->nlevel-1) < 0 ) {
0a6d8768 567 Warning("CurrentVolID","Stack depth only %d\n",fGcvolu->nlevel);
fe4da5cc 568 } else {
569 gname=fGcvolu->names[i];
fe4da5cc 570 copy=fGcvolu->number[i];
571 i=fGcvolu->lvolum[i];
572 if(gname == fZiq[fGclink->jvolum+i]) return i;
0a6d8768 573 else Warning("CurrentVolID","Volume %4s not found\n",(char*)&gname);
fe4da5cc 574 }
575 return 0;
576}
577
578//_____________________________________________________________________________
0a6d8768 579Int_t TGeant3::CurrentVolOffID(Int_t off, Int_t &copy) const
fe4da5cc 580{
581 //
582 // Return the current volume "off" upward in the geometrical tree
0a6d8768 583 // ID and copy number
fe4da5cc 584 //
585 Int_t i, gname;
586 if( (i=fGcvolu->nlevel-off-1) < 0 ) {
0a6d8768 587 Warning("CurrentVolOffID","Offset requested %d but stack depth %d\n",
588 off,fGcvolu->nlevel);
fe4da5cc 589 } else {
590 gname=fGcvolu->names[i];
fe4da5cc 591 copy=fGcvolu->number[i];
592 i=fGcvolu->lvolum[i];
593 if(gname == fZiq[fGclink->jvolum+i]) return i;
0a6d8768 594 else Warning("CurrentVolOffID","Volume %4s not found\n",(char*)&gname);
595 }
596 return 0;
597}
598
599//_____________________________________________________________________________
600const char* TGeant3::CurrentVolName() const
601{
602 //
603 // Returns the current volume name
604 //
605 Int_t i, gname;
606 char *name;
607 if( (i=fGcvolu->nlevel-1) < 0 ) {
608 Warning("CurrentVolName","Stack depth %d\n",fGcvolu->nlevel);
609 } else {
610 gname=fGcvolu->names[i];
611 name = new char[5];
612 strncpy(name,(char *) &gname, 4);
613 name[4]='\0';
614 i=fGcvolu->lvolum[i];
615 if(gname == fZiq[fGclink->jvolum+i]) return name;
616 else Warning("CurrentVolName","Volume %4s not found\n",name);
617 }
618 return 0;
619}
620
621//_____________________________________________________________________________
622const char* TGeant3::CurrentVolOffName(Int_t off) const
623{
624 //
625 // Return the current volume "off" upward in the geometrical tree
626 // ID, name and copy number
627 // if name=0 no name is returned
628 //
629 Int_t i, gname;
630 char *name;
631 if( (i=fGcvolu->nlevel-off-1) < 0 ) {
632 Warning("CurrentVolOffName",
633 "Offset requested %d but stack depth %d\n",off,fGcvolu->nlevel);
634 } else {
635 gname=fGcvolu->names[i];
636 name = new char[5];
637 strncpy(name,(char *) &gname, 4);
638 name[4]='\0';
639 i=fGcvolu->lvolum[i];
640 if(gname == fZiq[fGclink->jvolum+i]) return name;
641 else Warning("CurrentVolOffName","Volume %4s not found\n",name);
fe4da5cc 642 }
643 return 0;
644}
645
1578254f 646//_____________________________________________________________________________
647Int_t TGeant3::IdFromPDG(Int_t pdg) const
648{
649 //
650 // Return Geant3 code from PDG and pseudo ENDF code
651
652 for(Int_t i=0;i<fNPDGCodes;++i)
653 if(pdg==fPDGCode[i]) return i;
654 return -1;
655}
656
657//_____________________________________________________________________________
658Int_t TGeant3::PDGFromId(Int_t id) const
659{
660 if(id>0 && id<fNPDGCodes) return fPDGCode[id];
661 else return -1;
662}
663
664//_____________________________________________________________________________
665void TGeant3::DefineParticles()
666{
667 //
668 // Define standard Geant 3 particles
669 Gpart();
670 //
671 // Load standard numbers for GEANT particles and PDG conversion
672 fPDGCode[fNPDGCodes++]=-99; // 0 = unused location
673 fPDGCode[fNPDGCodes++]=22; // 1 = photon
674 fPDGCode[fNPDGCodes++]=-11; // 2 = positron
675 fPDGCode[fNPDGCodes++]=11; // 3 = electron
676 fPDGCode[fNPDGCodes++]=12; // 4 = neutrino e
677 fPDGCode[fNPDGCodes++]=-13; // 5 = muon +
678 fPDGCode[fNPDGCodes++]=13; // 6 = muon -
679 fPDGCode[fNPDGCodes++]=111; // 7 = pi0
680 fPDGCode[fNPDGCodes++]=211; // 8 = pi+
681 fPDGCode[fNPDGCodes++]=-211; // 9 = pi-
682 fPDGCode[fNPDGCodes++]=130; // 10 = Kaon Long
683 fPDGCode[fNPDGCodes++]=321; // 11 = Kaon +
684 fPDGCode[fNPDGCodes++]=-321; // 12 = Kaon -
685 fPDGCode[fNPDGCodes++]=2112; // 13 = Neutron
686 fPDGCode[fNPDGCodes++]=2212; // 14 = Proton
687 fPDGCode[fNPDGCodes++]=-2212; // 15 = Anti Proton
688 fPDGCode[fNPDGCodes++]=310; // 16 = Kaon Short
689 fPDGCode[fNPDGCodes++]=221; // 17 = Eta
690 fPDGCode[fNPDGCodes++]=3122; // 18 = Lambda
691 fPDGCode[fNPDGCodes++]=3222; // 19 = Sigma +
692 fPDGCode[fNPDGCodes++]=3212; // 20 = Sigma 0
693 fPDGCode[fNPDGCodes++]=3112; // 21 = Sigma -
694 fPDGCode[fNPDGCodes++]=3322; // 22 = Xi0
695 fPDGCode[fNPDGCodes++]=3312; // 23 = Xi-
696 fPDGCode[fNPDGCodes++]=3334; // 24 = Omega-
697 fPDGCode[fNPDGCodes++]=-2112; // 25 = Anti Proton
698 fPDGCode[fNPDGCodes++]=-3122; // 26 = Anti Proton
699 fPDGCode[fNPDGCodes++]=-3222; // 27 = Anti Sigma -
700 fPDGCode[fNPDGCodes++]=-3212; // 28 = Anti Sigma 0
701 fPDGCode[fNPDGCodes++]=-3112; // 29 = Anti Sigma 0
702 fPDGCode[fNPDGCodes++]=-3322; // 30 = Anti Xi 0
703 fPDGCode[fNPDGCodes++]=-3312; // 31 = Anti Xi +
704 fPDGCode[fNPDGCodes++]=-3334; // 32 = Anti Omega +
705
706
707 Int_t mode[6];
708 Int_t kz, ipa;
709 Float_t bratio[6];
710
711 /* --- Define additional particles */
712 Gspart(33, "OMEGA(782)", 3, 0.782, 0., 7.836e-23);
713 fPDGCode[fNPDGCodes++]=223; // 33 = Omega(782)
714
715 Gspart(34, "PHI(1020)", 3, 1.019, 0., 1.486e-22);
716 fPDGCode[fNPDGCodes++]=333; // 34 = PHI (1020)
717
718 Gspart(35, "D +", 4, 1.87, 1., 1.066e-12);
719 fPDGCode[fNPDGCodes++]=411; // 35 = D+
720
721 Gspart(36, "D -", 4, 1.87, -1., 1.066e-12);
722 fPDGCode[fNPDGCodes++]=-411; // 36 = D-
723
724 Gspart(37, "D 0", 3, 1.865, 0., 4.2e-13);
725 fPDGCode[fNPDGCodes++]=421; // 37 = D0
726
727 Gspart(38, "ANTI D 0", 3, 1.865, 0., 4.2e-13);
728 fPDGCode[fNPDGCodes++]=-421; // 38 = D0 bar
729
730 fPDGCode[fNPDGCodes++]=-99; // 39 = unassigned
731
732 fPDGCode[fNPDGCodes++]=-99; // 40 = unassigned
733
734 fPDGCode[fNPDGCodes++]=-99; // 41 = unassigned
735
736 Gspart(42, "RHO +", 4, 0.768, 1., 4.353e-24);
737 fPDGCode[fNPDGCodes++]=213; // 42 = RHO+
738
739 Gspart(43, "RHO -", 4, 0.768, -1., 4.353e-24);
740 fPDGCode[fNPDGCodes++]=-213; // 40 = RHO-
741
742 Gspart(44, "RHO 0", 3, 0.768, 0., 4.353e-24);
743 fPDGCode[fNPDGCodes++]=113; // 37 = D0
744
745 //
746 // Use ENDF-6 mapping for ions = 10000*z+10*a+iso
747 // and add 1 000 000
748 // and numbers above 5 000 000 for special applications
749 //
750
751 const Int_t kion=10000000;
752
753 const Int_t kspe=50000000;
754
755 TDatabasePDG *pdgDB = TDatabasePDG::Instance();
756
757 const Double_t autogev=0.9314943228;
758 const Double_t hslash = 1.0545726663e-27;
759 const Double_t erggev = 1/1.6021773349e-3;
760 const Double_t hshgev = hslash*erggev;
761 const Double_t yearstosec = 3600*24*365.25;
762
763
764 pdgDB->AddParticle("Deuteron","Deuteron",2*autogev+8.071e-3,kTRUE,
765 0,1,"Ion",kion+10020);
766 fPDGCode[fNPDGCodes++]=kion+10020; // 45 = Deuteron
767
768 pdgDB->AddParticle("Triton","Triton",3*autogev+14.931e-3,kFALSE,
769 hshgev/(12.33*yearstosec),1,"Ion",kion+10030);
770 fPDGCode[fNPDGCodes++]=kion+10030; // 46 = Triton
771
772 pdgDB->AddParticle("Alpha","Alpha",4*autogev+2.424e-3,kTRUE,
773 hshgev/(12.33*yearstosec),2,"Ion",kion+20040);
774 fPDGCode[fNPDGCodes++]=kion+20040; // 47 = Alpha
775
776 fPDGCode[fNPDGCodes++]=0; // 48 = geantino mapped to rootino
777
778 pdgDB->AddParticle("HE3","HE3",3*autogev+14.931e-3,kFALSE,
779 0,2,"Ion",kion+20030);
780 fPDGCode[fNPDGCodes++]=kion+20030; // 49 = HE3
781
782 pdgDB->AddParticle("Cherenkov","Cherenkov",0,kFALSE,
783 0,0,"Special",kspe+50);
784 fPDGCode[fNPDGCodes++]=kspe+50; // 50 = Cherenkov
785
786/* --- Define additional decay modes --- */
787/* --- omega(783) --- */
788 for (kz = 0; kz < 6; ++kz) {
789 bratio[kz] = 0.;
790 mode[kz] = 0;
791 }
792 ipa = 33;
793 bratio[0] = 89.;
794 bratio[1] = 8.5;
795 bratio[2] = 2.5;
796 mode[0] = 70809;
797 mode[1] = 107;
798 mode[2] = 908;
799 Gsdk(ipa, bratio, mode);
800/* --- phi(1020) --- */
801 for (kz = 0; kz < 6; ++kz) {
802 bratio[kz] = 0.;
803 mode[kz] = 0;
804 }
805 ipa = 34;
806 bratio[0] = 49.;
807 bratio[1] = 34.4;
808 bratio[2] = 12.9;
809 bratio[3] = 2.4;
810 bratio[4] = 1.3;
811 mode[0] = 1112;
812 mode[1] = 1610;
813 mode[2] = 4407;
814 mode[3] = 90807;
815 mode[4] = 1701;
816 Gsdk(ipa, bratio, mode);
817/* --- D+ --- */
818 for (kz = 0; kz < 6; ++kz) {
819 bratio[kz] = 0.;
820 mode[kz] = 0;
821 }
822 ipa = 35;
823 bratio[0] = 25.;
824 bratio[1] = 25.;
825 bratio[2] = 25.;
826 bratio[3] = 25.;
827 mode[0] = 80809;
828 mode[1] = 120808;
829 mode[2] = 111208;
830 mode[3] = 110809;
831 Gsdk(ipa, bratio, mode);
832/* --- D- --- */
833 for (kz = 0; kz < 6; ++kz) {
834 bratio[kz] = 0.;
835 mode[kz] = 0;
836 }
837 ipa = 36;
838 bratio[0] = 25.;
839 bratio[1] = 25.;
840 bratio[2] = 25.;
841 bratio[3] = 25.;
842 mode[0] = 90908;
843 mode[1] = 110909;
844 mode[2] = 121109;
845 mode[3] = 120908;
846 Gsdk(ipa, bratio, mode);
847/* --- D0 --- */
848 for (kz = 0; kz < 6; ++kz) {
849 bratio[kz] = 0.;
850 mode[kz] = 0;
851 }
852 ipa = 37;
853 bratio[0] = 33.;
854 bratio[1] = 33.;
855 bratio[2] = 33.;
856 mode[0] = 809;
857 mode[1] = 1208;
858 mode[2] = 1112;
859 Gsdk(ipa, bratio, mode);
860/* --- Anti D0 --- */
861 for (kz = 0; kz < 6; ++kz) {
862 bratio[kz] = 0.;
863 mode[kz] = 0;
864 }
865 ipa = 38;
866 bratio[0] = 33.;
867 bratio[1] = 33.;
868 bratio[2] = 33.;
869 mode[0] = 809;
870 mode[1] = 1109;
871 mode[2] = 1112;
872 Gsdk(ipa, bratio, mode);
873/* --- rho+ --- */
874 for (kz = 0; kz < 6; ++kz) {
875 bratio[kz] = 0.;
876 mode[kz] = 0;
877 }
878 ipa = 42;
879 bratio[0] = 100.;
880 mode[0] = 807;
881 Gsdk(ipa, bratio, mode);
882/* --- rho- --- */
883 for (kz = 0; kz < 6; ++kz) {
884 bratio[kz] = 0.;
885 mode[kz] = 0;
886 }
887 ipa = 43;
888 bratio[0] = 100.;
889 mode[0] = 907;
890 Gsdk(ipa, bratio, mode);
891/* --- rho0 --- */
892 for (kz = 0; kz < 6; ++kz) {
893 bratio[kz] = 0.;
894 mode[kz] = 0;
895 }
896 ipa = 44;
897 bratio[0] = 100.;
898 mode[0] = 707;
899 Gsdk(ipa, bratio, mode);
900 /*
901// --- jpsi ---
902 for (kz = 0; kz < 6; ++kz) {
903 bratio[kz] = 0.;
904 mode[kz] = 0;
905 }
906 ipa = 113;
907 bratio[0] = 50.;
908 bratio[1] = 50.;
909 mode[0] = 506;
910 mode[1] = 605;
911 Gsdk(ipa, bratio, mode);
912// --- upsilon ---
913 ipa = 114;
914 Gsdk(ipa, bratio, mode);
915// --- phi ---
916 ipa = 115;
917 Gsdk(ipa, bratio, mode);
918 */
919
920}
921
fe4da5cc 922//_____________________________________________________________________________
923Int_t TGeant3::VolId(Text_t *name) const
924{
925 //
926 // Return the unique numeric identifier for volume name
927 //
928 Int_t gname, i;
929 strncpy((char *) &gname, name, 4);
930 for(i=1; i<=fGcnum->nvolum; i++)
931 if(gname == fZiq[fGclink->jvolum+i]) return i;
932 printf("VolId: Volume %s not found\n",name);
933 return 0;
934}
935
936//_____________________________________________________________________________
1f97a957 937Int_t TGeant3::NofVolumes() const
fe4da5cc 938{
939 //
940 // Return total number of volumes in the geometry
941 //
942 return fGcnum->nvolum;
943}
944
945//_____________________________________________________________________________
099385a4 946const char* TGeant3::VolName(Int_t id) const
fe4da5cc 947{
948 //
949 // Return the volume name given the volume identifier
950 //
951 static char name[5];
952 if(id<1 || id > fGcnum->nvolum || fGclink->jvolum<=0)
953 strcpy(name,"NULL");
954 else
955 strncpy(name,(char *)&fZiq[fGclink->jvolum+id],4);
956 name[4]='\0';
957 return name;
958}
959
960//_____________________________________________________________________________
0a6d8768 961void TGeant3::TrackPosition(TLorentzVector &xyz) const
fe4da5cc 962{
963 //
964 // Return the current position in the master reference frame of the
965 // track being transported
966 //
967 xyz[0]=fGctrak->vect[0];
968 xyz[1]=fGctrak->vect[1];
969 xyz[2]=fGctrak->vect[2];
0a6d8768 970 xyz[3]=fGctrak->tofg;
fe4da5cc 971}
972
973//_____________________________________________________________________________
974Float_t TGeant3::TrackTime() const
975{
976 //
977 // Return the current time of flight of the track being transported
978 //
979 return fGctrak->tofg;
980}
981
982//_____________________________________________________________________________
0a6d8768 983void TGeant3::TrackMomentum(TLorentzVector &xyz) const
fe4da5cc 984{
985 //
986 // Return the direction and the momentum (GeV/c) of the track
987 // currently being transported
988 //
0a6d8768 989 Double_t ptot=fGctrak->vect[6];
990 xyz[0]=fGctrak->vect[3]*ptot;
991 xyz[1]=fGctrak->vect[4]*ptot;
992 xyz[2]=fGctrak->vect[5]*ptot;
993 xyz[3]=fGctrak->getot;
fe4da5cc 994}
995
996//_____________________________________________________________________________
997Float_t TGeant3::TrackCharge() const
998{
999 //
1000 // Return charge of the track currently transported
1001 //
1002 return fGckine->charge;
1003}
1004
1005//_____________________________________________________________________________
1006Float_t TGeant3::TrackMass() const
1007{
1008 //
1009 // Return the mass of the track currently transported
1010 //
1011 return fGckine->amass;
1012}
1013
1014//_____________________________________________________________________________
1015Int_t TGeant3::TrackPid() const
1016{
1017 //
1018 // Return the id of the particle transported
1019 //
85f1cd76 1020 return PDGFromId(fGckine->ipart);
fe4da5cc 1021}
1022
1023//_____________________________________________________________________________
1024Float_t TGeant3::TrackStep() const
1025{
1026 //
1027 // Return the length in centimeters of the current step
1028 //
1029 return fGctrak->step;
1030}
1031
1032//_____________________________________________________________________________
1033Float_t TGeant3::TrackLength() const
1034{
1035 //
1036 // Return the length of the current track from its origin
1037 //
1038 return fGctrak->sleng;
1039}
1040
1041//_____________________________________________________________________________
0a6d8768 1042Bool_t TGeant3::IsTrackInside() const
fe4da5cc 1043{
1044 //
1045 // True if the track is not at the boundary of the current volume
1046 //
1047 return (fGctrak->inwvol==0);
1048}
1049
1050//_____________________________________________________________________________
0a6d8768 1051Bool_t TGeant3::IsTrackEntering() const
fe4da5cc 1052{
1053 //
1054 // True if this is the first step of the track in the current volume
1055 //
1056 return (fGctrak->inwvol==1);
1057}
1058
1059//_____________________________________________________________________________
0a6d8768 1060Bool_t TGeant3::IsTrackExiting() const
fe4da5cc 1061{
1062 //
1063 // True if this is the last step of the track in the current volume
1064 //
1065 return (fGctrak->inwvol==2);
1066}
1067
1068//_____________________________________________________________________________
0a6d8768 1069Bool_t TGeant3::IsTrackOut() const
fe4da5cc 1070{
1071 //
1072 // True if the track is out of the setup
1073 //
1074 return (fGctrak->inwvol==3);
1075}
1076
1077//_____________________________________________________________________________
0a6d8768 1078Bool_t TGeant3::IsTrackStop() const
fe4da5cc 1079{
1080 //
1081 // True if the track energy has fallen below the threshold
1082 //
1083 return (fGctrak->istop==2);
1084}
1085
1086//_____________________________________________________________________________
1087Int_t TGeant3::NSecondaries() const
1088{
1089 //
1090 // Number of secondary particles generated in the current step
1091 //
1092 return fGcking->ngkine;
1093}
1094
1095//_____________________________________________________________________________
1096Int_t TGeant3::CurrentEvent() const
1097{
1098 //
1099 // Number of the current event
1100 //
1101 return fGcflag->idevt;
1102}
1103
1104//_____________________________________________________________________________
1105void TGeant3::ProdProcess(char* proc) const
1106{
1107 //
1108 // Name of the process that has produced the secondary particles
1109 // in the current step
1110 //
1111 const Int_t ipmec[13] = { 5,6,7,8,9,10,11,12,21,23,25,105,108 };
1112 Int_t mec, km, im;
1113 //
1114 if(fGcking->ngkine>0) {
1115 for (km = 0; km < fGctrak->nmec; ++km) {
1116 for (im = 0; im < 13; ++im) {
1117 if (fGctrak->lmec[km] == ipmec[im]) {
1118 mec = fGctrak->lmec[km];
1119 if (0 < mec && mec < 31) {
1120 strncpy(proc,(char *)&fGctrak->namec[mec - 1],4);
1121 } else if (mec - 100 <= 30 && mec - 100 > 0) {
1122 strncpy(proc,(char *)&fGctpol->namec1[mec - 101],4);
1123 }
1124 proc[4]='\0';
1125 return;
1126 }
1127 }
1128 }
1129 strcpy(proc,"UNKN");
1130 } else strcpy(proc,"NONE");
1131}
1132
1133//_____________________________________________________________________________
1134void TGeant3::GetSecondary(Int_t isec, Int_t& ipart, Float_t* x, Float_t* p)
1135{
1136 //
1137 // Get the parameters of the secondary track number isec produced
1138 // in the current step
1139 //
1140 Int_t i;
1141 if(-1<isec && isec<fGcking->ngkine) {
1142 ipart=Int_t (fGcking->gkin[isec][4] +0.5);
1143 for(i=0;i<3;i++) {
1144 x[i]=fGckin3->gpos[isec][i];
1145 p[i]=fGcking->gkin[isec][i];
1146 }
1147 x[3]=fGcking->tofd[isec];
1148 p[3]=fGcking->gkin[isec][3];
1149 } else {
1150 printf(" * TGeant3::GetSecondary * Secondary %d does not exist\n",isec);
1151 x[0]=x[1]=x[2]=x[3]=p[0]=p[1]=p[2]=p[3]=0;
1152 ipart=0;
1153 }
1154}
1155
1156//_____________________________________________________________________________
1157void TGeant3::InitLego()
1158{
1159 SetSWIT(4,0);
1160 SetDEBU(0,0,0); //do not print a message
1161}
1162
1163//_____________________________________________________________________________
0a6d8768 1164Bool_t TGeant3::IsTrackDisappeared() const
fe4da5cc 1165{
1166 //
1167 // True if the current particle has disappered
1168 // either because it decayed or because it underwent
1169 // an inelastic collision
1170 //
1171 return (fGctrak->istop==1);
1172}
1173
1174//_____________________________________________________________________________
0a6d8768 1175Bool_t TGeant3::IsTrackAlive() const
fe4da5cc 1176{
1177 //
1178 // True if the current particle is alive and will continue to be
1179 // transported
1180 //
1181 return (fGctrak->istop==0);
1182}
1183
1184//_____________________________________________________________________________
1185void TGeant3::StopTrack()
1186{
1187 //
1188 // Stop the transport of the current particle and skip to the next
1189 //
1190 fGctrak->istop=1;
1191}
1192
1193//_____________________________________________________________________________
1194void TGeant3::StopEvent()
1195{
1196 //
1197 // Stop simulation of the current event and skip to the next
1198 //
1199 fGcflag->ieotri=1;
1200}
1201
1202//_____________________________________________________________________________
1203Float_t TGeant3::MaxStep() const
1204{
1205 //
1206 // Return the maximum step length in the current medium
1207 //
1208 return fGctmed->stemax;
1209}
1210
1211//_____________________________________________________________________________
1212void TGeant3::SetColors()
1213{
1214 //
1215 // Set the colors for all the volumes
1216 // this is done sequentially for all volumes
1217 // based on the number of their medium
1218 //
1219 Int_t kv, icol;
1220 Int_t jvolum=fGclink->jvolum;
1221 //Int_t jtmed=fGclink->jtmed;
1222 //Int_t jmate=fGclink->jmate;
1223 Int_t nvolum=fGcnum->nvolum;
1224 char name[5];
1225 //
1226 // Now for all the volumes
1227 for(kv=1;kv<=nvolum;kv++) {
1228 // Get the tracking medium
1229 Int_t itm=Int_t (fZq[fZlq[jvolum-kv]+4]);
1230 // Get the material
1231 //Int_t ima=Int_t (fZq[fZlq[jtmed-itm]+6]);
1232 // Get z
1233 //Float_t z=fZq[fZlq[jmate-ima]+7];
1234 // Find color number
1235 //icol = Int_t(z)%6+2;
1236 //icol = 17+Int_t(z*150./92.);
1237 //icol = kv%6+2;
1238 icol = itm%6+2;
1239 strncpy(name,(char*)&fZiq[jvolum+kv],4);
1240 name[4]='\0';
1241 Gsatt(name,"COLO",icol);
1242 }
1243}
1244
1245//_____________________________________________________________________________
1246void TGeant3::SetMaxStep(Float_t maxstep)
1247{
1248 //
1249 // Set the maximum step allowed till the particle is in the current medium
1250 //
1251 fGctmed->stemax=maxstep;
1252}
1253
1254//_____________________________________________________________________________
1255void TGeant3::SetMaxNStep(Int_t maxnstp)
1256{
1257 //
1258 // Set the maximum number of steps till the particle is in the current medium
1259 //
1260 fGctrak->maxnst=maxnstp;
1261}
1262
1263//_____________________________________________________________________________
1264Int_t TGeant3::GetMaxNStep() const
1265{
1266 //
1267 // Maximum number of steps allowed in current medium
1268 //
1269 return fGctrak->maxnst;
1270}
1271
1272//_____________________________________________________________________________
1273void TGeant3::Material(Int_t& kmat, const char* name, Float_t a, Float_t z,
1274 Float_t dens, Float_t radl, Float_t absl, Float_t* buf,
1275 Int_t nwbuf)
1276{
1277 //
1278 // Defines a Material
1279 //
1280 // kmat number assigned to the material
1281 // name material name
1282 // a atomic mass in au
1283 // z atomic number
1284 // dens density in g/cm3
1285 // absl absorbtion length in cm
1286 // if >=0 it is ignored and the program
1287 // calculates it, if <0. -absl is taken
1288 // radl radiation length in cm
1289 // if >=0 it is ignored and the program
1290 // calculates it, if <0. -radl is taken
1291 // buf pointer to an array of user words
1292 // nbuf number of user words
1293 //
1294 Int_t jmate=fGclink->jmate;
1295 kmat=1;
1296 Int_t ns, i;
1297 if(jmate>0) {
1298 ns=fZiq[jmate-2];
1299 kmat=ns+1;
1300 for(i=1; i<=ns; i++) {
1301 if(fZlq[jmate-i]==0) {
1302 kmat=i;
1303 break;
1304 }
1305 }
1306 }
1307 gsmate(kmat,PASSCHARD(name), a, z, dens, radl, absl, buf,
1308 nwbuf PASSCHARL(name));
1309}
1310
1311//_____________________________________________________________________________
1312void TGeant3::Mixture(Int_t& kmat, const char* name, Float_t* a, Float_t* z,
1313 Float_t dens, Int_t nlmat, Float_t* wmat)
1314{
1315 //
1316 // Defines mixture OR COMPOUND IMAT as composed by
1317 // THE BASIC NLMAT materials defined by arrays A,Z and WMAT
1318 //
1319 // If NLMAT > 0 then wmat contains the proportion by
1320 // weights of each basic material in the mixture.
1321 //
1322 // If nlmat < 0 then WMAT contains the number of atoms
1323 // of a given kind into the molecule of the COMPOUND
1324 // In this case, WMAT in output is changed to relative
1325 // weigths.
1326 //
1327 Int_t jmate=fGclink->jmate;
1328 kmat=1;
1329 Int_t ns, i;
1330 if(jmate>0) {
1331 ns=fZiq[jmate-2];
1332 kmat=ns+1;
1333 for(i=1; i<=ns; i++) {
1334 if(fZlq[jmate-i]==0) {
1335 kmat=i;
1336 break;
1337 }
1338 }
1339 }
1340 gsmixt(kmat,PASSCHARD(name), a, z,dens, nlmat,wmat PASSCHARL(name));
1341}
1342
1343//_____________________________________________________________________________
1344void TGeant3::Medium(Int_t& kmed, const char* name, Int_t nmat, Int_t isvol,
1345 Int_t ifield, Float_t fieldm, Float_t tmaxfd,
1346 Float_t stemax, Float_t deemax, Float_t epsil,
1347 Float_t stmin, Float_t* ubuf, Int_t nbuf)
1348{
1349 //
1350 // kmed tracking medium number assigned
1351 // name tracking medium name
1352 // nmat material number
1353 // isvol sensitive volume flag
1354 // ifield magnetic field
1355 // fieldm max. field value (kilogauss)
1356 // tmaxfd max. angle due to field (deg/step)
1357 // stemax max. step allowed
1358 // deemax max. fraction of energy lost in a step
1359 // epsil tracking precision (cm)
1360 // stmin min. step due to continuos processes (cm)
1361 //
1362 // ifield = 0 if no magnetic field; ifield = -1 if user decision in guswim;
1363 // ifield = 1 if tracking performed with grkuta; ifield = 2 if tracking
1364 // performed with ghelix; ifield = 3 if tracking performed with ghelx3.
1365 //
1366 Int_t jtmed=fGclink->jtmed;
1367 kmed=1;
1368 Int_t ns, i;
1369 if(jtmed>0) {
1370 ns=fZiq[jtmed-2];
1371 kmed=ns+1;
1372 for(i=1; i<=ns; i++) {
1373 if(fZlq[jtmed-i]==0) {
1374 kmed=i;
1375 break;
1376 }
1377 }
1378 }
1379 gstmed(kmed, PASSCHARD(name), nmat, isvol, ifield, fieldm, tmaxfd, stemax,
1380 deemax, epsil, stmin, ubuf, nbuf PASSCHARL(name));
1381}
1382
1383//_____________________________________________________________________________
1384void TGeant3::Matrix(Int_t& krot, Float_t thex, Float_t phix, Float_t they,
1385 Float_t phiy, Float_t thez, Float_t phiz)
1386{
1387 //
1388 // krot rotation matrix number assigned
1389 // theta1 polar angle for axis i
1390 // phi1 azimuthal angle for axis i
1391 // theta2 polar angle for axis ii
1392 // phi2 azimuthal angle for axis ii
1393 // theta3 polar angle for axis iii
1394 // phi3 azimuthal angle for axis iii
1395 //
1396 // it defines the rotation matrix number irot.
1397 //
1398 Int_t jrotm=fGclink->jrotm;
1399 krot=1;
1400 Int_t ns, i;
1401 if(jrotm>0) {
1402 ns=fZiq[jrotm-2];
1403 krot=ns+1;
1404 for(i=1; i<=ns; i++) {
1405 if(fZlq[jrotm-i]==0) {
1406 krot=i;
1407 break;
1408 }
1409 }
1410 }
1411 gsrotm(krot, thex, phix, they, phiy, thez, phiz);
1412}
1413
1414//_____________________________________________________________________________
1578254f 1415void TGeant3::GetParticle(const Int_t pdg, char *name, Float_t &mass) const
fe4da5cc 1416{
1578254f 1417 Int_t ipart = IdFromPDG(pdg);
1418 if(ipart<0) {
1419 printf("Particle %d not in geant\n",pdg);
1420 name=new char[7];
1421 strcpy(name,"Unknown");
1422 mass=-1;
1423 return;
1424 }
fe4da5cc 1425 //
1426 // Return name and mass of particle code ipart
1427 // Geant321 conventions
1428 //
1429 Int_t hname[6];
1430 Int_t jpart=fGclink->jpart;
1431 Int_t jpa=fZlq[jpart-ipart];
1432 //
1433 for(Int_t i=1; i<6; i++) hname[i-1]=fZiq[jpa+i];
1434 hname[5]=0;
1435 strncpy(name,(char *)hname, 21);
1436 mass=fZq[jpa+7];
1437}
1438
1439//_____________________________________________________________________________
1440Int_t TGeant3::GetMedium() const
1441{
1442 //
1443 // Return the number of the current medium
1444 //
1445 return fGctmed->numed;
1446}
1447
1448//_____________________________________________________________________________
1449Float_t TGeant3::Edep() const
1450{
1451 //
1452 // Return the energy lost in the current step
1453 //
1454 return fGctrak->destep;
1455}
1456
1457//_____________________________________________________________________________
1458Float_t TGeant3::Etot() const
1459{
1460 //
1461 // Return the total energy of the current track
1462 //
1463 return fGctrak->getot;
1464}
1465
1466//_____________________________________________________________________________
1467void TGeant3::Rndm(Float_t* r, const Int_t n) const
1468{
1469 //
1470 // Return an array of n random numbers uniformly distributed
1471 // between 0 and 1 not included
1472 //
1473 Grndm(r,n);
1474}
1475
1476//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1477//
1478// Functions from GBASE
1479//
1480//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1481
1482//____________________________________________________________________________
1483void TGeant3::Gfile(const char *filename, const char *option)
1484{
1485 //
1486 // Routine to open a GEANT/RZ data base.
1487 //
1488 // LUN logical unit number associated to the file
1489 //
1490 // CHFILE RZ file name
1491 //
1492 // CHOPT is a character string which may be
1493 // N To create a new file
1494 // U to open an existing file for update
1495 // " " to open an existing file for read only
1496 // Q The initial allocation (default 1000 records)
1497 // is given in IQUEST(10)
1498 // X Open the file in exchange format
1499 // I Read all data structures from file to memory
1500 // O Write all data structures from memory to file
1501 //
1502 // Note:
1503 // If options "I" or "O" all data structures are read or
1504 // written from/to file and the file is closed.
1505 // See routine GRMDIR to create subdirectories
1506 // See routines GROUT,GRIN to write,read objects
1507 //
1508 grfile(21, PASSCHARD(filename), PASSCHARD(option) PASSCHARL(filename)
1509 PASSCHARL(option));
1510}
1511
1512//____________________________________________________________________________
1513void TGeant3::Gpcxyz()
1514{
1515 //
1516 // Print track and volume parameters at current point
1517 //
1518 gpcxyz();
1519}
1520
1521//_____________________________________________________________________________
1522void TGeant3::Ggclos()
1523{
1524 //
1525 // Closes off the geometry setting.
1526 // Initializes the search list for the contents of each
1527 // volume following the order they have been positioned, and
1528 // inserting the content '0' when a call to GSNEXT (-1) has
1529 // been required by the user.
1530 // Performs the development of the JVOLUM structure for all
1531 // volumes with variable parameters, by calling GGDVLP.
1532 // Interprets the user calls to GSORD, through GGORD.
1533 // Computes and stores in a bank (next to JVOLUM mother bank)
1534 // the number of levels in the geometrical tree and the
1535 // maximum number of contents per level, by calling GGNLEV.
1536 // Sets status bit for CONCAVE volumes, through GGCAVE.
1537 // Completes the JSET structure with the list of volume names
1538 // which identify uniquely a given physical detector, the
1539 // list of bit numbers to pack the corresponding volume copy
1540 // numbers, and the generic path(s) in the JVOLUM tree,
1541 // through the routine GHCLOS.
1542 //
1543 ggclos();
1544}
1545
1546//_____________________________________________________________________________
1547void TGeant3::Glast()
1548{
1549 //
1550 // Finish a Geant run
1551 //
1552 glast();
1553}
1554
1555//_____________________________________________________________________________
1556void TGeant3::Gprint(const char *name)
1557{
1558 //
1559 // Routine to print data structures
1560 // CHNAME name of a data structure
1561 //
1562 char vname[5];
1563 Vname(name,vname);
1564 gprint(PASSCHARD(vname),0 PASSCHARL(vname));
1565}
1566
1567//_____________________________________________________________________________
1568void TGeant3::Grun()
1569{
1570 //
1571 // Steering function to process one run
1572 //
1573 grun();
1574}
1575
1576//_____________________________________________________________________________
1577void TGeant3::Gtrig()
1578{
1579 //
1580 // Steering function to process one event
1581 //
1582 gtrig();
1583}
1584
1585//_____________________________________________________________________________
1586void TGeant3::Gtrigc()
1587{
1588 //
1589 // Clear event partition
1590 //
1591 gtrigc();
1592}
1593
1594//_____________________________________________________________________________
1595void TGeant3::Gtrigi()
1596{
1597 //
1598 // Initialises event partition
1599 //
1600 gtrigi();
1601}
1602
1603//_____________________________________________________________________________
1604void TGeant3::Gwork(Int_t nwork)
1605{
1606 //
1607 // Allocates workspace in ZEBRA memory
1608 //
1609 gwork(nwork);
1610}
1611
1612//_____________________________________________________________________________
1613void TGeant3::Gzinit()
1614{
1615 //
1616 // To initialise GEANT/ZEBRA data structures
1617 //
1618 gzinit();
1619}
1620
1621//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1622//
1623// Functions from GCONS
1624//
1625//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1626
1627//_____________________________________________________________________________
1628void TGeant3::Gfmate(Int_t imat, char *name, Float_t &a, Float_t &z,
1629 Float_t &dens, Float_t &radl, Float_t &absl,
1630 Float_t* ubuf, Int_t& nbuf)
1631{
1632 //
1633 // Return parameters for material IMAT
1634 //
1635 gfmate(imat, PASSCHARD(name), a, z, dens, radl, absl, ubuf, nbuf
1636 PASSCHARL(name));
1637}
1638
1639//_____________________________________________________________________________
1640void TGeant3::Gfpart(Int_t ipart, char *name, Int_t &itrtyp,
1641 Float_t &amass, Float_t &charge, Float_t &tlife)
1642{
1643 //
1644 // Return parameters for particle of type IPART
1645 //
1646 Float_t *ubuf=0;
1647 Int_t nbuf;
1648 gfpart(ipart, PASSCHARD(name), itrtyp, amass, charge, tlife, ubuf, nbuf
1649 PASSCHARL(name));
1650}
1651
1652//_____________________________________________________________________________
1653void TGeant3::Gftmed(Int_t numed, char *name, Int_t &nmat, Int_t &isvol,
1654 Int_t &ifield, Float_t &fieldm, Float_t &tmaxfd,
1655 Float_t &stemax, Float_t &deemax, Float_t &epsil,
1656 Float_t &stmin, Float_t *ubuf, Int_t *nbuf)
1657{
1658 //
1659 // Return parameters for tracking medium NUMED
1660 //
1661 gftmed(numed, PASSCHARD(name), nmat, isvol, ifield, fieldm, tmaxfd, stemax,
1662 deemax, epsil, stmin, ubuf, nbuf PASSCHARL(name));
1663}
1664
1665//_____________________________________________________________________________
1666void TGeant3::Gmate()
1667{
1668 //
1669 // Define standard GEANT materials
1670 //
1671 gmate();
1672}
1673
1674//_____________________________________________________________________________
1675void TGeant3::Gpart()
1676{
1677 //
1678 // Define standard GEANT particles plus selected decay modes
1679 // and branching ratios.
1680 //
1681 gpart();
1682}
1683
1684//_____________________________________________________________________________
1685void TGeant3::Gsdk(Int_t ipart, Float_t *bratio, Int_t *mode)
1686{
1687// Defines branching ratios and decay modes for standard
1688// GEANT particles.
1689 gsdk(ipart,bratio,mode);
1690}
1691
1692//_____________________________________________________________________________
1693void TGeant3::Gsmate(Int_t imat, const char *name, Float_t a, Float_t z,
1694 Float_t dens, Float_t radl, Float_t absl)
1695{
1696 //
1697 // Defines a Material
1698 //
1699 // kmat number assigned to the material
1700 // name material name
1701 // a atomic mass in au
1702 // z atomic number
1703 // dens density in g/cm3
1704 // absl absorbtion length in cm
1705 // if >=0 it is ignored and the program
1706 // calculates it, if <0. -absl is taken
1707 // radl radiation length in cm
1708 // if >=0 it is ignored and the program
1709 // calculates it, if <0. -radl is taken
1710 // buf pointer to an array of user words
1711 // nbuf number of user words
1712 //
1713 Float_t *ubuf=0;
1714 Int_t nbuf=0;
1715 gsmate(imat,PASSCHARD(name), a, z, dens, radl, absl, ubuf, nbuf
1716 PASSCHARL(name));
1717}
1718
1719//_____________________________________________________________________________
1720void TGeant3::Gsmixt(Int_t imat, const char *name, Float_t *a, Float_t *z,
1721 Float_t dens, Int_t nlmat, Float_t *wmat)
1722{
1723 //
1724 // Defines mixture OR COMPOUND IMAT as composed by
1725 // THE BASIC NLMAT materials defined by arrays A,Z and WMAT
1726 //
1727 // If NLMAT.GT.0 then WMAT contains the PROPORTION BY
1728 // WEIGTHS OF EACH BASIC MATERIAL IN THE MIXTURE.
1729 //
1730 // If NLMAT.LT.0 then WMAT contains the number of atoms
1731 // of a given kind into the molecule of the COMPOUND
1732 // In this case, WMAT in output is changed to relative
1733 // weigths.
1734 //
1735 gsmixt(imat,PASSCHARD(name), a, z,dens, nlmat,wmat PASSCHARL(name));
1736}
1737
1738//_____________________________________________________________________________
1739void TGeant3::Gspart(Int_t ipart, const char *name, Int_t itrtyp,
1740 Float_t amass, Float_t charge, Float_t tlife)
1741{
1742 //
1743 // Store particle parameters
1744 //
1745 // ipart particle code
1746 // name particle name
1747 // itrtyp transport method (see GEANT manual)
1748 // amass mass in GeV/c2
1749 // charge charge in electron units
1750 // tlife lifetime in seconds
1751 //
1752 Float_t *ubuf=0;
1753 Int_t nbuf=0;
1754 gspart(ipart,PASSCHARD(name), itrtyp, amass, charge, tlife, ubuf, nbuf
1755 PASSCHARL(name));
1756}
1757
1758//_____________________________________________________________________________
1759void TGeant3::Gstmed(Int_t numed, const char *name, Int_t nmat, Int_t isvol,
1760 Int_t ifield, Float_t fieldm, Float_t tmaxfd,
1761 Float_t stemax, Float_t deemax, Float_t epsil,
1762 Float_t stmin)
1763{
1764 //
1765 // NTMED Tracking medium number
1766 // NAME Tracking medium name
1767 // NMAT Material number
1768 // ISVOL Sensitive volume flag
1769 // IFIELD Magnetic field
1770 // FIELDM Max. field value (Kilogauss)
1771 // TMAXFD Max. angle due to field (deg/step)
1772 // STEMAX Max. step allowed
1773 // DEEMAX Max. fraction of energy lost in a step
1774 // EPSIL Tracking precision (cm)
1775 // STMIN Min. step due to continuos processes (cm)
1776 //
1777 // IFIELD = 0 if no magnetic field; IFIELD = -1 if user decision in GUSWIM;
1778 // IFIELD = 1 if tracking performed with GRKUTA; IFIELD = 2 if tracking
1779 // performed with GHELIX; IFIELD = 3 if tracking performed with GHELX3.
1780 //
1781 Float_t *ubuf=0;
1782 Int_t nbuf=0;
1783 gstmed(numed,PASSCHARD(name), nmat, isvol, ifield, fieldm, tmaxfd, stemax,
1784 deemax, epsil, stmin, ubuf, nbuf PASSCHARL(name));
1785}
1786
1787//_____________________________________________________________________________
1788void TGeant3::Gsckov(Int_t itmed, Int_t npckov, Float_t *ppckov,
1789 Float_t *absco, Float_t *effic, Float_t *rindex)
1790{
1791 //
1792 // Stores the tables for UV photon tracking in medium ITMED
1793 // Please note that it is the user's responsability to
1794 // provide all the coefficients:
1795 //
1796 //
1797 // ITMED Tracking medium number
1798 // NPCKOV Number of bins of each table
1799 // PPCKOV Value of photon momentum (in GeV)
1800 // ABSCO Absorbtion coefficients
1801 // dielectric: absorbtion length in cm
1802 // metals : absorbtion fraction (0<=x<=1)
1803 // EFFIC Detection efficiency for UV photons
1804 // RINDEX Refraction index (if=0 metal)
1805 //
1806 gsckov(itmed,npckov,ppckov,absco,effic,rindex);
1807}
1808
1809//_____________________________________________________________________________
1810void TGeant3::Gstpar(Int_t itmed, const char *param, Float_t parval)
1811{
1812 //
1813 // To change the value of cut or mechanism "CHPAR"
1814 // to a new value PARVAL for tracking medium ITMED
1815 // The data structure JTMED contains the standard tracking
1816 // parameters (CUTS and flags to control the physics processes) which
1817 // are used by default for all tracking media. It is possible to
1818 // redefine individually with GSTPAR any of these parameters for a
1819 // given tracking medium.
1820 // ITMED tracking medium number
1821 // CHPAR is a character string (variable name)
1822 // PARVAL must be given as a floating point.
1823 //
1824 gstpar(itmed,PASSCHARD(param), parval PASSCHARL(param));
1825}
1826
1827//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1828//
1829// Functions from GCONS
1830//
1831//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1832
1833//_____________________________________________________________________________
1834void TGeant3::Gfkine(Int_t itra, Float_t *vert, Float_t *pvert, Int_t &ipart,
1835 Int_t &nvert)
1836{
1837 // Storing/Retrieving Vertex and Track parameters
1838 // ----------------------------------------------
1839 //
1840 // Stores vertex parameters.
1841 // VERT array of (x,y,z) position of the vertex
1842 // NTBEAM beam track number origin of the vertex
1843 // =0 if none exists
1844 // NTTARG target track number origin of the vertex
1845 // UBUF user array of NUBUF floating point numbers
1846 // NUBUF
1847 // NVTX new vertex number (=0 in case of error).
1848 // Prints vertex parameters.
1849 // IVTX for vertex IVTX.
1850 // (For all vertices if IVTX=0)
1851 // Stores long life track parameters.
1852 // PLAB components of momentum
1853 // IPART type of particle (see GSPART)
1854 // NV vertex number origin of track
1855 // UBUF array of NUBUF floating point user parameters
1856 // NUBUF
1857 // NT track number (if=0 error).
1858 // Retrieves long life track parameters.
1859 // ITRA track number for which parameters are requested
1860 // VERT vector origin of the track
1861 // PVERT 4 momentum components at the track origin
1862 // IPART particle type (=0 if track ITRA does not exist)
1863 // NVERT vertex number origin of the track
1864 // UBUF user words stored in GSKINE.
1865 // Prints initial track parameters.
1866 // ITRA for track ITRA
1867 // (For all tracks if ITRA=0)
1868 //
1869 Float_t *ubuf=0;
1870 Int_t nbuf;
1871 gfkine(itra,vert,pvert,ipart,nvert,ubuf,nbuf);
1872}
1873
1874//_____________________________________________________________________________
1875void TGeant3::Gfvert(Int_t nvtx, Float_t *v, Int_t &ntbeam, Int_t &nttarg,
1876 Float_t &tofg)
1877{
1878 //
1879 // Retrieves the parameter of a vertex bank
1880 // Vertex is generated from tracks NTBEAM NTTARG
1881 // NVTX is the new vertex number
1882 //
1883 Float_t *ubuf=0;
1884 Int_t nbuf;
1885 gfvert(nvtx,v,ntbeam,nttarg,tofg,ubuf,nbuf);
1886}
1887
1888//_____________________________________________________________________________
1889Int_t TGeant3::Gskine(Float_t *plab, Int_t ipart, Int_t nv, Float_t *buf,
1890 Int_t nwbuf)
1891{
1892 //
1893 // Store kinematics of track NT into data structure
1894 // Track is coming from vertex NV
1895 //
1896 Int_t nt = 0;
1897 gskine(plab, ipart, nv, buf, nwbuf, nt);
1898 return nt;
1899}
1900
1901//_____________________________________________________________________________
1902Int_t TGeant3::Gsvert(Float_t *v, Int_t ntbeam, Int_t nttarg, Float_t *ubuf,
1903 Int_t nwbuf)
1904{
1905 //
1906 // Creates a new vertex bank
1907 // Vertex is generated from tracks NTBEAM NTTARG
1908 // NVTX is the new vertex number
1909 //
1910 Int_t nwtx = 0;
1911 gsvert(v, ntbeam, nttarg, ubuf, nwbuf, nwtx);
1912 return nwtx;
1913}
1914
1915//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1916//
1917// Functions from GPHYS
1918//
1919//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1920
1921//_____________________________________________________________________________
1922void TGeant3::Gphysi()
1923{
1924 //
1925 // Initialise material constants for all the physics
1926 // mechanisms used by GEANT
1927 //
1928 gphysi();
1929}
1930
1931//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1932//
1933// Functions from GTRAK
1934//
1935//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
1936
1937//_____________________________________________________________________________
1938void TGeant3::Gdebug()
1939{
1940 //
1941 // Debug the current step
1942 //
1943 gdebug();
1944}
1945
1946//_____________________________________________________________________________
1947void TGeant3::Gekbin()
1948{
1949 //
1950 // To find bin number in kinetic energy table
1951 // stored in ELOW(NEKBIN)
1952 //
1953 gekbin();
1954}
1955
1956//_____________________________________________________________________________
1957void TGeant3::Gfinds()
1958{
1959 //
1960 // Returns the set/volume parameters corresponding to
1961 // the current space point in /GCTRAK/
1962 // and fill common /GCSETS/
1963 //
1964 // IHSET user set identifier
1965 // IHDET user detector identifier
1966 // ISET set number in JSET
1967 // IDET detector number in JS=LQ(JSET-ISET)
1968 // IDTYPE detector type (1,2)
1969 // NUMBV detector volume numbers (array of length NVNAME)
1970 // NVNAME number of volume levels
1971 //
1972 gfinds();
1973}
1974
1975//_____________________________________________________________________________
1976void TGeant3::Gsking(Int_t igk)
1977{
1978 //
1979 // Stores in stack JSTAK either the IGKth track of /GCKING/,
1980 // or the NGKINE tracks when IGK is 0.
1981 //
1982 gsking(igk);
1983}
1984
1985//_____________________________________________________________________________
1986void TGeant3::Gskpho(Int_t igk)
1987{
1988 //
1989 // Stores in stack JSTAK either the IGKth Cherenkov photon of
1990 // /GCKIN2/, or the NPHOT tracks when IGK is 0.
1991 //
1992 gskpho(igk);
1993}
1994
1995//_____________________________________________________________________________
1996void TGeant3::Gsstak(Int_t iflag)
1997{
1998 //
1999 // Stores in auxiliary stack JSTAK the particle currently
2000 // described in common /GCKINE/.
2001 //
2002 // On request, creates also an entry in structure JKINE :
2003 // IFLAG =
2004 // 0 : No entry in JKINE structure required (user)
2005 // 1 : New entry in JVERTX / JKINE structures required (user)
2006 // <0 : New entry in JKINE structure at vertex -IFLAG (user)
2007 // 2 : Entry in JKINE structure exists already (from GTREVE)
2008 //
2009 gsstak(iflag);
2010}
2011
2012//_____________________________________________________________________________
2013void TGeant3::Gsxyz()
2014{
2015 //
2016 // Store space point VECT in banks JXYZ
2017 //
2018 gsxyz();
2019}
2020
2021//_____________________________________________________________________________
2022void TGeant3::Gtrack()
2023{
2024 //
2025 // Controls tracking of current particle
2026 //
2027 gtrack();
2028}
2029
2030//_____________________________________________________________________________
2031void TGeant3::Gtreve()
2032{
2033 //
2034 // Controls tracking of all particles belonging to the current event
2035 //
2036 gtreve();
2037}
2038
1578254f 2039//_____________________________________________________________________________
2040void TGeant3::Gtreve_root()
2041{
2042 //
2043 // Controls tracking of all particles belonging to the current event
2044 //
2045 gtreve_root();
2046}
2047
fe4da5cc 2048//_____________________________________________________________________________
2049void TGeant3::Grndm(Float_t *rvec, const Int_t len) const
2050{
2051 //
2052 // To generate a vector RVECV of LEN random numbers
2053 // Copy of the CERN Library routine RANECU
2054 grndm(rvec,len);
2055}
2056
2057//_____________________________________________________________________________
2058void TGeant3::Grndmq(Int_t &is1, Int_t &is2, const Int_t iseq,
2059 const Text_t *chopt)
2060{
2061 //
2062 // To set/retrieve the seed of the random number generator
2063 //
2064 grndmq(is1,is2,iseq,PASSCHARD(chopt) PASSCHARL(chopt));
2065}
2066
2067//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2068//
2069// Functions from GDRAW
2070//
2071//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2072
2073//_____________________________________________________________________________
2074void TGeant3::Gdxyz(Int_t it)
2075{
2076 //
2077 // Draw the points stored with Gsxyz relative to track it
2078 //
2079 gdxyz(it);
2080}
2081
2082//_____________________________________________________________________________
2083void TGeant3::Gdcxyz()
2084{
2085 //
2086 // Draw the position of the current track
2087 //
2088 gdcxyz();
2089}
2090
2091//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2092//
2093// Functions from GGEOM
2094//
2095//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2096
2097//_____________________________________________________________________________
2098void TGeant3::Gdtom(Float_t *xd, Float_t *xm, Int_t iflag)
2099{
2100 //
2101 // Computes coordinates XM (Master Reference System
2102 // knowing the coordinates XD (Detector Ref System)
2103 // The local reference system can be initialized by
2104 // - the tracking routines and GDTOM used in GUSTEP
2105 // - a call to GSCMED(NLEVEL,NAMES,NUMBER)
2106 // (inverse routine is GMTOD)
2107 //
2108 // If IFLAG=1 convert coordinates
2109 // IFLAG=2 convert direction cosinus
2110 //
2111 gdtom(xd, xm, iflag);
2112}
2113
2114//_____________________________________________________________________________
2115void TGeant3::Glmoth(const char* iudet, Int_t iunum, Int_t &nlev, Int_t *lvols,
2116 Int_t *lindx)
2117{
2118 //
2119 // Loads the top part of the Volume tree in LVOLS (IVO's),
2120 // LINDX (IN indices) for a given volume defined through
2121 // its name IUDET and number IUNUM.
2122 //
2123 // The routine stores only upto the last level where JVOLUM
2124 // data structure is developed. If there is no development
2125 // above the current level, it returns NLEV zero.
2126 Int_t *idum=0;
2127 glmoth(PASSCHARD(iudet), iunum, nlev, lvols, lindx, idum PASSCHARL(iudet));
2128}
2129
2130//_____________________________________________________________________________
2131void TGeant3::Gmedia(Float_t *x, Int_t &numed)
2132{
2133 //
2134 // Finds in which volume/medium the point X is, and updates the
2135 // common /GCVOLU/ and the structure JGPAR accordingly.
2136 //
2137 // NUMED returns the tracking medium number, or 0 if point is
2138 // outside the experimental setup.
2139 //
2140 gmedia(x,numed);
2141}
2142
2143//_____________________________________________________________________________
2144void TGeant3::Gmtod(Float_t *xm, Float_t *xd, Int_t iflag)
2145{
2146 //
2147 // Computes coordinates XD (in DRS)
2148 // from known coordinates XM in MRS
2149 // The local reference system can be initialized by
2150 // - the tracking routines and GMTOD used in GUSTEP
2151 // - a call to GMEDIA(XM,NUMED)
2152 // - a call to GLVOLU(NLEVEL,NAMES,NUMBER,IER)
2153 // (inverse routine is GDTOM)
2154 //
2155 // If IFLAG=1 convert coordinates
2156 // IFLAG=2 convert direction cosinus
2157 //
2158 gmtod(xm, xd, iflag);
2159}
2160
2161//_____________________________________________________________________________
2162void TGeant3::Gsdvn(const char *name, const char *mother, Int_t ndiv,
2163 Int_t iaxis)
2164{
2165 //
2166 // Create a new volume by dividing an existing one
2167 //
2168 // NAME Volume name
2169 // MOTHER Mother volume name
2170 // NDIV Number of divisions
2171 // IAXIS Axis value
2172 //
2173 // X,Y,Z of CAXIS will be translated to 1,2,3 for IAXIS.
2174 // It divides a previously defined volume.
2175 //
2176 char vname[5];
2177 Vname(name,vname);
2178 char vmother[5];
2179 Vname(mother,vmother);
2180 gsdvn(PASSCHARD(vname), PASSCHARD(vmother), ndiv, iaxis PASSCHARL(vname)
2181 PASSCHARL(vmother));
2182}
2183
2184//_____________________________________________________________________________
2185void TGeant3::Gsdvn2(const char *name, const char *mother, Int_t ndiv,
2186 Int_t iaxis, Float_t c0i, Int_t numed)
2187{
2188 //
2189 // Create a new volume by dividing an existing one
2190 //
2191 // Divides mother into ndiv divisions called name
2192 // along axis iaxis starting at coordinate value c0.
2193 // the new volume created will be medium number numed.
2194 //
2195 char vname[5];
2196 Vname(name,vname);
2197 char vmother[5];
2198 Vname(mother,vmother);
2199 gsdvn2(PASSCHARD(vname), PASSCHARD(vmother), ndiv, iaxis, c0i, numed
2200 PASSCHARL(vname) PASSCHARL(vmother));
2201}
2202
2203//_____________________________________________________________________________
2204void TGeant3::Gsdvs(const char *name, const char *mother, Float_t step,
2205 Int_t iaxis, Int_t numed)
2206{
2207 //
2208 // Create a new volume by dividing an existing one
2209 //
2210 char vname[5];
2211 Vname(name,vname);
2212 char vmother[5];
2213 Vname(mother,vmother);
2214 gsdvs(PASSCHARD(vname), PASSCHARD(vmother), step, iaxis, numed
2215 PASSCHARL(vname) PASSCHARL(vmother));
2216}
2217
2218//_____________________________________________________________________________
2219void TGeant3::Gsdvs2(const char *name, const char *mother, Float_t step,
2220 Int_t iaxis, Float_t c0, Int_t numed)
2221{
2222 //
2223 // Create a new volume by dividing an existing one
2224 //
2225 char vname[5];
2226 Vname(name,vname);
2227 char vmother[5];
2228 Vname(mother,vmother);
2229 gsdvs2(PASSCHARD(vname), PASSCHARD(vmother), step, iaxis, c0, numed
2230 PASSCHARL(vname) PASSCHARL(vmother));
2231}
2232
2233//_____________________________________________________________________________
2234void TGeant3::Gsdvt(const char *name, const char *mother, Float_t step,
2235 Int_t iaxis, Int_t numed, Int_t ndvmx)
2236{
2237 //
2238 // Create a new volume by dividing an existing one
2239 //
2240 // Divides MOTHER into divisions called NAME along
2241 // axis IAXIS in steps of STEP. If not exactly divisible
2242 // will make as many as possible and will centre them
2243 // with respect to the mother. Divisions will have medium
2244 // number NUMED. If NUMED is 0, NUMED of MOTHER is taken.
2245 // NDVMX is the expected maximum number of divisions
2246 // (If 0, no protection tests are performed)
2247 //
2248 char vname[5];
2249 Vname(name,vname);
2250 char vmother[5];
2251 Vname(mother,vmother);
2252 gsdvt(PASSCHARD(vname), PASSCHARD(vmother), step, iaxis, numed, ndvmx
2253 PASSCHARL(vname) PASSCHARL(vmother));
2254}
2255
2256//_____________________________________________________________________________
2257void TGeant3::Gsdvt2(const char *name, const char *mother, Float_t step,
2258 Int_t iaxis, Float_t c0, Int_t numed, Int_t ndvmx)
2259{
2260 //
2261 // Create a new volume by dividing an existing one
2262 //
2263 // Divides MOTHER into divisions called NAME along
2264 // axis IAXIS starting at coordinate value C0 with step
2265 // size STEP.
2266 // The new volume created will have medium number NUMED.
2267 // If NUMED is 0, NUMED of mother is taken.
2268 // NDVMX is the expected maximum number of divisions
2269 // (If 0, no protection tests are performed)
2270 //
2271 char vname[5];
2272 Vname(name,vname);
2273 char vmother[5];
2274 Vname(mother,vmother);
2275 gsdvt2(PASSCHARD(vname), PASSCHARD(vmother), step, iaxis, c0,
2276 numed, ndvmx PASSCHARL(vname) PASSCHARL(vmother));
2277}
2278
2279//_____________________________________________________________________________
2280void TGeant3::Gsord(const char *name, Int_t iax)
2281{
2282 //
2283 // Flags volume CHNAME whose contents will have to be ordered
2284 // along axis IAX, by setting the search flag to -IAX
2285 // IAX = 1 X axis
2286 // IAX = 2 Y axis
2287 // IAX = 3 Z axis
2288 // IAX = 4 Rxy (static ordering only -> GTMEDI)
2289 // IAX = 14 Rxy (also dynamic ordering -> GTNEXT)
2290 // IAX = 5 Rxyz (static ordering only -> GTMEDI)
2291 // IAX = 15 Rxyz (also dynamic ordering -> GTNEXT)
2292 // IAX = 6 PHI (PHI=0 => X axis)
2293 // IAX = 7 THETA (THETA=0 => Z axis)
2294 //
2295 char vname[5];
2296 Vname(name,vname);
2297 gsord(PASSCHARD(vname), iax PASSCHARL(vname));
2298}
2299
2300//_____________________________________________________________________________
2301void TGeant3::Gspos(const char *name, Int_t nr, const char *mother, Float_t x,
2302 Float_t y, Float_t z, Int_t irot, const char *konly)
2303{
2304 //
2305 // Position a volume into an existing one
2306 //
2307 // NAME Volume name
2308 // NUMBER Copy number of the volume
2309 // MOTHER Mother volume name
2310 // X X coord. of the volume in mother ref. sys.
2311 // Y Y coord. of the volume in mother ref. sys.
2312 // Z Z coord. of the volume in mother ref. sys.
2313 // IROT Rotation matrix number w.r.t. mother ref. sys.
2314 // ONLY ONLY/MANY flag
2315 //
2316 // It positions a previously defined volume in the mother.
2317 //
2318 char vname[5];
2319 Vname(name,vname);
2320 char vmother[5];
2321 Vname(mother,vmother);
2322 gspos(PASSCHARD(vname), nr, PASSCHARD(vmother), x, y, z, irot,
2323 PASSCHARD(konly) PASSCHARL(vname) PASSCHARL(vmother)
2324 PASSCHARL(konly));
2325}
2326
2327//_____________________________________________________________________________
2328void TGeant3::Gsposp(const char *name, Int_t nr, const char *mother,
2329 Float_t x, Float_t y, Float_t z, Int_t irot,
2330 const char *konly, Float_t *upar, Int_t np )
2331{
2332 //
2333 // Place a copy of generic volume NAME with user number
2334 // NR inside MOTHER, with its parameters UPAR(1..NP)
2335 //
2336 char vname[5];
2337 Vname(name,vname);
2338 char vmother[5];
2339 Vname(mother,vmother);
2340 gsposp(PASSCHARD(vname), nr, PASSCHARD(vmother), x, y, z, irot,
2341 PASSCHARD(konly), upar, np PASSCHARL(vname) PASSCHARL(vmother)
2342 PASSCHARL(konly));
2343}
2344
2345//_____________________________________________________________________________
2346void TGeant3::Gsrotm(Int_t nmat, Float_t theta1, Float_t phi1, Float_t theta2,
2347 Float_t phi2, Float_t theta3, Float_t phi3)
2348{
2349 //
2350 // nmat Rotation matrix number
2351 // THETA1 Polar angle for axis I
2352 // PHI1 Azimuthal angle for axis I
2353 // THETA2 Polar angle for axis II
2354 // PHI2 Azimuthal angle for axis II
2355 // THETA3 Polar angle for axis III
2356 // PHI3 Azimuthal angle for axis III
2357 //
2358 // It defines the rotation matrix number IROT.
2359 //
2360 gsrotm(nmat, theta1, phi1, theta2, phi2, theta3, phi3);
2361}
2362
2363//_____________________________________________________________________________
2364void TGeant3::Gprotm(Int_t nmat)
2365{
2366 //
2367 // To print rotation matrices structure JROTM
2368 // nmat Rotation matrix number
2369 //
2370 gprotm(nmat);
2371}
2372
2373//_____________________________________________________________________________
2374Int_t TGeant3::Gsvolu(const char *name, const char *shape, Int_t nmed,
2375 Float_t *upar, Int_t npar)
2376{
2377 //
2378 // NAME Volume name
2379 // SHAPE Volume type
2380 // NUMED Tracking medium number
2381 // NPAR Number of shape parameters
2382 // UPAR Vector containing shape parameters
2383 //
2384 // It creates a new volume in the JVOLUM data structure.
2385 //
2386 Int_t ivolu = 0;
2387 char vname[5];
2388 Vname(name,vname);
2389 char vshape[5];
2390 Vname(shape,vshape);
2391 gsvolu(PASSCHARD(vname), PASSCHARD(vshape), nmed, upar, npar, ivolu
2392 PASSCHARL(vname) PASSCHARL(vshape));
2393 return ivolu;
2394}
2395
2396//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2397//
2398// T H E D R A W I N G P A C K A G E
2399// ======================================
2400// Drawing functions. These functions allow the visualization in several ways
2401// of the volumes defined in the geometrical data structure. It is possible
2402// to draw the logical tree of volumes belonging to the detector (DTREE),
2403// to show their geometrical specification (DSPEC,DFSPC), to draw them
2404// and their cut views (DRAW, DCUT). Moreover, it is possible to execute
2405// these commands when the hidden line removal option is activated; in
2406// this case, the volumes can be also either translated in the space
2407// (SHIFT), or clipped by boolean operation (CVOL). In addition, it is
2408// possible to fill the surfaces of the volumes
2409// with solid colours when the shading option (SHAD) is activated.
2410// Several tools (ZOOM, LENS) have been developed to zoom detailed parts
2411// of the detectors or to scan physical events as well.
2412// Finally, the command MOVE will allow the rotation, translation and zooming
2413// on real time parts of the detectors or tracks and hits of a simulated event.
2414// Ray-tracing commands. In case the command (DOPT RAYT ON) is executed,
2415// the drawing is performed by the Geant ray-tracing;
2416// automatically, the color is assigned according to the tracking medium of each
2417// volume and the volumes with a density lower/equal than the air are considered
2418// transparent; if the option (USER) is set (ON) (again via the command (DOPT)),
2419// the user can set color and visibility for the desired volumes via the command
2420// (SATT), as usual, relatively to the attributes (COLO) and (SEEN).
2421// The resolution can be set via the command (SATT * FILL VALUE), where (VALUE)
2422// is the ratio between the number of pixels drawn and 20 (user coordinates).
2423// Parallel view and perspective view are possible (DOPT PROJ PARA/PERS); in the
2424// first case, we assume that the first mother volume of the tree is a box with
2425// dimensions 10000 X 10000 X 10000 cm and the view point (infinetely far) is
2426// 5000 cm far from the origin along the Z axis of the user coordinates; in the
2427// second case, the distance between the observer and the origin of the world
2428// reference system is set in cm by the command (PERSP NAME VALUE); grand-angle
2429// or telescopic effects can be achieved changing the scale factors in the command
2430// (DRAW). When the final picture does not occupy the full window,
2431// mapping the space before tracing can speed up the drawing, but can also
2432// produce less precise results; values from 1 to 4 are allowed in the command
2433// (DOPT MAPP VALUE), the mapping being more precise for increasing (VALUE); for
2434// (VALUE = 0) no mapping is performed (therefore max precision and lowest speed).
2435// The command (VALCUT) allows the cutting of the detector by three planes
2436// ortogonal to the x,y,z axis. The attribute (LSTY) can be set by the command
2437// SATT for any desired volume and can assume values from 0 to 7; it determines
2438// the different light processing to be performed for different materials:
2439// 0 = dark-matt, 1 = bright-matt, 2 = plastic, 3 = ceramic, 4 = rough-metals,
2440// 5 = shiny-metals, 6 = glass, 7 = mirror. The detector is assumed to be in the
2441// dark, the ambient light luminosity is 0.2 for each basic hue (the saturation
2442// is 0.9) and the observer is assumed to have a light source (therefore he will
2443// produce parallel light in the case of parallel view and point-like-source
2444// light in the case of perspective view).
2445//
2446//*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
2447
2448//_____________________________________________________________________________
2449void TGeant3::Gsatt(const char *name, const char *att, Int_t val)
2450{
2451 //
2452 // NAME Volume name
2453 // IOPT Name of the attribute to be set
2454 // IVAL Value to which the attribute is to be set
2455 //
2456 // name= "*" stands for all the volumes.
2457 // iopt can be chosen among the following :
2458 //
2459 // WORK 0=volume name is inactive for the tracking
2460 // 1=volume name is active for the tracking (default)
2461 //
2462 // SEEN 0=volume name is invisible
2463 // 1=volume name is visible (default)
2464 // -1=volume invisible with all its descendants in the tree
2465 // -2=volume visible but not its descendants in the tree
2466 //
2467 // LSTY line style 1,2,3,... (default=1)
2468 // LSTY=7 will produce a very precise approximation for
2469 // revolution bodies.
2470 //
2471 // LWID line width -7,...,1,2,3,..7 (default=1)
2472 // LWID<0 will act as abs(LWID) was set for the volume
2473 // and for all the levels below it. When SHAD is 'ON', LWID
2474 // represent the linewidth of the scan lines filling the surfaces
2475 // (whereas the FILL value represent their number). Therefore
2476 // tuning this parameter will help to obtain the desired
2477 // quality/performance ratio.
2478 //
2479 // COLO colour code -166,...,1,2,..166 (default=1)
2480 // n=1=black
2481 // n=2=red; n=17+m, m=0,25, increasing luminosity according to 'm';
2482 // n=3=green; n=67+m, m=0,25, increasing luminosity according to 'm';
2483 // n=4=blue; n=117+m, m=0,25, increasing luminosity according to 'm';
2484 // n=5=yellow; n=42+m, m=0,25, increasing luminosity according to 'm';
2485 // n=6=violet; n=142+m, m=0,25, increasing luminosity according to 'm';
2486 // n=7=lightblue; n=92+m, m=0,25, increasing luminosity according to 'm';
2487 // colour=n*10+m, m=1,2,...9, will produce the same colour
2488 // as 'n', but with increasing luminosity according to 'm';
2489 // COLO<0 will act as if abs(COLO) was set for the volume
2490 // and for all the levels below it.
2491 // When for a volume the attribute FILL is > 1 (and the
2492 // option SHAD is on), the ABS of its colour code must be < 8
2493 // because an automatic shading of its faces will be
2494 // performed.
2495 //
2496 // FILL (1992) fill area -7,...,0,1,...7 (default=0)
2497 // when option SHAD is "on" the FILL attribute of any
2498 // volume can be set different from 0 (normal drawing);
2499 // if it is set to 1, the faces of such volume will be filled
2500 // with solid colours; if ABS(FILL) is > 1, then a light
2501 // source is placed along the observer line, and the faces of
2502 // such volumes will be painted by colours whose luminosity
2503 // will depend on the amount of light reflected;
2504 // if ABS(FILL) = 1, then it is possible to use all the 166
2505 // colours of the colour table, becouse the automatic shading
2506 // is not performed;
2507 // for increasing values of FILL the drawing will be performed
2508 // with higher and higher resolution improving the quality (the
2509 // number of scan lines used to fill the faces increases with FILL);
2510 // it is possible to set different values of FILL
2511 // for different volumes, in order to optimize at the same time
2512 // the performance and the quality of the picture;
2513 // FILL<0 will act as if abs(FILL) was set for the volume
2514 // and for all the levels below it.
2515 // This kind of drawing can be saved in 'picture files'
2516 // or in view banks.
2517 // 0=drawing without fill area
2518 // 1=faces filled with solid colours and resolution = 6
2519 // 2=lowest resolution (very fast)
2520 // 3=default resolution
2521 // 4=.................
2522 // 5=.................
2523 // 6=.................
2524 // 7=max resolution
2525 // Finally, if a coloured background is desired, the FILL
2526 // attribute for the first volume of the tree must be set
2527 // equal to -abs(colo), colo being >0 and <166.
2528 //
2529 // SET set number associated to volume name
2530 // DET detector number associated to volume name
2531 // DTYP detector type (1,2)
2532 //
2533 InitHIGZ();
2534 char vname[5];
2535 Vname(name,vname);
2536 char vatt[5];
2537 Vname(att,vatt);
2538 gsatt(PASSCHARD(vname), PASSCHARD(vatt), val PASSCHARL(vname)
2539 PASSCHARL(vatt));
2540}
2541
2542//_____________________________________________________________________________
2543void TGeant3::Gfpara(const char *name, Int_t number, Int_t intext, Int_t& npar,
2544 Int_t& natt, Float_t* par, Float_t* att)
2545{
2546 //
2547 // Find the parameters of a volume
2548 //
2549 gfpara(PASSCHARD(name), number, intext, npar, natt, par, att
2550 PASSCHARL(name));
2551}
2552
2553//_____________________________________________________________________________
2554void TGeant3::Gckpar(Int_t ish, Int_t npar, Float_t* par)
2555{
2556 //
2557 // Check the parameters of a shape
2558 //
2559 gckpar(ish,npar,par);
2560}
2561
2562//_____________________________________________________________________________
2563void TGeant3::Gckmat(Int_t itmed, char* natmed)
2564{
2565 //
2566 // Check the parameters of a tracking medium
2567 //
2568 gckmat(itmed, PASSCHARD(natmed) PASSCHARL(natmed));
2569}
2570
2571//_____________________________________________________________________________
2572void TGeant3::Gdelete(Int_t iview)
2573{
2574 //
2575 // IVIEW View number
2576 //
2577 // It deletes a view bank from memory.
2578 //
2579 gdelet(iview);
2580}
2581
2582//_____________________________________________________________________________
2583void TGeant3::Gdopen(Int_t iview)
2584{
2585 //
2586 // IVIEW View number
2587 //
2588 // When a drawing is very complex and requires a long time to be
2589 // executed, it can be useful to store it in a view bank: after a
2590 // call to DOPEN and the execution of the drawing (nothing will
2591 // appear on the screen), and after a necessary call to DCLOSE,
2592 // the contents of the bank can be displayed in a very fast way
2593 // through a call to DSHOW; therefore, the detector can be easily
2594 // zoomed many times in different ways. Please note that the pictures
2595 // with solid colours can now be stored in a view bank or in 'PICTURE FILES'
2596 //
2597 InitHIGZ();
2598 higz->Clear();
2599 gdopen(iview);
2600}
2601
2602//_____________________________________________________________________________
2603void TGeant3::Gdclose()
2604{
2605 //
2606 // It closes the currently open view bank; it must be called after the
2607 // end of the drawing to be stored.
2608 //
2609 gdclos();
2610}
2611
2612//_____________________________________________________________________________
2613void TGeant3::Gdshow(Int_t iview)
2614{
2615 //
2616 // IVIEW View number
2617 //
2618 // It shows on the screen the contents of a view bank. It
2619 // can be called after a view bank has been closed.
2620 //
2621 gdshow(iview);
2622}
2623
2624//_____________________________________________________________________________
2625void TGeant3::Gdopt(const char *name,const char *value)
2626{
2627 //
2628 // NAME Option name
2629 // VALUE Option value
2630 //
2631 // To set/modify the drawing options.
2632 // IOPT IVAL Action
2633 //
2634 // THRZ ON Draw tracks in R vs Z
2635 // OFF (D) Draw tracks in X,Y,Z
2636 // 180
2637 // 360
2638 // PROJ PARA (D) Parallel projection
2639 // PERS Perspective
2640 // TRAK LINE (D) Trajectory drawn with lines
2641 // POIN " " with markers
2642 // HIDE ON Hidden line removal using the CG package
2643 // OFF (D) No hidden line removal
2644 // SHAD ON Fill area and shading of surfaces.
2645 // OFF (D) Normal hidden line removal.
2646 // RAYT ON Ray-tracing on.
2647 // OFF (D) Ray-tracing off.
2648 // EDGE OFF Does not draw contours when shad is on.
2649 // ON (D) Normal shading.
2650 // MAPP 1,2,3,4 Mapping before ray-tracing.
2651 // 0 (D) No mapping.
2652 // USER ON User graphics options in the raytracing.
2653 // OFF (D) Automatic graphics options.
2654 //
2655 InitHIGZ();
2656 char vname[5];
2657 Vname(name,vname);
2658 char vvalue[5];
2659 Vname(value,vvalue);
2660 gdopt(PASSCHARD(vname), PASSCHARD(vvalue) PASSCHARL(vname)
2661 PASSCHARL(vvalue));
2662}
2663
2664//_____________________________________________________________________________
2665void TGeant3::Gdraw(const char *name,Float_t theta, Float_t phi, Float_t psi,
2666 Float_t u0,Float_t v0,Float_t ul,Float_t vl)
2667{
2668 //
2669 // NAME Volume name
2670 // +
2671 // THETA Viewing angle theta (for 3D projection)
2672 // PHI Viewing angle phi (for 3D projection)
2673 // PSI Viewing angle psi (for 2D rotation)
2674 // U0 U-coord. (horizontal) of volume origin
2675 // V0 V-coord. (vertical) of volume origin
2676 // SU Scale factor for U-coord.
2677 // SV Scale factor for V-coord.
2678 //
2679 // This function will draw the volumes,
2680 // selected with their graphical attributes, set by the Gsatt
2681 // facility. The drawing may be performed with hidden line removal
2682 // and with shading effects according to the value of the options HIDE
2683 // and SHAD; if the option SHAD is ON, the contour's edges can be
2684 // drawn or not. If the option HIDE is ON, the detector can be
2685 // exploded (BOMB), clipped with different shapes (CVOL), and some
2686 // of its parts can be shifted from their original
2687 // position (SHIFT). When HIDE is ON, if
2688 // the drawing requires more than the available memory, the program
2689 // will evaluate and display the number of missing words
2690 // (so that the user can increase the
2691 // size of its ZEBRA store). Finally, at the end of each drawing (with HIDE on),
2692 // the program will print messages about the memory used and
2693 // statistics on the volumes' visibility.
2694 // The following commands will produce the drawing of a green
2695 // volume, specified by NAME, without using the hidden line removal
2696 // technique, using the hidden line removal technique,
2697 // with different linewidth and colour (red), with
2698 // solid colour, with shading of surfaces, and without edges.
2699 // Finally, some examples are given for the ray-tracing. (A possible
2700 // string for the NAME of the volume can be found using the command DTREE).
2701 //
2702 InitHIGZ();
2703 higz->Clear();
2704 char vname[5];
2705 Vname(name,vname);
2706 if (fGcvdma->raytra != 1) {
2707 gdraw(PASSCHARD(vname), theta,phi,psi,u0,v0,ul,vl PASSCHARL(vname));
2708 } else {
2709 gdrayt(PASSCHARD(vname), theta,phi,psi,u0,v0,ul,vl PASSCHARL(vname));
2710 }
2711}
2712
2713//_____________________________________________________________________________
2714void TGeant3::Gdrawc(const char *name,Int_t axis, Float_t cut,Float_t u0,
2715 Float_t v0,Float_t ul,Float_t vl)
2716{
2717 //
2718 // NAME Volume name
2719 // CAXIS Axis value
2720 // CUTVAL Cut plane distance from the origin along the axis
2721 // +
2722 // U0 U-coord. (horizontal) of volume origin
2723 // V0 V-coord. (vertical) of volume origin
2724 // SU Scale factor for U-coord.
2725 // SV Scale factor for V-coord.
2726 //
2727 // The cut plane is normal to caxis (X,Y,Z), corresponding to iaxis (1,2,3),
2728 // and placed at the distance cutval from the origin.
2729 // The resulting picture is seen from the the same axis.
2730 // When HIDE Mode is ON, it is possible to get the same effect with
2731 // the CVOL/BOX function.
2732 //
2733 InitHIGZ();
2734 higz->Clear();
2735 char vname[5];
2736 Vname(name,vname);
2737 gdrawc(PASSCHARD(vname), axis,cut,u0,v0,ul,vl PASSCHARL(vname));
2738}
2739
2740//_____________________________________________________________________________
2741void TGeant3::Gdrawx(const char *name,Float_t cutthe, Float_t cutphi,
2742 Float_t cutval, Float_t theta, Float_t phi, Float_t u0,
2743 Float_t v0,Float_t ul,Float_t vl)
2744{
2745 //
2746 // NAME Volume name
2747 // CUTTHE Theta angle of the line normal to cut plane
2748 // CUTPHI Phi angle of the line normal to cut plane
2749 // CUTVAL Cut plane distance from the origin along the axis
2750 // +
2751 // THETA Viewing angle theta (for 3D projection)
2752 // PHI Viewing angle phi (for 3D projection)
2753 // U0 U-coord. (horizontal) of volume origin
2754 // V0 V-coord. (vertical) of volume origin
2755 // SU Scale factor for U-coord.
2756 // SV Scale factor for V-coord.
2757 //
2758 // The cut plane is normal to the line given by the cut angles
2759 // cutthe and cutphi and placed at the distance cutval from the origin.
2760 // The resulting picture is seen from the viewing angles theta,phi.
2761 //
2762 InitHIGZ();
2763 higz->Clear();
2764 char vname[5];
2765 Vname(name,vname);
2766 gdrawx(PASSCHARD(vname), cutthe,cutphi,cutval,theta,phi,u0,v0,ul,vl
2767 PASSCHARL(vname));
2768}
2769
2770//_____________________________________________________________________________
2771void TGeant3::Gdhead(Int_t isel, const char *name, Float_t chrsiz)
2772{
2773 //
2774 // Parameters
2775 // +
2776 // ISEL Option flag D=111110
2777 // NAME Title
2778 // CHRSIZ Character size (cm) of title NAME D=0.6
2779 //
2780 // ISEL =
2781 // 0 to have only the header lines
2782 // xxxxx1 to add the text name centered on top of header
2783 // xxxx1x to add global detector name (first volume) on left
2784 // xxx1xx to add date on right
2785 // xx1xxx to select thick characters for text on top of header
2786 // x1xxxx to add the text 'EVENT NR x' on top of header
2787 // 1xxxxx to add the text 'RUN NR x' on top of header
2788 // NOTE that ISEL=x1xxx1 or ISEL=1xxxx1 are illegal choices,
2789 // i.e. they generate overwritten text.
2790 //
2791 gdhead(isel,PASSCHARD(name),chrsiz PASSCHARL(name));
2792}
2793
2794//_____________________________________________________________________________
2795void TGeant3::Gdman(Float_t u, Float_t v, const char *type)
2796{
2797 //
2798 // Draw a 2D-man at position (U0,V0)
2799 // Parameters
2800 // U U-coord. (horizontal) of the centre of man' R
2801 // V V-coord. (vertical) of the centre of man' R
2802 // TYPE D='MAN' possible values: 'MAN,WM1,WM2,WM3'
2803 //
2804 // CALL GDMAN(u,v),CALL GDWMN1(u,v),CALL GDWMN2(u,v),CALL GDWMN2(u,v)
2805 // It superimposes the picure of a man or of a woman, chosen among
2806 // three different ones, with the same scale factors as the detector
2807 // in the current drawing.
2808 //
2809 TString opt = type;
2810 if (opt.Contains("WM1")) {
2811 gdwmn1(u,v);
2812 } else if (opt.Contains("WM3")) {
2813 gdwmn3(u,v);
2814 } else if (opt.Contains("WM2")) {
2815 gdwmn2(u,v);
2816 } else {
2817 gdman(u,v);
2818 }
2819}
2820
2821//_____________________________________________________________________________
2822void TGeant3::Gdspec(const char *name)
2823{
2824 //
2825 // NAME Volume name
2826 //
2827 // Shows 3 views of the volume (two cut-views and a 3D view), together with
2828 // its geometrical specifications. The 3D drawing will
2829 // be performed according the current values of the options HIDE and
2830 // SHAD and according the current SetClipBox clipping parameters for that
2831 // volume.
2832 //
2833 InitHIGZ();
2834 higz->Clear();
2835 char vname[5];
2836 Vname(name,vname);
2837 gdspec(PASSCHARD(vname) PASSCHARL(vname));
2838}
2839
2840//_____________________________________________________________________________
2841void TGeant3::DrawOneSpec(const char *name)
2842{
2843 //
2844 // Function called when one double-clicks on a volume name
2845 // in a TPavelabel drawn by Gdtree.
2846 //
2847 THIGZ *higzSave = higz;
2848 higzSave->SetName("higzSave");
2849 THIGZ *higzSpec = (THIGZ*)gROOT->FindObject("higzSpec");
2850 //printf("DrawOneSpec, higz=%x, higzSpec=%x\n",higz,higzSpec);
2851 if (higzSpec) higz = higzSpec;
2852 else higzSpec = new THIGZ(defSize);
2853 higzSpec->SetName("higzSpec");
2854 higzSpec->cd();
2855 higzSpec->Clear();
2856 char vname[5];
2857 Vname(name,vname);
2858 gdspec(PASSCHARD(vname) PASSCHARL(vname));
2859 higzSpec->Update();
2860 higzSave->cd();
2861 higzSave->SetName("higz");
2862 higz = higzSave;
2863}
2864
2865//_____________________________________________________________________________
2866void TGeant3::Gdtree(const char *name,Int_t levmax, Int_t isel)
2867{
2868 //
2869 // NAME Volume name
2870 // LEVMAX Depth level
2871 // ISELT Options
2872 //
2873 // This function draws the logical tree,
2874 // Each volume in the tree is represented by a TPaveTree object.
2875 // Double-clicking on a TPaveTree draws the specs of the corresponding volume.
2876 // Use TPaveTree pop-up menu to select:
2877 // - drawing specs
2878 // - drawing tree
2879 // - drawing tree of parent
2880 //
2881 InitHIGZ();
2882 higz->Clear();
2883 char vname[5];
2884 Vname(name,vname);
2885 gdtree(PASSCHARD(vname), levmax, isel PASSCHARL(vname));
2886 higz->fPname = "";
2887}
2888
2889//_____________________________________________________________________________
2890void TGeant3::GdtreeParent(const char *name,Int_t levmax, Int_t isel)
2891{
2892 //
2893 // NAME Volume name
2894 // LEVMAX Depth level
2895 // ISELT Options
2896 //
2897 // This function draws the logical tree of the parent of name.
2898 //
2899 InitHIGZ();
2900 higz->Clear();
2901 // Scan list of volumes in JVOLUM
2902 char vname[5];
2903 Int_t gname, i, jvo, in, nin, jin, num;
2904 strncpy((char *) &gname, name, 4);
2905 for(i=1; i<=fGcnum->nvolum; i++) {
2906 jvo = fZlq[fGclink->jvolum-i];
2907 nin = Int_t(fZq[jvo+3]);
2908 if (nin == -1) nin = 1;
2909 for (in=1;in<=nin;in++) {
2910 jin = fZlq[jvo-in];
2911 num = Int_t(fZq[jin+2]);
2912 if(gname == fZiq[fGclink->jvolum+num]) {
2913 strncpy(vname,(char*)&fZiq[fGclink->jvolum+i],4);
2914 vname[4] = 0;
2915 gdtree(PASSCHARD(vname), levmax, isel PASSCHARL(vname));
2916 higz->fPname = "";
2917 return;
2918 }
2919 }
2920 }
2921}
2922
2923//_____________________________________________________________________________
2924void TGeant3::SetABAN(Int_t par)
2925{
2926 //
2927 // par = 1 particles will be stopped according to their residual
2928 // range if they are not in a sensitive material and are
2929 // far enough from the boundary
2930 // 0 particles are transported normally
2931 //
2932 fGcphys->dphys1 = par;
2933}
2934
2935
2936//_____________________________________________________________________________
2937void TGeant3::SetANNI(Int_t par)
2938{
2939 //
2940 // To control positron annihilation.
2941 // par =0 no annihilation
2942 // =1 annihilation. Decays processed.
2943 // =2 annihilation. No decay products stored.
2944 //
2945 fGcphys->ianni = par;
2946}
2947
2948
2949//_____________________________________________________________________________
2950void TGeant3::SetAUTO(Int_t par)
2951{
2952 //
2953 // To control automatic calculation of tracking medium parameters:
2954 // par =0 no automatic calculation;
2955 // =1 automati calculation.
2956 //
2957 fGctrak->igauto = par;
2958}
2959
2960
2961//_____________________________________________________________________________
2962void TGeant3::SetBOMB(Float_t boom)
2963{
2964 //
2965 // BOOM : Exploding factor for volumes position
2966 //
2967 // To 'explode' the detector. If BOOM is positive (values smaller
2968 // than 1. are suggested, but any value is possible)
2969 // all the volumes are shifted by a distance
2970 // proportional to BOOM along the direction between their centre
2971 // and the origin of the MARS; the volumes which are symmetric
2972 // with respect to this origin are simply not shown.
2973 // BOOM equal to 0 resets the normal mode.
2974 // A negative (greater than -1.) value of
2975 // BOOM will cause an 'implosion'; for even lower values of BOOM
2976 // the volumes' positions will be reflected respect to the origin.
2977 // This command can be useful to improve the 3D effect for very
2978 // complex detectors. The following commands will make explode the
2979 // detector:
2980 //
2981 InitHIGZ();
2982 setbomb(boom);
2983}
2984
2985//_____________________________________________________________________________
2986void TGeant3::SetBREM(Int_t par)
2987{
2988 //
2989 // To control bremstrahlung.
2990 // par =0 no bremstrahlung
2991 // =1 bremstrahlung. Photon processed.
2992 // =2 bremstrahlung. No photon stored.
2993 //
2994 fGcphys->ibrem = par;
2995}
2996
2997
2998//_____________________________________________________________________________
2999void TGeant3::SetCKOV(Int_t par)
3000{
3001 //
3002 // To control Cerenkov production
3003 // par =0 no Cerenkov;
3004 // =1 Cerenkov;
3005 // =2 Cerenkov with primary stopped at each step.
3006 //
3007 fGctlit->itckov = par;
3008}
3009
3010
3011//_____________________________________________________________________________
3012void TGeant3::SetClipBox(const char *name,Float_t xmin,Float_t xmax,
3013 Float_t ymin,Float_t ymax,Float_t zmin,Float_t zmax)
3014{
3015 //
3016 // The hidden line removal technique is necessary to visualize properly
3017 // very complex detectors. At the same time, it can be useful to visualize
3018 // the inner elements of a detector in detail. This function allows
3019 // subtractions (via boolean operation) of BOX shape from any part of
3020 // the detector, therefore showing its inner contents.
3021 // If "*" is given as the name of the
3022 // volume to be clipped, all volumes are clipped by the given box.
3023 // A volume can be clipped at most twice.
3024 // if a volume is explicitely clipped twice,
3025 // the "*" will not act on it anymore. Giving "." as the name
3026 // of the volume to be clipped will reset the clipping.
3027 // Parameters
3028 // NAME Name of volume to be clipped
3029 // +
3030 // XMIN Lower limit of the Shape X coordinate
3031 // XMAX Upper limit of the Shape X coordinate
3032 // YMIN Lower limit of the Shape Y coordinate
3033 // YMAX Upper limit of the Shape Y coordinate
3034 // ZMIN Lower limit of the Shape Z coordinate
3035 // ZMAX Upper limit of the Shape Z coordinate
3036 //
3037 // This function performs a boolean subtraction between the volume
3038 // NAME and a box placed in the MARS according the values of the given
3039 // coordinates.
3040
3041 InitHIGZ();
3042 char vname[5];
3043 Vname(name,vname);
3044 setclip(PASSCHARD(vname),xmin,xmax,ymin,ymax,zmin,zmax PASSCHARL(vname));
3045}
3046
3047//_____________________________________________________________________________
3048void TGeant3::SetCOMP(Int_t par)
3049{
3050 //
3051 // To control Compton scattering
3052 // par =0 no Compton
3053 // =1 Compton. Electron processed.
3054 // =2 Compton. No electron stored.
3055 //
3056 //
3057 fGcphys->icomp = par;
3058}
3059
3060//_____________________________________________________________________________
3061void TGeant3::SetCUTS(Float_t cutgam,Float_t cutele,Float_t cutneu,
3062 Float_t cuthad,Float_t cutmuo ,Float_t bcute ,
3063 Float_t bcutm ,Float_t dcute ,Float_t dcutm ,
3064 Float_t ppcutm, Float_t tofmax)
3065{
3066 //
3067 // CUTGAM Cut for gammas D=0.001
3068 // CUTELE Cut for electrons D=0.001
3069 // CUTHAD Cut for charged hadrons D=0.01
3070 // CUTNEU Cut for neutral hadrons D=0.01
3071 // CUTMUO Cut for muons D=0.01
3072 // BCUTE Cut for electron brems. D=-1.
3073 // BCUTM Cut for muon brems. D=-1.
3074 // DCUTE Cut for electron delta-rays D=-1.
3075 // DCUTM Cut for muon delta-rays D=-1.
3076 // PPCUTM Cut for e+e- pairs by muons D=0.01
3077 // TOFMAX Time of flight cut D=1.E+10
3078 //
3079 // If the default values (-1.) for BCUTE ,BCUTM ,DCUTE ,DCUTM
3080 // are not modified, they will be set to CUTGAM,CUTGAM,CUTELE,CUTELE
3081 // respectively.
3082 // If one of the parameters from CUTGAM to PPCUTM included
3083 // is modified, cross-sections and energy loss tables must be
3084 // recomputed via the function Gphysi.
3085 //
3086 fGccuts->cutgam = cutgam;
3087 fGccuts->cutele = cutele;
3088 fGccuts->cutneu = cutneu;
3089 fGccuts->cuthad = cuthad;
3090 fGccuts->cutmuo = cutmuo;
3091 fGccuts->bcute = bcute;
3092 fGccuts->bcutm = bcutm;
3093 fGccuts->dcute = dcute;
3094 fGccuts->dcutm = dcutm;
3095 fGccuts->ppcutm = ppcutm;
3096 fGccuts->tofmax = tofmax;
3097}
3098
3099//_____________________________________________________________________________
3100void TGeant3::SetDCAY(Int_t par)
3101{
3102 //
3103 // To control Decay mechanism.
3104 // par =0 no decays.
3105 // =1 Decays. secondaries processed.
3106 // =2 Decays. No secondaries stored.
3107 //
3108 fGcphys->idcay = par;
3109}
3110
3111
3112//_____________________________________________________________________________
3113void TGeant3::SetDEBU(Int_t emin, Int_t emax, Int_t emod)
3114{
3115 //
3116 // Set the debug flag and frequency
3117 // Selected debug output will be printed from
3118 // event emin to even emax each emod event
3119 //
3120 fGcflag->idemin = emin;
3121 fGcflag->idemax = emax;
3122 fGcflag->itest = emod;
3123}
3124
3125
3126//_____________________________________________________________________________
3127void TGeant3::SetDRAY(Int_t par)
3128{
3129 //
3130 // To control delta rays mechanism.
3131 // par =0 no delta rays.
3132 // =1 Delta rays. secondaries processed.
3133 // =2 Delta rays. No secondaries stored.
3134 //
3135 fGcphys->idray = par;
3136}
3137
3138//_____________________________________________________________________________
3139void TGeant3::SetHADR(Int_t par)
3140{
3141 //
3142 // To control hadronic interactions.
3143 // par =0 no hadronic interactions.
3144 // =1 Hadronic interactions. secondaries processed.
3145 // =2 Hadronic interactions. No secondaries stored.
3146 //
3147 fGcphys->ihadr = par;
3148}
3149
3150//_____________________________________________________________________________
3151void TGeant3::SetKINE(Int_t kine, Float_t xk1, Float_t xk2, Float_t xk3,
3152 Float_t xk4, Float_t xk5, Float_t xk6, Float_t xk7,
3153 Float_t xk8, Float_t xk9, Float_t xk10)
3154{
3155 //
3156 // Set the variables in /GCFLAG/ IKINE, PKINE(10)
3157 // Their meaning is user defined
3158 //
3159 fGckine->ikine = kine;
3160 fGckine->pkine[0] = xk1;
3161 fGckine->pkine[1] = xk2;
3162 fGckine->pkine[2] = xk3;
3163 fGckine->pkine[3] = xk4;
3164 fGckine->pkine[4] = xk5;
3165 fGckine->pkine[5] = xk6;
3166 fGckine->pkine[6] = xk7;
3167 fGckine->pkine[7] = xk8;
3168 fGckine->pkine[8] = xk9;
3169 fGckine->pkine[9] = xk10;
3170}
3171
3172//_____________________________________________________________________________
3173void TGeant3::SetLOSS(Int_t par)
3174{
3175 //
3176 // To control energy loss.
3177 // par =0 no energy loss;
3178 // =1 restricted energy loss fluctuations;
3179 // =2 complete energy loss fluctuations;
3180 // =3 same as 1;
3181 // =4 no energy loss fluctuations.
3182 // If the value ILOSS is changed, then cross-sections and energy loss
3183 // tables must be recomputed via the command 'PHYSI'.
3184 //
3185 fGcphys->iloss = par;
3186}
3187
3188
3189//_____________________________________________________________________________
3190void TGeant3::SetMULS(Int_t par)
3191{
3192 //
3193 // To control multiple scattering.
3194 // par =0 no multiple scattering.
3195 // =1 Moliere or Coulomb scattering.
3196 // =2 Moliere or Coulomb scattering.
3197 // =3 Gaussian scattering.
3198 //
3199 fGcphys->imuls = par;
3200}
3201
3202
3203//_____________________________________________________________________________
3204void TGeant3::SetMUNU(Int_t par)
3205{
3206 //
3207 // To control muon nuclear interactions.
3208 // par =0 no muon-nuclear interactions.
3209 // =1 Nuclear interactions. Secondaries processed.
3210 // =2 Nuclear interactions. Secondaries not processed.
3211 //
3212 fGcphys->imunu = par;
3213}
3214
3215//_____________________________________________________________________________
3216void TGeant3::SetOPTI(Int_t par)
3217{
3218 //
3219 // This flag controls the tracking optimisation performed via the
3220 // GSORD routine:
3221 // 1 no optimisation at all; GSORD calls disabled;
3222 // 0 no optimisation; only user calls to GSORD kept;
3223 // 1 all non-GSORDered volumes are ordered along the best axis;
3224 // 2 all volumes are ordered along the best axis.
3225 //
3226 fGcopti->ioptim = par;
3227}
3228
3229//_____________________________________________________________________________
3230void TGeant3::SetPAIR(Int_t par)
3231{
3232 //
3233 // To control pair production mechanism.
3234 // par =0 no pair production.
3235 // =1 Pair production. secondaries processed.
3236 // =2 Pair production. No secondaries stored.
3237 //
3238 fGcphys->ipair = par;
3239}
3240
3241
3242//_____________________________________________________________________________
3243void TGeant3::SetPFIS(Int_t par)
3244{
3245 //
3246 // To control photo fission mechanism.
3247 // par =0 no photo fission.
3248 // =1 Photo fission. secondaries processed.
3249 // =2 Photo fission. No secondaries stored.
3250 //
3251 fGcphys->ipfis = par;
3252}
3253
3254//_____________________________________________________________________________
3255void TGeant3::SetPHOT(Int_t par)
3256{
3257 //
3258 // To control Photo effect.
3259 // par =0 no photo electric effect.
3260 // =1 Photo effect. Electron processed.
3261 // =2 Photo effect. No electron stored.
3262 //
3263 fGcphys->iphot = par;
3264}
3265
3266//_____________________________________________________________________________
3267void TGeant3::SetRAYL(Int_t par)
3268{
3269 //
3270 // To control Rayleigh scattering.
3271 // par =0 no Rayleigh scattering.
3272 // =1 Rayleigh.
3273 //
3274 fGcphys->irayl = par;
3275}
3276
3277//_____________________________________________________________________________
3278void TGeant3::SetSWIT(Int_t sw, Int_t val)
3279{
3280 //
3281 // sw Switch number
3282 // val New switch value
3283 //
3284 // Change one element of array ISWIT(10) in /GCFLAG/
3285 //
3286 if (sw <= 0 || sw > 10) return;
3287 fGcflag->iswit[sw-1] = val;
3288}
3289
3290
3291//_____________________________________________________________________________
3292void TGeant3::SetTRIG(Int_t nevents)
3293{
3294 //
3295 // Set number of events to be run
3296 //
3297 fGcflag->nevent = nevents;
3298}
3299
7ac3f11b 3300//_____________________________________________________________________________
1578254f 3301void TGeant3::SetUserDecay(Int_t pdg)
7ac3f11b 3302{
3303 //
3304 // Force the decays of particles to be done with Pythia
3305 // and not with the Geant routines.
3306 // just kill pointers doing mzdrop
3307 //
1578254f 3308 Int_t ipart = IdFromPDG(pdg);
3309 if(ipart<0) {
3310 printf("Particle %d not in geant\n",pdg);
3311 return;
3312 }
7ac3f11b 3313 Int_t jpart=fGclink->jpart;
3314 Int_t jpa=fZlq[jpart-ipart];
3315 //
3316 if(jpart && jpa) {
3317 Int_t jpa1=fZlq[jpa-1];
3318 if(jpa1)
3319 mzdrop(fGcbank->ixcons,jpa1,PASSCHARD(" ") PASSCHARL(" "));
3320 Int_t jpa2=fZlq[jpa-2];
3321 if(jpa2)
3322 mzdrop(fGcbank->ixcons,jpa2,PASSCHARD(" ") PASSCHARL(" "));
3323 }
3324}
3325
fe4da5cc 3326//______________________________________________________________________________
3327void TGeant3::Vname(const char *name, char *vname)
3328{
3329 //
3330 // convert name to upper case. Make vname at least 4 chars
3331 //
3332 Int_t l = strlen(name);
3333 Int_t i;
3334 l = l < 4 ? l : 4;
3335 for (i=0;i<l;i++) vname[i] = toupper(name[i]);
3336 for (i=l;i<4;i++) vname[i] = ' ';
3337 vname[4] = 0;
3338}
3339
3340//_____________________________________________________________________________
3341void TGeant3::WriteEuclid(const char* filnam, const char* topvol,
3342 Int_t number, Int_t nlevel)
3343{
3344 //
3345 //
3346 // ******************************************************************
3347 // * *
3348 // * Write out the geometry of the detector in EUCLID file format *
3349 // * *
3350 // * filnam : will be with the extension .euc *
3351 // * topvol : volume name of the starting node *
3352 // * number : copy number of topvol (relevant for gsposp) *
3353 // * nlevel : number of levels in the tree structure *
3354 // * to be written out, starting from topvol *
3355 // * *
3356 // * Author : M. Maire *
3357 // * *
3358 // ******************************************************************
3359 //
3360 // File filnam.tme is written out with the definitions of tracking
3361 // medias and materials.
3362 // As to restore original numbers for materials and medias, program
3363 // searches in the file euc_medi.dat and comparing main parameters of
3364 // the mat. defined inside geant and the one in file recognizes them
3365 // and is able to take number from file. If for any material or medium,
3366 // this procedure fails, ordering starts from 1.
3367 // Arrays IOTMED and IOMATE are used for this procedure
3368 //
3369 const char shape[][5]={"BOX ","TRD1","TRD2","TRAP","TUBE","TUBS","CONE",
3370 "CONS","SPHE","PARA","PGON","PCON","ELTU","HYPE",
3371 "GTRA","CTUB"};
3372 Int_t i, end, itm, irm, jrm, k, nmed;
3373 Int_t imxtmed=0;
3374 Int_t imxmate=0;
3375 FILE *lun;
3376 char *filext, *filetme;
3377 char natmed[21], namate[21];
3378 char natmedc[21], namatec[21];
3379 char key[5], name[5], mother[5], konly[5];
3380 char card[133];
3381 Int_t iadvol, iadtmd, iadrot, nwtot, iret;
3382 Int_t mlevel, numbr, natt, numed, nin, ndata;
3383 Int_t iname, ivo, ish, jvo, nvstak, ivstak;
3384 Int_t jdiv, ivin, in, jin, jvin, irot;
3385 Int_t jtm, imat, jma, flag=0, imatc;
3386 Float_t az, dens, radl, absl, a, step, x, y, z;
3387 Int_t npar, ndvmx, left;
3388 Float_t zc, densc, radlc, abslc, c0, tmaxfd;
3389 Int_t nparc, numb;
3390 Int_t iomate[100], iotmed[100];
3391 Float_t par[50], att[20], ubuf[50];
3392 Float_t *qws;
3393 Int_t *iws;
3394 Int_t level, ndiv, iaxe;
3395 Int_t itmedc, nmatc, isvolc, ifieldc, nwbufc, isvol, nmat, ifield, nwbuf;
3396 Float_t fieldmc, tmaxfdc, stemaxc, deemaxc, epsilc, stminc, fieldm;
3397 Float_t tmaxf, stemax, deemax, epsil, stmin;
3398 const char *f10000="!\n%s\n!\n";
3399 //Open the input file
3400 end=strlen(filnam);
3401 for(i=0;i<end;i++) if(filnam[i]=='.') {
3402 end=i;
3403 break;
3404 }
3405 filext=new char[end+4];
3406 filetme=new char[end+4];
3407 strncpy(filext,filnam,end);
3408 strncpy(filetme,filnam,end);
3409 //
3410 // *** The output filnam name will be with extension '.euc'
3411 strcpy(&filext[end],".euc");
3412 strcpy(&filetme[end],".tme");
3413 lun=fopen(filext,"w");
3414 //
3415 // *** Initialisation of the working space
3416 iadvol=fGcnum->nvolum;
3417 iadtmd=iadvol+fGcnum->nvolum;
3418 iadrot=iadtmd+fGcnum->ntmed;
3419 if(fGclink->jrotm) {
3420 fGcnum->nrotm=fZiq[fGclink->jrotm-2];
3421 } else {
3422 fGcnum->nrotm=0;
3423 }
3424 nwtot=iadrot+fGcnum->nrotm;
3425 qws = new float[nwtot+1];
3426 for (i=0;i<nwtot+1;i++) qws[i]=0;
3427 iws = (Int_t*) qws;
3428 mlevel=nlevel;
3429 if(nlevel==0) mlevel=20;
3430 //
3431 // *** find the top volume and put it in the stak
3432 numbr = number>0 ? number : 1;
3433 Gfpara(topvol,numbr,1,npar,natt,par,att);
3434 if(npar <= 0) {
3435 printf(" *** GWEUCL *** top volume : %s number : %3d can not be a valid root\n",
3436 topvol, numbr);
3437 return;
3438 }
3439 //
3440 // *** authorized shape ?
3441 strncpy((char *)&iname, topvol, 4);
3442 ivo=0;
3443 for(i=1; i<=fGcnum->nvolum; i++) if(fZiq[fGclink->jvolum+i]==iname) {
3444 ivo=i;
3445 break;
3446 }
3447 jvo = fZlq[fGclink->jvolum-ivo];
3448 ish = Int_t (fZq[jvo+2]);
3449 if(ish > 12) {
3450 printf(" *** GWEUCL *** top volume : %s number : %3d can not be a valid root\n",
3451 topvol, numbr);
3452 }
3453 //
3454 level = 1;
3455 nvstak = 1;
3456 iws[nvstak] = ivo;
3457 iws[iadvol+ivo] = level;
3458 ivstak = 0;
3459 //
3460 //*** flag all volumes and fill the stak
3461 //
3462 L10:
3463 //
3464 // pick the next volume in stak
3465 ivstak += 1;
3466 ivo = TMath::Abs(iws[ivstak]);
3467 jvo = fZlq[fGclink->jvolum - ivo];
3468 //
3469 // flag the tracking medium
3470 numed = Int_t (fZq[jvo + 4]);
3471 iws[iadtmd + numed] = 1;
3472 //
3473 // get the daughters ...
3474 level = iws[iadvol+ivo];
3475 if (level < mlevel) {
3476 level += 1;
3477 nin = Int_t (fZq[jvo + 3]);
3478 //
3479 // from division ...
3480 if (nin < 0) {
3481 jdiv = fZlq[jvo - 1];
3482 ivin = Int_t (fZq[jdiv + 2]);
3483 nvstak += 1;
3484 iws[nvstak] = -ivin;
3485 iws[iadvol+ivin] = level;
3486 //
3487 // from position ...
3488 } else if (nin > 0) {
3489 for(in=1; in<=nin; in++) {
3490 jin = fZlq[jvo - in];
3491 ivin = Int_t (fZq[jin + 2 ]);
3492 jvin = fZlq[fGclink->jvolum - ivin];
3493 ish = Int_t (fZq[jvin + 2]);
3494 // authorized shape ?
3495 if (ish <= 12) {
3496 // not yet flagged ?
3497 if (iws[iadvol+ivin]==0) {
3498 nvstak += 1;
3499 iws[nvstak] = ivin;
3500 iws[iadvol+ivin] = level;
3501 }
3502 // flag the rotation matrix
3503 irot = Int_t ( fZq[jin + 4 ]);
3504 if (irot > 0) iws[iadrot+irot] = 1;
3505 }
3506 }
3507 }
3508 }
3509 //
3510 // next volume in stak ?
3511 if (ivstak < nvstak) goto L10;
3512 //
3513 // *** restore original material and media numbers
3514 // file euc_medi.dat is needed to compare materials and medias
3515 //
3516 FILE* luncor=fopen("euc_medi.dat","r");
3517 //
3518 if(luncor) {
3519 for(itm=1; itm<=fGcnum->ntmed; itm++) {
3520 if (iws[iadtmd+itm] > 0) {
3521 jtm = fZlq[fGclink->jtmed-itm];
3522 strncpy(natmed,(char *)&fZiq[jtm+1],20);
3523 imat = Int_t (fZq[jtm+6]);
3524 jma = fZlq[fGclink->jmate-imat];
3525 if (jma <= 0) {
3526 printf(" *** GWEUCL *** material not defined for tracking medium %5i %s\n",itm,natmed);
3527 flag=1;
3528 } else {
3529 strncpy(namate,(char *)&fZiq[jma+1],20);
3530 }
3531 //*
3532 //** find the material original number
3533 rewind(luncor);
3534 L23:
3535 iret=fscanf(luncor,"%4s,%130s",key,card);
3536 if(iret<=0) goto L26;
3537 flag=0;
3538 if(!strcmp(key,"MATE")) {
3539 sscanf(card,"%d %s %f %f %f %f %f %d",&imatc,namatec,&az,&zc,&densc,&radlc,&abslc,&nparc);
3540 Gfmate(imat,namate,a,z,dens,radl,absl,par,npar);
3541 if(!strcmp(namatec,namate)) {
3542 if(az==a && zc==z && densc==dens && radlc==radl
3543 && abslc==absl && nparc==nparc) {
3544 iomate[imat]=imatc;
3545 flag=1;
3546 printf("*** GWEUCL *** material : %3d '%s' restored as %3d\n",imat,namate,imatc);
3547 } else {
3548 printf("*** GWEUCL *** different definitions for material: %s\n",namate);
3549 }
3550 }
3551 }
3552 if(strcmp(key,"END") && !flag) goto L23;
3553 if (!flag) {
3554 printf("*** GWEUCL *** cannot restore original number for material: %s\n",namate);
3555 }
3556 //*
3557 //*
3558 //*** restore original tracking medium number
3559 rewind(luncor);
3560 L24:
3561 iret=fscanf(luncor,"%4s,%130s",key,card);
3562 if(iret<=0) goto L26;
3563 flag=0;
3564 if (!strcmp(key,"TMED")) {
3565 sscanf(card,"%d %s %d %d %d %f %f %f %f %f %f %d\n",
3566 &itmedc,natmedc,&nmatc,&isvolc,&ifieldc,&fieldmc,
3567 &tmaxfdc,&stemaxc,&deemaxc,&epsilc,&stminc,&nwbufc);
3568 Gftmed(itm,natmed,nmat,isvol,ifield,fieldm,tmaxf,stemax,deemax,
3569 epsil,stmin,ubuf,&nwbuf);
3570 if(!strcmp(natmedc,natmed)) {
3571 if (iomate[nmat]==nmatc && nwbuf==nwbufc) {
3572 iotmed[itm]=itmedc;
3573 flag=1;
3574 printf("*** GWEUCL *** medium : %3d '%20s' restored as %3d\n",
3575 itm,natmed,itmedc);
3576 } else {
3577 printf("*** GWEUCL *** different definitions for tracking medium: %s\n",natmed);
3578 }
3579 }
3580 }
3581 if(strcmp(key,"END") && !flag) goto L24;
3582 if(!flag) {
3583 printf("cannot restore original number for medium : %s\n",natmed);
3584 goto L27;
3585 }
3586 }
3587 }
3588 goto L29;
3589 //*
3590 }
3591 L26: printf("*** GWEUCL *** cannot read the data file\n");
3592 L27: flag=2;
3593 L29: if(luncor) fclose (luncor);
3594 //
3595 //
3596 // *** write down the tracking medium definition
3597 //
3598 strcpy(card,"! Tracking medium");
3599 fprintf(lun,f10000,card);
3600 //
3601 for(itm=1;itm<=fGcnum->ntmed;itm++) {
3602 if (iws[iadtmd+itm]>0) {
3603 jtm = fZlq[fGclink->jtmed-itm];
3604 strncpy(natmed,(char *)&fZiq[jtm+1],20);
3605 natmed[20]='\0';
3606 imat = Int_t (fZq[jtm+6]);
3607 jma = fZlq[fGclink->jmate-imat];
3608 //* order media from one, if comparing with database failed
3609 if (flag==2) {
3610 iotmed[itm]=++imxtmed;
3611 iomate[imat]=++imxmate;
3612 }
3613 //*
3614 if(jma<=0) {
3615 strcpy(namate," ");
3616 printf(" *** GWEUCL *** material not defined for tracking medium %5d %s\n",
3617 itm,natmed);
3618 } else {
3619 strncpy(namate,(char *)&fZiq[jma+1],20);
3620 namate[20]='\0';
3621 }
3622 fprintf(lun,"TMED %3d '%20s' %3d '%20s'\n",iotmed[itm],natmed,iomate[imat],namate);
3623 }
3624 }
3625 //*
3626 //* *** write down the rotation matrix
3627 //*
3628 strcpy(card,"! Reperes");
3629 fprintf(lun,f10000,card);
3630 //
3631 for(irm=1;irm<=fGcnum->nrotm;irm++) {
3632 if (iws[iadrot+irm]>0) {
3633 jrm = fZlq[fGclink->jrotm-irm];
3634 fprintf(lun,"ROTM %3d",irm);
3635 for(k=11;k<=16;k++) fprintf(lun," %8.3f",fZq[jrm+k]);
3636 fprintf(lun,"\n");
3637 }
3638 }
3639 //*
3640 //* *** write down the volume definition
3641 //*
3642 strcpy(card,"! Volumes");
3643 fprintf(lun,f10000,card);
3644 //*
3645 for(ivstak=1;ivstak<=nvstak;ivstak++) {
3646 ivo = iws[ivstak];
3647 if (ivo>0) {
3648 strncpy(name,(char *)&fZiq[fGclink->jvolum+ivo],4);
3649 name[4]='\0';
3650 jvo = fZlq[fGclink->jvolum-ivo];
3651 ish = Int_t (fZq[jvo+2]);
3652 nmed = Int_t (fZq[jvo+4]);
3653 npar = Int_t (fZq[jvo+5]);
3654 if (npar>0) {
3655 if (ivstak>1) for(i=0;i<npar;i++) par[i]=fZq[jvo+7+i];
3656 Gckpar (ish,npar,par);
3657 fprintf(lun,"VOLU '%4s' '%4s' %3d %3d\n",name,shape[ish-1],iotmed[nmed],npar);
3658 for(i=0;i<(npar-1)/6+1;i++) {
3659 fprintf(lun," ");
3660 left=npar-i*6;
3661 for(k=0;k<(left<6?left:6);k++) fprintf(lun," %11.5f",par[i*6+k]);
3662 fprintf(lun,"\n");
3663 }
3664 } else {
3665 fprintf(lun,"VOLU '%4s' '%4s' %3d %3d\n",name,shape[ish-1],iotmed[nmed],npar);
3666 }
3667 }
3668 }
3669 //*
3670 //* *** write down the division of volumes
3671 //*
3672 fprintf(lun,f10000,"! Divisions");
3673 for(ivstak=1;ivstak<=nvstak;ivstak++) {
3674 ivo = TMath::Abs(iws[ivstak]);
3675 jvo = fZlq[fGclink->jvolum-ivo];
3676 ish = Int_t (fZq[jvo+2]);
3677 nin = Int_t (fZq[jvo+3]);
3678 //* this volume is divided ...
3679 if (nin<0) {
3680 jdiv = fZlq[jvo-1];
3681 iaxe = Int_t ( fZq[jdiv+1]);
3682 ivin = Int_t ( fZq[jdiv+2]);
3683 ndiv = Int_t ( fZq[jdiv+3]);
3684 c0 = fZq[jdiv+4];
3685 step = fZq[jdiv+5];
3686 jvin = fZlq[fGclink->jvolum-ivin];
3687 nmed = Int_t ( fZq[jvin+4]);
3688 strncpy(mother,(char *)&fZiq[fGclink->jvolum+ivo ],4);
3689 mother[4]='\0';
3690 strncpy(name,(char *)&fZiq[fGclink->jvolum+ivin],4);
3691 name[4]='\0';
3692 if ((step<=0.)||(ish>=11)) {
3693 //* volume with negative parameter or gsposp or pgon ...
3694 fprintf(lun,"DIVN '%4s' '%4s' %3d %3d\n",name,mother,ndiv,iaxe);
3695 } else if ((ndiv<=0)||(ish==10)) {
3696 //* volume with negative parameter or gsposp or para ...
3697 ndvmx = TMath::Abs(ndiv);
3698 fprintf(lun,"DIVT '%4s' '%4s' %11.5f %3d %3d %3d\n",
3699 name,mother,step,iaxe,iotmed[nmed],ndvmx);
3700 } else {
3701 //* normal volume : all kind of division are equivalent
3702 fprintf(lun,"DVT2 '%4s' '%4s' %11.5f %3d %11.5f %3d %3d\n",
3703 name,mother,step,iaxe,c0,iotmed[nmed],ndiv);
3704 }
3705 }
3706 }
3707 //*
3708 //* *** write down the the positionnement of volumes
3709 //*
3710 fprintf(lun,f10000,"! Positionnements\n");
3711 //
3712 for(ivstak = 1;ivstak<=nvstak;ivstak++) {
3713 ivo = TMath::Abs(iws[ivstak]);
3714 strncpy(mother,(char*)&fZiq[fGclink->jvolum+ivo ],4);
3715 mother[4]='\0';
3716 jvo = fZlq[fGclink->jvolum-ivo];
3717 nin = Int_t( fZq[jvo+3]);
3718 //* this volume has daughters ...
3719 if (nin>0) {
3720 for (in=1;in<=nin;in++) {
3721 jin = fZlq[jvo-in];
3722 ivin = Int_t (fZq[jin +2]);
3723 numb = Int_t (fZq[jin +3]);
3724 irot = Int_t (fZq[jin +4]);
3725 x = fZq[jin +5];
3726 y = fZq[jin +6];
3727 z = fZq[jin +7];
3728 strcpy(konly,"ONLY");
3729 if (fZq[jin+8]!=1.) strcpy(konly,"MANY");
3730 strncpy(name,(char*)&fZiq[fGclink->jvolum+ivin],4);
3731 name[4]='\0';
3732 jvin = fZlq[fGclink->jvolum-ivin];
3733 ish = Int_t (fZq[jvin+2]);
3734 //* gspos or gsposp ?
3735 ndata = fZiq[jin-1];
3736 if (ndata==8) {
3737 fprintf(lun,"POSI '%4s' %4d '%4s' %11.5f %11.5f %11.5f %3d '%4s'\n",
3738 name,numb,mother,x,y,z,irot,konly);
3739 } else {
3740 npar = Int_t (fZq[jin+9]);
3741 for(i=0;i<npar;i++) par[i]=fZq[jin+10+i];
3742 Gckpar (ish,npar,par);
3743 fprintf(lun,"POSP '%4s' %4d '%4s' %11.5f %11.5f %11.5f %3d '%4s' %3d\n",
3744 name,numb,mother,x,y,z,irot,konly,npar);
3745 fprintf(lun," ");
3746 for(i=0;i<npar;i++) fprintf(lun," %11.5f",par[i]);
3747 fprintf(lun,"\n");
3748 }
3749 }
3750 }
3751 }
3752 //*
3753 fprintf(lun,"END\n");
3754 fclose(lun);
3755 //*
3756 //****** write down the materials and medias *****
3757 //*
3758 lun=fopen(filetme,"w");
3759 //*
3760 for(itm=1;itm<=fGcnum->ntmed;itm++) {
3761 if (iws[iadtmd+itm]>0) {
3762 jtm = fZlq[fGclink->jtmed-itm];
3763 strncpy(natmed,(char*)&fZiq[jtm+1],4);
3764 imat = Int_t (fZq[jtm+6]);
3765 jma = Int_t (fZlq[fGclink->jmate-imat]);
3766 //* material
3767 Gfmate (imat,namate,a,z,dens,radl,absl,par,npar);
3768 fprintf(lun,"MATE %4d '%20s'%11.5E %11.5E %11.5E %11.5E %11.5E %3d\n",
3769 iomate[imat],namate,a,z,dens,radl,absl,npar);
3770 //*
3771 if (npar>0) {
3772 fprintf(lun," ");
3773 for(i=0;i<npar;i++) fprintf(lun," %11.5f",par[i]);
3774 fprintf(lun,"\n");
3775 }
3776 //* medium
3777 Gftmed(itm,natmed,nmat,isvol,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin,par,&npar);
3778 fprintf(lun,"TMED %4d '%20s' %3d %1d %3d %11.5f %11.5f %11.5f %11.5f %11.5f %11.5f %3d\n",
3779 iotmed[itm],natmed,iomate[nmat],isvol,ifield,
3780 fieldm,tmaxfd,stemax,deemax,epsil,stmin,npar);
3781 //*
3782 if (npar>0) {
3783 fprintf(lun," ");
3784 for(i=0;i<npar;i++) fprintf(lun," %11.5f",par[i]);
3785 fprintf(lun,"\n");
3786 }
3787
3788 }
3789 }
3790 fprintf(lun,"END\n");
3791 printf(" *** GWEUCL *** file: %s is now written out\n",filext);
3792 printf(" *** GWEUCL *** file: %s is now written out\n",filetme);
3793 // Clean up
3794 delete [] filext;
3795 delete [] filetme;
3796 delete [] qws;
3797 iws=0;
3798 return;
3799}
3800
3801//_____________________________________________________________________________
3802void TGeant3::Streamer(TBuffer &R__b)
3803{
3804 //
3805 // Stream an object of class TGeant3.
3806 //
3807 if (R__b.IsReading()) {
3808 Version_t R__v = R__b.ReadVersion(); if (R__v) { }
3809 AliMC::Streamer(R__b);
3810 R__b >> fNextVol;
1578254f 3811 R__b >> fNPDGCodes;
3812 R__b.ReadStaticArray(fPDGCode);
fe4da5cc 3813 } else {
3814 R__b.WriteVersion(TGeant3::IsA());
3815 AliMC::Streamer(R__b);
3816 R__b << fNextVol;
1578254f 3817 R__b << fNPDGCodes;
3818 R__b.WriteArray(fPDGCode, fNPDGCodes);
fe4da5cc 3819 }
3820}
3821
3822