1 #include "AliAnalysisTaskEmcalJetHadCorQA.h"
5 #include <TClonesArray.h>
11 #include <TLorentzVector.h>
12 #include <TParameter.h>
13 #include <TParticle.h>
17 #include "AliAODEvent.h"
18 #include "AliAnalysisManager.h"
19 #include "AliAnalysisTask.h"
20 #include "AliCentrality.h"
21 #include "AliESDEvent.h"
22 #include "AliESDInputHandler.h"
23 #include "AliEmcalJet.h"
24 #include "AliVCluster.h"
25 #include "AliVTrack.h"
26 #include "AliRhoParameter.h"
27 #include "AliEmcalParticle.h"
28 #include "AliPicoTrack.h"
29 #include "AliEMCALGeometry.h"
31 ClassImp(AliAnalysisTaskEmcalJetHadCorQA)
33 //________________________________________________________________________
34 AliAnalysisTaskEmcalJetHadCorQA::AliAnalysisTaskEmcalJetHadCorQA() :
35 AliAnalysisTaskEmcalJet("spectra",kFALSE),
41 for (int i = 0;i<3;i++){
43 fHistNTMatchvsPt[i] = 0;
44 fHistNCMatchvsPt[i] = 0;
45 fHistHadCorvsPt[i] = 0;
46 fHistNEFvsPtBias[i] = 0;
47 fHistNTMatchvsPtBias[i] = 0;
48 fHistNCMatchvsPtBias[i] = 0;
49 fHistHadCorvsPtBias[i] = 0;
51 // Default constructor.
53 SetMakeGeneralHistograms(kTRUE);
56 //________________________________________________________________________
57 AliAnalysisTaskEmcalJetHadCorQA::AliAnalysisTaskEmcalJetHadCorQA(const char *name) :
58 AliAnalysisTaskEmcalJet(name,kTRUE),
64 for (int i = 0;i<3;i++){
66 fHistNTMatchvsPt[i] = 0;
67 fHistNCMatchvsPt[i] = 0;
68 fHistHadCorvsPt[i] = 0;
69 fHistNEFvsPtBias[i] = 0;
70 fHistNTMatchvsPtBias[i] = 0;
71 fHistNCMatchvsPtBias[i] = 0;
72 fHistHadCorvsPtBias[i] = 0;
74 SetMakeGeneralHistograms(kTRUE);
77 //________________________________________________________________________
78 void AliAnalysisTaskEmcalJetHadCorQA::UserCreateOutputObjects()
82 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
83 fHistRhovsCent = new TH2F("RhovsCent", "RhovsCent", 100, 0.0, 100.0, 500, 0, 500);
84 fHistNjetvsCent = new TH2F("NjetvsCent", "NjetvsCent", 100, 0.0, 100.0, 100, 0, 100);
86 for (int i = 0;i<3;i++){
89 sprintf(name,"NEFvsPt%i",i);
90 fHistNEFvsPt[i] = new TH2F(name, name, 100,0,1,500,-250,250);
91 fOutput->Add(fHistNEFvsPt[i]);
92 sprintf(name,"NTMatchvsPt%i",i);
93 fHistNTMatchvsPt[i] = new TH2F(name, name, 100,0,100,500,-250,250);
94 fOutput->Add(fHistNTMatchvsPt[i]);
95 sprintf(name,"NCMatchvsPt%i",i);
96 fHistNCMatchvsPt[i] = new TH2F(name, name, 100,0,100,500,-250,250);
97 fOutput->Add(fHistNCMatchvsPt[i]);
98 sprintf(name,"HadCorvsPt%i",i);
99 fHistHadCorvsPt[i] = new TH2F(name, name, 1000,0,500,500,-250,250);
100 fOutput->Add(fHistHadCorvsPt[i]);
101 sprintf(name,"NEFvsPtBias%i",i);
102 fHistNEFvsPtBias[i] = new TH2F(name, name, 100,0,1,500,-250,250);
103 fOutput->Add(fHistNEFvsPtBias[i]);
104 sprintf(name,"NTMatchvsPtBias%i",i);
105 fHistNTMatchvsPtBias[i] = new TH2F(name, name, 100,0,100,500,-250,250);
106 fOutput->Add(fHistNTMatchvsPtBias[i]);
107 sprintf(name,"NCMatchvsPtBias%i",i);
108 fHistNCMatchvsPtBias[i] = new TH2F(name, name, 100,0,100,500,-250,250);
109 fOutput->Add(fHistNCMatchvsPtBias[i]);
110 sprintf(name,"HadCorvsPtBias%i",i);
111 fHistHadCorvsPtBias[i] = new TH2F(name, name, 1000,0,500,500,-250,250);
112 fOutput->Add(fHistHadCorvsPtBias[i]);
114 fHistNTMatchvsPtvsNtack0 = new TH3F("NTMmatchvsPtvsNtrack0", "NTMatchsvsPtvsNtrack0", 100,0,100,500,-250,250,250,0,2500);
116 // for (Int_t i = 0;i<6;++i){
117 // name = TString(Form("JetPtvsTrackPt_%i",i));
118 // title = TString(Form("Jet pT vs Leading Track pT cent bin %i",i));
119 // fHistJetPtvsTrackPt[i] = new TH2F(name,title,1000,-500,500,100,0,100);
120 // fOutput->Add(fHistJetPtvsTrackPt[i]);
123 fOutput->Add(fHistRhovsCent);
124 fOutput->Add(fHistNjetvsCent);
125 fOutput->Add(fHistNTMatchvsPtvsNtack0);
126 PostData(1, fOutput);
129 //________________________________________________________________________
131 Int_t AliAnalysisTaskEmcalJetHadCorQA::GetCentBin(Double_t cent) const
133 // Get centrality bin.
136 if (cent>=0 && cent<10)
138 else if (cent>=10 && cent<30)
140 else if (cent>=30 && cent<50)
147 //________________________________________________________________________
149 Float_t AliAnalysisTaskEmcalJetHadCorQA:: RelativePhi(Double_t mphi,Double_t vphi) const
151 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
152 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
153 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
154 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
155 double dphi = mphi-vphi;
156 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
157 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
159 return dphi;//dphi in [-Pi, Pi]
162 //________________________________________________________________________
163 void AliAnalysisTaskEmcalJetHadCorQA::ExecOnce(){
164 AliAnalysisTaskEmcalJet::ExecOnce();
166 // AliAnalysisManger *am = AliAnalysisManager::GetAnalysisManger();
167 // if (fCaloName == "CaloClusters")
168 // am->LoadBranch("CaloClusters");
170 if (!fCalo2Name.IsNull() && !fCaloClusters2){
171 fCaloClusters2 = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCalo2Name));
172 if (!fCaloClusters2){
173 AliError(Form("%s: Could not retrieve calo clusters %s!",GetName(),fCalo2Name.Data()));
174 fInitialized = kFALSE;
178 // else if (!fJets->GetClass()->GetBaseClass("AliVCluster")){
179 // AliError(Form("%s: Collection %s does not contain AliEmcalParticle objects!",GetName(),fCalo2Name.Data()));
180 // fCaloClusters2 = 0;
181 // fInitialized = kFALSE;
188 //________________________________________________________________________
189 Bool_t AliAnalysisTaskEmcalJetHadCorQA::Run()
191 Int_t centbin = GetCentBin(fCent);
192 //for pp analyses we will just use the first centrality bin
200 const Int_t nCluster = fCaloClusters->GetEntriesFast();
201 const Int_t nCluster2 = fCaloClusters2->GetEntriesFast();
202 const Int_t nTrack = fTracks->GetEntriesFast();
204 TString fRhoScaledName = fRhoName;
205 fRho = GetRhoFromEvent(fRhoScaledName);
206 fRhoVal = fRho->GetVal();
207 fHistRhovsCent->Fill(fCent,fRhoVal);
208 const Int_t Njets = fJets->GetEntriesFast();
213 for (Int_t iJets = 0; iJets < Njets; ++iJets) {
214 Int_t TrackMatch = 0;
215 AliEmcalJet *jet = static_cast<AliEmcalJet*>(fJets->At(iJets));
222 if (jet->MaxTrackPt()>100)
224 if (! AcceptJet(jet))
227 vector<Int_t> cluster_id; //we need to keep track of the jet clusters that we find
228 vector<Int_t> cluster_id2;
229 Double_t Esub = 0; //total E subtracted from the jet
230 Double_t jetPt = -500;
231 jetPt = jet->Pt()-jet->Area()*fRhoVal;
232 for (int i = 0;i<nTrack;i++){
233 AliEmcalParticle *emctrack = static_cast<AliEmcalParticle*>(fTracks->At(i));
236 if (!emctrack->IsEMCAL())
238 AliVTrack *track = (AliVTrack*)emctrack->GetTrack();
241 if (! AcceptTrack(track))
243 if (! IsJetTrack(jet,i,false))
245 Int_t iClus = track->GetEMCALcluster();
248 bool ischecked = false;
249 for (Int_t icid = 0;i<cluster_id.size();icid++)
250 if (cluster_id[icid] == iClus)
251 ischecked = true; // we've already looked at this uncorrected cluster
253 continue; //no need to go further
254 AliEmcalParticle *emcluster = static_cast<AliEmcalParticle*>(fCaloClusters->At(iClus));
255 AliVCluster *cluster = emcluster->GetCluster();
258 if (! AcceptCluster(cluster))
260 Double_t etadiff = 999;
261 Double_t phidiff = 999;
262 AliPicoTrack::GetEtaPhiDiff(track,cluster,phidiff,etadiff);
263 if (! (TMath::Abs(phidiff)< 0.025&&TMath::Abs(etadiff)<0.015))
265 TrackMatch++; //this cluster has been matched, let's add it to the list
266 cluster_id.push_back(iClus);
268 //now we need to find its matched corrected cluster if any
269 for (Int_t ic = 0;ic < nCluster2;ic++){
270 //we don't need to check the list of corrected clusters because 1 to 1 between corrected and uncorrected
271 AliVCluster *emcluster2 = static_cast<AliVCluster*>(fCaloClusters2->At(ic));
274 if (! AcceptCluster(emcluster2))
276 if (! IsJetCluster(jet,ic,false))
278 TLorentzVector nPart;
279 cluster->GetMomentum(nPart,const_cast<Double_t*>(fVertex));
280 TLorentzVector nPart2;
281 emcluster2->GetMomentum(nPart2,const_cast<Double_t*>(fVertex));
282 float R = pow(pow(nPart.Eta()-nPart2.Eta(),2)+pow(nPart.Phi()-nPart2.Phi(),2),0.5);
283 if (R < 0.001){//this cluster stayed in the jet!
284 cluster_id2.push_back(ic);
287 } // end of cluster2 loop
288 //we only get here if the track was matched to a cluster that hadn't been looked at before
289 if (ismatch < 0) //this cluster was entirely deleted
291 else{ //get the corrected cluster
292 AliVCluster *emcluster2temp = static_cast<AliVCluster*>(fCaloClusters2->At(ismatch));
293 Esub+=(cluster->E() - emcluster2temp->E());
296 } // end of track loop
297 fHistNEFvsPt[centbin]->Fill(jet->NEF(),jetPt);
298 fHistNTMatchvsPt[centbin]->Fill(TrackMatch,jetPt);
299 // fHistNCMatchvsPtvsCent(0),
300 fHistHadCorvsPt[centbin]->Fill(Esub,jetPt);
301 if (jet->MaxTrackPt()<5.0)
303 fHistNEFvsPtBias[centbin]->Fill(jet->NEF(),jetPt);
304 fHistNTMatchvsPtBias[centbin]->Fill(TrackMatch,jetPt);
305 fHistHadCorvsPtBias[centbin]->Fill(Esub,jetPt);
307 fHistNTMatchvsPtvsNtack0->Fill(TrackMatch,jetPt,nTrack);
309 fHistNjetvsCent->Fill(fCent,NjetAcc);