]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWGJE/FlavourJetTasks/AliAnalysisTaskEmcalJetFlavourTagExample.cxx
Merge branch 'feature-movesplit'
[u/mrichter/AliRoot.git] / PWGJE / FlavourJetTasks / AliAnalysisTaskEmcalJetFlavourTagExample.cxx
CommitLineData
9382bd6e 1/**************************************************************************
2* Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
7* Permission to use, copy, modify and distribute this software and its *
8* documentation strictly for non-commercial purposes is hereby granted *
9* without fee, provided that the above copyright notice appears in all *
10* copies and that both the copyright notice and this permission notice *
11* appear in the supporting documentation. The authors make no claims *
12* about the suitability of this software for any purpose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15
16/*
17* This sample task demostrates the basics of tagging a jet. The PID response
18* is retrived for both the TPC. A Hadronic tag is implemented for
19* clusters matched to tracks in a jet with a E/P < 0.2
20*
21* Author: Andrew Castro (UTK) and Joel Mazer (UTK)
22*/
23
24#include "AliAnalysisTaskEmcalJetFlavourTagExample.h"
25
26// general ROOT includes
27#include <TCanvas.h>
28#include <TChain.h>
29#include <TClonesArray.h>
30#include <TH1F.h>
31#include <TH2F.h>
32#include <TH3F.h>
33#include <THnSparse.h>
34#include <TList.h>
35#include <TLorentzVector.h>
36#include <TParameter.h>
37#include <TParticle.h>
38#include <TTree.h>
39#include <TVector3.h>
40#include <TObjArray.h>
41
42// AliROOT includes
43#include "AliAODEvent.h"
44#include "AliESDEvent.h"
45#include "AliAnalysisManager.h"
46#include "AliAnalysisTask.h"
47#include "AliCentrality.h"
48#include "AliEmcalJet.h"
49#include "AliAODJet.h"
50#include "AliVCluster.h"
51#include "AliVTrack.h"
52#include <AliVEvent.h>
53#include <AliVParticle.h>
54#include "AliRhoParameter.h"
55#include "AliLog.h"
56#include "AliJetContainer.h"
57#include "AliParticleContainer.h"
58#include "AliClusterContainer.h"
59#include "AliEmcalParticle.h"
60#include "AliESDCaloCluster.h"
61#include <AliESDtrackCuts.h>
62#include "AliPID.h"
63
64// event handler (and pico's) includes
65#include <AliInputEventHandler.h>
66#include <AliVEventHandler.h>
67#include "AliESDInputHandler.h"
68#include "AliPicoTrack.h"
69#include "AliEventPoolManager.h"
70#include "AliAODTrack.h"
71#include "AliESDtrack.h"
72
73// PID includes
74#include "AliPIDResponse.h"
75#include "AliTPCPIDResponse.h"
76#include "AliESDpid.h"
77
78// magnetic field includes
79#include "TGeoGlobalMagField.h"
80#include "AliMagF.h"
81
a9951dde 82using std::cout;
83using std::endl;
84
9382bd6e 85ClassImp(AliAnalysisTaskEmcalJetFlavourTagExample)
86
87//________________________________________________________________________
88AliAnalysisTaskEmcalJetFlavourTagExample::AliAnalysisTaskEmcalJetFlavourTagExample() :
89 AliAnalysisTaskEmcalJet("heavyF",kFALSE),
90 event(0),
91 fCuts(0),
92 fPhimin(-10), fPhimax(10),
93 fEtamin(-0.9), fEtamax(0.9),
94 fAreacut(0.0),
95 fJetHIpt(50.0),
96 fTrackPtCut(2.0),
97 fTrackEta(0.9),
98 fesdTrackCuts(0),
99 fPIDResponse(0x0), fTPCResponse(),
100 fJetsCont(0), fTracksCont(0), fCaloClustersCont(0), fTracksJetCont(0), fCaloClustersJetCont(0),
101 fESD(0), fAOD(0),
102 fHistJetPhi(0),
103 fHistCorJetPt(0), fHistJetPt(0),
104 fHistHighJetPt(0),
105 fHistnSigElecPt(0),
106 fHistdEdXvsPt(0),
107 fHistnJetTrackvnJetClusters(0)
108{
109 // Default constructor.
110
111
112 SetMakeGeneralHistograms(kTRUE);
113
114}
115
116//________________________________________________________________________
117AliAnalysisTaskEmcalJetFlavourTagExample::AliAnalysisTaskEmcalJetFlavourTagExample(const char *name) :
118 AliAnalysisTaskEmcalJet(name,kTRUE),
119 event(0),
120 fCuts(0),
121 fPhimin(-10), fPhimax(10),
122 fEtamin(-0.9), fEtamax(0.9),
123 fAreacut(0.0),
124 fJetHIpt(50.0),
125 fTrackPtCut(2.0),
126 fTrackEta(0.9),
127 fesdTrackCuts(0),
128 fPIDResponse(0x0), fTPCResponse(),
129 fJetsCont(0), fTracksCont(0), fCaloClustersCont(0), fTracksJetCont(0), fCaloClustersJetCont(0),
130 fESD(0), fAOD(0),
131 fHistJetPhi(0),
132 fHistCorJetPt(0), fHistJetPt(0),
133 fHistHighJetPt(0),
134 fHistnSigElecPt(0),
135 fHistdEdXvsPt(0),
136 fHistnJetTrackvnJetClusters(0)
137{
138
139 SetMakeGeneralHistograms(kTRUE);
140
141 DefineInput(0,TChain::Class());
142 DefineOutput(1, TList::Class());
143}
144
145//_______________________________________________________________________
146AliAnalysisTaskEmcalJetFlavourTagExample::~AliAnalysisTaskEmcalJetFlavourTagExample()
147{
148 // destructor
149 //
150 if (fOutput) {
151 delete fOutput;
152 fOutput = 0;
153 }
154}
155
156//________________________________________________________________________
157void AliAnalysisTaskEmcalJetFlavourTagExample::UserCreateOutputObjects()
158{
159 if (! fCreateHisto)
160 return;
161 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
162
163 //fJetsCont = GetJetContainer(0);
164 if(fJetsCont) { //get particles and clusters connected to jets
165 fTracksJetCont = fJetsCont->GetParticleContainer();
166 fCaloClustersJetCont = fJetsCont->GetClusterContainer();
167 }
168 else { //no jets, just analysis tracks and clusters
169 fTracksCont = GetParticleContainer(0);
170 fCaloClustersCont = GetClusterContainer(0);
171}
172fTracksCont->SetClassName("AliVTrack");
173fCaloClustersCont->SetClassName("AliVCluster");
174
175 fHistJetPhi = new TH1F("NjetvsPhi", "NjetvsPhi", 288,-2*TMath::Pi(),2*TMath::Pi());
176 fHistJetPt = new TH1F("NjetvsJetPt", "NjetvsJetPt", 300, 0, 300);
177 fOutput->Add(fHistJetPhi);
178 fOutput->Add(fHistJetPt);
179
180
181 TString histname;
182
183 fHistCorJetPt = new TH1F("CorrJetPt", "CorrJetPt", 300, -100, 200);
184 fHistnSigElecPt = new TH2F("nsigvsPt(TPC)","nSigmaElectronTPC_v_Pt",60,0,60,40,-10,10);
185 fHistdEdXvsPt = new TH2F("dEdXvsTrackPt","dEdXvsTrackPt",60,0,60,80,0,80);
186 fHistnJetTrackvnJetClusters = new TH2F("NumbJetTracksvJetClusters","NumbJetTracksvJetClusters",21,0,20,21,0,20);
187 fHistHighJetPt = new TH1F("HighestPtJetPerEvent","HighJetPt",80,0,80);
188
189 TString name;
190 TString title;
191
192 fOutput->Add(fHistCorJetPt);
193 fOutput->Add(fHistnSigElecPt);
194 fOutput->Add(fHistdEdXvsPt);
195 fOutput->Add(fHistnJetTrackvnJetClusters);
196 fOutput->Add(fHistHighJetPt);
197
198
199 // ****************************** PID *****************************************************
200 // set up PID handler
201 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
202 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
203 if(!inputHandler) {
204 AliFatal("Input handler needed");
205 }
206
207 // PID response object
208 //fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
209 // inputHandler->CreatePIDResponse(fIsMC); // needed to create object, why though?
210 fPIDResponse = inputHandler->GetPIDResponse();
211 if (!fPIDResponse) {
212 AliError("PIDResponse object was not created");
213 }
214 // ***************************************************************************************
215
216 PostData(1, fOutput);
217
218}
219
220//________________________________________________________
221void AliAnalysisTaskEmcalJetFlavourTagExample::ExecOnce()
222{
223 // Initialize the analysis
224 AliAnalysisTaskEmcalJet::ExecOnce();
225
226 if (fJetsCont && fJetsCont->GetArray() == 0) fJetsCont = 0;
227 if (fTracksCont && fTracksCont->GetArray() == 0) fTracksCont = 0;
228 if (fCaloClustersCont && fCaloClustersCont->GetArray() == 0) fCaloClustersCont = 0;
229
230
231} // end of ExecOnce
232
233//________________________________________________________________________
234Bool_t AliAnalysisTaskEmcalJetFlavourTagExample::Run()
235{
236 // check to see if we have any tracks
237 if (!fTracks) return kTRUE;
238 if (!fJets) return kTRUE;
239
240 // what kind of event do we have: AOD or ESD?
241 Bool_t useAOD;
242 if (dynamic_cast<AliAODEvent*>(InputEvent())) useAOD = kTRUE;
243 else useAOD = kFALSE;
244
245 // if we have ESD event, set up ESD object
246 if(!useAOD){
247 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
248 if (!fESD) {
249 AliError(Form("ERROR: fESD not available\n"));
250 return kTRUE;
251 }
252 }
253
254 // if we have AOD event, set up AOD object
255 if(useAOD){
256 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
257 if(!fAOD) {
258 AliError(Form("ERROR: fAOD not available\n"));
259 return kTRUE;
260 }
261 }
262
263 // get magnetic field info for DCA
264 Double_t MagF = fESD->GetMagneticField();
265 Double_t MagSign = 1.0;
266 if(MagF<0)MagSign = -1.0;
267 // set magnetic field
268 if (!TGeoGlobalMagField::Instance()->GetField()) {
269 AliMagF* field = new AliMagF("Maps","Maps", MagSign, MagSign, AliMagF::k5kG);
270 TGeoGlobalMagField::Instance()->SetField(field);
271 }
272
273 // get vertex information
274 Double_t fvertex[3]={0,0,0};
275 InputEvent()->GetPrimaryVertex()->GetXYZ(fvertex);
276 //Double_t zVtx=fvertex[2];
277
278 // create pointer to list of input event
279 TList *list = InputEvent()->GetList();
280 if(!list) {
281 AliError(Form("ERROR: list not attached\n"));
282 return kTRUE;
283 }
284
285 // background density
286 fRhoVal = fRho->GetVal();
287
288 // initialize TClonesArray pointers to jets and tracks
289 TClonesArray *jets = 0;
290 //TClonesArray *tracks = 0;
291 //TClonesArray *clusters = 0;
292
293 // get Jets object
294 jets = dynamic_cast<TClonesArray*>(list->FindObject(fJets));
295 if(!jets){
296 AliError(Form("Pointer to jets %s == 0", fJets->GetName()));
297 return kTRUE;
298 } // verify existence of jets
299
300 // get number of jets and tracks
301 const Int_t Njets = jets->GetEntries();
302 if(Njets<1) return kTRUE;
303
304 if (fTracksCont) {
305 AliVTrack *track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle(0));
306 while(track) {
307 track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle());
308 }
309 }
310 if (fCaloClustersCont) {
311 AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0);
312 while(cluster) {
313 TLorentzVector nPart;
314 cluster->GetMomentum(nPart, fVertex);
315 cluster = fCaloClustersCont->GetNextAcceptCluster();
316 }
317 }
318
319 // Start Jet Analysis
320 // initialize jet parameters
321 Int_t ijethi=-1;
322 Double_t highestjetpt=0.0;
323
324 // loop over jets in an event - to find highest jet pT and apply some cuts && JetQA Sparse
325 for (Int_t ijet = 0; ijet < Njets; ijet++){
326 // get our jets
327 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
328 if (!jet) continue;
329
330 // apply jet cuts
331 if(!AcceptMyJet(jet)) continue;
332
333 if(highestjetpt<jet->Pt()){
334 ijethi=ijet;
335 highestjetpt=jet->Pt();
336 }
337 } // end of looping over jets
338
339 fHistHighJetPt->Fill(ijethi);
340
341 // **********************************************************************
342 // JET LOOP
343 // **********************************************************************
344
345 // loop over jets in the event and make appropriate cuts
346 for (Int_t iJets = 0; iJets < Njets; ++iJets) {
347 AliEmcalJet *jet = static_cast<AliEmcalJet*>(fJets->At(iJets));
348 if (!jet) // see if we have a jet
349 continue;
350
351 // apply jet cuts
352 if(!AcceptMyJet(jet)) continue;
353
354 //AliEmcalJet::EFlavourTag tag=AliEmcalJet::kDStar;
355 //jet->AddFlavourTag(tag);
356
357
358 Int_t JetClusters = jet->GetNumberOfClusters();
359 Int_t JetTracks = jet -> GetNumberOfTracks();
360 fHistnJetTrackvnJetClusters->Fill(JetClusters,JetTracks);
361 // Initializations and Calculations
362 Double_t jetPt = -500; // initialize corr jet pt LOCAL
363 Double_t jetarea = -500; // initialize jet area
364 jetPt = jet->Pt() - jetarea*fRhoVal; // semi-corrected pT of jet from GLOBAL rho value
365 fHistCorJetPt->Fill(jetPt);
366
367 Bool_t bkgrnd1 = kFALSE;
368
369 if(jet->Pt() > fJetHIpt) {
370 if(!fTracksCont || !fCaloClustersCont) continue;
371
372 //******************************Cluster Matched To Closest Track
373 //**************************************************************
374 Int_t NumbTrackContainer = -999;
375 NumbTrackContainer = fTracksCont->GetNParticles();
376 for(int iTracks = 0; iTracks <= NumbTrackContainer; iTracks++){
377 AliVTrack *AcceptedTrack =static_cast<AliVTrack*>(fTracksCont->GetParticle(iTracks));
378 if(!AcceptedTrack){
379 AliError(Form("Couldn't get AliVTrack Container %d\n", iTracks));
380 continue;
381 }
382 if(!IsJetTrack(jet,iTracks,kFALSE))continue;
383 //Get matched cluster
384 Int_t emc1 = AcceptedTrack->GetEMCALcluster();
385
386 Double_t acceptTrackP = AcceptedTrack->P();
387 Double_t acceptTrackPt = AcceptedTrack->Pt();
388 Double_t nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(AcceptedTrack,AliPID::kElectron);
389 fHistnSigElecPt->Fill(acceptTrackPt,nSigmaElectron_TPC);
390
391 AliESDtrack *ESDacceptedTrack = static_cast<AliESDtrack*>(AcceptedTrack);
392 if(!ESDacceptedTrack){
393 AliError(Form("Couldn't get AliESDTrack %d\n", iTracks));
394 continue;
395 }
396 Double_t dEdx = AcceptedTrack->GetTPCsignal();
397 fHistdEdXvsPt->Fill(acceptTrackPt,dEdx);
398 if(fCaloClustersCont && emc1>=0) {
399 AliVCluster *clusMatch = fCaloClustersCont->GetCluster(emc1);
400 if(!clusMatch){
401 AliError(Form("Couldn't get matched AliVCluster %d\n", emc1));
402 continue;
403 }
404
405 Double_t mClusterE = clusMatch->E();
406 Double_t EovP_mc = -999;
407 EovP_mc = mClusterE/acceptTrackP;
408
409 if(EovP_mc < 0.2) bkgrnd1 = kTRUE;
410 }
411
412 } //loop over tracks for matching to closest cluster
413
414
415
416
417 } // highest pt jet cut
418
419
420 if(bkgrnd1 == kTRUE) {
421 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kBckgrd1;
422 jet->AddFlavourTag(tag);
423 }
424
425 } // LOOP over JETS in event
426
427
428 return kTRUE;
429
430}
431//________________________________________________________________________
432void AliAnalysisTaskEmcalJetFlavourTagExample::Terminate(Option_t *)
433{
434 cout<<"###########################"<<endl;
435 cout<<"#### Task Finished ####"<<endl;
436 cout<<"###########################"<<endl;
437 cout<<"###########################"<<endl;
438} // end of terminate
439
440//________________________________________________________________________
441Int_t AliAnalysisTaskEmcalJetFlavourTagExample::AcceptMyJet(AliEmcalJet *jet) {
442 //applies all jet cuts except pt
443 if ((jet->Phi()<fPhimin)||(jet->Phi()>fPhimax)) return 0;
444 if ((jet->Eta()<fEtamin)||(jet->Eta()>fEtamax)) return 0;
445 if (jet->Area()<fAreacut) return 0;
446 // prevents 0 area jets from sneaking by when area cut == 0
447 if (jet->Area()==0) return 0;
448 //exclude jets with extremely high pt tracks which are likely misreconstructed
449 if(jet->MaxTrackPt()>100) return 0;
450
451 //passed all above cuts
452 return 1;
453}
454
455
456
457
458