]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Added jet cores task for PP (F. Krizek)
authorkleinb <kleinb@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 12 Mar 2013 09:55:17 +0000 (09:55 +0000)
committerkleinb <kleinb@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 12 Mar 2013 09:55:17 +0000 (09:55 +0000)
PWGJE/AliAnalysisTaskJetCorePP.cxx [new file with mode: 0644]
PWGJE/AliAnalysisTaskJetCorePP.h [new file with mode: 0644]
PWGJE/CMakelibPWGJE.pkg
PWGJE/PWGJELinkDef.h
PWGJE/macros/AddTaskJetCorePP.C [new file with mode: 0644]

diff --git a/PWGJE/AliAnalysisTaskJetCorePP.cxx b/PWGJE/AliAnalysisTaskJetCorePP.cxx
new file mode 100644 (file)
index 0000000..7b243b7
--- /dev/null
@@ -0,0 +1,677 @@
+
+// ******************************************
+// This task computes several jet observables like 
+// the fraction of energy in inner and outer coronnas,
+// jet-track correlations,triggered jet shapes and 
+// correlation strength distribution of particles inside jets.    
+// Author: lcunquei@cern.ch
+// *******************************************
+
+
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+
+#include "TChain.h"
+#include "TTree.h"
+#include "TMath.h"
+#include "TH1F.h"
+#include "TH1D.h"
+#include "TH2F.h"
+#include "TH3F.h"
+#include "THnSparse.h"
+#include "TCanvas.h"
+
+#include "AliLog.h"
+
+#include "AliAnalysisTask.h"
+#include "AliAnalysisManager.h"
+
+#include "AliVEvent.h"
+#include "AliESDEvent.h"
+#include "AliESDInputHandler.h"
+#include "AliCentrality.h"
+#include "AliAnalysisHelperJetTasks.h"
+#include "AliInputEventHandler.h"
+#include "AliAODJetEventBackground.h"
+#include "AliAODMCParticle.h"
+//#include "AliAnalysisTaskFastEmbedding.h"
+#include "AliAODEvent.h"
+#include "AliAODHandler.h"
+#include "AliAODJet.h"
+
+#include "AliAnalysisTaskJetCorePP.h"
+
+using std::cout;
+using std::endl;
+
+ClassImp(AliAnalysisTaskJetCorePP)
+
+//Filip Krizek 1st March 2013
+
+//---------------------------------------------------------------------
+AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP() :
+AliAnalysisTaskSE(),
+fESD(0x0),
+fAODIn(0x0),
+fAODOut(0x0),
+fAODExtension(0x0),
+fJetBranchName(""),
+//fListJets(0x0),
+fNonStdFile(""),
+fSystem(0), //pp=0  pPb=1
+fJetParamR(0.4),
+fOfflineTrgMask(AliVEvent::kAny),
+fMinContribVtx(1),
+fVtxZMin(-10.0),
+fVtxZMax(10.0),
+fFilterMask(0),
+fCentMin(0.0),
+fCentMax(100.0),
+fJetEtaMin(-0.5),
+fJetEtaMax(0.5),
+fTriggerEtaCut(0.9),
+fTrackEtaCut(0.9),
+fTrackLowPtCut(0.15),
+fOutputList(0x0),
+fHistEvtSelection(0x0),
+fh2Ntriggers(0x0),
+fHJetSpec(0x0),
+fHJetDensity(0x0),
+fHJetDensityA4(0x0),
+fhJetPhi(0x0),
+fhTriggerPhi(0x0),
+fhJetEta(0x0),
+fhTriggerEta(0x0),
+fhVertexZ(0x0),
+fhVertexZAccept(0x0),
+fhContribVtx(0x0),
+fhContribVtxAccept(0x0),
+fhDphiTriggerJet(0x0),
+fhDphiTriggerJetAccept(0x0),
+fhCentrality(0x0),
+fhCentralityAccept(0x0),
+fkAcceptance(2.0*TMath::Pi()*1.8)
+{
+   // default Constructor
+   fListJets = new TList();
+}
+
+//---------------------------------------------------------------------
+
+AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP(const char *name) :
+AliAnalysisTaskSE(name),
+fESD(0x0),
+fAODIn(0x0),
+fAODOut(0x0),
+fAODExtension(0x0),
+fJetBranchName(""),
+//fListJets(0x0),
+fNonStdFile(""),
+fSystem(0),  //pp=0   pPb=1
+fJetParamR(0.4),
+fOfflineTrgMask(AliVEvent::kAny),
+fMinContribVtx(1),
+fVtxZMin(-10.0),
+fVtxZMax(10.0),
+fFilterMask(0),
+fCentMin(0.0),
+fCentMax(100.0),
+fJetEtaMin(-0.5),
+fJetEtaMax(0.5),
+fTriggerEtaCut(0.9),
+fTrackEtaCut(0.9),
+fTrackLowPtCut(0.15),
+fOutputList(0x0),
+fHistEvtSelection(0x0),
+fh2Ntriggers(0x0),
+fHJetSpec(0x0),
+fHJetDensity(0x0),
+fHJetDensityA4(0x0),
+fhJetPhi(0x0),
+fhTriggerPhi(0x0),
+fhJetEta(0x0),
+fhTriggerEta(0x0),
+fhVertexZ(0x0),
+fhVertexZAccept(0x0),
+fhContribVtx(0x0),
+fhContribVtxAccept(0x0),
+fhDphiTriggerJet(0x0),
+fhDphiTriggerJetAccept(0x0),
+fhCentrality(0x0),
+fhCentralityAccept(0x0),
+fkAcceptance(2.0*TMath::Pi()*1.8)
+{
+   // Constructor
+   fListJets = new TList();
+
+   DefineOutput(1, TList::Class());
+}
+
+//--------------------------------------------------------------
+AliAnalysisTaskJetCorePP::AliAnalysisTaskJetCorePP(const AliAnalysisTaskJetCorePP& a):
+AliAnalysisTaskSE(a.GetName()),
+fESD(a.fESD),
+fAODIn(a.fAODIn),
+fAODOut(a.fAODOut),
+fAODExtension(a.fAODExtension),
+fJetBranchName(a.fJetBranchName),
+fListJets(a.fListJets),
+fNonStdFile(a.fNonStdFile),
+fSystem(a.fSystem),  
+fJetParamR(a.fJetParamR),
+fOfflineTrgMask(a.fOfflineTrgMask),
+fMinContribVtx(a.fMinContribVtx),
+fVtxZMin(a.fVtxZMin),
+fVtxZMax(a.fVtxZMax),
+fFilterMask(a.fFilterMask),
+fCentMin(a.fCentMin),
+fCentMax(a.fCentMax),
+fJetEtaMin(a.fJetEtaMin),
+fJetEtaMax(a.fJetEtaMax),
+fTriggerEtaCut(a.fTriggerEtaCut),
+fTrackEtaCut(a.fTrackEtaCut),
+fTrackLowPtCut(a.fTrackLowPtCut),
+fOutputList(a.fOutputList),
+fHistEvtSelection(a.fHistEvtSelection),
+fh2Ntriggers(a.fh2Ntriggers),
+fHJetSpec(a.fHJetSpec),
+fHJetDensity(a.fHJetDensity),
+fHJetDensityA4(a.fHJetDensityA4),
+fhJetPhi(a.fhJetPhi),
+fhTriggerPhi(a.fhTriggerPhi),
+fhJetEta(a.fhJetEta),
+fhTriggerEta(a.fhTriggerEta),
+fhVertexZ(a.fhVertexZ),
+fhVertexZAccept(a.fhVertexZAccept),
+fhContribVtx(a.fhContribVtx),
+fhContribVtxAccept(a.fhContribVtxAccept),
+fhDphiTriggerJet(a.fhDphiTriggerJet),
+fhDphiTriggerJetAccept(a.fhDphiTriggerJetAccept),
+fhCentrality(a.fhCentrality),
+fhCentralityAccept(a.fhCentralityAccept),
+fkAcceptance(a.fkAcceptance)
+{
+   //Copy Constructor
+}
+//--------------------------------------------------------------
+
+AliAnalysisTaskJetCorePP& AliAnalysisTaskJetCorePP::operator = (const AliAnalysisTaskJetCorePP& a){
+  // assignment operator
+  this->~AliAnalysisTaskJetCorePP();
+  new(this) AliAnalysisTaskJetCorePP(a);
+  return *this;
+}
+//--------------------------------------------------------------
+
+AliAnalysisTaskJetCorePP::~AliAnalysisTaskJetCorePP()
+{
+   //Destructor 
+   delete fListJets;
+   delete fOutputList; // ????
+}
+
+//--------------------------------------------------------------
+
+void AliAnalysisTaskJetCorePP::Init()
+{
+   // check for jet branches
+   if(!strlen(fJetBranchName.Data())){
+      AliError("Jet branch name not set.");
+   }
+
+}
+
+//--------------------------------------------------------------
+
+void AliAnalysisTaskJetCorePP::UserCreateOutputObjects()
+{
+
+
+  // Create histograms
+   // Called once
+   OpenFile(1);
+   if(!fOutputList) fOutputList = new TList();
+   fOutputList->SetOwner(kTRUE);
+
+   Bool_t oldStatus = TH1::AddDirectoryStatus();
+   TH1::AddDirectory(kFALSE);
+
+   fHistEvtSelection = new TH1I("fHistEvtSelection", "event selection", 6, -0.5, 5.5);
+   fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
+   fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
+   fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
+   fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
+   fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
+   fHistEvtSelection->GetXaxis()->SetBinLabel(6,"multiplicity (rejected)");
+   
+   fOutputList->Add(fHistEvtSelection);
+
+   Int_t nBinsCentrality = (fSystem==0) ? 1 : 10; // pp=1 else 10
+    
+   fh2Ntriggers = new TH2F("fh2Ntriggers","# of triggers",
+                             nBinsCentrality,0.0,100.0,50,0.0,50.0);
+
+   //Centrality, A, pT - rho*A, pTtrigg, pT, rho*A
+   const Int_t dimSpec   = 6;
+   const Int_t nBinsSpec[dimSpec]     = {nBinsCentrality, 100,  140,  50, 100,  50};
+   const Double_t lowBinSpec[dimSpec] = {0.0,             0.0,-80.0, 0.0, 0.0, 0.0};
+   const Double_t hiBinSpec[dimSpec]  = {100.0,           1.0,200.0,50.0, 200, 20.0};
+   fHJetSpec = new THnSparseF("fHJetSpec","Recoil jet spectrum [cent,A,pT-rho*A,pTtrig]",
+                                          dimSpec,nBinsSpec,lowBinSpec,hiBinSpec);
+   fOutputList->Add(fHJetSpec);  
+
+   //------------------- HISTOS FOR DIAGNOSTIC ----------------------
+   //Jet number density histos [Trk Mult, jet density, pT trigger]
+   const Int_t    dimJetDens   = 3;
+   const Int_t    nBinsJetDens[dimJetDens]  = {100,   100, 10};
+   const Double_t lowBinJetDens[dimJetDens] = {0.0,   0.0,  0.0};
+   const Double_t hiBinJetDens[dimJetDens]  = {500.0, 5.0, 50.0 };
+
+   fHJetDensity = new THnSparseF("fHJetDensity","Jet dens vs trk mult A>0.07",
+                                   dimJetDens,nBinsJetDens,lowBinJetDens,hiBinJetDens);
+
+   fHJetDensityA4 =new THnSparseF("fHJetDensityA4","Jet dens vs trk mult A>0.4",
+                                   dimJetDens,nBinsJetDens,lowBinJetDens,hiBinJetDens);
+
+   fOutputList->Add(fh2Ntriggers);
+   fOutputList->Add(fHJetDensity);
+   fOutputList->Add(fHJetDensityA4);
+         
+
+   //inclusive azimuthal and pseudorapidity histograms
+   fhJetPhi = new TH1D("fhJetPhi","Azim dist jets",50,-TMath::Pi(),TMath::Pi());
+   fhTriggerPhi= new TH1D("fhTriggerPhi","azim dist trig had",50,-TMath::Pi(),TMath::Pi());
+   fhJetEta = new TH1D("fhJetEta","Eta dist jets",40,-0.9,0.9);
+   fhTriggerEta = new TH1D("fhTriggerEta","Eta dist trig had",40,-0.9,0.9);
+   fhVertexZ = new TH1D("fhVertexZ","z vertex",40,-20,20);  
+   fhVertexZAccept = new TH1D("fhVertexZAccept","z vertex after cut",40,-20,20);  
+   fhContribVtx = new TH1D("fhContribVtx","contrib to vtx",200,0,200);   
+   fhContribVtxAccept = new TH1D("fhContribVtxAccept","contrib to vtx after cut",200,0,200);   
+   fhDphiTriggerJet = new TH1D("fhDphiTriggerJet","Deltaphi trig-jet",50, -TMath::Pi(),TMath::Pi()); 
+   fhDphiTriggerJetAccept = new TH1D("fhDphiTriggerJetAccept","Deltaphi trig-jet after cut",50, -TMath::Pi(),TMath::Pi()); 
+   fhCentrality = new TH1D("fhCentrality","Centrality",20,0,100);
+   fhCentralityAccept = new TH1D("fhCentralityAccept","Centrality after cut",20,0,100);
+
+   fOutputList->Add(fhJetPhi);
+   fOutputList->Add(fhTriggerPhi);
+   fOutputList->Add(fhJetEta);
+   fOutputList->Add(fhTriggerEta);
+   fOutputList->Add(fhVertexZ);    
+   fOutputList->Add(fhVertexZAccept);    
+   fOutputList->Add(fhContribVtx); 
+   fOutputList->Add(fhContribVtxAccept); 
+   fOutputList->Add(fhDphiTriggerJet);
+   fOutputList->Add(fhDphiTriggerJetAccept);
+   fOutputList->Add(fhCentrality); 
+   fOutputList->Add(fhCentralityAccept);
+
+
+   // =========== Switch on Sumw2 for all histos ===========
+   for(Int_t i=0; i<fOutputList->GetEntries(); i++){
+      TH1 *h1 = dynamic_cast<TH1*>(fOutputList->At(i));
+      if(h1){
+         h1->Sumw2();
+         continue;
+      }
+      THnSparse *hn = dynamic_cast<THnSparse*>(fOutputList->At(i));
+      if(hn){
+         hn->Sumw2();
+      }          
+   }
+   TH1::AddDirectory(oldStatus);
+
+   PostData(1, fOutputList);
+}
+
+//--------------------------------------------------------------------
+
+void AliAnalysisTaskJetCorePP::UserExec(Option_t *)
+{
+
+   //Event loop
+
+   if(TMath::Abs((Float_t) fJetParamR)<0.00001){
+      AliError("Cone radius is set to zero.");
+      return;
+   }
+   if(!strlen(fJetBranchName.Data())){
+      AliError("Jet branch name not set.");
+      return;
+   }
+
+   fESD = dynamic_cast<AliESDEvent*>(InputEvent());
+   if(!fESD){
+      AliError("ESD not available");
+      fAODIn = dynamic_cast<AliAODEvent*>(InputEvent());
+   } 
+   fAODOut = dynamic_cast<AliAODEvent*>(AODEvent());
+   AliAODEvent* aod = NULL;
+   // take all other information from the aod we take the tracks from
+   if(!aod){
+      if(!fESD) aod = fAODIn;
+      else      aod = fAODOut;
+   }
+
+   if(fNonStdFile.Length()!=0){
+      // case that we have an AOD extension we can fetch the jets from the extended output
+      AliAODHandler *aodH = dynamic_cast<AliAODHandler*>(AliAnalysisManager::GetAnalysisManager()->GetOutputEventHandler());
+      fAODExtension = aodH ? aodH->GetExtension(fNonStdFile.Data()) : 0;
+      if(!fAODExtension){
+         if(fDebug>1) Printf("AODExtension found for %s",fNonStdFile.Data());
+      } 
+   }
+    
+   // ----------------- event selection --------------------------
+   fHistEvtSelection->Fill(1); // number of events before event selection
+
+   // physics selection
+   AliInputEventHandler* inputHandler = (AliInputEventHandler*)
+           ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
+
+   if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
+      if(fDebug) Printf(" Trigger Selection: event REJECTED ... ");
+      fHistEvtSelection->Fill(2);
+      PostData(1, fOutputList);
+      return;
+   }
+  
+   //check AOD pointer
+   if(!aod){
+      if(fDebug) Printf("%s:%d No AOD",(char*)__FILE__,__LINE__);
+      fHistEvtSelection->Fill(3);
+      PostData(1, fOutputList);
+      return;
+   }
+   
+   // vertex selection
+   AliAODVertex* primVtx = aod->GetPrimaryVertex();
+
+   if(!primVtx){
+      if(fDebug) Printf("%s:%d No primVtx",(char*)__FILE__,__LINE__);
+      fHistEvtSelection->Fill(3);
+      PostData(1, fOutputList);
+      return;
+   }
+
+   Int_t nTracksPrim = primVtx->GetNContributors();
+   Float_t vtxz = primVtx->GetZ();
+   //Input events
+   fhContribVtx->Fill(nTracksPrim);
+   if( nTracksPrim > 0 ) fhVertexZ->Fill(vtxz);
+
+   if((nTracksPrim < fMinContribVtx) ||
+      (vtxz < fVtxZMin) ||
+      (vtxz > fVtxZMax)){
+      if(fDebug) Printf("%s:%d primary vertex z = %f: event REJECTED...",
+                         (char*)__FILE__,__LINE__,vtxz);
+      fHistEvtSelection->Fill(3);
+      PostData(1, fOutputList);
+      return;
+   }else{
+      //Accepted events
+      fhContribVtxAccept->Fill(nTracksPrim);
+      fhVertexZAccept->Fill(vtxz);
+   }
+   //FK// No event class selection imposed
+   // event class selection (from jet helper task)
+   //Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
+   //if(fDebug) Printf("Event class %d", eventClass);
+   //if(eventClass < fEvtClassMin || eventClass > fEvtClassMax){
+   //   fHistEvtSelection->Fill(4);
+   //   PostData(1, fOutputList);
+   //   return;
+   //}
+
+   // centrality selection
+   AliCentrality *cent = 0x0;
+   Double_t centValue  = 0.0; 
+   if(fSystem){  //fSystem=0 for pp,   fSystem=1 for pPb
+      if(fESD){
+         cent = fESD->GetCentrality();
+         if(cent) centValue = cent->GetCentralityPercentile("V0M");
+      }else{
+         centValue = aod->GetHeader()->GetCentrality();
+      }   
+      if(fDebug) printf("centrality: %f\n", centValue);
+      //Input events
+      fhCentrality->Fill(centValue); 
+
+      if(centValue < fCentMin || centValue > fCentMax){
+         fHistEvtSelection->Fill(4);
+         PostData(1, fOutputList);
+         return;
+      }else{
+         //Accepted events
+         fhCentralityAccept->Fill( centValue );
+      }
+   }
+   if(fDebug) std::cout<<" ACCEPTED EVENT "<<endl;
+  
+   fHistEvtSelection->Fill(0); // accepted events 
+   // ------------------- end event selection --------------------
+
+   // fetch jets
+   TClonesArray *aodJets = 0x0;
+   
+   if(fAODOut && !aodJets){
+      aodJets = dynamic_cast<TClonesArray*>(fAODOut->FindListObject(fJetBranchName.Data()));
+   }
+   if(fAODExtension && !aodJets){ 
+      aodJets = dynamic_cast<TClonesArray*>(fAODExtension->GetAOD()->FindListObject(fJetBranchName.Data()));
+   } 
+   if(fAODIn && !aodJets){
+      aodJets = dynamic_cast<TClonesArray*>(fAODIn->FindListObject(fJetBranchName.Data())); 
+   }
+
+   // ------------- Hadron trigger --------------
+   TList particleList; //list of tracks
+   Int_t indexTrigg = GetListOfTracks(&particleList); //index of trigger hadron in Particle list
+   
+   if(indexTrigg<0) return; // no trigger track found 
+
+   AliVParticle *triggerHadron = (AliVParticle*) particleList.At(indexTrigg);     
+   if(!triggerHadron){  
+      PostData(1, fOutputList);
+      return;
+   }
+
+
+   fh2Ntriggers->Fill(centValue,triggerHadron->Pt()); //trigger pT
+
+ //  if(triggerHadron->Pt() > 10.0){}
+   if(triggerHadron->Pt() > 3.0){
+      //Trigger Diagnostics---------------------------------
+      fhTriggerPhi->Fill(RelativePhi(triggerHadron->Phi(),0.0)); //phi -pi,pi
+      fhTriggerEta->Fill(triggerHadron->Eta());
+   }
+
+   //--------- Fill list of jets -------------- 
+   fListJets->Clear();
+   if(aodJets){
+      if(fDebug) Printf("########## %s: %d jets",fJetBranchName.Data(),
+                                      aodJets->GetEntriesFast());
+      for(Int_t iJet = 0; iJet < aodJets->GetEntriesFast(); iJet++) {
+         AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets)[iJet]);
+         if (jet) fListJets->Add(jet);
+      }
+   }
+   
+   Double_t etaJet  = 0.0;
+   Double_t pTJet   = 0.0;
+   Double_t areaJet = 0.0;
+   Double_t phiJet  = 0.0;
+   Int_t injet4 = 0;
+   Int_t injet  = 0;  
+   //---------- jet loop ---------
+   for(Int_t ij=0; ij<fListJets->GetEntries(); ij++){
+      AliAODJet* jet = (AliAODJet*)(fListJets->At(ij));
+      if(!jet) continue;
+      etaJet  = jet->Eta();
+      phiJet  = jet->Phi();
+      pTJet   = jet->Pt();
+      if(pTJet==0) continue; 
+     
+      if((etaJet<fJetEtaMin) || (etaJet>fJetEtaMax)) continue;
+      areaJet = jet->EffectiveAreaCharged();
+      
+      //Jet Diagnostics---------------------------------
+      fhJetPhi->Fill(RelativePhi(phiJet,0.0)); //phi -pi,pi
+      fhJetEta->Fill(etaJet);
+      if(areaJet >= 0.07) injet++; 
+      if(areaJet >= 0.4)  injet4++;
+      //--------------------------------------------------
+
+      Double_t dphi = RelativePhi(triggerHadron->Phi(), phiJet); 
+   
+      fhDphiTriggerJet->Fill(dphi); //Input
+      if(TMath::Abs((Double_t) dphi) < TMath::Pi()-0.6) continue;
+      fhDphiTriggerJetAccept->Fill(dphi); //Accepted
+
+      //Background w.r.t. jet axis
+      Double_t pTBckWrtJet = 
+         GetBackgroundInPerpCone(fJetParamR, phiJet, etaJet, &particleList);
+
+      Double_t ratioOfAreas = areaJet/(TMath::Pi()*fJetParamR*fJetParamR);
+      Double_t rhoA = ratioOfAreas*pTBckWrtJet; //bg activity in a cone of similar size
+      Double_t ptcorr = pTJet - rhoA; //Pt Jet UE subtr 
+
+  
+      //Centrality, A, pT - rho*A, pTtrigg, pT, rho*A
+      Double_t fillspec[] = { centValue,
+                              areaJet,
+                              ptcorr,
+                              triggerHadron->Pt(),
+                              pTJet,
+                              rhoA
+                            };
+      fHJetSpec->Fill(fillspec);
+          
+   }//jet loop
+   
+   //Fill Jet Density In the Event A>0.07
+   if(injet>0){
+      Double_t filldens[]={ (Double_t) particleList.GetEntries(),
+                            injet/fkAcceptance,
+                            triggerHadron->Pt()
+                          };
+      fHJetDensity->Fill(filldens);
+   }
+
+   //Fill Jet Density In the Event A>0.4
+   if(injet4>0){ 
+      Double_t filldens4[]={ (Double_t) particleList.GetEntries(), 
+                             injet4/fkAcceptance,
+                             triggerHadron->Pt()
+                           };
+      fHJetDensityA4->Fill(filldens4);
+   }
+
+   PostData(1, fOutputList);
+}
+
+//----------------------------------------------------------------------------
+void AliAnalysisTaskJetCorePP::Terminate(const Option_t *)
+{
+   // Draw result to the screen
+   // Called once at the end of the query
+
+   if(fDebug) printf("AliAnalysisTaskJetCorePP DONE\n");
+   if(!GetOutputData(1)) return;
+}
+
+
+//----------------------------------------------------------------------------
+Int_t  AliAnalysisTaskJetCorePP::GetListOfTracks(TList *list){
+   //Fill the list of accepted tracks (passed track cut)
+   //return consecutive index of the hardest ch hadron in the list
+   Int_t iCount        = 0;
+   AliAODEvent *aodevt = NULL;
+
+   if(!fESD) aodevt = fAODIn;
+   else      aodevt = fAODOut;   
+
+   if(!aodevt) return -1;
+
+   Int_t    index = -1; //index of the highest particle in the list
+   Double_t ptmax = -10;
+
+   for(int it = 0; it < aodevt->GetNumberOfTracks(); it++){
+      AliAODTrack *tr = aodevt->GetTrack(it);
+      
+      //if((fFilterMask > 0) && !(tr->TestFilterBit(fFilterMask))) continue;
+      if((fFilterMask > 0) && !(tr->IsHybridGlobalConstrainedGlobal())) continue;
+      if(TMath::Abs((Float_t) tr->Eta()) > fTrackEtaCut) continue;
+      if(tr->Pt() < fTrackLowPtCut) continue;
+      list->Add(tr);
+      if(tr->Pt()>ptmax){ 
+         ptmax = tr->Pt();     
+         index = iCount;
+      }
+      iCount++;
+   }
+
+   if(index>-1){ //check pseudorapidity cut on trigger
+      AliAODTrack *trigger = (AliAODTrack*) list->At(index);
+      if(trigger && TMath::Abs((Float_t) trigger->Eta())< fTriggerEtaCut){ return index;} 
+      return -1;
+   }else{
+     return -1;
+   }
+}
+
+//----------------------------------------------------------------------------
+
+Double_t AliAnalysisTaskJetCorePP::GetBackgroundInPerpCone(Float_t jetR, Double_t jetPhi, Double_t jetEta, TList* trkList){
+   //calculate sum of track pT in the cone perpendicular in phi to the jet 
+   //jetR = cone radius
+   // jetPhi, jetEta = direction of the jet 
+   Int_t numberOfTrks = trkList->GetEntries();
+   Double_t pTsum = 0.0;
+   Double_t perpConePhi = jetPhi + TMath::Pi()/2;//perp cone w.r.t. jet in phi
+   for(Int_t it=0; it<numberOfTrks; it++){
+      AliVParticle *trk = (AliVParticle*) trkList->At(it); 
+      Double_t dphi = RelativePhi(perpConePhi,trk->Phi());     
+      Double_t deta = trk->Eta()-jetEta;     
+
+      if( (dphi*dphi + deta*deta)< (jetR*jetR)){
+         pTsum += trk->Pt();
+      } 
+   }
+
+   return pTsum;
+}
+
+//----------------------------------------------------------------------------
+
+Double_t AliAnalysisTaskJetCorePP::RelativePhi(Double_t mphi,Double_t vphi){
+   //Get relative azimuthal angle of two particles -pi to pi
+   if      (vphi < -TMath::Pi()) vphi += TMath::TwoPi();
+   else if (vphi > TMath::Pi())  vphi -= TMath::TwoPi();
+
+   if      (mphi < -TMath::Pi()) mphi += TMath::TwoPi();
+   else if (mphi > TMath::Pi())  mphi -= TMath::TwoPi();
+
+   Double_t dphi = mphi - vphi;
+   if      (dphi < -TMath::Pi()) dphi += TMath::TwoPi();
+   else if (dphi > TMath::Pi())  dphi -= TMath::TwoPi();
+
+   return dphi;//dphi in [-Pi, Pi]
+}
+
+
diff --git a/PWGJE/AliAnalysisTaskJetCorePP.h b/PWGJE/AliAnalysisTaskJetCorePP.h
new file mode 100644 (file)
index 0000000..547ceb5
--- /dev/null
@@ -0,0 +1,119 @@
+#ifndef ALIANALYSISTASKJETCOREPP_H
+#define ALIANALYSISTASKJETCOREPP_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+// **************************************
+// This task performs hadron-trigger recoil jet correlations 
+// Output pT spectrum of jet given trigger pT 
+// Author: filip krizek 1st March 2013
+// *******************************************
+
+class TH1F;
+class TH1D;
+class TH1I;
+class TH2F;
+class TH3F;
+class THnSparse;
+class AliESDEvent;
+class AliAODExtension;
+class AliAODEvent;
+
+#include "AliAnalysisTaskSE.h"
+#include "AliVEvent.h"
+
+class AliAnalysisTaskJetCorePP : public AliAnalysisTaskSE {
+public:
+   AliAnalysisTaskJetCorePP();
+   AliAnalysisTaskJetCorePP(const char *name);
+   AliAnalysisTaskJetCorePP(const AliAnalysisTaskJetCorePP& a); 
+   AliAnalysisTaskJetCorePP& operator=(const AliAnalysisTaskJetCorePP& a); // not implemented
+   virtual ~AliAnalysisTaskJetCorePP();
+   virtual void  LocalInit() {Init();}
+   virtual void  Init();
+   virtual void  UserCreateOutputObjects();
+   virtual void  UserExec(Option_t *option);
+   virtual void  Terminate(const Option_t*);
+   virtual void  SetBranchName(const TString &name){ fJetBranchName = name; } 
+   virtual void  SetNonStdFile(char* c){fNonStdFile = c;} 
+   virtual void  SetSystem(Int_t sys) { fSystem = sys; } 
+   virtual void  SetJetR(Float_t jR) { fJetParamR = jR; }
+   virtual void  SetOfflineTrgMask(AliVEvent::EOfflineTriggerTypes mask) { fOfflineTrgMask = mask; } 
+   virtual void  SetMinContribVtx(Int_t n) { fMinContribVtx = n; } 
+   virtual void  SetVtxZMin(Float_t z) { fVtxZMin = z; }
+   virtual void  SetVtxZMax(Float_t z) { fVtxZMax = z; } 
+   virtual void  SetFilterMask(UInt_t i){fFilterMask = i;} 
+   virtual void  SetCentMin(Float_t cent) { fCentMin = cent; }
+   virtual void  SetCentMax(Float_t cent) { fCentMax = cent; } 
+   virtual void  SetJetEtaMin(Float_t eta) { fJetEtaMin = eta; }
+   virtual void  SetJetEtaMax(Float_t eta) { fJetEtaMax = eta; } 
+   virtual void  SetTriggerEtaCut(Float_t eta) { fTriggerEtaCut = eta; }
+   virtual void  SetTrackEtaCut(Float_t eta) { fTrackEtaCut = eta; }
+   virtual void  SetTrackLowPtCut(Float_t pt) { fTrackLowPtCut=pt; } 
+
+   Double_t RelativePhi(Double_t angle1, Double_t angle2); 
+
+private:
+   //private member functions
+   Int_t   GetListOfTracks(TList *list); //returns index of trig and track list 
+   Double_t GetBackgroundInPerpCone(Float_t jetR, Double_t jetPhi, Double_t jetEta, TList* trkList); //sums pT in the cone perp in phi to jet
+   //private member objects
+   AliESDEvent *fESD;    //! ESD object
+   AliAODEvent *fAODIn;  //! AOD event for AOD input tracks
+   AliAODEvent *fAODOut; //! AOD event 
+   AliAODExtension  *fAODExtension; //! where we take the jets from can be input or output AOD
+
+   // jets to compare
+   TString fJetBranchName; //  name of jet branch 
+   TList  *fListJets;      //! jet lists  
+
+   TString fNonStdFile;    // name of delta aod file to catch the extension
+
+   // event selection
+   Int_t   fSystem;        // collision system  pp=0, pPb=1  
+   Float_t fJetParamR;     // jet cone resolution (radius) R 
+   AliVEvent::EOfflineTriggerTypes fOfflineTrgMask; // mask of offline trigs 
+   Int_t   fMinContribVtx; // min numb of trk contrib for prim vertex 
+   Float_t fVtxZMin;      // lower bound on vertex z 
+   Float_t fVtxZMax;      // upper bound on vertex z 
+   UInt_t  fFilterMask;    // filter bit for slected tracks  
+   Float_t fCentMin;      // lower bound on centrality 
+   Float_t fCentMax;      // upper bound on centrality 
+   Float_t fJetEtaMin;     // lower bound on eta for found jets 
+   Float_t fJetEtaMax;     // upper bound on eta for found jets 
+   Float_t fTriggerEtaCut; // lower bound on eta for trigger track
+   Float_t fTrackEtaCut;   // upper bound on eta for trigger track 
+   Float_t fTrackLowPtCut; // upper bound on eta for trigger track
+   
+   
+   TList *fOutputList;          //! output data container 
+   TH1I  *fHistEvtSelection;    //! event selection statistic 
+   TH2F      *fh2Ntriggers;     //trigger pT versus centrality 
+   THnSparse *fHJetSpec;      //Recoil jet spectrum  
+   
+   //Diagnostics
+   THnSparse *fHJetDensity;       //density of jet with A>0.07  //fk
+   THnSparse *fHJetDensityA4;     //density of jets with A>0.4 //fk
+   TH1D *fhJetPhi;     //Azimuthal distribution of jets
+   TH1D *fhTriggerPhi; //Azimuthal distribution of trigger hadron
+   TH1D *fhJetEta;     //Pseudorapidity distribution of jets
+   TH1D *fhTriggerEta; //Pseudorapidity distribution of trigger hadron
+   TH1D *fhVertexZ;    //z vertex distribution 
+   TH1D *fhVertexZAccept;    //z vertex distribution after cut
+   TH1D *fhContribVtx;    //contributors to vertex 
+   TH1D *fhContribVtxAccept;    //contributors to vertex after cut
+   TH1D *fhDphiTriggerJet;  //Deltaphi between trigger and jet 
+   TH1D *fhDphiTriggerJetAccept;  //Deltaphi between trigger and jet after cut
+   TH1D *fhCentrality;  //Deltaphi between trigger and jet 
+   TH1D *fhCentralityAccept;  //Deltaphi between trigger and jet after cut
+
+   const Double_t fkAcceptance; //eta times phi  Alice coverage  
+  
+   ClassDef(AliAnalysisTaskJetCorePP, 1);  //has to end with number larger than 0
+};
+
+#endif
+
index 946e0e8b5437bd8d1999df723debde0c1800e4eb..70be46fbabcc6578f858d8795b5e26f8486356b5 100644 (file)
@@ -32,6 +32,7 @@ set ( SRCS
     AliAnalysisTaskFragmentationFunction.cxx
     AliAnalysisTaskJetChem.cxx 
     AliAnalysisTaskJetCore.cxx         
+    AliAnalysisTaskJetCorePP.cxx       
     AliAnalysisTaskJetProperties.cxx
     AliAnalysisTaskJetResponseV2.cxx
     AliAnalysisTaskJetServices.cxx 
index 161cce9b5c29be6b02ea5ee2ce4b7f0a579c1cd3..f59b19c2b354f1be29778c678d75da22b33476f8 100644 (file)
@@ -26,6 +26,7 @@
 #pragma link C++ class AliAnalysisTaskJetChem::AliFragFuncHistosPhiCorrInvMass+;
 #pragma link C++ class AliAnalysisTaskJetsTM+;
 #pragma link C++ class AliAnalysisTaskJetCore+;
+#pragma link C++ class AliAnalysisTaskJetCorePP+;
 #pragma link C++ class AliAnalysisTaskJetProperties+;
 #pragma link C++ class AliAnalysisTaskJetResponseV2+;
 #pragma link C++ class AliAnalysisTaskPartonDisc+;
diff --git a/PWGJE/macros/AddTaskJetCorePP.C b/PWGJE/macros/AddTaskJetCorePP.C
new file mode 100644 (file)
index 0000000..301c704
--- /dev/null
@@ -0,0 +1,85 @@
+
+
+AliAnalysisTaskJetCorePP* AddTaskJetCorePP(
+   const Char_t* branchPrefix="clustersAOD",
+   const Char_t* jetAlgo="ANTIKT",
+   Float_t jetParameterR = 0.4,  //jet R 
+   Int_t   bgMode = 0, 
+   UInt_t  trkFilterMask = 272, 
+   Float_t trackLowPtCut = 0.15,
+   Int_t   skipJet = 0, 
+   Int_t   collisionSystem = 0, //pp=0, pPb=1
+   Int_t   offlineTriggerMask=AliVEvent::kMB, //MinBias=0 
+   Int_t   minContribVtx = 1,
+   Float_t vtxZMin = -10.0,
+   Float_t vtxZMax = 10.0,
+   Float_t centMin = 0.0,
+   Float_t centMax = 100.0,
+   Float_t triggerEtaCut = 0.9,
+   Float_t trackEtaCut = 0.9,
+   const Char_t* nonStdFile=""
+  ){ 
+
+   Printf("adding task jet response\n");
+
+   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
+   if(!mgr){
+      ::Error("AddTaskJetCorePP", "No analysis manager to connect to.");
+      return NULL;
+   }
+   if(!mgr->GetInputEventHandler()){
+      ::Error("AddTaskJetCorePP", "This task requires an input event handler.");
+      return NULL;
+   }
+
+   Float_t jetEtaMin = -0.9 + jetParameterR;
+   Float_t jetEtaMax =  0.9 - jetParameterR; 
+    
+   TString analBranch(branchPrefix);
+   TString stJetAlgo(jetAlgo);
+   stJetAlgo.ToUpper();
+   analBranch = analBranch + "_" + stJetAlgo + Form("%02d",(Int_t) (10*jetParameterR));
+   analBranch = analBranch + Form("_B%d",(Int_t) bgMode);
+   analBranch = analBranch + Form("_Filter%05d",(UInt_t) trkFilterMask);
+   analBranch = analBranch + Form("_Cut%05d",(Int_t) (1000*trackLowPtCut));
+   if(analBranch.BeginsWith("clustersAOD"))
+      analBranch = analBranch + Form("_Skip%02d",(Int_t) skipJet);
+   //clustersAOD_ANTIKT04_B0_Filter00272_Cut00150_Skip00   
+   //Skip00 none of the most energetic jets is ommited
+   //Cut00150  pT min cut on track
+   //Filter00272
+  
+   AliAnalysisTaskJetCorePP *task = new AliAnalysisTaskJetCorePP(Form("JetCorePP_%s_%d",analBranch.Data(),offlineTriggerMask));
+
+   task->SetBranchName(analBranch.Data());
+   task->SetNonStdFile(nonStdFile);
+   task->SetSystem(collisionSystem); 
+   task->SetJetR(jetParameterR);
+   task->SetOfflineTrgMask(offlineTriggerMask);
+   task->SetMinContribVtx(minContribVtx);
+   task->SetVtxZMin(vtxZMin);
+   task->SetVtxZMax(vtxZMax);
+   task->SetFilterMask(trkFilterMask);
+   task->SetCentMin(centMin);
+   task->SetCentMax(centMax);
+   task->SetJetEtaMin(jetEtaMin);
+   task->SetJetEtaMax(jetEtaMax);
+   task->SetTriggerEtaCut(triggerEtaCut);
+   task->SetTrackEtaCut(trackEtaCut);
+   task->SetTrackLowPtCut(trackLowPtCut);
+   task->SetDebugLevel(0); //No debug messages 0
+   mgr->AddTask(task);
+
+   AliAnalysisDataContainer *coutputJetCorePP = mgr->CreateContainer(
+      Form("pwgjejetcorepp_%s_%d",analBranch.Data(),offlineTriggerMask), 
+      TList::Class(),
+      AliAnalysisManager::kOutputContainer,
+      Form("%s:PWGJE_jetcorepp_%s_%d",AliAnalysisManager::GetCommonFileName(),analBranch.Data(),offlineTriggerMask)
+   );
+
+   mgr->ConnectInput (task, 0, mgr->GetCommonInputContainer());
+   mgr->ConnectOutput(task, 0, mgr->GetCommonOutputContainer());
+   mgr->ConnectOutput(task, 1, coutputJetCorePP);
+
+   return task;
+}