2 // Do subtraction for jet shapes using constituents arXiv:1403.3108
6 #include <TClonesArray.h>
10 #include <THnSparse.h>
13 #include <TLorentzVector.h>
21 #include "AliVCluster.h"
22 #include "AliVTrack.h"
23 #include "AliEmcalJet.h"
24 #include "AliRhoParameter.h"
26 #include "AliEmcalParticle.h"
27 #include "AliMCEvent.h"
28 #include "AliAODEvent.h"
29 #include "AliGenPythiaEventHeader.h"
30 #include "AliAODMCHeader.h"
31 #include "AliAnalysisManager.h"
32 #include "AliJetContainer.h"
33 #include "AliParticleContainer.h"
35 #include "AliAnalysisTaskJetShapeConst.h"
37 ClassImp(AliAnalysisTaskJetShapeConst)
39 //________________________________________________________________________
40 AliAnalysisTaskJetShapeConst::AliAnalysisTaskJetShapeConst() :
41 AliAnalysisTaskEmcalJet("AliAnalysisTaskJetShapeConst", kTRUE),
45 fMinFractionShared(0),
46 fSingleTrackEmb(kFALSE),
49 fJet1Vec(new TLorentzVector()),
50 fJet2Vec(new TLorentzVector()),
51 fJetSubVec(new TLorentzVector()),
61 fh2MSubPtRawMatch(0x0),
65 fh2PtTrueDeltaMRel(0x0),
68 // Default constructor.
70 fh2MSubMatch = new TH2F*[fNcentBins];
71 fh2MSubPtRawAll = new TH2F*[fNcentBins];
72 fh2MSubPtRawMatch = new TH2F*[fNcentBins];
73 fh2MSubPtTrue = new TH2F*[fNcentBins];
74 fh2MTruePtTrue = new TH2F*[fNcentBins];
75 fh2PtTrueDeltaM = new TH2F*[fNcentBins];
76 fh2PtTrueDeltaMRel = new TH2F*[fNcentBins];
77 fhnMassResponse = new THnSparse*[fNcentBins];
79 for (Int_t i = 0; i < fNcentBins; i++) {
81 fh2MSubPtRawAll[i] = 0;
82 fh2MSubPtRawMatch[i] = 0;
84 fh2MTruePtTrue[i] = 0;
85 fh2PtTrueDeltaM[i] = 0;
86 fh2PtTrueDeltaMRel[i] = 0;
87 fhnMassResponse[i] = 0;
90 SetMakeGeneralHistograms(kTRUE);
91 if(fCreateTree) DefineOutput(2, TTree::Class());
94 //________________________________________________________________________
95 AliAnalysisTaskJetShapeConst::AliAnalysisTaskJetShapeConst(const char *name) :
96 AliAnalysisTaskEmcalJet(name, kTRUE),
100 fMinFractionShared(0),
101 fSingleTrackEmb(kFALSE),
104 fJet1Vec(new TLorentzVector()),
105 fJet2Vec(new TLorentzVector()),
106 fJetSubVec(new TLorentzVector()),
115 fh2MSubPtRawAll(0x0),
116 fh2MSubPtRawMatch(0x0),
119 fh2PtTrueDeltaM(0x0),
120 fh2PtTrueDeltaMRel(0x0),
123 // Standard constructor.
125 fh2MSubMatch = new TH2F*[fNcentBins];
126 fh2MSubPtRawAll = new TH2F*[fNcentBins];
127 fh2MSubPtRawMatch = new TH2F*[fNcentBins];
128 fh2MSubPtTrue = new TH2F*[fNcentBins];
129 fh2MTruePtTrue = new TH2F*[fNcentBins];
130 fh2PtTrueDeltaM = new TH2F*[fNcentBins];
131 fh2PtTrueDeltaMRel = new TH2F*[fNcentBins];
132 fhnMassResponse = new THnSparse*[fNcentBins];
134 for (Int_t i = 0; i < fNcentBins; i++) {
136 fh2MSubPtRawAll[i] = 0;
137 fh2MSubPtRawMatch[i] = 0;
138 fh2MSubPtTrue[i] = 0;
139 fh2MTruePtTrue[i] = 0;
140 fh2PtTrueDeltaM[i] = 0;
141 fh2PtTrueDeltaMRel[i] = 0;
142 fhnMassResponse[i] = 0;
145 SetMakeGeneralHistograms(kTRUE);
146 if(fCreateTree) DefineOutput(2, TTree::Class());
149 //________________________________________________________________________
150 AliAnalysisTaskJetShapeConst::~AliAnalysisTaskJetShapeConst()
155 //________________________________________________________________________
156 void AliAnalysisTaskJetShapeConst::UserCreateOutputObjects()
158 // Create user output.
160 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
162 Bool_t oldStatus = TH1::AddDirectoryStatus();
163 TH1::AddDirectory(kFALSE);
165 const Int_t nBinsPt = 200;
166 const Double_t minPt = -50.;
167 const Double_t maxPt = 150.;
169 const Int_t nBinsM = 100;
170 const Double_t minM = -20.;
171 const Double_t maxM = 80.;
173 // const Int_t nBinsMT = 50;
174 // const Double_t minMT = 0.;
175 // const Double_t maxMT = 50.;
177 const Int_t nBinsDRToLJ = 20; //distance to leading jet in Pb-Pb only event
178 const Double_t minDRToLJ = 0.;
179 const Double_t maxDRToLJ = 1.;
181 //Binning for THnSparse
182 const Int_t nBinsSparse0 = 5;
183 const Int_t nBins0[nBinsSparse0] = {nBinsM,nBinsM,nBinsPt,nBinsPt,nBinsDRToLJ};
184 const Double_t xmin0[nBinsSparse0] = { minM, minM, minPt, minPt, minDRToLJ};
185 const Double_t xmax0[nBinsSparse0] = { maxM, maxM, maxPt, maxPt, maxDRToLJ};
187 TString histName = "";
188 TString histTitle = "";
189 for (Int_t i = 0; i < fNcentBins; i++) {
190 histName = Form("fh2MSubMatch_%d",i);
191 histTitle = Form("fh2MSubMatch_%d;#it{M}_{sub};match",i);
192 fh2MSubMatch[i] = new TH2F(histName.Data(),histTitle.Data(),nBinsM,minM,maxM,2,-0.5,1.5);
193 fOutput->Add(fh2MSubMatch[i]);
195 histName = Form("fh2MSubPtRawAll_%d",i);
196 histTitle = Form("fh2MSubPtRawAll_%d;#it{M}_{sub};#it{p}_{T}",i);
197 fh2MSubPtRawAll[i] = new TH2F(histName.Data(),histTitle.Data(),nBinsM,minM,maxM,nBinsPt,minPt,maxPt);
198 fOutput->Add(fh2MSubPtRawAll[i]);
200 histName = Form("fh2MSubPtRawMatch_%d",i);
201 histTitle = Form("fh2MSubPtRawMatch_%d;#it{M}_{sub};#it{p}_{T}",i);
202 fh2MSubPtRawMatch[i] = new TH2F(histName.Data(),histTitle.Data(),nBinsM,minM,maxM,nBinsPt,minPt,maxPt);
203 fOutput->Add(fh2MSubPtRawMatch[i]);
205 histName = Form("fh2MSubPtTrue_%d",i);
206 histTitle = Form("fh2MSubPtTrue_%d;#it{M}_{sub};#it{p}_{T}",i);
207 fh2MSubPtTrue[i] = new TH2F(histName.Data(),histTitle.Data(),nBinsM,minM,maxM,nBinsPt,minPt,maxPt);
208 fOutput->Add(fh2MSubPtTrue[i]);
210 histName = Form("fh2MTruePtTrue_%d",i);
211 histTitle = Form("fh2MTruePtTrue_%d;#it{M}_{sub};#it{p}_{T}",i);
212 fh2MTruePtTrue[i] = new TH2F(histName.Data(),histTitle.Data(),nBinsM,minM,maxM,nBinsPt,minPt,maxPt);
213 fOutput->Add(fh2MTruePtTrue[i]);
215 histName = Form("fh2PtTrueDeltaM_%d",i);
216 histTitle = Form("fh2PtTrueDeltaM_%d;#it{p}_{T,true};#it{M}_{sub}-#it{M}_{true}",i);
217 fh2PtTrueDeltaM[i] = new TH2F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,100,-50.,50.);
218 fOutput->Add(fh2PtTrueDeltaM[i]);
220 histName = Form("fh2PtTrueDeltaMRel_%d",i);
221 histTitle = Form("fh2PtTrueDeltaMRel_%d;#it{p}_{T,true};(#it{M}_{sub}-#it{M}_{true})/#it{M}_{true}",i);
222 fh2PtTrueDeltaMRel[i] = new TH2F(histName.Data(),histTitle.Data(),nBinsPt,minPt,maxPt,200,-1.,1.);
223 fOutput->Add(fh2PtTrueDeltaMRel[i]);
225 histName = Form("fhnMassResponse_%d",i);
226 histTitle = Form("fhnMassResponse_%d;#it{M}_{sub};#it{M}_{true};#it{p}_{T,sub};#it{p}_{T,true};#it{M}_{sub}^{tagged}",i);
227 fhnMassResponse[i] = new THnSparseF(histName.Data(),histTitle.Data(),nBinsSparse0,nBins0,xmin0,xmax0);
228 fOutput->Add(fhnMassResponse[i]);
231 // =========== Switch on Sumw2 for all histos ===========
232 for (Int_t i=0; i<fOutput->GetEntries(); ++i) {
233 TH1 *h1 = dynamic_cast<TH1*>(fOutput->At(i));
238 THnSparse *hn = dynamic_cast<THnSparse*>(fOutput->At(i));
242 TH1::AddDirectory(oldStatus);
246 fTreeJetBkg = new TTree("fTreeJetSubConst", "fTreeJetSubConst");
247 fTreeJetBkg->Branch("fJet1Vec","TLorentzVector",&fJet1Vec);
248 fTreeJetBkg->Branch("fJet2Vec","TLorentzVector",&fJet2Vec);
249 fTreeJetBkg->Branch("fJetSubVec","TLorentzVector",&fJetSubVec);
250 fTreeJetBkg->Branch("fArea",&fArea,"fArea/F");
251 fTreeJetBkg->Branch("fAreaPhi",&fAreaPhi,"fAreaPhi/F");
252 fTreeJetBkg->Branch("fAreaEta",&fAreaEta,"fAreaEta/F");
253 fTreeJetBkg->Branch("fRho",&fRho,"fRho/F");
254 fTreeJetBkg->Branch("fRhoM",&fRhoM,"fRhoM/F");
255 fTreeJetBkg->Branch("fMatch",&fMatch,"fMatch/I");
258 PostData(1, fOutput); // Post data for ALL output slots > 0 here.
259 if(fCreateTree) PostData(2, fTreeJetBkg);
262 //________________________________________________________________________
263 Bool_t AliAnalysisTaskJetShapeConst::Run()
265 // Run analysis code here, if needed. It will be executed before FillHistograms().
270 //________________________________________________________________________
271 Bool_t AliAnalysisTaskJetShapeConst::FillHistograms()
275 AliEmcalJet* jet1 = NULL; //AA jet
276 AliEmcalJet *jet2 = NULL; //Embedded Pythia jet
277 // AliEmcalJet *jet1T = NULL; //tagged AA jet
278 // AliEmcalJet *jet2T = NULL; //tagged Pythia jet
279 AliEmcalJet *jetS = NULL; //subtracted jet
280 AliJetContainer *jetCont = GetJetContainer(fContainerBase);
281 AliJetContainer *jetContS = GetJetContainer(fContainerSub);
283 //Get leading jet in Pb-Pb event without embedded objects
284 AliJetContainer *jetContNoEmb = GetJetContainer(fContainerNoEmb);
285 AliEmcalJet *jetL = NULL;
286 if(jetContNoEmb) jetL = jetContNoEmb->GetLeadingJet("rho");
288 AliDebug(11,Form("NJets Incl: %d Csub: %d",jetCont->GetNJets(),jetContS->GetNJets()));
290 jetCont->ResetCurrentID();
291 while((jet1 = jetCont->GetNextAcceptJet())) {
296 // if(jet1->GetTagStatus()>0) jet1T = jet1->GetTaggedJet();
298 //Get constituent subtacted version of jet
301 for(Int_t i = 0; i<jetContS->GetNJets(); i++) {
302 //if(ifound==1) continue;
303 jetS = jetContS->GetJet(i);
304 if(jetS->GetLabel()==jet1->GetLabel()) { // && jetS->Pt()>0.) {
306 if(ifound==1) ilab = i;
309 if(ifound>1) AliDebug(2,Form("Found %d partners",ifound));
310 if(ifound==0) jetS = 0x0;
311 else jetS = jetContS->GetJet(ilab);
313 //Fill histograms for all AA jets
314 fh2MSubPtRawAll[fCentBin]->Fill(jetS->M(),jet1->Pt()-jetCont->GetRhoVal()*jet1->Area());
316 Double_t fraction = 0.;
318 fJet2Vec->SetPtEtaPhiM(0.,0.,0.,0.);
319 if(fSingleTrackEmb) {
320 AliVParticle *vp = GetEmbeddedConstituent(jet1);
322 fJet2Vec->SetPxPyPzE(vp->Px(),vp->Py(),vp->Pz(),vp->E());
326 jet2 = jet1->ClosestJet();
327 fraction = jetCont->GetFractionSharedPt(jet1);
329 if(fMinFractionShared>0.) {
330 if(fraction>fMinFractionShared) {
331 fJet2Vec->SetPxPyPzE(jet2->Px(),jet2->Py(),jet2->Pz(),jet2->E());
338 // if(fMatch==1 && jet2->GetTagStatus()>0) jet2T = jet2->GetTaggedJet();
340 //Fill histograms for matched jets
341 fh2MSubMatch[fCentBin]->Fill(jetS->M(),fMatch);
343 fh2MSubPtRawMatch[fCentBin]->Fill(jetS->M(),jet1->Pt()-jetCont->GetRhoVal()*jet1->Area());
345 fh2MSubPtTrue[fCentBin]->Fill(jetS->M(),jet2->Pt());
346 fh2MTruePtTrue[fCentBin]->Fill(jet2->M(),jet2->Pt());
347 fh2PtTrueDeltaM[fCentBin]->Fill(jet2->Pt(),jetS->M()-jet2->M());
348 if(jet2->M()>0.) fh2PtTrueDeltaMRel[fCentBin]->Fill(jet2->Pt(),(jetS->M()-jet2->M())/jet2->M());
349 // Double_t mJet1Tagged = -1.;
350 // if(jet1T) mJet1Tagged = jet1T->M();
351 Double_t drToLJ = 0.;
352 if(jetL) drToLJ = jet1->DeltaR(jetL);
353 Double_t var[5] = {jetS->M(),jet2->M(),jet1->Pt()-jetCont->GetRhoVal()*jet1->Area(),jet2->Pt(),drToLJ};
354 fhnMassResponse[fCentBin]->Fill(var);
359 fJet1Vec->SetPxPyPzE(jet1->Px(),jet1->Py(),jet1->Pz(),jet1->E());
360 if(jetS && jetS->Pt()>0.) fJetSubVec->SetPtEtaPhiM(jetS->Pt(),jetS->Eta(),jetS->Phi(),jetS->M());
361 else fJetSubVec->SetPtEtaPhiM(0.,0.,0.,0.);
362 fArea = (Float_t)jet1->Area();
363 fAreaPhi = (Float_t)jet1->AreaPhi();
364 fAreaEta = (Float_t)jet1->AreaEta();
365 fRho = (Float_t)jetCont->GetRhoVal();
366 fRhoM = (Float_t)jetCont->GetRhoMassVal();
367 fNConst = (Int_t)jet1->GetNumberOfTracks();
377 //________________________________________________________________________
378 AliVParticle* AliAnalysisTaskJetShapeConst::GetEmbeddedConstituent(AliEmcalJet *jet) {
380 AliJetContainer *jetCont = GetJetContainer(fContainerBase);
381 AliVParticle *vp = 0x0;
382 AliVParticle *vpe = 0x0; //embedded particle
384 for(Int_t i=0; i<jet->GetNumberOfTracks(); i++) {
385 vp = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray())); //check if fTracks is the correct track branch
386 if (vp->TestBits(TObject::kBitMask) != (Int_t)(TObject::kBitMask) ) continue;
388 else if(vp->Pt()>vpe->Pt()) vpe = vp;
391 AliDebug(11,Form("Found %d embedded particles",nc));
396 //________________________________________________________________________
397 Bool_t AliAnalysisTaskJetShapeConst::RetrieveEventObjects() {
399 // retrieve event objects
402 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
405 AliJetContainer *jetCont = GetJetContainer(fContainerBase);
406 jetCont->LoadRhoMass(InputEvent());
411 //_______________________________________________________________________
412 void AliAnalysisTaskJetShapeConst::Terminate(Option_t *)
414 // Called once at the end of the analysis.