]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWG4/JetTasks/AliPWG4HighPtSpectra.cxx
reduced number of bins in histgrams (M. Verweij)
[u/mrichter/AliRoot.git] / PWG4 / JetTasks / AliPWG4HighPtSpectra.cxx
index d5aa4bcf09f450ad5804eff3671aff08bb3e962c..b41b29b302d0f40e3df3b29cc77cb8b4efeddb03 100644 (file)
@@ -14,9 +14,7 @@
  **************************************************************************/
 
 //-----------------------------------------------------------------------
-// Example of task (running locally, on AliEn and CAF),
-// which provides standard way of calculating acceptance and efficiency
-// between different steps of the procedure.
+// Efficiency between different steps of the procedure.
 // The ouptut of the task is a AliCFContainer from which the efficiencies
 // can be calculated
 //-----------------------------------------------------------------------
@@ -46,6 +44,7 @@
 #include "AliESDtrack.h"
 #include "AliESDtrackCuts.h"
 #include "AliExternalTrackParam.h"
+#include "AliCentrality.h"
 
 #include "AliLog.h"
 
@@ -68,14 +67,21 @@ AliPWG4HighPtSpectra::AliPWG4HighPtSpectra() : AliAnalysisTask("AliPWG4HighPtSpe
   fReadAODData(0),
   fCFManagerPos(0x0),
   fCFManagerNeg(0x0),
-  fESD(0),
-  fTrackCuts(0),
-  fTrackCutsTPConly(0),
+  fESD(0x0),
+  fMC(0x0),
+  fStack(0x0),
+  fVtx(0x0),
+  fIsPbPb(0),
+  fCentClass(10),
+  fTrackType(0),
+  fTrackCuts(0x0),
+  fSigmaConstrainedMax(5.),
   fAvgTrials(1),
   fHistList(0),
   fNEventAll(0),
   fNEventSel(0),
   fNEventReject(0),
+  fh1Centrality(0x0),
   fh1Xsec(0),
   fh1Trials(0),
   fh1PtHard(0),
@@ -91,14 +97,21 @@ AliPWG4HighPtSpectra::AliPWG4HighPtSpectra(const Char_t* name) :
   fReadAODData(0),
   fCFManagerPos(0x0),
   fCFManagerNeg(0x0),
-  fESD(0),
-  fTrackCuts(),
-  fTrackCutsTPConly(0),
+  fESD(0x0),
+  fMC(0x0),
+  fStack(0x0),
+  fVtx(0x0),
+  fIsPbPb(0),
+  fCentClass(10),
+  fTrackType(0),
+  fTrackCuts(0x0),
+  fSigmaConstrainedMax(5.),
   fAvgTrials(1),
   fHistList(0),
   fNEventAll(0),
   fNEventSel(0),
   fNEventReject(0),
+  fh1Centrality(0x0),
   fh1Xsec(0),
   fh1Trials(0),
   fh1PtHard(0),
@@ -127,7 +140,6 @@ void AliPWG4HighPtSpectra::LocalInit()
   // Only called once at beginning
   //
   PostData(3,fTrackCuts);
-  PostData(4,fTrackCutsTPConly);
 }
 
 //________________________________________________________________________
@@ -139,82 +151,178 @@ void AliPWG4HighPtSpectra::ConnectInputData(Option_t *)
 
   TTree* tree = dynamic_cast<TTree*> (GetInputData(0));
   if (!tree) {
-    AliDebug(2,Form("ERROR: Could not read chain from input slot 0"));
-  } else {
-    
-    AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
-    
-    if (!esdH) {
-      AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));
-    } else {
-      fESD = esdH->GetEvent();
-    }
+    AliDebug(2,Form( "ERROR: Could not read chain from input slot 0 \n"));
+    return;
   }
+
+  AliESDInputHandler *esdH = dynamic_cast<AliESDInputHandler*> (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
+
+  if (!esdH) {
+    AliDebug(2,Form("ERROR: Could not get ESDInputHandler"));
+    return;
+  } else
+    fESD = esdH->GetEvent();
   
+  AliMCEventHandler *eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
+  if (!eventHandler) {
+    AliDebug(2,Form( "ERROR: Could not retrieve MC event handler \n"));
+  }
+  else
+    fMC = eventHandler->MCEvent();
+
 }
-//_________________________________________________
-void AliPWG4HighPtSpectra::Exec(Option_t *)
-{
+
+//________________________________________________________________________
+Bool_t AliPWG4HighPtSpectra::SelectEvent() {
   //
-  // Main loop function
+  // Decide if event should be selected for analysis
   //
-  AliDebug(2,Form(">> AliPWG4HighPtSpectra::Exec \n"));  
 
-  // All events without selection
-  fNEventAll->Fill(0.);
+  // Checks following requirements:
+  // - fESD available
+  // - trigger info from AliPhysicsSelection
+  // - number of reconstructed tracks > 1
+  // - primary vertex reconstructed
+  // - z-vertex < 10 cm
+
+  Bool_t selectEvent = kTRUE;
 
+  //fESD object available?
   if (!fESD) {
-    AliDebug(2,Form("ERROR: fESD not available"));
+    AliDebug(2,Form("ERROR: fInputEvent not available\n"));
     fNEventReject->Fill("noESD",1);
-    PostData(0,fHistList);
-    PostData(1,fCFManagerPos->GetParticleContainer());
-    PostData(2,fCFManagerNeg->GetParticleContainer());
-    return;
+    selectEvent = kFALSE;
+    return selectEvent;
   }
 
+  //Trigger
   UInt_t isSelected = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
   if(!(isSelected&AliVEvent::kMB)) { //Select collison candidates
     AliDebug(2,Form(" Trigger Selection: event REJECTED ... "));
     fNEventReject->Fill("Trigger",1);
+    selectEvent = kFALSE;
+    return selectEvent;
+  }
+
+  //Check if number of reconstructed tracks is larger than 1
+  if(!fESD->GetNumberOfTracks() || fESD->GetNumberOfTracks()<2)  {
+    fNEventReject->Fill("NTracks<2",1);
+    selectEvent = kFALSE;
+    return selectEvent;
+  }
+
+  //Check if vertex is reconstructed
+  fVtx = fESD->GetPrimaryVertexSPD();
+
+  if(!fVtx) {
+    fNEventReject->Fill("noVTX",1);
+    selectEvent = kFALSE;
+    return selectEvent;
+  }
+
+  if(!fVtx->GetStatus()) {
+    fNEventReject->Fill("VtxStatus",1);
+    selectEvent = kFALSE;
+    return selectEvent;
+  }
+
+  // Need vertex cut
+  //  TString vtxName(fVtx->GetName());
+  if(fVtx->GetNContributors()<2) {
+    fNEventReject->Fill("NCont<2",1);
+    selectEvent = kFALSE;
+    return selectEvent;
+  }
+
+  //Check if z-vertex < 10 cm
+  double primVtx[3];
+  fVtx->GetXYZ(primVtx);
+  if(TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2]>10.)){
+    fNEventReject->Fill("ZVTX>10",1);
+    selectEvent = kFALSE;
+    return selectEvent;
+  }
+
+  //Centrality selection should only be done in case of PbPb
+  if(IsPbPb()) {
+    Float_t cent = 0.;
+    if(fCentClass!=CalculateCentrality(fESD) && fCentClass!=10) {
+      fNEventReject->Fill("cent",1);
+      selectEvent = kFALSE;
+      return selectEvent;
+    }
+    else {
+      if(dynamic_cast<AliESDEvent*>(fESD)->GetCentrality()) {
+       cent = dynamic_cast<AliESDEvent*>(fESD)->GetCentrality()->GetCentralityPercentile("V0M");
+      }
+      if(cent>90.) {
+       fNEventReject->Fill("cent>90",1);
+       selectEvent = kFALSE;
+       return selectEvent;     
+      }
+      fh1Centrality->Fill(cent);
+    }
+  }
+
+  return selectEvent;
+
+}
+
+//________________________________________________________________________
+Int_t AliPWG4HighPtSpectra::CalculateCentrality(AliESDEvent *esd){
+
+
+  Float_t cent = 999;
+
+  if(esd){
+    if(esd->GetCentrality()){
+      cent = esd->GetCentrality()->GetCentralityPercentile("V0M");
+    }
+  }
+
+  if(cent<0)  return 5;
+  if(cent>80)return 4;
+  if(cent>50)return 3;
+  if(cent>30)return 2;
+  if(cent>10)return 1;
+  return 0;
+
+}
+
+//_________________________________________________
+void AliPWG4HighPtSpectra::Exec(Option_t *)
+{
+  //
+  // Main loop function
+  //
+  AliDebug(2,Form(">> AliPWG4HighPtSpectra::Exec \n"));  
+
+  // All events without selection
+  fNEventAll->Fill(0.);
+
+  if(!SelectEvent()) {
+    fNEventReject->Fill("NTracks<2",1);
+    // Post output data
     PostData(0,fHistList);
     PostData(1,fCFManagerPos->GetParticleContainer());
     PostData(2,fCFManagerNeg->GetParticleContainer());
     return;
   }
 
-  // Process MC truth, therefore we receive the AliAnalysisManager and ask it for the AliMCEventHandler
-  // This handler can return the current MC event
-  
-  AliMCEventHandler *eventHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
-  
-  AliStack* stack = 0x0;
-  AliMCEvent* mcEvent = 0x0;
-  
-  if(eventHandler) {
-    mcEvent = eventHandler->MCEvent();
-    if (!mcEvent) {
-      AliDebug(2,Form("ERROR: Could not retrieve MC event"));
-      fNEventReject->Fill("noMCEvent",1);
-      PostData(0,fHistList);
-      PostData(1,fCFManagerPos->GetParticleContainer());
-      PostData(2,fCFManagerNeg->GetParticleContainer());
-      return;
-    }
-    
-    AliDebug(2,Form("MC particles: %d", mcEvent->GetNumberOfTracks()));
-    
-    stack = mcEvent->Stack();                //Particles Stack
-    
-    AliDebug(2,Form("MC particles stack: %d", stack->GetNtrack()));
+  //MCEvent available? 
+  //if yes: get stack
+  if(fMC) {
+    AliDebug(2,Form("MC particles: %d", fMC->GetNumberOfTracks()));
+    fStack = fMC->Stack();                //Particles Stack
+    AliDebug(2,Form("MC particles stack: %d", fStack->GetNtrack()));
   }
 
-  //___ get MC information __________________________________________________________________
-
+  // ---- Get MC Header information (for MC productions in pThard bins) ----
   Double_t ptHard = 0.;
   Double_t nTrials = 1; // trials for MC trigger weight for real data
   
-  if(mcEvent){
-    AliGenPythiaEventHeader*  pythiaGenHeader = GetPythiaEventHeader(mcEvent);
+  if(fMC){
+    AliGenPythiaEventHeader*  pythiaGenHeader = GetPythiaEventHeader(fMC);
      if(pythiaGenHeader){
        nTrials = pythiaGenHeader->Trials();
        ptHard  = pythiaGenHeader->GetPtHard();
@@ -226,42 +334,6 @@ void AliPWG4HighPtSpectra::Exec(Option_t *)
      }
   }
   
-  const AliESDVertex *vtx = fESD->GetPrimaryVertex();
-  AliDebug(2,Form("Vertex title %s, status %d, nCont %d\n",vtx->GetTitle(), vtx->GetStatus(), vtx->GetNContributors()));
-  // Need vertex cut
-  TString vtxName(vtx->GetName());
-  if(vtx->GetNContributors() < 2 || (vtxName.Contains("TPCVertex")) ) {
-    // SPD vertex
-    vtx = fESD->GetPrimaryVertexSPD();
-    if(vtx->GetNContributors()<2) {
-      vtx = 0x0;
-      fNEventReject->Fill("noVTX",1);
-      // Post output data
-      PostData(0,fHistList);
-      PostData(1,fCFManagerPos->GetParticleContainer());
-      PostData(2,fCFManagerNeg->GetParticleContainer());
-      return;
-    }
-  }
-  
-  double primVtx[3];
-  vtx->GetXYZ(primVtx);
-  if(TMath::Sqrt(primVtx[0]*primVtx[0] + primVtx[1]*primVtx[1])>1. || TMath::Abs(primVtx[2]>10.)){
-    fNEventReject->Fill("ZVTX>10",1);
-    PostData(0,fHistList);
-    PostData(1,fCFManagerPos->GetParticleContainer());
-    PostData(2,fCFManagerNeg->GetParticleContainer());
-    return;
-  }
-  
-  if(!fESD->GetNumberOfTracks() || fESD->GetNumberOfTracks()<2){ 
-    fNEventReject->Fill("NTracks<2",1);
-    // Post output data
-    PostData(0,fHistList);
-    PostData(1,fCFManagerPos->GetParticleContainer());
-    PostData(2,fCFManagerNeg->GetParticleContainer());
-    return;
-  }
   Int_t nTracks = fESD->GetNumberOfTracks();
   AliDebug(2,Form("nTracks %d", nTracks));
 
@@ -279,77 +351,73 @@ void AliPWG4HighPtSpectra::Exec(Option_t *)
   
   
   Double_t containerInputRec[3]       = {0.,0.,0.};
-  Double_t containerInputTPConly[3]   = {0.,0.,0.};
   Double_t containerInputMC[3]        = {0.,0.,0.};
-  Double_t containerInputRecMC[3]     = {0.,0.,0.};
-  Double_t containerInputTPConlyMC[3] = {0.,0.,0.};
+  Double_t containerInputRecMC[3]     = {0.,0.,0.}; //reconstructed yield as function of MC variable
 
   //Now go to rec level
   for (Int_t iTrack = 0; iTrack<nTracks; iTrack++) 
     {   
-      if(!fESD->GetTrack(iTrack) ) continue;
-      AliESDtrack* track = fESD->GetTrack(iTrack);
-      if(!(AliExternalTrackParam *)track->GetTPCInnerParam()) continue;
-      AliExternalTrackParam *trackTPC = (AliExternalTrackParam *)track->GetTPCInnerParam();
-      if(!track || !trackTPC) continue;
+      //Get track for analysis
+      AliESDtrack *track = 0x0;
+      AliESDtrack *esdtrack = fESD->GetTrack(iTrack);
+      if(!esdtrack) continue;
+
+      if(fTrackType==1)
+       track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
+      else if(fTrackType==2) {
+       track = AliESDtrackCuts::GetTPCOnlyTrack(fESD,esdtrack->GetID());
+       if(!track) continue;
+
+       AliExternalTrackParam exParam;
+       Bool_t relate = track->RelateToVertexTPC(fVtx,fESD->GetMagneticField(),kVeryBig,&exParam);
+       if( !relate ) {
+         delete track;
+         continue;
+       }
+       track->Set(exParam.GetX(),exParam.GetAlpha(),exParam.GetParameter(),exParam.GetCovariance());
+      }
+      else
+       track = esdtrack;
+    
+      if(!track) {
+       if(fTrackType==1 || fTrackType==2) delete track;
+       continue;
+      }
+      if(fTrackType==2) {
+       //Cut on chi2 of constrained fit
+       if(track->GetConstrainedChi2TPC() > fSigmaConstrainedMax*fSigmaConstrainedMax) {
+         delete track;
+         continue;
+       }
+      }
+
 
       //fill the container
       containerInputRec[0] = track->Pt();
       containerInputRec[1] = track->Phi();
       containerInputRec[2] = track->Eta();
     
-      //Store TPC Inner Params for TPConly tracks
-      containerInputTPConly[0] = trackTPC->Pt();
-      containerInputTPConly[1] = trackTPC->Phi();
-      containerInputTPConly[2] = trackTPC->Eta();
-
-      AliESDtrack* trackTPCESD = fTrackCutsTPConly->GetTPCOnlyTrack(fESD, iTrack);
-      if(trackTPCESD) {
-       if (fTrackCutsTPConly->AcceptTrack(trackTPCESD)) {
-         if(trackTPC->GetSign()>0.) fCFManagerPos->GetParticleContainer()->Fill(containerInputTPConly,kStepReconstructedTPCOnly);
-         if(trackTPC->GetSign()<0.) fCFManagerNeg->GetParticleContainer()->Fill(containerInputTPConly,kStepReconstructedTPCOnly);
-
-         //Only fill the MC containers if MC information is available
-         if(eventHandler) {
-           Int_t label = TMath::Abs(track->GetLabel());
-           TParticle *particle = stack->Particle(label) ;
-           if(!particle) continue;
-           
-           containerInputTPConlyMC[0] = particle->Pt();      
-           containerInputTPConlyMC[1] = particle->Phi();      
-           containerInputTPConlyMC[2] = particle->Eta();  
-           
-           //Container with primaries
-           if(stack->IsPhysicalPrimary(label)) {
-             if(particle->GetPDG()->Charge()>0.) {
-               fCFManagerPos->GetParticleContainer()->Fill(containerInputMC,kStepReconstructedTPCOnlyMC);
-             }
-             if(particle->GetPDG()->Charge()<0.) {
-               fCFManagerNeg->GetParticleContainer()->Fill(containerInputMC,kStepReconstructedTPCOnlyMC);
-             }
-           }
-         }
-         
-       }
-      }
-
       if (fTrackCuts->AcceptTrack(track)) {
        if(track->GetSign()>0.) fCFManagerPos->GetParticleContainer()->Fill(containerInputRec,kStepReconstructed);
        if(track->GetSign()<0.) fCFManagerNeg->GetParticleContainer()->Fill(containerInputRec,kStepReconstructed);
 
        
        //Only fill the MC containers if MC information is available
-       if(eventHandler) {
+       if(fMC) {
          Int_t label = TMath::Abs(track->GetLabel());
-         TParticle *particle = stack->Particle(label) ;
-         if(!particle) continue;
-
+         TParticle *particle = fStack->Particle(label) ;
+         if(!particle) {
+           if(fTrackType==1 || fTrackType==2)
+             delete track;
+           continue;
+         }
          containerInputRecMC[0] = particle->Pt();      
          containerInputRecMC[1] = particle->Phi();      
          containerInputRecMC[2] = particle->Eta();  
 
          //Container with primaries
-         if(stack->IsPhysicalPrimary(label)) {
+         if(fStack->IsPhysicalPrimary(label)) {
            if(particle->GetPDG()->Charge()>0.) {
              fCFManagerPos->GetParticleContainer()->Fill(containerInputRecMC,kStepReconstructedMC);
            }
@@ -359,38 +427,38 @@ void AliPWG4HighPtSpectra::Exec(Option_t *)
          }
 
          //Container with secondaries
-         if (!stack->IsPhysicalPrimary(label) ) {
+         if (!fStack->IsPhysicalPrimary(label) ) {
            if(particle->GetPDG()->Charge()>0.) {
-             fCFManagerPos->GetParticleContainer()->Fill(containerInputRec,kStepSecondaries);
+             fCFManagerPos->GetParticleContainer()->Fill(containerInputMC,kStepSecondaries);
            }
            if(particle->GetPDG()->Charge()<0.) {
-             fCFManagerNeg->GetParticleContainer()->Fill(containerInputRec,kStepSecondaries);
+             fCFManagerNeg->GetParticleContainer()->Fill(containerInputMC,kStepSecondaries);
            }
          }
        }
        
-      }//trackCuts
+      }//trackCuts global tracks
 
-      delete trackTPCESD;
+      if(fTrackType==1 || fTrackType==2)
+       delete track;
     }//track loop
   
 
   //Fill MC containters if particles are findable
-  if(eventHandler) {
-    for(int iPart = 1; iPart<(mcEvent->GetNumberOfPrimaries()); iPart++)//stack->GetNprimary();
-      {
-       AliMCParticle *mcPart  = (AliMCParticle*)mcEvent->GetTrack(iPart);
-       if(!mcPart) continue;
-       //fill the container
-       containerInputMC[0] = mcPart->Pt();
-       containerInputMC[1] = mcPart->Phi();      
-       containerInputMC[2] = mcPart->Eta();  
-
-       if(stack->IsPhysicalPrimary(iPart)) {
-         if(mcPart->Charge()>0. && fCFManagerPos->CheckParticleCuts(kStepMCAcceptance,mcPart)) fCFManagerPos->GetParticleContainer()->Fill(containerInputMC,kStepMCAcceptance);
-         if(mcPart->Charge()<0. && fCFManagerNeg->CheckParticleCuts(kStepMCAcceptance,mcPart)) fCFManagerNeg->GetParticleContainer()->Fill(containerInputMC,kStepMCAcceptance);
-       }
+  if(fMC) {
+    for(int iPart = 1; iPart<(fMC->GetNumberOfPrimaries()); iPart++) {
+      AliMCParticle *mcPart  = (AliMCParticle*)fMC->GetTrack(iPart);
+      if(!mcPart) continue;
+      //fill the container
+      containerInputMC[0] = mcPart->Pt();
+      containerInputMC[1] = mcPart->Phi();      
+      containerInputMC[2] = mcPart->Eta();  
+      
+      if(fStack->IsPhysicalPrimary(iPart)) {
+       if(mcPart->Charge()>0. && fCFManagerPos->CheckParticleCuts(kStepMCAcceptance,mcPart)) fCFManagerPos->GetParticleContainer()->Fill(containerInputMC,kStepMCAcceptance);
+       if(mcPart->Charge()<0. && fCFManagerNeg->CheckParticleCuts(kStepMCAcceptance,mcPart)) fCFManagerNeg->GetParticleContainer()->Fill(containerInputMC,kStepMCAcceptance);
       }
+    }
   }
   
   PostData(0,fHistList);
@@ -556,8 +624,21 @@ void AliPWG4HighPtSpectra::CreateOutputObjects() {
   fHistList->Add(fNEventSel);
 
   fNEventReject = new TH1F("fNEventReject","Reason events are rejectected for analysis",20,0,20);
+  //Set labels
+  fNEventReject->Fill("noESD",0);
+  fNEventReject->Fill("Trigger",0);
+  fNEventReject->Fill("NTracks<2",0);
+  fNEventReject->Fill("noVTX",0);
+  fNEventReject->Fill("VtxStatus",0);
+  fNEventReject->Fill("NCont<2",0);
+  fNEventReject->Fill("ZVTX>10",0);
+  fNEventReject->Fill("cent",0);
+  fNEventReject->Fill("cent>90",0);
   fHistList->Add(fNEventReject);
 
+  fh1Centrality = new TH1F("fh1Centrality","fh1Centrality; Centrality %",100,0,100);
+  fHistList->Add(fh1Centrality);
+
   fh1Xsec = new TProfile("fh1Xsec","xsec from pyxsec.root",1,0,1);
   fh1Xsec->GetXaxis()->SetBinLabel(1,"<#sigma>");
   fHistList->Add(fh1Xsec);
@@ -573,6 +654,10 @@ void AliPWG4HighPtSpectra::CreateOutputObjects() {
 
   TH1::AddDirectory(oldStatus);   
 
+  PostData(0,fHistList);
+  PostData(1,fCFManagerPos->GetParticleContainer());
+  PostData(2,fCFManagerNeg->GetParticleContainer());
+
 }
 
 #endif