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 85fc19482468686ee82b662bbcde46e113d9455f..d509dac6ce0ecae4381b0ba3acc142addd69c7db 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 fa4d3993d8687cd19e463035b94e525dd8b617c2..3abf9664fc885ffdd7d953e03b62ec329174a62b 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 8d9c1056951f2715c2b29ff458928281e8f802a3..d048248ff03c9415ed6afa0c960f7fafbab75c99 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 76cc6aa9b348e468911c8393b6572b1857ab3551..e45549d519bc97e764abe0fb533c4c116bcc9d53 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 b8d76b18fc974ebec30680dec7cf0db7f4b91852..802d246859d368b7d733be15943f09ea49df5465 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 95b4a7b41d67ba6280662e444197158de89a6fea..e5f34174d0b0c928aba22f4642a4707d4e7eb27e 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;}