]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliMultiEventInputHandler.cxx
Coverity defect corrected.
[u/mrichter/AliRoot.git] / ANALYSIS / AliMultiEventInputHandler.cxx
index 093bde13851ce92eb8572673828eb53b4d813eb1..7a2fb658840971686facd63a4cfb4958027dcf99 100644 (file)
 #include "AliAODEvent.h"
 #include "AliESDEvent.h"
 #include "AliVEventPool.h"
+#include "AliVCuts.h"
 #include "AliLog.h"
 #include <TObjArray.h>
 #include <TTree.h>
+#include <TList.h>
+#include <TEntryList.h>
 
 
 ClassImp(AliMultiEventInputHandler)
@@ -40,8 +43,11 @@ AliMultiEventInputHandler::AliMultiEventInputHandler() :
     fNBuffered(0),
     fIndex(0),
     fCurrentBin(0),
+    fCurrentEvt(0),
+    fInit(0),
     fEventPool(0),
-    fEventBuffer(0)
+    fEventBuffer(0),
+    fEventSkipped(0)
 {
   // Default constructor
 }
@@ -54,18 +60,13 @@ AliMultiEventInputHandler::AliMultiEventInputHandler(Int_t size, Int_t format) :
     fNBuffered(0),
     fIndex(0),
     fCurrentBin(0),
+    fCurrentEvt(0),
+    fInit(0),
     fEventPool(0),
-    fEventBuffer(new AliVEvent*[size])
+    fEventBuffer(0),
+    fEventSkipped(0)
 {
-  // Default constructor
-    for (Int_t i = 0; i < size; i++) 
-       if (fFormat == 1) {
-           fEventBuffer[i] = new AliAODEvent();
-       } else if (fFormat == 0) {
-           fEventBuffer[i] = new AliESDEvent();
-       } else{
-           AliWarning(Form("Unknown Format %5d", fFormat));
-       }
+  // constructor
 }
 
 //______________________________________________________________________________
@@ -76,18 +77,14 @@ AliMultiEventInputHandler::AliMultiEventInputHandler(const char* name, const cha
     fNBuffered(0),
     fIndex(0),
     fCurrentBin(0),
+    fCurrentEvt(0),
+    fInit(0),
     fEventPool(0),
-    fEventBuffer(new AliVEvent*[size])
+    fEventBuffer(0),
+    fEventSkipped(0)
 {
     // Constructor
-    for (Int_t i = 0; i < size; i++) 
-       if (fFormat == 1) {
-           fEventBuffer[i] = new AliAODEvent();
-       } else if (fFormat == 0) {
-           fEventBuffer[i] = new AliESDEvent();
-       } else{
-           AliWarning(Form("Unknown Format %5d", fFormat));
-       }
+
 }
 
 //______________________________________________________________________________
@@ -99,24 +96,69 @@ AliMultiEventInputHandler::~AliMultiEventInputHandler()
 Bool_t AliMultiEventInputHandler::Init(TTree* tree, Option_t* /*opt*/)
 {
     // Initialisation necessary for each new tree
+    if (!fEventBuffer) {
+       fEventBuffer = new AliVEvent*[fBufferSize];
+       
+       for (Int_t i = 0; i < fBufferSize; i++) 
+           if (fFormat == 1) {
+               fEventBuffer[i] = new AliAODEvent();
+           } else if (fFormat == 0) {
+               fEventBuffer[i] = new AliESDEvent();
+           } else{
+               AliWarning(Form("Unknown Format %5d", fFormat));
+           }
+    }
+    
+
     fTree = tree;
+    fInit = 1;
+    
     if (!fTree) return kFALSE;
-    // Get pointer to AOD event
-    fEventBuffer[0]->ReadFromTree(fTree, "");
+    for (Int_t i = 0; i < fBufferSize; i++) 
+       fEventBuffer[i]->Clear();
     fIndex     = 0;
     fNBuffered = 1;
     return kTRUE;
 }
 
+
+Bool_t AliMultiEventInputHandler::Notify(const char */*path*/)
+{
+    // Connect to new tree
+
+    TList* connectedList = (TList*) (fTree->GetUserInfo()->FindObject("AODObjectsConnectedToTree"));   
+    if (connectedList && !fInit) {
+       fEventBuffer[0]->ReadFromTree(fTree, "reconnect");
+    } else {
+       if (fInit) fEventBuffer[0]->ReadFromTree(fTree, "");
+    }
+    
+    fCurrentEvt = 0;
+    fInit = 0;
+    
+    return (kTRUE);
+}
+
 Bool_t AliMultiEventInputHandler::BeginEvent(Long64_t /*entry*/)
 {
     // Actions before analysis of each event 
     //
     // Reset the number of events buffered for this bin to 0
+    
     if (fCurrentBin != (fEventPool->BinNumber())) {
        fCurrentBin = fEventPool->BinNumber();
        fNBuffered = 0;
     }
+  //
+  // Event selection
+  // 
+    if (fFormat == 0) {
+      fIsSelectedResult = 0;
+      if (fEventCuts && !IsUserCallSelectionMask())
+       fIsSelectedResult = 
+         fEventCuts->GetSelectionMask((AliESDEvent*)fEventBuffer[fIndex]); 
+    }
+    
     return kTRUE;
 }
 
@@ -124,20 +166,36 @@ Bool_t AliMultiEventInputHandler::FinishEvent()
 {
     // 
     // Connect the next event in the buffer to the tree
-    fIndex++;
-    
+    if (!fEventSkipped) fIndex++;
     fIndex %= fBufferSize;
     AliInfo(Form("Connecting buffer entry %5d", fIndex));
+    fEventBuffer[fIndex]->Clear();
+    fCurrentEvt++;
+    if (fEventBuffer[fIndex]->GetList() && fCurrentEvt > (fBufferSize - 1))
+       fEventBuffer[fIndex]->GetList()->Delete();
 
     fEventBuffer[fIndex]->ReadFromTree(fTree, "reconnect");
 
     fNBuffered++;
     if (fNBuffered > fBufferSize) fNBuffered = fBufferSize;
-
+    
+    Int_t nmax = fTree->GetEntries();
+    if (fTree->GetEntryList()) {
+       nmax = (fTree->GetEntryList()->GetN());
+    } else {
+       if (fTree->GetTree()) nmax = fTree->GetTree()->GetEntries();
+    }
+    
+    if (fCurrentEvt == nmax)
+    {
+       for (Int_t i = 0; i < fBufferSize; i++) {
+           fEventBuffer[i]->Clear();
+       }
+    }
+    
     return (kTRUE);
 }
 
-
 AliVEvent* AliMultiEventInputHandler::GetEvent(Int_t iev) const
 {
     // Get event number iev from buffer