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