X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliModule.cxx;h=ad5c009ad5c41b1c14b72439792a3d7ccb7b2664;hb=de6df1b182a9c200bfee0d7b9c2a9b818b7e828d;hp=0c431c7d7f5c520980f7a074b28b13ff79239a87;hpb=8494b0106deea275f96e1666d9f7f4549ccc6d91;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliModule.cxx b/STEER/AliModule.cxx index 0c431c7d7f5..ad5c009ad5c 100644 --- a/STEER/AliModule.cxx +++ b/STEER/AliModule.cxx @@ -1,3 +1,59 @@ +/************************************************************************** + * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * + * * + * Author: The ALICE Off-line Project. * + * Contributors are mentioned in the code where appropriate. * + * * + * Permission to use, copy, modify and distribute this software and its * + * documentation strictly for non-commercial purposes is hereby granted * + * without fee, provided that the above copyright notice appears in all * + * copies and that both the copyright notice and this permission notice * + * appear in the supporting documentation. The authors make no claims * + * about the suitability of this software for any purpose. It is * + * provided "as is" without express or implied warranty. * + **************************************************************************/ + +/* +$Log$ +Revision 1.18 2001/12/19 14:46:26 morsch +Add possibility to disable StepManager() for each module separately. + +Revision 1.17 2001/08/29 14:28:33 morsch +Use visibility flags -1 and 3 instead of 0 and 1. + +Revision 1.16 2001/05/16 14:57:22 alibrary +New files for folders and Stack + +Revision 1.15 2001/03/20 06:36:28 alibrary +100 parameters now allowed for geant shapes + +Revision 1.14 2001/01/26 19:58:48 hristov +Major upgrade of AliRoot code + +Revision 1.13 2000/11/30 07:12:49 alibrary +Introducing new Rndm and QA classes + +Revision 1.12 2000/10/02 21:28:14 fca +Removal of useless dependecies via forward declarations + +Revision 1.11 2000/07/12 08:56:25 fca +Coding convention correction and warning removal + +Revision 1.10 2000/07/11 18:24:59 fca +Coding convention corrections + few minor bug fixes + +Revision 1.9 2000/05/16 08:45:08 fca +Correct dtor, thanks to J.Belikov + +Revision 1.8 2000/02/23 16:25:22 fca +AliVMC and AliGeant3 classes introduced +ReadEuclid moved from AliRun to AliModule + +Revision 1.7 1999/09/29 09:24:29 fca +Introduction of the Copyright and cvs Log + +*/ + /////////////////////////////////////////////////////////////////////////////// // // // Base class for ALICE modules. Both sensitive modules (Modules) and // @@ -10,88 +66,136 @@ // // //Begin_Html /* - + */ //End_Html // // /////////////////////////////////////////////////////////////////////////////// +#include +#include "TSystem.h" + #include "AliModule.h" #include "AliRun.h" -#include "AliHit.h" -#include "AliPoints.h" -#include -#include -#include +#include "AliMagF.h" +#include "AliMC.h" +#include "AliConfig.h" ClassImp(AliModule) -//_____________________________________________________________________________ -AliModule::AliModule() +//_______________________________________________________________________ +AliModule::AliModule(): + fEuclidMaterial(""), + fEuclidGeometry(""), + fIdtmed(0), + fIdmate(0), + fLoMedium(0), + fHiMedium(0), + fActive(0), + fHistograms(0), + fNodes(0), + fDebug(0), + fEnable(1) { // // Default constructor for the AliModule class // - fHistograms = 0; - fNodes = 0; } -//_____________________________________________________________________________ -AliModule::AliModule(const char* name,const char *title):TNamed(name,title) +//_______________________________________________________________________ +AliModule::AliModule(const char* name,const char *title): + TNamed(name,title), + fEuclidMaterial(""), + fEuclidGeometry(""), + fIdtmed(new TArrayI(100)), + fIdmate(new TArrayI(100)), + fLoMedium(65536), + fHiMedium(0), + fActive(0), + fHistograms(new TList()), + fNodes(new TList()), + fDebug(0), + fEnable(1) { // // Normal constructor invoked by all Modules. // Create the list for Module specific histograms // Add this Module to the global list of Modules in Run. // - // - // Initialises the histogram list - fHistograms = new TList(); - // - // Initialises the list of ROOT TNodes - fNodes = new TList(); - // // Get the Module numeric ID Int_t id = gAlice->GetModuleID(name); - if (id < 0) { - // Unknown Module ! - Warning("AliRun::Ctor","ERROR Unknown Module: %s\n",name); + if (id>=0) { + // Module already added ! + Warning("Ctor","Module: %s already present at %d\n",name,id); return; } // // Add this Module to the list of Modules - gAlice->Modules()->AddAtAndExpand(this,id); + gAlice->Modules()->Add(this); // // SetMarkerColor(3); // - // Allocate space for tracking media and material indexes - fIdtmed = new TArrayI(100); - fIdmate = new TArrayI(100); + // Clear space for tracking media and material indexes + for(Int_t i=0;i<100;i++) (*fIdmate)[i]=(*fIdtmed)[i]=0; - // - // Prepare to find the tracking media range - fLoMedium = 65536; - fHiMedium = 0; + + AliConfig::Instance()->Add(this); + + SetDebug(gAlice->GetDebug()); } -//_____________________________________________________________________________ +//_______________________________________________________________________ +AliModule::AliModule(const AliModule &mod): + TNamed(mod), + TAttLine(mod), + TAttMarker(mod), + AliRndm(mod), + fEuclidMaterial(""), + fEuclidGeometry(""), + fIdtmed(0), + fIdmate(0), + fLoMedium(0), + fHiMedium(0), + fActive(0), + fHistograms(0), + fNodes(0), + fDebug(0), + fEnable(0) +{ + // + // Copy constructor + // + mod.Copy(*this); +} + +//_______________________________________________________________________ AliModule::~AliModule() { // // Destructor // - fHistograms = 0; - // + // Delete ROOT geometry - fNodes->Clear(); - delete fNodes; + if(fNodes) { + fNodes->Clear(); + delete fNodes; + } // // Delete TArray objects delete fIdtmed; delete fIdmate; } -//_____________________________________________________________________________ +//_______________________________________________________________________ +void AliModule::Copy(AliModule & /* mod */) const +{ + // + // Copy *this onto mod, not implemented for AliModule + // + Fatal("Copy","Not implemented!\n"); +} + +//_______________________________________________________________________ void AliModule::Disable() { // @@ -103,12 +207,12 @@ void AliModule::Disable() // // Loop through geometry to disable all // nodes for this Module - while((node = (TNode*)next())) { - node->SetVisibility(0); + while((node = dynamic_cast(next()))) { + node->SetVisibility(-1); } } -//_____________________________________________________________________________ +//_______________________________________________________________________ Int_t AliModule::DistancetoPrimitive(Int_t, Int_t) { // @@ -118,7 +222,7 @@ Int_t AliModule::DistancetoPrimitive(Int_t, Int_t) return 9999; } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliModule::Enable() { // @@ -130,15 +234,15 @@ void AliModule::Enable() // // Loop through geometry to enable all // nodes for this Module - while((node = (TNode*)next())) { - node->SetVisibility(1); + while((node = dynamic_cast(next()))) { + node->SetVisibility(3); } } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliModule::AliMaterial(Int_t imat, const char* name, Float_t a, - Float_t z, Float_t dens, Float_t radl, - Float_t absl, Float_t *buf, Int_t nwbuf) const + Float_t z, Float_t dens, Float_t radl, + Float_t absl, Float_t *buf, Int_t nwbuf) const { // // Store the parameters for a material @@ -154,15 +258,40 @@ void AliModule::AliMaterial(Int_t imat, const char* name, Float_t a, // nwbuf number of user words // Int_t kmat; - AliMC::GetMC()->Material(kmat, name, a, z, dens, radl, absl, buf, nwbuf); + gMC->Material(kmat, name, a, z, dens, radl, absl, buf, nwbuf); (*fIdmate)[imat]=kmat; } +//_______________________________________________________________________ +void AliModule::AliGetMaterial(Int_t imat, char* name, Float_t &a, + Float_t &z, Float_t &dens, Float_t &radl, + Float_t &absl) +{ + // + // Store the parameters for a material + // + // imat the material index will be stored in (*fIdmate)[imat] + // name material name + // a atomic mass + // z atomic number + // dens density + // radl radiation length + // absl absorbtion length + // buf adress of an array user words + // nwbuf number of user words + // + + Float_t buf[10]; + Int_t nwbuf, kmat; + kmat=(*fIdmate)[imat]; + gMC->Gfmate(kmat, name, a, z, dens, radl, absl, buf, nwbuf); +} + -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliModule::AliMixture(Int_t imat, const char *name, Float_t *a, - Float_t *z, Float_t dens, Int_t nlmat, - Float_t *wmat) const + Float_t *z, Float_t dens, Int_t nlmat, + Float_t *wmat) const { // // Defines mixture or compound imat as composed by @@ -184,21 +313,21 @@ void AliModule::AliMixture(Int_t imat, const char *name, Float_t *a, // wmat array of concentrations // Int_t kmat; - AliMC::GetMC()->Mixture(kmat, name, a, z, dens, nlmat, wmat); + gMC->Mixture(kmat, name, a, z, dens, nlmat, wmat); (*fIdmate)[imat]=kmat; } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliModule::AliMedium(Int_t numed, const char *name, Int_t nmat, - Int_t isvol, Int_t ifield, Float_t fieldm, - Float_t tmaxfd, Float_t stemax, Float_t deemax, - Float_t epsil, Float_t stmin, Float_t *ubuf, - Int_t nbuf) const + Int_t isvol, Int_t ifield, Float_t fieldm, + Float_t tmaxfd, Float_t stemax, Float_t deemax, + Float_t epsil, Float_t stmin, Float_t *ubuf, + Int_t nbuf) const { // // Store the parameters of a tracking medium // - // numed the medium number is stored into (*fIdtmed)[numed-1] + // numed the medium number is stored into (*fIdtmed)[numed] // name medium name // nmat the material number is stored into (*fIdmate)[nmat] // isvol sensitive volume if isvol!=0 @@ -217,16 +346,15 @@ void AliModule::AliMedium(Int_t numed, const char *name, Int_t nmat, // = 3 constant magnetic field along z // Int_t kmed; - Int_t *idtmed = gAlice->Idtmed(); - AliMC::GetMC()->Medium(kmed,name, (*fIdmate)[nmat], isvol, ifield, fieldm, + gMC->Medium(kmed,name, (*fIdmate)[nmat], isvol, ifield, fieldm, tmaxfd, stemax, deemax, epsil, stmin, ubuf, nbuf); - idtmed[numed-1]=kmed; + (*fIdtmed)[numed]=kmed; } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliModule::AliMatrix(Int_t &nmat, Float_t theta1, Float_t phi1, - Float_t theta2, Float_t phi2, Float_t theta3, - Float_t phi3) const + Float_t theta2, Float_t phi2, Float_t theta3, + Float_t phi3) const { // // Define a rotation matrix. Angles are in degrees. @@ -239,10 +367,22 @@ void AliModule::AliMatrix(Int_t &nmat, Float_t theta1, Float_t phi1, // theta3 polar angle for axis III // phi3 azimuthal angle for axis III // - AliMC::GetMC()->Matrix(nmat, theta1, phi1, theta2, phi2, theta3, phi3); + gMC->Matrix(nmat, theta1, phi1, theta2, phi2, theta3, phi3); } -//_____________________________________________________________________________ +//_______________________________________________________________________ +Float_t AliModule::ZMin() const +{ + return -500; +} + +//_______________________________________________________________________ +Float_t AliModule::ZMax() const +{ + return 500; +} + +//_______________________________________________________________________ void AliModule::SetEuclidFile(char* material, char* geometry) { // @@ -260,36 +400,271 @@ void AliModule::SetEuclidFile(char* material, char* geometry) } } -//_____________________________________________________________________________ -void AliModule::Streamer(TBuffer &R__b) +//_______________________________________________________________________ +void AliModule::ReadEuclid(const char* filnam, char* topvol) { + // + // read in the geometry of the detector in euclid file format + // + // id_det : the detector identification (2=its,...) + // topvol : return parameter describing the name of the top + // volume of geometry. + // + // author : m. maire + // + // 28.07.98 + // several changes have been made by miroslav helbich + // subroutine is rewrited to follow the new established way of memory + // booking for tracking medias and rotation matrices. + // all used tracking media have to be defined first, for this you can use + // subroutine greutmed. + // top volume is searched as only volume not positioned into another // - // Stream an object of class Module. - // - if (R__b.IsReading()) { - Version_t R__v = R__b.ReadVersion(); if (R__v) { } - TNamed::Streamer(R__b); - TAttLine::Streamer(R__b); - TAttMarker::Streamer(R__b); - fEuclidMaterial.Streamer(R__b); - fEuclidGeometry.Streamer(R__b); - R__b >> fActive; - R__b >> fHistograms; - // - // Stream the pointers but not the TClonesArrays - R__b >> fNodes; // diff - } else { - R__b.WriteVersion(AliModule::IsA()); - TNamed::Streamer(R__b); - TAttLine::Streamer(R__b); - TAttMarker::Streamer(R__b); - fEuclidMaterial.Streamer(R__b); - fEuclidGeometry.Streamer(R__b); - R__b << fActive; - R__b << fHistograms; + + Int_t i, nvol, iret, itmed, irot, numed, npar, ndiv, iaxe; + Int_t ndvmx, nr, flag; + char key[5], card[77], natmed[21]; + char name[5], mother[5], shape[5], konly[5], volst[7000][5]; + char *filtmp; + Float_t par[100]; + Float_t teta1, phi1, teta2, phi2, teta3, phi3, orig, step; + Float_t xo, yo, zo; + const Int_t kMaxRot=5000; + Int_t idrot[kMaxRot],istop[7000]; + FILE *lun; + // + // *** The input filnam name will be with extension '.euc' + filtmp=gSystem->ExpandPathName(filnam); + lun=fopen(filtmp,"r"); + delete [] filtmp; + if(!lun) { + Error("ReadEuclid","Could not open file %s\n",filnam); + return; + } + //* --- definition of rotation matrix 0 --- + TArrayI &idtmed = *fIdtmed; + for(i=1; i=100 ) { + Error("ReadEuclid","TMED illegal medium number %d for %s\n",itmed,natmed); + exit(1); + } + //Pad the string with blanks + i=-1; + while(natmed[++i]); + while(i<20) natmed[i++]=' '; + natmed[i]='\0'; // - // Stream the pointers but not the TClonesArrays - R__b << fNodes; // diff + if( idtmed[itmed]<=0 ) { + Error("ReadEuclid","TMED undefined medium number %d for %s\n",itmed,natmed); + exit(1); + } + gMC->Gckmat(idtmed[itmed],natmed); + //* + } else if (!strcmp(key,"ROTM")) { + sscanf(&card[4],"%d %f %f %f %f %f %f",&irot,&teta1,&phi1,&teta2,&phi2,&teta3,&phi3); + if( irot<=0 || irot>=kMaxRot ) { + Error("ReadEuclid","ROTM rotation matrix number %d illegal\n",irot); + exit(1); + } + AliMatrix(idrot[irot],teta1,phi1,teta2,phi2,teta3,phi3); + //* + } else if (!strcmp(key,"VOLU")) { + sscanf(&card[5],"'%[^']' '%[^']' %d %d", name, shape, &numed, &npar); + if (npar>0) { + for(i=0;iGsvolu( name, shape, idtmed[numed], par, npar); + //* save the defined volumes + strcpy(volst[++nvol],name); + istop[nvol]=1; + //* + } else if (!strcmp(key,"DIVN")) { + sscanf(&card[5],"'%[^']' '%[^']' %d %d", name, mother, &ndiv, &iaxe); + gMC->Gsdvn ( name, mother, ndiv, iaxe ); + //* + } else if (!strcmp(key,"DVN2")) { + sscanf(&card[5],"'%[^']' '%[^']' %d %d %f %d",name, mother, &ndiv, &iaxe, &orig, &numed); + gMC->Gsdvn2( name, mother, ndiv, iaxe, orig,idtmed[numed]); + //* + } else if (!strcmp(key,"DIVT")) { + sscanf(&card[5],"'%[^']' '%[^']' %f %d %d %d", name, mother, &step, &iaxe, &numed, &ndvmx); + gMC->Gsdvt ( name, mother, step, iaxe, idtmed[numed], ndvmx); + //* + } else if (!strcmp(key,"DVT2")) { + sscanf(&card[5],"'%[^']' '%[^']' %f %d %f %d %d", name, mother, &step, &iaxe, &orig, &numed, &ndvmx); + gMC->Gsdvt2 ( name, mother, step, iaxe, orig, idtmed[numed], ndvmx ); + //* + } else if (!strcmp(key,"POSI")) { + sscanf(&card[5],"'%[^']' %d '%[^']' %f %f %f %d '%[^']'", name, &nr, mother, &xo, &yo, &zo, &irot, konly); + if( irot<0 || irot>=kMaxRot ) { + Error("ReadEuclid","POSI %s#%d rotation matrix number %d illegal\n",name,nr,irot); + exit(1); + } + if( idrot[irot] == -99) { + Error("ReadEuclid","POSI %s#%d undefined matrix number %d\n",name,nr,irot); + exit(1); + } + //*** volume name cannot be the top volume + for(i=1;i<=nvol;i++) { + if (!strcmp(volst[i],name)) istop[i]=0; + } + //* + gMC->Gspos ( name, nr, mother, xo, yo, zo, idrot[irot], konly ); + //* + } else if (!strcmp(key,"POSP")) { + sscanf(&card[5],"'%[^']' %d '%[^']' %f %f %f %d '%[^']' %d", name, &nr, mother, &xo, &yo, &zo, &irot, konly, &npar); + if( irot<0 || irot>=kMaxRot ) { + Error("ReadEuclid","POSP %s#%d rotation matrix number %d illegal\n",name,nr,irot); + exit(1); + } + if( idrot[irot] == -99) { + Error("ReadEuclid","POSP %s#%d undefined matrix number %d\n",name,nr,irot); + exit(1); + } + if (npar > 0) { + for(i=0;iGsposp ( name, nr, mother, xo,yo,zo, idrot[irot], konly, par, npar); + } + //* + if (strcmp(key,"END")) goto L10; + //* find top volume in the geometry + flag=0; + for(i=1;i<=nvol;i++) { + if (istop[i] && flag) { + Warning("ReadEuclid"," %s is another possible top volume\n",volst[i]); + } + if (istop[i] && !flag) { + strcpy(topvol,volst[i]); + if(fDebug) printf("%s::ReadEuclid: volume %s taken as a top volume\n",ClassName(),topvol); + flag=1; + } + } + if (!flag) { + Warning("ReadEuclid","top volume not found\n"); } + fclose (lun); + //* + //* commented out only for the not cernlib version + if(fDebug) printf("%s::ReadEuclid: file: %s is now read in\n",ClassName(),filnam); + // + return; + //* + L20: + Error("ReadEuclid","reading error or premature end of file\n"); } + +//_______________________________________________________________________ +void AliModule::ReadEuclidMedia(const char* filnam) +{ + // + // read in the materials and tracking media for the detector + // in euclid file format + // + // filnam: name of the input file + // id_det: id_det is the detector identification (2=its,...) + // + // author : miroslav helbich + // + Float_t sxmgmx = gAlice->Field()->Max(); + Int_t isxfld = gAlice->Field()->Integ(); + Int_t end, i, iret, itmed; + char key[5], card[130], natmed[21], namate[21]; + Float_t ubuf[50]; + char* filtmp; + FILE *lun; + Int_t imate; + Int_t nwbuf, isvol, ifield, nmat; + Float_t a, z, dens, radl, absl, fieldm, tmaxfd, stemax, deemax, epsil, stmin; + // + end=strlen(filnam); + for(i=0;iExpandPathName(filnam); + lun=fopen(filtmp,"r"); + delete [] filtmp; + if(!lun) { + Warning("ReadEuclidMedia","Could not open file %s\n",filnam); + return; + } + // + // Retrieve Mag Field parameters + Int_t globField=gAlice->Field()->Integ(); + Float_t globMaxField=gAlice->Field()->Max(); + // TArrayI &idtmed = *fIdtmed; + // + L10: + for(i=0;i<130;i++) card[i]=0; + iret=fscanf(lun,"%4s %[^\n]",key,card); + if(iret<=0) goto L20; + fscanf(lun,"%*c"); + //* + //* read material + if (!strcmp(key,"MATE")) { + sscanf(card,"%d '%[^']' %f %f %f %f %f %d",&imate,namate,&a,&z,&dens,&radl,&absl,&nwbuf); + if (nwbuf>0) for(i=0;i0) for(i=0;i