3 // Dcal dijet performance task
7 #include <TClonesArray.h>
11 #include <THnSparse.h>
13 #include <TLorentzVector.h>
15 #include "AliVCluster.h"
16 #include "AliAODCaloCluster.h"
17 #include "AliESDCaloCluster.h"
18 #include "AliVTrack.h"
19 #include "AliEmcalJet.h"
20 #include "AliRhoParameter.h"
22 #include "AliJetContainer.h"
23 #include "AliParticleContainer.h"
24 #include "AliClusterContainer.h"
25 #include "AliPicoTrack.h"
27 #include "AliAnalysisTaskDcalDijetPerf.h"
29 ClassImp(AliAnalysisTaskDcalDijetPerf)
31 //________________________________________________________________________
32 AliAnalysisTaskDcalDijetPerf::AliAnalysisTaskDcalDijetPerf() :
33 AliAnalysisTaskEmcalJet("AliAnalysisTaskDcalDijetPerf", kTRUE),
40 fHistJetsPtLeadHad(0),
41 fHistJetsCorrPtArea(0),
53 // Default constructor.
55 fHistTracksPt = new TH1*[fNcentBins];
56 fHistTracksEtaPhi = new TH2*[fNcentBins];
57 fHistClustersPt = new TH1*[fNcentBins];
58 fHistLeadingJetPt = new TH1*[fNcentBins];
59 fHistJetsPhiEta = new TH2*[fNcentBins];
60 fHistJetsPtArea = new TH2*[fNcentBins];
61 fHistJetsPtLeadHad = new TH2*[fNcentBins];
62 fHistJetsCorrPtArea = new TH2*[fNcentBins];
64 for (Int_t i = 0; i < fNcentBins; i++) {
66 fHistTracksEtaPhi[i] = 0;
67 fHistClustersPt[i] = 0;
68 fHistLeadingJetPt[i] = 0;
69 fHistJetsPhiEta[i] = 0;
70 fHistJetsPtArea[i] = 0;
71 fHistJetsPtLeadHad[i] = 0;
72 fHistJetsCorrPtArea[i] = 0;
79 SetMakeGeneralHistograms(kTRUE);
82 //________________________________________________________________________
83 AliAnalysisTaskDcalDijetPerf::AliAnalysisTaskDcalDijetPerf(const char *name) :
84 AliAnalysisTaskEmcalJet(name, kTRUE),
91 fHistJetsPtLeadHad(0),
92 fHistJetsCorrPtArea(0),
103 // Standard constructor.
105 fHistTracksPt = new TH1*[fNcentBins];
106 fHistTracksEtaPhi = new TH2*[fNcentBins];
107 fHistClustersPt = new TH1*[fNcentBins];
108 fHistLeadingJetPt = new TH1*[fNcentBins];
109 fHistJetsPhiEta = new TH2*[fNcentBins];
110 fHistJetsPtArea = new TH2*[fNcentBins];
111 fHistJetsPtLeadHad = new TH2*[fNcentBins];
112 fHistJetsCorrPtArea = new TH2*[fNcentBins];
114 for (Int_t i = 0; i < fNcentBins; i++) {
115 fHistTracksPt[i] = 0;
116 fHistTracksEtaPhi[i] = 0;
117 fHistClustersPt[i] = 0;
118 fHistLeadingJetPt[i] = 0;
119 fHistJetsPhiEta[i] = 0;
120 fHistJetsPtArea[i] = 0;
121 fHistJetsPtLeadHad[i] = 0;
122 fHistJetsCorrPtArea[i] = 0;
130 SetMakeGeneralHistograms(kTRUE);
133 //________________________________________________________________________
134 AliAnalysisTaskDcalDijetPerf::~AliAnalysisTaskDcalDijetPerf()
139 //________________________________________________________________________
140 void AliAnalysisTaskDcalDijetPerf::UserCreateOutputObjects()
142 // Create user output.
144 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
146 fJetsCont = GetJetContainer(0);
147 fJetsCont2 = GetJetContainer(1);
148 if(fJetsCont) { //get particles and clusters connected to jets
149 fTracksCont = fJetsCont->GetParticleContainer();
150 fCaloClustersCont = fJetsCont->GetClusterContainer();
151 } else { //no jets, just analysis tracks and clusters
152 fTracksCont = GetParticleContainer(0);
153 fCaloClustersCont = GetClusterContainer(0);
155 fTracksCont->SetClassName("AliVTrack");
156 //fCaloClustersCont->SetClassName("AliVCluster");
159 for (Int_t i = 0; i < fNcentBins; i++) {
160 if (fParticleCollArray.GetEntriesFast()>0) {
161 histname = "fHistTracksPt_";
163 fHistTracksPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins / 2, fMinBinPt, fMaxBinPt / 2);
164 fHistTracksPt[i]->GetXaxis()->SetTitle("p_{T,track} (GeV/c)");
165 fHistTracksPt[i]->GetYaxis()->SetTitle("counts");
166 fOutput->Add(fHistTracksPt[i]);
167 histname = "fHistTracksEtaPhi_";
169 fHistTracksEtaPhi[i] = new TH2F(histname.Data(), histname.Data(), fNbins, -0.7, 0.7, fNbins, 0, TMath::Pi()*2);
170 fHistTracksEtaPhi[i]->GetXaxis()->SetTitle("eta");
171 fHistTracksEtaPhi[i]->GetYaxis()->SetTitle("phi");
172 fOutput->Add(fHistTracksEtaPhi[i]);
175 if (fClusterCollArray.GetEntriesFast()>0) {
176 histname = "fHistClustersPt_";
178 fHistClustersPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins / 2, fMinBinPt, fMaxBinPt / 2);
179 fHistClustersPt[i]->GetXaxis()->SetTitle("p_{T,clus} (GeV/c)");
180 fHistClustersPt[i]->GetYaxis()->SetTitle("counts");
181 fOutput->Add(fHistClustersPt[i]);
184 if (fJetCollArray.GetEntriesFast()>0) {
185 histname = "fHistLeadingJetPt_";
187 fHistLeadingJetPt[i] = new TH1F(histname.Data(), histname.Data(), fNbins, fMinBinPt, fMaxBinPt);
188 fHistLeadingJetPt[i]->GetXaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
189 fHistLeadingJetPt[i]->GetYaxis()->SetTitle("counts");
190 fOutput->Add(fHistLeadingJetPt[i]);
192 histname = "fHistJetsPhiEta_";
194 fHistJetsPhiEta[i] = new TH2F(histname.Data(), histname.Data(), 50, -1, 1, 101, 0, TMath::Pi()*2 + TMath::Pi()/200);
195 fHistJetsPhiEta[i]->GetXaxis()->SetTitle("#eta");
196 fHistJetsPhiEta[i]->GetYaxis()->SetTitle("#phi");
197 fOutput->Add(fHistJetsPhiEta[i]);
199 histname = "fHistJetsPtArea_";
201 fHistJetsPtArea[i] = new TH2F(histname.Data(), histname.Data(), fNbins, fMinBinPt, fMaxBinPt, 30, 0, 3);
202 fHistJetsPtArea[i]->GetXaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
203 fHistJetsPtArea[i]->GetYaxis()->SetTitle("area");
204 fOutput->Add(fHistJetsPtArea[i]);
206 histname = "fHistJetsPtLeadHad_";
208 fHistJetsPtLeadHad[i] = new TH2F(histname.Data(), histname.Data(), fNbins, fMinBinPt, fMaxBinPt, fNbins / 2, fMinBinPt, fMaxBinPt / 2);
209 fHistJetsPtLeadHad[i]->GetXaxis()->SetTitle("p_{T}^{raw} (GeV/c)");
210 fHistJetsPtLeadHad[i]->GetYaxis()->SetTitle("p_{T,lead} (GeV/c)");
211 fHistJetsPtLeadHad[i]->GetZaxis()->SetTitle("counts");
212 fOutput->Add(fHistJetsPtLeadHad[i]);
214 if (!(GetJetContainer()->GetRhoName().IsNull())) {
215 histname = "fHistJetsCorrPtArea_";
217 fHistJetsCorrPtArea[i] = new TH2F(histname.Data(), histname.Data(), fNbins*2, -fMaxBinPt, fMaxBinPt, 30, 0, 3);
218 fHistJetsCorrPtArea[i]->GetXaxis()->SetTitle("p_{T}^{corr} [GeV/c]");
219 fHistJetsCorrPtArea[i]->GetYaxis()->SetTitle("area");
220 fOutput->Add(fHistJetsCorrPtArea[i]);
225 Int_t nbins[] = {150,100,100,100,150};
226 Double_t xmin[] = { 0,-0.7, 0, 0, 0};
227 Double_t xmax[] = {150, 0.7,TMath::TwoPi(), 1, 150};
228 fHistJet1 = new THnSparseF("Jets1Collection","Jets1Collection",5,nbins,xmin,xmax);
229 fOutput->Add(fHistJet1);
230 fHistJet1m = new THnSparseF("Jets1CollectionMatched","Jets1Collection",5,nbins,xmin,xmax);
231 fOutput->Add(fHistJet1m);
232 fHistJet1nm = new THnSparseF("Jets1CollectionNotMatched","Jets1Collection",5,nbins,xmin,xmax);
233 fOutput->Add(fHistJet1nm);
234 fHistJet2 = new THnSparseF("Jets2Collection","Jets2Collection",5,nbins,xmin,xmax);
235 fOutput->Add(fHistJet2);
237 Int_t nbins2[] = {150,100,100,100,150,100,100,100,100};
238 Double_t xmin2[] = {0,-0.7,0,0,0,-0.7,0,0,0};
239 Double_t xmax2[] = {150,0.7,6.28,1,150,0.7,6.28,1,0.2};
240 fHistJet1to2 = new THnSparseF("Jets1to2Collection","Jets1to2Collection",9,nbins2,xmin2,xmax2);
241 fOutput->Add(fHistJet1to2);
243 PostData(1, fOutput); // Post data for ALL output slots > 0 here.
246 //________________________________________________________________________
247 Bool_t AliAnalysisTaskDcalDijetPerf::FillHistograms()
252 AliVTrack *track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle(0));
254 fHistTracksPt[fCentBin]->Fill(track->Pt());
255 fHistTracksEtaPhi[fCentBin]->Fill(track->Eta(),track->Phi());
256 track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle());
260 if (fCaloClustersCont) {
261 AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0);
263 TLorentzVector nPart;
264 cluster->GetMomentum(nPart, fVertex);
265 fHistClustersPt[fCentBin]->Fill(nPart.Pt());
267 cluster = fCaloClustersCont->GetNextAcceptCluster();
273 AliEmcalJet *jet = fJetsCont->GetNextAcceptJet(0);
275 Float_t NEFpT = jet->Pt()*jet->NEF();
277 //cout<<"loop 1 jet 1 has label, pt,eta,phi,NEF = "<<jet->GetLabel()<<" "<<jet->Pt()<<" "<<jet->Eta()<<" "<<jet->Phi()<<" "<<jet->NEF()<<" and NEFpT "<<NEFpT<<endl;
278 fHistJetsPtArea[fCentBin]->Fill(jet->Pt(), jet->Area());
279 fHistJetsPhiEta[fCentBin]->Fill(jet->Eta(), jet->Phi());
280 Float_t ptLeading = fJetsCont->GetLeadingHadronPt(jet);
281 fHistJetsPtLeadHad[fCentBin]->Fill(jet->Pt(), ptLeading);
283 //110 degrees in the azimuthal angle |eta|<0.7
284 //EMCal Tower 0.0143 x 0.0143
285 //16x16 = 0.2288 x 0.2288 -> R = 0.1144
287 Double_t jetarray[] = {jet->Pt(),jet->Eta(),jet->Phi(),jet->NEF(),NEFpT};
288 //cout<<"Filling "<<jet->Pt()<<" "<<jet->Eta()<<" "<<jet->Phi()<<" "<<jet->NEF()<<endl;
289 fHistJet1->Fill(jetarray);
290 if (fHistJetsCorrPtArea[fCentBin]) {
291 Float_t corrPt = jet->Pt() - fJetsCont->GetRhoVal() * jet->Area();
292 fHistJetsCorrPtArea[fCentBin]->Fill(corrPt, jet->Area());
294 jet = fJetsCont->GetNextAcceptJet();
297 jet = fJetsCont->GetLeadingJet();
298 if(jet) fHistLeadingJetPt[fCentBin]->Fill(jet->Pt());
300 // cout<<"DONE LOOP 1"<<endl;
303 //cout<<"We have a 2nd collection!!"<<endl;
304 AliEmcalJet *jet = fJetsCont2->GetNextAcceptJet(0);
306 Float_t NEFpT = jet->Pt()*jet->NEF();
307 //cout<<"loop 2 jet 2 has label, pt,eta,phi,NEF = "<<jet->GetLabel()<<" "<<jet->Pt()<<" "<<jet->Eta()<<" "<<jet->Phi()<<" "<<jet->NEF()<<endl;
309 Double_t jetarray[] = {jet->Pt(),jet->Eta(),jet->Phi(),jet->NEF(),NEFpT};
310 //cout<<"Filling "<<jet->Pt()<<" "<<jet->Eta()<<" "<<jet->Phi()<<" "<<jet->NEF()<<endl;
311 fHistJet2->Fill(jetarray);
312 // cout<<" we have a jet! wiht pt = "<<jet->Pt()<<endl;
313 jet = fJetsCont2->GetNextAcceptJet();
316 //<<"DONE LOOP 2"<<endl;
318 //cout<<" There are "<<fJetsCont->GetNJets()<<" cont1 jets and "<<fJetsCont2->GetNJets()<<" cont2 jets"<<endl;
322 if (fJetsCont&&fJetsCont2) {
323 AliEmcalJet *jet1 = fJetsCont->GetNextAcceptJet(0);
324 AliEmcalJet *jet2 = fJetsCont2->GetNextAcceptJet(0);
326 bool ismatched = false;
327 Float_t NEFpT1 = jet1->Pt()*jet1->NEF();
328 Double_t jetarray1[] = {jet1->Pt(),jet1->Eta(),jet1->Phi(),jet1->NEF(),NEFpT1};
331 //cout<<"jet 1 has label, pt,eta,phi,NEF = "<<jet1->GetLabel()<<" "<<jet1->Pt()<<" "<<jet1->Eta()<<" "<<jet1->Phi()<<" "<<jet1->NEF()<<endl;
332 //<<"jet 2 has lable pt,eta,phi,NEF = "<<jet1->GetLabel()<<" "<<jet2->Pt()<<" "<<jet2->Eta()<<" "<<jet2->Phi()<<" "<<jet2->NEF()<<endl;
333 Double_t deta = jet1->Eta()-jet2->Eta();
334 Double_t dphi = RelativePhi(jet1->Phi(),jet2->Phi());
335 Double_t deta2 = deta*deta;
336 Double_t dphi2 = dphi*dphi;
337 Double_t dR = pow(deta2+dphi2,0.5);
338 //cout<<"dR is "<<dR<<endl;
339 Double_t jetarray[] = {jet1->Pt(),jet1->Eta(),jet1->Phi(),jet1->NEF(),jet2->Pt(),jet2->Eta(),jet2->Phi(),jet2->NEF(),dR};
342 fHistJet1to2->Fill(jetarray);
345 jet2 = fJetsCont2->GetNextAcceptJet();
348 fHistJet1m->Fill(jetarray1);
350 fHistJet1nm->Fill(jetarray1);
351 jet1 = fJetsCont->GetNextAcceptJet();
352 jet2 = fJetsCont2->GetNextAcceptJet(0);
359 //________________________________________________________________________
360 Float_t AliAnalysisTaskDcalDijetPerf:: RelativePhi(Double_t mphi,Double_t vphi) const
362 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
363 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
364 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
365 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
366 double dphi = mphi-vphi;
367 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
368 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
370 return dphi;//dphi in [-Pi, Pi]
374 //________________________________________________________________________
375 void AliAnalysisTaskDcalDijetPerf::ExecOnce() {
377 AliAnalysisTaskEmcalJet::ExecOnce();
379 if (fJetsCont && fJetsCont->GetArray() == 0) fJetsCont = 0;
380 if (fTracksCont && fTracksCont->GetArray() == 0) fTracksCont = 0;
381 if (fCaloClustersCont && fCaloClustersCont->GetArray() == 0) fCaloClustersCont = 0;
385 //________________________________________________________________________
386 Bool_t AliAnalysisTaskDcalDijetPerf::Run()
388 // Run analysis code here, if needed. It will be executed before FillHistograms().
390 return kTRUE; // If return kFALSE FillHistogram() will NOT be executed.
393 //________________________________________________________________________
394 void AliAnalysisTaskDcalDijetPerf::Terminate(Option_t *)
396 // Called once at the end of the analysis.