]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliMultiEventInputHandler.cxx
Coverity defect corrected.
[u/mrichter/AliRoot.git] / ANALYSIS / AliMultiEventInputHandler.cxx
index a00d9313d2817600e2905aa6e65aff0759e2bfee..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,7 +96,23 @@ 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;
     for (Int_t i = 0; i < fBufferSize; i++) 
        fEventBuffer[i]->Clear();
@@ -111,16 +124,18 @@ Bool_t AliMultiEventInputHandler::Init(TTree* tree, Option_t* /*opt*/)
 
 Bool_t AliMultiEventInputHandler::Notify(const char */*path*/)
 {
-    static Bool_t first = kTRUE;
-    
     // Connect to new tree
-    if (first) {
-       fEventBuffer[0]->ReadFromTree(fTree, "");
-       first = kFALSE;
+
+    TList* connectedList = (TList*) (fTree->GetUserInfo()->FindObject("AODObjectsConnectedToTree"));   
+    if (connectedList && !fInit) {
+       fEventBuffer[0]->ReadFromTree(fTree, "reconnect");
     } else {
-       fEventBuffer[0]->ReadFromTree(fTree, "reconnect");
+       if (fInit) fEventBuffer[0]->ReadFromTree(fTree, "");
     }
     
+    fCurrentEvt = 0;
+    fInit = 0;
+    
     return (kTRUE);
 }
 
@@ -129,10 +144,21 @@ 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;
 }
 
@@ -140,16 +166,33 @@ 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);
 }