2 // Jet mass analysis task for jets recoiling from high pT hadron
6 #include <TClonesArray.h>
10 #include <THnSparse.h>
12 #include <TLorentzVector.h>
22 #include "AliVCluster.h"
23 #include "AliVTrack.h"
24 #include "AliEmcalJet.h"
25 #include "AliRhoParameter.h"
27 #include "AliEmcalParticle.h"
28 #include "AliAnalysisManager.h"
29 #include "AliJetContainer.h"
30 #include "AliParticleContainer.h"
32 #include "AliAODEvent.h"
34 #include "AliAnalysisTaskEmcalHJetMass.h"
36 ClassImp(EmcalHJetMassAnalysis::AliAnalysisTaskEmcalHJetMass)
38 namespace EmcalHJetMassAnalysis {
40 //________________________________________________________________________
41 AliAnalysisTaskEmcalHJetMass::AliAnalysisTaskEmcalHJetMass() :
42 AliAnalysisTaskEmcalJet("AliAnalysisTaskEmcalHJetMass", kTRUE),
45 fMinFractionShared(0),
49 fTriggerTrackType(kInclusive),
56 fh3PtJet1VsMassVsHPtAllSel(0),
57 fh3PtJet1VsMassVsHPtAllSelMatch(0),
58 fh3PtJet1VsMassVsHPtTagged(0),
59 fh3PtJet1VsMassVsHPtTaggedMatch(0),
60 fh3PtJet1VsRatVsHPtAllSel(0),
61 fh3PtJet1VsRatVsHPtAllSelMatch(0),
62 fh3PtJet1VsRatVsHPtTagged(0),
63 fh3PtJet1VsRatVsHPtTaggedMatch(0)
65 // Default constructor.
67 fh1PtHadron = new TH1F*[fNcentBins];
68 fh3PtHPtJDPhi = new TH3F*[fNcentBins];
69 fh3PtJet1VsMassVsHPtAllSel = new TH3F*[fNcentBins];
70 fh3PtJet1VsMassVsHPtAllSelMatch = new TH3F*[fNcentBins];
71 fh3PtJet1VsMassVsHPtTagged = new TH3F*[fNcentBins];
72 fh3PtJet1VsMassVsHPtTaggedMatch = new TH3F*[fNcentBins];
73 fh3PtJet1VsRatVsHPtAllSel = new TH3F*[fNcentBins];
74 fh3PtJet1VsRatVsHPtAllSelMatch = new TH3F*[fNcentBins];
75 fh3PtJet1VsRatVsHPtTagged = new TH3F*[fNcentBins];
76 fh3PtJet1VsRatVsHPtTaggedMatch = new TH3F*[fNcentBins];
78 for (Int_t i = 0; i < fNcentBins; i++) {
81 fh3PtJet1VsMassVsHPtAllSel[i] = 0;
82 fh3PtJet1VsMassVsHPtAllSelMatch[i] = 0;
83 fh3PtJet1VsMassVsHPtTagged[i] = 0;
84 fh3PtJet1VsMassVsHPtTaggedMatch[i] = 0;
85 fh3PtJet1VsRatVsHPtAllSel[i] = 0;
86 fh3PtJet1VsRatVsHPtAllSelMatch[i] = 0;
87 fh3PtJet1VsRatVsHPtTagged[i] = 0;
88 fh3PtJet1VsRatVsHPtTaggedMatch[i] = 0;
91 fPtTTMin = new TArrayF();
92 fPtTTMax = new TArrayF();
94 SetMakeGeneralHistograms(kTRUE);
97 //________________________________________________________________________
98 AliAnalysisTaskEmcalHJetMass::AliAnalysisTaskEmcalHJetMass(const char *name) :
99 AliAnalysisTaskEmcalJet(name, kTRUE),
102 fMinFractionShared(0),
106 fTriggerTrackType(kInclusive),
113 fh3PtJet1VsMassVsHPtAllSel(0),
114 fh3PtJet1VsMassVsHPtAllSelMatch(0),
115 fh3PtJet1VsMassVsHPtTagged(0),
116 fh3PtJet1VsMassVsHPtTaggedMatch(0),
117 fh3PtJet1VsRatVsHPtAllSel(0),
118 fh3PtJet1VsRatVsHPtAllSelMatch(0),
119 fh3PtJet1VsRatVsHPtTagged(0),
120 fh3PtJet1VsRatVsHPtTaggedMatch(0)
122 // Standard constructor.
124 fh1PtHadron = new TH1F*[fNcentBins];
125 fh3PtHPtJDPhi = new TH3F*[fNcentBins];
126 fh3PtJet1VsMassVsHPtAllSel = new TH3F*[fNcentBins];
127 fh3PtJet1VsMassVsHPtAllSelMatch = new TH3F*[fNcentBins];
128 fh3PtJet1VsMassVsHPtTagged = new TH3F*[fNcentBins];
129 fh3PtJet1VsMassVsHPtTaggedMatch = new TH3F*[fNcentBins];
130 fh3PtJet1VsRatVsHPtAllSel = new TH3F*[fNcentBins];
131 fh3PtJet1VsRatVsHPtAllSelMatch = new TH3F*[fNcentBins];
132 fh3PtJet1VsRatVsHPtTagged = new TH3F*[fNcentBins];
133 fh3PtJet1VsRatVsHPtTaggedMatch = new TH3F*[fNcentBins];
135 for (Int_t i = 0; i < fNcentBins; i++) {
137 fh3PtHPtJDPhi[i] = 0;
138 fh3PtJet1VsMassVsHPtAllSel[i] = 0;
139 fh3PtJet1VsMassVsHPtAllSelMatch[i] = 0;
140 fh3PtJet1VsMassVsHPtTagged[i] = 0;
141 fh3PtJet1VsMassVsHPtTaggedMatch[i] = 0;
142 fh3PtJet1VsRatVsHPtAllSel[i] = 0;
143 fh3PtJet1VsRatVsHPtAllSelMatch[i] = 0;
144 fh3PtJet1VsRatVsHPtTagged[i] = 0;
145 fh3PtJet1VsRatVsHPtTaggedMatch[i] = 0;
148 fPtTTMin = new TArrayF();
149 fPtTTMax = new TArrayF();
151 SetMakeGeneralHistograms(kTRUE);
154 //________________________________________________________________________
155 AliAnalysisTaskEmcalHJetMass::~AliAnalysisTaskEmcalHJetMass()
159 if(fRandom) delete fRandom;
160 if(fPtTTMin) delete fPtTTMin;
161 if(fPtTTMax) delete fPtTTMax;
164 //________________________________________________________________________
165 void AliAnalysisTaskEmcalHJetMass::UserCreateOutputObjects()
167 // Create user output.
169 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
171 Bool_t oldStatus = TH1::AddDirectoryStatus();
172 TH1::AddDirectory(kFALSE);
174 const Int_t nBinsPt = 200;
175 const Double_t minPt = -50.;
176 const Double_t maxPt = 150.;
178 const Int_t nBinsM = 100;
179 const Double_t minM = -20.;
180 const Double_t maxM = 80.;
182 const Int_t nBinsR = 100;
183 const Double_t minR = -0.2;
184 const Double_t maxR = 0.8;
186 const Int_t nBinsPtH = 100;
187 const Double_t minPtH = 0.;
188 const Double_t maxPtH = 100.;
190 const Int_t nBinsPhi = 18*4;
191 const Double_t minPhi = -0.5*TMath::Pi();
192 const Double_t maxPhi = 1.5*TMath::Pi();
194 TString histName = "";
195 TString histTitle = "";
196 for (Int_t i = 0; i < fNcentBins; i++) {
197 histName = TString::Format("fh1PtHadron_%d",i);
198 histTitle = TString::Format("%s;#it{p}_{T,h}",histName.Data());
199 fh1PtHadron[i] = new TH1F(histName.Data(),histTitle.Data(),200.,0.,200.);
200 fOutput->Add(fh1PtHadron[i]);
202 histName = TString::Format("fh3PtHPtJDPhi_%d",i);
203 histTitle = TString::Format("%s;#it{p}_{T,h};#it{p}_{T,jet};#Delta#varphi_{h,jet}",histName.Data());
204 fh3PtHPtJDPhi[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPtH,minPtH,maxPtH,nBinsPt,minPt,maxPt,nBinsPhi,minPhi,maxPhi);
205 fOutput->Add(fh3PtHPtJDPhi[i]);
207 histName = TString::Format("fh3PtJet1VsMassVsHPtAllSel_%d",i);
208 histTitle = TString::Format("%s;#it{p}_{T,jet1};#it{M}_{jet1};#it{p}_{T,h}",histName.Data());
209 fh3PtJet1VsMassVsHPtAllSel[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsM,minM,maxM,nBinsPtH,minPtH,maxPtH);
210 fOutput->Add(fh3PtJet1VsMassVsHPtAllSel[i]);
212 histName = TString::Format("fh3PtJet1VsMassVsHPtAllSelMatch_%d",i);
213 histTitle = TString::Format("%s;#it{p}_{T,jet1};#it{M}_{jet1};#it{p}_{T,h}",histName.Data());
214 fh3PtJet1VsMassVsHPtAllSelMatch[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsM,minM,maxM,nBinsPtH,minPtH,maxPtH);
215 fOutput->Add(fh3PtJet1VsMassVsHPtAllSelMatch[i]);
217 histName = TString::Format("fh3PtJet1VsMassVsHPtTagged_%d",i);
218 histTitle = TString::Format("%s;#it{p}_{T,jet1};#it{M}_{jet1};#it{p}_{T,h}",histName.Data());
219 fh3PtJet1VsMassVsHPtTagged[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsM,minM,maxM,nBinsPtH,minPtH,maxPtH);
220 fOutput->Add(fh3PtJet1VsMassVsHPtTagged[i]);
222 histName = TString::Format("fh3PtJet1VsMassVsHPtTaggedMatch_%d",i);
223 histTitle = TString::Format("%s;#it{p}_{T,jet1};#it{M}_{jet1};#it{p}_{T,h}",histName.Data());
224 fh3PtJet1VsMassVsHPtTaggedMatch[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsM,minM,maxM,nBinsPtH,minPtH,maxPtH);
225 fOutput->Add(fh3PtJet1VsMassVsHPtTaggedMatch[i]);
228 histName = TString::Format("fh3PtJet1VsRatVsHPtAllSel_%d",i);
229 histTitle = TString::Format("%s;#it{p}_{T,jet1};#it{M}_{jet1}/#it{p}_{T,jet1};#it{p}_{T,h}",histName.Data());
230 fh3PtJet1VsRatVsHPtAllSel[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsR,minR,maxR,nBinsPtH,minPtH,maxPtH);
231 fOutput->Add(fh3PtJet1VsRatVsHPtAllSel[i]);
233 histName = TString::Format("fh3PtJet1VsRatVsHPtAllSelMatch_%d",i);
234 histTitle = TString::Format("%s;#it{p}_{T,jet1};#it{M}_{jet1}/#it{p}_{T,jet1};#it{p}_{T,h}",histName.Data());
235 fh3PtJet1VsRatVsHPtAllSelMatch[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsR,minR,maxR,nBinsPtH,minPtH,maxPtH);
236 fOutput->Add(fh3PtJet1VsRatVsHPtAllSelMatch[i]);
238 histName = TString::Format("fh3PtJet1VsRatVsHPtTagged_%d",i);
239 histTitle = TString::Format("%s;#it{p}_{T,jet1};#it{M}_{jet1}/#it{p}_{T,jet1};#it{p}_{T,h}",histName.Data());
240 fh3PtJet1VsRatVsHPtTagged[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsR,minR,maxR,nBinsPtH,minPtH,maxPtH);
241 fOutput->Add(fh3PtJet1VsRatVsHPtTagged[i]);
243 histName = TString::Format("fh3PtJet1VsRatVsHPtTaggedMatch_%d",i);
244 histTitle = TString::Format("%s;#it{p}_{T,jet1};#it{M}_{jet1}/#it{p}_{T,jet1};#it{p}_{T,h}",histName.Data());
245 fh3PtJet1VsRatVsHPtTaggedMatch[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsR,minR,maxR,nBinsPtH,minPtH,maxPtH);
246 fOutput->Add(fh3PtJet1VsRatVsHPtTaggedMatch[i]);
249 TH1::AddDirectory(oldStatus);
251 fRandom = new TRandom3(0);
253 PostData(1, fOutput); // Post data for ALL output slots > 0 here.
256 //________________________________________________________________________
257 Bool_t AliAnalysisTaskEmcalHJetMass::Run()
259 // Run analysis code here, if needed. It will be executed before FillHistograms().
261 AliParticleContainer *pCont = GetParticleContainer(0);
262 AliJetContainer *jCont = GetJetContainer(fContainerBase);
263 if(!pCont || !jCont) return kFALSE;
265 AliVParticle *vp = NULL;
267 if(fTriggerTrackType==kInclusive) {
268 pCont->ResetCurrentID();
269 while((vp = pCont->GetNextAcceptParticle())) {
270 fh1PtHadron[fCentBin]->Fill(vp->Pt()); //all hadrons
271 AliEmcalJet* jet = NULL;
273 jCont->ResetCurrentID();
274 while((jet = jCont->GetNextAcceptJet())) {
275 Double_t dphi = GetDeltaPhi(vp,jet)-TMath::Pi();
276 fh3PtHPtJDPhi[fCentBin]->Fill(vp->Pt(),jet->Pt() - GetRhoVal(fContainerBase)*jet->Area(),dphi);
277 if(dphi>fDPhiHJetMax) continue;
278 FillHJetHistograms(vp,jet);
283 else if(fTriggerTrackType==kSingleInclusive) {
284 for(Int_t it = 0; it<fPtTTMin->GetSize(); it++) {
285 vp = GetSingleInclusiveTT(pCont,fPtTTMin->At(it),fPtTTMax->At(it));
287 fh1PtHadron[fCentBin]->Fill(vp->Pt()); //all trigger tracks
288 AliEmcalJet* jet = NULL;
289 jCont->ResetCurrentID();
290 while((jet = jCont->GetNextAcceptJet())) {
291 Double_t dphi = GetDeltaPhi(vp,jet)-TMath::Pi();
292 fh3PtHPtJDPhi[fCentBin]->Fill(vp->Pt(),jet->Pt() - GetRhoVal(fContainerBase)*jet->Area(),dphi);
293 if(dphi>fDPhiHJetMax) continue;
294 FillHJetHistograms(vp,jet);
296 }//trigger track types
301 //________________________________________________________________________
302 AliVParticle* AliAnalysisTaskEmcalHJetMass::GetSingleInclusiveTT(AliParticleContainer *pCont, Double_t ptmin, Double_t ptmax) const {
304 TArrayI arr; arr.Set(pCont->GetNParticles());
307 pCont->ResetCurrentID();
308 while((vp = pCont->GetNextAcceptParticle())) {
309 if(vp->Pt()>=ptmin && vp->Pt()<ptmax ) {
311 arr.SetAt(pCont->GetCurrentID(),counter);
314 if(counter<0) return NULL;
315 //select trigger track randomly
316 fRandom->SetSeed(arr.At(0)); //random selection reproducible
317 Double_t rnd = fRandom->Uniform() * counter;
318 Int_t trigID = arr.At(TMath::FloorNint(rnd));
319 vp = pCont->GetParticle(trigID);
323 //________________________________________________________________________
324 Bool_t AliAnalysisTaskEmcalHJetMass::FillHJetHistograms(const AliVParticle *vp, const AliEmcalJet *jet)
326 // Fill hadron-jet histograms.
327 Double_t pt = vp->Pt();
328 Double_t ptJet = jet->Pt() - GetRhoVal(fContainerBase)*jet->Area();
329 Double_t mJet = GetJetMass(jet);
331 if(ptJet<0. || ptJet>0.) rat = mJet/ptJet;
333 fh3PtJet1VsMassVsHPtAllSel[fCentBin]->Fill(ptJet,mJet,pt);
334 fh3PtJet1VsRatVsHPtAllSel[fCentBin]->Fill(ptJet,rat,pt);
336 Double_t fraction = -1.;
338 AliEmcalJet *jetUS = NULL;
339 AliJetContainer *jetContUS = GetJetContainer(fContainerUnsub);
342 for(Int_t i = 0; i<jetContUS->GetNJets(); i++) {
343 jetUS = jetContUS->GetJet(i);
344 if(jetUS->GetLabel()==jet->GetLabel()) {
346 if(ifound==1) ilab = i;
349 if(ifound>1) AliDebug(2,Form("Found %d partners",ifound));
350 if(ifound==0) jetUS = 0x0;
351 else jetUS = jetContUS->GetJet(ilab);
352 fraction = jetContUS->GetFractionSharedPt(jetUS);
354 AliJetContainer *jetCont = GetJetContainer(fContainerBase);
355 fraction = jetCont->GetFractionSharedPt(jet);
358 if(fMinFractionShared>0. && fraction>fMinFractionShared) {
359 if(vp->TestBits(fEmbConstSel) != (Int_t)fEmbConstSel)
360 AliDebug(11,Form("Skipping track with pT=%f because it does not match the bit mask (%d, %d)", vp->Pt(), fEmbConstSel, vp->TestBits(fEmbConstSel)));
362 fh3PtJet1VsMassVsHPtAllSelMatch[fCentBin]->Fill(ptJet,mJet,pt);
363 fh3PtJet1VsRatVsHPtAllSelMatch[fCentBin]->Fill(ptJet,rat,pt);
367 if(jet->GetTagStatus()<1 || !jet->GetTaggedJet())
370 fh3PtJet1VsMassVsHPtTagged[fCentBin]->Fill(ptJet,mJet,pt);
371 fh3PtJet1VsRatVsHPtTagged[fCentBin]->Fill(ptJet,rat,pt);
373 if(fMinFractionShared>0. && fraction>fMinFractionShared) {
374 if(vp->TestBits(fEmbConstSel) != (Int_t)fEmbConstSel)
375 AliDebug(11,Form("Skipping track with pT=%f because it does not match the bit mask (%d, %d)", vp->Pt(), fEmbConstSel, vp->TestBits(fEmbConstSel)));
377 fh3PtJet1VsMassVsHPtTaggedMatch[fCentBin]->Fill(ptJet,mJet,pt);
378 fh3PtJet1VsRatVsHPtTaggedMatch[fCentBin]->Fill(ptJet,rat,pt);
384 //________________________________________________________________________
385 Double_t AliAnalysisTaskEmcalHJetMass::GetJetMass(const AliEmcalJet *jet) const {
386 //calc subtracted jet mass
387 if(fJetMassType==kRaw)
389 else if(fJetMassType==kDeriv)
390 return jet->GetSecondOrderSubtracted();
395 //________________________________________________________________________
396 Double_t AliAnalysisTaskEmcalHJetMass::GetDeltaPhi(const AliVParticle *vp, const AliEmcalJet* jet) const {
397 // Calculate azimuthal angle between particle and jet. range:[-0.5\pi,1.5\pi]
398 return GetDeltaPhi(vp->Phi(),jet->Phi());
401 //________________________________________________________________________
402 Double_t AliAnalysisTaskEmcalHJetMass::GetDeltaPhi(Double_t phi1, Double_t phi2) const {
403 // Calculate azimuthal angle between phi1 and phi2. range:[-0.5\pi,1.5\pi]
404 Double_t dPhi = phi1-phi2;
405 if(dPhi <-0.5*TMath::Pi()) dPhi += TMath::TwoPi();
406 if(dPhi > 1.5*TMath::Pi()) dPhi -= TMath::TwoPi();
411 //________________________________________________________________________
412 Bool_t AliAnalysisTaskEmcalHJetMass::RetrieveEventObjects() {
414 // retrieve event objects
416 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
422 //________________________________________________________________________
423 void AliAnalysisTaskEmcalHJetMass::AddTriggerTrackPtCuts(Float_t min, Float_t max) {
424 if(!fPtTTMin) fPtTTMin = new TArrayF();
425 if(!fPtTTMax) fPtTTMax = new TArrayF();
426 Int_t newSize = fPtTTMin->GetSize()+1;
427 fPtTTMin->Set(newSize);
428 fPtTTMax->Set(newSize);
429 fPtTTMin->AddAt(min,newSize-1);
430 fPtTTMax->AddAt(max,newSize-1);
433 //_______________________________________________________________________
434 void AliAnalysisTaskEmcalHJetMass::Terminate(Option_t *)
436 // Called once at the end of the analysis.