X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliRun.cxx;h=fd94a19fcfd6a1f727b4977b57ab0af5fdfafeec;hb=fecddb131e1a33cd3ae2db479e6ba4dcf78b9040;hp=ddd0042009a84c1046822f50dc86c2f52a0a037e;hpb=178a256c5111efa9ad0ade446e909ac3fe85bdb1;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliRun.cxx b/STEER/AliRun.cxx index ddd0042009a..fd94a19fcfd 100644 --- a/STEER/AliRun.cxx +++ b/STEER/AliRun.cxx @@ -40,11 +40,7 @@ // // /////////////////////////////////////////////////////////////////////////////// -#include #include -#include -#include -#include #include #include #include @@ -53,18 +49,15 @@ // #include "AliLog.h" #include "AliDetector.h" -#include "AliDisplay.h" #include "AliHeader.h" -#include "AliLego.h" -#include "AliLegoGenerator.h" #include "AliMC.h" -#include "AliMagFC.h" -#include "AliMagFCM.h" -#include "AliMagFDM.h" #include "AliPDG.h" #include "AliRun.h" #include "AliStack.h" +#include "AliCDBManager.h" #include "AliAlignObj.h" +#include "AliSimulation.h" +#include "AliLego.h" AliRun *gAlice; @@ -72,22 +65,19 @@ ClassImp(AliRun) //_______________________________________________________________________ AliRun::AliRun(): - fRun(0), +// fRun(-1), fEvent(0), - fEventNrInRun(0), - fEventsPerRun(0), + fEventNrInRun(-1), fModules(0), - fGeometry(0), fMCApp(0), - fDisplay(0), - fField(0), fNdets(0), - fInitDone(kFALSE), - fLego(0), - fPDGDB(0), //Particle factory object - fConfigFunction("\0"), + fConfigFunction(""), fRandom(0), + fBaseFileName(""), fIsRootGeometry(kFALSE), + fGeometryFromCDB(kFALSE), + fGeometryFileName(""), + fTriggerDescriptor(""), fRunLoader(0x0) { // @@ -95,54 +85,24 @@ AliRun::AliRun(): // AliConfig::Instance();//skowron 29 Feb 2002 //ensures that the folder structure is build -} -//_______________________________________________________________________ -AliRun::AliRun(const AliRun& arun): - TNamed(arun), - fRun(0), - fEvent(0), - fEventNrInRun(0), - fEventsPerRun(0), - fModules(0), - fGeometry(0), - fMCApp(0), - fDisplay(0), - fField(0), - fNdets(0), - fInitDone(kFALSE), - fLego(0), - fPDGDB(0), //Particle factory object - fConfigFunction("\0"), - fRandom(0), - fIsRootGeometry(kFALSE), - fRunLoader(0x0) -{ - // - // Copy constructor for AliRun - // - arun.Copy(*this); } //_____________________________________________________________________________ AliRun::AliRun(const char *name, const char *title): TNamed(name,title), - fRun(0), fEvent(0), - fEventNrInRun(0), - fEventsPerRun(0), + fEventNrInRun(-1), fModules(new TObjArray(77)), // Support list for the Detectors - fGeometry(0), - fMCApp(0), - fDisplay(0), - fField(0), + fMCApp(new AliMC(GetName(),GetTitle())), fNdets(0), - fInitDone(kFALSE), - fLego(0), - fPDGDB(TDatabasePDG::Instance()), //Particle factory object! fConfigFunction("Config();"), fRandom(new TRandom3()), + fBaseFileName(""), fIsRootGeometry(kFALSE), + fGeometryFromCDB(kFALSE), + fGeometryFileName(""), + fTriggerDescriptor(""), fRunLoader(0x0) { // @@ -163,15 +123,7 @@ AliRun::AliRun(const char *name, const char *title): // Add to list of browsable gROOT->GetListOfBrowsables()->Add(this,name); - // Create the TNode geometry for the event display - BuildSimpleGeometry(); - // Create default mag field - SetField(); - - // Add particle list to configuration - AliConfig::Instance()->Add(fPDGDB); - } @@ -194,114 +146,38 @@ AliRun::~AliRun() modfold->Remove(mod); } } - - - delete fField; + delete fMCApp; delete gMC; gMC=0; - delete fGeometry; - delete fDisplay; - delete fLego; if (fModules) { fModules->Delete(); delete fModules; } - delete fPDGDB; } -//_______________________________________________________________________ -void AliRun::Copy(TObject &) const -{ - AliFatal("Not implemented!"); -} - -//_______________________________________________________________________ -void AliRun::Build() -{ - // - // Initialize Alice geometry - // Dummy routine - // -} - -//_______________________________________________________________________ -void AliRun::BuildSimpleGeometry() -{ - // - // Create a simple TNode geometry used by Root display engine - // - // Initialise geometry - // - fGeometry = new TGeometry("AliceGeom","Galice Geometry for Hits"); - new TMaterial("void","Vacuum",0,0,0); //Everything is void - TBRIK *brik = new TBRIK("S_alice","alice volume","void",2000,2000,3000); - brik->SetVisibility(0); - new TNode("alice","alice","S_alice"); -} - -//_______________________________________________________________________ -void AliRun::CleanDetectors() -{ - // - // Clean Detectors at the end of event - // - fRunLoader->CleanDetectors(); -} - -//_______________________________________________________________________ -void AliRun::ResetHits() -{ - fMCApp->ResetHits(); -} - -//_______________________________________________________________________ -AliGenerator* AliRun::Generator() const -{ - return fMCApp->Generator(); -} - -//_______________________________________________________________________ -void AliRun::SetField(AliMagF* magField) -{ - // - // Set Magnetic Field Map - // - fField = magField; - fField->ReadField(); -} //_______________________________________________________________________ void AliRun::SetRootGeometry(Bool_t flag) { // Instruct application that the geometry is to be retreived from a root file. fIsRootGeometry = flag; - if (flag) gMC->SetRootGeometry(); + if (flag && gMC) gMC->SetRootGeometry(); } + //_______________________________________________________________________ -void AliRun::SetField(Int_t type, Int_t version, Float_t scale, - Float_t maxField, const char* filename) +void AliRun::SetGeometryFromCDB() { - // - // Set magnetic field parameters - // type Magnetic field transport flag 0=no field, 2=helix, 3=Runge Kutta - // version Magnetic field map version (only 1 active now) - // scale Scale factor for the magnetic field - // maxField Maximum value for the magnetic field - - // - // --- Sanity check on mag field flags - if(fField) delete fField; - if(version==1) { - fField = new AliMagFC("Map1"," ",type,scale,maxField); - } else if(version<=2) { - fField = new AliMagFCM("Map2-3",filename,type,scale,maxField); - fField->ReadField(); - } else if(version==3) { - fField = new AliMagFDM("Map4",filename,type,scale,maxField); - fField->ReadField(); - } else { - AliWarning(Form("Invalid map %d",version)); + // Set the loading of geometry from cdb instead of creating it + // A default CDB storage needs to be set before this method is called + if(AliCDBManager::Instance()->IsDefaultStorageSet() && + AliCDBManager::Instance()->GetRun() >= 0){ + SetRootGeometry(); + fGeometryFromCDB = kTRUE; + }else{ + AliError("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); + AliError("Loading of geometry from CDB ignored. First set a default CDB storage!"); + AliError("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } } @@ -325,45 +201,6 @@ void AliRun::InitLoaders() } AliDebug(1, "Done"); } -//_____________________________________________________________________________ - -void AliRun::FinishRun() -{ - // - // Called at the end of the run. - // - - if(fLego) - { - AliDebug(1, "Finish Lego"); - fRunLoader->CdGAFile(); - fLego->FinishRun(); - } - - // Clean detector information - TIter next(fModules); - AliModule *detector; - while((detector = dynamic_cast(next()))) { - AliDebug(2, Form("%s->FinishRun()", detector->GetName())); - detector->FinishRun(); - } - - AliDebug(1, "fRunLoader->WriteHeader(OVERWRITE)"); - fRunLoader->WriteHeader("OVERWRITE"); - - // Write AliRun info and all detectors parameters - fRunLoader->CdGAFile(); - Write(0,TObject::kOverwrite);//write AliRun - fRunLoader->Write(0,TObject::kOverwrite);//write RunLoader itself - - // Clean tree information - AliDebug(1, "fRunLoader->Stack()->FinishRun()"); - fRunLoader->Stack()->FinishRun(); - - if(fMCApp) fMCApp->FinishRun(); - - fRunLoader->Synchronize(); -} //_______________________________________________________________________ void AliRun::Announce() const @@ -379,7 +216,7 @@ void AliRun::Announce() const printf(" You are running AliRoot version NewIO\n"); printf("%6s","*"); - printf(" The cvs tag for the current program is $Name$\n"); + printf(" The SVN version for the current program is $Id$\n"); printf("%6s","*");printf("%64s","*\n"); printf("%70s", @@ -434,14 +271,14 @@ Int_t AliRun::GetEvent(Int_t event) // Reset existing structures fMCApp->ResetHits(); fMCApp->ResetTrackReferences(); - ResetDigits(); - ResetSDigits(); + fMCApp->ResetDigits(); + fMCApp->ResetSDigits(); /*****************************************/ /**** R E L O A D ****/ /*****************************************/ - fRunLoader->GetEvent(event); + AliRunLoader::Instance()->GetEvent(event); /*****************************************/ /**** P O S T R E L O A D I N G ****/ @@ -449,42 +286,13 @@ Int_t AliRun::GetEvent(Int_t event) // Set Trees branch addresses TIter next(fModules); - AliModule *detector; - while((detector = dynamic_cast(next()))) + AliDetector *detector; + while((detector = dynamic_cast(next()))) { detector->SetTreeAddress(); } - return fRunLoader->GetHeader()->GetNtrack(); -} - -//_______________________________________________________________________ -TGeometry *AliRun::GetGeometry() -{ - // - // Import Alice geometry from current file - // Return pointer to geometry object - // - if (!fGeometry) fGeometry = dynamic_cast(gDirectory->Get("AliceGeom")); - // - // Unlink and relink nodes in detectors - // This is bad and there must be a better way... - // - - TIter next(fModules); - AliModule *detector; - while((detector = dynamic_cast(next()))) { - TList *dnodes=detector->Nodes(); - Int_t j; - TNode *node, *node1; - for ( j=0; jGetSize(); j++) { - node = dynamic_cast(dnodes->At(j)); - node1 = fGeometry->GetNode(node->GetName()); - dnodes->Remove(node); - dnodes->AddAt(node1,j); - } - } - return fGeometry; + return AliRunLoader::Instance()->GetHeader()->GetNtrack(); } //_______________________________________________________________________ @@ -493,158 +301,14 @@ void AliRun::SetBaseFile(const char *filename) fBaseFileName = filename; } -//_______________________________________________________________________ -void AliRun::ResetDigits() -{ - // - // Reset all Detectors digits - // - TIter next(fModules); - AliModule *detector; - while((detector = dynamic_cast(next()))) { - detector->ResetDigits(); - } -} //_______________________________________________________________________ -void AliRun::ResetSDigits() -{ - // - // Reset all Detectors digits - // - TIter next(fModules); - AliModule *detector; - while((detector = dynamic_cast(next()))) { - detector->ResetSDigits(); - } -} - - -//_______________________________________________________________________ - -void AliRun::ResetPoints() -{ - // - // Reset all Detectors points - // - TIter next(fModules); - AliModule *detector; - while((detector = dynamic_cast(next()))) { - detector->ResetPoints(); - } -} -//_______________________________________________________________________ - -void AliRun::InitMC(const char *setup) -{ - // - // Initialize ALICE Simulation run - // - Announce(); - - if(fInitDone) { - AliWarning("Cannot initialise AliRun twice!"); - return; - } - - if (!fMCApp) - fMCApp=new AliMC(GetName(),GetTitle()); - - gROOT->LoadMacro(setup); - gInterpreter->ProcessLine(fConfigFunction.Data()); - - fRunLoader->CdGAFile(); - - AliPDG::AddParticlesToPdgDataBase(); - - fNdets = fModules->GetLast()+1; - - TIter next(fModules); - for(Int_t i=0; i(fModules->At(i)); - objlast = gDirectory->GetList()->Last(); - - // Add Detector histograms in Detector list of histograms - if (objlast) objfirst = gDirectory->GetList()->After(objlast); - else objfirst = gDirectory->GetList()->First(); - while (objfirst) - { - detector->Histograms()->Add(objfirst); - objfirst = gDirectory->GetList()->After(objfirst); - } - } - - fMCApp->Init(); - - //Must be here because some MCs (G4) adds detectors here and not in Config.C - InitLoaders(); - fRunLoader->MakeTree("E"); - if (fLego == 0x0) - { - fRunLoader->LoadKinematics("RECREATE"); - fRunLoader->LoadTrackRefs("RECREATE"); - fRunLoader->LoadHits("all","RECREATE"); - } - fInitDone = kTRUE; - // - // Save stuff at the beginning of the file to avoid file corruption - fRunLoader->CdGAFile(); - Write(); - fEventNrInRun = -1; //important - we start Begin event from increasing current number in run -} - -//_______________________________________________________________________ - -void AliRun::RunMC(Int_t nevent, const char *setup) -{ - // - // Main function to be called to process a galice run - // example - // Root > gAlice.Run(); - // a positive number of events will cause the finish routine - // to be called - // - fEventsPerRun = nevent; - // check if initialisation has been done - if (!fInitDone) InitMC(setup); - - // Create the Root Tree with one branch per detector - //Hits moved to begin event -> now we are crating separate tree for each event - - gMC->ProcessRun(nevent); - - // End of this run, close files - if(nevent>0) FinishRun(); -} - -//_______________________________________________________________________ -void AliRun::RunReco(const char *selected, Int_t first, Int_t last) -{ - // - // Main function to be called to reconstruct Alice event - // - Int_t nev = fRunLoader->GetNumberOfEvents(); - AliDebug(1, Form("Found %d events", nev)); - Int_t nFirst = first; - Int_t nLast = (last < 0)? nev : last; - - for (Int_t nevent = nFirst; nevent <= nLast; nevent++) { - AliDebug(1, Form("Processing event %d", nevent)); - GetEvent(nevent); - Digits2Reco(selected); - } -} - -//_______________________________________________________________________ - void AliRun::Hits2Digits(const char *selected) { // Convert Hits to sumable digits // - for (Int_t nevent=0; neventTreeE()->GetEntries(); nevent++) { + for (Int_t nevent=0; neventTreeE()->GetEntries(); nevent++) { GetEvent(nevent); Hits2SDigits(selected); SDigits2Digits(selected); @@ -725,124 +389,6 @@ void AliRun::Tree2Tree(Option_t *option, const char *selected) } } -//_______________________________________________________________________ -void AliRun::RunLego(const char *setup, Int_t nc1, Float_t c1min, - Float_t c1max,Int_t nc2,Float_t c2min,Float_t c2max, - Float_t rmin,Float_t rmax,Float_t zmax, AliLegoGenerator* gener) -{ - // - // Generates lego plots of: - // - radiation length map phi vs theta - // - radiation length map phi vs eta - // - interaction length map - // - g/cm2 length map - // - // ntheta bins in theta, eta - // themin minimum angle in theta (degrees) - // themax maximum angle in theta (degrees) - // nphi bins in phi - // phimin minimum angle in phi (degrees) - // phimax maximum angle in phi (degrees) - // rmin minimum radius - // rmax maximum radius - // - // - // The number of events generated = ntheta*nphi - // run input parameters in macro setup (default="Config.C") - // - // Use macro "lego.C" to visualize the 3 lego plots in spherical coordinates - //Begin_Html - /* - - */ - //End_Html - //Begin_Html - /* - - */ - //End_Html - //Begin_Html - /* - - */ - //End_Html - // - - // check if initialisation has been done - // If runloader has been initialized, set the number of events per file to nc1 * nc2 - - // Set new generator - if (!gener) gener = new AliLegoGenerator(); - // - // Configure Generator - gener->SetRadiusRange(rmin, rmax); - gener->SetZMax(zmax); - gener->SetCoor1Range(nc1, c1min, c1max); - gener->SetCoor2Range(nc2, c2min, c2max); - - - //Create Lego object - fLego = new AliLego("lego",gener); - - if (!fInitDone) InitMC(setup); - //Save current generator - - AliGenerator *gen=fMCApp->Generator(); - fMCApp->ResetGenerator(gener); - //Prepare MC for Lego Run - gMC->InitLego(); - - //Run Lego Object - - if (fRunLoader) fRunLoader->SetNumberOfEventsPerFile(nc1 * nc2); - //gMC->ProcessRun(nc1*nc2+1); - gMC->ProcessRun(nc1*nc2); - - // End of this run, close files - FinishRun(); - // Restore current generator - fMCApp->ResetGenerator(gen); - // Delete Lego Object - delete fLego; fLego=0; -} - -//_______________________________________________________________________ -void AliRun::SetConfigFunction(const char * config) -{ - // - // Set the signature of the function contained in Config.C to configure - // the run - // - fConfigFunction=config; -} - -// -// MC Application -// - -//_______________________________________________________________________ -void AliRun::Field(const Double_t* x, Double_t *b) const -{ - // - // Return the value of the magnetic field - // - Float_t xfloat[3]; - for (Int_t i=0; i<3; i++) xfloat[i] = x[i]; - - if (Field()) { - Float_t bfloat[3]; - Field()->Field(xfloat,bfloat); - for (Int_t j=0; j<3; j++) b[j] = bfloat[j]; - } - else { - AliError("No mag field defined!"); - b[0]=b[1]=b[2]=0.; - } -} - -// -// End of MC Application -// //_______________________________________________________________________ void AliRun::Streamer(TBuffer &R__b) @@ -863,8 +409,10 @@ void AliRun::Streamer(TBuffer &R__b) void AliRun::SetGenEventHeader(AliGenEventHeader* header) { - fRunLoader->GetHeader()->SetGenEventHeader(header); + AliRunLoader::Instance()->GetHeader()->SetGenEventHeader(header); } + + //_______________________________________________________________________ Int_t AliRun::GetEvNumber() const @@ -947,41 +495,3 @@ void AliRun::AddModule(AliModule* mod) fNdets++; } -// added by Alberto Colla -//_____________________________________________________________________________ -/*inline*/ Bool_t AliRun::IsFileAccessible(const char* fnam, EAccessMode mode) -{ return !gSystem->AccessPathName(fnam,mode);} - -//______________________________________________________ -/*inline*/ Bool_t AliRun::IsFileAccessible(Char_t* name,EAccessMode mode) -{ - TString str = name; gSystem->ExpandPathName(str); - return !gSystem->AccessPathName(str.Data(),mode); -} - -//_____________________________________________________________________________ -Bool_t AliRun::ApplyAlignObjsToGeom(TClonesArray* AlObjArray) -{ - // Read collection of alignment objects (AliAlignObj derived) saved - // in the TClonesArray ClArrayName and apply them to the geometry - // manager singleton. - // - Int_t nvols = AlObjArray->GetEntriesFast(); - - for(Int_t j=0; jUncheckedAt(j); - if (alobj->ApplyToGeometry() == kFALSE) - return kFALSE; - } - - gGeoManager->CheckOverlaps(50); - TObjArray* ovexlist = gGeoManager->GetListOfOverlaps(); - if(ovexlist->GetEntriesFast()){ - AliErrorClass("The application of alignment objects to the geometry caused huge overlaps/extrusions!"); - } - - return kTRUE; - -} -