]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG3/hfe/AliHFEefficiency.cxx
Add fast merging option (Diego)
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEefficiency.cxx
index 79c995c0c68b46dd8253f09eea558a36902b93ba..30bb40e96919c1de3828780f6bdc9bfab856cf96 100644 (file)
@@ -31,7 +31,9 @@
 #include <TObjArray.h>
 #include <TPad.h>
 
+#include "AliAnalysisManager.h"
 #include "AliCFAcceptanceCuts.h"
+#include "AliCFTrackIsPrimaryCuts.h"
 #include "AliCFContainer.h"
 #include "AliCFEffGrid.h"
 #include "AliESDEvent.h"
@@ -43,6 +45,7 @@
 #include "AliHFEtrackFilter.h"
 #include "AliHFEtools.h"
 #include "AliMCEvent.h"
+#include "AliMCEventHandler.h"
 
 ClassImp(AliHFEefficiency)
 
@@ -74,6 +77,8 @@ AliHFEefficiency::AliHFEefficiency(const Char_t *name):
   //
   DefineOutput(1, AliHFEcontainer::Class());
   DefineOutput(2, TList::Class());
+
+  SetRunTerminate();
 }
 
 AliHFEefficiency::~AliHFEefficiency(){
@@ -114,11 +119,18 @@ void AliHFEefficiency::UserCreateOutputObjects(){
   if(fCutTRD){
     AliHFEcutStep *hfeTRD = fFilter->GetCutStep("HFETRD");
     AliHFEextraCuts *hfecuts = dynamic_cast<AliHFEextraCuts *>(hfeTRD->GetCut("HFETRDCuts"));
-    hfecuts->SetMinTrackletsTRD(4);
+    if(hfecuts) hfecuts->SetMinTrackletsTRD(4);
   }
   AliHFEcutStep *hfeITS = fFilter->GetCutStep("HFEITS");
   AliHFEextraCuts *hfeitscuts = dynamic_cast<AliHFEextraCuts *>(hfeITS->GetCut("HFEPixelsCuts"));
-  hfeitscuts->SetRequireITSpixel(AliHFEextraCuts::kFirst);
+  if(hfeitscuts)hfeitscuts->SetRequireITSpixel(AliHFEextraCuts::kFirst);
+
+  AliHFEcutStep *primary = fFilter->GetCutStep("Primary");
+  AliCFTrackIsPrimaryCuts *primcuts = dynamic_cast<AliCFTrackIsPrimaryCuts *>(primary->GetCut("PrimaryCuts"));
+  if(primcuts){ 
+    primcuts->SetMaxDCAToVertexXY(3);
+    primcuts->SetMaxDCAToVertexZ(5);
+  }
 
   fAcceptanceCuts = new AliCFAcceptanceCuts("Acceptance", "MC Acceptance Cuts");
   fAcceptanceCuts->SetMinNHitITS(3);
@@ -128,13 +140,11 @@ void AliHFEefficiency::UserCreateOutputObjects(){
   // create additional histos for testing purpose
   fOutput = new AliHFEcollection("histos", "QA histograms");
   fOutput->CreateTH1F("hNtracks","Number of Tracks per Event", 100, 0, 100);
-  fOutput->CreateTH1F("hPt","Pt of the tracks", 40, 0.1, 10);
-  fOutput->BinLogAxis("hPt", 0);
+  fOutput->CreateTH1F("hPt","Pt of the tracks", 40, 0.1, 10, 0);
   fOutput->CreateTH1F("kinkIndex", "Kink Index", 400, -200, 200);
   fOutput->CreateTH1F("itspixel", "ITS PIXEL", 2, 0, 2);
   fOutput->CreateTH1F("mcmother", "Mother PDG", 1000, -500, 500);
-  fOutput->CreateTH2F("ptres", "Pt Resolution", 40, 0.1, 10, 200, -1.5, 1.5);
-  fOutput->BinLogAxis("ptres", 0);
+  fOutput->CreateTH2F("ptres", "Pt Resolution", 40, 0.1, 10, 200, -1.5, 1.5, 0);
 }
 
 void AliHFEefficiency::UserExec(Option_t *){
@@ -142,13 +152,26 @@ void AliHFEefficiency::UserExec(Option_t *){
   // Event Loop
   // Filter track, fill Efficiency container
   //
+  AliESDEvent *esdevent = dynamic_cast<AliESDEvent *>(fInputEvent);
+  if(!esdevent){
+    AliError("ESD Event required");
+    return;
+  }
   fEfficiency->NewEvent();
   fFilter->SetRecEvent(fInputEvent);
   if(fMCEvent){
+    AliMCEventHandler *mcH = dynamic_cast<AliMCEventHandler *>(AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
+   if ( ! mcH ) {
+     AliError("Cannot get MC truth event handler");
+     return;
+    }  
+    if(mcH &&(!mcH->InitOk())) return;
+    if(mcH &&(!mcH->TreeK())) return;
+    if(mcH &&(!mcH->TreeTR())) return;
     fFilter->SetMC(fMCEvent);
     FilterMC();
   }
-  fFilter->FilterTracks(dynamic_cast<AliESDEvent *>(fInputEvent));
+  fFilter->FilterTracks(esdevent);
   TObjArray *tracks = fFilter->GetFilteredTracks();
   TIterator *iter = tracks->MakeIterator();
   fOutput->Fill("hNtracks", tracks->GetEntriesFast());
@@ -160,10 +183,17 @@ void AliHFEefficiency::UserExec(Option_t *){
       fOutput->Fill("itspixel",1);
     else
       fOutput->Fill("itspixel",0);
-    AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(track->GetLabel())));
-    AliMCParticle *mother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(mctrack->Particle()->GetFirstMother()));
-    fOutput->Fill("mcmother", mother->Particle()->GetPdgCode());
-    fOutput->Fill("ptres", mctrack->Pt(), (track->Pt() - mctrack->Pt())/mctrack->Pt());
+    if(fMCEvent){
+      AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(TMath::Abs(track->GetLabel())));
+      if(mctrack){
+        Int_t motherLabel = mctrack->Particle()->GetFirstMother();
+        if(motherLabel){
+          AliMCParticle *mother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(motherLabel));
+          if(mother)fOutput->Fill("mcmother", mother->Particle()->GetPdgCode());
+        }
+        fOutput->Fill("ptres", mctrack->Pt(), (track->Pt() - mctrack->Pt())/mctrack->Pt());
+      }
+    }
   }
   delete iter;
   fFilter->Flush();
@@ -176,11 +206,16 @@ void AliHFEefficiency::Terminate(Option_t *){
   // Evaluate Results
   //
   fEfficiency = dynamic_cast<AliHFEcontainer *>(GetOutputData(1));
-  if(!fEfficiency) return;
+  if(!fEfficiency){
+    AliError("No Output data available");
+    return;
+  }
+
+  if(!IsRunningTerminate()) return;
   PostProcess();
 
   TList *l = dynamic_cast<TList *>(GetOutputData(2));
-  DrawPtResolution(l);
+  if(l) DrawPtResolution(l);
 }
 
 void AliHFEefficiency::FilterMC(){
@@ -191,6 +226,7 @@ void AliHFEefficiency::FilterMC(){
   AliMCParticle *track = NULL;
   for(Int_t itrack = 0; itrack < fMCEvent->GetNumberOfTracks(); itrack++){
     track = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(itrack));
+    if(!track) continue;
     if(!fMCcut->IsSelected(track)) continue;
     cont[0] = track->Pt();
     cont[1] = track->Eta();
@@ -205,9 +241,12 @@ void AliHFEefficiency::FilterMC(){
 }
 
 void AliHFEefficiency::Load(const char* filename){
+  //
+  // Load results for post processing
+  //
   TFile *input = TFile::Open(filename);
   AliHFEcontainer *cin = dynamic_cast<AliHFEcontainer *>(input->Get("Efficiency"));
-  fEfficiency = dynamic_cast<AliHFEcontainer *>(cin->Clone());
+  if(cin) fEfficiency = dynamic_cast<AliHFEcontainer *>(cin->Clone());
   input->Close();
   delete input;
 }
@@ -339,11 +378,12 @@ void AliHFEefficiency::CalculatePTsmearing(){
   delete grid;
 }
 
-void AliHFEefficiency::DrawPtResolution(TList *l){
+void AliHFEefficiency::DrawPtResolution(const TList * const l){
   //
   // Draw pt resolution
   //
   TH2 *h2 = dynamic_cast<TH2 *>(l->FindObject("ptres"));
+  if(!h2) return;
   TGraphErrors *mean = new TGraphErrors(h2->GetNbinsX());
   TGraphErrors *rms = new TGraphErrors(h2->GetNbinsX());