1 #ifndef ALIANALYSISTASKSE_H
14 #include <TClonesArray.h>
18 #include <TInterpreter.h>
20 #include "AliAnalysisTask.h"
21 #include "AliCentrality.h"
23 #include "AliESDEvent.h"
24 #include "AliESDInputHandler.h"
25 #include "AliAODEvent.h"
26 #include "AliAODHandler.h"
27 #include "AliAnalysisManager.h"
28 #include "AliAnalysisTaskSE.h"
32 #include "AliGenPythiaEventHeader.h"
33 #include "AliMCEvent.h"
35 #include <AliEmcalJet.h>
36 #include "AliVEventHandler.h"
37 #include "AliVParticle.h"
38 #include "AliAnalysisUtils.h"
41 #include "AliAnalysisTaskChargedJetsPA.h"
43 //TODO: Not accessing the particles when using MC
44 //TODO: FillHistogram can be done better with virtual TH1(?)
45 ClassImp(AliAnalysisTaskChargedJetsPA)
47 // ######################################################################################## DEFINE HISTOGRAMS
48 void AliAnalysisTaskChargedJetsPA::Init()
51 AliInfo("Creating histograms.");
54 AddHistogram1D<TH1D>("hNumberEvents", "Number of events (0 = before, 1 = after vertex cuts)", "", 2, 0, 2, "#Delta z(cm)","N^{Events}/cut");
56 // NOTE: Jet histograms
59 // ######## Jet spectra
60 AddHistogram2D<TH2D>("hJetPt", "Jets p_{T} distribution", "", 500, -50., 200., 5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
61 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedRC", "Jets p_{T} distribution, RC background subtracted", "", 500, -50., 200.,5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
62 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedKT", "Jets p_{T} distribution, KT background subtracted", "", 500, -50., 200., 5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
63 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedTR", "Jets p_{T} distribution, TR background subtracted", "", 500, -50., 200.,5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
64 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedRCPosEta", "Jets p_{T} distribution, RC background subtracted, #eta > 0.2", "", 500, -50., 200.,5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
65 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedKTPosEta", "Jets p_{T} distribution, KT background subtracted, #eta > 0.2", "", 500, -50., 200., 5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
66 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedTRPosEta", "Jets p_{T} distribution, TR background subtracted, #eta > 0.2", "", 500, -50., 200.,5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
67 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedRCNegEta", "Jets p_{T} distribution, RC background subtracted, #eta < -0.2", "", 500, -50., 200.,5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
68 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedKTNegEta", "Jets p_{T} distribution, KT background subtracted, #eta < -0.2", "", 500, -50., 200., 5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
69 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedTRNegEta", "Jets p_{T} distribution, TR background subtracted, #eta < -0.2", "", 500, -50., 200.,5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
71 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedRCEtaWindow", "Jets p_{T} distribution, RC background (in #eta window around jet) subtracted", "", 500, -50., 200., 5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
72 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedKTEtaWindow", "Jets p_{T} distribution, KT background (in #eta window around jet) subtracted", "", 500, -50., 200., 5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
73 AddHistogram2D<TH2D>("hJetPtBgrdSubtractedTREtaWindow", "Jets p_{T} distribution, TR background (in #eta window around jet) subtracted", "", 500, -50., 200., 5, 0, 100, "p_{T} (GeV/c)","Centrality","dN^{Jets}/dp_{T}");
76 AddHistogram1D<TH1D>("hJetCountAll", "Number of Jets", "", 200, 0., 200., "N jets","dN^{Events}/dN^{Jets}");
77 AddHistogram1D<TH1D>("hJetCountAccepted", "Number of accepted Jets", "", 200, 0., 200., "N jets","dN^{Events}/dN^{Jets}");
78 AddHistogram1D<TH1D>("hLeadingJetPt", "Leading jet p_{T}", "", 500, 0, 100, "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
79 AddHistogram1D<TH1D>("hSecondLeadingJetPt", "Second Leading jet p_{T}", "", 500, 0, 100, "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
80 AddHistogram1D<TH1D>("hJetDeltaPhi", "Jets combinatorial #Delta #phi", "", 250, 0., TMath::Pi(), "#Delta #phi","dN^{Jets}/d(#Delta #phi)");
81 AddHistogram1D<TH1D>("hLeadingJetDeltaPhi", "1st and 2nd leading jet #Delta #phi", "", 250, 0., TMath::Pi(), "#Delta #phi","dN^{Jets}/d(#Delta #phi)");
84 // NOTE: Jet background histograms
85 if (fAnalyzeBackground)
87 // ########## Different background estimates
88 AddHistogram2D<TH2D>("hRCBackground", "RC background density (2 leading jets excluded)", "LEGO2", 400, 0., 40., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
89 AddHistogram2D<TH2D>("hKTBackground", "KT background density (2 leading jets excluded)", "LEGO2", 400, 0., 40., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
90 AddHistogram2D<TH2D>("hTRBackground", "TR background density (2 leading jets excluded)", "LEGO2", 400, 0., 40., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
92 // ########## Delta Pt
93 AddHistogram2D<TH2D>("hDeltaPtKT", "Background fluctuations #delta p_{T} (KT)", "", 600, -40., 80., 5, 0, 100, "#delta p_{T} (GeV/c)","Centrality","dN^{Jets}/d#delta p_{T}");
94 AddHistogram2D<TH2D>("hDeltaPtRC", "Background fluctuations #delta p_{T} (RC)", "", 600, -40., 80., 5, 0, 100, "#delta p_{T} (GeV/c)","Centrality","dN^{Jets}/d#delta p_{T}");
95 AddHistogram2D<TH2D>("hDeltaPtTR", "Background fluctuations #delta p_{T} (TR)", "", 600, -40., 80., 5, 0, 100, "#delta p_{T} (GeV/c)","Centrality","dN^{Jets}/d#delta p_{T}");
96 AddHistogram2D<TH2D>("hDeltaPtKTNoExcl", "Background fluctuations #delta p_{T} (KT, no leading jet correction)", "", 600, -40., 80., 5, 0, 100, "#delta p_{T} (GeV/c)","Centrality","dN^{Jets}/d#delta p_{T}");
97 AddHistogram2D<TH2D>("hDeltaPtRCNoExcl", "Background fluctuations #delta p_{T} (RC, no leading jet correction)", "", 600, -40., 80., 5, 0, 100, "#delta p_{T} (GeV/c)","Centrality","dN^{Jets}/d#delta p_{T}");
98 AddHistogram2D<TH2D>("hDeltaPtTRNoExcl", "Background fluctuations #delta p_{T} (TR, no leading jet correction)", "", 600, -40., 80., 5, 0, 100, "#delta p_{T} (GeV/c)","Centrality","dN^{Jets}/d#delta p_{T}");
100 // ########## Min bias background in eta bins
101 AddHistogram2D<TH2D>("hRCBackgroundEtaBins", "RC background density (2 leading jets excluded)", "LEGO2", 400, 0., 40., 5, -0.5, +0.5, "#rho (GeV/c)","#eta", "dN^{Events}/d#rho d#eta");
102 AddHistogram2D<TH2D>("hKTBackgroundEtaBins", "KT background density (2 leading jets excluded)", "LEGO2", 400, 0., 40., 5, -0.5, +0.5, "#rho (GeV/c)","#eta", "dN^{Events}/d#rho d#eta");
103 AddHistogram2D<TH2D>("hTRBackgroundEtaBins", "TR background density (2 leading jets excluded)", "LEGO2", 400, 0., 40., 5, -0.5, +0.5, "#rho (GeV/c)","#eta", "dN^{Events}/d#rho d#eta");
105 // ########## Min bias background in sliding eta bins
106 AddHistogram2D<TH2D>("hRCBackgroundEtaWindow", "RC background density (2 leading jets excluded)", "LEGO2", 400, 0., 40., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho d#eta");
107 AddHistogram2D<TH2D>("hKTBackgroundEtaWindow", "KT background density (2 leading jets excluded)", "LEGO2", 400, 0., 40., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho d#eta");
108 AddHistogram2D<TH2D>("hTRBackgroundEtaWindow", "TR background density (2 leading jets excluded)", "LEGO2", 400, 0., 40., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho d#eta");
111 // ########## Dijet stuff
112 AddHistogram1D<TH1D>("hDijetLeadingJetPt", "Dijet leading jet p_{T} distribution", "", 500, 0., 100., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
113 AddHistogram1D<TH1D>("hDijetConstituentsPt", "Dijet constituents p_{T} distribution", "", 500, 0., 100., "p_{T} (GeV/c)","dN^{Jets}/dp_{T}");
114 AddHistogram2D<TH2D>("hDijetPtCorrelation", "Dijet constituents p_{T} correlation", "COLZ", 500, 5., 100., 500, 5., 100., "1st leading jet p_{T} (GeV/c)","2nd leading jet p_{T} (GeV/c)","dN^{Dijets}/d^{2}p_{T}");
115 AddHistogram2D<TH2D>("hDijetBackground", "Background density (dijets excluded)", "", 200, 0., 20., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
116 AddHistogram2D<TH2D>("hDijetBackgroundPerpendicular", "Background density (dijets excluded)", "", 200, 0., 20., 5, 0, 100, "#rho (GeV/c)","Centrality", "dN^{Events}/d#rho");
119 // NOTE: Pythia histograms
122 AddHistogram1D<TH1D>("hPythiaPtHard", "Pythia p_{T} hard distribution", "", 2000, 0, 400, "p_{T} hard","dN^{Events}/dp_{T,hard}");
123 AddHistogram1D<TProfile>("hPythiaXSection", "Pythia cross section distribution", "", fNumPtHardBins+2, -1, fNumPtHardBins+1, "p_{T} hard bin","dN^{Events}/dp_{T,hard}");
124 AddHistogram1D<TH1D>("hPythiaNTrials", "Pythia trials (no correction for manual cuts)", "", fNumPtHardBins+2, -1, fNumPtHardBins+1, "p_{T} hard bin", "Trials");
127 // register Histograms
128 for (Int_t i = 0; i < fHistCount; i++)
130 fOutputList->Add(fHistList->At(i));
133 PostData(1,fOutputList); // important for merging
137 //________________________________________________________________________
138 AliAnalysisTaskChargedJetsPA::AliAnalysisTaskChargedJetsPA(const char *name, const char* trackArrayName, const char* jetArrayName, const char* backgroundJetArrayName) : AliAnalysisTaskSE(name), fOutputList(0), fAnalyzeJets(1), fAnalyzeBackground(1), fAnalyzePythia(0), fHasTracks(0), fHasJets(0), fHasBackgroundJets(0), fIsMC(0), fJetArray(0), fTrackArray(0), fBackgroundJetArray(0), fJetArrayName(0), fTrackArrayName(0), fBackgroundJetArrayName(0), fNumPtHardBins(11), fRandConeRadius(0.4), fSignalJetRadius(0.4), fBackgroundJetRadius(0.4), fTRBackgroundConeRadius(0.4), fNumberRandCones(8), fNumberExcludedJets(2), fDijetMaxAngleDeviation(10.0), fSignalJetEtaWindow(0.5), fBackgroundJetEtaWindow(0.5), fTrackEtaWindow(0.9), fVertexWindow(10.0), fVertexMaxR(1.0), fMinTrackPt(0.150), fMinJetPt(1.0), fMinJetArea(0.4), fMinBackgroundJetPt(0.15), fMinDijetLeadingPt(10.0), fCentralityType("V0A"), fFirstLeadingJet(0), fSecondLeadingJet(0), fNumberSignalJets(0), fCrossSection(0.0), fTrials(0.0), fRandom(0), fHelperClass(0), fInitialized(0), fTaskInstanceCounter(0), fHistList(0), fHistCount(0)
141 AliInfo("Calling constructor.");
144 // Every instance of this task gets his own number
145 static Int_t instance = 0;
146 fTaskInstanceCounter = instance;
149 fTrackArrayName = new TString(trackArrayName);
150 if (fTrackArrayName->Contains("MCParticles")) //TODO: Not working for now
153 fJetArrayName = new TString(jetArrayName);
154 if (strcmp(fJetArrayName->Data(),"") == 0)
155 fAnalyzeJets = kFALSE;
157 fAnalyzeJets = kTRUE;
159 fBackgroundJetArrayName = new TString(backgroundJetArrayName);
160 if (strcmp(fBackgroundJetArrayName->Data(),"") == 0)
161 fAnalyzeBackground = kFALSE;
163 fAnalyzeBackground = kTRUE;
165 DefineOutput(1, TList::Class());
167 fHistList = new TList();
170 AliInfo("Constructor done.");
175 //________________________________________________________________________
176 inline Double_t AliAnalysisTaskChargedJetsPA::GetConePt(Double_t eta, Double_t phi, Double_t radius)
178 Double_t tmpConePt = 0.0;
180 for (Int_t i = 0; i < fTrackArray->GetEntries(); i++)
182 AliVTrack* tmpTrack = static_cast<AliVTrack*>(fTrackArray->At(i));
183 if (IsTrackInAcceptance(tmpTrack))
184 if(IsTrackInCone(tmpTrack, eta, phi, radius))
185 tmpConePt = tmpConePt + tmpTrack->Pt();
191 //________________________________________________________________________
192 inline Double_t AliAnalysisTaskChargedJetsPA::GetPtHard()
194 Double_t tmpPtHard = -1.0;
197 AliError("MCEvent not accessible although demanded!");
200 AliGenPythiaEventHeader* pythiaHeader = dynamic_cast<AliGenPythiaEventHeader*>(MCEvent()->GenEventHeader());
202 AliError("Pythia Header not accessible!");
204 tmpPtHard = pythiaHeader->GetPtHard();
210 //________________________________________________________________________
211 inline Int_t AliAnalysisTaskChargedJetsPA::GetPtHardBin()
213 // ########## PT HARD BIN EDGES
214 const Int_t kPtHardLowerEdges[] = { 0, 5,11,21,36,57, 84,117,152,191,234};
215 const Int_t kPtHardHigherEdges[] = { 5,11,21,36,57,84,117,152,191,234,1000000};
217 Int_t tmpPtHardBin = 0;
218 Double_t tmpPtHard = GetPtHard();
220 for (tmpPtHardBin = 0; tmpPtHardBin <= fNumPtHardBins; tmpPtHardBin++)
221 if (tmpPtHard >= kPtHardLowerEdges[tmpPtHardBin] && tmpPtHard < kPtHardHigherEdges[tmpPtHardBin])
228 //________________________________________________________________________
229 inline Bool_t AliAnalysisTaskChargedJetsPA::IsTrackInCone(AliVTrack* track, Double_t eta, Double_t phi, Double_t radius)
231 // This is to use a full cone in phi even at the edges of phi (2pi -> 0) (0 -> 2pi)
232 Double_t trackPhi = 0.0;
233 if (track->Phi() > (TMath::TwoPi() - (radius-phi)))
234 trackPhi = track->Phi() - TMath::TwoPi();
235 else if (track->Phi() < (phi+radius - TMath::TwoPi()))
236 trackPhi = track->Phi() + TMath::TwoPi();
238 trackPhi = track->Phi();
240 if ( TMath::Abs(trackPhi-phi)*TMath::Abs(trackPhi-phi) + TMath::Abs(track->Eta()-eta)*TMath::Abs(track->Eta()-eta) <= radius*radius)
246 //________________________________________________________________________
247 inline Bool_t AliAnalysisTaskChargedJetsPA::IsTrackInAcceptance(AliVParticle* track)
250 if (TMath::Abs(track->Eta()) <= fTrackEtaWindow)
251 if (track->Pt() >= fMinTrackPt)
257 //________________________________________________________________________
258 inline Bool_t AliAnalysisTaskChargedJetsPA::IsBackgroundJetInAcceptance(AliEmcalJet *jet)
261 if (TMath::Abs(jet->Eta()) <= fBackgroundJetEtaWindow)
262 if (jet->Pt() >= fMinBackgroundJetPt)
268 //________________________________________________________________________
269 inline Bool_t AliAnalysisTaskChargedJetsPA::IsSignalJetInAcceptance(AliEmcalJet *jet)
272 if (TMath::Abs(jet->Eta()) <= fSignalJetEtaWindow)
273 if (jet->Pt() >= fMinJetPt)
274 if (jet->Area() >= fMinJetArea)
280 //________________________________________________________________________
281 inline Bool_t AliAnalysisTaskChargedJetsPA::IsDijet(AliEmcalJet *jet1, AliEmcalJet *jet2)
283 // Output from GetDeltaPhi is < pi in any case
284 if ((jet1 != 0) && (jet2 != 0))
285 if((TMath::Pi() - GetDeltaPhi(jet1->Phi(),jet2->Phi())) < fDijetMaxAngleDeviation)
286 if ((jet1->Pt() > fMinDijetLeadingPt) && (jet2->Pt() > fMinDijetLeadingPt)) //TODO: Introduce recoil jet?
292 //________________________________________________________________________
293 void AliAnalysisTaskChargedJetsPA::ExecOnce()
296 AliInfo("Starting ExecOnce.");
298 fInitialized = kTRUE;
300 // Check for track array
301 if (strcmp(fTrackArrayName->Data(), "") != 0)
303 fTrackArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fTrackArrayName->Data()));
307 AliWarning(Form("%s: Could not retrieve tracks %s! This is OK, if tracks are not demanded.", GetName(), fTrackArrayName->Data()));
312 TClass *cl = fTrackArray->GetClass();
313 if (!cl->GetBaseClass("AliVParticle"))
315 AliError(Form("%s: Collection %s does not contain AliVParticle objects!", GetName(), fTrackArrayName->Data()));
322 // Check for jet array
323 if (strcmp(fJetArrayName->Data(), "") != 0)
325 fJetArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fJetArrayName->Data()));
330 AliWarning(Form("%s: Could not retrieve jets %s! This is OK, if jets are not demanded.", GetName(), fJetArrayName->Data()));
335 if (!fJetArray->GetClass()->GetBaseClass("AliEmcalJet"))
337 AliError(Form("%s: Collection %s does not contain AliEmcalJet objects!", GetName(), fJetArrayName->Data()));
344 // Check for background object
345 if (strcmp(fBackgroundJetArrayName->Data(), "") != 0)
347 fBackgroundJetArray = dynamic_cast<TClonesArray*>(InputEvent()->FindListObject(fBackgroundJetArrayName->Data()));
348 fHasBackgroundJets = kTRUE;
349 if (!fBackgroundJetArray)
351 AliInfo(Form("%s: Could not retrieve background jets %s! This is OK, if background is not demanded.", GetName(), fBackgroundJetArrayName->Data()));
352 fHasBackgroundJets = kFALSE;
356 // Look, if initialization is OK
357 if (!fHasTracks && fAnalyzeBackground)
359 AliError(Form("%s: Tracks NOT successfully casted although demanded! Deactivating background analysis",GetName()));
360 fAnalyzeBackground = kFALSE;
362 if ((!fHasJets && fAnalyzeJets) || (!fHasJets && fAnalyzeBackground))
364 AliError(Form("%s: Jets NOT successfully casted although demanded! Deactivating jet- and background analysis",GetName()));
365 fAnalyzeJets = kFALSE;
366 fAnalyzeBackground = kFALSE;
368 if (!fHasBackgroundJets && fAnalyzeBackground)
370 AliError(Form("%s: Background NOT successfully casted although demanded! Deactivating background analysis",GetName()));
371 fAnalyzeBackground = kFALSE;
374 // Initialize helper class (for vertex selection)
375 fHelperClass = new AliAnalysisUtils();
381 AliInfo("ExecOnce done.");
386 //________________________________________________________________________
387 void AliAnalysisTaskChargedJetsPA::GetSignalJets()
390 fFirstLeadingJet = NULL;
391 fSecondLeadingJet = NULL;
392 fNumberSignalJets = 0;
394 Float_t maxJetPts[] = {0, 0};
395 Int_t jetIDArray[] = {-1, -1};
396 Int_t jetCount = fJetArray->GetEntries();
398 // Go through all jets and save signal jets and the two leading ones
399 for (Int_t i = 0; i < jetCount; i++)
401 AliEmcalJet* jet = static_cast<AliEmcalJet*>(fJetArray->At(i));
404 AliError(Form("%s: Could not receive jet %d", GetName(), i));
408 if (!IsSignalJetInAcceptance(jet)) continue;
410 if (jet->Pt() > maxJetPts[0])
412 maxJetPts[1] = maxJetPts[0];
413 jetIDArray[1] = jetIDArray[0];
414 maxJetPts[0] = jet->Pt();
417 else if (jet->Pt() > maxJetPts[1])
419 maxJetPts[1] = jet->Pt();
422 fSignalJets[fNumberSignalJets] = jet;
426 if (fNumberSignalJets > 0)
427 fFirstLeadingJet = static_cast<AliEmcalJet*>(fJetArray->At(jetIDArray[0]));
428 if (fNumberSignalJets > 1)
429 fSecondLeadingJet = static_cast<AliEmcalJet*>(fJetArray->At(jetIDArray[1]));
433 //________________________________________________________________________
434 Int_t AliAnalysisTaskChargedJetsPA::GetLeadingJets(TClonesArray* jetArray, Int_t* jetIDArray, Bool_t isSignalJets)
436 // Writes first two leading jets into already registered array jetIDArray
440 AliError("Could not get the jet array to get leading jets from it!");
444 Float_t maxJetPts[] = {0, 0};
448 Int_t jetCount = jetArray->GetEntries();
449 Int_t jetCountAccepted = 0;
451 for (Int_t i = 0; i < jetCount; i++)
453 AliEmcalJet* jet = static_cast<AliEmcalJet*>(jetArray->At(i));
456 AliError(Form("%s: Could not receive jet %d", GetName(), i));
462 if (!IsSignalJetInAcceptance(jet)) continue;
466 if (!IsBackgroundJetInAcceptance(jet)) continue;
469 if (jet->Pt() > maxJetPts[0])
471 maxJetPts[1] = maxJetPts[0];
472 jetIDArray[1] = jetIDArray[0];
473 maxJetPts[0] = jet->Pt();
476 else if (jet->Pt() > maxJetPts[1])
478 maxJetPts[1] = jet->Pt();
483 return jetCountAccepted;
487 //________________________________________________________________________
488 Double_t AliAnalysisTaskChargedJetsPA::GetCorrectedJetPt(AliEmcalJet* jet, Double_t background)
491 AliInfo("Getting corrected jet spectra.");
496 AliError("Jet pointer passed to GetCorrectedJet() not valid!");
500 Double_t correctedPt = -1.0;
502 // if the passed background is not valid, do not subtract it
506 // Subtract background
507 correctedPt = jet->Pt() - background * jet->Area();
510 AliInfo("Got corrected jet spectra.");
518 //________________________________________________________________________
519 void AliAnalysisTaskChargedJetsPA::GetDeltaPt(Double_t& deltaPt, Double_t rho, Bool_t leadingJetExclusion)
522 AliInfo("Getting Delta Pt.");
525 // Define an invalid delta pt
529 Double_t etaMin, etaMax;
530 etaMin = -(fTrackEtaWindow-fRandConeRadius);
531 etaMax = +(fTrackEtaWindow-fRandConeRadius);
533 // Define random cone
534 Bool_t coneValid = kTRUE;
535 Double_t tmpRandConeEta = etaMin + fRandom->Rndm()*(etaMax-etaMin);
536 Double_t tmpRandConePhi = fRandom->Rndm()*TMath::TwoPi();
538 // if there is a jet, check for overlap if demanded
539 if(leadingJetExclusion)
541 for (Int_t i = 0; i<fNumberSignalJets; i++)
543 AliEmcalJet* tmpJet = fSignalJets[i];
545 Double_t excludedJetPhi = tmpJet->Phi();
546 Double_t excludedJetEta = tmpJet->Eta();
547 Double_t tmpDeltaPhi = GetDeltaPhi(tmpRandConePhi, excludedJetPhi);
549 // Check, if cone has overlap with jet
550 if ( tmpDeltaPhi*tmpDeltaPhi + TMath::Abs(tmpRandConeEta-excludedJetEta)*TMath::Abs(tmpRandConeEta-excludedJetEta) <= fRandConeRadius*fRandConeRadius)
552 // Define probability to exclude the RC
553 Double_t probability = 1 - (fNumberSignalJets-1)/fNumberSignalJets;
555 // Only exclude cone with a given probability
556 if (fRandom->Rndm()<=probability)
565 // Get the cones' pt and calculate delta pt
567 deltaPt = GetConePt(tmpRandConeEta,tmpRandConePhi,fRandConeRadius) - (rho*fRandConeRadius*fRandConeRadius*TMath::Pi());
570 AliInfo("Got Delta Pt.");
574 //________________________________________________________________________
575 void AliAnalysisTaskChargedJetsPA::GetKTBackgroundDensity(Int_t numberExcludeLeadingJets, Double_t& rhoMedian, Double_t& areaMean, Double_t etaMin, Double_t etaMax, Bool_t excludeSignalJets)
578 AliInfo("Getting KT background density.");
581 // static declaration. Advantage: more speed. Disadvantage: Problematic for events with more than 1024 jets :)
582 static Double_t tmpRhos[1024];
583 static Double_t tmpAreas[1024];
584 Int_t maxJetIds[] = {-1, -1}; // Indices for excludes jets (up to two)
586 // Setting invalid values
590 GetLeadingJets(fBackgroundJetArray, &maxJetIds[0], kFALSE);
591 // Exclude UP TO numberExcludeLeadingJets
592 if (fNumberSignalJets < 2)
593 numberExcludeLeadingJets = fNumberSignalJets;
595 // Check if etaMin/etaMax is given correctly
596 if(etaMin < -fBackgroundJetEtaWindow)
597 etaMin = -fBackgroundJetEtaWindow;
598 if(etaMax > fBackgroundJetEtaWindow)
599 etaMax = fBackgroundJetEtaWindow;
601 if ((etaMin == 0) && (etaMax == 0))
603 etaMin = -fBackgroundJetEtaWindow;
604 etaMax = +fBackgroundJetEtaWindow;
607 Int_t jetCountAccepted = 0;
608 for (Int_t i = 0; i < fBackgroundJetArray->GetEntries(); i++)
610 AliEmcalJet* backgroundJet = static_cast<AliEmcalJet*>(fBackgroundJetArray->At(i));
613 AliError(Form("%s: Could not receive jet %d", GetName(), i));
617 // Exclude signal jets
618 if (excludeSignalJets)
620 Bool_t isOverlapping = kFALSE;
621 for(Int_t j=0;j<numberExcludeLeadingJets;j++)
623 AliEmcalJet* signalJet = NULL;
626 signalJet = fFirstLeadingJet;
628 signalJet = fSecondLeadingJet;
630 AliFatal("Trying to exclude more than 2 signal jets in KT background -- not implemented.");
633 Double_t tmpDeltaPhi = GetDeltaPhi(backgroundJet->Phi(), signalJet->Phi());
635 if ( tmpDeltaPhi*tmpDeltaPhi + TMath::Abs(signalJet->Eta()-backgroundJet->Eta())*TMath::Abs(signalJet->Eta()-backgroundJet->Eta()) <= fSignalJetRadius*fSignalJetRadius)
637 isOverlapping = kTRUE;
644 else // exclude leading background jets
646 if (numberExcludeLeadingJets > 0)
647 if (i == maxJetIds[0])
649 if (numberExcludeLeadingJets > 1)
650 if (i == maxJetIds[1])
654 if (!IsBackgroundJetInAcceptance(backgroundJet))
656 if (!((backgroundJet->Eta() >= etaMin) && (backgroundJet->Eta() < etaMax)))
660 tmpRhos[jetCountAccepted] = backgroundJet->Pt() / backgroundJet->Area();
661 tmpAreas[jetCountAccepted] = backgroundJet->Area();
665 if (jetCountAccepted > 0)
667 rhoMedian = TMath::Median(jetCountAccepted, tmpRhos);
668 areaMean = TMath::Mean(jetCountAccepted, tmpAreas);
671 AliInfo("Got KT background density.");
676 //________________________________________________________________________
677 Int_t AliAnalysisTaskChargedJetsPA::GetRCBackgroundDensity(Int_t numberExcludeLeadingJets, Double_t& rhoMean, Double_t& rhoMedian, Double_t etaMin, Double_t etaMax, Int_t numberRandCones)
680 AliInfo("Getting RC background density.");
683 if(numberRandCones == 0)
684 numberRandCones = fNumberRandCones;
686 std::vector<AliEmcalJet> tmpCones(numberRandCones);
688 // Setting invalid values
692 // Exclude UP TO numberExcludeLeadingJets
693 if (fNumberSignalJets < 2)
694 numberExcludeLeadingJets = fNumberSignalJets;
696 // Search given amount of RCs
697 Int_t numAcceptedRCs = 0;
698 for(Int_t i=0;i<numberRandCones;i++)
700 Double_t tmpRandConeEta = 0.0;
701 Double_t tmpRandConePhi = 0.0;
702 Double_t excludedJetEta = 0.0;
703 Double_t excludedJetPhi = 0.0;
705 // Search random cone in acceptance with no overlap with already excluded jets (leading jets and random cones)
706 Bool_t coneValid = kTRUE;
708 // Check if etaMin/etaMax is given correctly
709 if(etaMin < -fSignalJetEtaWindow)
710 etaMin = -fSignalJetEtaWindow;
711 if(etaMax > fSignalJetEtaWindow)
712 etaMax = fSignalJetEtaWindow;
714 // Set the random cone position
715 if ((etaMin == 0) && (etaMax == 0))
716 tmpRandConeEta = (fTrackEtaWindow-fRandConeRadius)*(2.0*fRandom->Rndm()-1.0); // full RC is in acceptance
718 tmpRandConeEta = etaMin + fRandom->Rndm()*(etaMax-etaMin);
720 tmpRandConePhi = fRandom->Rndm()*TMath::TwoPi();
722 // Go through all excluded leading jets and check if there's an overlap
724 for(Int_t j=0;j<numberExcludeLeadingJets;j++)
726 AliEmcalJet* tmpJet = NULL;
729 tmpJet = fFirstLeadingJet;
731 tmpJet = fSecondLeadingJet;
733 AliFatal("Trying to exclude more than 2 jets in RC background -- not implemented.");
735 excludedJetPhi = tmpJet->Phi();
736 excludedJetEta = tmpJet->Eta();
737 Double_t tmpDeltaPhi = GetDeltaPhi(tmpRandConePhi, excludedJetPhi);
739 if ( tmpDeltaPhi*tmpDeltaPhi + TMath::Abs(tmpRandConeEta-excludedJetEta)*TMath::Abs(tmpRandConeEta-excludedJetEta) <= fRandConeRadius*fRandConeRadius)
746 // RC is accepted, so save it
749 AliEmcalJet tmpJet(GetConePt(tmpRandConeEta, tmpRandConePhi, fRandConeRadius), tmpRandConeEta, tmpRandConePhi, 0.0);
750 tmpCones[numAcceptedRCs] = tmpJet;
755 // Calculate Rho and the mean from the RCs (no excluded jets are considered!)
756 if(numAcceptedRCs > 0)
758 std::vector<Double_t> tmpRho(numAcceptedRCs);
759 for (Int_t i=0; i<numAcceptedRCs;i++)
760 tmpRho[i] = tmpCones[i].Pt()/(fRandConeRadius*fRandConeRadius*TMath::Pi());
762 rhoMean = TMath::Mean(tmpRho.begin(), tmpRho.end());
763 rhoMedian = 0.0; // NOT IMPLEMENTED because TMath::Median is not working with iterators
767 AliInfo("Got RC background density.");
769 return numAcceptedRCs;
772 //________________________________________________________________________
773 void AliAnalysisTaskChargedJetsPA::GetTRBackgroundDensity(Int_t numberExcludeLeadingJets, Double_t& rhoMean, Double_t& area, Double_t etaMin, Double_t etaMax)
776 AliInfo("Getting TR background density.");
779 Double_t summedTracksPt = 0.0;
781 // Check if etaMin/etaMax is given correctly
782 if(etaMin < -fTrackEtaWindow)
783 etaMin = -fTrackEtaWindow;
784 if(etaMax > fTrackEtaWindow)
785 etaMax = fTrackEtaWindow;
787 if ((etaMin == 0) && (etaMax == 0))
789 etaMin = -fTrackEtaWindow;
790 etaMax = +fTrackEtaWindow;
793 // Setting invalid values
796 // Exclude UP TO numberExcludeLeadingJets
797 if (fNumberSignalJets < 2)
798 numberExcludeLeadingJets = fNumberSignalJets;
801 Int_t trackCount = fTrackArray->GetEntries();
802 Int_t trackCountAccepted = 0;
803 for (Int_t i = 0; i < trackCount; i++)
805 Bool_t trackValid = kTRUE;
806 AliVTrack* tmpTrack = static_cast<AliVTrack*>(fTrackArray->At(i));
807 if (IsTrackInAcceptance(tmpTrack))
808 if ((tmpTrack->Eta() >= etaMin) && (tmpTrack->Eta() < etaMax))
810 for (Int_t j = 0; j < numberExcludeLeadingJets; j++)
812 AliEmcalJet* tmpJet = NULL;
814 tmpJet = fFirstLeadingJet;
816 tmpJet = fSecondLeadingJet;
818 AliFatal("Trying to exclude more than 2 jets in track background -- not implemented.");
820 if (IsTrackInCone(tmpTrack, tmpJet->Eta(), tmpJet->Phi(), fTRBackgroundConeRadius))
828 // Add track pt to array
829 summedTracksPt = summedTracksPt + tmpTrack->Pt();
830 trackCountAccepted++;
835 if (trackCountAccepted > 0)
837 Double_t tmpArea = 0.0;
839 tmpArea = (2.0*fTrackEtaWindow) * TMath::TwoPi() * (etaMax-etaMin)/(2.0*fTrackEtaWindow); // area of the used eta strip
841 // Now: exclude the part of the leading jet that is in the strip
842 if (numberExcludeLeadingJets == 2)
843 tmpArea = tmpArea*(1.0-MCGetOverlapCircleRectancle(fFirstLeadingJet->Eta(), fFirstLeadingJet->Phi(), fTRBackgroundConeRadius, etaMin, etaMax, 0., TMath::TwoPi()) -MCGetOverlapCircleRectancle(fSecondLeadingJet->Eta(), fSecondLeadingJet->Phi(), fTRBackgroundConeRadius, etaMin, etaMax, 0., TMath::TwoPi()));
844 else if (numberExcludeLeadingJets == 1)
845 tmpArea = tmpArea*(1.0-MCGetOverlapCircleRectancle(fFirstLeadingJet->Eta(), fFirstLeadingJet->Phi(), fTRBackgroundConeRadius, etaMin, etaMax, 0., TMath::TwoPi()));
847 rhoMean = summedTracksPt/tmpArea;
852 AliInfo("Got TR background density.");
856 //________________________________________________________________________
857 void AliAnalysisTaskChargedJetsPA::GetTRBackgroundDensity(Int_t numberExcludeLeadingJets, Double_t& rhoMean, Double_t& area, AliEmcalJet* excludeJet1, AliEmcalJet* excludeJet2, Bool_t doSearchPerpendicular)
860 AliInfo("Getting TR background density.");
863 // Setting invalid values
864 Double_t summedTracksPt = 0.0;
868 Double_t tmpRadius = 0.0;
869 if (doSearchPerpendicular)
870 tmpRadius = 0.5*TMath::Pi(); // exclude 90 degrees around jets
872 tmpRadius = fSignalJetRadius;
874 numberExcludeLeadingJets = 2; // dijet is excluded here in any case
878 if (!fTrackArray || !fJetArray)
880 AliError("Could not get the track/jet array to calculate track rho!");
884 Int_t trackCount = fTrackArray->GetEntries();
885 Int_t trackCountAccepted = 0;
886 for (Int_t i = 0; i < trackCount; i++)
888 AliVTrack* tmpTrack = static_cast<AliVTrack*>(fTrackArray->At(i));
889 if (IsTrackInAcceptance(tmpTrack))
891 if (IsTrackInCone(tmpTrack, excludeJet1->Eta(), excludeJet1->Phi(), tmpRadius))
894 if (numberExcludeLeadingJets > 1)
895 if (IsTrackInCone(tmpTrack, excludeJet2->Eta(), excludeJet2->Phi(), tmpRadius))
898 // Add track pt to array
899 summedTracksPt = summedTracksPt + tmpTrack->Pt();
900 trackCountAccepted++;
904 if (trackCountAccepted > 0)
906 Double_t tmpArea = 2.0*fTrackEtaWindow*TMath::TwoPi() - 2*(tmpRadius*tmpRadius * TMath::Pi()); //TPC area - excluding jet area
907 rhoMean = summedTracksPt/tmpArea;
912 AliInfo("Got TR background density.");
916 //________________________________________________________________________
917 void AliAnalysisTaskChargedJetsPA::Calculate(AliVEvent* event)
920 AliInfo("Starting Calculate().");
922 ////////////////////// NOTE: initialization & casting
925 FillHistogram("hNumberEvents", 0.5); // number of events before manual cuts
927 if(!fHelperClass->IsVertexSelected2013pA(event))
930 FillHistogram("hNumberEvents", 1.5); // number of events after manual cuts
933 AliInfo("Calculate()::Init done.");
936 ////////////////////// NOTE: Get Centrality, (Leading)Signal jets and Background
939 AliCentrality* tmpCentrality = NULL;
940 tmpCentrality = event->GetCentrality();
941 Double_t centralityPercentile = 0.0;
942 if (tmpCentrality != NULL)
943 centralityPercentile = tmpCentrality->GetCentralityPercentile(fCentralityType.Data());
946 if (fAnalyzeBackground || fAnalyzeJets)
949 // Get background estimates
950 Double_t backgroundKTMedian = -1.0;
951 Double_t backgroundRCMean = -1.0;
952 Double_t backgroundRCMedian = -1.0;
953 Double_t backgroundTRMean = -1.0;
954 Double_t backgroundKTAreaMean = -1.0;
955 Double_t backgroundTRAreaMean = -1.0;
956 Double_t dijetBackground = -1.0;
957 Double_t dijetBackgroundPerpendicular = -1.0;
959 if (fAnalyzeBackground)
961 GetRCBackgroundDensity (fNumberExcludedJets, backgroundRCMean, backgroundRCMedian);
962 GetTRBackgroundDensity (fNumberExcludedJets, backgroundTRMean, backgroundTRAreaMean);
963 GetKTBackgroundDensity (fNumberExcludedJets, backgroundKTMedian, backgroundKTAreaMean);
967 AliInfo("Calculate()::Centrality&SignalJets&Background-Calculation done.");
970 ////////////////////// NOTE: Jet analysis and calculations
974 // ### SIGNAL JET ANALYSIS
975 for (Int_t i = 0; i<fNumberSignalJets; i++)
977 AliEmcalJet* tmpJet = fSignalJets[i];
980 FillHistogram("hJetPt", tmpJet->Pt(), centralityPercentile);
981 FillHistogram("hJetPtBgrdSubtractedRC", GetCorrectedJetPt(tmpJet, backgroundRCMean), centralityPercentile);
982 FillHistogram("hJetPtBgrdSubtractedKT", GetCorrectedJetPt(tmpJet, backgroundKTMedian), centralityPercentile);
983 FillHistogram("hJetPtBgrdSubtractedTR", GetCorrectedJetPt(tmpJet, backgroundTRMean), centralityPercentile);
985 // Jet spectra (pos+neg eta)
986 if(tmpJet->Eta() > 0.2)
988 FillHistogram("hJetPtBgrdSubtractedRCPosEta", GetCorrectedJetPt(tmpJet, backgroundRCMean), centralityPercentile);
989 FillHistogram("hJetPtBgrdSubtractedKTPosEta", GetCorrectedJetPt(tmpJet, backgroundKTMedian), centralityPercentile);
990 FillHistogram("hJetPtBgrdSubtractedTRPosEta", GetCorrectedJetPt(tmpJet, backgroundTRMean), centralityPercentile);
992 else if(tmpJet->Eta() < -0.2)
994 FillHistogram("hJetPtBgrdSubtractedRCNegEta", GetCorrectedJetPt(tmpJet, backgroundRCMean), centralityPercentile);
995 FillHistogram("hJetPtBgrdSubtractedKTNegEta", GetCorrectedJetPt(tmpJet, backgroundKTMedian), centralityPercentile);
996 FillHistogram("hJetPtBgrdSubtractedTRNegEta", GetCorrectedJetPt(tmpJet, backgroundTRMean), centralityPercentile);
999 // Correct EVERY jet with suitable background
1000 Double_t tmpKTRho = 0.0;
1001 Double_t tmpRCRho = 0.0;
1002 Double_t tmpTRRho = 0.0;
1003 Double_t dummy = 0.0;
1004 // Calculate backgrounds
1005 GetKTBackgroundDensity (fNumberExcludedJets, tmpKTRho, dummy, tmpJet->Eta()-0.1, tmpJet->Eta()+0.1, kTRUE);
1006 GetRCBackgroundDensity (fNumberExcludedJets, tmpRCRho, dummy, tmpJet->Eta()-0.1, tmpJet->Eta()+0.1);
1007 GetTRBackgroundDensity (fNumberExcludedJets, tmpTRRho, dummy, tmpJet->Eta()-0.1, tmpJet->Eta()+0.1);
1009 FillHistogram("hKTBackgroundEtaWindow", tmpKTRho, centralityPercentile);
1010 FillHistogram("hRCBackgroundEtaWindow", tmpRCRho, centralityPercentile);
1011 FillHistogram("hTRBackgroundEtaWindow", tmpTRRho, centralityPercentile);
1013 FillHistogram("hJetPtBgrdSubtractedKTEtaWindow", GetCorrectedJetPt(tmpJet, tmpKTRho), centralityPercentile);
1014 FillHistogram("hJetPtBgrdSubtractedRCEtaWindow", GetCorrectedJetPt(tmpJet, tmpRCRho), centralityPercentile);
1015 FillHistogram("hJetPtBgrdSubtractedTREtaWindow", GetCorrectedJetPt(tmpJet, tmpTRRho), centralityPercentile);
1018 // Signal jet vs. signal jet - "Combinatorial"
1019 for (Int_t j = i+1; j<fNumberSignalJets; j++)
1020 FillHistogram("hJetDeltaPhi", GetDeltaPhi(tmpJet->Phi(), fSignalJets[j]->Phi()));
1024 if(fNumberSignalJets >= 2)
1026 FillHistogram("hLeadingJetDeltaPhi", GetDeltaPhi(fFirstLeadingJet->Phi(), fSecondLeadingJet->Phi()));
1028 if (IsDijet(fFirstLeadingJet, fSecondLeadingJet))
1030 FillHistogram("hDijetConstituentsPt", fFirstLeadingJet->Pt());
1031 FillHistogram("hDijetConstituentsPt", fSecondLeadingJet->Pt());
1033 FillHistogram("hDijetLeadingJetPt", fFirstLeadingJet->Pt());
1034 FillHistogram("hDijetPtCorrelation", fFirstLeadingJet->Pt(), fSecondLeadingJet->Pt());
1035 Double_t dummyArea = 0;
1036 GetTRBackgroundDensity (2, dijetBackground, dummyArea, fFirstLeadingJet, fSecondLeadingJet, kFALSE);
1037 GetTRBackgroundDensity (2, dijetBackgroundPerpendicular, dummyArea, fFirstLeadingJet, fSecondLeadingJet, kTRUE);
1041 // ### SOME JET PLOTS
1042 FillHistogram("hJetCountAll", fJetArray->GetEntries());
1043 FillHistogram("hJetCountAccepted", fNumberSignalJets);
1044 if (fFirstLeadingJet)
1045 FillHistogram("hLeadingJetPt", fFirstLeadingJet->Pt());
1046 if (fSecondLeadingJet)
1047 FillHistogram("hSecondLeadingJetPt", fSecondLeadingJet->Pt());
1049 } //endif AnalyzeJets
1052 AliInfo("Calculate()::Jets done.");
1054 ////////////////////// NOTE: Background analysis
1056 if (fAnalyzeBackground)
1058 // Calculate (non-eta corrected) background in centrality classes
1059 FillHistogram("hRCBackground", backgroundRCMean, centralityPercentile);
1060 FillHistogram("hTRBackground", backgroundTRMean, centralityPercentile);
1061 FillHistogram("hKTBackground", backgroundKTMedian, centralityPercentile);
1063 // Calculate backgrounds in eta bins
1064 for(Int_t i=0;i<5;i++)
1066 Double_t dummy = 0.0;
1067 Double_t tmpKTRho = 0.0;
1068 Double_t tmpRCRho = 0.0;
1069 Double_t tmpTRRho = 0.0;
1071 Double_t etaMin = -(fTrackEtaWindow-fSignalJetRadius) + 2*(fTrackEtaWindow-fSignalJetRadius)/5 * i;
1072 Double_t etaMax = -(fTrackEtaWindow-fSignalJetRadius) + 2*(fTrackEtaWindow-fSignalJetRadius)/5 * (i+1);
1074 // Calculate backgrounds
1075 GetKTBackgroundDensity (fNumberExcludedJets, tmpKTRho, dummy, etaMin, etaMax);
1076 GetTRBackgroundDensity (fNumberExcludedJets, tmpTRRho, dummy, etaMin, etaMax);
1077 GetRCBackgroundDensity (fNumberExcludedJets, tmpRCRho, dummy, etaMin, etaMax);
1079 FillHistogram("hRCBackgroundEtaBins", tmpRCRho, (etaMin+etaMax)/2.0);
1080 FillHistogram("hTRBackgroundEtaBins", tmpTRRho, (etaMin+etaMax)/2.0);
1081 FillHistogram("hKTBackgroundEtaBins", tmpKTRho, (etaMin+etaMax)/2.0);
1084 // In case of dijets -> look at the background
1085 if (dijetBackground >= 0)
1086 FillHistogram("hDijetBackground", dijetBackground, centralityPercentile);
1087 if (dijetBackgroundPerpendicular >= 0)
1088 FillHistogram("hDijetBackgroundPerpendicular", dijetBackgroundPerpendicular, centralityPercentile);
1091 // Calculate the delta pt
1092 Double_t tmpDeltaPtKT = 0.0;
1093 Double_t tmpDeltaPtRC = 0.0;
1094 Double_t tmpDeltaPtTR = 0.0;
1095 Double_t tmpDeltaPtKTNoExcl = 0.0;
1096 Double_t tmpDeltaPtRCNoExcl = 0.0;
1097 Double_t tmpDeltaPtTRNoExcl = 0.0;
1098 GetDeltaPt(tmpDeltaPtKT, backgroundKTMedian);
1099 GetDeltaPt(tmpDeltaPtRC, backgroundRCMean);
1100 GetDeltaPt(tmpDeltaPtTR, backgroundTRMean);
1101 GetDeltaPt(tmpDeltaPtKTNoExcl, backgroundKTMedian, kFALSE);
1102 GetDeltaPt(tmpDeltaPtRCNoExcl, backgroundRCMean, kFALSE);
1103 GetDeltaPt(tmpDeltaPtTRNoExcl, backgroundTRMean, kFALSE);
1105 // If valid, fill the delta pt histograms
1106 if(tmpDeltaPtKT > -10000.0)
1107 FillHistogram("hDeltaPtKT", tmpDeltaPtKT, centralityPercentile);
1108 if(tmpDeltaPtRC > -10000.0)
1109 FillHistogram("hDeltaPtRC", tmpDeltaPtRC, centralityPercentile);
1110 if(tmpDeltaPtTR > -10000.0)
1111 FillHistogram("hDeltaPtTR", tmpDeltaPtTR, centralityPercentile);
1112 if(tmpDeltaPtKTNoExcl > -10000.0)
1113 FillHistogram("hDeltaPtKTNoExcl", tmpDeltaPtKTNoExcl, centralityPercentile);
1114 if(tmpDeltaPtRCNoExcl > -10000.0)
1115 FillHistogram("hDeltaPtRCNoExcl", tmpDeltaPtRCNoExcl, centralityPercentile);
1116 if(tmpDeltaPtTRNoExcl > -10000.0)
1117 FillHistogram("hDeltaPtTRNoExcl", tmpDeltaPtTRNoExcl, centralityPercentile);
1122 AliInfo("Calculate()::Background done.");
1125 ////////////////////// NOTE: Pythia histograms
1128 FillHistogram("hPythiaPtHard", GetPtHard());
1129 FillHistogram("hPythiaNTrials", GetPtHardBin()-0.1, fTrials);
1130 FillHistogram("hPythiaXSection", GetPtHardBin()-0.1, fCrossSection);
1133 AliInfo("Calculate()::Pythia done.");
1137 AliInfo("Calculate() done.");
1141 //________________________________________________________________________
1142 Bool_t AliAnalysisTaskChargedJetsPA::Notify()
1144 // Implemented Notify() to read the cross sections
1145 // and number of trials from pyxsec.root
1148 AliInfo("Notify started.");
1153 TTree *tree = AliAnalysisManager::GetAnalysisManager()->GetTree();
1154 TFile *currFile = tree->GetCurrentFile();
1156 TString file(currFile->GetName());
1158 if(file.Contains("root_archive.zip#")){
1159 Ssiz_t pos1 = file.Index("root_archive",12,TString::kExact);
1160 Ssiz_t pos = file.Index("#",1,pos1,TString::kExact);
1161 file.Replace(pos+1,20,"");
1164 // not an archive take the basename....
1165 file.ReplaceAll(gSystem->BaseName(file.Data()),"");
1168 TFile *fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec.root")); // problem that we cannot really test the existance of a file in a archive so we have to lvie with open error message from root
1170 // next trial fetch the histgram file
1171 fxsec = TFile::Open(Form("%s%s",file.Data(),"pyxsec_hists.root"));
1173 // not a severe condition but inciate that we have no information
1177 // find the tlist we want to be independtent of the name so use the Tkey
1178 TKey* key = (TKey*)fxsec->GetListOfKeys()->At(0);
1183 TList *list = dynamic_cast<TList*>(key->ReadObj());
1188 fCrossSection = ((TProfile*)list->FindObject("h1Xsec"))->GetBinContent(1);
1189 fTrials = ((TH1F*)list->FindObject("h1Trials"))->GetBinContent(1);
1192 } // no tree pyxsec.root
1194 TTree *xtree = (TTree*)fxsec->Get("Xsection");
1200 Double_t xsection = 0;
1201 xtree->SetBranchAddress("xsection",&xsection);
1202 xtree->SetBranchAddress("ntrials",&ntrials);
1205 fCrossSection = xsection;
1209 AliInfo("Notify ended.");
1215 //________________________________________________________________________
1216 inline Double_t AliAnalysisTaskChargedJetsPA::EtaToTheta(Double_t arg)
1217 {return 2.*atan(exp(-arg));}
1218 //________________________________________________________________________
1219 inline Double_t AliAnalysisTaskChargedJetsPA::ThetaToEta(Double_t arg)
1221 if ((arg > TMath::Pi()) || (arg < 0.0))
1223 AliError(Form("ThetaToEta got wrong input! (%f)", arg));
1226 return -log(tan(arg/2.));
1228 //________________________________________________________________________
1229 inline Double_t AliAnalysisTaskChargedJetsPA::GetDeltaPhi(Double_t phi1, Double_t phi2)
1230 {return min(TMath::Abs(phi1-phi2),TMath::TwoPi() - TMath::Abs(phi1-phi2));}
1232 //________________________________________________________________________
1233 Double_t AliAnalysisTaskChargedJetsPA::MCGetOverlapCircleRectancle(Double_t cPosX, Double_t cPosY, Double_t cRadius, Double_t rPosXmin, Double_t rPosXmax, Double_t rPosYmin, Double_t rPosYmax)
1235 const Int_t kTests = 1000;
1237 TRandom3 randomGen(0);
1239 // Loop over kTests-many tests
1240 for (Int_t i=0; i<kTests; i++)
1242 //Choose random position in rectangle for the tester
1243 Double_t tmpTestX = randomGen.Uniform(rPosXmin, rPosXmax);
1244 Double_t tmpTestY = randomGen.Uniform(rPosYmin, rPosYmax);
1246 //Check, if tester is in circle. If yes, increment circle counter.
1247 Double_t tmpDistance = TMath::Sqrt( (tmpTestX - cPosX)*(tmpTestX - cPosX) + (tmpTestY - cPosY)*(tmpTestY - cPosY) );
1248 if(tmpDistance < cRadius)
1253 return (static_cast<Double_t>(hits)/static_cast<Double_t>(kTests));
1256 //________________________________________________________________________
1257 inline void AliAnalysisTaskChargedJetsPA::FillHistogram(const char * key, Double_t x)
1259 TH1* tmpHist = static_cast<TH1*>(fOutputList->FindObject(GetHistoName(key)));
1262 AliWarning(Form("Cannot find histogram <%s> ",key)) ;
1269 //________________________________________________________________________
1270 inline void AliAnalysisTaskChargedJetsPA::FillHistogram(const char * key, Double_t x, Double_t y)
1272 TH1* tmpHist = static_cast<TH1*>(fOutputList->FindObject(GetHistoName(key)));
1275 AliWarning(Form("Cannot find histogram <%s> ",key));
1279 if (tmpHist->IsA()->GetBaseClass("TH1"))
1280 static_cast<TH1*>(tmpHist)->Fill(x,y); // Fill x with y
1281 else if (tmpHist->IsA()->GetBaseClass("TH2"))
1282 static_cast<TH2*>(tmpHist)->Fill(x,y); // Fill x,y with 1
1285 //________________________________________________________________________
1286 inline void AliAnalysisTaskChargedJetsPA::FillHistogram(const char * key, Double_t x, Double_t y, Double_t add)
1288 TH2* tmpHist = static_cast<TH2*>(fOutputList->FindObject(GetHistoName(key)));
1291 AliWarning(Form("Cannot find histogram <%s> ",key));
1295 tmpHist->Fill(x,y,add);
1297 //________________________________________________________________________
1298 template <class T> T* AliAnalysisTaskChargedJetsPA::AddHistogram1D(const char* name, const char* title, const char* options, Int_t xBins, Double_t xMin, Double_t xMax, const char* xTitle, const char* yTitle)
1300 T* tmpHist = new T(GetHistoName(name), GetHistoName(title), xBins, xMin, xMax);
1302 tmpHist->GetXaxis()->SetTitle(xTitle);
1303 tmpHist->GetYaxis()->SetTitle(yTitle);
1304 tmpHist->SetOption(options);
1305 tmpHist->SetMarkerStyle(kFullCircle);
1308 fHistList->Add(tmpHist);
1314 //________________________________________________________________________
1315 template <class T> T* AliAnalysisTaskChargedJetsPA::AddHistogram2D(const char* name, const char* title, const char* options, Int_t xBins, Double_t xMin, Double_t xMax, Int_t yBins, Double_t yMin, Double_t yMax, const char* xTitle, const char* yTitle, const char* zTitle)
1317 T* tmpHist = new T(GetHistoName(name), GetHistoName(title), xBins, xMin, xMax, yBins, yMin, yMax);
1318 tmpHist->GetXaxis()->SetTitle(xTitle);
1319 tmpHist->GetYaxis()->SetTitle(yTitle);
1320 tmpHist->GetZaxis()->SetTitle(zTitle);
1321 tmpHist->SetOption(options);
1322 tmpHist->SetMarkerStyle(kFullCircle);
1325 fHistList->Add(tmpHist);
1331 //________________________________________________________________________
1332 void AliAnalysisTaskChargedJetsPA::Terminate(Option_t *)
1334 PostData(1, fOutputList);
1337 fOutputList = dynamic_cast<TList*> (GetOutputData(1)); // '1' refers to the output slot
1339 printf("ERROR: Output list not available\n");
1344 //________________________________________________________________________
1345 AliAnalysisTaskChargedJetsPA::~AliAnalysisTaskChargedJetsPA()
1347 // Destructor. Clean-up the output list, but not the histograms that are put inside
1348 // (the list is owner and will clean-up these histograms). Protect in PROOF case.
1349 if (fOutputList && !AliAnalysisManager::GetAnalysisManager()->IsProofMode()) {
1354 //________________________________________________________________________
1355 void AliAnalysisTaskChargedJetsPA::UserCreateOutputObjects()
1357 // called once to create user defined output objects like histograms, plots etc.
1358 // and to put it on the output list.
1359 // Note: Saving to file with e.g. OpenFile(0) is must be before creating other objects.
1361 fRandom = new TRandom3(0);
1363 fOutputList = new TList();
1364 fOutputList->SetOwner(); // otherwise it produces leaks in merging
1366 PostData(1, fOutputList);
1369 //________________________________________________________________________
1370 void AliAnalysisTaskChargedJetsPA::UserExec(Option_t *)
1373 AliInfo("UserExec() started.");
1378 AliError("??? Event pointer == 0 ???");
1383 ExecOnce(); // Get tracks, jets, background from arrays if not already given + Init Histos
1385 Calculate(InputEvent());
1387 PostData(1, fOutputList);