X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliRun.cxx;h=9a88b014bd3f9d181b8afa9a5f9715eea62a2779;hb=f5bc14853de66388dae5300a43f945c59eece4ba;hp=7ad2eda22fd4be5a6faf06187d8674389332bd24;hpb=fa85c972d286bd652f7dd308e22338edd65427dd;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliRun.cxx b/STEER/AliRun.cxx index 7ad2eda22fd..9a88b014bd3 100644 --- a/STEER/AliRun.cxx +++ b/STEER/AliRun.cxx @@ -13,175 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.74 2001/07/28 10:39:16 morsch -GetEventsPerRun() method needed by afterburners added to AliRun.h -Corresponding setters and getters have been from AliGenerator. - -Revision 1.73 2001/07/27 12:34:30 jchudoba -remove the dummy argument in fStack->GetEvent call - -Revision 1.72 2001/07/03 08:10:57 hristov -J.Chudoba's changes merged correctly with the HEAD - -Revision 1.70 2001/06/29 08:01:36 morsch -Small correction to the previous. - -Revision 1.69 2001/06/28 16:27:50 morsch -AliReco() with user control of event range. - -Revision 1.68 2001/06/11 13:14:40 morsch -SetAliGenEventHeader() method added. - -Revision 1.67 2001/06/07 18:24:50 buncic -Removed compilation warning in AliConfig initialisation. - -Revision 1.66 2001/05/22 14:32:40 hristov -Weird inline removed - -Revision 1.65 2001/05/21 17:22:51 buncic -Fixed problem with missing AliConfig while reading galice.root - -Revision 1.64 2001/05/16 14:57:22 alibrary -New files for folders and Stack - -Revision 1.62 2001/04/06 11:12:33 morsch -Clear fParticles after each event. (Ivana Hrivnacova) - -Revision 1.61 2001/03/30 07:04:10 morsch -Call fGenerator->FinishRun() for final print-outs, cross-section and weight calculations. - -Revision 1.60 2001/03/21 18:22:30 hristov -fParticleFileMap fix (I.Hrivnacova) - -Revision 1.59 2001/03/12 17:47:03 hristov -Changes needed on Sun with CC 5.0 - -Revision 1.58 2001/03/09 14:27:26 morsch -Fix for multiple events per file: inhibit decrease of size of fParticleFileMap. - -Revision 1.57 2001/02/23 17:40:23 buncic -All trees needed for simulation created in RunMC(). TreeR and its branches -are now created in new RunReco() method. - -Revision 1.56 2001/02/14 15:45:20 hristov -Algorithmic way of getting entry index in fParticleMap. Protection of fParticleFileMap (I.Hrivnacova) - -Revision 1.55 2001/02/12 15:52:54 buncic -Removed OpenBaseFile(). - -Revision 1.54 2001/02/07 10:39:05 hristov -Remove default value for argument - -Revision 1.53 2001/02/06 11:02:26 hristov -New SetTrack interface added, added check for unfilled particles in FinishEvent (I.Hrivnacova) - -Revision 1.52 2001/02/05 16:22:25 buncic -Added TreeS to GetEvent(). - -Revision 1.51 2001/02/02 15:16:20 morsch -SetHighWaterMark method added to mark last particle in event. - -Revision 1.50 2001/01/27 10:32:00 hristov -Leave the loop when primaries are filled (I.Hrivnacova) - -Revision 1.49 2001/01/26 19:58:48 hristov -Major upgrade of AliRoot code - -Revision 1.48 2001/01/17 10:50:50 hristov -Corrections to destructors - -Revision 1.47 2000/12/18 10:44:01 morsch -Possibility to set field map by passing pointer to objet of type AliMagF via -SetField(). -Example: -gAlice->SetField(new AliMagFCM("Map2", "$(ALICE_ROOT)/data/field01.dat",2,1.,10.)); - -Revision 1.46 2000/12/14 19:29:27 fca -galice.cuts was not read any more - -Revision 1.45 2000/11/30 07:12:49 alibrary -Introducing new Rndm and QA classes - -Revision 1.44 2000/10/26 13:58:59 morsch -Add possibility to choose the lego generator (of type AliGeneratorLego or derived) when running -RunLego(). Default is the base class AliGeneratorLego. - -Revision 1.43 2000/10/09 09:43:17 fca -Special remapping of hits for TPC and TRD. End-of-primary action introduced - -Revision 1.42 2000/10/02 21:28:14 fca -Removal of useless dependecies via forward declarations - -Revision 1.41 2000/07/13 16:19:09 fca -Mainly coding conventions + some small bug fixes - -Revision 1.40 2000/07/12 08:56:25 fca -Coding convention correction and warning removal - -Revision 1.39 2000/07/11 18:24:59 fca -Coding convention corrections + few minor bug fixes - -Revision 1.38 2000/06/20 13:05:45 fca -Writing down the TREE headers before job starts - -Revision 1.37 2000/06/09 20:05:11 morsch -Introduce possibility to chose magnetic field version 3: AliMagFDM + field02.dat - -Revision 1.36 2000/06/08 14:03:58 hristov -Only one initializer for a default argument - -Revision 1.35 2000/06/07 10:13:14 hristov -Delete only existent objects. - -Revision 1.34 2000/05/18 10:45:38 fca -Delete Particle Factory properly - -Revision 1.33 2000/05/16 13:10:40 fca -New method IsNewTrack and fix for a problem in Father-Daughter relations - -Revision 1.32 2000/04/27 10:38:21 fca -Correct termination of Lego Run and introduce Lego getter in AliRun - -Revision 1.31 2000/04/26 10:17:32 fca -Changes in Lego for G4 compatibility - -Revision 1.30 2000/04/18 19:11:40 fca -Introduce variable Config.C function signature - -Revision 1.29 2000/04/07 11:12:34 fca -G4 compatibility changes - -Revision 1.28 2000/04/05 06:51:06 fca -Workaround for an HP compiler problem - -Revision 1.27 2000/03/22 18:08:07 fca -Rationalisation of the virtual MC interfaces - -Revision 1.26 2000/03/22 13:42:26 fca -SetGenerator does not replace an existing generator, ResetGenerator does - -Revision 1.25 2000/02/23 16:25:22 fca -AliVMC and AliGeant3 classes introduced -ReadEuclid moved from AliRun to AliModule - -Revision 1.24 2000/01/19 17:17:20 fca -Introducing a list of lists of hits -- more hits allowed for detector now - -Revision 1.23 1999/12/03 11:14:31 fca -Fixing previous wrong checking - -Revision 1.21 1999/11/25 10:40:08 fca -Fixing daughters information also in primary tracks - -Revision 1.20 1999/10/04 18:08:49 fca -Adding protection against inconsistent Euclid files - -Revision 1.19 1999/09/29 07:50:40 fca -Introduction of the Copyright and cvs Log - -*/ +/* $Id$ */ /////////////////////////////////////////////////////////////////////////////// // // @@ -208,89 +40,190 @@ Introduction of the Copyright and cvs Log // // /////////////////////////////////////////////////////////////////////////////// -#include #include +#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - +#include "Riostream.h" +#include "TBRIK.h" +#include "TBrowser.h" +#include "TCint.h" +#include "TFile.h" +#include "TFolder.h" +#include "TGeometry.h" +#include "TNode.h" #include "TParticle.h" -#include "AliRun.h" +#include "TRandom3.h" +#include "TROOT.h" +#include "TSystem.h" +#include "TTree.h" + +#include "AliConfig.h" +#include "AliDetector.h" #include "AliDisplay.h" -#include "AliMC.h" +#include "AliGenerator.h" +#include "AliHeader.h" #include "AliLego.h" +#include "AliLegoGenerator.h" +#include "AliMCQA.h" #include "AliMagFC.h" #include "AliMagFCM.h" #include "AliMagFDM.h" -#include "AliHit.h" -#include "TRandom3.h" -#include "AliMCQA.h" -#include "AliGenerator.h" -#include "AliLegoGenerator.h" -#include "AliConfig.h" +#include "AliPDG.h" +#include "AliRun.h" #include "AliStack.h" -#include "AliGenEventHeader.h" -#include "AliHeader.h" - -#include "AliDetector.h" AliRun *gAlice; ClassImp(AliRun) -//_____________________________________________________________________________ -AliRun::AliRun() +//_______________________________________________________________________ +AliRun::AliRun(): + fRun(0), + fEvent(0), + fEventNrInRun(0), + fEventsPerRun(0), + fDebug(0), + fHeader(0), + fTreeD(0), + fTreeS(0), + fTreeH(0), + fTreeTR(0), + fTreeE(0), + fTreeR(0), + fModules(0), + fGeometry(0), + fDisplay(0), + fTimer(), + fField(0), + fMC(0), + fImedia(0), + fNdets(0), + fTrRmax(1.e10), + fTrZmax(1.e10), + fGenerator(0), + fInitDone(kFALSE), + fLego(0), + fPDGDB(0), //Particle factory object + fHitLists(0), + fEventEnergy(0), + fSummEnergy(0), + fSum2Energy(0), + fConfigFunction("\0"), + fRandom(0), + fMCQA(0), + fTransParName("\0"), + fBaseFileName("\0"), + fStack(0), + fTreeDFileName(""), + fTreeDFile(0), + fTreeSFileName(""), + fTreeSFile(0), + fTreeRFileName(""), + fTreeRFile(0) { // // Default constructor for AliRun // - fHeader = 0; - fRun = 0; - fEvent = 0; - fStack = 0; - fModules = 0; - fGenerator = 0; - fTreeD = 0; - fTreeH = 0; - fTreeE = 0; - fTreeR = 0; - fTreeS = 0; - fGeometry = 0; - fDisplay = 0; - fField = 0; - fMC = 0; - fNdets = 0; - fImedia = 0; - fTrRmax = 1.e10; - fTrZmax = 1.e10; - fInitDone = kFALSE; - fLego = 0; - fPDGDB = 0; //Particle factory object! - fHitLists = 0; - fConfigFunction = "\0"; - fRandom = 0; - fMCQA = 0; - fTransParName = "\0"; - fBaseFileName = ".\0"; - fDebug = 0; +} + +//_______________________________________________________________________ +AliRun::AliRun(const AliRun& arun): + TVirtualMCApplication(arun), + fRun(0), + fEvent(0), + fEventNrInRun(0), + fEventsPerRun(0), + fDebug(0), + fHeader(0), + fTreeD(0), + fTreeS(0), + fTreeH(0), + fTreeTR(0), + fTreeE(0), + fTreeR(0), + fModules(0), + fGeometry(0), + fDisplay(0), + fTimer(), + fField(0), + fMC(0), + fImedia(0), + fNdets(0), + fTrRmax(1.e10), + fTrZmax(1.e10), + fGenerator(0), + fInitDone(kFALSE), + fLego(0), + fPDGDB(0), //Particle factory object + fHitLists(0), + fEventEnergy(0), + fSummEnergy(0), + fSum2Energy(0), + fConfigFunction("\0"), + fRandom(0), + fMCQA(0), + fTransParName("\0"), + fBaseFileName("\0"), + fStack(0), + fTreeDFileName(""), + fTreeDFile(0), + fTreeSFileName(""), + fTreeSFile(0), + fTreeRFileName(""), + fTreeRFile(0) +{ + // + // Copy constructor for AliRun + // + arun.Copy(*this); } //_____________________________________________________________________________ -AliRun::AliRun(const char *name, const char *title) - : TNamed(name,title) +AliRun::AliRun(const char *name, const char *title): + TVirtualMCApplication(name,title), + fRun(0), + fEvent(0), + fEventNrInRun(0), + fEventsPerRun(0), + fDebug(0), + fHeader(new AliHeader()), + fTreeD(0), + fTreeS(0), + fTreeH(0), + fTreeTR(0), + fTreeE(0), + fTreeR(0), + fModules(new TObjArray(77)), // Support list for the Detectors + fGeometry(0), + fDisplay(0), + fTimer(), + fField(0), + fMC(gMC), + fImedia(new TArrayI(1000)), + fNdets(0), + fTrRmax(1.e10), + fTrZmax(1.e10), + fGenerator(0), + fInitDone(kFALSE), + fLego(0), + fPDGDB(TDatabasePDG::Instance()), //Particle factory object! + fHitLists(new TList()), // Create HitLists list + fEventEnergy(0), + fSummEnergy(0), + fSum2Energy(0), + fConfigFunction("Config();"), + fRandom(new TRandom3()), + fMCQA(0), + fTransParName("\0"), + fBaseFileName("\0"), + fStack(new AliStack(10000)), //Particle stack + fTreeDFileName(""), + fTreeDFile(0), + fTreeSFileName(""), + fTreeSFile(0), + fTreeRFileName(""), + fTreeRFile(0) { // // Constructor for the main processor. @@ -298,85 +231,55 @@ AliRun::AliRun(const char *name, const char *title) // Creates the list of Detectors. // Creates the list of particles. // - Int_t i; - + gAlice = this; - fTreeD = 0; - fTreeH = 0; - fTreeE = 0; - fTreeR = 0; - fTreeS = 0; - fTrRmax = 1.e10; - fTrZmax = 1.e10; - fGenerator = 0; - fInitDone = kFALSE; - fLego = 0; - fField = 0; - fConfigFunction = "Config();"; // Set random number generator - gRandom = fRandom = new TRandom3(); + gRandom = fRandom; if (gSystem->Getenv("CONFIG_SEED")) { - gRandom->SetSeed((UInt_t)atoi(gSystem->Getenv("CONFIG_SEED"))); + gRandom->SetSeed(static_cast(atoi(gSystem->Getenv("CONFIG_SEED")))); } - + + // Add to list of browsable gROOT->GetListOfBrowsables()->Add(this,name); - // - // Particle stack - fStack = new AliStack(10000); - // create the support list for the various Detectors - fModules = new TObjArray(77); - // + // Create the TNode geometry for the event display - BuildSimpleGeometry(); - fHeader = new AliHeader(); - fRun = 0; - fEvent = 0; - // - fDisplay = 0; - // // Create default mag field SetField(); - // - fMC = gMC; - // + // Prepare the tracking medium lists - fImedia = new TArrayI(1000); - for(i=0;i<1000;i++) (*fImedia)[i]=-99; - // - // Make particles - fPDGDB = TDatabasePDG::Instance(); //Particle factory object! + for(Int_t i=0;i<1000;i++) (*fImedia)[i]=-99; + // Add particle list to configuration AliConfig::Instance()->Add(fPDGDB); - // - // Create HitLists list - fHitLists = new TList(); - // + + // Set transport parameters SetTransPar(); - fBaseFileName = ".\0"; - // - fDebug = 0; } -//_____________________________________________________________________________ +//_______________________________________________________________________ AliRun::~AliRun() { // // Default AliRun destructor // + TFile *curfil =0; + if(fTreeE)curfil=fTreeE->GetCurrentFile(); delete fImedia; delete fField; - delete fMC; + // delete fMC; + delete gMC; gMC=0; delete fGeometry; delete fDisplay; delete fGenerator; delete fLego; delete fTreeD; delete fTreeH; + delete fTreeTR; delete fTreeE; delete fTreeR; delete fTreeS; @@ -389,29 +292,62 @@ AliRun::~AliRun() delete fPDGDB; delete fMCQA; delete fHeader; + // avoid to delete TFile objects not owned by this object + // avoid multiple deletions + if(curfil == fTreeDFile) fTreeDFile=0; + if(curfil == fTreeSFile) fTreeSFile=0; + if(curfil == fTreeRFile) fTreeRFile=0; + if(fTreeSFile == fTreeDFile) fTreeSFile=0; + if(fTreeRFile == fTreeDFile) fTreeRFile=0; + if(fTreeRFile == fTreeSFile) fTreeRFile=0; + if(fTreeDFile){ + if(fTreeDFile->IsOpen())fTreeDFile->Close(); + delete fTreeDFile; + } + if(fTreeSFile){ + if(fTreeSFile->IsOpen())fTreeSFile->Close(); + delete fTreeSFile; + } + if(fTreeRFile){ + if(fTreeRFile->IsOpen())fTreeRFile->Close(); + delete fTreeRFile; + } + if (gROOT->GetListOfBrowsables()) + gROOT->GetListOfBrowsables()->Remove(this); + + gAlice=0; } -//_____________________________________________________________________________ +//_______________________________________________________________________ +void AliRun::Copy(AliRun &) const +{ + // + // Copy method ... not implemented + // + Fatal("Copy","Not implemented!\n"); +} + +//_______________________________________________________________________ void AliRun::AddHit(Int_t id, Int_t track, Int_t *vol, Float_t *hits) const { // // Add a hit to detector id // TObjArray &dets = *fModules; - if(dets[id]) ((AliModule*) dets[id])->AddHit(track,vol,hits); + if(dets[id]) dynamic_cast(dets[id])->AddHit(track,vol,hits); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::AddDigit(Int_t id, Int_t *tracks, Int_t *digits) const { // // Add digit to detector id // TObjArray &dets = *fModules; - if(dets[id]) ((AliModule*) dets[id])->AddDigit(tracks,digits); + if(dets[id]) dynamic_cast(dets[id])->AddDigit(tracks,digits); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::Browse(TBrowser *b) { // @@ -424,6 +360,7 @@ void AliRun::Browse(TBrowser *b) if (pTreeK) b->Add(pTreeK,pTreeK->GetName()); if (fTreeH) b->Add(fTreeH,fTreeH->GetName()); + if (fTreeTR) b->Add(fTreeTR,fTreeH->GetName()); if (fTreeD) b->Add(fTreeD,fTreeD->GetName()); if (fTreeE) b->Add(fTreeE,fTreeE->GetName()); if (fTreeR) b->Add(fTreeR,fTreeR->GetName()); @@ -431,13 +368,13 @@ void AliRun::Browse(TBrowser *b) TIter next(fModules); AliModule *detector; - while((detector = (AliModule*)next())) { + while((detector = dynamic_cast(next()))) { b->Add(detector,detector->GetName()); } b->Add(fMCQA,"AliMCQA"); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::Build() { // @@ -446,7 +383,7 @@ void AliRun::Build() // } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::BuildSimpleGeometry() { // @@ -461,7 +398,7 @@ void AliRun::BuildSimpleGeometry() new TNode("alice","alice","S_alice"); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::CleanDetectors() { // @@ -469,13 +406,13 @@ void AliRun::CleanDetectors() // TIter next(fModules); AliModule *detector; - while((detector = (AliModule*)next())) { + while((detector = dynamic_cast(next()))) { detector->FinishEvent(); } } -//_____________________________________________________________________________ -Int_t AliRun::DistancetoPrimitive(Int_t, Int_t) +//_______________________________________________________________________ +Int_t AliRun::DistancetoPrimitive(Int_t, Int_t) const { // // Return the distance from the mouse to the AliRun object @@ -484,7 +421,7 @@ Int_t AliRun::DistancetoPrimitive(Int_t, Int_t) return 9999; } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::DumpPart (Int_t i) const { // @@ -493,7 +430,7 @@ void AliRun::DumpPart (Int_t i) const fStack->DumpPart(i); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::DumpPStack () const { // @@ -502,7 +439,7 @@ void AliRun::DumpPStack () const fStack->DumpPStack(); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::SetField(AliMagF* magField) { // Set Magnetic Field Map @@ -510,7 +447,7 @@ void AliRun::SetField(AliMagF* magField) fField->ReadField(); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::SetField(Int_t type, Int_t version, Float_t scale, Float_t maxField, char* filename) { @@ -537,113 +474,7 @@ void AliRun::SetField(Int_t type, Int_t version, Float_t scale, } } -//_____________________________________________________________________________ -void AliRun::PreTrack() -{ - TObjArray &dets = *fModules; - AliModule *module; - - for(Int_t i=0; i<=fNdets; i++) - if((module = (AliModule*)dets[i])) - module->PreTrack(); - - fMCQA->PreTrack(); -} - -//_____________________________________________________________________________ -void AliRun::PostTrack() -{ - TObjArray &dets = *fModules; - AliModule *module; - - for(Int_t i=0; i<=fNdets; i++) - if((module = (AliModule*)dets[i])) - module->PostTrack(); -} - -//_____________________________________________________________________________ -void AliRun::FinishPrimary() -{ - // - // Called at the end of each primary track - // - - // static Int_t count=0; - // const Int_t times=10; - // This primary is finished, purify stack - fStack->PurifyKine(); - - TIter next(fModules); - AliModule *detector; - while((detector = (AliModule*)next())) { - detector->FinishPrimary(); - } - - // Write out hits if any - if (gAlice->TreeH()) { - gAlice->TreeH()->Fill(); - } - - // - // if(++count%times==1) gObjectTable->Print(); -} - -//_____________________________________________________________________________ -void AliRun::BeginPrimary() -{ - // - // Called at the beginning of each primary track - // - - // Reset Hits info - gAlice->ResetHits(); - -} - -//_____________________________________________________________________________ -void AliRun::FinishEvent() -{ - // - // Called at the end of the event. - // - - // - if(fLego) fLego->FinishEvent(); - - //Update the energy deposit tables - Int_t i; - for(i=0;iSetNprimary(fStack->GetNprimary()); - fHeader->SetNtrack(fStack->GetNtrack()); - - - // Write out the kinematics - fStack->FinishEvent(); - - // Write out the event Header information - if (fTreeE) { - fHeader->SetStack(fStack); - fTreeE->Fill(); - } - - - // Write Tree headers - TTree* pTreeK = fStack->TreeK(); - if (pTreeK) pTreeK->Write(0,TObject::kOverwrite); - if (fTreeH) fTreeH->Write(0,TObject::kOverwrite); - - ++fEvent; -} - -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::FinishRun() { // @@ -656,7 +487,7 @@ void AliRun::FinishRun() // Clean detector information TIter next(fModules); AliModule *detector; - while((detector = (AliModule*)next())) { + while((detector = dynamic_cast(next()))) { detector->FinishRun(); } @@ -679,15 +510,18 @@ void AliRun::FinishRun() if (fTreeH) { delete fTreeH; fTreeH = 0; } + if (fTreeTR) { + delete fTreeTR; fTreeTR = 0; + } if (fTreeD) { delete fTreeD; fTreeD = 0; } if (fTreeR) { delete fTreeR; fTreeR = 0; } - if (fTreeE) { - delete fTreeE; fTreeE = 0; - } +// if (fTreeE) { +// delete fTreeE; fTreeE = 0; +// } if (fTreeS) { delete fTreeS; fTreeS = 0; } @@ -697,7 +531,7 @@ void AliRun::FinishRun() file->Write(); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::FlagTrack(Int_t track) { // Delegate to stack @@ -705,7 +539,7 @@ void AliRun::FlagTrack(Int_t track) fStack->FlagTrack(track); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::EnergySummary() { // @@ -734,7 +568,7 @@ void AliRun::EnergySummary() } else ed2=99; fSummEnergy[ndep]=ed; - fSum2Energy[ndep]=TMath::Min((Float_t) 99.,TMath::Max(ed2,kzero)); + fSum2Energy[ndep]=TMath::Min(static_cast(99.),TMath::Max(ed2,kzero)); edtot+=ed; ndep++; } @@ -771,25 +605,46 @@ void AliRun::EnergySummary() // fSum2Energy.Set(0); } -//_____________________________________________________________________________ +//_______________________________________________________________________ +void AliRun::Announce() const +{ + // + // Announce the current version of AliRoot + // + printf("%70s", + "****************************************************************\n"); + printf("%6s","*");printf("%64s","*\n"); + + printf("%6s","*"); + printf(" You are running AliRoot version v3-09-07\n"); + + printf("%6s","*"); + printf(" The cvs tag for the current program is $Name$\n"); + + printf("%6s","*");printf("%64s","*\n"); + printf("%70s", + "****************************************************************\n"); +} + +//_______________________________________________________________________ AliModule *AliRun::GetModule(const char *name) const { // // Return pointer to detector from name // - return (AliModule*)fModules->FindObject(name); + return dynamic_cast(fModules->FindObject(name)); } -//_____________________________________________________________________________ +//_______________________________________________________________________ AliDetector *AliRun::GetDetector(const char *name) const { // // Return pointer to detector from name // - return (AliDetector*)fModules->FindObject(name); + return dynamic_cast(fModules->FindObject(name)); } -//_____________________________________________________________________________ +//_______________________________________________________________________ Int_t AliRun::GetModuleID(const char *name) const { // @@ -801,7 +656,7 @@ Int_t AliRun::GetModuleID(const char *name) const return i; } -//_____________________________________________________________________________ +//_______________________________________________________________________ Int_t AliRun::GetEvent(Int_t event) { // @@ -811,11 +666,13 @@ Int_t AliRun::GetEvent(Int_t event) // Reset existing structures ResetHits(); + ResetTrackReferences(); ResetDigits(); ResetSDigits(); // Delete Trees already connected if (fTreeH) { delete fTreeH; fTreeH = 0;} + if (fTreeTR) { delete fTreeTR; fTreeTR = 0;} if (fTreeD) { delete fTreeD; fTreeD = 0;} if (fTreeR) { delete fTreeR; fTreeR = 0;} if (fTreeS) { delete fTreeS; fTreeS = 0;} @@ -840,52 +697,98 @@ Int_t AliRun::GetEvent(Int_t event) // Get the stack from the header, set fStack to 0 if it // fails to get event - if (fStack) delete fStack; - fStack = fHeader->Stack(); - if (fStack) { - if (!fStack->GetEvent(event)) fStack = 0; - } - // TFile *file = fTreeE->GetCurrentFile(); char treeName[20]; - TKey* currentKey; - static TIter Iter(gDirectory->GetListOfKeys()); file->cd(); + if (fStack) delete fStack; + fStack = fHeader->Stack(); + if (fStack) { + if (!fStack->GetEvent(event)) fStack = 0; + } + // Get Hits Tree header from file sprintf(treeName,"TreeH%d",event); - while ((currentKey = (TKey *) Iter.Next())) { - if (strcmp(treeName,currentKey->GetName()) == 0) { - fTreeH = (TTree*)currentKey->ReadObj(); - if (!fTreeH) - {Error("GetEvent","cannot find Hits Tree for event:%d\n",event);} - break; - } - } - + fTreeH = dynamic_cast(gDirectory->Get(treeName)); + if (!fTreeH) { + Warning("GetEvent","cannot find Hits Tree for event:%d\n",event); + } + + // Get TracReferences Tree header from file + sprintf(treeName,"TreeTR%d",event); + fTreeTR = dynamic_cast(gDirectory->Get(treeName)); + if (!fTreeTR) { + Warning("GetEvent","cannot find TrackReferences Tree for event:%d\n",event); + } + + // get current file name and compare with names containing trees S,D,R + TString curfilname=static_cast(fTreeE->GetCurrentFile()->GetName()); + if(fTreeDFileName==curfilname)fTreeDFileName=""; + if(fTreeSFileName==curfilname)fTreeSFileName=""; + if(fTreeRFileName==curfilname)fTreeRFileName=""; + // Get Digits Tree header from file sprintf(treeName,"TreeD%d",event); - fTreeD = (TTree*)gDirectory->Get(treeName); + + if (!fTreeDFile && fTreeDFileName != "") { + InitTreeFile("D",fTreeDFileName); + } + if (fTreeDFile) { + fTreeD = dynamic_cast(fTreeDFile->Get(treeName)); + } else { + fTreeD = dynamic_cast(file->Get(treeName)); + } if (!fTreeD) { // Warning("GetEvent","cannot find Digits Tree for event:%d\n",event); } + if(fTreeDFileName != ""){ + if(fTreeDFileName==fTreeSFileName) { + fTreeSFileName = ""; + fTreeSFile = fTreeDFile; + } + if(fTreeDFileName==fTreeRFileName) { + fTreeRFileName = ""; + fTreeRFile = fTreeDFile; + } + } file->cd(); // Get SDigits Tree header from file sprintf(treeName,"TreeS%d",event); - fTreeS = (TTree*)gDirectory->Get(treeName); + if (!fTreeSFile && fTreeSFileName != "") { + InitTreeFile("S",fTreeSFileName); + } + if (fTreeSFile) { + fTreeS = dynamic_cast(fTreeSFile->Get(treeName)); + } else { + fTreeS = dynamic_cast(gDirectory->Get(treeName)); + } if (!fTreeS) { // Warning("GetEvent","cannot find SDigits Tree for event:%d\n",event); } + if(fTreeSFileName != ""){ + if(fTreeSFileName==fTreeRFileName){ + fTreeRFileName = ""; + fTreeRFile = fTreeSFile; + } + } + file->cd(); // Get Reconstruct Tree header from file sprintf(treeName,"TreeR%d",event); - fTreeR = (TTree*)gDirectory->Get(treeName); + if (!fTreeRFile && fTreeRFileName != "") { + InitTreeFile("R",fTreeRFileName); + } + if(fTreeRFile) { + fTreeR = dynamic_cast(fTreeRFile->Get(treeName)); + } else { + fTreeR = dynamic_cast(gDirectory->Get(treeName)); + } if (!fTreeR) { // printf("WARNING: cannot find Reconstructed Tree for event:%d\n",event); } @@ -895,23 +798,23 @@ Int_t AliRun::GetEvent(Int_t event) // Set Trees branch addresses TIter next(fModules); AliModule *detector; - while((detector = (AliModule*)next())) { + while((detector = dynamic_cast(next()))) { detector->SetTreeAddress(); } fEvent=event; //MI change - return fStack->GetNtrack(); + return fHeader->GetNtrack(); } -//_____________________________________________________________________________ +//_______________________________________________________________________ TGeometry *AliRun::GetGeometry() { // // Import Alice geometry from current file // Return pointer to geometry object // - if (!fGeometry) fGeometry = (TGeometry*)gDirectory->Get("AliceGeom"); + if (!fGeometry) fGeometry = dynamic_cast(gDirectory->Get("AliceGeom")); // // Unlink and relink nodes in detectors // This is bad and there must be a better way... @@ -919,12 +822,12 @@ TGeometry *AliRun::GetGeometry() TIter next(fModules); AliModule *detector; - while((detector = (AliModule*)next())) { + while((detector = dynamic_cast(next()))) { TList *dnodes=detector->Nodes(); Int_t j; TNode *node, *node1; for ( j=0; jGetSize(); j++) { - node = (TNode*) dnodes->At(j); + node = dynamic_cast(dnodes->At(j)); node1 = fGeometry->GetNode(node->GetName()); dnodes->Remove(node); dnodes->AddAt(node1,j); @@ -933,17 +836,7 @@ TGeometry *AliRun::GetGeometry() return fGeometry; } -//_____________________________________________________________________________ -void AliRun::GetNextTrack(Int_t &mtrack, Int_t &ipart, Float_t *pmom, - Float_t &e, Float_t *vpos, Float_t *polar, - Float_t &tof) -{ - // Delegate to stack - // - fStack->GetNextTrack(mtrack, ipart, pmom, e, vpos, polar, tof); -} - -//_____________________________________________________________________________ +//_______________________________________________________________________ Int_t AliRun::GetPrimary(Int_t track) const { // @@ -952,75 +845,7 @@ Int_t AliRun::GetPrimary(Int_t track) const return fStack->GetPrimary(track); } -//_____________________________________________________________________________ -void AliRun::InitMC(const char *setup) -{ - // - // Initialize the Alice setup - // - - if(fInitDone) { - Warning("Init","Cannot initialise AliRun twice!\n"); - return; - } - - gROOT->LoadMacro(setup); - gInterpreter->ProcessLine(fConfigFunction.Data()); - - - gMC->DefineParticles(); //Create standard MC particles - - TObject *objfirst, *objlast; - - fNdets = fModules->GetLast()+1; - - // - //=================Create Materials and geometry - gMC->Init(); - - // Added also after in case of interactive initialisation of modules - fNdets = fModules->GetLast()+1; - - TIter next(fModules); - AliModule *detector; - while((detector = (AliModule*)next())) { - detector->SetTreeAddress(); - 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); - } - } - ReadTransPar(); //Read the cuts for all materials - - MediaTable(); //Build the special IMEDIA table - - //Initialise geometry deposition table - fEventEnergy.Set(gMC->NofVolumes()+1); - fSummEnergy.Set(gMC->NofVolumes()+1); - fSum2Energy.Set(gMC->NofVolumes()+1); - - //Compute cross-sections - gMC->BuildPhysics(); - - //Write Geometry object to current file. - fGeometry->Write(); - - fInitDone = kTRUE; - - fMCQA = new AliMCQA(fNdets); - - AliConfig::Instance(); - // - // Save stuff at the beginning of the file to avoid file corruption - Write(); -} - -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::MediaTable() { // @@ -1035,7 +860,7 @@ void AliRun::MediaTable() // For all detectors for (kz=0;kz(dets[kz]))) { TArrayI &idtmed = *(det->GetIdtmed()); for(nz=0;nz<100;nz++) { // Find max and min material number @@ -1066,7 +891,7 @@ void AliRun::MediaTable() for(i=0;i<(fNdets-1)/6+1;i++) { for(k=0;k< (6(dets[ind]); if(det) printf(" %6s: %3d -> %3d;",det->GetName(),det->LoMedium(), det->HiMedium()); @@ -1077,7 +902,7 @@ void AliRun::MediaTable() } } -//____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::SetGenerator(AliGenerator *generator) { // @@ -1086,7 +911,7 @@ void AliRun::SetGenerator(AliGenerator *generator) if(!fGenerator) fGenerator = generator; } -//____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::ResetGenerator(AliGenerator *generator) { // @@ -1102,19 +927,22 @@ void AliRun::ResetGenerator(AliGenerator *generator) fGenerator = generator; } -//____________________________________________________________________________ -void AliRun::SetTransPar(char *filename) +//_______________________________________________________________________ +void AliRun::SetTransPar(const char *filename) { + // + // Sets the file name for transport parameters + // fTransParName = filename; } -//____________________________________________________________________________ -void AliRun::SetBaseFile(char *filename) +//_______________________________________________________________________ +void AliRun::SetBaseFile(const char *filename) { fBaseFileName = filename; } -//____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::ReadTransPar() { // @@ -1225,7 +1053,7 @@ void AliRun::ReadTransPar() } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::MakeTree(Option_t *option, const char *file) { // @@ -1238,6 +1066,7 @@ void AliRun::MakeTree(Option_t *option, const char *file) // Analyse options const char *oK = strstr(option,"K"); const char *oH = strstr(option,"H"); + const char *oTR = strstr(option,"T"); const char *oE = strstr(option,"E"); const char *oD = strstr(option,"D"); const char *oR = strstr(option,"R"); @@ -1252,9 +1081,10 @@ void AliRun::MakeTree(Option_t *option, const char *file) if (oE && !fTreeE) { fTreeE = new TTree("TE","Header"); + // branch = fTreeE->Branch("Header", "AliHeader", &fHeader, 4000, 0); branch = fTreeE->Branch("Header", "AliHeader", &fHeader, 4000, 0); branch->SetAutoDelete(kFALSE); - TFolder *folder = (TFolder *)gROOT->FindObjectAny("/Folders/RunMC/Event/Header"); + TFolder *folder = dynamic_cast(gROOT->FindObjectAny("/Folders/RunMC/Event/Header")); if (folder) folder->Add(fHeader); // branch = fTreeE->Branch("Stack","AliStack", &fStack, 4000, 0); // branch->SetAutoDelete(kFALSE); @@ -1267,7 +1097,7 @@ void AliRun::MakeTree(Option_t *option, const char *file) sprintf(outFile,"%s/%s",GetBaseFile(),file); branch->SetFile(outFile); TIter next( branch->GetListOfBranches()); - while ((branch=(TBranch*)next())) { + while ((branch=dynamic_cast(next()))) { branch->SetFile(outFile); } if (GetDebug()>1) @@ -1282,6 +1112,14 @@ void AliRun::MakeTree(Option_t *option, const char *file) fTreeH->SetAutoSave(1000000000); //no autosave fTreeH->Write(0,TObject::kOverwrite); } + + if (oTR && !fTreeTR) { + sprintf(hname,"TreeTR%d",fEvent); + fTreeTR = new TTree(hname,"TrackReferences"); + fTreeTR->SetAutoSave(1000000000); //no autosave + fTreeTR->Write(0,TObject::kOverwrite); + } + if (oD && !fTreeD) { sprintf(hname,"TreeD%d",fEvent); fTreeD = new TTree(hname,"Digits"); @@ -1304,77 +1142,22 @@ void AliRun::MakeTree(Option_t *option, const char *file) // will be in turn a subbranch of the detector master branch TIter next(fModules); AliModule *detector; - while((detector = (AliModule*)next())) { + while((detector = dynamic_cast(next()))) { if (oH) detector->MakeBranch(option,file); + if (oTR) detector->MakeBranchTR(option,file); } } -//_____________________________________________________________________________ -TParticle* AliRun::Particle(Int_t i) -{ - return fStack->Particle(i); -} - -//_____________________________________________________________________________ -void AliRun::BeginEvent() +//_______________________________________________________________________ +TParticle* AliRun::Particle(Int_t i) const { - // Clean-up previous event - // Energy scores - fEventEnergy.Reset(); - // Clean detector information - CleanDetectors(); - // Reset stack info - fStack->Reset(); - - - // - // Reset all Detectors & kinematics & trees - // - char hname[30]; - // - // Initialise event header - fHeader->Reset(fRun,fEvent); // - fStack->BeginEvent(fEvent); - - // - if(fLego) { - fLego->BeginEvent(); - return; - } - + // Returns particle i on the simulation stack // - - ResetHits(); - ResetDigits(); - ResetSDigits(); - - - if(fTreeH) { - fTreeH->Reset(); - sprintf(hname,"TreeH%d",fEvent); - fTreeH->SetName(hname); - } - if(fTreeD) { - fTreeD->Reset(); - sprintf(hname,"TreeD%d",fEvent); - fTreeD->SetName(hname); - fTreeD->Write(0,TObject::kOverwrite); - } - if(fTreeS) { - fTreeS->Reset(); - sprintf(hname,"TreeS%d",fEvent); - fTreeS->SetName(hname); - fTreeS->Write(0,TObject::kOverwrite); - } - if(fTreeR) { - fTreeR->Reset(); - sprintf(hname,"TreeR%d",fEvent); - fTreeR->SetName(hname); - fTreeR->Write(0,TObject::kOverwrite); - } + return fStack->Particle(i); } -//_____________________________________________________________________________ + +//_______________________________________________________________________ void AliRun::ResetDigits() { // @@ -1382,12 +1165,12 @@ void AliRun::ResetDigits() // TIter next(fModules); AliModule *detector; - while((detector = (AliModule*)next())) { + while((detector = dynamic_cast(next()))) { detector->ResetDigits(); } } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::ResetSDigits() { // @@ -1395,12 +1178,12 @@ void AliRun::ResetSDigits() // TIter next(fModules); AliModule *detector; - while((detector = (AliModule*)next())) { + while((detector = dynamic_cast(next()))) { detector->ResetSDigits(); } } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::ResetHits() { // @@ -1408,12 +1191,25 @@ void AliRun::ResetHits() // TIter next(fModules); AliModule *detector; - while((detector = (AliModule*)next())) { + while((detector = dynamic_cast(next()))) { detector->ResetHits(); } } -//_____________________________________________________________________________ +//_______________________________________________________________________ +void AliRun::ResetTrackReferences() +{ + // + // Reset all Detectors hits + // + TIter next(fModules); + AliModule *detector; + while((detector = dynamic_cast(next()))) { + detector->ResetTrackReferences(); + } +} + +//_______________________________________________________________________ void AliRun::ResetPoints() { // @@ -1421,12 +1217,86 @@ void AliRun::ResetPoints() // TIter next(fModules); AliModule *detector; - while((detector = (AliModule*)next())) { + while((detector = dynamic_cast(next()))) { detector->ResetPoints(); } } -//_____________________________________________________________________________ +//_______________________________________________________________________ +void AliRun::InitMC(const char *setup) +{ + // + // Initialize the Alice setup + // + + Announce(); + + if(fInitDone) { + Warning("Init","Cannot initialise AliRun twice!\n"); + return; + } + + gROOT->LoadMacro(setup); + gInterpreter->ProcessLine(fConfigFunction.Data()); + + // Register MC in configuration + AliConfig::Instance()->Add(gMC); + gMC->SetStack(fStack); + + gMC->DefineParticles(); //Create standard MC particles + AliPDG::AddParticlesToPdgDataBase(); + + TObject *objfirst, *objlast; + + fNdets = fModules->GetLast()+1; + + // + //=================Create Materials and geometry + gMC->Init(); + + // Added also after in case of interactive initialisation of modules + fNdets = fModules->GetLast()+1; + + TIter next(fModules); + AliModule *detector; + while((detector = dynamic_cast(next()))) { + detector->SetTreeAddress(); + 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); + } + } + ReadTransPar(); //Read the cuts for all materials + + MediaTable(); //Build the special IMEDIA table + + //Initialise geometry deposition table + fEventEnergy.Set(gMC->NofVolumes()+1); + fSummEnergy.Set(gMC->NofVolumes()+1); + fSum2Energy.Set(gMC->NofVolumes()+1); + + //Compute cross-sections + gMC->BuildPhysics(); + + //Write Geometry object to current file. + fGeometry->Write(); + + fInitDone = kTRUE; + + fMCQA = new AliMCQA(fNdets); + + AliConfig::Instance(); + // + // Save stuff at the beginning of the file to avoid file corruption + Write(); +} + +//_______________________________________________________________________ void AliRun::RunMC(Int_t nevent, const char *setup) { // @@ -1442,7 +1312,7 @@ void AliRun::RunMC(Int_t nevent, const char *setup) // Create the Root Tree with one branch per detector - MakeTree("ESDR"); + MakeTree("ESDRT"); if (gSystem->Getenv("CONFIG_SPLIT_FILE")) { MakeTree("K","Kine.root"); @@ -1457,7 +1327,7 @@ void AliRun::RunMC(Int_t nevent, const char *setup) if(nevent>0) FinishRun(); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::RunReco(const char *selected, Int_t first, Int_t last) { // @@ -1465,7 +1335,7 @@ void AliRun::RunReco(const char *selected, Int_t first, Int_t last) // cout << "Found "<< gAlice->TreeE()->GetEntries() << "events" << endl; Int_t nFirst = first; - Int_t nLast = (last < 0)? (Int_t) gAlice->TreeE()->GetEntries() : last; + Int_t nLast = (last < 0)? static_cast(gAlice->TreeE()->GetEntries()) : last; for (Int_t nevent = nFirst; nevent <= nLast; nevent++) { cout << "Processing event "<< nevent << endl; @@ -1475,7 +1345,7 @@ void AliRun::RunReco(const char *selected, Int_t first, Int_t last) } } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::Hits2Digits(const char *selected) { @@ -1491,7 +1361,7 @@ void AliRun::Hits2Digits(const char *selected) } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::Tree2Tree(Option_t *option, const char *selected) { @@ -1519,51 +1389,54 @@ void AliRun::Tree2Tree(Option_t *option, const char *selected) TDirectory *cwd = gDirectory; + TObject *obj; + char outFile[32]; - while((detector = (AliDetector*)next())) { + while((obj = next())) { + if (!dynamic_cast(obj)) + Fatal("Tree2Tree","Wrong type in fModules array\n"); + if (!(detector = dynamic_cast(obj))) continue; if (selected) if (strcmp(detector->GetName(),selected)) continue; - if (detector->IsActive()){ - if (gSystem->Getenv("CONFIG_SPLIT_FILE")) { - if (oS) { - sprintf(outFile,"SDigits.%s.root",detector->GetName()); - detector->MakeBranch("S",outFile); - } - if (oD) { - sprintf(outFile,"Digits.%s.root",detector->GetName()); - detector->MakeBranch("D",outFile); - } - if (oR) { - sprintf(outFile,"Reco.%s.root",detector->GetName()); - detector->MakeBranch("R",outFile); - } - } else { - detector->MakeBranch(option); - } - - cwd->cd(); - + if (!detector->IsActive()) continue; + if (gSystem->Getenv("CONFIG_SPLIT_FILE")) { if (oS) { - cout << "Hits2SDigits: Processing " << detector->GetName() << "..." << endl; - detector->Hits2SDigits(); - } + sprintf(outFile,"SDigits.%s.root",detector->GetName()); + detector->MakeBranch("S",outFile); + } if (oD) { - cout << "SDigits2Digits: Processing " << detector->GetName() << "..." << endl; - detector->SDigits2Digits(); - } + sprintf(outFile,"Digits.%s.root",detector->GetName()); + detector->MakeBranch("D",outFile); + } if (oR) { - cout << "Digits2Reco: Processing " << detector->GetName() << "..." << endl; - detector->Digits2Reco(); - } - - cwd->cd(); - } - } + sprintf(outFile,"Reco.%s.root",detector->GetName()); + detector->MakeBranch("R",outFile); + } + } else { + detector->MakeBranch(option); + } + + cwd->cd(); + + if (oS) { + cout << "Hits2SDigits: Processing " << detector->GetName() << "..." << endl; + detector->Hits2SDigits(); + } + if (oD) { + cout << "SDigits2Digits: Processing " << detector->GetName() << "..." << endl; + detector->SDigits2Digits(); + } + if (oR) { + cout << "Digits2Reco: Processing " << detector->GetName() << "..." << endl; + detector->Digits2Reco(); + } + + cwd->cd(); + } } - -//_____________________________________________________________________________ +//_______________________________________________________________________ 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) @@ -1630,7 +1503,8 @@ void AliRun::RunLego(const char *setup, Int_t nc1, Float_t c1min, //Run Lego Object - gMC->ProcessRun(nc1*nc2+1); + //gMC->ProcessRun(nc1*nc2+1); + gMC->ProcessRun(nc1*nc2); // Create only the Root event Tree MakeTree("E"); @@ -1643,7 +1517,7 @@ void AliRun::RunLego(const char *setup, Int_t nc1, Float_t c1min, delete fLego; fLego=0; } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::SetConfigFunction(const char * config) { // @@ -1653,7 +1527,7 @@ void AliRun::SetConfigFunction(const char * config) fConfigFunction=config; } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::SetCurrentTrack(Int_t track) { // @@ -1662,32 +1536,33 @@ void AliRun::SetCurrentTrack(Int_t track) fStack->SetCurrentTrack(track); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::SetTrack(Int_t done, Int_t parent, Int_t pdg, Float_t *pmom, Float_t *vpos, Float_t *polar, Float_t tof, - AliMCProcess mech, Int_t &ntr, Float_t weight) + TMCProcess mech, Int_t &ntr, Float_t weight, Int_t is) { // Delegate to stack // - fStack->SetTrack(done, parent, pdg, pmom, vpos, polar, tof, - mech, ntr, weight); + + fStack->SetTrack(done, parent, pdg, pmom, vpos, polar, tof, + mech, ntr, weight, is); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::SetTrack(Int_t done, Int_t parent, Int_t pdg, Double_t px, Double_t py, Double_t pz, Double_t e, Double_t vx, Double_t vy, Double_t vz, Double_t tof, Double_t polx, Double_t poly, Double_t polz, - AliMCProcess mech, Int_t &ntr, Float_t weight) + TMCProcess mech, Int_t &ntr, Float_t weight, Int_t is) { // Delegate to stack // fStack->SetTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof, - polx, poly, polz, mech, ntr, weight); + polx, poly, polz, mech, ntr, weight, is); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::SetHighWaterMark(const Int_t nt) { // @@ -1695,7 +1570,7 @@ void AliRun::SetHighWaterMark(const Int_t nt) fStack->SetHighWaterMark(nt); } -//_____________________________________________________________________________ +//_______________________________________________________________________ void AliRun::KeepTrack(const Int_t track) { // @@ -1704,59 +1579,332 @@ void AliRun::KeepTrack(const Int_t track) fStack->KeepTrack(track); } -//_____________________________________________________________________________ -void AliRun::StepManager(Int_t id) +// +// MC Application +// + +//_______________________________________________________________________ +void AliRun::ConstructGeometry() { // - // Called at every step during transport + // Create modules, materials, geometry // + TStopwatch stw; + TIter next(fModules); + AliModule *detector; + printf("Geometry creation:\n"); + while((detector = dynamic_cast(next()))) { + stw.Start(); + // Initialise detector materials and geometry + detector->CreateMaterials(); + detector->CreateGeometry(); + printf("%10s R:%.2fs C:%.2fs\n", + detector->GetName(),stw.RealTime(),stw.CpuTime()); + } +} + +//_______________________________________________________________________ +void AliRun::InitGeometry() +{ // - // --- If lego option, do it and leave - if (fLego) - fLego->StepManager(); - else { - Int_t copy; + // Initialize detectors and display geometry + // + + printf("Initialisation:\n"); + TStopwatch stw; + TIter next(fModules); + AliModule *detector; + while((detector = dynamic_cast(next()))) { + stw.Start(); + // Initialise detector and display geometry + detector->Init(); + detector->BuildGeometry(); + printf("%10s R:%.2fs C:%.2fs\n", + detector->GetName(),stw.RealTime(),stw.CpuTime()); + } + +} + +//_______________________________________________________________________ +void AliRun::GeneratePrimaries() +{ + // + // Generate primary particles and fill them in the stack. + // + + Generator()->Generate(); +} + +//_______________________________________________________________________ +void AliRun::BeginEvent() +{ + // Clean-up previous event + // Energy scores + fEventEnergy.Reset(); + // Clean detector information + CleanDetectors(); + // Reset stack info + fStack->Reset(); + + + // + // Reset all Detectors & kinematics & trees + // + char hname[30]; + // + // Initialise event header + fHeader->Reset(fRun,fEvent,fEventNrInRun); + // + fStack->BeginEvent(fEvent); + + // + if(fLego) { + fLego->BeginEvent(); + return; + } + + // + + ResetHits(); + ResetTrackReferences(); + ResetDigits(); + ResetSDigits(); + + + if(fTreeH) { + fTreeH->Reset(); + sprintf(hname,"TreeH%d",fEvent); + fTreeH->SetName(hname); + } + + if(fTreeTR) { + fTreeTR->Reset(); + sprintf(hname,"TreeTR%d",fEvent); + fTreeTR->SetName(hname); + } + + if(fTreeD) { + fTreeD->Reset(); + sprintf(hname,"TreeD%d",fEvent); + fTreeD->SetName(hname); + fTreeD->Write(0,TObject::kOverwrite); + } + if(fTreeS) { + fTreeS->Reset(); + sprintf(hname,"TreeS%d",fEvent); + fTreeS->SetName(hname); + fTreeS->Write(0,TObject::kOverwrite); + } + if(fTreeR) { + fTreeR->Reset(); + sprintf(hname,"TreeR%d",fEvent); + fTreeR->SetName(hname); + fTreeR->Write(0,TObject::kOverwrite); + } +} + +//_______________________________________________________________________ +void AliRun::BeginPrimary() +{ + // + // Called at the beginning of each primary track + // + + // Reset Hits info + gAlice->ResetHits(); + gAlice->ResetTrackReferences(); + +} + +//_______________________________________________________________________ +void AliRun::PreTrack() +{ + // + // Method called before each track + // + TObjArray &dets = *fModules; + AliModule *module; + + for(Int_t i=0; i<=fNdets; i++) + if((module = dynamic_cast(dets[i]))) + module->PreTrack(); + + fMCQA->PreTrack(); +} + +//_______________________________________________________________________ +void AliRun::Stepping() +{ + // + // Called at every step during transport + // + + Int_t id = DetFromMate(gMC->GetMedium()); + if (id < 0) return; + + // + // --- If lego option, do it and leave + if (fLego) + fLego->StepManager(); + else { + Int_t copy; //Update energy deposition tables AddEnergyDeposit(gMC->CurrentVolID(copy),gMC->Edep()); //Call the appropriate stepping routine; - AliModule *det = (AliModule*)fModules->At(id); - if(det) { + AliModule *det = dynamic_cast(fModules->At(id)); + if(det && det->StepManagerIsEnabled()) { fMCQA->StepManager(id); det->StepManager(); } } } -//_____________________________________________________________________________ +//_______________________________________________________________________ +void AliRun::PostTrack() +{ + // + // Called after a track has been trasported + // + TObjArray &dets = *fModules; + AliModule *module; + + for(Int_t i=0; i<=fNdets; i++) + if((module = dynamic_cast(dets[i]))) + module->PostTrack(); +} + +//_______________________________________________________________________ +void AliRun::FinishPrimary() +{ + // + // Called at the end of each primary track + // + + // static Int_t count=0; + // const Int_t times=10; + // This primary is finished, purify stack + fStack->PurifyKine(); + + TIter next(fModules); + AliModule *detector; + while((detector = dynamic_cast(next()))) { + detector->FinishPrimary(); + } + + // Write out hits if any + if (gAlice->TreeH()) { + gAlice->TreeH()->Fill(); + } + + // Write out hits if any + if (gAlice->TreeTR()) { + gAlice->TreeTR()->Fill(); + } + + // + // if(++count%times==1) gObjectTable->Print(); +} + +//_______________________________________________________________________ +void AliRun::FinishEvent() +{ + // + // Called at the end of the event. + // + + // + if(fLego) fLego->FinishEvent(); + + //Update the energy deposit tables + Int_t i; + for(i=0;iSetNprimary(fStack->GetNprimary()); + fHeader->SetNtrack(fStack->GetNtrack()); + + + // Write out the kinematics + fStack->FinishEvent(); + + // Write out the event Header information + if (fTreeE) { + fHeader->SetStack(fStack); + fTreeE->Fill(); + } + + + // Write Tree headers + TTree* pTreeK = fStack->TreeK(); + if (pTreeK) pTreeK->Write(0,TObject::kOverwrite); + if (fTreeH) fTreeH->Write(0,TObject::kOverwrite); + if (fTreeTR) fTreeTR->Write(0,TObject::kOverwrite); + + ++fEvent; + ++fEventNrInRun; +} + +//_______________________________________________________________________ +void AliRun::Field(const Double_t* x, Double_t *b) const +{ + // + // Returns the magnetic field at point x[3] + // Units are kGauss + // + 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 { + printf("No mag field defined!\n"); + b[0]=b[1]=b[2]=0.; + } + +} + +// +// End of MC Application +// + +//_______________________________________________________________________ void AliRun::Streamer(TBuffer &R__b) { - // Stream an object of class AliRun. + // Stream an object of class AliRun. - if (R__b.IsReading()) { - if (!gAlice) gAlice = this; + if (R__b.IsReading()) { + if (!gAlice) gAlice = this; - AliRun::Class()->ReadBuffer(R__b, this); - // - gROOT->GetListOfBrowsables()->Add(this,"Run"); + AliRun::Class()->ReadBuffer(R__b, this); + // + gROOT->GetListOfBrowsables()->Add(this,"Run"); - fTreeE = (TTree*)gDirectory->Get("TE"); - if (fTreeE) { + fTreeE = dynamic_cast(gDirectory->Get("TE")); + if (fTreeE) { fTreeE->SetBranchAddress("Header", &fHeader); - } - - else Error("Streamer","cannot find Header Tree\n"); - fTreeE->GetEntry(0); - - gRandom = fRandom; - } else { - AliRun::Class()->WriteBuffer(R__b, this); - } + } + else Error("Streamer","cannot find Header Tree\n"); + + fTreeE->GetEntry(0); + gRandom = fRandom; + } else { + AliRun::Class()->WriteBuffer(R__b, this); + } } -//___________________________________________________________________________ +//_______________________________________________________________________ Int_t AliRun::CurrentTrack() const { // // Returns current track @@ -1764,7 +1912,7 @@ Int_t AliRun::CurrentTrack() const { return fStack->CurrentTrack(); } -//___________________________________________________________________________ +//_______________________________________________________________________ Int_t AliRun::GetNtrack() const { // // Returns number of tracks in stack @@ -1772,16 +1920,16 @@ Int_t AliRun::GetNtrack() const { return fStack->GetNtrack(); } -//___________________________________________________________________________ -TObjArray* AliRun::Particles() { +//_______________________________________________________________________ +TObjArray* AliRun::Particles() const { // // Returns pointer to Particles array // return fStack->Particles(); } -//___________________________________________________________________________ -TTree* AliRun::TreeK() { +//_______________________________________________________________________ +TTree* AliRun::TreeK() const { // // Returns pointer to the TreeK array // @@ -1789,7 +1937,263 @@ TTree* AliRun::TreeK() { } +//_______________________________________________________________________ void AliRun::SetGenEventHeader(AliGenEventHeader* header) { fHeader->SetGenEventHeader(header); } + +//_______________________________________________________________________ +TFile* AliRun::InitFile(TString fileName) +{ +// +// create the file where the whole tree will be saved +// + TDirectory *wd = gDirectory; + TFile* file = TFile::Open(fileName,"update"); + gDirectory = wd; + if (!file->IsOpen()) { + Error("Cannot open file, %s\n",fileName); + return 0; + } + return file; +} + +//_______________________________________________________________________ +TFile* AliRun::InitTreeFile(Option_t *option, TString fileName) +{ + // + // create the file where one of the following trees will be saved + // trees: S,D,R + // WARNING: by default these trees are saved on the file on which + // hits are stored. If you divert one of these trees, you cannot restore + // it to the original file (usually galice.root) in the same aliroot session + Bool_t oS = (strstr(option,"S")!=0); + Bool_t oR = (strstr(option,"R")!=0); + Bool_t oD = (strstr(option,"D")!=0); + Int_t choice[3]; + for (Int_t i=0; i<3; i++) choice[i] = 0; + if(oS)choice[0] = 1; + if(oD)choice[1] = 1; + if(oR)choice[2] = 1; + + TFile *ptr=0; + + if(!(oS || oR || oD))return ptr; + + Int_t active[3]; + for (Int_t i=0; i<3; i++) active[i] = 0; + if(fTreeSFileName != "") active[0] = 1; + if(fTreeDFileName != "") active[1] = 1; + if(fTreeDFileName != "") active[2] = 1; + + Bool_t alreadyopen1 = kFALSE; + Bool_t alreadyopen2 = kFALSE; + + if(oS){ + // if already active and same name with non-null ptr + if(active[0]==1 && fileName == fTreeSFileName && fTreeSFile){ + Warning("InitTreeFile","File %s already opened",fTreeSFileName.Data()); + ptr = fTreeSFile; + } + else { + // if already active with different name with non-null ptr + if(active[0]==1 && fileName != fTreeSFileName && fTreeSFile){ + // close the active files and also the other possible files in option + CloseTreeFile(option); + } + fTreeSFileName = fileName; + alreadyopen1 = + (active[1] == 1 && fTreeDFileName == fTreeSFileName && fTreeDFile); + alreadyopen2 = + (active[2] == 1 && fTreeRFileName == fTreeSFileName && fTreeRFile); + if(!(alreadyopen1 || alreadyopen2)){ + ptr = InitFile(fileName); + fTreeSFile = ptr; + } + else { + if(alreadyopen1){fTreeSFile = fTreeDFile; ptr = fTreeSFile;} + if(alreadyopen2){fTreeSFile = fTreeRFile; ptr = fTreeSFile;} + } + if(choice[1] == 1) { fTreeDFileName = fileName; fTreeDFile = ptr;} + if(choice[2] == 1) { fTreeRFileName = fileName; fTreeRFile = ptr;} + } + return ptr; + } + + if(oD){ + // if already active and same name with non-null ptr + if(active[1]==1 && fileName == fTreeDFileName && fTreeDFile){ + Warning("InitTreeFile","File %s already opened",fTreeDFileName.Data()); + ptr = fTreeDFile; + } + else { + // if already active with different name with non-null ptr + if(active[1]==1 && fileName != fTreeDFileName && fTreeDFile){ + // close the active files and also the other possible files in option + CloseTreeFile(option); + } + fTreeDFileName = fileName; + alreadyopen1 = + (active[0] == 1 && fTreeSFileName == fTreeDFileName && fTreeSFile); + alreadyopen2 = + (active[2] == 1 && fTreeRFileName == fTreeDFileName && fTreeRFile); + if(!(alreadyopen1 || alreadyopen2)){ + ptr = InitFile(fileName); + fTreeDFile = ptr; + } + else { + if(alreadyopen1){fTreeDFile = fTreeSFile; ptr = fTreeDFile;} + if(alreadyopen2){fTreeDFile = fTreeRFile; ptr = fTreeDFile;} + } + if(choice[2] == 1) { fTreeRFileName = fileName; fTreeRFile = ptr;} + } + return ptr; + } + + if(oR){ + // if already active and same name with non-null ptr + if(active[2]==1 && fileName == fTreeRFileName && fTreeRFile){ + Warning("InitTreeFile","File %s already opened",fTreeRFileName.Data()); + ptr = fTreeRFile; + } + else { + // if already active with different name with non-null ptr + if(active[2]==1 && fileName != fTreeRFileName && fTreeRFile){ + // close the active files and also the other possible files in option + CloseTreeFile(option); + } + fTreeRFileName = fileName; + alreadyopen1 = + (active[1] == 1 && fTreeDFileName == fTreeRFileName && fTreeDFile); + alreadyopen2 = + (active[0]== 1 && fTreeSFileName == fTreeRFileName && fTreeSFile); + if(!(alreadyopen1 || alreadyopen2)){ + ptr = InitFile(fileName); + fTreeRFile = ptr; + } + else { + if(alreadyopen1){fTreeRFile = fTreeDFile; ptr = fTreeRFile;} + if(alreadyopen2){fTreeRFile = fTreeSFile; ptr = fTreeRFile;} + } + } + return ptr; + } + return 0; +} + +//_______________________________________________________________________ +void AliRun::PrintTreeFile() +{ + // + // prints the file names and pointer associated to S,D,R trees + // + cout<<"===================================================\n"; + TFile *file = fTreeE->GetCurrentFile(); + TString curfilname=""; + if(file)curfilname=static_cast(file->GetName()); + cout<<" Current tree file name: "<IsOpen()){ + fTreeSFile->Close(); + delete fTreeSFile; + } + } + fTreeSFile = 0; + } + if(oD){ + fTreeDFileName = ""; + if(fTreeDFile){ + if(!((fTreeDFile == fTreeRFile) || (fTreeDFile == fTreeSFile)) && + fTreeDFile->IsOpen()){ + fTreeDFile->Close(); + delete fTreeDFile; + } + } + fTreeDFile = 0; + } + if(oR){ + fTreeRFileName = ""; + if(fTreeRFile){ + if(!((fTreeRFile == fTreeSFile) || (fTreeRFile == fTreeDFile)) && + fTreeRFile->IsOpen()){ + fTreeRFile->Close(); + delete fTreeRFile; + } + } + fTreeRFile = 0; + } +} + +//_______________________________________________________________________ +void AliRun::MakeTree(Option_t *option, TFile *file) +{ + // + // Create some trees in the separate file + // + const char *oD = strstr(option,"D"); + const char *oR = strstr(option,"R"); + const char *oS = strstr(option,"S"); + + TDirectory *cwd = gDirectory; + char hname[30]; + + if (oD) { + delete fTreeD; + sprintf(hname,"TreeD%d",fEvent); + file->cd(); + fTreeD = static_cast(file->Get("hname")); + if (!fTreeD) { + fTreeD = new TTree(hname,"Digits"); + fTreeD->Write(0,TObject::kOverwrite); + } + cwd->cd(); + } + if (oS) { + delete fTreeS; + sprintf(hname,"TreeS%d",fEvent); + file->cd(); + fTreeS = static_cast(file->Get("hname")); + if (!fTreeS) { + fTreeS = new TTree(hname,"SDigits"); + fTreeS->Write(0,TObject::kOverwrite); + } + cwd->cd(); + } + + if (oR) { + delete fTreeR; + sprintf(hname,"TreeR%d",fEvent); + file->cd(); + fTreeR = static_cast(file->Get("hname")); + if (!fTreeR) { + fTreeR = new TTree(hname,"RecPoint"); + fTreeR->Write(0,TObject::kOverwrite); + } + cwd->cd(); + } +}