X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliModule.cxx;h=ed3c6575905daa5a44908cd2662f7e214f39b72d;hb=3adc85ec1509874803b05923d8b07f260cb700df;hp=f42e96606f24910e774dd33b05e13b3115959328;hpb=5bef101745a14e4d871915d3c51006e2cdc15e03;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliModule.cxx b/STEER/AliModule.cxx index f42e96606f2..ed3c6575905 100644 --- a/STEER/AliModule.cxx +++ b/STEER/AliModule.cxx @@ -13,40 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -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 - -*/ +/* $Id$ */ /////////////////////////////////////////////////////////////////////////////// // // @@ -65,158 +32,111 @@ Introduction of the Copyright and cvs Log //End_Html // // /////////////////////////////////////////////////////////////////////////////// -#include -#include "TSystem.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AliLog.h" +#include "AliConfig.h" +#include "AliLoader.h" +#include "AliMagF.h" #include "AliModule.h" #include "AliRun.h" -#include "AliMagF.h" +#include "AliTrackReference.h" #include "AliMC.h" -#include "AliConfig.h" +#include "AliSimulation.h" +#include "AliRawDataHeader.h" + +#include "AliDAQ.h" ClassImp(AliModule) -//_____________________________________________________________________________ -AliModule::AliModule() +Float_t AliModule::fgDensityFactor = 1.0; + +//_______________________________________________________________________ +AliModule::AliModule(): + fIdtmed(0), + fIdmate(0), + fLoMedium(0), + fHiMedium(0), + fActive(0), + fEnable(1), + fMaxIterTrackRef(0), + fCurrentIterTrackRef(0), + fRunLoader(0) { // // Default constructor for the AliModule class // - fHistograms = 0; - fNodes = 0; - fIdtmed = 0; - fIdmate = 0; - fDebug = 0; } -//_____________________________________________________________________________ -AliModule::AliModule(const char* name,const char *title):TNamed(name,title) +//_______________________________________________________________________ +AliModule::AliModule(const char* name,const char *title): + TNamed(name,title), + fIdtmed(new TArrayI(100)), + fIdmate(new TArrayI(100)), + fLoMedium(65536), + fHiMedium(0), + fActive(0), + fEnable(1), + fMaxIterTrackRef(0), + fCurrentIterTrackRef(0), + fRunLoader(0) { // // 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) { // Module already added ! - Warning("Ctor","Module: %s already present at %d\n",name,id); + AliWarning(Form("Module: %s already present at %d",name,id)); return; } // // Add this Module to the list of Modules - gAlice->Modules()->Add(this); - // - // - SetMarkerColor(3); - // - // Allocate space for tracking media and material indexes - fIdtmed = new TArrayI(100); - fIdmate = new TArrayI(100); - for(Int_t i=0;i<100;i++) (*fIdmate)[i]=(*fIdtmed)[i]=0; + + gAlice->AddModule(this); + + //PH SetMarkerColor(3); // - // Prepare to find the tracking media range - fLoMedium = 65536; - fHiMedium = 0; + // Clear space for tracking media and material indexes - AliConfig::Instance()->Add(this); - - SetDebug(gAlice->GetDebug()); + for(Int_t i=0;i<100;i++) (*fIdmate)[i]=(*fIdtmed)[i]=0; } -//_____________________________________________________________________________ -AliModule::AliModule(const AliModule &mod) -{ - // - // Copy constructor - // - mod.Copy(*this); -} - -//_____________________________________________________________________________ +//_______________________________________________________________________ AliModule::~AliModule() { // // Destructor // - fHistograms = 0; - // - // Delete ROOT geometry - if(fNodes) { - fNodes->Clear(); - delete fNodes; + + // Remove this Module from the list of Modules + if (gAlice) { + TObjArray * modules = gAlice->Modules(); + if (modules) modules->Remove(this); } - // + // 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() -{ - // - // Disable Module on viewer - // - fActive = kFALSE; - TIter next(fNodes); - TNode *node; - // - // Loop through geometry to disable all - // nodes for this Module - while((node = (TNode*)next())) { - node->SetVisibility(-1); - } -} - -//_____________________________________________________________________________ -Int_t AliModule::DistancetoPrimitive(Int_t, Int_t) -{ - // - // Return distance from mouse pointer to object - // Dummy routine for the moment - // - return 9999; -} - -//_____________________________________________________________________________ -void AliModule::Enable() -{ - // - // Enable Module on the viewver - // - fActive = kTRUE; - TIter next(fNodes); - TNode *node; - // - // Loop through geometry to enable all - // nodes for this Module - while((node = (TNode*)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 @@ -232,14 +152,27 @@ void AliModule::AliMaterial(Int_t imat, const char* name, Float_t a, // nwbuf number of user words // Int_t kmat; - gMC->Material(kmat, name, a, z, dens, radl, absl, buf, nwbuf); - (*fIdmate)[imat]=kmat; + //Build the string uniquename as "DET_materialname" + TString uniquename = GetName(); + uniquename.Append("_"); + uniquename.Append(name); + //if geometry loaded from file only fill fIdmate, else create material too + if(AliSimulation::Instance()->IsGeometryFromFile()){ + TGeoMaterial *mat = gGeoManager->GetMaterial(uniquename.Data()); + kmat = mat->GetUniqueID(); + (*fIdmate)[imat]=kmat; + }else{ + if (fgDensityFactor != 1.0) + AliWarning(Form("Material density multiplied by %.2f!", fgDensityFactor)); + gMC->Material(kmat, uniquename.Data(), a, z, dens * fgDensityFactor, 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) + Float_t &z, Float_t &dens, Float_t &radl, + Float_t &absl) const { // // Store the parameters for a material @@ -262,10 +195,10 @@ void AliModule::AliGetMaterial(Int_t imat, char* name, Float_t &a, } -//_____________________________________________________________________________ +//_______________________________________________________________________ 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 @@ -287,16 +220,29 @@ void AliModule::AliMixture(Int_t imat, const char *name, Float_t *a, // wmat array of concentrations // Int_t kmat; - gMC->Mixture(kmat, name, a, z, dens, nlmat, wmat); - (*fIdmate)[imat]=kmat; + //Build the string uniquename as "DET_mixturename" + TString uniquename = GetName(); + uniquename.Append("_"); + uniquename.Append(name); + //if geometry loaded from file only fill fIdmate, else create mixture too + if(AliSimulation::Instance()->IsGeometryFromFile()){ + TGeoMaterial *mat = gGeoManager->GetMaterial(uniquename.Data()); + kmat = mat->GetUniqueID(); + (*fIdmate)[imat]=kmat; + }else{ + if (fgDensityFactor != 1.0) + AliWarning(Form("Material density multiplied by %.2f!", fgDensityFactor)); + gMC->Mixture(kmat, uniquename.Data(), a, z, dens * fgDensityFactor, 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 @@ -320,15 +266,26 @@ void AliModule::AliMedium(Int_t numed, const char *name, Int_t nmat, // = 3 constant magnetic field along z // Int_t kmed; - gMC->Medium(kmed,name, (*fIdmate)[nmat], isvol, ifield, fieldm, - tmaxfd, stemax, deemax, epsil, stmin, ubuf, nbuf); - (*fIdtmed)[numed]=kmed; + //Build the string uniquename as "DET_mediumname" + TString uniquename = GetName(); + uniquename.Append("_"); + uniquename.Append(name); + //if geometry loaded from file only fill fIdtmed, else create medium too + if(AliSimulation::Instance()->IsGeometryFromFile()){ + TGeoMedium *med = gGeoManager->GetMedium(uniquename.Data()); + kmed = med->GetId(); + (*fIdtmed)[numed]=kmed; + }else{ + gMC->Medium(kmed, uniquename.Data(), (*fIdmate)[nmat], isvol, ifield, + fieldm, tmaxfd, stemax, deemax, epsil, stmin, ubuf, nbuf); + (*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. @@ -344,308 +301,92 @@ void AliModule::AliMatrix(Int_t &nmat, Float_t theta1, Float_t phi1, gMC->Matrix(nmat, theta1, phi1, theta2, phi2, theta3, phi3); } -//_____________________________________________________________________________ -AliModule& AliModule::operator=(const AliModule &mod) -{ - mod.Copy(*this); - return (*this); -} - -//_____________________________________________________________________________ +//_______________________________________________________________________ Float_t AliModule::ZMin() const { return -500; } -//_____________________________________________________________________________ +//_______________________________________________________________________ Float_t AliModule::ZMax() const { return 500; } -//_____________________________________________________________________________ -void AliModule::SetEuclidFile(char* material, char* geometry) +//_______________________________________________________________________ +void AliModule::AddAlignableVolumes() const { - // - // Sets the name of the Euclid file - // - fEuclidMaterial=material; - if(geometry) { - fEuclidGeometry=geometry; - } else { - char* name = new char[strlen(material)]; - strcpy(name,material); - strcpy(&name[strlen(name)-4],".euc"); - fEuclidGeometry=name; - delete [] name; - } + // + if (IsActive()) + AliWarning(Form(" %s still has to implement the AddAlignableVolumes method!",GetName())); +} + +//_______________________________________________________________________ + +AliLoader* AliModule::MakeLoader(const char* /*topfoldername*/) +{ + return 0x0; } + //_____________________________________________________________________________ -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 +AliTrackReference* AliModule::AddTrackReference(Int_t label, Int_t id){ // + // add a trackrefernce to the list + return (gAlice->GetMCApp()->AddTrackReference(label, id)); +} - 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; +//_____________________________________________________________________________ +TTree* AliModule::TreeTR() +{ // - // *** 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'; - // - 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 TR tree pointer // - return; - //* - L20: - Error("ReadEuclid","reading error or premature end of file\n"); + if ( fRunLoader == 0x0) + { + AliError("Can not get the run loader"); + return 0x0; + } + + TTree* tree = fRunLoader->TreeTR(); + return tree; } + //_____________________________________________________________________________ -void AliModule::ReadEuclidMedia(const char* filnam) +void AliModule::Digits2Raw() { - // - // 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;iGetDigitsFileName(), ios::in); + if (!digitsFile) return; + + digitsFile.seekg(0, ios::end); + UInt_t size = digitsFile.tellg(); + UInt_t ddlSize = 4 * (size / (4*nDDLs)); + Char_t* buffer = new Char_t[ddlSize+1]; + + for (Int_t iDDL = 0; iDDL < nDDLs; iDDL++) { + char fileName[20]; + strcpy(fileName,AliDAQ::DdlFileName(GetName(),iDDL)); + fstream rawFile(fileName, ios::out); + if (!rawFile) return; + + AliRawDataHeader header; + header.fSize = ddlSize + sizeof(header); + rawFile.write((char*) &header, sizeof(header)); + + digitsFile.read(buffer, ddlSize); + rawFile.write(buffer, ddlSize); + rawFile.close(); } - //* - if (strcmp(key,"END")) goto L10; - fclose (lun); - //* - //* commented out only for the not cernlib version - if(fDebug) printf("%s::ReadEuclidMedia: file %s is now read in\n", - ClassName(),filnam); - //* - return; - //* - L20: - Warning("ReadEuclidMedia","reading error or premature end of file\n"); -} - - + + digitsFile.close(); + delete[] buffer; +}