4 #include "AliAnalysisTaskEmcalJetHF.h"
6 // general ROOT includes
9 #include <TClonesArray.h>
13 #include <THnSparse.h>
15 #include <TLorentzVector.h>
16 #include <TParameter.h>
17 #include <TParticle.h>
20 #include <TObjArray.h>
23 #include "AliAODEvent.h"
24 #include "AliESDEvent.h"
25 #include "AliAnalysisManager.h"
26 #include "AliAnalysisTask.h"
27 #include "AliCentrality.h"
28 #include "AliEmcalJet.h"
29 #include "AliAODJet.h"
30 #include "AliVCluster.h"
31 #include "AliVTrack.h"
32 #include <AliVEvent.h>
33 #include <AliVParticle.h>
34 #include "AliRhoParameter.h"
35 #include "AliEmcalParticle.h"
37 // event handler (and pico's) includes
38 #include <AliInputEventHandler.h>
39 #include <AliVEventHandler.h>
40 #include "AliESDInputHandler.h"
41 #include "AliPicoTrack.h"
42 #include "AliEventPoolManager.h"
45 #include "AliPIDResponse.h"
46 #include "AliTPCPIDResponse.h"
47 #include "AliESDpid.h"
49 #include <AliInputEventHandler.h>
50 #include <AliVEventHandler.h>
52 // magnetic field includes
53 #include "TGeoGlobalMagField.h"
59 ClassImp(AliAnalysisTaskEmcalJetHF)
61 //________________________________________________________________________
62 AliAnalysisTaskEmcalJetHF::AliAnalysisTaskEmcalJetHF() :
63 AliAnalysisTaskEmcalJet("heavyF",kFALSE),
69 fPhimin(-10), fPhimax(10),
70 fEtamin(-0.9), fEtamax(0.9),
76 fPIDResponse(0x0), fTPCResponse(),
77 fEsdtrackCutsITSTPC(),
83 fHistCorJetPt(0), fHistJetPt(0),
88 fHistEovPvsPtTracks(0),
89 fHistPID(0), fHistPIDtpc(0), fHistPIDits(0), fHistPIDtof(0),
93 fHistClusterPhivEta(0),
94 fHistnJetTrackvnJetClusters(0),
95 fhnPIDHF(0x0), fhnQA(0x0), fhnJetQA(0x0), fhnClusQA(0x0), fhnTrackQA(0x0), fhnGlobalPID(0x0)
97 // Default constructor.
98 for (Int_t i = 0;i<6;++i){
99 fHistJetPtvsTrackPt[i] = 0;
107 SetMakeGeneralHistograms(kTRUE);
111 //________________________________________________________________________
112 AliAnalysisTaskEmcalJetHF::AliAnalysisTaskEmcalJetHF(const char *name) :
113 AliAnalysisTaskEmcalJet(name,kTRUE),
119 fPhimin(-10), fPhimax(10),
120 fEtamin(-0.9), fEtamax(0.9),
126 fPIDResponse(0x0), fTPCResponse(),
127 fEsdtrackCutsITSTPC(),
133 fHistCorJetPt(0), fHistJetPt(0),
138 fHistEovPvsPtTracks(0),
139 fHistPID(0), fHistPIDtpc(0), fHistPIDits(0), fHistPIDtof(0),
140 fHistnsigelectron(0),
142 fHistTrackPhivEta(0),
143 fHistClusterPhivEta(0),
144 fHistnJetTrackvnJetClusters(0),
145 fhnPIDHF(0x0), fhnQA(0x0), fhnJetQA(0x0), fhnClusQA(0x0), fhnTrackQA(0x0), fhnGlobalPID(0x0)
147 for (Int_t i = 0;i<6;++i){
148 fHistJetPtvsTrackPt[i] = 0;
155 SetMakeGeneralHistograms(kTRUE);
157 DefineInput(0,TChain::Class());
158 DefineOutput(1, TList::Class());
161 //_______________________________________________________________________
162 AliAnalysisTaskEmcalJetHF::~AliAnalysisTaskEmcalJetHF()
172 //________________________________________________________________________
173 void AliAnalysisTaskEmcalJetHF::UserCreateOutputObjects()
177 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
179 fOutput = new TList();
180 fOutput->SetOwner(kTRUE);
182 fHistJetPhi = new TH1F("NjetvsPhi", "NjetvsPhi", 288,-2*TMath::Pi(),2*TMath::Pi());
183 fHistJetPt = new TH1F("NjetvsJetPt", "NjetvsJetPt", 300, 0, 300);
184 fOutput->Add(fHistJetPhi);
185 fOutput->Add(fHistJetPt);
189 fHistClusE = new TH1F("NumberClustersvsEnergy","NumberClustersvsEnergy", 500, 0, 10);
193 fHistRhovsCent = new TH2F("RhovsCent", "RhovsCent", 100, 0.0, 100.0, 400, 0, 400);
194 fHistCorJetPt = new TH1F("NjetvsCorrJetPt", "NjetvsCorrJetPt", 300, -100, 200);
195 fHistdEdx = new TH1F("dEdxSignal", "dEdxSignal", 500, 0, 500);
196 fHistdEdxvPt = new TH2F("dEdxvPt", "dEdxvPt", 200, 0, 100,500, 0 ,500);
197 fHistEovPTracks = new TH1F("EovPTracks","EovPTracks",200,0.0,2.0);
198 fHistEovPvsPtTracks = new TH2F("E/p_vs_Pt","E/p_vs_Pt",200, 0 ,100 ,50, 0, 2);
199 fHistPID = new TH1F("fHistPID", "Detector PID", 8, 0, 8);
200 fHistPIDtpc = new TH1F("fHistPIDtpc", "TPC pid", 4, 0, 4);
201 fHistPIDits = new TH1F("fHistPIDits", "ITS pid", 4, 0, 4);
202 fHistPIDtof = new TH1F("fHistPIDtof", "TOF pid", 4, 0, 4);
203 fHistnsigelectron = new TH1F("nsig_elec_TPC","nsig_elec_TPC",500,-10,10);
204 fHistnSigElecPt = new TH2F("nsig_v_pt(TPC)","nsig_v_pt(TPC)",200,0,100,100,-10,10);
205 fHistTrackPhivEta = new TH2F("TrackPhi_v_Eta","TrackPhiEta",64,-1.6,1.6,72,1,2*TMath::Pi());
206 fHistClusterPhivEta = new TH2F("ClusterPhi_v_Eta","ClusterPhiEta",64,-1.6,1.6,72,1,2*TMath::Pi());
207 fHistnJetTrackvnJetClusters = new TH2F("NumbJetTracksvJetClusters","NumbJetTracksvJetClusters",21,0,20,21,0,20);
209 // PT bins used to be (2000, -100, 300)
213 // creating centrality dependent histos that don't involve Global Rho
214 for (Int_t i = 0;i<6;++i){
215 name = TString(Form("JetPtvsTrackPt_%i",i));
216 title = TString(Form("Jet pT vs Leading Track pT cent bin %i",i));
217 fHistJetPtvsTrackPt[i] = new TH2F(name,title, 500, -100, 400, 100,0,100);
218 fOutput->Add(fHistJetPtvsTrackPt[i]);
220 name = TString(Form("TrackPt_%i",i));
221 title = TString(Form("Track pT cent bin %i",i));
222 fHistTrackPt[i] = new TH1F(name,title,400,0,200);
223 fOutput->Add(fHistTrackPt[i]);
225 name = TString(Form("EP0_%i",i));
226 title = TString(Form("EP VZero cent bin %i",i));
227 fHistEP0[i] = new TH1F(name,title,144,-TMath::Pi(),TMath::Pi());
228 fOutput->Add(fHistEP0[i]);
230 name = TString(Form("EP0A_%i",i));
231 title = TString(Form("EP VZero cent bin %i",i));
232 fHistEP0A[i] = new TH1F(name,title,144,-TMath::Pi(),TMath::Pi());
233 fOutput->Add(fHistEP0A[i]);
235 name = TString(Form("EP0C_%i",i));
236 title = TString(Form("EP VZero cent bin %i",i));
237 fHistEP0C[i] = new TH1F(name,title,144,-TMath::Pi(),TMath::Pi());
238 fOutput->Add(fHistEP0C[i]);
240 name = TString(Form("EPAvsC_%i",i));
241 title = TString(Form("EP VZero cent bin %i",i));
242 fHistEPAvsC[i] = new TH2F(name,title,144,-TMath::Pi(),TMath::Pi(),100,-TMath::Pi(),TMath::Pi());
243 fOutput->Add(fHistEPAvsC[i]);
247 fOutput->Add(fHistRhovsCent);
248 fOutput->Add(fHistCorJetPt);
249 fOutput->Add(fHistdEdx);
250 fOutput->Add(fHistdEdxvPt);
251 fOutput->Add(fHistEovPTracks);
252 fOutput->Add(fHistEovPvsPtTracks);
253 fOutput->Add(fHistPID);
254 fOutput->Add(fHistPIDtpc);
255 fOutput->Add(fHistPIDits);
256 fOutput->Add(fHistPIDtof);
257 fOutput->Add(fHistnsigelectron);
258 fOutput->Add(fHistnSigElecPt);
259 fOutput->Add(fHistTrackPhivEta);
260 fOutput->Add(fHistClusterPhivEta);
261 fOutput->Add(fHistnJetTrackvnJetClusters);
265 fOutput->Add(fHistClusE);
268 // ****************************** PID *****************************************************
269 // set up PID handler
270 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
271 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
273 AliFatal("Input handler needed");
276 // PID response object
277 //fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
278 // inputHandler->CreatePIDResponse(fIsMC); // needed to create object, why though?
279 fPIDResponse = inputHandler->GetPIDResponse();
281 AliError("PIDResponse object was not created");
283 // ****************************************************************************************
284 UInt_t bitcoded = 0; // bit coded, see GetDimParamsPID() below
285 bitcoded = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8 | 1<<9 | 1<<10 | 1<<11;
286 fhnPIDHF = NewTHnSparseDHF("fhnPIDHF", bitcoded);
288 UInt_t bitcoded1 = 0; // bit coded, see GetDimParamsPID() below
289 bitcoded1 = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4;
290 fhnJetQA = NewTHnSparseDJetQA("fhnJetQA", bitcoded1);
292 UInt_t bitcoded2 = 0; // bit coded, see GetDimParamsPID() below
293 bitcoded2 = 1<<5 | 1<<6 | 1<<7 | 1<<8 | 1<<9 | 1<<15;
294 fhnClusQA = NewTHnSparseDJetQA("fhnClusQA", bitcoded2);
296 UInt_t bitcoded3 = 0; // bit coded, see GetDimParamsPID() below
297 bitcoded3 = 1<<10 | 1<<11 | 1<<12 | 1<<13 | 1<<14;
298 fhnTrackQA = NewTHnSparseDJetQA("fhnTrackQA", bitcoded3);
300 cout << "_______________Created Sparse__________________" << endl;
302 fOutput->Add(fhnPIDHF);
303 fOutput->Add(fhnJetQA);
304 fOutput->Add(fhnClusQA);
305 fOutput->Add(fhnTrackQA);
306 fOutput->Add(fhnGlobalPID);
309 PostData(1, fOutput);
312 //________________________________________________________
313 void AliAnalysisTaskEmcalJetHF::ExecOnce()
315 // Initialize the analysis
316 AliAnalysisTaskEmcalJet::ExecOnce();
320 //________________________________________________________________________
321 Bool_t AliAnalysisTaskEmcalJetHF::Run()
323 // check to see if we have any tracks
324 if (!fTracks) return kTRUE;
325 if (!fJets) return kTRUE;
327 // what kind of event do we have: AOD or ESD?
329 if (dynamic_cast<AliAODEvent*>(InputEvent())) useAOD = kTRUE;
330 else useAOD = kFALSE;
332 // if we have ESD event, set up ESD object
334 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
336 AliError(Form("ERROR: fESD not available\n"));
341 // if we have AOD event, set up AOD object
343 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
345 AliError(Form("ERROR: fAOD not available\n"));
350 // get magnetic field info for DCA
351 Double_t MagF = fESD->GetMagneticField();
352 Double_t MagSign = 1.0;
353 if(MagF<0)MagSign = -1.0;
354 // set magnetic field
355 if (!TGeoGlobalMagField::Instance()->GetField()) {
356 AliMagF* field = new AliMagF("Maps","Maps", MagSign, MagSign, AliMagF::k5kG);
357 TGeoGlobalMagField::Instance()->SetField(field);
360 // get centrality bin
361 Int_t centbin = GetCentBin(fCent);
362 //for pp analyses we will just use the first centrality bin
363 if (centbin == -1) centbin = 0;
365 // get vertex information
366 Double_t fvertex[3]={0,0,0};
367 InputEvent()->GetPrimaryVertex()->GetXYZ(fvertex);
368 //Double_t zVtx=fvertex[2];
370 // create pointer to list of input event
371 TList *list = InputEvent()->GetList();
373 AliError(Form("ERROR: list not attached\n"));
377 // background density
378 fRhoVal = fRho->GetVal();
380 // initialize TClonesArray pointers to jets and tracks
381 TClonesArray *jets = 0;
382 TClonesArray *tracks = 0;
383 TClonesArray *clusters = 0;
386 jets = dynamic_cast<TClonesArray*>(list->FindObject(fJets));
388 AliError(Form("Pointer to jets %s == 0", fJets->GetName()));
390 } // verify existence of jets
393 tracks = dynamic_cast<TClonesArray*>(list->FindObject(fTracks));
395 AliError(Form("Pointer to tracks %s == 0", fTracks->GetName()));
397 } // verify existence of tracks (fTracksName.Data())
399 //get Clusters object
400 clusters = dynamic_cast<TClonesArray*>(list->FindObject(fCaloClusters));
402 AliError(Form("Pointer to tracks %s == 0",fCaloClusters->GetName()));
404 } //verify cluster existence
407 //const Int_t nclus = clusters->GetEntries();
409 for(int icluster = 0; icluster < nclus; icluster++) {
410 AliVCluster* andyCluster = static_cast<AliVCluster*>(fCaloClusters->At(icluster));
411 if (!icluster) continue;
414 // get all emcal clusters
415 TRefArray* caloClusters = new TRefArray();
416 fESD->GetEMCALClusters( caloClusters );
418 //TObjArray* listcuts = fEsdtrackCutsTPC->GetAcceptedTracks(fESD);
419 //Int_t nGoodTracks = list->GetEntries();
420 Int_t nCluster = caloClusters->GetEntries();
422 // event plane histograms filled
423 if(fillHist>0) fHistEP0[centbin]->Fill(fEPV0);
424 if(fillHist>0) fHistEP0A[centbin]->Fill(fEPV0A);
425 if(fillHist>0) fHistEP0C[centbin]->Fill(fEPV0C);
426 if(fillHist>0) fHistEPAvsC[centbin]->Fill(fEPV0A,fEPV0C);
429 cout<<"Event #: "<<event<<endl;
431 // get number of jets and tracks
432 const Int_t Njets = jets->GetEntries();
433 const Int_t Ntracks = tracks->GetEntries();
434 //const Int_t Nclusters = clusters->GetEntries();
435 if(Ntracks<1) return kTRUE;
436 if(Njets<1) return kTRUE;
437 //if(Nclusters<1) return kTRUE;
440 // loop over Globap tracks in the event for PID: Runs ON ESD's
441 for (int i = 0;i<Ntracks;i++){
442 //AliVParticle *track = static_cast<AliVParticle*>(fTracks->At(i));
443 AliVTrack *trackGlobal = static_cast<AliVTrack*>(fTracks->At(i));
444 //AliESDtrack* track = fESD->GetTrack(i);
446 AliError(Form("Couldn't get ESD track %d\n", i));
452 if(TMath::Abs(trackGlobal->Eta())>fTrackEta) continue;
453 if (trackGlobal->Pt()<0.15) continue;
455 // initialize track info
456 Double_t dEdxGlobal = -99;
457 Double_t trackphiGlobal = -99;
458 Double_t trackptGlobal = 0;
459 Double_t p = trackGlobal->P();
460 Double_t fClsEGlobal = -99;
461 Double_t EovPGlobal = -99;
463 // distance of closest approach
464 Float_t DCAxyGlobal = -999;
465 Float_t DCAzGlobal = -999;
466 //Double_t DCAXYGlobal = -999;
467 //Double_t DCAZGlobal = -999;
470 trackGlobal->GetTPCsignal();
471 //trackGlobal->GetImpactParameters(DCAxyGlobal, DCAzGlobal);
472 dEdxGlobal = trackGlobal->GetTPCsignal();
473 trackptGlobal = trackGlobal->Pt();
474 trackphiGlobal = trackGlobal->Phi();
476 // fill track histo's
477 //if(fillHist>0) fHistdEdx->Fill(dEdx);
478 //if(fillHist>0) fHistdEdxvPt->Fill(trackpt,dEdx);
479 //if(fillHist>0) fHistTrackPt[centbin]->Fill(track->Pt());
482 Int_t nMatchClusGlobal = -1;
483 AliESDCaloCluster *matchedClusGlobal = NULL;
485 //////////////////////////////////////////////////////////////////////////
487 // cut on 1.5 GeV for EMCal Cluster //if(track->GetEMCALcluster()<0 || pt<1.5) continue;
488 //////////////////////////////////////////////////////////////////////////
490 //Double_t nSigmaPion_TOFGlobal, nSigmaProton_TOFGlobal, nSigmaKaon_TOFGlobal = -1.;
493 //Double_t TOFsigGlobal = -1.;
494 //Double_t nClustersTPCGlobal = -1;
495 //Int_t chargeGlobal = 0;
496 //Int_t trackCutsGlobal = 0; // set to 0 to get to run
497 //Int_t myPIDGlboal = 0; // set to 0 because myPID is to compare with MC unless I hard code in cuts
498 Double_t nSigmaElectron_TPCGlobal = -999;
499 Double_t nSigmaElectron_TOFGlobal = -999;
500 //Double_t nSigmaElectron_EMCALGlobal = -999;
503 //Int_t clusiGlobal = trackGlobal->GetEMCALcluster();
504 //nClustersTPCGlobal = trackGlobal->GetTPCclusters(0);
506 AliESDtrack *trackESD = fESD->GetTrack(Ntracks);
508 nSigmaElectron_TPCGlobal = fPIDResponse->NumberOfSigmasTPC(trackESD,AliPID::kElectron);
509 nSigmaElectron_TOFGlobal = fPIDResponse->NumberOfSigmasTOF(trackESD,AliPID::kElectron);
512 nMatchClusGlobal = trackGlobal->GetEMCALcluster();
513 if(nMatchClusGlobal > 0){
514 matchedClusGlobal = (AliESDCaloCluster*)fESD->GetCaloCluster(nMatchClusGlobal);
515 //AliESDCaloCluster* matchedClus = fESD->GetCaloCluster(clusi);
516 //double eop2Global = -1;
517 //double ssGl[4]={0.,0.,0.,0.};
518 //Double_t nSigmaEop = fPID->GetPIDResponse()-m >NumberOfSigmasEMCAL(track,AliPID::kElectron,eop2,ss);
520 fClsEGlobal = matchedClusGlobal->E();
521 EovPGlobal = fClsEGlobal/p;
522 //nSigmaElectron_EMCALGlobal = fPIDResponse->NumberOfSigmasEMCAL(trackESD,AliPID::kElectron,eop2,ss);
523 //if(fillHist>0) fHistEovPTracks->Fill(EovP);
524 //if(fillHist>0) fHistEovPvsPtTracks->Fill(trackpt,EovP);
527 //if(fillHist>0) fHistnsigelectron->Fill(nSigmaElectron_TPC);
528 //if(fillHist>0) fHistnSigElecPt->Fill(trackpt,nSigmaElectron_TPC);
531 AliVEvent *eventQA=InputEvent();
532 if (!eventQA||!fPIDResponse) return kTRUE; // just return, maybe put at beginning
533 //////////////////////////////////////////////////////////////////////////
534 // cut on 1.5 GeV for EMCal Cluster
535 if(trackGlobal->Pt() < fTrackPtCut) continue;
537 Double_t HF_tracks[12] = {fCent, trackGlobal->Pt(), trackGlobal->P() ,trackGlobal->Eta(), trackGlobal->Phi(), EovPGlobal, DCAxyGlobal, DCAzGlobal, dEdxGlobal, nSigmaElectron_TPCGlobal, nSigmaElectron_TOFGlobal, 0};//nSigmaElectron_EMCAL};
538 fhnGlobalPID->Fill(HF_tracks); // fill Sparse Histo with trigger entries
540 } // Loop over tracks
543 // Start Jet Analysis
544 // initialize jet parameters
546 Double_t highestjetpt=0.0;
548 // loop over jets in an event - to find highest jet pT and apply some cuts && JetQA Sparse
549 for (Int_t ijet = 0; ijet < Njets; ijet++){
551 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
555 if(!AcceptMyJet(jet)) continue;
557 Double_t JetQA[5] = {0, static_cast<Double_t>(jet->GetNumberOfTracks()), static_cast<Double_t>(jet->GetNumberOfClusters()),jet->Eta(), jet->Phi()};
558 fhnJetQA->Fill(JetQA);
561 // Loop over clusters for JetQA
562 for(int iCluster = 0; iCluster < nCluster; iCluster++) {
563 AliVCluster* caloCluster = static_cast<AliVCluster*>(fCaloClusters->At(iCluster));
564 //AliVCluster* caloCluster = (AliVCluster* )caloClusters->At(jet->GetNumberOfClusters());
565 //AliESDCaloCluster* caloCluster = (AliESDCaloCluster* )caloClusters->At(iCluster);
566 //AliESDCaloCluster* clus = fESD->GetCaloCluster(iclus);
568 AliError(Form("ERROR: Could not get cluster %d", iCluster));
571 if(!IsJetCluster(jet,iCluster,kFALSE)) continue ;
573 caloCluster->GetPosition(pos); // Get cluster position
575 Double_t NtrMatched = -999.0;
576 NtrMatched = caloCluster->GetNTracksMatched();
578 //loop over tracks for Jet QA
579 for(int itrack = 0; itrack < NtrMatched; itrack++){
580 //AliVParticle *track = static_cast<AliVParticle*>(fTracks->At(i));
581 AliVTrack *trackcluster = static_cast<AliVTrack*>(fTracks->At(itrack));
582 //AliESDtrack* track = fESD->GetTrack(i);
583 if (! trackcluster) {
584 AliError(Form("Couldn't get ESD track %d\n", itrack));
587 if(!IsJetTrack(jet,itrack,kFALSE)) continue;
588 Double_t ClusQA[6] = {caloCluster->E(),cp.PseudoRapidity() ,cp.Phi(), static_cast<Double_t>(caloCluster->IsEMCAL()), NtrMatched, trackcluster->Phi()};
589 fhnClusQA->Fill(ClusQA); //,1./Njets); // fill Sparse Histo with trigger entries
590 }//loop over tracks for JetQA
592 }//loop over clusters for JetQA
594 // loop over tracks in the event
595 for (int iTrack = 0; iTrack<jet->GetNumberOfTracks(); iTrack++){ //loop over tracks in jet for TrackQA
596 //AliVParticle *track = static_cast<AliVParticle*>(fTracks->At(i));
597 AliVTrack *jetTrack = static_cast<AliVTrack*>(fTracks->At(iTrack));
598 //AliESDtrack* track = fESD->GetTrack(i);
600 AliError(Form("Couldn't get ESD track %d\n", iTrack));
603 if(!IsJetTrack(jet,iTrack,kFALSE)) continue;
604 Double_t trackQA[5] = {jetTrack->Pt(), jetTrack->Eta(), jetTrack->Phi(), static_cast<Double_t>(jetTrack->IsEMCAL()), static_cast<Double_t>(jetTrack->GetEMCALcluster())};
605 fhnTrackQA->Fill(trackQA); //,1./Njets);
607 }//track loop for TrackQA
609 if(highestjetpt<jet->Pt()){
611 highestjetpt=jet->Pt();
613 } // end of looping over jets
615 // loop over jets in the event and make appropriate cuts
616 for (Int_t iJets = 0; iJets < Njets; ++iJets) {
617 AliEmcalJet *jet = static_cast<AliEmcalJet*>(fJets->At(iJets));
618 if (!jet) // see if we have a jet
621 // phi of jet, constrained to 1.6 < Phi < 2.94
622 float jetphi = jet->Phi(); // phi of jet
625 if(!AcceptMyJet(jet)) continue;
627 Int_t JetClusters = jet->GetNumberOfClusters();
628 Int_t JetTracks = jet -> GetNumberOfTracks();
629 fHistnJetTrackvnJetClusters->Fill(JetClusters,JetTracks);
631 // Initializations and Calculations
632 //Double_t jeteta = jet->Eta(); // ETA of jet
633 Double_t jetptraw = jet->Pt(); // raw pT of jet
634 Double_t jetPt = -500; // initialize corr jet pt LOCAL
635 Double_t jetarea = -500; // initialize jet area
636 jetarea = jet->Area(); // jet area
637 jetPt = jet->Pt() - jetarea*fRhoVal; // semi-corrected pT of jet from GLOBAL rho value
640 if(fillHist>0) fHistJetPtvsTrackPt[centbin]->Fill(jetPt,jet->MaxTrackPt());
641 fHistJetPhi->Fill(jetphi);
642 if(fillHist>0) fHistCorJetPt->Fill(jetPt);
643 fHistJetPt->Fill(jetptraw);
645 if(jet->Pt() > fJetHIpt) {
648 //for (int i = 0; i < njetclusters; i++){
649 for(int iCluster = 0; iCluster < nCluster; iCluster++) {
650 AliVCluster* caloCluster = static_cast<AliVCluster*>(fCaloClusters->At(iCluster));
651 //AliVCluster* caloCluster = (AliVCluster* )caloClusters->At(iCluster);
652 //AliESDCaloCluster* caloCluster = (AliESDCaloCluster* )caloClusters->At(iCluster);
653 //AliESDCaloCluster* clus = fESD->GetCaloCluster(iclus);
655 AliError(Form("ERROR: Could not get cluster %d", iCluster));
659 //if (!caloCluster -> IsEMCAL()) continue; //Check that Cluster is EMCal Cluster
660 if(! IsJetCluster(jet, iCluster, kFALSE)) continue;
662 AliESDtrack *track = 0;
663 if (caloCluster->GetTrackMatchedIndex() > 0) // tender's matching
664 track = fESD->GetTrack(caloCluster->GetTrackMatchedIndex());
665 Double_t fclusE = -999;
666 fclusE = caloCluster->E();
668 if (fclusE<0.) continue; //Check that cluster has positive energy
670 fHistClusE->Fill(fclusE);
671 //Int_t cluslabel = caloCluster->GetID();
672 //Int_t nmatched = caloCluster->GetNTracksMatched();
675 caloCluster->GetPosition(pos); // Get cluster position
677 if(fillHist>0) fHistClusterPhivEta->Fill(cp.PseudoRapidity(),cp.Phi());
679 Int_t trackMatchedindex=caloCluster->GetTrackMatchedIndex();
680 if(trackMatchedindex<0)continue; // Make sure we don't have a bad index
682 if (caloCluster->GetTrackMatchedIndex() > 0) // tender's matching
683 track = fESD->GetTrack(caloCluster->GetTrackMatchedIndex());
684 Double_t NtrMatched = -999;
685 NtrMatched = caloCluster->GetNTracksMatched();
686 for(int itrack = 0; itrack < NtrMatched; itrack++){ // Loop over tracks matched to clusters from jets
687 //AliVParticle *trackCluster = static_cast<AliVParticle*>(fTracks->At(i));
688 AliVTrack *trackCluster = static_cast<AliVTrack*>(fTracks->At(itrack));
689 //AliESDtrack* trackCluster = fESD->GetTrack(itrack);
690 if (! trackCluster) {
691 AliError(Form("Couldn't get ESD track %d\n", itrack));
694 if(!IsJetTrack(jet,itrack,kFALSE)) continue; // Check that track is still part of ith jet
696 //if (trackCluster->Phi()>3.2 || trackCluster->Phi()<1.4)cout <<"Out of Range Track! Track Phi: " << trackCluster->Phi() << endl;
698 //if(track->Pt() < 4.0) continue;
699 // initialize track info
701 //Double_t trackphi = -99;
702 Double_t trackpt = 0;
703 Double_t p = trackCluster->P();
706 // distance of closest approach
707 Float_t DCAxy = -999;
709 //Double_t DCAXY = -999;
710 //Double_t DCAZ = -999;
713 //trackCluster->GetImpactParameters(DCAxy, DCAz);
714 trackpt = trackCluster->Pt();
715 //trackphi = track->Phi();
717 // fill track histo's
718 if(fillHist>0) fHistTrackPhivEta->Fill(trackCluster->Eta(),trackCluster->Phi());
719 if(fillHist>0) fHistdEdx->Fill(dEdx);
720 if(fillHist>0) fHistdEdxvPt->Fill(trackpt,dEdx);
721 if(fillHist>0) fHistTrackPt[centbin]->Fill(trackCluster->Pt());
723 Double_t nSigmaElectron_TPC = -999;
724 Double_t nSigmaElectron_TOF = -999;
725 Double_t nSigmaElectron_EMCAL = -999;
729 AliESDtrack *trackESD = fESD->GetTrack(Ntracks);
731 dEdx = trackESD->GetTPCsignal();
732 trackESD->GetImpactParameters(DCAxy, DCAz);
733 nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(trackESD,AliPID::kElectron);
734 nSigmaElectron_TOF = fPIDResponse->NumberOfSigmasTOF(trackESD,AliPID::kElectron);
737 AliAODTrack *trackAOD = fAOD->GetTrack(Ntracks);
739 // get detector signals
740 dEdx = trackAOD->GetTPCsignal();
742 //trackAOD->GetImpactParameters(DCAxy,DCAz);
743 nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(trackAOD,AliPID::kElectron);
744 nSigmaElectron_TOF = fPIDResponse->NumberOfSigmasTOF(trackAOD,AliPID::kElectron);
749 //double ss[4]={0.,0.,0.,0.};
751 //nSigmaElectron_EMCAL = fPIDResponse->NumberOfSigmasEMCAL(trackESD,AliPID::kElectron,eop2,ss);
752 if(fillHist>0) fHistEovPTracks->Fill(EovP);
753 if(fillHist>0) fHistEovPvsPtTracks->Fill(trackpt,EovP);
754 Double_t HF_tracks[12] = {fCent, trackCluster->Pt(), trackCluster->P() ,trackCluster->Eta(), trackCluster->Phi(), EovP, 0/*DCAxy*/, 0/*DCAz*/, dEdx, nSigmaElectron_TPC, nSigmaElectron_TOF, nSigmaElectron_EMCAL};
755 fhnPIDHF->Fill(HF_tracks); // fill Sparse Histo with trigger entries
757 //Int_t trackMatchedIndex = caloCluster->GetTrackMatchedIndex();//find the index of the matched track. This by default returns the best match
758 //AliESDtrack *track = event->GetTrack(trackMatchedIndex);
759 //if this is a good track, accept track will return true. The track matched is good, so not track matched is false
760 //Int_t matched = fESD->AcceptTrack(track);//If the track is bad, don't count it. By default even bad tracks are accepted
762 } //loop over tracks matched to clusters in jet
764 } // loop over jet clusters
767 } // highest pt jet cut
768 } // LOOP over JETS in event
773 //________________________________________________________________________
774 void AliAnalysisTaskEmcalJetHF::Terminate(Option_t *)
776 cout<<"###########################"<<endl;
777 cout<<"#### Task Finished ####"<<endl;
778 cout<<"###########################"<<endl;
779 cout<<"###########################"<<endl;
780 } // end of terminate
782 //________________________________________________________________________
783 Int_t AliAnalysisTaskEmcalJetHF::AcceptMyJet(AliEmcalJet *jet) {
784 //applies all jet cuts except pt
785 if ((jet->Phi()<fPhimin)||(jet->Phi()>fPhimax)) return 0;
786 if ((jet->Eta()<fEtamin)||(jet->Eta()>fEtamax)) return 0;
787 if (jet->Area()<fAreacut) return 0;
788 // prevents 0 area jets from sneaking by when area cut == 0
789 if (jet->Area()==0) return 0;
790 //exclude jets with extremely high pt tracks which are likely misreconstructed
791 if(jet->MaxTrackPt()>100) return 0;
793 //passed all above cuts
797 //________________________________________________________________________
798 Int_t AliAnalysisTaskEmcalJetHF::GetCentBin(Double_t cent) const
799 { // Get centrality bin.
802 if (cent>=0 && cent<10)
804 else if (cent>=10 && cent<20)
806 else if (cent>=20 && cent<30)
808 else if (cent>=30 && cent<40)
810 else if (cent>=40 && cent<50)
812 else if (cent>=50 && cent<90)
816 //____________________________________________________________________________________________
817 THnSparse* AliAnalysisTaskEmcalJetHF::NewTHnSparseDHF(const char* name, UInt_t entries)
819 // generate new THnSparseD PID, axes are defined in GetDimParams()
821 UInt_t tmp = entries;
824 tmp = tmp &~ -tmp; // clear lowest bit
827 TString hnTitle(name);
828 const Int_t dim = count;
835 while(c<dim && i<32){
839 GetDimParamsHF(i, label, nbins[c], xmin[c], xmax[c]);
840 hnTitle += Form(";%s",label.Data());
848 return new THnSparseD(name, hnTitle.Data(), dim, nbins, xmin, xmax);
849 } // end of NewTHnSparseF PID
851 THnSparse* AliAnalysisTaskEmcalJetHF::NewTHnSparseDJetQA(const char* name, UInt_t entries)
853 // generate new THnSparseD JetQA, axes are defined in GetDimParamsJetQA()
855 UInt_t tmp = entries;
858 tmp = tmp &~ -tmp; // clear lowest bit
861 TString hnTitle(name);
862 const Int_t dim = count;
869 while(c<dim && i<32){
873 GetDimParamsJetQA(i, label, nbins[c], xmin[c], xmax[c]);
874 hnTitle += Form(";%s",label.Data());
882 return new THnSparseD(name, hnTitle.Data(), dim, nbins, xmin, xmax);
883 } // end of NewTHnSparseF JetQA
886 void AliAnalysisTaskEmcalJetHF::GetDimParamsHF(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
888 // stores label and binning of axis for THnSparse
889 const Double_t pi = TMath::Pi();
894 label = "V0 centrality (%)";
901 label = "Track p_{T}";
929 label = "E/p of track";
950 label = "dEdX of track - TPC";
957 label = "nSigma electron TPC";
964 label = "nSigma electron TOF";
971 label = "nSigma electron Emcal";
979 } // end of getting dim-params
981 void AliAnalysisTaskEmcalJetHF::GetDimParamsJetQA(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
983 // stores label and binning of axis for THnSparse
984 const Double_t pi = TMath::Pi();
989 label = "number of Jets in Event";
996 label = "number of Clusters in a Jet";
1003 label = "number of Tracks in a Jet";
1024 label = "Cluster Energy";
1031 label = "Cluster Eta";
1038 label = "Cluster Phi";
1045 label = "Is EMCalCluster";
1052 label = "Number of Matched Tracks to Cluster";
1066 label = "Track Eta";
1080 label="Is Track EMCal";
1087 label = "Get Track EMCal Cluster";
1094 label = "Track Matched Phi";
1103 } // end of getting dim-params