Added explicit base class declaration
[u/mrichter/AliRoot.git] / STEER / AliModule.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
acd84897 16/* $Id$ */
4c039060 17
8494b010 18///////////////////////////////////////////////////////////////////////////////
19// //
20// Base class for ALICE modules. Both sensitive modules (Modules) and //
21// non-sensitive ones are described by this base class. This class //
22// supports the hit and digit trees produced by the simulation and also //
23// the objects produced by the reconstruction. //
24// //
25// This class is also responsible for building the geometry of the //
26// Modules. //
27// //
28//Begin_Html
29/*
1439f98e 30<img src="picts/AliModuleClass.gif">
8494b010 31*/
32//End_Html
33// //
34///////////////////////////////////////////////////////////////////////////////
88cb7938 35
94de3818 36#include <TNode.h>
116cbefd 37#include <TObjArray.h>
2cad796f 38#include <TClonesArray.h>
39#include <TTree.h>
116cbefd 40#include <TSystem.h>
2cad796f 41#include <TDirectory.h>
94de3818 42
88cb7938 43#include "AliConfig.h"
44#include "AliLoader.h"
45#include "AliMagF.h"
8494b010 46#include "AliModule.h"
47#include "AliRun.h"
2cad796f 48#include "AliTrackReference.h"
8494b010 49
50ClassImp(AliModule)
51
e2afb3b6 52//_______________________________________________________________________
53AliModule::AliModule():
54 fEuclidMaterial(""),
55 fEuclidGeometry(""),
56 fIdtmed(0),
57 fIdmate(0),
58 fLoMedium(0),
59 fHiMedium(0),
60 fActive(0),
61 fHistograms(0),
62 fNodes(0),
63 fDebug(0),
2cad796f 64 fEnable(1),
65 fTrackReferences(0),
66 fMaxIterTrackRef(0),
67 fCurrentIterTrackRef(0)
8494b010 68{
69 //
70 // Default constructor for the AliModule class
71 //
8494b010 72}
73
e2afb3b6 74//_______________________________________________________________________
75AliModule::AliModule(const char* name,const char *title):
76 TNamed(name,title),
77 fEuclidMaterial(""),
78 fEuclidGeometry(""),
79 fIdtmed(new TArrayI(100)),
80 fIdmate(new TArrayI(100)),
81 fLoMedium(65536),
82 fHiMedium(0),
83 fActive(0),
84 fHistograms(new TList()),
85 fNodes(new TList()),
86 fDebug(0),
2cad796f 87 fEnable(1),
88 fTrackReferences(new TClonesArray("AliTrackReference", 100)),
89 fMaxIterTrackRef(0),
90 fCurrentIterTrackRef(0)
8494b010 91{
92 //
93 // Normal constructor invoked by all Modules.
94 // Create the list for Module specific histograms
95 // Add this Module to the global list of Modules in Run.
96 //
8494b010 97 // Get the Module numeric ID
98 Int_t id = gAlice->GetModuleID(name);
02ca2762 99 if (id>=0) {
100 // Module already added !
101 Warning("Ctor","Module: %s already present at %d\n",name,id);
8494b010 102 return;
103 }
104 //
105 // Add this Module to the list of Modules
88cb7938 106
107 gAlice->AddModule(this);
108
8494b010 109 SetMarkerColor(3);
110 //
e2afb3b6 111 // Clear space for tracking media and material indexes
112
8494b010 113 for(Int_t i=0;i<100;i++) (*fIdmate)[i]=(*fIdtmed)[i]=0;
9e1a0ddb 114
9e1a0ddb 115
65fb704d 116 SetDebug(gAlice->GetDebug());
8494b010 117}
118
e2afb3b6 119//_______________________________________________________________________
120AliModule::AliModule(const AliModule &mod):
121 TNamed(mod),
122 TAttLine(mod),
123 TAttMarker(mod),
124 AliRndm(mod),
125 fEuclidMaterial(""),
126 fEuclidGeometry(""),
127 fIdtmed(0),
128 fIdmate(0),
129 fLoMedium(0),
130 fHiMedium(0),
131 fActive(0),
132 fHistograms(0),
133 fNodes(0),
134 fDebug(0),
2cad796f 135 fEnable(0),
136 fTrackReferences(0),
137 fMaxIterTrackRef(0),
138 fCurrentIterTrackRef(0)
aee8290b 139{
140 //
141 // Copy constructor
142 //
8918e700 143 mod.Copy(*this);
aee8290b 144}
145
e2afb3b6 146//_______________________________________________________________________
8494b010 147AliModule::~AliModule()
148{
149 //
150 // Destructor
151 //
e2afb3b6 152
bbcea4df 153 // Remove this Module from the list of Modules
a9cc22a2 154 if (gAlice) {
155 TObjArray * modules = gAlice->Modules();
156 if (modules) modules->Remove(this);
157 }
8494b010 158 // Delete ROOT geometry
bf9b027f 159 if(fNodes) {
160 fNodes->Clear();
161 delete fNodes;
004a2444 162 fNodes = 0;
bf9b027f 163 }
a1629660 164 // Delete histograms
165 if(fHistograms) {
166 fHistograms->Clear();
167 delete fHistograms;
004a2444 168 fHistograms = 0;
169 }
170 // Delete track references
171 if (fTrackReferences) {
172 fTrackReferences->Delete();
173 delete fTrackReferences;
174 fTrackReferences = 0;
a1629660 175 }
8494b010 176 // Delete TArray objects
177 delete fIdtmed;
178 delete fIdmate;
88cb7938 179
8494b010 180}
181
e2afb3b6 182//_______________________________________________________________________
8918e700 183void AliModule::Copy(AliModule & /* mod */) const
aee8290b 184{
185 //
186 // Copy *this onto mod, not implemented for AliModule
187 //
188 Fatal("Copy","Not implemented!\n");
189}
190
e2afb3b6 191//_______________________________________________________________________
8494b010 192void AliModule::Disable()
193{
194 //
195 // Disable Module on viewer
196 //
197 fActive = kFALSE;
198 TIter next(fNodes);
199 TNode *node;
200 //
201 // Loop through geometry to disable all
202 // nodes for this Module
e2afb3b6 203 while((node = dynamic_cast<TNode*>(next()))) {
5bef1017 204 node->SetVisibility(-1);
8494b010 205 }
206}
207
e2afb3b6 208//_______________________________________________________________________
116cbefd 209Int_t AliModule::DistancetoPrimitive(Int_t, Int_t) const
8494b010 210{
211 //
212 // Return distance from mouse pointer to object
213 // Dummy routine for the moment
214 //
215 return 9999;
216}
217
e2afb3b6 218//_______________________________________________________________________
8494b010 219void AliModule::Enable()
220{
221 //
222 // Enable Module on the viewver
223 //
224 fActive = kTRUE;
225 TIter next(fNodes);
226 TNode *node;
227 //
228 // Loop through geometry to enable all
229 // nodes for this Module
e2afb3b6 230 while((node = dynamic_cast<TNode*>(next()))) {
5bef1017 231 node->SetVisibility(3);
8494b010 232 }
233}
234
e2afb3b6 235//_______________________________________________________________________
8494b010 236void AliModule::AliMaterial(Int_t imat, const char* name, Float_t a,
e2afb3b6 237 Float_t z, Float_t dens, Float_t radl,
238 Float_t absl, Float_t *buf, Int_t nwbuf) const
8494b010 239{
240 //
241 // Store the parameters for a material
242 //
243 // imat the material index will be stored in (*fIdmate)[imat]
244 // name material name
245 // a atomic mass
246 // z atomic number
247 // dens density
248 // radl radiation length
249 // absl absorbtion length
250 // buf adress of an array user words
251 // nwbuf number of user words
252 //
253 Int_t kmat;
cfce8870 254 gMC->Material(kmat, name, a, z, dens, radl, absl, buf, nwbuf);
8494b010 255 (*fIdmate)[imat]=kmat;
256}
257
e2afb3b6 258//_______________________________________________________________________
0afa509f 259void AliModule::AliGetMaterial(Int_t imat, char* name, Float_t &a,
e2afb3b6 260 Float_t &z, Float_t &dens, Float_t &radl,
116cbefd 261 Float_t &absl) const
0afa509f 262{
263 //
264 // Store the parameters for a material
265 //
266 // imat the material index will be stored in (*fIdmate)[imat]
267 // name material name
268 // a atomic mass
269 // z atomic number
270 // dens density
271 // radl radiation length
272 // absl absorbtion length
273 // buf adress of an array user words
274 // nwbuf number of user words
275 //
276
277 Float_t buf[10];
278 Int_t nwbuf, kmat;
279 kmat=(*fIdmate)[imat];
280 gMC->Gfmate(kmat, name, a, z, dens, radl, absl, buf, nwbuf);
281}
282
8494b010 283
e2afb3b6 284//_______________________________________________________________________
8494b010 285void AliModule::AliMixture(Int_t imat, const char *name, Float_t *a,
e2afb3b6 286 Float_t *z, Float_t dens, Int_t nlmat,
287 Float_t *wmat) const
8494b010 288{
289 //
290 // Defines mixture or compound imat as composed by
291 // nlmat materials defined by arrays a, z and wmat
292 //
293 // If nlmat > 0 wmat contains the proportion by
294 // weights of each basic material in the mixture
295 //
296 // If nlmat < 0 wmat contains the number of atoms
297 // of eack kind in the molecule of the compound
298 // In this case, wmat is changed on output to the relative weigths.
299 //
300 // imat the material index will be stored in (*fIdmate)[imat]
301 // name material name
302 // a array of atomic masses
303 // z array of atomic numbers
304 // dens density
305 // nlmat number of components
306 // wmat array of concentrations
307 //
308 Int_t kmat;
cfce8870 309 gMC->Mixture(kmat, name, a, z, dens, nlmat, wmat);
8494b010 310 (*fIdmate)[imat]=kmat;
311}
312
e2afb3b6 313//_______________________________________________________________________
8494b010 314void AliModule::AliMedium(Int_t numed, const char *name, Int_t nmat,
e2afb3b6 315 Int_t isvol, Int_t ifield, Float_t fieldm,
316 Float_t tmaxfd, Float_t stemax, Float_t deemax,
317 Float_t epsil, Float_t stmin, Float_t *ubuf,
318 Int_t nbuf) const
8494b010 319{
320 //
321 // Store the parameters of a tracking medium
322 //
b13db077 323 // numed the medium number is stored into (*fIdtmed)[numed]
8494b010 324 // name medium name
325 // nmat the material number is stored into (*fIdmate)[nmat]
326 // isvol sensitive volume if isvol!=0
327 // ifield magnetic field flag (see below)
328 // fieldm maximum magnetic field
329 // tmaxfd maximum deflection angle due to magnetic field
330 // stemax maximum step allowed
331 // deemax maximum fractional energy loss in one step
332 // epsil tracking precision in cm
333 // stmin minimum step due to continuous processes
334 //
335 // ifield = 0 no magnetic field
336 // = -1 user decision in guswim
337 // = 1 tracking performed with Runge Kutta
338 // = 2 tracking performed with helix
339 // = 3 constant magnetic field along z
340 //
341 Int_t kmed;
cfce8870 342 gMC->Medium(kmed,name, (*fIdmate)[nmat], isvol, ifield, fieldm,
8494b010 343 tmaxfd, stemax, deemax, epsil, stmin, ubuf, nbuf);
ad51aeb0 344 (*fIdtmed)[numed]=kmed;
8494b010 345}
346
e2afb3b6 347//_______________________________________________________________________
8494b010 348void AliModule::AliMatrix(Int_t &nmat, Float_t theta1, Float_t phi1,
e2afb3b6 349 Float_t theta2, Float_t phi2, Float_t theta3,
350 Float_t phi3) const
8494b010 351{
352 //
353 // Define a rotation matrix. Angles are in degrees.
354 //
355 // nmat on output contains the number assigned to the rotation matrix
356 // theta1 polar angle for axis I
357 // phi1 azimuthal angle for axis I
358 // theta2 polar angle for axis II
359 // phi2 azimuthal angle for axis II
360 // theta3 polar angle for axis III
361 // phi3 azimuthal angle for axis III
362 //
cfce8870 363 gMC->Matrix(nmat, theta1, phi1, theta2, phi2, theta3, phi3);
8494b010 364}
365
e2afb3b6 366//_______________________________________________________________________
65fb704d 367Float_t AliModule::ZMin() const
368{
369 return -500;
370}
371
e2afb3b6 372//_______________________________________________________________________
65fb704d 373Float_t AliModule::ZMax() const
374{
375 return 500;
376}
377
e2afb3b6 378//_______________________________________________________________________
8494b010 379void AliModule::SetEuclidFile(char* material, char* geometry)
380{
381 //
382 // Sets the name of the Euclid file
383 //
384 fEuclidMaterial=material;
385 if(geometry) {
386 fEuclidGeometry=geometry;
387 } else {
388 char* name = new char[strlen(material)];
389 strcpy(name,material);
390 strcpy(&name[strlen(name)-4],".euc");
391 fEuclidGeometry=name;
392 delete [] name;
393 }
394}
395
e2afb3b6 396//_______________________________________________________________________
b13db077 397void AliModule::ReadEuclid(const char* filnam, char* topvol)
398{
399 //
400 // read in the geometry of the detector in euclid file format
401 //
402 // id_det : the detector identification (2=its,...)
403 // topvol : return parameter describing the name of the top
404 // volume of geometry.
405 //
406 // author : m. maire
407 //
408 // 28.07.98
409 // several changes have been made by miroslav helbich
410 // subroutine is rewrited to follow the new established way of memory
411 // booking for tracking medias and rotation matrices.
412 // all used tracking media have to be defined first, for this you can use
413 // subroutine greutmed.
414 // top volume is searched as only volume not positioned into another
415 //
416
417 Int_t i, nvol, iret, itmed, irot, numed, npar, ndiv, iaxe;
418 Int_t ndvmx, nr, flag;
419 char key[5], card[77], natmed[21];
420 char name[5], mother[5], shape[5], konly[5], volst[7000][5];
421 char *filtmp;
d43b40e2 422 Float_t par[100];
b13db077 423 Float_t teta1, phi1, teta2, phi2, teta3, phi3, orig, step;
424 Float_t xo, yo, zo;
aee8290b 425 const Int_t kMaxRot=5000;
426 Int_t idrot[kMaxRot],istop[7000];
b13db077 427 FILE *lun;
428 //
429 // *** The input filnam name will be with extension '.euc'
430 filtmp=gSystem->ExpandPathName(filnam);
431 lun=fopen(filtmp,"r");
432 delete [] filtmp;
433 if(!lun) {
434 Error("ReadEuclid","Could not open file %s\n",filnam);
435 return;
436 }
437 //* --- definition of rotation matrix 0 ---
438 TArrayI &idtmed = *fIdtmed;
aee8290b 439 for(i=1; i<kMaxRot; ++i) idrot[i]=-99;
b13db077 440 idrot[0]=0;
441 nvol=0;
442 L10:
443 for(i=0;i<77;i++) card[i]=0;
444 iret=fscanf(lun,"%77[^\n]",card);
445 if(iret<=0) goto L20;
446 fscanf(lun,"%*c");
447 //*
448 strncpy(key,card,4);
449 key[4]='\0';
450 if (!strcmp(key,"TMED")) {
451 sscanf(&card[5],"%d '%[^']'",&itmed,natmed);
452 if( itmed<0 || itmed>=100 ) {
453 Error("ReadEuclid","TMED illegal medium number %d for %s\n",itmed,natmed);
454 exit(1);
455 }
456 //Pad the string with blanks
457 i=-1;
458 while(natmed[++i]);
459 while(i<20) natmed[i++]=' ';
460 natmed[i]='\0';
461 //
462 if( idtmed[itmed]<=0 ) {
463 Error("ReadEuclid","TMED undefined medium number %d for %s\n",itmed,natmed);
464 exit(1);
465 }
466 gMC->Gckmat(idtmed[itmed],natmed);
467 //*
468 } else if (!strcmp(key,"ROTM")) {
469 sscanf(&card[4],"%d %f %f %f %f %f %f",&irot,&teta1,&phi1,&teta2,&phi2,&teta3,&phi3);
aee8290b 470 if( irot<=0 || irot>=kMaxRot ) {
b13db077 471 Error("ReadEuclid","ROTM rotation matrix number %d illegal\n",irot);
472 exit(1);
473 }
474 AliMatrix(idrot[irot],teta1,phi1,teta2,phi2,teta3,phi3);
475 //*
476 } else if (!strcmp(key,"VOLU")) {
477 sscanf(&card[5],"'%[^']' '%[^']' %d %d", name, shape, &numed, &npar);
478 if (npar>0) {
479 for(i=0;i<npar;i++) fscanf(lun,"%f",&par[i]);
480 fscanf(lun,"%*c");
481 }
482 gMC->Gsvolu( name, shape, idtmed[numed], par, npar);
483 //* save the defined volumes
484 strcpy(volst[++nvol],name);
485 istop[nvol]=1;
486 //*
487 } else if (!strcmp(key,"DIVN")) {
488 sscanf(&card[5],"'%[^']' '%[^']' %d %d", name, mother, &ndiv, &iaxe);
489 gMC->Gsdvn ( name, mother, ndiv, iaxe );
490 //*
491 } else if (!strcmp(key,"DVN2")) {
492 sscanf(&card[5],"'%[^']' '%[^']' %d %d %f %d",name, mother, &ndiv, &iaxe, &orig, &numed);
493 gMC->Gsdvn2( name, mother, ndiv, iaxe, orig,idtmed[numed]);
494 //*
495 } else if (!strcmp(key,"DIVT")) {
496 sscanf(&card[5],"'%[^']' '%[^']' %f %d %d %d", name, mother, &step, &iaxe, &numed, &ndvmx);
497 gMC->Gsdvt ( name, mother, step, iaxe, idtmed[numed], ndvmx);
498 //*
499 } else if (!strcmp(key,"DVT2")) {
500 sscanf(&card[5],"'%[^']' '%[^']' %f %d %f %d %d", name, mother, &step, &iaxe, &orig, &numed, &ndvmx);
501 gMC->Gsdvt2 ( name, mother, step, iaxe, orig, idtmed[numed], ndvmx );
502 //*
503 } else if (!strcmp(key,"POSI")) {
504 sscanf(&card[5],"'%[^']' %d '%[^']' %f %f %f %d '%[^']'", name, &nr, mother, &xo, &yo, &zo, &irot, konly);
aee8290b 505 if( irot<0 || irot>=kMaxRot ) {
b13db077 506 Error("ReadEuclid","POSI %s#%d rotation matrix number %d illegal\n",name,nr,irot);
507 exit(1);
508 }
509 if( idrot[irot] == -99) {
510 Error("ReadEuclid","POSI %s#%d undefined matrix number %d\n",name,nr,irot);
511 exit(1);
512 }
513 //*** volume name cannot be the top volume
514 for(i=1;i<=nvol;i++) {
515 if (!strcmp(volst[i],name)) istop[i]=0;
516 }
517 //*
518 gMC->Gspos ( name, nr, mother, xo, yo, zo, idrot[irot], konly );
519 //*
520 } else if (!strcmp(key,"POSP")) {
521 sscanf(&card[5],"'%[^']' %d '%[^']' %f %f %f %d '%[^']' %d", name, &nr, mother, &xo, &yo, &zo, &irot, konly, &npar);
aee8290b 522 if( irot<0 || irot>=kMaxRot ) {
b13db077 523 Error("ReadEuclid","POSP %s#%d rotation matrix number %d illegal\n",name,nr,irot);
524 exit(1);
525 }
526 if( idrot[irot] == -99) {
527 Error("ReadEuclid","POSP %s#%d undefined matrix number %d\n",name,nr,irot);
528 exit(1);
529 }
530 if (npar > 0) {
531 for(i=0;i<npar;i++) fscanf(lun,"%f",&par[i]);
532 fscanf(lun,"%*c");
533 }
534 //*** volume name cannot be the top volume
535 for(i=1;i<=nvol;i++) {
536 if (!strcmp(volst[i],name)) istop[i]=0;
537 }
538 //*
539 gMC->Gsposp ( name, nr, mother, xo,yo,zo, idrot[irot], konly, par, npar);
540 }
541 //*
542 if (strcmp(key,"END")) goto L10;
543 //* find top volume in the geometry
544 flag=0;
545 for(i=1;i<=nvol;i++) {
546 if (istop[i] && flag) {
547 Warning("ReadEuclid"," %s is another possible top volume\n",volst[i]);
548 }
549 if (istop[i] && !flag) {
550 strcpy(topvol,volst[i]);
9e1a0ddb 551 if(fDebug) printf("%s::ReadEuclid: volume %s taken as a top volume\n",ClassName(),topvol);
b13db077 552 flag=1;
553 }
554 }
555 if (!flag) {
556 Warning("ReadEuclid","top volume not found\n");
557 }
558 fclose (lun);
559 //*
560 //* commented out only for the not cernlib version
9e1a0ddb 561 if(fDebug) printf("%s::ReadEuclid: file: %s is now read in\n",ClassName(),filnam);
b13db077 562 //
563 return;
564 //*
565 L20:
566 Error("ReadEuclid","reading error or premature end of file\n");
567}
568
e2afb3b6 569//_______________________________________________________________________
b13db077 570void AliModule::ReadEuclidMedia(const char* filnam)
571{
572 //
573 // read in the materials and tracking media for the detector
574 // in euclid file format
575 //
576 // filnam: name of the input file
577 // id_det: id_det is the detector identification (2=its,...)
578 //
579 // author : miroslav helbich
580 //
581 Float_t sxmgmx = gAlice->Field()->Max();
582 Int_t isxfld = gAlice->Field()->Integ();
583 Int_t end, i, iret, itmed;
584 char key[5], card[130], natmed[21], namate[21];
585 Float_t ubuf[50];
586 char* filtmp;
587 FILE *lun;
588 Int_t imate;
589 Int_t nwbuf, isvol, ifield, nmat;
590 Float_t a, z, dens, radl, absl, fieldm, tmaxfd, stemax, deemax, epsil, stmin;
591 //
592 end=strlen(filnam);
593 for(i=0;i<end;i++) if(filnam[i]=='.') {
594 end=i;
595 break;
596 }
597 //
598 // *** The input filnam name will be with extension '.euc'
9e1a0ddb 599 if(fDebug) printf("%s::ReadEuclid: The file name is %s\n",ClassName(),filnam); //Debug
b13db077 600 filtmp=gSystem->ExpandPathName(filnam);
601 lun=fopen(filtmp,"r");
602 delete [] filtmp;
603 if(!lun) {
604 Warning("ReadEuclidMedia","Could not open file %s\n",filnam);
605 return;
606 }
607 //
608 // Retrieve Mag Field parameters
aee8290b 609 Int_t globField=gAlice->Field()->Integ();
610 Float_t globMaxField=gAlice->Field()->Max();
b13db077 611 // TArrayI &idtmed = *fIdtmed;
612 //
613 L10:
614 for(i=0;i<130;i++) card[i]=0;
615 iret=fscanf(lun,"%4s %[^\n]",key,card);
616 if(iret<=0) goto L20;
617 fscanf(lun,"%*c");
618 //*
619 //* read material
620 if (!strcmp(key,"MATE")) {
621 sscanf(card,"%d '%[^']' %f %f %f %f %f %d",&imate,namate,&a,&z,&dens,&radl,&absl,&nwbuf);
622 if (nwbuf>0) for(i=0;i<nwbuf;i++) fscanf(lun,"%f",&ubuf[i]);
623 //Pad the string with blanks
624 i=-1;
625 while(namate[++i]);
626 while(i<20) namate[i++]=' ';
627 namate[i]='\0';
628 //
629 AliMaterial(imate,namate,a,z,dens,radl,absl,ubuf,nwbuf);
630 //* read tracking medium
631 } else if (!strcmp(key,"TMED")) {
632 sscanf(card,"%d '%[^']' %d %d %d %f %f %f %f %f %f %d",
633 &itmed,natmed,&nmat,&isvol,&ifield,&fieldm,&tmaxfd,
634 &stemax,&deemax,&epsil,&stmin,&nwbuf);
635 if (nwbuf>0) for(i=0;i<nwbuf;i++) fscanf(lun,"%f",&ubuf[i]);
636 if (ifield<0) ifield=isxfld;
637 if (fieldm<0) fieldm=sxmgmx;
638 //Pad the string with blanks
639 i=-1;
640 while(natmed[++i]);
641 while(i<20) natmed[i++]=' ';
642 natmed[i]='\0';
643 //
aee8290b 644 AliMedium(itmed,natmed,nmat,isvol,globField,globMaxField,tmaxfd,
b13db077 645 stemax,deemax,epsil,stmin,ubuf,nwbuf);
646 // (*fImedia)[idtmed[itmed]-1]=id_det;
647 //*
648 }
649 //*
650 if (strcmp(key,"END")) goto L10;
651 fclose (lun);
652 //*
653 //* commented out only for the not cernlib version
9e1a0ddb 654 if(fDebug) printf("%s::ReadEuclidMedia: file %s is now read in\n",
655 ClassName(),filnam);
b13db077 656 //*
657 return;
658 //*
659 L20:
660 Warning("ReadEuclidMedia","reading error or premature end of file\n");
661}
2cad796f 662
663//_______________________________________________________________________
664void AliModule::RemapTrackReferencesIDs(Int_t *map)
665{
666 //
667 // Remapping track reference
668 // Called at finish primary
669 //
670 if (!fTrackReferences) return;
671 for (Int_t i=0;i<fTrackReferences->GetEntries();i++){
672 AliTrackReference * ref = dynamic_cast<AliTrackReference*>(fTrackReferences->UncheckedAt(i));
673 if (ref) {
674 Int_t newID = map[ref->GetTrack()];
675 if (newID>=0) ref->SetTrack(newID);
2b22f272 676 else {
677 //ref->SetTrack(-1);
678 ref->SetBit(kNotDeleted,kFALSE);
679 fTrackReferences->RemoveAt(i);
680 }
2cad796f 681 }
682 }
2b22f272 683 fTrackReferences->Compress();
684
2cad796f 685}
686
687
688//_______________________________________________________________________
689AliTrackReference* AliModule::FirstTrackReference(Int_t track)
690{
691 //
692 // Initialise the hit iterator
693 // Return the address of the first hit for track
694 // If track>=0 the track is read from disk
695 // while if track<0 the first hit of the current
696 // track is returned
697 //
88cb7938 698 if(track>=0)
699 {
700 AliRunLoader* rl = AliRunLoader::GetRunLoader();
701
702 rl->GetAliRun()->ResetTrackReferences();
703 rl->TreeTR()->GetEvent(track);
704 if (rl == 0x0)
705 Fatal("FirstTrackReference","AliRunLoader not initialized. Can not proceed");
706 }
2cad796f 707 //
708 fMaxIterTrackRef = fTrackReferences->GetEntriesFast();
709 fCurrentIterTrackRef = 0;
710 if(fMaxIterTrackRef) return dynamic_cast<AliTrackReference*>(fTrackReferences->UncheckedAt(0));
711 else return 0;
712}
713
714//_______________________________________________________________________
715AliTrackReference* AliModule::NextTrackReference()
716{
717 //
718 // Return the next hit for the current track
719 //
720 if(fMaxIterTrackRef) {
721 if(++fCurrentIterTrackRef<fMaxIterTrackRef)
722 return dynamic_cast<AliTrackReference*>(fTrackReferences->UncheckedAt(fCurrentIterTrackRef));
723 else
724 return 0;
725 } else {
88cb7938 726 printf("* AliModule::NextTrackReference * TrackReference Iterator called without calling FistTrackReference before\n");
2cad796f 727 return 0;
728 }
729}
730
731
732//_______________________________________________________________________
733void AliModule::ResetTrackReferences()
734{
735 //
736 // Reset number of hits and the hits array
737 //
738 fMaxIterTrackRef = 0;
739 if (fTrackReferences) fTrackReferences->Clear();
740}
b13db077 741
88cb7938 742//_____________________________________________________________________________
743
d1898505 744AliLoader* AliModule::MakeLoader(const char* /*topfoldername*/)
88cb7938 745 {
746 return 0x0;
747 }//skowron
8494b010 748
88cb7938 749//PH Merged with v3-09-08 |
750// V
751//_____________________________________________________________________________
2cad796f 752
753void AliModule::SetTreeAddress()
754{
755 //
88cb7938 756 // Set branch address for track reference Tree
2cad796f 757 //
88cb7938 758
759 TBranch *branch;
760
761 // Branch address for track reference tree
762 TTree *treeTR = TreeTR();
763
764 if (treeTR && fTrackReferences) {
765 branch = treeTR->GetBranch(GetName());
766 if (branch)
767 {
f2a509af 768 if(GetDebug())
769 Info("SetTreeAddress","(%s) Setting for TrackRefs",GetName());
88cb7938 770 branch->SetAddress(&fTrackReferences);
771 }
772 else
f2a509af 773 {
774 //can be called before MakeBranch and than does not make sense to issue the warning
775 if(GetDebug())
776 Warning("SetTreeAddress",
777 "(%s) Failed for Track References. Can not find branch in tree.",
778 GetName());
88cb7938 779 }
780 }
2cad796f 781}
782
88cb7938 783//_____________________________________________________________________________
2cad796f 784void AliModule::AddTrackReference(Int_t label){
785 //
786 // add a trackrefernce to the list
787 if (!fTrackReferences) {
788 cerr<<"Container trackrefernce not active\n";
789 return;
790 }
791 Int_t nref = fTrackReferences->GetEntriesFast();
792 TClonesArray &lref = *fTrackReferences;
793 new(lref[nref]) AliTrackReference(label);
794}
795
796
88cb7938 797//_____________________________________________________________________________
d1898505 798void AliModule::MakeBranchTR(Option_t */*option*/)
2cad796f 799{
800 //
801 // Makes branch in treeTR
802 //
88cb7938 803 if(GetDebug()) Info("MakeBranchTR","Making Track Refs. Branch for %s",GetName());
804 TTree * tree = TreeTR();
805 if (fTrackReferences && tree)
806 {
807 TBranch *branch = tree->GetBranch(GetName());
808 if (branch)
809 {
810 if(GetDebug()) Info("MakeBranch","Branch %s is already in tree.",GetName());
811 return;
812 }
813
814 branch = tree->Branch(GetName(),&fTrackReferences);
815 }
816 else
817 {
818 if(GetDebug())
819 Info("MakeBranchTR","FAILED for %s: tree=%#x fTrackReferences=%#x",
820 GetName(),tree,fTrackReferences);
2cad796f 821 }
822}
88cb7938 823
824//_____________________________________________________________________________
825TTree* AliModule::TreeTR()
826{
827 AliRunLoader* rl = AliRunLoader::GetRunLoader();
828
829 if ( rl == 0x0)
830 {
831 Error("TreeTR","Can not get the run loader");
832 return 0x0;
833 }
834
835 TTree* tree = rl->TreeTR();
836 return tree;
837}