2 // Jet mass structure analysis task.
6 #include <TClonesArray.h>
10 #include <TProfile2D.h>
11 #include <THnSparse.h>
13 #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 "AliMCEvent.h"
29 #include "AliGenPythiaEventHeader.h"
30 #include "AliAODMCHeader.h"
31 #include "AliMCEvent.h"
32 #include "AliAnalysisManager.h"
33 #include "AliJetContainer.h"
35 #include "AliAODEvent.h"
37 #include "AliAnalysisTaskEmcalJetMassStructure.h"
39 ClassImp(AliAnalysisTaskEmcalJetMassStructure)
41 //________________________________________________________________________
42 AliAnalysisTaskEmcalJetMassStructure::AliAnalysisTaskEmcalJetMassStructure() :
43 AliAnalysisTaskEmcalJet("AliAnalysisTaskEmcalJetMassStructure", kTRUE),
45 fMinFractionShared(0),
56 fhnMassResponseCorr(0),
59 // Default constructor.
61 fh3PtDRMass = new TH3F*[fNcentBins];
62 fh3PtDRRho = new TH3F*[fNcentBins];
63 fh3PtDRMassCorr = new TH3F*[fNcentBins];
64 fh3PtDRRhoCorr = new TH3F*[fNcentBins];
65 fh2PtMass = new TH2F*[fNcentBins];
66 fh2PtMassCorr = new TH2F*[fNcentBins];
67 fh3JetPtDRTrackPt = new TH3F*[fNcentBins];
69 for (Int_t i = 0; i < fNcentBins; i++) {
72 fh3PtDRMassCorr[i] = 0;
73 fh3PtDRRhoCorr[i] = 0;
76 fh3JetPtDRTrackPt[i] = 0;
79 SetMakeGeneralHistograms(kTRUE);
82 //________________________________________________________________________
83 AliAnalysisTaskEmcalJetMassStructure::AliAnalysisTaskEmcalJetMassStructure(const char *name) :
84 AliAnalysisTaskEmcalJet(name, kTRUE),
86 fMinFractionShared(0),
97 fhnMassResponseCorr(0),
100 // Standard constructor.
102 fh3PtDRMass = new TH3F*[fNcentBins];
103 fh3PtDRRho = new TH3F*[fNcentBins];
104 fh3PtDRMassCorr = new TH3F*[fNcentBins];
105 fh3PtDRRhoCorr = new TH3F*[fNcentBins];
106 fh2PtMass = new TH2F*[fNcentBins];
107 fh2PtMassCorr = new TH2F*[fNcentBins];
108 fh3JetPtDRTrackPt = new TH3F*[fNcentBins];
110 for (Int_t i = 0; i < fNcentBins; i++) {
113 fh3PtDRMassCorr[i] = 0;
114 fh3PtDRRhoCorr[i] = 0;
116 fh2PtMassCorr[i] = 0;
117 fh3JetPtDRTrackPt[i] = 0;
120 SetMakeGeneralHistograms(kTRUE);
123 //________________________________________________________________________
124 AliAnalysisTaskEmcalJetMassStructure::~AliAnalysisTaskEmcalJetMassStructure()
131 //________________________________________________________________________
132 void AliAnalysisTaskEmcalJetMassStructure::UserCreateOutputObjects()
134 // Create user output.
136 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
138 if(!fRandom) fRandom = new TRandom3(0);
140 Bool_t oldStatus = TH1::AddDirectoryStatus();
141 TH1::AddDirectory(kFALSE);
143 const Int_t nBinsPt = 200;
144 const Double_t minPt = -50.;
145 const Double_t maxPt = 150.;
146 Double_t *binsPt = new Double_t[nBinsPt+1];
147 for(Int_t i=0; i<=nBinsPt; i++) binsPt[i]=(Double_t)minPt + (maxPt-minPt)/nBinsPt*(Double_t)i ;
149 const Int_t nBinsM = 120;
150 const Double_t minM = -20.;
151 const Double_t maxM = 40.;
152 Double_t *binsM = new Double_t[nBinsM+1];
153 for(Int_t i=0; i<=nBinsM; i++) binsM[i]=(Double_t)minM + (maxM-minM)/nBinsM*(Double_t)i ;
155 const Int_t nBinsR = 80;
156 const Double_t minR = -0.005;
157 const Double_t maxR = 0.795;
158 Double_t *binsR = new Double_t[nBinsR+1];
159 for(Int_t i=0; i<=nBinsR; i++) binsR[i]=(Double_t)minR + (maxR-minR)/nBinsR*(Double_t)i ;
162 Double_t binWidth1 = 0.1;
163 Double_t binWidth2 = 1.;
164 Double_t binWidth3 = 1.;
165 const Float_t ptmin1 = 0.;
166 const Float_t ptmax1 = 5.;
167 const Float_t ptmin2 = ptmax1;
168 const Float_t ptmax2 = 10.;
169 const Float_t ptmin3 = ptmax2 ;
170 const Float_t ptmax3 = 100.;
171 const Int_t nbin11 = (int)((ptmax1-ptmin1)/binWidth1);
172 const Int_t nbin12 = (int)((ptmax2-ptmin2)/binWidth2)+nbin11;
173 const Int_t nbin13 = (int)((ptmax3-ptmin3)/binWidth3)+nbin12;
174 Int_t nBinsPtTr=nbin13;
175 //Create array with low edges of each bin
176 Double_t *binsPtTr=new Double_t[nBinsPtTr+1];
177 for(Int_t i=0; i<=nBinsPtTr; i++) {
178 if(i<=nbin11) binsPtTr[i]=(Double_t)ptmin1 + (ptmax1-ptmin1)/nbin11*(Double_t)i ;
179 if(i<=nbin12 && i>nbin11) binsPtTr[i]=(Double_t)ptmin2 + (ptmax2-ptmin2)/(nbin12-nbin11)*((Double_t)i-(Double_t)nbin11) ;
180 if(i<=nbin13 && i>nbin12) binsPtTr[i]=(Double_t)ptmin3 + (ptmax3-ptmin3)/(nbin13-nbin12)*((Double_t)i-(Double_t)nbin12) ;
183 //Binning for THnSparse
184 const Int_t nBinsSparse0 = 5;
185 const Int_t nBins0[nBinsSparse0] = {nBinsM,nBinsM,nBinsPt,nBinsPt};
186 const Double_t xmin0[nBinsSparse0] = { minM, minM, minPt, minPt};
187 const Double_t xmax0[nBinsSparse0] = { maxM, maxM, maxPt, maxPt};
189 TString histName = "";
190 TString histTitle = "";
191 for (Int_t i = 0; i < fNcentBins; i++) {
192 histName = TString::Format("fh3PtDRMass_%d",i);
193 histTitle = TString::Format("%s;#it{p}_{T,jet};r;sum m",histName.Data());
194 fh3PtDRMass[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsR,minR,maxR,101,-0.005,1.005);
195 fOutput->Add(fh3PtDRMass[i]);
197 histName = TString::Format("fh3PtDRRho_%d",i);
198 histTitle = TString::Format("%s;#it{p}_{T,jet};r;sum #it{p}_{T}",histName.Data());
199 fh3PtDRRho[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsR,minR,maxR,101,-0.005,1.005);
200 fOutput->Add(fh3PtDRRho[i]);
202 histName = TString::Format("fh3PtDRMassCorr_%d",i);
203 histTitle = TString::Format("%s;#it{p}_{T,jet};r;sum m",histName.Data());
204 fh3PtDRMassCorr[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsR,minR,maxR,101,-0.005,1.005);
205 fOutput->Add(fh3PtDRMassCorr[i]);
207 histName = TString::Format("fh3PtDRRhoCorr_%d",i);
208 histTitle = TString::Format("%s;#it{p}_{T,jet};r;sum #it{p}_{T}",histName.Data());
209 fh3PtDRRhoCorr[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsR,minR,maxR,101,-0.005,1.005);
210 fOutput->Add(fh3PtDRRhoCorr[i]);
212 histName = TString::Format("fh2PtMass_%d",i);
213 histTitle = TString::Format("%s;#it{p}_{T,jet};#it{M}_{jet}",histName.Data());
214 fh2PtMass[i] = new TH2F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsM,minM,maxM);
215 fOutput->Add(fh2PtMass[i]);
217 histName = TString::Format("fh2PtMassCorr_%d",i);
218 histTitle = TString::Format("%s;#it{p}_{T,jet};#it{M}_{jet}",histName.Data());
219 fh2PtMassCorr[i] = new TH2F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,nBinsM,minM,maxM);
220 fOutput->Add(fh2PtMassCorr[i]);
222 histName = TString::Format("fh3JetPtDRTrackPt_%d",i);
223 histTitle = TString::Format("%s;#it{p}_{T,jet};r;#it{p}_{T,track}",histName.Data());
224 fh3JetPtDRTrackPt[i] = new TH3F(histName.Data(),histTitle.Data(),nBinsPt,binsPt,nBinsR,binsR,nBinsPtTr,binsPtTr);
225 fOutput->Add(fh3JetPtDRTrackPt[i]);
228 histName = "fhnMassResponse";
229 histTitle = Form("%s;#it{M}_{det};#it{M}_{part};#it{p}_{T,det};#it{p}_{T,part}",histName.Data());
230 fhnMassResponse = new THnSparseF(histName.Data(),histTitle.Data(),nBinsSparse0,nBins0,xmin0,xmax0);
231 fOutput->Add(fhnMassResponse);
233 histName = "fhnMassResponseCorr";
234 histTitle = Form("%s;#it{M}_{det};#it{M}_{part};#it{p}_{T,det};#it{p}_{T,part}",histName.Data());
235 fhnMassResponseCorr = new THnSparseF(histName.Data(),histTitle.Data(),nBinsSparse0,nBins0,xmin0,xmax0);
236 fOutput->Add(fhnMassResponseCorr);
238 // =========== Switch on Sumw2 for all histos ===========
239 for (Int_t i=0; i<fOutput->GetEntries(); ++i) {
240 TH1 *h1 = dynamic_cast<TH1*>(fOutput->At(i));
245 THnSparse *hn = dynamic_cast<THnSparse*>(fOutput->At(i));
249 TH1::AddDirectory(oldStatus);
251 PostData(1, fOutput); // Post data for ALL output slots > 0 here.
253 if(binsPt) delete [] binsPt;
254 if(binsPtTr) delete [] binsPtTr;
255 if(binsM) delete [] binsM;
256 if(binsR) delete [] binsR;
260 //________________________________________________________________________
261 Bool_t AliAnalysisTaskEmcalJetMassStructure::Run()
263 // Run analysis code here, if needed. It will be executed before FillHistograms().
268 //________________________________________________________________________
269 Bool_t AliAnalysisTaskEmcalJetMassStructure::FillHistograms()
273 // study how jet mass builds up as function of radial distance to jet axis
275 AliEmcalJet* jet1 = NULL;
276 AliJetContainer *jetCont = GetJetContainer(fContainerBase);
278 jetCont->ResetCurrentID();
279 while((jet1 = jetCont->GetNextAcceptJet())) {
281 Double_t ptJet1 = jet1->Pt() - GetRhoVal(fContainerBase)*jet1->Area();
282 Double_t mJet1 = GetJetMass(jet1);
284 // if(jet1->GetTagStatus()<1 || !jet1->GetTaggedJet())
287 //Sort array based on distance to jet axis
288 static Int_t indexes[9999] = {-1};
289 static Float_t dr[9999] = {0};
290 if(!GetSortedArray(indexes,dr,jet1)) continue;
293 TLorentzVector sumVec; sumVec.SetPtEtaPhiM(0.,0.,0.,0.);
294 TLorentzVector corrVec; corrVec.SetPtEtaPhiM(0.,0.,0.,0.);
295 TLorentzVector curVec;
296 for(Int_t i=jet1->GetNumberOfTracks()-1; i>-1; i--) {
297 vp = static_cast<AliVParticle*>(jet1->TrackAt(indexes[i], fTracks));
300 fh3JetPtDRTrackPt[fCentBin]->Fill(ptJet1,dr[indexes[i]],vp->Pt());
302 curVec.SetPtEtaPhiM(vp->Pt(),vp->Eta(),vp->Phi(),vp->M());
305 // Printf("%d %f",i,dr[indexes[i]]);
306 fh3PtDRMass[fCentBin]->Fill(ptJet1,dr[indexes[i]],sumVec.M()/mJet1);
307 fh3PtDRRho[fCentBin]->Fill(ptJet1,dr[indexes[i]],sumVec.Pt()/ptJet1);
309 fh3PtDRMassCorr[fCentBin]->Fill(ptJet1,dr[indexes[i]],corrVec.M()/mJet1);
310 fh3PtDRRhoCorr[fCentBin]->Fill(ptJet1,dr[indexes[i]],corrVec.Pt()/ptJet1);
312 Double_t eff = GetEfficiency(vp->Pt());
313 Double_t rnd = fRandom->Uniform(1.);
314 if(rnd>eff) {//put particle back at random position in annulus; using now zero width for annulus
315 Double_t t = TMath::TwoPi()*gRandom->Uniform(1.);
316 Double_t rr = dr[indexes[i]];
317 rr = fRandom->Uniform(0.,jetCont->GetJetRadius());
318 Double_t deta = rr*TMath::Cos(t);
319 Double_t dphi = rr*TMath::Sin(t);
320 curVec.SetPtEtaPhiM(vp->Pt(),deta+jet1->Eta(),dphi+jet1->Phi(),vp->M());
323 fh3PtDRMassCorr[fCentBin]->Fill(ptJet1,dr[indexes[i]],corrVec.M()/mJet1);
324 fh3PtDRRhoCorr[fCentBin]->Fill(ptJet1,dr[indexes[i]],corrVec.Pt()/ptJet1);
328 fh2PtMass[fCentBin]->Fill(ptJet1,mJet1);
329 fh2PtMassCorr[fCentBin]->Fill(corrVec.Pt(), corrVec.M());
331 //fill detector response
332 AliEmcalJet *jPart = jet1->ClosestJet();
334 Double_t var[4] = {mJet1,jPart->M(),ptJet1,jPart->Pt()};
335 fhnMassResponse->Fill(var);
337 Double_t varCorr[4] = {corrVec.M(),jPart->M(),corrVec.Pt(),jPart->Pt()};
338 fhnMassResponseCorr->Fill(varCorr);
346 //________________________________________________________________________
347 Double_t AliAnalysisTaskEmcalJetMassStructure::GetEfficiency(Double_t pt) {
350 if(fEfficiencyFixed<1.) return fEfficiencyFixed;
355 //________________________________________________________________________
356 Bool_t AliAnalysisTaskEmcalJetMassStructure::GetSortedArray(Int_t indexes[], Float_t dr[], AliEmcalJet *jet) const
360 const Int_t n = (Int_t)jet->GetNumberOfTracks();//(Int_t)array.size();
366 for (Int_t i = 0; i < n; i++) {
367 vp = static_cast<AliVParticle*>(jet->TrackAt(i, fTracks));
369 dr[i] = jet->DeltaR(vp);
372 TMath::Sort(n, dr, indexes);
378 //________________________________________________________________________
379 Double_t AliAnalysisTaskEmcalJetMassStructure::GetJetMass(AliEmcalJet *jet) {
380 //calc subtracted jet mass
381 if(fJetMassType==kRaw)
383 else if(fJetMassType==kDeriv)
384 return jet->GetSecondOrderSubtracted();
389 //________________________________________________________________________
390 Bool_t AliAnalysisTaskEmcalJetMassStructure::RetrieveEventObjects() {
392 // retrieve event objects
394 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
400 //_______________________________________________________________________
401 void AliAnalysisTaskEmcalJetMassStructure::Terminate(Option_t *)
403 // Called once at the end of the analysis.