Fix for Lego run (P.Skowronski)
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 24 Oct 2003 14:36:01 +0000 (14:36 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 24 Oct 2003 14:36:01 +0000 (14:36 +0000)
STEER/AliDataLoader.cxx
STEER/AliMC.cxx
STEER/AliRun.cxx
STEER/AliRunLoader.cxx
STEER/AliStack.cxx

index 2ee8be1..498e3fd 100644 (file)
@@ -670,9 +670,7 @@ void AliDataLoader::SetBaseQATaskLoader(AliTaskLoader* bl)
 void AliDataLoader::Synchronize()
 {
   //synchrinizes all writtable files 
-  if ( fFile == 0x0 ) return;
-  if ( fFile->IsWritable() == kFALSE ) return;
-  fFile->Write(0,TObject::kOverwrite);
+  if ( fFile ) fFile->Flush();
 }
 
 /*****************************************************************************/ 
index c331790..13380f3 100644 (file)
@@ -365,9 +365,13 @@ void AliMC::BeginEvent()
     runloader->Stack()->Reset();//clean stack -> tree is unloaded
   else
     runloader->MakeStack();//or make a new one
-    
-  if (GetDebug()) Info("BeginEvent","  fRunLoader->MakeTree(K)");
-  runloader->MakeTree("K");
+  
+  if(gAlice->Lego() == 0x0)
+   { 
+     if (GetDebug()) Info("BeginEvent","  fRunLoader->MakeTree(K)");
+     runloader->MakeTree("K");
+   }
+   
   if (GetDebug()) Info("BeginEvent","  gMC->SetStack(fRunLoader->Stack())");
   gMC->SetStack(gAlice->GetRunLoader()->Stack());//Was in InitMC - but was moved here 
                                      //because we don't have guarantee that 
@@ -381,20 +385,22 @@ void AliMC::BeginEvent()
     gAlice->GetEventNrInRun());
 //  fRunLoader->WriteKinematics("OVERWRITE");  is there any reason to rewrite here since MakeTree does so
 
-  if (GetDebug()) Info("BeginEvent","  fRunLoader->MakeTrackRefsContainer()");
-  runloader->MakeTrackRefsContainer();//for insurance
+  if(gAlice->Lego()) 
+   {
+    gAlice->Lego()->BeginEvent();
+    return;
+   }
+  
 
   if (GetDebug()) Info("BeginEvent","  ResetHits()");
   ResetHits();
+  
   if (GetDebug()) Info("BeginEvent","  fRunLoader->MakeTree(H)");
   runloader->MakeTree("H");
+  
+  if (GetDebug()) Info("BeginEvent","  fRunLoader->MakeTrackRefsContainer()");
+  runloader->MakeTrackRefsContainer();//for insurance
 
-  //
-  if(gAlice->Lego()) 
-   {
-    gAlice->Lego()->BeginEvent();
-    return;
-   }
 
   //create new branches and SetAdresses
   TIter next(gAlice->Modules());
@@ -445,13 +451,17 @@ void AliMC::FinishPrimary()
   //  const Int_t times=10;
   // This primary is finished, purify stack
   runloader->Stack()->PurifyKine();
-
+  
   TIter next(gAlice->Modules());
   AliModule *detector;
   while((detector = dynamic_cast<AliModule*>(next()))) {
     detector->FinishPrimary();
-    if(detector->GetLoader())
-       detector->GetLoader()->TreeH()->Fill();
+    AliLoader* loader = detector->GetLoader();
+    if(loader)
+     {
+       TTree* treeH = loader->TreeH();
+       if (treeH) treeH->Fill(); //can be Lego run and treeH can not exist
+     }
   }
 
   // Write out track references if any
@@ -511,10 +521,13 @@ void AliMC::FinishEvent()
     Error("FinishEvent","Can not get TreeE from RL");
    }
   
-  runloader->WriteKinematics("OVERWRITE");
-  runloader->WriteTrackRefs("OVERWRITE");
-  runloader->WriteHits("OVERWRITE");
-
+  if(gAlice->Lego() == 0x0)
+   {
+     runloader->WriteKinematics("OVERWRITE");
+     runloader->WriteTrackRefs("OVERWRITE");
+     runloader->WriteHits("OVERWRITE");
+   }
+   
   if (GetDebug()) 
    { 
      Info("FinishEvent","<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
index fe45e36..7691d37 100644 (file)
@@ -547,22 +547,12 @@ void AliRun::InitMC(const char *setup)
   gROOT->LoadMacro(setup);
   gInterpreter->ProcessLine(fConfigFunction.Data());
 
-  InitLoaders();
-
-  fRunLoader->MakeTree("E");
-  fRunLoader->LoadKinematics("RECREATE");
-  fRunLoader->LoadTrackRefs("RECREATE");
-  fRunLoader->LoadHits("all","RECREATE");
-  
-  
   fRunLoader->CdGAFile();
 
   AliPDG::AddParticlesToPdgDataBase();  
 
   fNdets = fModules->GetLast()+1;
 
-  //
-
   // Added also after in case of interactive initialisation of modules
   fNdets = fModules->GetLast()+1;
 
@@ -585,10 +575,19 @@ void AliRun::InitMC(const char *setup)
    
    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
 }
@@ -767,15 +766,10 @@ void AliRun::RunLego(const char *setup, Int_t nc1, Float_t c1min,
   //
 
   // check if initialisation has been done
-  if (!fInitDone) InitMC(setup);
-  //Save current generator
-  AliGenerator *gen=fMCApp->Generator();
   // If runloader has been initialized, set the number of events per file to nc1 * nc2
-  if (fRunLoader) fRunLoader->SetNumberOfEventsPerFile(nc1 * nc2);
 
   // Set new generator
   if (!gener) gener  = new AliLegoGenerator();
-  fMCApp->ResetGenerator(gener);
   //
   // Configure Generator
   gener->SetRadiusRange(rmin, rmax);
@@ -787,17 +781,20 @@ void AliRun::RunLego(const char *setup, Int_t nc1, Float_t c1min,
   //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);
   
-  // Create only the Root event Tree
-  fRunLoader->MakeTree("E");
-  
   // End of this run, close files
   FinishRun();
   // Restore current generator
@@ -857,17 +854,13 @@ void AliRun::Streamer(TBuffer &R__b)
     AliRun::Class()->WriteBuffer(R__b, this);
   }
 }
-
-
 //_______________________________________________________________________
 
-//_______________________________________________________________________
 void AliRun::SetGenEventHeader(AliGenEventHeader* header)
 {
   fRunLoader->GetHeader()->SetGenEventHeader(header);
 }
-
-//___________________________________________________________________________
+//_______________________________________________________________________
 
 Int_t AliRun::GetEvNumber() const
 { 
@@ -880,6 +873,7 @@ Int_t AliRun::GetEvNumber() const
 
   return fRunLoader->GetEventNumber();
 }
+//_______________________________________________________________________
 
 void AliRun::SetRunLoader(AliRunLoader* rloader)
 {
index 17f737d..471f77f 100644 (file)
@@ -1,29 +1,33 @@
 #include "AliRunLoader.h"
-//_____________________________________
-/////////////////////////////////////////////////////////////////////////////////////
-//
-// class AliRunLoader
-//
-//This class aims to be the only one interface for manging data
-//It stores Loaders for all modules which knows the filenames 
-//of the data files to be stored.
-//It aims to substitude AliRun in automatic maging of data positioning
-//thus there won't be necessity of loading gAlice from file in order to 
-//get fast ccess to the data
-//
-//logical place for putting the Loader specific to the given detector is detector itself
-// but, to load detector one need to load gAlice, and by the way all other detectors
-// with their geometries and so on. 
-// So, if one need to open TPC clusters there is no principal need to read everything
-//
-// When RunLoader is read from the file it does not connect to the folder structure
-// it must be connected (mounted) manualy in the macro or class code. 
-// Default event folder is defined by AliConfig::fgkDefaultEventFolderName
-// but can be mounted elsewhere. Usefull specially in merging, when more than session 
-// needs to be loaded
-//
-//////////////////////////////////////////////////////////////////////////////////////
-/**************************************************************************/
+//____________________________________________________________________
+//////////////////////////////////////////////////////////////////////
+//                                                                  //
+// class AliRunLoader                                               //
+//                                                                  //
+// This class aims to be the unque interface for managing data I/O. //
+// It stores Loaders for all modules which, knows names             //
+// of the files were data are to be stored.                         //
+//                                                                  //
+// It aims to substitud AliRun in automatic data managing           //
+// thus there is no necessity of loading gAlice from file in order  //
+// to get access to the data.                                       //
+//                                                                  //
+// Logical place to put the specific Loader to the given            //
+// detector is detector  itself (i.e ITSLoader in ITS).             //
+// But, to load detector object one need to load gAlice, and        //
+// by the way all other detectors with their geometrieces and       //
+// so on. So, if one need to open TPC clusters there is no          //
+// principal need to read everything.                               //
+//                                                                  //
+//                                                                  //
+// When RunLoader is read from the file it does not connect to      //
+// the folder structure automatically. It must be connected         //
+// (mounted) manualy. Default event folder is defined by            //
+// AliConfig::fgkDefaultEventFolderName                             //
+// but can be mounted elsewhere. Usefull specially in merging case, //
+// when more than pone session needs to be loaded                   //
+//                                                                  //
+//////////////////////////////////////////////////////////////////////
 
 #include <TROOT.h>
 #include <TString.h>
@@ -1894,6 +1898,7 @@ void AliRunLoader::Synchronize()
   fKineDataLoader->Synchronize();
   fTrackRefsDataLoader->Synchronize();
   
+  if (fGAFile) fGAFile->Flush();
 }
 /*****************************************************************************/ 
 /*****************************************************************************/ 
index 9ee1ed7..83bd754 100644 (file)
@@ -798,13 +798,17 @@ TTree* AliStack::TreeK()
         return 0x0;//pro forma
       }
     fTreeK = rl->TreeK();
-    if ( fTreeK == 0x0)
+    if ( fTreeK )
      {
-      Error("TreeK","Can not get TreeK from RL. Ev. Folder is %s",fEventFolderName.Data());
+      ConnectTree();
      }
     else
      {
-      ConnectTree();
+      //don't panic - could be Lego
+      if (AliLoader::fgDebug) 
+       { 
+         Warning("TreeK","Can not get TreeK from RL. Ev. Folder is %s",fEventFolderName.Data());
+       } 
      }
    }
   return fTreeK;//never reached