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"
32 ClassImp(AliAnalysisTaskEmcalJetHadCorQA)
34 //________________________________________________________________________
35 AliAnalysisTaskEmcalJetHadCorQA::AliAnalysisTaskEmcalJetHadCorQA() :
36 AliAnalysisTaskEmcalJet("jethadcor",kFALSE),
43 fHistNTMatchvsPtvsNtack0(0)
45 for (int i = 0;i<3;i++){
47 fHistNTMatchvsPt[i] = 0;
48 fHistNCMatchvsPt[i] = 0;
49 fHistHadCorvsPt[i] = 0;
50 fHistNEFvsPtBias[i] = 0;
54 fHistNTMatchvsPtBias[i] = 0;
55 fHistNCMatchvsPtBias[i] = 0;
56 fHistHadCorvsPtBias[i] = 0;
57 fHistNconvsPtBias[i] = 0;
58 fHistNtvsPtBias[i] = 0;
59 fHistNcvsPtBias[i] = 0;
61 // Default constructor.
63 SetMakeGeneralHistograms(kTRUE);
66 //________________________________________________________________________
67 AliAnalysisTaskEmcalJetHadCorQA::AliAnalysisTaskEmcalJetHadCorQA(const char *name) :
68 AliAnalysisTaskEmcalJet(name,kTRUE),
75 fHistNTMatchvsPtvsNtack0(0)
77 for (int i = 0;i<3;i++){
79 fHistNTMatchvsPt[i] = 0;
80 fHistNCMatchvsPt[i] = 0;
81 fHistHadCorvsPt[i] = 0;
82 fHistNEFvsPtBias[i] = 0;
86 fHistNTMatchvsPtBias[i] = 0;
87 fHistNCMatchvsPtBias[i] = 0;
88 fHistHadCorvsPtBias[i] = 0;
89 fHistNconvsPtBias[i] = 0;
90 fHistNtvsPtBias[i] = 0;
91 fHistNcvsPtBias[i] = 0;
93 SetMakeGeneralHistograms(kTRUE);
96 //________________________________________________________________________
97 void AliAnalysisTaskEmcalJetHadCorQA::UserCreateOutputObjects()
101 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
102 fHistRhovsCent = new TH2F("RhovsCent", "RhovsCent", 100, 0.0, 100.0, 500, 0, 500);
103 fHistNjetvsCent = new TH2F("NjetvsCent", "NjetvsCent", 100, 0.0, 100.0, 100, 0, 100);
105 for (int i = 0;i<3;i++){
108 sprintf(name,"NEFvsPt%i",i);
109 fHistNEFvsPt[i] = new TH2F(name, name, 100,0,1,500,-250,250);
110 fOutput->Add(fHistNEFvsPt[i]);
111 sprintf(name,"NTMatchvsPt%i",i);
112 fHistNTMatchvsPt[i] = new TH2F(name, name, 100,0,100,500,-250,250);
113 fOutput->Add(fHistNTMatchvsPt[i]);
114 sprintf(name,"NCMatchvsPt%i",i);
115 fHistNCMatchvsPt[i] = new TH2F(name, name, 100,0,100,500,-250,250);
116 fOutput->Add(fHistNCMatchvsPt[i]);
117 sprintf(name,"HadCorvsPt%i",i);
118 fHistHadCorvsPt[i] = new TH2F(name, name, 1000,0,500,500,-250,250);
119 fOutput->Add(fHistHadCorvsPt[i]);
120 sprintf(name,"NconvsPt%i",i);
121 fHistNconvsPt[i] = new TH2F(name, name, 200,0,200,500,-250,250);
122 fOutput->Add(fHistNconvsPt[i]);
123 sprintf(name,"NtvsPt%i",i);
124 fHistNtvsPt[i] = new TH2F(name, name, 200,0,200,500,-250,250);
125 fOutput->Add(fHistNtvsPt[i]);
126 sprintf(name,"NcvsPt%i",i);
127 fHistNcvsPt[i] = new TH2F(name, name, 200,0,200,500,-250,250);
128 fOutput->Add(fHistNcvsPt[i]);
129 sprintf(name,"NEFvsPtBias%i",i);
130 fHistNEFvsPtBias[i] = new TH2F(name, name, 100,0,1,500,-250,250);
131 fOutput->Add(fHistNEFvsPtBias[i]);
132 sprintf(name,"NTMatchvsPtBias%i",i);
133 fHistNTMatchvsPtBias[i] = new TH2F(name, name, 100,0,100,500,-250,250);
134 fOutput->Add(fHistNTMatchvsPtBias[i]);
135 sprintf(name,"NCMatchvsPtBias%i",i);
136 fHistNCMatchvsPtBias[i] = new TH2F(name, name, 100,0,100,500,-250,250);
137 fOutput->Add(fHistNCMatchvsPtBias[i]);
138 sprintf(name,"HadCorvsPtBias%i",i);
139 fHistHadCorvsPtBias[i] = new TH2F(name, name, 1000,0,500,500,-250,250);
140 fOutput->Add(fHistHadCorvsPtBias[i]);
141 sprintf(name,"NconvsPtBias%i",i);
142 fHistNconvsPtBias[i] = new TH2F(name, name, 200,0,200,500,-250,250);
143 fOutput->Add(fHistNconvsPtBias[i]);
144 sprintf(name,"NtvsPtBias%i",i);
145 fHistNtvsPtBias[i] = new TH2F(name, name, 200,0,200,500,-250,250);
146 fOutput->Add(fHistNtvsPtBias[i]);
147 sprintf(name,"NcvsPtBias%i",i);
148 fHistNcvsPtBias[i] = new TH2F(name, name, 200,0,200,500,-250,250);
149 fOutput->Add(fHistNcvsPtBias[i]);
151 fHistNTMatchvsPtvsNtack0 = new TH3F("NTMmatchvsPtvsNtrack0", "NTMatchsvsPtvsNtrack0", 100,0,100,500,-250,250,250,0,2500);
153 // for (Int_t i = 0;i<6;++i){
154 // name = TString(Form("JetPtvsTrackPt_%i",i));
155 // title = TString(Form("Jet pT vs Leading Track pT cent bin %i",i));
156 // fHistJetPtvsTrackPt[i] = new TH2F(name,title,1000,-500,500,100,0,100);
157 // fOutput->Add(fHistJetPtvsTrackPt[i]);
160 fOutput->Add(fHistRhovsCent);
161 fOutput->Add(fHistNjetvsCent);
162 fOutput->Add(fHistNTMatchvsPtvsNtack0);
163 PostData(1, fOutput);
166 //________________________________________________________________________
168 Int_t AliAnalysisTaskEmcalJetHadCorQA::GetCentBin(Double_t cent) const
170 // Get centrality bin.
173 if (cent>=0 && cent<10)
175 else if (cent>=10 && cent<30)
177 else if (cent>=30 && cent<50)
184 //________________________________________________________________________
186 Float_t AliAnalysisTaskEmcalJetHadCorQA:: RelativePhi(Double_t mphi,Double_t vphi) const
188 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
189 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
190 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
191 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
192 double dphi = mphi-vphi;
193 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
194 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
196 return dphi;//dphi in [-Pi, Pi]
199 //________________________________________________________________________
200 void AliAnalysisTaskEmcalJetHadCorQA::ExecOnce()
202 AliAnalysisTaskEmcalJet::ExecOnce();
204 // AliAnalysisManger *am = AliAnalysisManager::GetAnalysisManger();
205 // if (fCaloName == "CaloClusters")
206 // am->LoadBranch("CaloClusters");
208 if (!fCalo2Name.IsNull() && !fCaloClusters2){
209 fCaloClusters2 = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fCalo2Name));
210 if (!fCaloClusters2){
211 AliError(Form("%s: Could not retrieve calo clusters %s!",GetName(),fCalo2Name.Data()));
212 fInitialized = kFALSE;
217 if (!fMCParticlesName.IsNull() && !fMCParticles){
218 fMCParticles = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fMCParticlesName));
220 AliError(Form("%s: Could not retrieve MC Particles %s!",GetName(),fMCParticlesName.Data()));
221 fInitialized = kFALSE;
225 //TString fMCParticlesName;
226 // TClonesArray *fMCParticles;
228 // else if (!fJets->GetClass()->GetBaseClass("AliVCluster")){
229 // AliError(Form("%s: Collection %s does not contain AliEmcalParticle objects!",GetName(),fCalo2Name.Data()));
230 // fCaloClusters2 = 0;
231 // fInitialized = kFALSE;
237 //________________________________________________________________________
238 Bool_t AliAnalysisTaskEmcalJetHadCorQA::Run()
240 Int_t centbin = GetCentBin(fCent);
241 //for pp analyses we will just use the first centrality bin
242 if (GetBeamType()==0)
252 const Int_t nCluster2 = fCaloClusters2->GetEntriesFast();
253 const Int_t nTrack = fTracks->GetEntriesFast();
254 // const Int_t nMC = fMCParticles->GetEntriesFast();
256 TString fRhoScaledName = fRhoName;
257 fRho = GetRhoFromEvent(fRhoScaledName);
258 fRhoVal = fRho->GetVal();
259 if (GetBeamType()==0)
261 fHistRhovsCent->Fill(fCent,fRhoVal);
262 const Int_t Njets = fJets->GetEntriesFast();
267 for (Int_t iJets = 0; iJets < Njets; ++iJets) {
268 Int_t TrackMatch = 0;
269 AliEmcalJet *jet = static_cast<AliEmcalJet*>(fJets->At(iJets));
276 if (jet->MaxTrackPt()>100)
278 if (! AcceptJet(jet))
281 vector<Int_t> cluster_id; //we need to keep track of the jet clusters that we find
282 vector<Int_t> cluster_id2;
283 Double_t Esub = 0; //total E subtracted from the jet
284 Double_t jetPt = -500;
285 jetPt = jet->Pt()-jet->Area()*fRhoVal;
286 for (int i = 0;i<nTrack;i++){
287 AliEmcalParticle *emctrack = static_cast<AliEmcalParticle*>(fTracks->At(i));
290 if (!emctrack->IsEMCAL())
292 AliVTrack *track = (AliVTrack*)emctrack->GetTrack();
295 if (! AcceptTrack(track))
297 if (! IsJetTrack(jet,i,false))
299 Int_t iClus = track->GetEMCALcluster();
302 //we have the id of the matched cluster of a track constituent
303 // cout<<"track label for matched,accepted jet track is "<<track->GetLabel()<<endl;
304 bool ischecked = false;
305 for (UInt_t icid = 0;icid<cluster_id.size();icid++)
306 if (cluster_id[icid] == iClus)
307 ischecked = true; // we've already looked at this uncorrected cluster
309 continue; //no need to go further
310 AliEmcalParticle *emcluster = static_cast<AliEmcalParticle*>(fCaloClusters->At(iClus));
311 AliVCluster *cluster = emcluster->GetCluster();
314 if (! AcceptCluster(cluster))
316 Double_t etadiff = 999;
317 Double_t phidiff = 999;
318 AliPicoTrack::GetEtaPhiDiff(track,cluster,phidiff,etadiff);
319 if (! (TMath::Abs(phidiff)< 0.025&&TMath::Abs(etadiff)<0.015))
321 TrackMatch++; //this cluster has been matched, let's add it to the list
322 cluster_id.push_back(iClus);
324 //now we need to find its matched corrected cluster if any
325 for (Int_t ic = 0;ic < nCluster2;ic++){
326 //we don't need to check the list of corrected clusters because 1 to 1 between corrected and uncorrected
327 AliVCluster *emcluster2 = static_cast<AliVCluster*>(fCaloClusters2->At(ic));
330 if (! AcceptCluster(emcluster2))
332 if (! IsJetCluster(jet,ic,false))
334 TLorentzVector nPart;
335 cluster->GetMomentum(nPart,const_cast<Double_t*>(fVertex));
336 TLorentzVector nPart2;
337 emcluster2->GetMomentum(nPart2,const_cast<Double_t*>(fVertex));
338 float R = pow(pow(nPart.Eta()-nPart2.Eta(),2)+pow(nPart.Phi()-nPart2.Phi(),2),0.5);
339 if (R < 0.001){//this cluster stayed in the jet!
340 cluster_id2.push_back(ic);
343 } // end of cluster2 loop
344 //we only get here if the track was matched to a cluster that hadn't been looked at before
345 if (ismatch < 0) //this cluster was entirely deleted
347 else{ //get the corrected cluster
348 AliVCluster *emcluster2temp = static_cast<AliVCluster*>(fCaloClusters2->At(ismatch));
349 Esub+=(cluster->E() - emcluster2temp->E());
352 } // end of track loop
353 fHistNEFvsPt[centbin]->Fill(jet->NEF(),jetPt);
354 fHistNTMatchvsPt[centbin]->Fill(TrackMatch,jetPt);
355 fHistNCMatchvsPt[centbin]->Fill(cluster_id.size(),jetPt);
356 fHistHadCorvsPt[centbin]->Fill(Esub,jetPt);
357 fHistNconvsPt[centbin]->Fill(jet->GetNumberOfConstituents(),jetPt);
358 fHistNtvsPt[centbin]->Fill(jet->GetNumberOfTracks(),jetPt);
359 fHistNcvsPt[centbin]->Fill(jet->GetNumberOfClusters(),jetPt);
360 if (jet->MaxTrackPt()<5.0)
362 fHistNEFvsPtBias[centbin]->Fill(jet->NEF(),jetPt);
363 fHistNTMatchvsPtBias[centbin]->Fill(TrackMatch,jetPt);
364 fHistHadCorvsPtBias[centbin]->Fill(Esub,jetPt);
365 fHistNconvsPtBias[centbin]->Fill(jet->GetNumberOfConstituents(),jetPt);
366 fHistNtvsPtBias[centbin]->Fill(jet->GetNumberOfTracks(),jetPt);
367 fHistNcvsPtBias[centbin]->Fill(jet->GetNumberOfClusters(),jetPt);
368 fHistNCMatchvsPt[centbin]->Fill(cluster_id.size(),jetPt);
370 fHistNTMatchvsPtvsNtack0->Fill(TrackMatch,jetPt,jet->GetNumberOfTracks());
372 fHistNjetvsCent->Fill(fCent,NjetAcc);