Added method AliInputEventHandler::GetStatistics(Option_t *option) to retrieve the...
authoragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 2 Nov 2010 12:57:01 +0000 (12:57 +0000)
committeragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 2 Nov 2010 12:57:01 +0000 (12:57 +0000)
This method will return the statistics TH2F histograms filled by the AliPhysicsSelection in case the task AliPhysicsSelectionTask is used in the ESD train (or used during AOD production).
To use, the user task must call this method during FinishTaskOutput (executed on the worker after all events are processed):

//________________________________________________________________________
void AliAnalysisTaskPt::FinishTaskOutput()
{
// This gets called at the end of the processing on the worker.
  AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
  AliInputEventHandler *inputH = dynamic_cast<AliInputEventHandler*>(am->GetInputEventHandler());
  if (!inputH) return;
  TH2F *histStat = dynamic_cast<TH2F*>(inputH->GetStatistics());
  TH2F *histBin0 = dynamic_cast<TH2F*>(inputH->GetStatistics("BIN0"));
  ...

STEER/AliAODInputHandler.cxx
STEER/AliAODInputHandler.h
STEER/AliESDInputHandler.cxx
STEER/AliESDInputHandler.h
STEER/AliInputEventHandler.cxx
STEER/AliInputEventHandler.h

index 85fc194..d509dac 100644 (file)
 #include <TList.h>
 #include <TNamed.h>
 #include <TFile.h>
+#include <TH2.h>
 
 #include "AliAODInputHandler.h"
 #include "AliAODEvent.h"
+#include "AliVCuts.h"
 
 ClassImp(AliAODInputHandler)
 
@@ -45,6 +47,7 @@ AliAODInputHandler::AliAODInputHandler() :
     fMergeOffset(0)
 {
   // Default constructor
+  fHistStatistics[0] = fHistStatistics[1] = NULL;
 }
 
 //______________________________________________________________________________
@@ -60,70 +63,71 @@ AliAODInputHandler::AliAODInputHandler(const char* name, const char* title):
   fMergeOffset(0)
 {
     // Constructor
+  fHistStatistics[0] = fHistStatistics[1] = NULL;
 }
 
 //______________________________________________________________________________
 AliAODInputHandler::~AliAODInputHandler() 
 {
 // Destructor
-    fFriends->Delete();
+  fFriends->Delete();
+  if (fHistStatistics[0]) {
+    delete fHistStatistics[0];
+    fHistStatistics[0] = 0;
+  }
+  if (fHistStatistics[1]) {
+    delete fHistStatistics[1];
+    fHistStatistics[1] = 0;
+  }
 }
 
-
+//______________________________________________________________________________
 Bool_t AliAODInputHandler::Init(TTree* tree, Option_t* opt)
 {
     // Initialisation necessary for each new tree
-    if (!fMergeEvents) {
-       fTree = tree;
-       TIter next(fFriends);
-       TNamed* obj;
-       
-       if (!fTree) return kFALSE;
-       fTree->GetEntry(0);
-       TString aodTreeFName,aodFriendTreeFName;
+  if (!fMergeEvents) {
+    fTree = tree;
+    TIter next(fFriends);
+    TNamed* obj;
        
-       while((obj = (TNamed*)next())) {
-           if (fTree->GetTree()) {
-               aodTreeFName = (fTree->GetTree()->GetCurrentFile())->GetName();
-               aodFriendTreeFName = aodTreeFName;
-               aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
-               aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
-               (fTree->GetTree())->AddFriend("aodTree", aodFriendTreeFName.Data());
-           } else {
-               aodTreeFName = (fTree->GetCurrentFile())->GetName();
-               aodFriendTreeFName = aodTreeFName;
-               aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
-               aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
-               fTree->AddFriend("aodTree", aodFriendTreeFName.Data());
-           }
-       }
-    } else {
-       // Friends have to be merged
-       TNamed* filename = (TNamed*) (fFriends->At(0));
-       fFileToMerge = new TFile(filename->GetName());
-       if (fFileToMerge) {
-           fFileToMerge->GetObject("aodTree", fTreeToMerge);
-           if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
-           fAODEventToMerge->ReadFromTree(fTreeToMerge);
-       }
+    if (!fTree) return kFALSE;
+    fTree->GetEntry(0);
+    TString aodTreeFName,aodFriendTreeFName;
+    TTree *ttree = fTree->GetTree();
+    if (!ttree) ttree = fTree;
+    aodTreeFName = ttree->GetCurrentFile()->GetName();
+
+    while((obj = (TNamed*)next())) {
+      aodFriendTreeFName = aodTreeFName;
+      aodFriendTreeFName.ReplaceAll("AliAOD.root",obj->GetName());
+      aodFriendTreeFName.ReplaceAll("AliAODs.root",obj->GetName());
+      ttree->AddFriend("aodTree", aodFriendTreeFName.Data());
     }
-    
-    
+  } else {
+  // Friends have to be merged
+    TNamed* filename = (TNamed*) (fFriends->At(0));
+    fFileToMerge = new TFile(filename->GetName());
+        if (fFileToMerge) {
+      fFileToMerge->GetObject("aodTree", fTreeToMerge);
+          if (!fAODEventToMerge) fAODEventToMerge = new AliAODEvent();
+          fAODEventToMerge->ReadFromTree(fTreeToMerge);
+    }
+  }
 
-    SwitchOffBranches();
-    SwitchOnBranches();
+  SwitchOffBranches();
+  SwitchOnBranches();
     
-    // Get pointer to AOD event
-    if (!fEvent) fEvent = new AliAODEvent();
+  // Get pointer to AOD event
+  if (!fEvent) fEvent = new AliAODEvent();
 
-    fEvent->ReadFromTree(fTree);
-    
-    if (fMixingHandler) fMixingHandler->Init(tree, opt);
+  fEvent->ReadFromTree(fTree);
+  
+  if (fMixingHandler) fMixingHandler->Init(tree, opt);
 
-    return kTRUE;
+  return kTRUE;
 }
 
+//______________________________________________________________________________
 Bool_t AliAODInputHandler::BeginEvent(Long64_t entry)
 {
     //
@@ -138,13 +142,41 @@ Bool_t AliAODInputHandler::BeginEvent(Long64_t entry)
     return kTRUE;
 }
 
+//______________________________________________________________________________
 Bool_t AliAODInputHandler::Notify(const char* path)
 {
   // Notifaction of directory change
   if (fMixingHandler) fMixingHandler->Notify(path);
+  TTree *ttree = fTree->GetTree();
+  if (!ttree) ttree = fTree;
+  TString statFname = ttree->GetCurrentFile()->GetName();
+  statFname.ReplaceAll("AliAOD.root", "EventStat_temp.root");
+  TFile *statFile = TFile::Open(statFname, "READ");
+  if (statFile) {
+     TList *list = (TList*)statFile->Get("cstatsout");
+     if (list) {
+        AliVCuts *physSel = (AliVCuts*)list->At(0);
+        if (physSel) {
+           TH2F *hAll = dynamic_cast<TH2F*>(physSel->GetStatistics("ALL"));
+           TH2F *hBin0 = dynamic_cast<TH2F*>(physSel->GetStatistics("BIN0"));
+           if (fHistStatistics[0] && hAll) {
+              TList tmplist;
+              tmplist.Add(hAll);
+              fHistStatistics[0]->Merge(&tmplist);
+              tmplist.Clear();
+              tmplist.Add(hBin0);
+              if (fHistStatistics[1] && hBin0) fHistStatistics[1]->Merge(&tmplist);
+           } else {
+              fHistStatistics[0] = hAll;
+              fHistStatistics[1] = hBin0;
+           }   
+        }
+     }
+  }
   return kTRUE;
 }
 
+//______________________________________________________________________________
 Bool_t AliAODInputHandler::FinishEvent()
 {
   // Finish event
@@ -152,6 +184,7 @@ Bool_t AliAODInputHandler::FinishEvent()
   return kTRUE;
 }
 
+//______________________________________________________________________________
 void AliAODInputHandler::AddFriend(char* filename)
 {
     // Add a friend tree 
@@ -159,8 +192,21 @@ void AliAODInputHandler::AddFriend(char* filename)
     fFriends->Add(obj);
 }
 
+//______________________________________________________________________________
 Option_t *AliAODInputHandler::GetDataType() const
 {
 // Returns handled data type.
    return gAODDataType;
 }
+
+//______________________________________________________________________________
+TObject *AliAODInputHandler::GetStatistics(Option_t *option) const
+{
+// Get the statistics histogram(s) from the physics selection object. This
+// should be called during FinishTaskOutput(). Option can be empty (default
+// statistics histogram) or BIN0.
+   TString opt(option);
+   opt.ToUpper();
+   if (opt=="BIN0") return fHistStatistics[1];
+   return fHistStatistics[0];
+}   
index fa4d399..3abf966 100644 (file)
@@ -16,6 +16,7 @@
 
 class TList;
 class AliMCEvent;
+class TH2F;
 
 class AliAODInputHandler : public AliInputEventHandler {
 
@@ -33,6 +34,8 @@ class AliAODInputHandler : public AliInputEventHandler {
     virtual Bool_t       Notify(const char* path);
     virtual Bool_t       FinishEvent();
     Option_t            *GetDataType() const;
+    // Get the statistics object (currently TH2). Option can be BIN0.
+    virtual TObject     *GetStatistics(Option_t *option="") const;
     // Provisions for event merging
     void                 SetMergeEvents(Bool_t flag) {fMergeEvents = flag;}
     Bool_t               GetMergeEvents() const {return fMergeEvents;}
@@ -51,6 +54,7 @@ class AliAODInputHandler : public AliInputEventHandler {
     TTree          *fTreeToMerge;     //! Tree for merging
     AliAODEvent    *fAODEventToMerge; //! Event for merging
     Int_t           fMergeOffset;     //! Event offset for merging
+    TH2F*           fHistStatistics[2]; //! how many events are cut away why {all,bin 0}
     ClassDef(AliAODInputHandler, 2);
 };
 
index 8d9c105..d048248 100644 (file)
@@ -470,3 +470,16 @@ Int_t AliESDInputHandler::GetNFilesEmpty()
   return iFilesEmpty;
   
 }
+
+//______________________________________________________________________________
+TObject *AliESDInputHandler::GetStatistics(Option_t *option) const
+{
+// Get the statistics histogram(s) from the physics selection object. This
+// should be called during FinishTaskOutput(). Option can be empty (default
+// statistics histogram) or BIN0.
+   if (!fEventCuts) return NULL;
+   TString opt(option);
+   opt.ToUpper();
+   if (opt=="BIN0") return fEventCuts->GetStatistics("BIN0");
+   else return fEventCuts->GetStatistics("ALL");
+}   
index 76cc6aa..e45549d 100644 (file)
@@ -54,6 +54,8 @@ class AliESDInputHandler : public AliInputEventHandler {
     // Tag analysis
     void SetReadTags() {fUseTags = kTRUE;}
     AliRunTag           *GetRunTag() const {return fRunTag;}
+    // Get the statistics object (currently TH2). Option can be BIN0.
+    virtual TObject     *GetStatistics(Option_t *option="") const;
  private:
     AliESDInputHandler(const AliESDInputHandler& handler);             
     AliESDInputHandler& operator=(const AliESDInputHandler& handler);  
index b8d76b1..802d246 100644 (file)
@@ -60,6 +60,7 @@ AliInputEventHandler::AliInputEventHandler(const char* name, const char* title):
   fIsSelectedResult(0),
   fMixingHandler(0)
 {
+// Named constructor.
 }
 
 void AliInputEventHandler::SwitchOffBranches() const {
@@ -91,7 +92,15 @@ void AliInputEventHandler::SwitchOnBranches() const {
   }
 }
 
-
-
+TObject *AliInputEventHandler::GetStatistics(Option_t *) const
+{
+// Returns the statistics object(s) (TH2F histogram) produced by the physics
+// selection. Implementations both for ESD and AOD input handlers.
+  return NULL;
+}
+   
 Long64_t AliInputEventHandler::GetReadEntry() const 
-{return fTree->GetReadEntry();}
+{
+  // Get the current entry.
+  return fTree->GetReadEntry();
+}
index 95b4a7b..e5f3417 100644 (file)
@@ -51,6 +51,8 @@ class AliInputEventHandler : public AliVEventHandler {
      // Getters
     virtual AliVEvent   *GetEvent()        const                      {return 0;}
     virtual AliRunTag   *GetRunTag()       const                      {return 0;}
+    // Get the statistics object (currently TH2). Option can be BIN0.
+    virtual TObject     *GetStatistics(Option_t *option="") const;
     virtual Option_t    *GetAnalysisType() const                      {return 0;}
     virtual TTree       *GetTree( )        const                      {return fTree;}
     virtual AliVCuts    *GetEventSelection() const                    {return fEventCuts;}