Allow for a user-initiated event loop with events provided by the user. More info...
authoragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 27 Nov 2013 16:20:01 +0000 (16:20 +0000)
committeragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Wed, 27 Nov 2013 16:20:01 +0000 (16:20 +0000)
ANALYSIS/AliAnalysisManager.cxx
ANALYSIS/AliAnalysisManager.h
STEER/STEERBase/AliVEventHandler.h

index 09666be..27389c8 100644 (file)
@@ -304,6 +304,33 @@ void AliAnalysisManager::CreateReadCache()
    }
    return;
 }   
+
+//______________________________________________________________________________
+Bool_t AliAnalysisManager::EventLoop(Long64_t nevents)
+{
+// Initialize an event loop where the data producer is the input handler
+// The handler must implement MakeTree creating the tree of events (likely
+// memory resident) and generate the current event in the method BeginEvent.
+// If the tree is memory resident, the handler should never call TTree::Fill
+// method.
+   cout << "===== RUNNING IN EVENT LOOP MODE: " << GetName() << endl;
+   if (!fInputEventHandler) {
+     Error("EventLoop", "No input handler: exiting");
+     return kFALSE;
+   }
+   TTree *tree = fInputEventHandler->MakeTree();
+   if (!tree) {
+     Error("EventLoop", "The input handler must provide MakeTree()");
+     return kFALSE;
+  }
+  SetExternalLoop(kTRUE);
+  if (!Init(tree)) return kFALSE;
+  for (Long64_t iev=0; iev<nevents; iev++) {
+    fInputEventHandler->BeginEvent(iev);
+    ExecAnalysis();
+    fInputEventHandler->FinishEvent();
+  }
+}
       
 //______________________________________________________________________________
 Int_t AliAnalysisManager::GetEntry(Long64_t entry, Int_t getall)
@@ -535,6 +562,7 @@ Bool_t AliAnalysisManager::Notify()
    // is started when using PROOF. It is normaly not necessary to make changes
    // to the generated code, but the routine can be extended by the
    // user if needed. The return value is currently not used.
+   static TFile *oldfile = 0;
    fIOTimer->Start(kTRUE); 
    if (!fTree) return kFALSE;
    if (!TObject::TestBit(AliAnalysisManager::kTrueNotify)) return kFALSE;
@@ -551,7 +579,12 @@ Bool_t AliAnalysisManager::Notify()
       if (fCurrentDescriptor) fCurrentDescriptor->Done();
       fCurrentDescriptor = new AliAnalysisFileDescriptor(curfile);
       fFileDescriptors->Add(fCurrentDescriptor);
-   }   
+      if (fCacheSize && oldfile) {
+         TTreeCache* pf = dynamic_cast<TTreeCache*>(oldfile->GetCacheRead());
+         if (pf) pf->Print();
+      }
+   } 
+   oldfile = curfile;  
    
    if (fDebug > 1) printf("->AliAnalysisManager::Notify() file: %s\n", curfile->GetName());
    Int_t run = AliAnalysisManager::GetRunFromAlienPath(curfile->GetName());
index 71523df..a104665 100644 (file)
@@ -76,6 +76,7 @@ enum EAliAnalysisFlags {
    AliAnalysisManager& operator=(const AliAnalysisManager& other);
    
    // Event loop control
+   Bool_t              EventLoop(Long64_t nevents);
    virtual Int_t       GetEntry(Long64_t entry, Int_t getall = 0);
    virtual Bool_t      Init(TTree *tree);
    virtual Bool_t      Notify();
index 37772e0..139bf19 100644 (file)
@@ -38,6 +38,8 @@ enum EEventHandlerFlags {
     virtual const char*  GetExtraOutputs() const {return NULL;}
     // Input
     virtual void         SetInputTree(TTree* tree)        = 0;
+    // Special "generator" handler
+    virtual TTree       *MakeTree() {return 0;}
     // Steering 
     virtual Bool_t       Init(Option_t* opt)              = 0;
     virtual Bool_t       Init(TTree* tree, Option_t* opt) = 0;