]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG2/AliAnalysisTaskProtons.cxx
Minor changes in the macros/tasks
[u/mrichter/AliRoot.git] / PWG2 / AliAnalysisTaskProtons.cxx
index 6aa3882472152db1d00cc0832057e7ad805b9ec4..703f9af5c765d007e1cfc38a055b8c6b9d1ff434 100644 (file)
@@ -1,7 +1,9 @@
 #include "TChain.h"
 #include "TTree.h"
+#include "TString.h"
 #include "TList.h"
 #include "TH2F.h"
+#include "TH1I.h"
 #include "TF1.h"
 #include "TCanvas.h"
 #include "TLorentzVector.h"
 #include "AliESDInputHandler.h"
 #include "AliAODEvent.h"
 #include "AliAODInputHandler.h"
+#include "AliMCEventHandler.h"
+#include "AliMCEvent.h"
+#include "AliStack.h"
+#include "AliCFContainer.h"
+#include "AliVertexerTracks.h"
+#include "AliESDVertex.h"
 
 #include "AliProtonAnalysis.h"
 #include "AliAnalysisTaskProtons.h"
 
 ClassImp(AliAnalysisTaskProtons)
 
+//________________________________________________________________________ 
+AliAnalysisTaskProtons::AliAnalysisTaskProtons()
+  : AliAnalysisTask(), fESD(0), fAOD(0), fMC(0), fAnalysisType("ESD"),
+    fList(0), fProtonAnalysis(0),
+    fElectronFunction(0), fMuonFunction(0),
+    fPionFunction(0), fKaonFunction(0), fProtonFunction(0),
+    fFunctionUsed(kFALSE) {
+  //Dummy constructor
+                                                                                                   
+}
+
 //________________________________________________________________________
 AliAnalysisTaskProtons::AliAnalysisTaskProtons(const char *name) 
-: AliAnalysisTask(name, ""), fESD(0), fAOD(0), fAnalysisType("ESD"), 
-  fList(0), fAnalysis(0), 
+: AliAnalysisTask(name, ""), fESD(0), fAOD(0), fMC(0), fAnalysisType("ESD"),
+  fList(0), fProtonAnalysis(0), 
   fElectronFunction(0), fMuonFunction(0),
   fPionFunction(0), fKaonFunction(0), fProtonFunction(0),
-  fFunctionUsed(kFALSE) { 
+  fFunctionUsed(kFALSE),
+  fTriggerMode(kMB2), fProtonAnalysisMode(kTPC),
+  fVxMax(0), fVyMax(0), fVzMax(0) { 
   // Constructor
 
   // Define input and output slots here
@@ -47,30 +68,32 @@ void AliAnalysisTaskProtons::ConnectInputData(Option_t *) {
   if (!tree) {
     Printf("ERROR: Could not read chain from input slot 0");
   } else {
-    // Disable all branches and enable only the needed ones
-    // The next two lines are different when data produced as AliESDEvent is read
     if(fAnalysisType == "ESD") {
-// In train mode branches can be disabled at the level of ESD handler (M.G.)
-//      tree->SetBranchStatus("*", kFALSE);
-      tree->SetBranchStatus("*Tracks.*", kTRUE);
-
       AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
-      
+     
       if (!esdH) {
        Printf("ERROR: Could not get ESDInputHandler");
       } else
        fESD = esdH->GetEvent();
     }
     else if(fAnalysisType == "AOD") {
-      AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
-      
-      if (!aodH) {
-       Printf("ERROR: Could not get AODInputHandler");
-      } else
-       fAOD = aodH->GetEvent();
+     AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
+     
+     if (!aodH) {
+       Printf("ERROR: Could not get AODInputHandler");
+     } else
+       fAOD = aodH->GetEvent();
+    }
+    else if(fAnalysisType == "MC") {
+     AliMCEventHandler* mcH = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
+     if (!mcH) {
+       Printf("ERROR: Could not retrieve MC event handler");
+     }
+     else
+       fMC = mcH->MCEvent();
     }
-    else 
-      Printf("Wrong analysis type: Only ESD and AOD types are allowed!");
+    else
+      Printf("Wrong analysis type: Only ESD, AOD and MC types are allowed!");
   }
 }
 
@@ -78,35 +101,95 @@ void AliAnalysisTaskProtons::ConnectInputData(Option_t *) {
 void AliAnalysisTaskProtons::CreateOutputObjects() {
   // Create histograms
   // Called once
+  //Prior probabilities
   Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
+  
+  //proton analysis object
+  fProtonAnalysis = new AliProtonAnalysis();
 
-  fAnalysis = new AliProtonAnalysis();
-  fAnalysis->InitHistograms(10,-1.0,1.0,30,0.1,3.1);
   if(fAnalysisType == "ESD") {
-    fAnalysis->SetMinTPCClusters(50);
-    fAnalysis->SetMinITSClusters(1);
-    fAnalysis->SetMaxChi2PerTPCCluster(3.5);
-    fAnalysis->SetMaxCov11(2.0);
-    fAnalysis->SetMaxCov22(2.0);
-    fAnalysis->SetMaxCov33(0.5);
-    fAnalysis->SetMaxCov44(0.5);
-    fAnalysis->SetMaxCov55(2.0);
-    fAnalysis->SetMaxSigmaToVertex(3.);
-    fAnalysis->SetITSRefit();
-    fAnalysis->SetTPCRefit();
-  }
-  if(fFunctionUsed)
-    fAnalysis->SetPriorProbabilityFunctions(fElectronFunction,
-                                           fMuonFunction,
-                                           fPionFunction,
-                                           fKaonFunction,
-                                           fProtonFunction);
-  else
-    fAnalysis->SetPriorProbabilities(partFrac);
+    //Use of TPConly tracks
+    if(fProtonAnalysisMode == kTPC) {
+      fProtonAnalysis->InitAnalysisHistograms(10, -0.5, 0.5, 16, 0.5, 0.9);
+      fProtonAnalysis->UseTPCOnly();
+      //fProtonAnalysis->SetTPCpid();
+      fProtonAnalysis->SetMinTPCClusters(100);
+      fProtonAnalysis->SetMaxChi2PerTPCCluster(2.2);
+      fProtonAnalysis->SetMaxCov11(0.5);
+      fProtonAnalysis->SetMaxCov22(0.5);
+      fProtonAnalysis->SetMaxCov33(0.5);
+      fProtonAnalysis->SetMaxCov44(0.5);
+      fProtonAnalysis->SetMaxCov55(0.5);
+      fProtonAnalysis->SetMaxSigmaToVertexTPC(2.0);
+      //fProtonAnalysis->SetMaxDCAXYTPC(1.5);
+      //fProtonAnalysis->SetMaxDCAZTPC(1.5);
+    }
+    //Use of HybridTPC tracks
+    else if(fProtonAnalysisMode == kHybrid) {
+      fProtonAnalysis->InitAnalysisHistograms(10, -0.5, 0.5, 16, 0.5, 0.9);
+      fProtonAnalysis->UseHybridTPC();
+      fProtonAnalysis->SetTPCpid();
+      fProtonAnalysis->SetMinTPCClusters(110);
+      fProtonAnalysis->SetMaxChi2PerTPCCluster(2.2);
+      fProtonAnalysis->SetMaxCov11(0.5);
+      fProtonAnalysis->SetMaxCov22(0.5);
+      fProtonAnalysis->SetMaxCov33(0.5);
+      fProtonAnalysis->SetMaxCov44(0.5);
+      fProtonAnalysis->SetMaxCov55(0.5);
+      fProtonAnalysis->SetMaxSigmaToVertex(2.0);
+      /*fProtonAnalysis->SetMaxDCAXY(1.5);
+       fProtonAnalysis->SetMaxDCAZ(1.5);*/
+      fProtonAnalysis->SetPointOnITSLayer6();
+      fProtonAnalysis->SetPointOnITSLayer5();
+      //fProtonAnalysis->SetPointOnITSLayer4();
+      //fProtonAnalysis->SetPointOnITSLayer3();
+      fProtonAnalysis->SetPointOnITSLayer2();
+      fProtonAnalysis->SetPointOnITSLayer1();
+      fProtonAnalysis->SetMinITSClusters(5);
+    }
+    //Combined tracking
+    else if(fProtonAnalysisMode == kGlobal) {
+      fProtonAnalysis->InitAnalysisHistograms(20, -1.0, 1.0, 48, 0.3, 1.5);
+      fProtonAnalysis->SetMinTPCClusters(110);
+      fProtonAnalysis->SetMaxChi2PerTPCCluster(2.2);
+      fProtonAnalysis->SetMaxCov11(0.5);
+      fProtonAnalysis->SetMaxCov22(0.5);
+      fProtonAnalysis->SetMaxCov33(0.5);
+      fProtonAnalysis->SetMaxCov44(0.5);
+      fProtonAnalysis->SetMaxCov55(0.5);
+      fProtonAnalysis->SetMaxSigmaToVertex(2.0);
+      //fProtonAnalysis->SetMaxDCAXY(2.0);
+      //fProtonAnalysis->SetMaxDCAZ(2.0);
+      fProtonAnalysis->SetTPCRefit();
+      fProtonAnalysis->SetPointOnITSLayer1();
+      fProtonAnalysis->SetPointOnITSLayer2();
+      //fProtonAnalysis->SetPointOnITSLayer3();
+      //fProtonAnalysis->SetPointOnITSLayer4();
+      fProtonAnalysis->SetPointOnITSLayer5();
+      fProtonAnalysis->SetPointOnITSLayer6();
+      fProtonAnalysis->SetMinITSClusters(5);
+      fProtonAnalysis->SetITSRefit();
+      fProtonAnalysis->SetESDpid();
+    }
 
+    if(fFunctionUsed)
+      fProtonAnalysis->SetPriorProbabilityFunctions(fElectronFunction,
+                                             fMuonFunction,
+                                             fPionFunction,
+                                             fKaonFunction,
+                                             fProtonFunction);
+    else
+      fProtonAnalysis->SetPriorProbabilities(partFrac);
+  }//ESD analysis
+  else if(fAnalysisType == "MC") 
+    fProtonAnalysis->InitAnalysisHistograms(10, -0.5, 0.5, 16, 0.5, 0.9);
+  
   fList = new TList();
-  fList->Add(fAnalysis->GetProtonYPtHistogram()); 
-  fList->Add(fAnalysis->GetAntiProtonYPtHistogram()); 
+  fList->Add(fProtonAnalysis->GetProtonYPtHistogram());
+  fList->Add(fProtonAnalysis->GetAntiProtonYPtHistogram());
+  fList->Add(fProtonAnalysis->GetEventHistogram());
+  fList->Add(fProtonAnalysis->GetProtonContainer());
+  fList->Add(fProtonAnalysis->GetAntiProtonContainer());
 }
 
 //________________________________________________________________________
@@ -119,19 +202,41 @@ void AliAnalysisTaskProtons::Exec(Option_t *) {
       Printf("ERROR: fESD not available");
       return;
     }
+
+    if(IsEventTriggered(fESD,fTriggerMode)) {
+      const AliESDVertex *vertex = GetVertex(fESD,fProtonAnalysisMode,
+                                            fVxMax,fVyMax,fVzMax);
+      if(vertex) {
+       Printf("Proton ESD analysis task: There are %d tracks in this event", fESD->GetNumberOfTracks());
+       fProtonAnalysis->Analyze(fESD,vertex);
+      }//reconstructed vertex
+    }//triggered event
+  }//ESD analysis              
   
-    Printf("Proton analysis task: There are %d tracks in this event", fESD->GetNumberOfTracks());
-    fAnalysis->Analyze(fESD);
-  }
   else if(fAnalysisType == "AOD") {
     if (!fAOD) {
       Printf("ERROR: fAOD not available");
       return;
     }
     
-    Printf("Proton analysis task: There are %d tracks in this event", fAOD->GetNumberOfTracks());
-    fAnalysis->Analyze(fAOD);
-  }
+    Printf("Proton AOD analysis task: There are %d tracks in this event", fAOD->GetNumberOfTracks());
+    fProtonAnalysis->Analyze(fAOD);
+  }//AOD analysis                                                                                                                                                                
+  
+  else if(fAnalysisType == "MC") {
+    if (!fMC) {
+      Printf("ERROR: Could not retrieve MC event");
+      return;
+    }
+
+    AliStack* stack = fMC->Stack();
+    if (!stack) {
+      Printf("ERROR: Could not retrieve the stack");
+      return;
+    }
+    Printf("Proton MC analysis task: There are %d primaries in this event", stack->GetNprimary());
+    fProtonAnalysis->Analyze(stack,kFALSE);//kTRUE in case of inclusive measurement
+  }//MC analysis                      
 
   // Post output data.
   PostData(0, fList);
@@ -151,13 +256,92 @@ void AliAnalysisTaskProtons::Terminate(Option_t *) {
   TH2F *fHistYPtProtons = (TH2F *)fList->At(0);
   TH2F *fHistYPtAntiProtons = (TH2F *)fList->At(1);
     
-  TCanvas *c2 = new TCanvas("c2","p-\bar{p}",200,0,800,400);
-  c2->SetFillColor(10); c2->SetHighLightColor(10); c2->Divide(2,1);
+  TCanvas *c1 = new TCanvas("c1","p-\bar{p}",200,0,800,400);
+  c1->SetFillColor(10); c1->SetHighLightColor(10); c1->Divide(2,1);
 
-  c2->cd(1)->SetLeftMargin(0.15); c2->cd(1)->SetBottomMargin(0.15);  
+  c1->cd(1)->SetLeftMargin(0.15); c1->cd(1)->SetBottomMargin(0.15);  
   if (fHistYPtProtons) fHistYPtProtons->DrawCopy("colz");
-  c2->cd(2)->SetLeftMargin(0.15); c2->cd(2)->SetBottomMargin(0.15);  
+  c1->cd(2)->SetLeftMargin(0.15); c1->cd(2)->SetBottomMargin(0.15);  
   if (fHistYPtAntiProtons) fHistYPtAntiProtons->DrawCopy("colz");
 }
 
+//________________________________________________________________________
+Bool_t AliAnalysisTaskProtons::IsEventTriggered(const AliESDEvent *esd, 
+                                               TriggerMode trigger) {
+  // check if the event was triggered
+  ULong64_t triggerMask = esd->GetTriggerMask();
+  
+  // definitions from p-p.cfg
+  ULong64_t spdFO = (1 << 14);
+  ULong64_t v0left = (1 << 11);
+  ULong64_t v0right = (1 << 12);
+
+  switch (trigger) {
+  case kMB1: {
+    if (triggerMask & spdFO || ((triggerMask & v0left) || (triggerMask & v0right)))
+      return kTRUE;
+    break;
+  }
+  case kMB2: {
+    if (triggerMask & spdFO && ((triggerMask & v0left) || (triggerMask & v0right)))
+      return kTRUE;
+    break;
+  }
+  case kSPDFASTOR: {
+    if (triggerMask & spdFO)
+      return kTRUE;
+    break;
+  }
+  }//switch
+
+  return kFALSE;
+}
+
+//________________________________________________________________________
+const AliESDVertex* AliAnalysisTaskProtons::GetVertex(AliESDEvent* esd, 
+                                                     AnalysisMode mode,
+                                                     Double_t gVxMax,
+                                                     Double_t gVyMax,
+                                                     Double_t gVzMax) {
+  // Get the vertex from the ESD and returns it if the vertex is valid
+  // Second argument decides which vertex is used (this selects
+  // also the quality criteria that are applied)
+  const AliESDVertex* vertex = 0;
+  if(mode == kHybrid)
+    vertex = esd->GetPrimaryVertexSPD();
+  else if(mode == kTPC){
+    Double_t kBz = esd->GetMagneticField();
+    AliVertexerTracks vertexer(kBz);
+    vertexer.SetTPCMode();
+    AliESDVertex *vTPC = vertexer.FindPrimaryVertex(esd);
+    esd->SetPrimaryVertexTPC(vTPC);
+    for (Int_t i=0; i<esd->GetNumberOfTracks(); i++) {
+      AliESDtrack *t = esd->GetTrack(i);
+      t->RelateToVertexTPC(vTPC, kBz, kVeryBig);
+    }
+    delete vTPC;
+    vertex = esd->GetPrimaryVertexTPC();
+  }
+  else if(mode == kGlobal)
+    vertex = esd->GetPrimaryVertex();
+  else
+    Printf("GetVertex: ERROR: Invalid second argument %d", mode);
+  
+  if(!vertex) return 0;
+  
+  // check Ncontributors
+  if(vertex->GetNContributors() <= 0) return 0;
+  
+  // check resolution
+  Double_t zRes = vertex->GetZRes();
+  if(zRes == 0) return 0;
+  
+  //check position
+  if(TMath::Abs(vertex->GetXv()) > gVxMax) return 0;
+  if(TMath::Abs(vertex->GetYv()) > gVyMax) return 0;
+  if(TMath::Abs(vertex->GetZv()) > gVzMax) return 0;
+  
+  return vertex;
+}
+