]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG4/JetTasks/AliAnalysisTaskJetResponse.cxx
new task for jet response
[u/mrichter/AliRoot.git] / PWG4 / JetTasks / AliAnalysisTaskJetResponse.cxx
CommitLineData
2a436fa1 1#include "TChain.h"
2#include "TTree.h"
3#include "TMath.h"
4#include "TH1F.h"
5#include "TH2F.h"
6#include "TCanvas.h"
7
8#include "AliLog.h"
9
10#include "AliAnalysisTask.h"
11#include "AliAnalysisManager.h"
12
13#include "AliVEvent.h"
14#include "AliESDEvent.h"
15#include "AliESDInputHandler.h"
16#include "AliCentrality.h"
17#include "AliAnalysisHelperJetTasks.h"
18#include "AliInputEventHandler.h"
19
20#include "AliAODEvent.h"
21#include "AliAODJet.h"
22
23#include "AliAnalysisTaskJetResponse.h"
24
25ClassImp(AliAnalysisTaskJetResponse)
26
27AliAnalysisTaskJetResponse::AliAnalysisTaskJetResponse() :
28 AliAnalysisTaskSE(),
29 fESD(0x0),
30 fAOD(0x0),
31 fOfflineTrgMask(AliVEvent::kAny),
32 fMinContribVtx(1),
33 fVtxZMin(-8.),
34 fVtxZMax(8.),
35 fEvtClassMin(0),
36 fEvtClassMax(10),
37 fCentMin(0.),
38 fCentMax(100.),
39 fJetEtaMin(-.5),
40 fJetEtaMax(.5),
41 fJetDeltaEta(.4),
42 fJetDeltaPhi(.4),
43 fkNbranches(2),
44 fkEvtClasses(10),
45 fOutputList(0x0),
46 fHistEvtSelection(0x0),
47 fHistPtLeadingJet(new TH1F*[fkNbranches]),
48 fHistEtaPhiLeadingJet(new TH2F*[fkNbranches]),
49 fHistDeltaEtaDeltaPhiLeadingJet(0x0),
50 fHistPtPtExtra(0x0),
51 fHistPtResponse(new TH2F*[fkEvtClasses]),
52 fHistPtSmearing(new TH2F*[fkEvtClasses])
53{
54 // default Constructor
55
56 fJetBranchName[0] = "";
57 fJetBranchName[1] = "";
58
59 fListJets[0] = new TList;
60 fListJets[1] = new TList;
61}
62
63AliAnalysisTaskJetResponse::AliAnalysisTaskJetResponse(const char *name) :
64 AliAnalysisTaskSE(name),
65 fESD(0x0),
66 fAOD(0x0),
67 fOfflineTrgMask(AliVEvent::kAny),
68 fMinContribVtx(1),
69 fVtxZMin(-8.),
70 fVtxZMax(8.),
71 fEvtClassMin(0),
72 fEvtClassMax(10),
73 fCentMin(0.),
74 fCentMax(100.),
75 fJetEtaMin(-.5),
76 fJetEtaMax(.5),
77 fJetDeltaEta(.4),
78 fJetDeltaPhi(.4),
79 fkNbranches(2),
80 fkEvtClasses(10),
81 fOutputList(0x0),
82 fHistEvtSelection(0x0),
83 fHistPtLeadingJet(new TH1F*[fkNbranches]),
84 fHistEtaPhiLeadingJet(new TH2F*[fkNbranches]),
85 fHistDeltaEtaDeltaPhiLeadingJet(0x0),
86 fHistPtPtExtra(0x0),
87 fHistPtResponse(new TH2F*[fkEvtClasses]),
88 fHistPtSmearing(new TH2F*[fkEvtClasses])
89{
90 // Constructor
91
92 fJetBranchName[0] = "";
93 fJetBranchName[1] = "";
94
95 fListJets[0] = new TList;
96 fListJets[1] = new TList;
97
98 DefineOutput(1, TList::Class());
99}
100
101AliAnalysisTaskJetResponse::~AliAnalysisTaskJetResponse()
102{
103 delete fListJets[0];
104 delete fListJets[1];
105}
106
107void AliAnalysisTaskJetResponse::SetBranchNames(const TString &branch1, const TString &branch2)
108{
109 fJetBranchName[0] = branch1;
110 fJetBranchName[1] = branch2;
111}
112
113void AliAnalysisTaskJetResponse::Init()
114{
115
116 // check for jet branches
117 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
118 AliError("Jet branch name not set.");
119 }
120
121}
122
123void AliAnalysisTaskJetResponse::UserCreateOutputObjects()
124{
125 // Create histograms
126 // Called once
127
128 fHistEvtSelection = new TH1F("fHistEvtSelection", "event selection", 5, -0.5, 5.5);
129 fHistEvtSelection->GetXaxis()->SetBinLabel(1,"ACCEPTED");
130 fHistEvtSelection->GetXaxis()->SetBinLabel(2,"events IN");
131 fHistEvtSelection->GetXaxis()->SetBinLabel(3,"event selection (rejected)");
132 fHistEvtSelection->GetXaxis()->SetBinLabel(4,"vertex cut (rejected)");
133 fHistEvtSelection->GetXaxis()->SetBinLabel(5,"centrality (rejected)");
134
135 for (Int_t iBranch = 0; iBranch < fkNbranches; iBranch++) {
136 fHistPtLeadingJet[iBranch] = new TH1F(Form("fHistPtLeadingJet%i", iBranch),
137 Form("p_{T} of leading jet from branch %i;p_{T} (GeV/c);counts", iBranch),
138 300, 0., 300.);
139 fHistPtLeadingJet[iBranch]->SetMarkerStyle(kFullCircle);
140
141 fHistEtaPhiLeadingJet[iBranch] = new TH2F(Form("fHistEtaPhiLeadingJet%i", iBranch),
142 Form("#eta - #phi of leading jet from branch %i;#eta;#phi", iBranch),
143 100, -2., 2., 100, 0., 2*TMath::Pi());
144
145 }
146 fHistDeltaEtaDeltaPhiLeadingJet = new TH2F("fHistDeltaEtaDeltaPhiLeadingJet",
147 "#Delta#eta - #Delta#phi of leading jet;#Delta#eta;#Delta#phi",
148 100, -4., 4., 100, -2.*TMath::Pi(), 2*TMath::Pi());
149
150 fHistPtPtExtra = new TH2F("fHistPtPtExtra", "p_{T} response;p_{T} (GeV/c);p_{T} (GeV/c)",
151 300, 0., 300., 300, 0., 300.);
152
153 for (Int_t iEvtClass =0; iEvtClass < fkEvtClasses; iEvtClass++) {
154 fHistPtResponse[iEvtClass] = new TH2F(Form("pt_response%i",iEvtClass), Form("pt_response%i;p_{T} (GeV/c);p_{T} (GeV/c)",iEvtClass),
155 300, 0., 300., 300, 0., 300.);
156 fHistPtSmearing[iEvtClass] = new TH2F(Form("pt_smearing%i",iEvtClass), Form("pt_smearing%i;p_{T} (GeV/c);p_{T} (GeV/c)",iEvtClass),
157 200, -50., 150., 300, 0., 300.);
158 }
159
160 OpenFile(1);
161 fOutputList = new TList;
162 fOutputList->Add(fHistEvtSelection);
163 for (Int_t iBranch = 0; iBranch < fkNbranches; iBranch++) {
164 fOutputList->Add(fHistPtLeadingJet[iBranch]);
165 fOutputList->Add(fHistEtaPhiLeadingJet[iBranch]);
166 }
167 fOutputList->Add(fHistDeltaEtaDeltaPhiLeadingJet);
168 fOutputList->Add(fHistPtPtExtra);
169 for (Int_t iEvtClass =0; iEvtClass < fkEvtClasses; iEvtClass++) {
170 fOutputList->Add(fHistPtResponse[iEvtClass]);
171 fOutputList->Add(fHistPtSmearing[iEvtClass]);
172 }
173}
174
175void AliAnalysisTaskJetResponse::UserExec(Option_t *)
176{
177 // load events, apply event cuts, then compare leading jets
178
179 if(!strlen(fJetBranchName[0].Data()) || !strlen(fJetBranchName[1].Data())){
180 AliError("Jet branch name not set.");
181 return;
182 }
183
184 fESD=dynamic_cast<AliESDEvent*>(InputEvent());
185 if (!fESD) {
186 AliError("ESD not available");
187 return;
188 }
189 fAOD = dynamic_cast<AliAODEvent*>(AODEvent());
190 if (!fAOD) {
191 AliError("AOD not available");
192 return;
193 }
194
195 fHistEvtSelection->Fill(1); // number of events before event selection
196
197 // physics selection
198 AliInputEventHandler* inputHandler = (AliInputEventHandler*)
199 ((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler());
200 if(!(inputHandler->IsEventSelected() & fOfflineTrgMask)){
201 Printf(" Trigger Selection: event REJECTED ... ");
202 fHistEvtSelection->Fill(2);
203 PostData(1, fOutputList);
204 return;
205 }
206
207 // vertex selection
208 AliAODVertex* primVtx = fAOD->GetPrimaryVertex();
209 Int_t nTracksPrim = primVtx->GetNContributors();
210 if ((nTracksPrim < fMinContribVtx) ||
211 (primVtx->GetZ() < fVtxZMin) ||
212 (primVtx->GetZ() > fVtxZMax) ){
213 Printf("%s:%d primary vertex z = %f: event REJECTED...",(char*)__FILE__,__LINE__,primVtx->GetZ());
214 fHistEvtSelection->Fill(3);
215 PostData(1, fOutputList);
216 return;
217 }
218
219 // event class selection (from jet helper task)
220 Int_t eventClass = AliAnalysisHelperJetTasks::EventClass();
221 Printf("Event class %d", eventClass);
222 if (eventClass < fEvtClassMin || eventClass > fEvtClassMax){
223 fHistEvtSelection->Fill(4);
224 PostData(1, fOutputList);
225 return;
226 }
227
228 // centrality selection
229 AliCentrality *cent = fESD->GetCentrality();
230 Float_t centValue = cent->GetCentralityPercentile("TRK");
231 printf("centrality: %f\n", centValue);
232 if (centValue < fCentMin || centValue > fCentMax){
233 fHistEvtSelection->Fill(5);
234 PostData(1, fOutputList);
235 return;
236 }
237
238 fHistEvtSelection->Fill(0); // accepted events
239
240
241 TClonesArray *aodJets[2];
242 aodJets[0] = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fJetBranchName[0].Data()));
243 aodJets[1] = dynamic_cast<TClonesArray*>(fAOD->FindListObject(fJetBranchName[1].Data()));
244 AliAODJet *leadingJet[2] = { 0x0, 0x0 };
245
246 for (Int_t iJetType = 0; iJetType < 2; iJetType++) {
247 fListJets[iJetType]->Clear();
248 if (!aodJets[iJetType])
249 continue;
250 for (Int_t iJet = 0; iJet < aodJets[iJetType]->GetEntriesFast(); iJet++) {
251 AliAODJet *jet = dynamic_cast<AliAODJet*>((*aodJets[iJetType])[iJet]);
252 if (jet)
253 fListJets[iJetType]->Add(jet);
254 }
255 fListJets[iJetType]->Sort();
256 leadingJet[iJetType] = (AliAODJet*) fListJets[iJetType]->First();
257
258 if (leadingJet[iJetType])
259 fHistEtaPhiLeadingJet[iJetType]->Fill(leadingJet[iJetType]->Eta(), leadingJet[iJetType]->Phi());
260 }
261
262 // check if leading jets are close in eta-phi and compare their Pt
263 if (leadingJet[0] && leadingJet[1]) {
264
265 // leading jets in "jet" acceptance
266 if(leadingJet[0]->Eta()>fJetEtaMax || leadingJet[0]->Eta()<fJetEtaMin ||
267 leadingJet[1]->Eta()>fJetEtaMax || leadingJet[1]->Eta()<fJetEtaMin){
268 Printf("Jet not in eta acceptance.");
269 }
270 else{
271 // check association of jets
272 Float_t deltaEta = leadingJet[0]->Eta() - leadingJet[1]->Eta();
273 Float_t deltaPhi = leadingJet[0]->Phi() - leadingJet[1]->Phi();
274 fHistDeltaEtaDeltaPhiLeadingJet->Fill(deltaEta, deltaPhi);
275
276 if (TMath::Abs(deltaEta) > fJetDeltaEta || (TMath::Pi() - TMath::Abs(TMath::Abs(deltaPhi) - TMath::Pi())) > fJetDeltaPhi)
277 printf("leading jets two far apart\n");
278 else {
279 fHistPtLeadingJet[0]->Fill(leadingJet[0]->Pt());
280 fHistPtLeadingJet[1]->Fill(leadingJet[1]->Pt());
281
282 fHistPtPtExtra->Fill(leadingJet[0]->Pt(), leadingJet[1]->Pt());
283
284 if (eventClass > -1 && eventClass < fkEvtClasses){
285 fHistPtResponse[eventClass]->Fill(leadingJet[1]->Pt(), leadingJet[0]->Pt());
286 fHistPtSmearing[eventClass]->Fill(leadingJet[1]->Pt()-leadingJet[0]->Pt(), leadingJet[0]->Pt());
287 }
288 }
289 }
290 }
291
292 PostData(1, fOutputList);
293}
294
295void AliAnalysisTaskJetResponse::Terminate(const Option_t *)
296{
297 // Draw result to the screen
298 // Called once at the end of the query
299
300 if (!GetOutputData(1))
301 return;
302}