1 // Jet-Hadron Correlations PID
2 // Event plane dependence task.
7 #include "AliAnalysisTaskEmcalJetHadEPpid.h"
9 // general ROOT includes
12 #include <TClonesArray.h>
16 #include <THnSparse.h>
18 #include <TLorentzVector.h>
19 #include <TParameter.h>
20 #include <TParticle.h>
23 #include <TObjArray.h>
26 #include "AliAODEvent.h"
27 #include "AliESDEvent.h"
28 #include "AliAnalysisManager.h"
29 #include "AliAnalysisTask.h"
30 #include "AliCentrality.h"
31 #include "AliEmcalJet.h"
32 #include "AliAODJet.h"
33 #include "AliVCluster.h"
34 #include "AliVTrack.h"
35 #include <AliVEvent.h>
36 #include <AliVParticle.h>
37 #include "AliRhoParameter.h"
38 #include "AliEmcalParticle.h"
40 // Localized Rho includes
41 #include "AliLocalRhoParameter.h"
42 #include "AliAnalysisTaskLocalRho.h"
44 // event handler (and pico's) includes
45 #include <AliInputEventHandler.h>
46 #include <AliVEventHandler.h>
47 #include "AliESDInputHandler.h"
48 #include "AliPicoTrack.h"
49 #include "AliEventPoolManager.h"
50 #include "AliESDtrackCuts.h"
53 #include "AliPIDResponse.h"
54 #include "AliTPCPIDResponse.h"
55 #include "AliESDpid.h"
57 // magnetic field includes
58 #include "TGeoGlobalMagField.h"
62 #include "AliJetContainer.h"
63 #include "AliParticleContainer.h"
64 #include "AliClusterContainer.h"
69 ClassImp(AliAnalysisTaskEmcalJetHadEPpid)
71 //________________________________________________________________________
72 AliAnalysisTaskEmcalJetHadEPpid::AliAnalysisTaskEmcalJetHadEPpid() :
73 AliAnalysisTaskEmcalJet("correlations",kFALSE),
74 fPhimin(-10), fPhimax(10),
75 fEtamin(-0.9), fEtamax(0.9),
76 fAreacut(0.0), fTrkBias(5), fClusBias(5), fTrkEta(0.9),
77 fJetPtcut(15.0), fJetRad(0.4), fConstituentCut(0.15),
79 fDoEventMixing(0), fMixingTracks(50000),
80 doPlotGlobalRho(0), doVariableBinning(0), dovarbinTHnSparse(0),
81 makeQAhistos(0), makeBIAShistos(0), makeextraCORRhistos(0), makeoldJEThadhistos(0),
82 allpidAXIS(0), fcutType("EMCAL"), doPID(0), doPIDtrackBIAS(0),
83 doComments(0), doIOon(0),
85 fTracksName(""), fTracksNameME("PicoTracks"), fJetsName(""),
87 isPItpc(0), isKtpc(0), isPtpc(0), // pid TPC
88 isPIits(0), isKits(0), isPits(0), // pid ITS
89 isPItof(0), isKtof(0), isPtof(0), // pid TOF
91 fPIDResponse(0x0), fTPCResponse(),
92 fESD(0), fAOD(0), fVevent(0),
94 fHistTPCdEdX(0), fHistITSsignal(0), //fHistTOFsignal(0),
95 fHistRhovsCent(0), fHistNjetvsCent(0), fHistCentrality(0),
96 fHistZvtx(0), fHistMult(0),
97 fHistJetPhi(0), fHistTrackPhi(0),
98 fHistJetHaddPhiIN(0), fHistJetHaddPhiOUT(0), fHistJetHaddPhiMID(0),
99 fHistJetHaddPhiBias(0), fHistJetHaddPhiINBias(0), fHistJetHaddPhiOUTBias(0), fHistJetHaddPhiMIDBias(0),
101 fHistTrackPtallcent(0),
102 fHistJetEtaPhi(0), fHistJetHEtaPhi(0),
103 fHistSEphieta(0), fHistMEphieta(0),
106 fhnPID(0x0), fhnMixedEvents(0x0), fhnJH(0x0), fhnCorr(0x0),
107 fJetsCont(0), fTracksCont(0), fCaloClustersCont(0),
108 fContainerAllJets(0), fContainerPIDJets(1)
110 // Default Constructor
111 for(Int_t ilab=0; ilab<4; ilab++){
112 for(Int_t ipta=0; ipta<7; ipta++){
113 //fHistTrackEtaPhi[ilab][ipta]=0; // keep out for now
114 } // end of pt-associated loop
117 for(Int_t itrackpt=0; itrackpt<9; itrackpt++){
118 fHistJetHadbindPhi[itrackpt]=0;
119 fHistJetHadbindPhiIN[itrackpt]=0;
120 fHistJetHadbindPhiMID[itrackpt]=0;
121 fHistJetHadbindPhiOUT[itrackpt]=0;
122 } // end of trackpt bin loop
124 for(Int_t icent = 0; icent<6; ++icent){
125 for(Int_t iptjet = 0; iptjet<5; ++iptjet){
126 for(Int_t ieta = 0; ieta<3; ++ieta){
127 fHistJetH[icent][iptjet][ieta]=0;
128 fHistJetHBias[icent][iptjet][ieta]=0;
129 fHistJetHTT[icent][iptjet][ieta]=0;
131 } // end of pt-jet loop
132 } // end of centrality loop
134 // centrality dependent histo's
135 for (Int_t i = 0;i<6;++i){
137 fHistJetPtBias[i] = 0;
139 fHistAreavsRawPt[i] = 0;
140 fHistJetPtvsTrackPt[i] = 0;
141 fHistRawJetPtvsTrackPt[i] = 0;
147 fHistJetPtcorrGlRho[i] = 0;
148 fHistJetPtvsdEP[i] = 0;
149 fHistJetPtvsdEPBias[i] = 0;
150 fHistRhovsdEP[i] = 0;
151 fHistJetEtaPhiPt[i] = 0;
152 fHistJetEtaPhiPtBias[i] = 0;
153 fHistJetPtArea[i] = 0;
154 fHistJetPtAreaBias[i] = 0;
155 fHistJetPtNcon[i] = 0;
156 fHistJetPtNconBias[i] = 0;
157 fHistJetPtNconCh[i] = 0;
158 fHistJetPtNconBiasCh[i] = 0;
159 fHistJetPtNconEm[i] = 0;
160 fHistJetPtNconBiasEm[i] = 0;
161 fHistJetHaddPhiINcent[i] = 0;
162 fHistJetHaddPhiOUTcent[i] = 0;
163 fHistJetHaddPhiMIDcent[i] = 0;
166 SetMakeGeneralHistograms(kTRUE);
168 // define input and output slots here
169 if(doIOon > 0 ) DefineInput(0, TChain::Class());
170 if(doIOon > 0 ) DefineOutput(1, TList::Class());
173 //________________________________________________________________________
174 AliAnalysisTaskEmcalJetHadEPpid::AliAnalysisTaskEmcalJetHadEPpid(const char *name) :
175 AliAnalysisTaskEmcalJet(name,kTRUE),
176 fPhimin(-10), fPhimax(10),
177 fEtamin(-0.9), fEtamax(0.9),
178 fAreacut(0.0), fTrkBias(5), fClusBias(5), fTrkEta(0.9),
179 fJetPtcut(15.0), fJetRad(0.4), fConstituentCut(0.15),
181 fDoEventMixing(0), fMixingTracks(50000),
182 doPlotGlobalRho(0), doVariableBinning(0), dovarbinTHnSparse(0),
183 makeQAhistos(0), makeBIAShistos(0), makeextraCORRhistos(0), makeoldJEThadhistos(0),
184 allpidAXIS(0), fcutType("EMCAL"), doPID(0), doPIDtrackBIAS(0),
185 doComments(0), doIOon(0),
187 fTracksName(""), fTracksNameME("PicoTracks"), fJetsName(""),
189 isPItpc(0), isKtpc(0), isPtpc(0), // pid TPC
190 isPIits(0), isKits(0), isPits(0), // pid ITS
191 isPItof(0), isKtof(0), isPtof(0), // pid TOF
193 fPIDResponse(0x0), fTPCResponse(),
194 fESD(0), fAOD(0), fVevent(0),
196 fHistTPCdEdX(0), fHistITSsignal(0), //fHistTOFsignal(0),
197 fHistRhovsCent(0), fHistNjetvsCent(0), fHistCentrality(0),
198 fHistZvtx(0), fHistMult(0),
199 fHistJetPhi(0), fHistTrackPhi(0),
200 fHistJetHaddPhiIN(0), fHistJetHaddPhiOUT(0), fHistJetHaddPhiMID(0),
201 fHistJetHaddPhiBias(0), fHistJetHaddPhiINBias(0), fHistJetHaddPhiOUTBias(0), fHistJetHaddPhiMIDBias(0),
203 fHistTrackPtallcent(0),
204 fHistJetEtaPhi(0), fHistJetHEtaPhi(0),
205 fHistSEphieta(0), fHistMEphieta(0),
208 fhnPID(0x0), fhnMixedEvents(0x0), fhnJH(0x0), fhnCorr(0x0),
209 fJetsCont(0), fTracksCont(0), fCaloClustersCont(0),
210 fContainerAllJets(0), fContainerPIDJets(1)
212 // Default Constructor
213 for(Int_t ilab=0; ilab<4; ilab++){
214 for(Int_t ipta=0; ipta<7; ipta++){
215 //fHistTrackEtaPhi[ilab][ipta]=0; //keep out for now
216 } // end of pt-associated loop
219 for(Int_t itrackpt=0; itrackpt<9; itrackpt++){
220 fHistJetHadbindPhi[itrackpt]=0;
221 fHistJetHadbindPhiIN[itrackpt]=0;
222 fHistJetHadbindPhiMID[itrackpt]=0;
223 fHistJetHadbindPhiOUT[itrackpt]=0;
224 } // end of trackpt bin loop
226 for(Int_t icent = 0; icent<6; ++icent){
227 for(Int_t iptjet = 0; iptjet<5; ++iptjet){
228 for(Int_t ieta = 0; ieta<3; ++ieta){
229 fHistJetH[icent][iptjet][ieta]=0;
230 fHistJetHBias[icent][iptjet][ieta]=0;
231 fHistJetHTT[icent][iptjet][ieta]=0;
233 } // end of pt-jet loop
234 } // end of centrality loop
236 // centrality dependent histo's
237 for (Int_t i = 0;i<6;++i){
239 fHistJetPtBias[i] = 0;
241 fHistAreavsRawPt[i] = 0;
242 fHistJetPtvsTrackPt[i] = 0;
243 fHistRawJetPtvsTrackPt[i] = 0;
249 fHistJetPtcorrGlRho[i] = 0;
250 fHistJetPtvsdEP[i] = 0;
251 fHistJetPtvsdEPBias[i] = 0;
252 fHistRhovsdEP[i] = 0;
253 fHistJetEtaPhiPt[i] = 0;
254 fHistJetEtaPhiPtBias[i] = 0;
255 fHistJetPtArea[i] = 0;
256 fHistJetPtAreaBias[i] = 0;
257 fHistJetPtNcon[i] = 0;
258 fHistJetPtNconBias[i] = 0;
259 fHistJetPtNconCh[i] = 0;
260 fHistJetPtNconBiasCh[i] = 0;
261 fHistJetPtNconEm[i] = 0;
262 fHistJetPtNconBiasEm[i] = 0;
263 fHistJetHaddPhiINcent[i] = 0;
264 fHistJetHaddPhiOUTcent[i] = 0;
265 fHistJetHaddPhiMIDcent[i] = 0;
268 SetMakeGeneralHistograms(kTRUE);
270 // define input and output slots here
271 if(doIOon > 0 ) DefineInput(0, TChain::Class());
272 if(doIOon > 0 ) DefineOutput(1, TList::Class());
275 //_______________________________________________________________________
276 AliAnalysisTaskEmcalJetHadEPpid::~AliAnalysisTaskEmcalJetHadEPpid()
285 //________________________________________________________________________
286 void AliAnalysisTaskEmcalJetHadEPpid::UserCreateOutputObjects()
287 { // This is called ONCE!
288 if (!fCreateHisto) return;
289 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
290 OpenFile(1); // do I need the 1?
292 // char array for naming histograms
296 // strings for titles
300 // create histograms that arn't array
301 fHistNjetvsCent = new TH2F("NjetvsCent", "NjetvsCent", 100, 0.0, 100.0, 100, 0, 100);
302 fHistJetHaddPHI = new TH1F("fHistJetHaddPHI", "Jet-Hadron #Delta#varphi", 128,-0.5*TMath::Pi(),1.5*TMath::Pi());
303 fHistJetHaddPhiIN = new TH1F("fHistJetHaddPhiIN","Jet-Hadron #Delta#varphi IN PLANE", 128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
304 fHistJetHaddPhiOUT = new TH1F("fHistJetHaddPhiOUT","Jet-Hadron #Delta#varphi OUT PLANE",128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
305 fHistJetHaddPhiMID = new TH1F("fHistJetHaddPhiMID","Jet-Hadron #Delta#varphi MIDDLE of PLANE",128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
307 fHistEventQA = new TH1F("fHistEventQA", "Event Counter at checkpoints in code", 25, -0.5, 24.5);
308 SetfHistQAcounterLabels(fHistEventQA);
309 fOutput->Add(fHistEventQA);
311 // add to output lists
312 fOutput->Add(fHistNjetvsCent);
313 fOutput->Add(fHistJetHaddPHI);
314 fOutput->Add(fHistJetHaddPhiIN);
315 fOutput->Add(fHistJetHaddPhiOUT);
316 fOutput->Add(fHistJetHaddPhiMID);
318 fHistTPCdEdX = new TH2F("TPCdEdX", "TPCdEdX", 2000, 0.0, 100.0, 500, 0, 500);
319 fOutput->Add(fHistTPCdEdX);
321 // create histo's used for general QA
323 //fHistTPCdEdX = new TH2F("TPCdEdX", "TPCdEdX", 2000, 0.0, 100.0, 500, 0, 500);
324 fHistITSsignal = new TH2F("ITSsignal", "ITSsignal", 2000, 0.0, 100.0, 500, 0, 500);
325 // fHistTOFsignal = new TH2F("TOFsignal", "TOFsignal", 2000, 0.0, 100.0, 500, 0, 500);
326 fHistCentrality = new TH1F("fHistCentrality","centrality",100,0,100);
327 fHistZvtx = new TH1F("fHistZvertex","z vertex",60,-30,30);
328 fHistJetPhi = new TH1F("fHistJetPhi", "Jet #phi Distribution", 128, -2.0*TMath::Pi(), 2.0*TMath::Pi());
329 fHistTrackPhi = new TH1F("fHistTrackPhi", "Track #phi Distribution", 128, -2.0*TMath::Pi(), 2.0*TMath::Pi());
330 fHistRhovsCent = new TH2F("RhovsCent", "RhovsCent", 100, 0.0, 100.0, 500, 0, 500);
331 fHistTrackPtallcent = new TH1F("fHistTrackPtallcent", "p_{T} distribution", 1000, 0.0, 100.0);
332 fHistJetEtaPhi = new TH2F("fHistJetEtaPhi","Jet #eta-#phi",512,-1.8,1.8,512,-3.2,3.2);
333 fHistJetHEtaPhi = new TH2F("fHistJetHEtaPhi","Jet-Hadron #Delta#eta-#Delta#phi", 72, -1.8, 1.8, 72, -1.6, 4.8);
334 fHistSEphieta = new TH2F("fHistSEphieta", "Single Event #phi-#eta distribution", 64,-0.5*TMath::Pi(), 1.5*TMath::Pi(), 64,-1.8,1.8); // was 64 bins
335 fHistMEphieta = new TH2F("fHistMEphieta", "Mixed Event #phi-#eta distribution", 64, -0.5*TMath::Pi(), 1.5*TMath::Pi(), 64,-1.8,1.8); // was 64 bins
337 // add to output list
338 //fOutput->Add(fHistTPCdEdX);
339 fOutput->Add(fHistITSsignal);
340 //fOutput->Add(fHistTOFsignal);
341 fOutput->Add(fHistCentrality);
342 fOutput->Add(fHistZvtx);
343 fOutput->Add(fHistJetPhi);
344 fOutput->Add(fHistTrackPhi);
345 //fOutput->Add(fHistTrackEtaPhi);
346 fOutput->Add(fHistTrackPtallcent);
347 fOutput->Add(fHistJetEtaPhi);
348 fOutput->Add(fHistJetHEtaPhi);
349 fOutput->Add(fHistSEphieta);
350 fOutput->Add(fHistMEphieta);
352 //for(Int_t ipta=0; ipta<7; ++ipta){
353 // for(Int_t ilab=0; ilab<4; ++ilab){
354 // snprintf(name, nchar, "fHistTrackEtaPhi_%i_%i", ilab,ipta);
355 // fHistTrackEtaPhi[ilab][ipta] = new TH2F(name,name,400,-1,1,640,0.0,2.*TMath::Pi());
356 // fOutput->Add(fHistTrackEtaPhi[ilab][ipta]);
357 // } // end of lab loop
358 //} // end of pt-associated loop
360 for (Int_t i = 0;i<6;++i){
361 name1 = TString(Form("EP0_%i",i));
362 title1 = TString(Form("EP VZero cent bin %i",i));
363 fHistEP0[i] = new TH1F(name1,title1,144,-TMath::Pi(),TMath::Pi());
364 fOutput->Add(fHistEP0[i]);
366 name1 = TString(Form("EP0A_%i",i));
367 title1 = TString(Form("EP VZero cent bin %i",i));
368 fHistEP0A[i] = new TH1F(name1,title1,144,-TMath::Pi(),TMath::Pi());
369 fOutput->Add(fHistEP0A[i]);
371 name1 = TString(Form("EP0C_%i",i));
372 title1 = TString(Form("EP VZero cent bin %i",i));
373 fHistEP0C[i] = new TH1F(name1,title1,144,-TMath::Pi(),TMath::Pi());
374 fOutput->Add(fHistEP0C[i]);
376 name1 = TString(Form("EPAvsC_%i",i));
377 title1 = TString(Form("EP VZero cent bin %i",i));
378 fHistEPAvsC[i] = new TH2F(name1,title1,144,-TMath::Pi(),TMath::Pi(),144,-TMath::Pi(),TMath::Pi());
379 fOutput->Add(fHistEPAvsC[i]);
381 name1 = TString(Form("JetPtvsTrackPt_%i",i));
382 title1 = TString(Form("Jet p_{T} vs Leading Track p_{T} cent bin %i",i));
383 fHistJetPtvsTrackPt[i] = new TH2F(name1,title1,250,-50,200,250,0,50);
384 fOutput->Add(fHistJetPtvsTrackPt[i]);
386 name1 = TString(Form("RawJetPtvsTrackPt_%i",i));
387 title1 = TString(Form("Raw Jet p_{T} vs Leading Track p_{T} cent bin %i",i));
388 fHistRawJetPtvsTrackPt[i] = new TH2F(name1,title1,250,-50,200,250,0,50);
389 fOutput->Add(fHistRawJetPtvsTrackPt[i]);
391 name1 = TString(Form("TrackPt_%i",i));
392 title1 = TString(Form("Track p_{T} cent bin %i",i));
393 fHistTrackPt[i] = new TH1F(name1,title1,1000,0,100); // up to 200?
394 fOutput->Add(fHistTrackPt[i]);
396 name1 = TString(Form("JetPtcorrGLrho_%i",i));
397 title1 = TString(Form("Jet p_{T} corrected with Global #rho cent bin %i",i));
398 fHistJetPtcorrGlRho[i] = new TH1F(name1,title1,300,-100,200); // up to 200?
399 fOutput->Add(fHistJetPtcorrGlRho[i]);
401 name1 = TString(Form("JetPtvsdEP_%i",i));
402 title1 = TString(Form("Jet p_{T} vs #DeltaEP cent bin %i",i));
403 fHistJetPtvsdEP[i] = new TH2F(name1,title1,250,-50,200,288,-2*TMath::Pi(),2*TMath::Pi());
404 fOutput->Add(fHistJetPtvsdEP[i]);
406 name1 = TString(Form("RhovsdEP_%i",i));
407 title1 = TString(Form("#rho vs #DeltaEP cent bin %i",i));
408 fHistRhovsdEP[i] = new TH2F(name1,title1,500,0,500,288,-2*TMath::Pi(),2*TMath::Pi());
409 fOutput->Add(fHistRhovsdEP[i]);
411 name1 = TString(Form("JetEtaPhiPt_%i",i));
412 title1 = TString(Form("Jet #eta-#phi p_{T} cent bin %i",i));
413 fHistJetEtaPhiPt[i] = new TH3F(name1,title1,250,-50,200,100,-1,1,64,-3.2,3.2);
414 fOutput->Add(fHistJetEtaPhiPt[i]);
416 name1 = TString(Form("JetPtArea_%i",i));
417 title1 = TString(Form("Jet p_{T} Area cent bin %i",i));
418 fHistJetPtArea[i] = new TH2F(name1,title1,250,-50,200,100,0,1);
419 fOutput->Add(fHistJetPtArea[i]);
421 snprintf(name, nchar, "fHistAreavsRawPt_%i",i);
422 fHistAreavsRawPt[i] = new TH2F(name,name,100,0,1,200,0,200);
423 fOutput->Add(fHistAreavsRawPt[i]);
424 } // loop over centrality
428 if (makeBIAShistos) {
429 fHistJetHaddPhiBias = new TH1F("fHistJetHaddPhiBias","Jet-Hadron #Delta#varphi with bias",128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
430 fHistJetHaddPhiINBias = new TH1F("fHistJetHaddPhiINBias","Jet-Hadron #Delta#varphi IN PLANE with bias", 128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
431 fHistJetHaddPhiOUTBias = new TH1F("fHistJetHaddPhiOUTBias","Jet-Hadron #Delta#varphi OUT PLANE with bias",128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
432 fHistJetHaddPhiMIDBias = new TH1F("fHistJetHaddPhiMIDBias","Jet-Hadron #Delta#varphi MIDDLE of PLANE with bias",128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
434 // add to output list
435 fOutput->Add(fHistJetHaddPhiBias);
436 fOutput->Add(fHistJetHaddPhiINBias);
437 fOutput->Add(fHistJetHaddPhiOUTBias);
438 fOutput->Add(fHistJetHaddPhiMIDBias);
440 for (Int_t i = 0;i<6;++i){
441 name1 = TString(Form("JetPtvsdEPBias_%i",i));
442 title1 = TString(Form("Bias Jet p_{T} vs #DeltaEP cent bin %i",i));
443 fHistJetPtvsdEPBias[i] = new TH2F(name1,title1,250,-50,200,288,-2*TMath::Pi(),2*TMath::Pi());
444 fOutput->Add(fHistJetPtvsdEPBias[i]);
446 name1 = TString(Form("JetEtaPhiPtBias_%i",i));
447 title1 = TString(Form("Jet #eta-#phi p_{T} Bias cent bin %i",i));
448 fHistJetEtaPhiPtBias[i] = new TH3F(name1,title1,250,-50,200,100,-1,1,64,-3.2,3.2);
449 fOutput->Add(fHistJetEtaPhiPtBias[i]);
451 name1 = TString(Form("JetPtAreaBias_%i",i));
452 title1 = TString(Form("Jet p_{T} Area Bias cent bin %i",i));
453 fHistJetPtAreaBias[i] = new TH2F(name1,title1,250,-50,200,100,0,1);
454 fOutput->Add(fHistJetPtAreaBias[i]);
455 } // end of centrality loop
458 if (makeoldJEThadhistos) {
459 for(Int_t icent = 0; icent<6; ++icent){
460 snprintf(name, nchar, "fHistJetPtTT_%i",icent);
461 fHistJetPtTT[icent] = new TH1F(name,name,200,0,200);
462 fOutput->Add(fHistJetPtTT[icent]);
464 snprintf(name, nchar, "fHistJetPt_%i",icent);
465 fHistJetPt[icent] = new TH1F(name,name,200,0,200);
466 fOutput->Add(fHistJetPt[icent]);
468 snprintf(name, nchar, "fHistJetPtBias_%i",icent);
469 fHistJetPtBias[icent] = new TH1F(name,name,200,0,200);
470 fOutput->Add(fHistJetPtBias[icent]);
472 for(Int_t iptjet = 0; iptjet<5; ++iptjet){
473 for(Int_t ieta = 0; ieta<3; ++ieta){
474 snprintf(name, nchar, "fHistJetH_%i_%i_%i",icent,iptjet,ieta);
475 fHistJetH[icent][iptjet][ieta]=new TH2F(name,name,64,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
476 fOutput->Add(fHistJetH[icent][iptjet][ieta]);
478 snprintf(name, nchar, "fHistJetHBias_%i_%i_%i",icent,iptjet,ieta);
479 fHistJetHBias[icent][iptjet][ieta]=new TH2F(name,name,64,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
480 fOutput->Add(fHistJetHBias[icent][iptjet][ieta]);
482 snprintf(name, nchar, "fHistJetHTT_%i_%i_%i",icent,iptjet,ieta);
483 fHistJetHTT[icent][iptjet][ieta]=new TH2F(name,name,64,-0.5*TMath::Pi(),1.5*TMath::Pi(),300,0,30);
484 fOutput->Add(fHistJetHTT[icent][iptjet][ieta]);
486 } // end of pt-jet loop
487 } // end of centrality loop
488 } // make JetHadhisto old
490 if (makeextraCORRhistos) {
491 for(Int_t itrackpt=0; itrackpt<9; itrackpt++){
492 snprintf(name, nchar, "fHistJetHadbindPhi_%i",itrackpt);
493 fHistJetHadbindPhi[itrackpt] = new TH1F(name,name,128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
494 fOutput->Add(fHistJetHadbindPhi[itrackpt]);
496 snprintf(name, nchar, "fHistJetHadbindPhiIN_%i",itrackpt);
497 fHistJetHadbindPhiIN[itrackpt] = new TH1F(name,name,128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
498 fOutput->Add(fHistJetHadbindPhiIN[itrackpt]);
500 snprintf(name, nchar, "fHistJetHadbindPhiMID_%i",itrackpt);
501 fHistJetHadbindPhiMID[itrackpt] = new TH1F(name,name,128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
502 fOutput->Add(fHistJetHadbindPhiMID[itrackpt]);
504 snprintf(name, nchar, "fHistJetHadbindPhiOUT_%i",itrackpt);
505 fHistJetHadbindPhiOUT[itrackpt] = new TH1F(name,name,128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
506 fOutput->Add(fHistJetHadbindPhiOUT[itrackpt]);
507 } // end of trackpt bin loop
509 for (Int_t i = 0;i<6;++i){
510 name1 = TString(Form("JetHaddPhiINcent_%i",i));
511 title1 = TString(Form("Jet Hadron #Delta#varphi Distribution IN PLANE cent bin %i",i));
512 fHistJetHaddPhiINcent[i] = new TH1F(name1,title1,128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
513 fOutput->Add(fHistJetHaddPhiINcent[i]);
515 name1 = TString(Form("JetHaddPhiOUTcent_%i",i));
516 title1 = TString(Form("Jet Hadron #Delta#varphi Distribution OUT PLANE cent bin %i",i));
517 fHistJetHaddPhiOUTcent[i] = new TH1F(name1,title1,128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
518 fOutput->Add(fHistJetHaddPhiOUTcent[i]);
520 name1 = TString(Form("JetHaddPhiMIDcent_%i",i));
521 title1 = TString(Form("Jet Hadron #Delta#varphi Distribution MIDDLE of PLANE cent bin %i",i));
522 fHistJetHaddPhiMIDcent[i] = new TH1F(name1,title1,128,-0.5*TMath::Pi(), 1.5*TMath::Pi());
523 fOutput->Add(fHistJetHaddPhiMIDcent[i]);
525 name1 = TString(Form("JetPtNcon_%i",i));
526 title1 = TString(Form("Jet p_{T} Ncon cent bin %i",i));
527 fHistJetPtNcon[i] = new TH2F(name1,title1,250,-50,200,100,0,2000);
528 fOutput->Add(fHistJetPtNcon[i]);
530 name1 = TString(Form("JetPtNconBias_%i",i));
531 title1 = TString(Form("Jet p_{T} NconBias cent bin %i",i));
532 fHistJetPtNconBias[i] = new TH2F(name1,title1,250,-50,200,100,0,2000);
533 fOutput->Add(fHistJetPtNconBias[i]);
535 name1 = TString(Form("JetPtNconCh_%i",i));
536 title1 = TString(Form("Jet p_{T} NconCh cent bin %i",i));
537 fHistJetPtNconCh[i] = new TH2F(name1,title1,250,-50,200,100,0,2000);
538 fOutput->Add(fHistJetPtNconCh[i]);
540 name1 = TString(Form("JetPtNconBiasCh_%i",i));
541 title1 = TString(Form("Jet p_{T} NconBiasCh cent bin %i",i));
542 fHistJetPtNconBiasCh[i] = new TH2F(name1,title1,250,-50,200,100,0,2000);
543 fOutput->Add(fHistJetPtNconBiasCh[i]);
545 name1 = TString(Form("JetPtNconEm_%i",i));
546 title1 = TString(Form("Jet p_{T} NconEm cent bin %i",i));
547 fHistJetPtNconEm[i] = new TH2F(name1,title1,250,-50,200,100,0,2000);
548 fOutput->Add(fHistJetPtNconEm[i]);
550 name1 = TString(Form("JetPtNconBiasEm_%i",i));
551 title1 = TString(Form("Jet p_{T} NconBiasEm cent bin %i",i));
552 fHistJetPtNconBiasEm[i] = new TH2F(name1,title1,250,-50,200,100,0,2000);
553 fOutput->Add(fHistJetPtNconBiasEm[i]);
554 } // extra Correlations histos switch
557 // variable binned pt for THnSparse's
558 //Double_t xlowjetPT[] = {-50,-45,-40,-35,-30,-25,-20,-18,-16,-14,-12,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,35,40,45,50,60,70,80,90,100,120,140,160,180,200,250,300,350,400};
559 //Double_t xlowtrPT[] = {0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.25,2.50,2.75,3.0,3.25,3.5,3.75,4.0,4.25,4.50,4.75,5.0,5.5,6.0,6.5,7.0,7.5,8.0,8.5,9.0,9.5,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0,22.0,24.0,26.0,28.0,30.0,35.0,40.0,45.0,50.0,60.0,70.0,80.0,90.0,100.0};
560 Double_t xlowjetPT[] = {15, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 45, 50, 55, 60, 65, 70, 75, 80, 100, 150, 200, 300};
561 Double_t xlowtrPT[] = {0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.6,0.7,0.8,0.9,1.0,1.2,1.4,1.6,1.8,2.0,2.2,2.4,2.6,2.8,3.0,3.2,3.4,3.6,3.8,4.0,4.2,4.4,4.6,4.8,5.0,5.5,6.0,6.5,7.0,7.5,8.0,9.0,10.0,12.0,14.0,16.0,18.0,20.0,25.0,30.0,40.0,50.0,75.0};
563 // tracks: 51, jets: 26
564 // number of bins you tell histogram should be (# in array - 1) because the last bin
565 // is the right-most edge of the histogram
566 // i.e. this is for PT and there are 57 numbers (bins) thus we have 56 bins in our histo
567 Int_t nbinsjetPT = sizeof(xlowjetPT)/sizeof(Double_t) - 1;
568 Int_t nbinstrPT = sizeof(xlowtrPT)/sizeof(Double_t) - 1;
570 // set up jet-hadron sparse
571 UInt_t bitcoded = 0; // bit coded, see GetDimParams() below
573 UInt_t bitcode = 0; // bit coded, see GetDimParamsPID() below
574 UInt_t bitcodeCorr = 0; // bit coded, see GetDimparamsCorr() below
575 bitcoded = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8; // | 1<<9;
576 //if(fDoEventMixing) {
577 fhnJH = NewTHnSparseF("fhnJH", bitcoded);
579 if(dovarbinTHnSparse){
580 fhnJH->GetAxis(1)->Set(nbinsjetPT, xlowjetPT);
581 fhnJH->GetAxis(2)->Set(nbinstrPT, xlowtrPT);
587 bitcodeCorr = 1<<0 | 1<<1 | 1<<2 | 1<<3; // | 1<<4 | 1<<5;
588 fhnCorr = NewTHnSparseFCorr("fhnCorr", bitcodeCorr);
589 if(dovarbinTHnSparse) fhnCorr->GetAxis(1)->Set(nbinsjetPT, xlowjetPT);
590 fOutput->Add(fhnCorr);
593 Double_t centralityBins[nCentralityBins+1];
594 for(Int_t ic=0; ic<nCentralityBins+1; ic++){
595 if(ic==nCentralityBins) centralityBins[ic]=500;
596 else centralityBins[ic]=10.0*ic;
600 // set up centrality bins for mixed events
601 // for pp we need mult bins for event mixing. Create binning here, to also make a histogram from it
602 Int_t nCentralityBinspp = 8;
603 //Double_t centralityBinspp[nCentralityBinspp+1];
604 Double_t centralityBinspp[9] = {0.0, 4., 9, 15, 25, 35, 55, 100.0, 500.0};
606 // Setup for Pb-Pb collisions
607 Int_t nCentralityBinsPbPb = 100;
608 Double_t centralityBinsPbPb[nCentralityBinsPbPb+1];
609 for(Int_t ic=0; ic<nCentralityBinsPbPb; ic++){
610 centralityBinsPbPb[ic]=1.0*ic;
613 // if(GetBeamType() == 0) fHistMult = new TH1F("fHistMult","multiplicity",nCentralityBinspp,centralityBinspp);
614 // if(GetBeamType() == 1) fHistMult = new TH1F("fHistMult","multiplicity",nCentralityBinsPbPb,centralityBinsPbPb);
615 // fOutput->Add(fHistMult);
618 Int_t trackDepth = fMixingTracks;
619 Int_t poolsize = 1000; // Maximum number of events, ignored in the present implemented of AliEventPoolManager
620 Int_t nZvtxBins = 5+1+5;
621 Double_t vertexBins[] = { -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10};
622 Double_t* zvtxbin = vertexBins;
623 // if(GetBeamType() == 0) fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBinspp, centralityBinspp, nZvtxBins, zvtxbin);
624 //if(GetBeamType() == 1)
625 fPoolMgr = new AliEventPoolManager(poolsize, trackDepth, nCentralityBinsPbPb, centralityBinsPbPb, nZvtxBins, zvtxbin);
627 // set up event mixing sparse
629 cifras = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8; // | 1<<9;
630 fhnMixedEvents = NewTHnSparseF("fhnMixedEvents", cifras);
632 if(dovarbinTHnSparse){
633 fhnMixedEvents->GetAxis(1)->Set(nbinsjetPT, xlowjetPT);
634 fhnMixedEvents->GetAxis(2)->Set(nbinstrPT, xlowtrPT);
637 fOutput->Add(fhnMixedEvents);
638 } // end of do-eventmixing
642 // ****************************** PID *****************************************************
643 // set up PID handler
644 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
645 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
647 AliFatal("Input handler needed");
651 // PID response object
652 fPIDResponse = inputHandler->GetPIDResponse();
654 AliError("PIDResponse object was not created");
657 // *****************************************************************************************
660 fHistPID = new TH1F("fHistPID","PID Counter",15, 0, 15.0);
661 SetfHistPIDcounterLabels(fHistPID);
662 fOutput->Add(fHistPID);
665 bitcode = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8 | 1<<9 |
666 1<<10 | 1<<11 | 1<<12 | 1<<13 | 1<<14 | 1<<15 | 1<<16 | 1<<17 | 1<<18 | 1<<19 |
668 fhnPID = NewTHnSparseFPID("fhnPID", bitcode);
670 bitcode = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8 | 1<<9 |
671 1<<10 | 1<<11 | 1<<12 | 1<<13;
672 fhnPID = NewTHnSparseFPID("fhnPID", bitcode);
675 if(dovarbinTHnSparse){
676 fhnPID->GetAxis(1)->Set(nbinstrPT, xlowtrPT);
677 fhnPID->GetAxis(8)->Set(nbinsjetPT, xlowjetPT);
680 fOutput->Add(fhnPID);
683 // =========== Switch on Sumw2 for all histos ===========
684 for (Int_t i=0; i<fOutput->GetEntries(); ++i) {
685 TH1 *h1 = dynamic_cast<TH1*>(fOutput->At(i));
690 TH2 *h2 = dynamic_cast<TH2*>(fOutput->At(i));
695 TH3 *h3 = dynamic_cast<TH3*>(fOutput->At(i));
700 THnSparse *hn = dynamic_cast<THnSparse*>(fOutput->At(i));
704 PostData(1, fOutput);
707 //_________________________________________________________________________
708 void AliAnalysisTaskEmcalJetHadEPpid::ExecOnce()
710 AliAnalysisTaskEmcalJet::ExecOnce();
712 if (fJetsCont && fJetsCont->GetArray() == 0) fJetsCont = 0;
713 if (fTracksCont && fTracksCont->GetArray() == 0) fTracksCont = 0;
714 if (fCaloClustersCont && fCaloClustersCont->GetArray() == 0) fCaloClustersCont = 0;
717 //_________________________________________________________________________
718 Bool_t AliAnalysisTaskEmcalJetHadEPpid::Run()
719 { // Main loop called for each event
720 // TEST TEST TEST TEST for OBJECTS!
722 fHistEventQA->Fill(1); // All Events that get entered
725 AliError(Form("Couldn't get fLocalRho object, try to get it from Event based on name\n"));
726 fLocalRho = GetLocalRhoFromEvent(fLocalRhoName);
727 if(!fLocalRho) return kTRUE;
730 AliError(Form("No fTracks object!!\n"));
734 AliError(Form("No fJets object!!\n"));
738 fHistEventQA->Fill(2); // events after object check
740 // what kind of event do we have: AOD or ESD?
742 if (dynamic_cast<AliAODEvent*>(InputEvent())) useAOD = kTRUE;
743 else useAOD = kFALSE;
745 // if we have ESD event, set up ESD object
747 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
749 AliError(Form("ERROR: fESD not available\n"));
754 // if we have AOD event, set up AOD object
756 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
758 AliError(Form("ERROR: fAOD not available\n"));
763 fHistEventQA->Fill(3); // events after Aod/esd check
766 Int_t centbin = GetCentBin(fCent);
767 if (makeQAhistos) fHistCentrality->Fill(fCent); // won't be filled in pp collision (Keep this in mind!)
769 // BEAM TYPE enumerator: kNA = -1, kpp = 0, kAA = 1, kpA = 2
770 // for pp analyses we will just use the first centrality bin
771 if(GetBeamType() == 0) if (centbin == -1) centbin = 0;
772 if(GetBeamType() == 1) if (centbin == -1) return kTRUE;
774 // if we are on PbPb data do cut on centrality > 90%, else by default DON'T
775 if (GetBeamType() == 1) {
776 // apply cut to event on Centrality > 90%
777 if(fCent>90) return kTRUE;
780 fHistEventQA->Fill(4); // events after centrality check
782 // get vertex information
783 Double_t fvertex[3]={0,0,0};
784 InputEvent()->GetPrimaryVertex()->GetXYZ(fvertex);
785 Double_t zVtx=fvertex[2];
786 if (makeQAhistos) fHistZvtx->Fill(zVtx);
789 //Int_t zVbin = GetzVertexBin(zVtx);
792 if(fabs(zVtx)>10.0) return kTRUE;
794 fHistEventQA->Fill(5); // events after zvertex check
796 // create pointer to list of input event
797 TList *list = InputEvent()->GetList();
799 AliError(Form("ERROR: list not attached\n"));
803 fHistEventQA->Fill(6); // events after list check
805 // initialize TClonesArray pointers to jets and tracks
806 TClonesArray *jets = 0;
807 TClonesArray *tracks = 0;
808 TClonesArray *tracksME = 0;
811 tracks = dynamic_cast<TClonesArray*>(list->FindObject(fTracks));
813 AliError(Form("Pointer to tracks %s == 0", fTracks->GetName()));
815 } // verify existence of tracks
817 // get ME Tracks object
818 tracksME = dynamic_cast<TClonesArray*>(list->FindObject(fTracksNameME));
820 AliError(Form("Pointer to tracks %s == 0", fTracksNameME.Data()));
822 } // verify existence of tracks
824 // cout<<"mixed event tracks name: "<<fTracksNameME.Data()<<endl;
829 jets = dynamic_cast<TClonesArray*>(list->FindObject(fJets));
831 AliError(Form("Pointer to jets %s == 0", fJets->GetName()));
833 } // verify existence of jets
835 fHistEventQA->Fill(7); // events after track/jet pointer check
837 // get number of jets and tracks
838 const Int_t Njets = jets->GetEntries();
839 const Int_t Ntracks = tracks->GetEntries();
840 if(Ntracks<1) return kTRUE;
841 if(Njets<1) return kTRUE;
843 fHistEventQA->Fill(8); // events after #track and jets < 1 check
845 if (makeQAhistos) fHistMult->Fill(Ntracks); // fill multiplicity distribution
847 // initialize track parameters
851 fVevent = dynamic_cast<AliVEvent*>(InputEvent());
853 printf("ERROR: fVEvent not available\n");
857 //Int_t ntracks = fVevent->GetNumberOfTracks();
859 // loop over tracks - to get hardest track (highest pt)
860 for (Int_t iTracks = 0; iTracks < Ntracks; iTracks++){
861 AliVParticle* Vtrack = static_cast<AliVParticle*>(tracks->At(iTracks));
863 printf("ERROR: Could not receive track %d\n", iTracks);
867 AliVTrack *track = dynamic_cast<AliVTrack*>(Vtrack);
871 if(TMath::Abs(track->Eta())>0.9) continue;
872 if(track->Pt()<0.15) continue;
874 if(track->Pt()>ptmax){
875 ptmax=track->Pt(); // max pT track
876 iTT=iTracks; // trigger tracks
877 } // check if Pt>maxpt
879 if (makeQAhistos) fHistTrackPhi->Fill(track->Phi());
880 if (makeQAhistos) fHistTrackPt[centbin]->Fill(track->Pt());
881 if (makeQAhistos) fHistTrackPtallcent->Fill(track->Pt());
882 } // end of loop over tracks
884 // get rho from event and fill relative histo's
885 fRho = GetRhoFromEvent(fRhoName);
886 fRhoVal = fRho->GetVal();
889 fHistRhovsdEP[centbin]->Fill(fRhoVal,fEPV0); // Global Rho vs delta Event Plane angle
890 fHistRhovsCent->Fill(fCent,fRhoVal); // Global Rho vs Centrality
891 fHistEP0[centbin]->Fill(fEPV0);
892 fHistEP0A[centbin]->Fill(fEPV0A);
893 fHistEP0C[centbin]->Fill(fEPV0C);
894 fHistEPAvsC[centbin]->Fill(fEPV0A,fEPV0C);
897 // initialize jet parameters
899 Double_t highestjetpt=0.0;
902 Double_t leadhadronPT = 0;
904 // loop over jets in an event - to find highest jet pT and apply some cuts
905 for (Int_t ijet = 0; ijet < Njets; ijet++){
907 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
911 if ((jet->Phi()<fPhimin)||(jet->Phi()>fPhimax)) continue;
912 if ((jet->Eta()<fEtamin)||(jet->Eta()>fEtamax)) continue;
913 if (makeQAhistos) fHistAreavsRawPt[centbin]->Fill(jet->Pt(),jet->Area());
914 if(!AcceptMyJet(jet)) continue;
916 NjetAcc++; // # of accepted jets
918 // use this to get total # of jets passing cuts in events!!!!!!!!
919 if (makeQAhistos) fHistJetPhi->Fill(jet->Phi()); // Jet Phi histogram (filled)
921 // get highest Pt jet in event
922 if(highestjetpt<jet->Pt()){
924 highestjetpt=jet->Pt();
926 } // end of looping over jets
929 fHistNjetvsCent->Fill(fCent,NjetAcc);
931 fHistEventQA->Fill(9); // events after track/jet loop to get highest pt
933 // loop over jets in event and make appropriate cuts
934 for (Int_t ijet = 0; ijet < Njets; ++ijet) {
935 AliEmcalJet *jet = static_cast<AliEmcalJet*>(fJets->At(ijet));
938 // (should probably be higher..., but makes a cut on jet pT)
939 if (jet->Pt()<0.1) continue;
940 // do we accept jet? apply jet cuts
941 if (!AcceptMyJet(jet)) continue;
943 fHistEventQA->Fill(10); // accepted jets
947 if (ijet==ijethi) leadjet=1;
949 // check on leading hadron pt
950 if (ijet==ijethi) leadhadronPT = GetLeadingHadronPt(jet);
952 // initialize and calculate various parameters: pt, eta, phi, rho, etc...
953 Double_t jetphi = jet->Phi(); // phi of jet
954 NJETAcc++; // # accepted jets
955 fLocalRhoVal = fLocalRho->GetLocalVal(jetphi, fJetRad); //GetJetRadius(0)); // get local rho value
956 Double_t jeteta = jet->Eta(); // ETA of jet
957 Double_t jetPt = -500;
958 Double_t jetPtGlobal = -500;
959 //Double_t jetPtLocal = -500; // initialize corr jet pt
961 jetPtGlobal = jet->Pt()-jet->Area()*fRhoVal; // corrected pT of jet from rho value
962 //jetPtLocal = jet->Pt()-jet->Area()*fLocalRhoVal; // corrected pT of jet using Rho modulated for V2 and V3
963 Double_t dEP = -500; // initialize angle between jet and event plane
964 dEP = RelativeEPJET(jetphi,fEPV0); // angle betweeen jet and event plane
967 if(makeQAhistos) fHistJetPtvsTrackPt[centbin]->Fill(jetPt,jet->MaxTrackPt());
968 if(makeQAhistos) fHistRawJetPtvsTrackPt[centbin]->Fill(jetPt,jet->MaxTrackPt());
969 if(makeQAhistos) fHistJetPtcorrGlRho[centbin]->Fill(jetPtGlobal);
970 if(makeQAhistos) fHistJetPtvsdEP[centbin]->Fill(jetPt, dEP);
971 if(makeQAhistos) fHistJetEtaPhiPt[centbin]->Fill(jetPt,jet->Eta(),jet->Phi());
972 if(makeQAhistos) fHistJetPtArea[centbin]->Fill(jetPt,jet->Area());
973 if(makeQAhistos) fHistJetEtaPhi->Fill(jet->Eta(),jet->Phi()); // fill jet eta-phi distribution histo
974 if(makeextraCORRhistos) fHistJetPtNcon[centbin]->Fill(jetPt,jet->GetNumberOfConstituents());
975 if(makeextraCORRhistos) fHistJetPtNconCh[centbin]->Fill(jetPt,jet->GetNumberOfTracks());
976 if(makeextraCORRhistos) fHistJetPtNconEm[centbin]->Fill(jetPt,jet->GetNumberOfClusters());
977 if (makeoldJEThadhistos) fHistJetPt[centbin]->Fill(jet->Pt()); // fill #jets vs pT histo
978 //fHistDeltaPtvsArea->Fill(jetPt,jet->Area());
980 // make histo's with BIAS applied
981 if (jet->MaxTrackPt()>fTrkBias){
982 if(makeBIAShistos) fHistJetPtvsdEPBias[centbin]->Fill(jetPt, dEP);
983 if(makeBIAShistos) fHistJetEtaPhiPtBias[centbin]->Fill(jetPt,jet->Eta(),jet->Phi());
984 if(makeextraCORRhistos) fHistJetPtAreaBias[centbin]->Fill(jetPt,jet->Area());
985 if(makeextraCORRhistos) fHistJetPtNconBias[centbin]->Fill(jetPt,jet->GetNumberOfConstituents());
986 if(makeextraCORRhistos) fHistJetPtNconBiasCh[centbin]->Fill(jetPt,jet->GetNumberOfTracks());
987 if(makeextraCORRhistos) fHistJetPtNconBiasEm[centbin]->Fill(jetPt,jet->GetNumberOfClusters());
990 //if(leadjet && centbin==0){
991 // if(makeextraCORRhistos) fHistJetPt[centbin+1]->Fill(jet->Pt());
993 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
994 if (makeoldJEThadhistos){
995 fHistJetPtBias[centbin]->Fill(jet->Pt());
996 //if(leadjet && centbin==0) fHistJetPtBias[centbin+1]->Fill(jet->Pt());
998 } // end of MaxTrackPt>ftrkBias or maxclusterPt>fclusBias
1000 // do we have trigger tracks
1002 AliVTrack* TT = static_cast<AliVTrack*>(tracks->At(iTT));
1003 if(TMath::Abs(jet->Phi()-TT->Phi()-TMath::Pi())<0.6) passedTTcut=1;
1005 } // end of check on iTT > 0
1008 if (makeoldJEThadhistos) fHistJetPtTT[centbin]->Fill(jet->Pt());
1011 // cut on HIGHEST jet pt in event (15 GeV default)
1012 //if (highestjetpt>fJetPtcut) {
1013 if (jet->Pt() > fJetPtcut) {
1014 fHistEventQA->Fill(11); // jets meeting pt threshold
1016 // does our max track or cluster pass the bias?
1017 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
1018 // set up and fill Jet-Hadron Correction THnSparse
1019 Double_t CorrEntries[4] = {fCent, jet->Pt(), dEP, zVtx};
1020 fhnCorr->Fill(CorrEntries); // fill Sparse Histo with Correction entries
1023 // loop over all track for an event containing a jet with a pT>fJetPtCut (15)GeV
1024 for (Int_t iTracks = 0; iTracks < Ntracks; ++iTracks) {
1025 AliVParticle* Vtrackass = static_cast<AliVParticle*>(tracks->At(iTracks));
1027 printf("ERROR: Could not receive track %d\n", iTracks);
1031 AliVTrack *track = dynamic_cast<AliVTrack*>(Vtrackass);
1033 AliError(Form("Couldn't get AliVtrack %d\n", iTracks));
1038 if(TMath::Abs(track->Eta())>fTrkEta) continue;
1039 if (track->Pt()<0.15) continue;
1041 fHistEventQA->Fill(12); // accepted tracks in events from trigger jets
1043 // calculate and get some track parameters
1044 Double_t trCharge = -99;
1045 trCharge = track->Charge();
1046 Double_t tracketa=track->Eta(); // eta of track
1047 Double_t deta=tracketa-jeteta; // dETA between track and jet
1048 //Double_t dR=sqrt(deta*deta+dphijh*dphijh); // difference of R between jet and hadron track
1050 Int_t ieta = -1; // initialize deta bin
1051 Int_t iptjet = -1; // initialize jet pT bin
1052 if (makeoldJEThadhistos) {
1053 ieta=GetEtaBin(deta); // bin of eta
1054 if(ieta<0) continue; // double check we don't have a negative array index
1055 iptjet=GetpTjetBin(jet->Pt()); // bin of jet pt
1056 if(iptjet<0) continue; // double check we don't have a negative array index
1059 // dPHI between jet and hadron
1060 Double_t dphijh = RelativePhi(jet->Phi(), track->Phi()); // angle between jet and hadron
1062 // fill some jet-hadron histo's
1063 if (makeoldJEThadhistos) fHistJetH[centbin][iptjet][ieta]->Fill(dphijh,track->Pt()); // fill jet-hadron dPHI--track pT distribution
1064 if(makeQAhistos) fHistJetHEtaPhi->Fill(deta,dphijh); // fill jet-hadron eta--phi distribution
1065 fHistJetHaddPHI->Fill(dphijh);
1067 if (makeoldJEThadhistos) fHistJetHTT[centbin][iptjet][ieta]->Fill(dphijh,track->Pt());
1070 // does our max track or cluster pass the bias?
1071 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)){
1072 // set up and fill Jet-Hadron THnSparse
1073 Double_t triggerEntries[9] = {fCent, jet->Pt(), track->Pt(), deta, dphijh, dEP, zVtx, trCharge, leadjet};
1074 fhnJH->Fill(triggerEntries); // fill Sparse Histo with trigger entries
1077 if(makeQAhistos) fHistSEphieta->Fill(dphijh, deta); // single event distribution
1078 if (makeoldJEThadhistos) fHistJetHBias[centbin][iptjet][ieta]->Fill(dphijh,track->Pt());
1080 if (makeBIAShistos) {
1081 fHistJetHaddPhiBias->Fill(dphijh);
1083 // in plane and out of plane histo's
1084 if( dEP>0 && dEP<=(TMath::Pi()/6) ){
1086 fHistJetHaddPhiINBias->Fill(dphijh);
1087 }else if( dEP>(TMath::Pi()/3) && dEP<=(TMath::Pi()/2) ){
1088 // we are OUT of PLANE
1089 fHistJetHaddPhiOUTBias->Fill(dphijh);
1090 }else if( dEP>(TMath::Pi()/6) && dEP<=(TMath::Pi()/3) ){
1091 // we are in middle of plane
1092 fHistJetHaddPhiMIDBias->Fill(dphijh);
1094 } // BIAS histos switch
1095 } // end of check maxtrackpt>ftrackbias or maxclusterpt>fclustbias
1097 // **************************************************************************************************************
1098 // *********************************** PID **********************************************************************
1099 // **************************************************************************************************************
1101 //if(ptmax < fTrkBias) continue; // force PID to happen when max track pt > 5.0 GeV
1102 if(leadhadronPT < fTrkBias) continue; // force PID to happen when lead hadron pt > 5.0 GeV
1105 // some variables for PID
1107 Double_t dEdx = -999;
1108 Double_t ITSsig = -999;
1109 Double_t TOFsig = -999;
1110 Double_t charge = -999;
1112 // nSigma of particles in TPC, TOF, and ITS
1113 Double_t nSigmaPion_TPC, nSigmaProton_TPC, nSigmaKaon_TPC;
1114 Double_t nSigmaPion_TOF, nSigmaProton_TOF, nSigmaKaon_TOF;
1115 Double_t nSigmaPion_ITS, nSigmaProton_ITS, nSigmaKaon_ITS;
1118 // get parameters of track
1119 charge = track->Charge(); // charge of track
1120 pt = track->Pt(); // pT of track
1123 AliVEvent *vevent=InputEvent();
1124 if (!vevent||!fPIDResponse) return kTRUE; // just return, maybe put at beginning
1126 fHistEventQA->Fill(13); // check for AliVEvent and fPIDresponse objects
1128 ///////////////////////////////////////
1130 // get detector signals
1131 dEdx = track->GetTPCsignal();
1132 ITSsig = track->GetITSsignal();
1133 TOFsig = track->GetTOFsignal();
1136 nSigmaPion_TPC = fPIDResponse->NumberOfSigmasTPC(track,AliPID::kPion);
1137 nSigmaKaon_TPC = fPIDResponse->NumberOfSigmasTPC(track,AliPID::kKaon);
1138 nSigmaProton_TPC = fPIDResponse->NumberOfSigmasTPC(track,AliPID::kProton);
1141 nSigmaPion_TOF = fPIDResponse->NumberOfSigmasTOF(track,AliPID::kPion);
1142 nSigmaKaon_TOF = fPIDResponse->NumberOfSigmasTOF(track,AliPID::kKaon);
1143 nSigmaProton_TOF = fPIDResponse->NumberOfSigmasTOF(track,AliPID::kProton);
1146 nSigmaPion_ITS = fPIDResponse->NumberOfSigmasITS(track,AliPID::kPion);
1147 nSigmaKaon_ITS = fPIDResponse->NumberOfSigmasITS(track,AliPID::kKaon);
1148 nSigmaProton_ITS = fPIDResponse->NumberOfSigmasITS(track,AliPID::kProton);
1150 // fill detector signal histograms
1151 if (makeQAhistos) fHistTPCdEdX->Fill(pt, dEdx);
1152 if (makeQAhistos) fHistITSsignal->Fill(pt, ITSsig);
1153 //if (makeQAhistos) fHistTOFsignal->Fill(pt, TOFsig);
1155 // Tests to PID pions, kaons, and protons, (default is undentified tracks)
1156 Double_t nPIDtpc = 0;
1157 Double_t nPIDits = 0;
1158 Double_t nPIDtof = 0;
1159 Double_t nPID = -99;
1161 // check track has pT < 0.900 GeV - use TPC pid
1162 if (pt<0.900 && dEdx>0) {
1167 if (TMath::Abs(nSigmaPion_TPC)<2 && TMath::Abs(nSigmaKaon_TPC)>2 && TMath::Abs(nSigmaProton_TPC)>2 ){
1171 }else isPItpc = kFALSE;
1174 if (TMath::Abs(nSigmaKaon_TPC)<2 && TMath::Abs(nSigmaPion_TPC)>3 && TMath::Abs(nSigmaProton_TPC)>2 ){
1178 }else isKtpc = kFALSE;
1180 // PROTON check - TPC
1181 if (TMath::Abs(nSigmaProton_TPC)<2 && TMath::Abs(nSigmaPion_TPC)>3 && TMath::Abs(nSigmaKaon_TPC)>2 ){
1185 }else isPtpc = kFALSE;
1186 } // cut on track pT for TPC
1188 // check track has pT < 0.500 GeV - use ITS pid
1189 if (pt<0.500 && ITSsig>0) {
1194 if (TMath::Abs(nSigmaPion_ITS)<2 && TMath::Abs(nSigmaKaon_ITS)>2 && TMath::Abs(nSigmaProton_ITS)>2 ){
1198 }else isPIits = kFALSE;
1201 if (TMath::Abs(nSigmaKaon_ITS)<2 && TMath::Abs(nSigmaPion_ITS)>3 && TMath::Abs(nSigmaProton_ITS)>2 ){
1205 }else isKits = kFALSE;
1207 // PROTON check - ITS
1208 if (TMath::Abs(nSigmaProton_ITS)<2 && TMath::Abs(nSigmaPion_ITS)>3 && TMath::Abs(nSigmaKaon_ITS)>2 ){
1212 }else isPits = kFALSE;
1213 } // cut on track pT for ITS
1215 // check track has 0.900 GeV < pT < 2.500 GeV - use TOF pid
1216 if (pt>0.900 && pt<2.500 && TOFsig>0) {
1221 if (TMath::Abs(nSigmaPion_TOF)<2 && TMath::Abs(nSigmaKaon_TOF)>2 && TMath::Abs(nSigmaProton_TOF)>2 ){
1225 }else isPItof = kFALSE;
1228 if (TMath::Abs(nSigmaKaon_TOF)<2 && TMath::Abs(nSigmaPion_TOF)>3 && TMath::Abs(nSigmaProton_TOF)>2 ){
1232 }else isKtof = kFALSE;
1234 // PROTON check - TOF
1235 if (TMath::Abs(nSigmaProton_TOF)<2 && TMath::Abs(nSigmaPion_TOF)>3 && TMath::Abs(nSigmaKaon_TOF)>2 ){
1239 }else isPtof = kFALSE;
1240 } // cut on track pT for TOF
1242 if (nPID == -99) nPID = 13.5;
1243 fHistPID->Fill(nPID);
1245 // PID sparse getting filled
1246 if (allpidAXIS) { // FILL ALL axis
1247 Double_t pid_EntriesALL[21] = {fCent,pt,charge,deta,dphijh,leadjet,zVtx,dEP,jetPt,
1248 nSigmaPion_TPC, nSigmaPion_TOF, // pion nSig values in TPC/TOF
1249 nPIDtpc, nPIDits, nPIDtof, // PID label for each detector
1250 nSigmaProton_TPC, nSigmaKaon_TPC, // nSig in TPC
1251 nSigmaPion_ITS, nSigmaProton_ITS, nSigmaKaon_ITS, // nSig in ITS
1252 nSigmaProton_TOF, nSigmaKaon_TOF, // nSig in TOF
1253 }; //array for PID sparse
1254 fhnPID->Fill(pid_EntriesALL);
1256 // PID sparse getting filled
1257 Double_t pid_Entries[14] = {fCent,pt,charge,deta,dphijh,leadjet,zVtx,dEP,jetPt,
1258 nSigmaPion_TPC, nSigmaPion_TOF, // pion nSig values in TPC/TOF
1259 nPIDtpc, nPIDits, nPIDtof // PID label for each detector
1260 }; //array for PID sparse
1261 fhnPID->Fill(pid_Entries); // fill Sparse histo of PID tracks
1262 } // minimal pid sparse filling
1264 } // end of doPID check
1267 Int_t itrackpt = -500; // initialize track pT bin
1268 itrackpt = GetpTtrackBin(track->Pt());
1270 // all tracks: jet hadron correlations in hadron pt bins
1271 if(makeextraCORRhistos) fHistJetHadbindPhi[itrackpt]->Fill(dphijh);
1273 // in plane and out of plane jet-hadron histo's
1274 if( dEP>0 && dEP<=(TMath::Pi()/6) ){
1276 if(makeextraCORRhistos) fHistJetHaddPhiINcent[centbin]->Fill(dphijh);
1277 fHistJetHaddPhiIN->Fill(dphijh);
1278 if(makeextraCORRhistos) fHistJetHadbindPhiIN[itrackpt]->Fill(dphijh);
1279 //fHistJetHaddPhiPtcentbinIN[itrackpt][centbin]->Fill(dphijh);
1280 }else if( dEP>(TMath::Pi()/3) && dEP<=(TMath::Pi()/2) ){
1281 // we are OUT of PLANE
1282 if(makeextraCORRhistos) fHistJetHaddPhiOUTcent[centbin]->Fill(dphijh);
1283 fHistJetHaddPhiOUT->Fill(dphijh);
1284 if(makeextraCORRhistos) fHistJetHadbindPhiOUT[itrackpt]->Fill(dphijh);
1285 //fHistJetHaddPhiPtcentbinOUT[itrackpt][centbin]->Fill(dphijh);
1286 }else if( dEP>(TMath::Pi()/6) && dEP<=(TMath::Pi()/3) ){
1287 // we are in the middle of plane
1288 if(makeextraCORRhistos) fHistJetHaddPhiMIDcent[centbin]->Fill(dphijh);
1289 fHistJetHaddPhiMID->Fill(dphijh);
1290 if(makeextraCORRhistos) fHistJetHadbindPhiMID[itrackpt]->Fill(dphijh);
1292 } // loop over tracks found in event with highest JET pT > 10.0 GeV (change)
1296 fHistEventQA->Fill(14); // events right before event mixing
1298 // ***************************************************************************************************************
1299 // ******************************** Event MIXING *****************************************************************
1300 // ***************************************************************************************************************
1302 // initialize object array of cloned picotracks
1303 TObjArray* tracksClone = 0x0;
1305 // PbPb collisions - create cloned picotracks
1306 if(GetBeamType() == 1) tracksClone = CloneAndReduceTrackList(tracks); // TEST
1308 //Prepare to do event mixing
1309 if(fDoEventMixing>0){
1312 // 1. First get an event pool corresponding in mult (cent) and
1313 // zvertex to the current event. Once initialized, the pool
1314 // should contain nMix (reduced) events. This routine does not
1315 // pre-scan the chain. The first several events of every chain
1316 // will be skipped until the needed pools are filled to the
1317 // specified depth. If the pool categories are not too rare, this
1318 // should not be a problem. If they are rare, you could lose
1321 // 2. Collect the whole pool's content of tracks into one TObjArray
1322 // (bgTracks), which is effectively a single background super-event.
1324 // 3. The reduced and bgTracks arrays must both be passed into
1325 // FillCorrelations(). Also nMix should be passed in, so a weight
1326 // of 1./nMix can be applied.
1328 // mix jets from triggered events with tracks from MB events
1329 // get the trigger bit, need to change trigger bits between different runs
1330 UInt_t trigger = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
1332 if(GetBeamType() == 0) {
1333 //trigger = ((AliInputEventHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()))->IsEventSelected();
1334 if (trigger==0) return kTRUE;
1337 // initialize event pools
1338 AliEventPool* pool = 0x0;
1339 AliEventPool* poolpp = 0x0;
1340 Double_t Ntrks = -999;
1342 // pp collisions - get event pool
1343 if(GetBeamType() == 0) {
1344 Ntrks=(Double_t)Ntracks*1.0;
1345 //cout<<"Test.. Ntrks: "<<fPoolMgr->GetEventPool(Ntrks);
1347 poolpp = fPoolMgr->GetEventPool(Ntrks, zVtx); // for pp
1350 // PbPb collisions - get event pool
1351 if(GetBeamType() == 1) pool = fPoolMgr->GetEventPool(fCent, zVtx); // for PbPb? fcent
1353 if (!pool && !poolpp){
1354 if(GetBeamType() == 1) AliFatal(Form("No pool found for centrality = %f, zVtx = %f", fCent, zVtx));
1355 if(GetBeamType() == 0) AliFatal(Form("No pool found for multiplicity = %f, zVtx = %f", Ntrks, zVtx));
1359 fHistEventQA->Fill(15); // mixed events cases that have pool
1361 // initialize background tracks array
1362 TObjArray* bgTracks;
1364 // next line might not apply for PbPb collisions
1365 // use only jets from EMCal-triggered events (for lhc11a use AliVEvent::kEMC1)
1366 //check for a trigger jet
1367 // fmixingtrack/10 ??
1368 if(GetBeamType() == 1) if (pool->IsReady() || pool->NTracksInPool() > fMixingTracks / 10 || pool->GetCurrentNEvents() >= 5) {
1370 // loop over jets (passing cuts?)
1371 for (Int_t ijet = 0; ijet < Njets; ijet++) {
1373 if (ijet==ijethi) leadjet=1;
1376 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
1379 // (should probably be higher..., but makes a cut on jet pT)
1380 if (jet->Pt()<0.1) continue;
1381 if (!AcceptMyJet(jet)) continue;
1383 fHistEventQA->Fill(16); // event mixing jets
1385 // set cut to do event mixing only if we have a jet meeting our pt threshold (bias applied below)
1386 if (jet->Pt()<fJetPtcut) continue;
1388 // get number of current events in pool
1389 Int_t nMix = pool->GetCurrentNEvents(); // how many particles in pool to mix
1391 // Fill for biased jet triggers only
1392 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)) { // && jet->Pt() > fJetPtcut) {
1393 // Fill mixed-event histos here
1394 for (Int_t jMix=0; jMix<nMix; jMix++) {
1395 fHistEventQA->Fill(17); // event mixing nMix
1397 // get jMix'th event
1398 bgTracks = pool->GetEvent(jMix);
1399 const Int_t Nbgtrks = bgTracks->GetEntries();
1400 for(Int_t ibg=0; ibg<Nbgtrks; ibg++) {
1401 AliPicoTrack *part = static_cast<AliPicoTrack*>(bgTracks->At(ibg));
1403 if(TMath::Abs(part->Eta())>0.9) continue;
1404 if(part->Pt()<0.15) continue;
1406 Double_t DEta = part->Eta()-jet->Eta(); // difference in eta
1407 Double_t DPhi = RelativePhi(jet->Phi(),part->Phi()); // difference in phi
1408 Double_t dEP = RelativeEPJET(jet->Phi(),fEPV0); // difference between jet and EP
1409 Double_t mixcharge = part->Charge();
1410 //Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta); // difference in R
1412 // create / fill mixed event sparse
1413 Double_t triggerEntries[10] = {fCent,jet->Pt(),part->Pt(),DEta,DPhi,dEP,zVtx, mixcharge, leadjet}; //array for ME sparse
1414 fhnMixedEvents->Fill(triggerEntries,1./nMix); // fill Sparse histo of mixed events
1416 fHistEventQA->Fill(18); // event mixing - nbgtracks
1417 if(makeextraCORRhistos) fHistMEphieta->Fill(DPhi,DEta, 1./nMix);
1418 } // end of background track loop
1419 } // end of filling mixed-event histo's
1420 } // end of check for biased jet triggers
1421 } // end of jet loop
1422 } // end of check for triggered jet
1424 //=============================================================================================================
1426 // use only jets from EMCal-triggered events (for lhc11a use AliVEvent::kEMC1)
1427 /// if (trigger & AliVEvent::kEMC1) {
1428 //T if (trigger & AliVEvent::kEMCEJE) { // TEST
1430 if(GetBeamType() == 0) if(!(trigger & AliVEvent::kEMC1)) {
1431 if(GetBeamType() == 0) if (poolpp->IsReady() || poolpp->NTracksInPool() > fMixingTracks / 100 || poolpp->GetCurrentNEvents() >= 5) {
1433 // loop over jets (passing cuts?)
1434 for (Int_t ijet = 0; ijet < Njets; ijet++) {
1436 if (ijet==ijethi) leadjet=1;
1439 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
1442 // (should probably be higher..., but makes a cut on jet pT)
1443 if (jet->Pt()<0.1) continue;
1444 if (!AcceptMyJet(jet)) continue;
1446 fHistEventQA->Fill(16); // event mixing jets
1448 // set cut to do event mixing only if we have a jet meeting our pt threshold (bias applied below)
1449 if (jet->Pt()<fJetPtcut) continue;
1451 // get number of current events in pool
1452 Int_t nMix = poolpp->GetCurrentNEvents(); // how many particles in pool to mix
1454 // Fill for biased jet triggers only
1455 if ((jet->MaxTrackPt()>fTrkBias) || (jet->MaxClusterPt()>fClusBias)) { // && jet->Pt() > fJetPtcut) {
1456 // Fill mixed-event histos here
1457 for (Int_t jMix=0; jMix<nMix; jMix++) {
1458 fHistEventQA->Fill(17); // event mixing nMix
1460 // get jMix'th event
1461 bgTracks = poolpp->GetEvent(jMix);
1462 const Int_t Nbgtrks = bgTracks->GetEntries();
1463 for(Int_t ibg=0; ibg<Nbgtrks; ibg++) {
1464 AliPicoTrack *part = static_cast<AliPicoTrack*>(bgTracks->At(ibg));
1466 if(TMath::Abs(part->Eta())>0.9) continue;
1467 if(part->Pt()<0.15) continue;
1469 Double_t DEta = part->Eta()-jet->Eta(); // difference in eta
1470 Double_t DPhi = RelativePhi(jet->Phi(),part->Phi()); // difference in phi
1471 Double_t dEP = RelativeEPJET(jet->Phi(),fEPV0); // difference between jet and EP
1472 Double_t mixcharge = part->Charge();
1473 //Double_t DR=TMath::Sqrt(DPhi*DPhi+DEta*DEta); // difference in R
1475 // create / fill mixed event sparse
1476 Double_t triggerEntries[10] = {fCent,jet->Pt(),part->Pt(),DEta,DPhi,dEP,zVtx, mixcharge, leadjet}; //array for ME sparse
1477 fhnMixedEvents->Fill(triggerEntries,1./nMix); // fill Sparse histo of mixed events
1479 fHistEventQA->Fill(18); // event mixing - nbgtracks
1480 if(makeextraCORRhistos) fHistMEphieta->Fill(DPhi,DEta, 1./nMix);
1481 } // end of background track loop
1482 } // end of filling mixed-event histo's
1483 } // end of check for biased jet triggers
1484 } // end of jet loop
1485 } // end of check for triggered jet
1486 } //end EMC triggered loop
1489 // use only tracks from MB events (for lhc11a use AliVEvent::kMB)
1490 /// if (trigger & AliVEvent::kMB) {
1491 //T if (trigger & AliVEvent::kAnyINT){ // test
1492 if(GetBeamType() == 0) {
1494 // (use only tracks from MB events (for lhc11a use AliVEvent::kMB)
1495 if(trigger & AliVEvent::kMB) {
1497 // create a list of reduced objects. This speeds up processing and reduces memory consumption for the event pool
1498 tracksClone = CloneAndReduceTrackList(tracks) ;
1500 // update pool if jet in event or not
1501 poolpp->UpdatePool(tracksClone);
1503 } // check on track from MB events
1507 if(GetBeamType() == 1) {
1508 // update pool if jet in event or not
1509 pool->UpdatePool(tracksClone);
1512 } // end of event mixing
1514 // print some stats on the event
1516 fHistEventQA->Fill(19); // events making it to end
1519 cout<<"Event #: "<<event<<" Jet Radius: "<<fJetRad<<" Constituent Pt Cut: "<<fConstituentCut<<endl;
1520 cout<<"# of jets: "<<Njets<<" Highest jet pt: "<<highestjetpt<<" leading hadron pt: "<<leadhadronPT<<endl;
1521 cout<<"# tracks: "<<Ntracks<<" Highest track pt: "<<ptmax<<endl;
1522 cout<<" =============================================== "<<endl;
1525 return kTRUE; // used when the function is of type bool
1528 //________________________________________________________________________
1529 Int_t AliAnalysisTaskEmcalJetHadEPpid::GetCentBin(Double_t cent) const
1530 { // Get centrality bin.
1532 if (cent>=0 && cent<10) centbin = 0;
1533 else if (cent>=10 && cent<20) centbin = 1;
1534 else if (cent>=20 && cent<30) centbin = 2;
1535 else if (cent>=30 && cent<40) centbin = 3;
1536 else if (cent>=40 && cent<50) centbin = 4;
1537 else if (cent>=50 && cent<90) centbin = 5;
1542 //________________________________________________________________________
1543 Double_t AliAnalysisTaskEmcalJetHadEPpid::RelativePhi(Double_t mphi,Double_t vphi) const
1544 { // function to calculate relative PHI
1545 double dphi = mphi-vphi;
1547 // set dphi to operate on adjusted scale
1548 if(dphi<-0.5*TMath::Pi()) dphi+=2.*TMath::Pi();
1549 if(dphi>3./2.*TMath::Pi()) dphi-=2.*TMath::Pi();
1552 if( dphi < -1.*TMath::Pi()/2 || dphi > 3.*TMath::Pi()/2 )
1553 AliWarning(Form("%s: dPHI not in range [-0.5*Pi, 1.5*Pi]!", GetName()));
1555 return dphi; // dphi in [-0.5Pi, 1.5Pi]
1558 //_________________________________________________________________________
1559 Double_t AliAnalysisTaskEmcalJetHadEPpid:: RelativeEPJET(Double_t jetAng, Double_t EPAng) const
1560 { // function to calculate angle between jet and EP in the 1st quadrant (0,Pi/2)
1561 Double_t dphi = (EPAng - jetAng);
1563 // ran into trouble with a few dEP<-Pi so trying this...
1564 if( dphi<-1*TMath::Pi() ){
1565 dphi = dphi + 1*TMath::Pi();
1566 } // this assumes we are doing full jets currently
1568 if( (dphi>0) && (dphi<1*TMath::Pi()/2) ){
1569 // Do nothing! we are in quadrant 1
1570 }else if( (dphi>1*TMath::Pi()/2) && (dphi<1*TMath::Pi()) ){
1571 dphi = 1*TMath::Pi() - dphi;
1572 }else if( (dphi<0) && (dphi>-1*TMath::Pi()/2) ){
1574 }else if( (dphi<-1*TMath::Pi()/2) && (dphi>-1*TMath::Pi()) ){
1575 dphi = dphi + 1*TMath::Pi();
1579 if( dphi < 0 || dphi > TMath::Pi()/2 )
1580 AliWarning(Form("%s: dPHI not in range [0, 0.5*Pi]!", GetName()));
1582 return dphi; // dphi in [0, Pi/2]
1585 //Int_t ieta=GetEtaBin(deta);
1586 //________________________________________________________________________
1587 Int_t AliAnalysisTaskEmcalJetHadEPpid::GetEtaBin(Double_t eta) const
1589 // Get eta bin for histos.
1591 if (TMath::Abs(eta)<=0.4) etabin = 0;
1592 else if (TMath::Abs(eta)>0.4 && TMath::Abs(eta)<0.8) etabin = 1;
1593 else if (TMath::Abs(eta)>=0.8) etabin = 2;
1596 } // end of get-eta-bin
1598 //________________________________________________________________________
1599 Int_t AliAnalysisTaskEmcalJetHadEPpid::GetpTjetBin(Double_t pt) const
1601 // Get jet pt bin for histos.
1603 if (pt>=15 && pt<20) ptbin = 0;
1604 else if (pt>=20 && pt<25) ptbin = 1;
1605 else if (pt>=25 && pt<40) ptbin = 2;
1606 else if (pt>=40 && pt<60) ptbin = 3;
1607 else if (pt>=60) ptbin = 4;
1610 } // end of get-jet-pt-bin
1612 //________________________________________________________________________
1613 Int_t AliAnalysisTaskEmcalJetHadEPpid::GetpTtrackBin(Double_t pt) const
1615 // May need to update bins for future runs... (testing locally)
1617 // Get track pt bin for histos.
1619 if (pt < 0.5) ptbin = 0;
1620 else if (pt>=0.5 && pt<1.0) ptbin = 1;
1621 else if (pt>=1.0 && pt<1.5) ptbin = 2;
1622 else if (pt>=1.5 && pt<2.0) ptbin = 3;
1623 else if (pt>=2.0 && pt<2.5) ptbin = 4;
1624 else if (pt>=2.5 && pt<3.0) ptbin = 5;
1625 else if (pt>=3.0 && pt<4.0) ptbin = 6;
1626 else if (pt>=4.0 && pt<5.0) ptbin = 7;
1627 else if (pt>=5.0) ptbin = 8;
1630 } // end of get-jet-pt-bin
1632 //___________________________________________________________________________
1633 Int_t AliAnalysisTaskEmcalJetHadEPpid::GetzVertexBin(Double_t zVtx) const
1635 // get z-vertex bin for histo.
1637 if (zVtx>=-10 && zVtx<-8) zVbin = 0;
1638 else if (zVtx>=-8 && zVtx<-6) zVbin = 1;
1639 else if (zVtx>=-6 && zVtx<-4) zVbin = 2;
1640 else if (zVtx>=-4 && zVtx<-2) zVbin = 3;
1641 else if (zVtx>=-2 && zVtx<0) zVbin = 4;
1642 else if (zVtx>=0 && zVtx<2) zVbin = 5;
1643 else if (zVtx>=2 && zVtx<4) zVbin = 6;
1644 else if (zVtx>=4 && zVtx<6) zVbin = 7;
1645 else if (zVtx>=6 && zVtx<8) zVbin = 8;
1646 else if (zVtx>=8 && zVtx<10) zVbin = 9;
1650 } // end of get z-vertex bin
1652 //______________________________________________________________________
1653 THnSparse* AliAnalysisTaskEmcalJetHadEPpid::NewTHnSparseF(const char* name, UInt_t entries)
1655 // generate new THnSparseF, axes are defined in GetDimParams()
1657 UInt_t tmp = entries;
1660 tmp = tmp &~ -tmp; // clear lowest bit
1663 TString hnTitle(name);
1664 const Int_t dim = count;
1671 while(c<dim && i<32){
1675 GetDimParams(i, label, nbins[c], xmin[c], xmax[c]);
1676 hnTitle += Form(";%s",label.Data());
1684 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1685 } // end of NewTHnSparseF
1687 void AliAnalysisTaskEmcalJetHadEPpid::GetDimParams(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1689 // stores label and binning of axis for THnSparse
1690 const Double_t pi = TMath::Pi();
1695 label = "V0 centrality (%)";
1702 label = "Jet p_{T}";
1709 label = "Track p_{T}";
1710 nbins = 80; //300; // 750 pid
1716 label = "Relative Eta";
1723 label = "Relative Phi";
1730 label = "Relative angle of Jet and Reaction Plane";
1744 label = "track charge";
1751 label = "leading jet";
1757 case 9: // need to update
1758 label = "leading track";
1765 } // end of getting dim-params
1767 //_________________________________________________
1768 // From CF event mixing code PhiCorrelations
1769 TObjArray* AliAnalysisTaskEmcalJetHadEPpid::CloneAndReduceTrackList(TObjArray* tracksME)
1771 // clones a track list by using AliPicoTrack which uses much less memory (used for event mixing)
1772 TObjArray* tracksClone = new TObjArray;
1773 tracksClone->SetOwner(kTRUE);
1775 // ===============================
1777 // cout << "RM Hybrid track : " << i << " " << particle->Pt() << endl;
1779 //cout << "nEntries " << tracks->GetEntriesFast() <<endl;
1780 for (Int_t i=0; i<tracksME->GetEntriesFast(); i++) { // AOD/general case
1781 AliVParticle* particle = (AliVParticle*) tracksME->At(i); // AOD/general case
1782 if(TMath::Abs(particle->Eta())>fTrkEta) continue;
1783 if(particle->Pt()<0.15)continue;
1787 Double_t trackpt=particle->Pt(); // track pT
1790 trklabel=particle->GetLabel();
1791 //cout << "TRACK_LABEL: " << particle->GetLabel()<<endl;
1794 if(trackpt<0.5) hadbin=0;
1795 else if(trackpt<1) hadbin=1;
1796 else if(trackpt<2) hadbin=2;
1797 else if(trackpt<3) hadbin=3;
1798 else if(trackpt<5) hadbin=4;
1799 else if(trackpt<8) hadbin=5;
1800 else if(trackpt<20) hadbin=6;
1804 if(hadbin>-1 && trklabel>-1 && trklabel <3) fHistTrackEtaPhi[trklabel][hadbin]->Fill(particle->Eta(),particle->Phi());
1805 if(hadbin>-1) fHistTrackEtaPhi[3][hadbin]->Fill(particle->Eta(),particle->Phi());
1807 if(hadbin>-1) fHistTrackEtaPhi[hadbin]->Fill(particle->Eta(),particle->Phi()); // TEST
1810 tracksClone->Add(new AliPicoTrack(particle->Pt(), particle->Eta(), particle->Phi(), particle->Charge(), 0, 0, 0, 0));
1811 } // end of looping through tracks
1816 //____________________________________________________________________________________________
1817 THnSparse* AliAnalysisTaskEmcalJetHadEPpid::NewTHnSparseFPID(const char* name, UInt_t entries)
1819 // generate new THnSparseF PID, axes are defined in GetDimParams()
1821 UInt_t tmp = entries;
1824 tmp = tmp &~ -tmp; // clear lowest bit
1827 TString hnTitle(name);
1828 const Int_t dim = count;
1835 while(c<dim && i<32){
1839 GetDimParamsPID(i, label, nbins[c], xmin[c], xmax[c]);
1840 hnTitle += Form(";%s",label.Data());
1848 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
1849 } // end of NewTHnSparseF PID
1851 //________________________________________________________________________________
1852 void AliAnalysisTaskEmcalJetHadEPpid::GetDimParamsPID(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1854 // stores label and binning of axis for THnSparse
1855 const Double_t pi = TMath::Pi();
1860 label = "V0 centrality (%)";
1867 label = "Track p_{T}";
1868 nbins = 80; //300; // 750
1874 label = "Charge of Track";
1881 label = "Relative Eta of Track and Jet";
1888 label = "Relative Phi of Track and Jet";
1895 label = "leading jet";
1909 label = "Relative angle: Jet and Reaction Plane";
1916 label = "Jet p_{T}";
1923 label = "N-Sigma of pions in TPC";
1930 label = "N-Sigma of pions in TOF";
1937 label = "TPC PID determination";
1944 label = "ITS PID determination";
1951 label = "TOF PID determination";
1958 label = "N-Sigma of protons in TPC";
1965 label = "N-Sigma of kaons in TPC";
1972 label = "N-Sigma of pions in ITS";
1979 label = "N-Sigma of protons in ITS";
1986 label = "N-Sigma of kaons in ITS";
1993 label = "N-Sigma of protons in TOF";
2000 label = "N-Sigma of kaons in TOF";
2007 } // end of get dimension parameters PID
2009 void AliAnalysisTaskEmcalJetHadEPpid::Terminate(Option_t *) {
2010 cout<<"#########################"<<endl;
2011 cout<<"#### DONE RUNNING!!! ####"<<endl;
2012 cout<<"#########################"<<endl;
2013 } // end of terminate
2015 //________________________________________________________________________
2016 Int_t AliAnalysisTaskEmcalJetHadEPpid::AcceptMyJet(AliEmcalJet *jet) {
2017 //applies all jet cuts except pt
2018 if ((jet->Phi()<fPhimin)||(jet->Phi()>fPhimax)) return 0;
2019 if ((jet->Eta()<fEtamin)||(jet->Eta()>fEtamax)) return 0;
2020 if (jet->Area()<fAreacut) return 0;
2021 // prevents 0 area jets from sneaking by when area cut == 0
2022 if (jet->Area()==0) return 0;
2023 //exclude jets with extremely high pt tracks which are likely misreconstructed
2024 if(jet->MaxTrackPt()>100) return 0;
2026 //passed all above cuts
2030 //void AliAnalysisTaskEmcalJetHadEPpid::FillAnalysisSummaryHistogram() const
2031 void AliAnalysisTaskEmcalJetHadEPpid::SetfHistPIDcounterLabels(TH1* h) const
2033 // fill the analysis summary histrogram, saves all relevant analysis settigns
2034 h->GetXaxis()->SetBinLabel(1, "TPC: Unidentified"); // 0.5
2035 h->GetXaxis()->SetBinLabel(2, "TPC: Pion"); // 1.5
2036 h->GetXaxis()->SetBinLabel(3, "TPC: Kaon"); // 2.5
2037 h->GetXaxis()->SetBinLabel(4, "TPC: Proton"); // 3.5
2038 h->GetXaxis()->SetBinLabel(5, "ITS: Unidentified"); // 4.5
2039 h->GetXaxis()->SetBinLabel(6, "ITS: Pion"); // 5.5
2040 h->GetXaxis()->SetBinLabel(7, "ITS: Kaon"); // 6.5
2041 h->GetXaxis()->SetBinLabel(8, "ITS: Proton"); // 7.5
2042 h->GetXaxis()->SetBinLabel(9, "TOF: Unidentified"); // 8.5
2043 h->GetXaxis()->SetBinLabel(10, "TOF: Pion"); // 9.5
2044 h->GetXaxis()->SetBinLabel(11, "TOF: Kaon"); // 10.5
2045 h->GetXaxis()->SetBinLabel(12, "TOF: Proton"); // 11.5
2046 h->GetXaxis()->SetBinLabel(14, "Unidentified tracks"); //13.5
2050 //void AliAnalysisTaskEmcalJetHadEPpid::FillAnalysisSummaryHistogram() const
2051 void AliAnalysisTaskEmcalJetHadEPpid::SetfHistQAcounterLabels(TH1* h) const
2053 // fill the analysis summary histrogram, saves all relevant analysis settigns
2054 h->GetXaxis()->SetBinLabel(1, "All events started");
2055 h->GetXaxis()->SetBinLabel(2, "object check");
2056 h->GetXaxis()->SetBinLabel(3, "aod/esd check");
2057 h->GetXaxis()->SetBinLabel(4, "centrality check");
2058 h->GetXaxis()->SetBinLabel(5, "zvertex check");
2059 h->GetXaxis()->SetBinLabel(6, "list check");
2060 h->GetXaxis()->SetBinLabel(7, "track/jet pointer check");
2061 h->GetXaxis()->SetBinLabel(8, "tracks & jets < than 1 check");
2062 h->GetXaxis()->SetBinLabel(9, "after track/jet loop to get highest pt");
2063 h->GetXaxis()->SetBinLabel(10, "accepted jets");
2064 h->GetXaxis()->SetBinLabel(11, "jets meeting pt threshold");
2065 h->GetXaxis()->SetBinLabel(12, "accepted tracks in events from trigger jet");
2066 h->GetXaxis()->SetBinLabel(13, "after AliVEvent and fPIDResponse");
2067 h->GetXaxis()->SetBinLabel(14, "events before event mixing");
2068 h->GetXaxis()->SetBinLabel(15, "mixed events having a pool");
2069 h->GetXaxis()->SetBinLabel(16, "event mixing: jets");
2070 h->GetXaxis()->SetBinLabel(17, "event mixing: nMix");
2071 h->GetXaxis()->SetBinLabel(18, "event mixing: nbackground tracks");
2072 h->GetXaxis()->SetBinLabel(19, "event mixing: THE END");
2075 //______________________________________________________________________
2076 THnSparse* AliAnalysisTaskEmcalJetHadEPpid::NewTHnSparseFCorr(const char* name, UInt_t entries) {
2077 // generate new THnSparseD, axes are defined in GetDimParamsD()
2079 UInt_t tmp = entries;
2082 tmp = tmp &~ -tmp; // clear lowest bit
2085 TString hnTitle(name);
2086 const Int_t dim = count;
2093 while(c<dim && i<32){
2097 GetDimParamsCorr(i, label, nbins[c], xmin[c], xmax[c]);
2098 hnTitle += Form(";%s",label.Data());
2106 return new THnSparseF(name, hnTitle.Data(), dim, nbins, xmin, xmax);
2107 } // end of NewTHnSparseF
2109 //______________________________________________________________________________________________
2110 void AliAnalysisTaskEmcalJetHadEPpid::GetDimParamsCorr(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
2112 //stores label and binning of axis for THnSparse
2113 const Double_t pi = TMath::Pi();
2118 label = "V0 centrality (%)";
2125 label = "Jet p_{T}";
2132 label = "Relative angle: Jet and Reaction Plane";
2146 label = "Jet p_{T} corrected with Local Rho";
2153 label = "Jet p_{T} corrected with Global Rho";
2160 } // end of Correction (ME) sparse