2 // Author: A Castro (UTK)
3 // Last Modified: August 11, 2014
5 #include "AliAnalysisTaskEmcalJetHF.h"
7 // general ROOT includes
10 #include <TClonesArray.h>
14 #include <THnSparse.h>
16 #include <TLorentzVector.h>
17 #include <TParameter.h>
18 #include <TParticle.h>
21 #include <TObjArray.h>
24 #include "AliAODEvent.h"
25 #include "AliESDEvent.h"
26 #include "AliAnalysisManager.h"
27 #include "AliAnalysisTask.h"
28 #include "AliCentrality.h"
29 #include "AliEmcalJet.h"
30 #include "AliAODJet.h"
31 #include "AliVCluster.h"
32 #include "AliVTrack.h"
33 #include <AliVEvent.h>
34 #include <AliVParticle.h>
35 #include "AliRhoParameter.h"
37 #include "AliJetContainer.h"
38 #include "AliParticleContainer.h"
39 #include "AliClusterContainer.h"
40 #include "AliEmcalParticle.h"
41 #include "AliESDCaloCluster.h"
42 #include <AliESDtrackCuts.h>
44 #include "AliTPCdEdxInfo.h"
45 //#include "AliCaloTrackESDReader.h"
46 //#include "AliCaloTrackAODReader.h"
47 //#include "AliCaloTrackReader.h"
49 // event handler (and pico's) includes
50 #include <AliInputEventHandler.h>
51 #include <AliVEventHandler.h>
52 #include "AliESDInputHandler.h"
53 #include "AliPicoTrack.h"
54 #include "AliEventPoolManager.h"
55 #include "AliAODTrack.h"
56 #include "AliESDtrack.h"
59 #include "AliPIDResponse.h"
60 #include "AliTPCPIDResponse.h"
61 #include "AliESDpid.h"
63 #include <AliInputEventHandler.h>
64 #include <AliVEventHandler.h>
66 // magnetic field includes
67 #include "TGeoGlobalMagField.h"
70 ClassImp(AliAnalysisTaskEmcalJetHF)
72 //________________________________________________________________________
73 AliAnalysisTaskEmcalJetHF::AliAnalysisTaskEmcalJetHF() :
74 AliAnalysisTaskEmcalJet("heavyF",kFALSE),
77 fEventTrigEMCALL1Gamma1(0),
78 fEventTrigEMCALL1Gamma2(0),
82 fPhimin(-10), fPhimax(10),
83 fEtamin(-0.9), fEtamax(0.9),
90 fPIDResponse(0x0), fTPCResponse(),
91 fEsdtrackCutsITSTPC(),
94 fJetsCont(0), fTracksCont(0), fCaloClustersCont(0), fTracksJetCont(0), fCaloClustersJetCont(0),
98 fHistCorJetPt(0), fHistJetPt(0),
101 fHistnJetTrackvnJetClusters(0),
102 fHistPtDEtaDPhiTrackClus(0),
103 fHistPtDEtaDPhiClusTrack(0),
104 fhnPIDHF(0x0), fhnJetQA(0x0), fhnClusterTrackQA(0x0), fhnTrackClusterQA(0x0), fhnPIDHFTtoC(0x0)
106 // Default constructor.
107 for (Int_t i = 0;i<6;++i){
108 fHistJetPtvsTrackPt[i] = 0;
116 SetMakeGeneralHistograms(kTRUE);
120 //________________________________________________________________________
121 AliAnalysisTaskEmcalJetHF::AliAnalysisTaskEmcalJetHF(const char *name) :
122 AliAnalysisTaskEmcalJet(name,kTRUE),
125 fEventTrigEMCALL1Gamma1(0),
126 fEventTrigEMCALL1Gamma2(0),
130 fPhimin(-10), fPhimax(10),
131 fEtamin(-0.9), fEtamax(0.9),
138 fPIDResponse(0x0), fTPCResponse(),
139 fEsdtrackCutsITSTPC(),
142 fJetsCont(0), fTracksCont(0), fCaloClustersCont(0), fTracksJetCont(0), fCaloClustersJetCont(0),
146 fHistCorJetPt(0), fHistJetPt(0),
149 fHistnJetTrackvnJetClusters(0),
150 fHistPtDEtaDPhiTrackClus(0),
151 fHistPtDEtaDPhiClusTrack(0),
152 fhnPIDHF(0x0), fhnJetQA(0x0), fhnClusterTrackQA(0x0), fhnTrackClusterQA(0x0), fhnPIDHFTtoC(0x0)
154 for (Int_t i = 0;i<6;++i){
155 fHistJetPtvsTrackPt[i] = 0;
162 SetMakeGeneralHistograms(kTRUE);
164 DefineInput(0,TChain::Class());
165 DefineOutput(1, TList::Class());
168 //_______________________________________________________________________
169 AliAnalysisTaskEmcalJetHF::~AliAnalysisTaskEmcalJetHF()
179 //________________________________________________________________________
180 void AliAnalysisTaskEmcalJetHF::UserCreateOutputObjects()
184 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
186 //fJetsCont = GetJetContainer(0);
187 if(fJetsCont) { //get particles and clusters connected to jets
188 fTracksJetCont = fJetsCont->GetParticleContainer();
189 fCaloClustersJetCont = fJetsCont->GetClusterContainer();
191 else { //no jets, just analysis tracks and clusters
192 fTracksCont = GetParticleContainer(0);
193 fCaloClustersCont = GetClusterContainer(0);
195 fTracksCont->SetClassName("AliVTrack");
196 fCaloClustersCont->SetClassName("AliVCluster");
198 fHistJetPhi = new TH1F("NjetvsPhi", "NjetvsPhi", 288,-2*TMath::Pi(),2*TMath::Pi());
199 fHistJetPt = new TH1F("NjetvsJetPt", "NjetvsJetPt", 300, 0, 300);
200 fOutput->Add(fHistJetPhi);
201 fOutput->Add(fHistJetPt);
207 fHistRhovsCent = new TH2F("RhovsCent", "RhovsCent", 100, 0.0, 100.0, 400, 0, 400);
208 fHistCorJetPt = new TH1F("NjetvsCorrJetPt", "NjetvsCorrJetPt", 300, -100, 200);
209 fHistnSigElecPt = new TH2F("nsig_v_pt(TPC)","nsig_v_pt(TPC)",200,0,100,100,-10,10);
210 fHistnJetTrackvnJetClusters = new TH2F("NumbJetTracksvJetClusters","NumbJetTracksvJetClusters",21,0,20,21,0,20);
211 fHistHighJetPt = new TH1F("HighestPtJetPerEvent","HighJetPt",300,0,150);
213 histname = "fHistPtDEtaDPhiTrackClus";
214 fHistPtDEtaDPhiTrackClus = new TH3F(histname.Data(),Form("%s;#it{p}_{T}^{track};#Delta#eta;#Delta#varphi",histname.Data()),100,0.,100.,100,-0.1,0.1,100,-0.1,0.1);
215 fOutput->Add(fHistPtDEtaDPhiTrackClus);
217 histname = "fHistPtDEtaDPhiClusTrack";
218 fHistPtDEtaDPhiClusTrack = new TH3F(histname.Data(),Form("%s;#it{p}_{T}^{clus};#Delta#eta;#Delta#varphi",histname.Data()),100,0.,100.,100,-0.1,0.1,100,-0.1,0.1);
219 fOutput->Add(fHistPtDEtaDPhiClusTrack);
221 // PT bins used to be (2000, -100, 300)
225 // creating centrality dependent histos that don't involve Global Rho
226 for (Int_t i = 0;i<6;++i){
227 name = TString(Form("JetPtvsTrackPt_%i",i));
228 title = TString(Form("Jet pT vs Leading Track pT cent bin %i",i));
229 fHistJetPtvsTrackPt[i] = new TH2F(name,title, 500, -100, 400, 100,0,100);
230 fOutput->Add(fHistJetPtvsTrackPt[i]);
232 name = TString(Form("TrackPt_%i",i));
233 title = TString(Form("Track pT cent bin %i",i));
234 fHistTrackPt[i] = new TH1F(name,title,400,0,200);
235 fOutput->Add(fHistTrackPt[i]);
237 name = TString(Form("EP0_%i",i));
238 title = TString(Form("EP VZero cent bin %i",i));
239 fHistEP0[i] = new TH1F(name,title,144,-TMath::Pi(),TMath::Pi());
240 fOutput->Add(fHistEP0[i]);
242 name = TString(Form("EP0A_%i",i));
243 title = TString(Form("EP VZero cent bin %i",i));
244 fHistEP0A[i] = new TH1F(name,title,144,-TMath::Pi(),TMath::Pi());
245 fOutput->Add(fHistEP0A[i]);
247 name = TString(Form("EP0C_%i",i));
248 title = TString(Form("EP VZero cent bin %i",i));
249 fHistEP0C[i] = new TH1F(name,title,144,-TMath::Pi(),TMath::Pi());
250 fOutput->Add(fHistEP0C[i]);
252 name = TString(Form("EPAvsC_%i",i));
253 title = TString(Form("EP VZero cent bin %i",i));
254 fHistEPAvsC[i] = new TH2F(name,title,144,-TMath::Pi(),TMath::Pi(),100,-TMath::Pi(),TMath::Pi());
255 fOutput->Add(fHistEPAvsC[i]);
259 fOutput->Add(fHistRhovsCent);
260 fOutput->Add(fHistCorJetPt);
261 fOutput->Add(fHistnSigElecPt);
262 fOutput->Add(fHistnJetTrackvnJetClusters);
263 fOutput->Add(fHistHighJetPt);
266 // ****************************** PID *****************************************************
267 // set up PID handler
268 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
269 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
271 AliFatal("Input handler needed");
275 // PID response object
276 //fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
277 // inputHandler->CreatePIDResponse(fIsMC); // needed to create object, why though?
278 fPIDResponse = inputHandler->GetPIDResponse();
280 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 | 1<<12 | 1<<13| 1<<14 | 1<<15 | 1<<16 | 1<<17;
286 fhnPIDHF = NewTHnSparseDHF("fhnPIDHFCtoT", 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<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<8 | 1<<9 | 1<<10 | 1<<15 | 1<<16 | 1<<17;
294 fhnClusterTrackQA = NewTHnSparseDHF("fhnClusterTrackQA", bitcoded2);
296 UInt_t bitcoded3 = 0; // bit coded, see GetDimParamsPID() below
297 bitcoded3 = 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<8 | 1<<9 | 1<<10 | 1<<15 | 1<<16 | 1<<17;
298 fhnTrackClusterQA = NewTHnSparseDHF("fhnTrackClusterQA", bitcoded3);
300 UInt_t bitcoded7 = 0; // bit coded, see GetDimParamsPID() below
301 bitcoded7 = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<6 | 1<<7 | 1<<8 | 1<<9 | 1<<10 | 1<<11 | 1<<12 | 1<<13| 1<<14 | 1<<15 | 1<<16 | 1<<17;
302 fhnPIDHFTtoC = NewTHnSparseDHF("fhnPIDHFTtoC", bitcoded7);
304 cout << "_______________Created Sparse__________________" << endl;
306 fOutput->Add(fhnPIDHF);
307 fOutput->Add(fhnJetQA);
308 fOutput->Add(fhnClusterTrackQA);
309 fOutput->Add(fhnTrackClusterQA);
310 fOutput->Add(fhnPIDHFTtoC);
312 PostData(1, fOutput);
316 //________________________________________________________
317 void AliAnalysisTaskEmcalJetHF::ExecOnce()
319 // Initialize the analysis
320 AliAnalysisTaskEmcalJet::ExecOnce();
322 if (fJetsCont && fJetsCont->GetArray() == 0) fJetsCont = 0;
323 if (fTracksCont && fTracksCont->GetArray() == 0) fTracksCont = 0;
324 if (fCaloClustersCont && fCaloClustersCont->GetArray() == 0) fCaloClustersCont = 0;
329 //________________________________________________________________________
330 Bool_t AliAnalysisTaskEmcalJetHF::Run()
332 // check to see if we have any tracks
333 if (!fTracks) return kTRUE;
334 if (!fJets) return kTRUE;
336 // what kind of event do we have: AOD or ESD?
338 if (dynamic_cast<AliAODEvent*>(InputEvent())) useAOD = kTRUE;
339 else useAOD = kFALSE;
341 fEventTrigEMCALL1Gamma1 = kFALSE;
342 fEventTrigEMCALL1Gamma2 = kFALSE;
344 // if we have ESD event, set up ESD object
346 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
348 AliError(Form("ERROR: fESD not available\n"));
353 // if we have AOD event, set up AOD object
355 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
357 AliError(Form("ERROR: fAOD not available\n"));
362 // get magnetic field info for DCA
363 Double_t MagF = fESD->GetMagneticField();
364 Double_t MagSign = 1.0;
365 if(MagF<0)MagSign = -1.0;
366 // set magnetic field
367 if (!TGeoGlobalMagField::Instance()->GetField()) {
368 AliMagF* field = new AliMagF("Maps","Maps", MagSign, MagSign, AliMagF::k5kG);
369 TGeoGlobalMagField::Instance()->SetField(field);
372 // get centrality bin
373 Int_t centbin = GetCentBin(fCent);
374 //for pp analyses we will just use the first centrality bin
375 if (centbin == -1) centbin = 0;
377 // get vertex information
378 Double_t fvertex[3]={0,0,0};
379 InputEvent()->GetPrimaryVertex()->GetXYZ(fvertex);
380 //Double_t zVtx=fvertex[2];
382 // create pointer to list of input event
383 TList *list = InputEvent()->GetList();
385 AliError(Form("ERROR: list not attached\n"));
389 // background density
390 fRhoVal = fRho->GetVal();
392 // initialize TClonesArray pointers to jets and tracks
393 TClonesArray *jets = 0;
394 //TClonesArray *tracks = 0;
395 //TClonesArray *clusters = 0;
396 //TClonesArray * clusterList = 0;
399 jets = dynamic_cast<TClonesArray*>(list->FindObject(fJets));
401 AliError(Form("Pointer to jets %s == 0", fJets->GetName()));
403 } // verify existence of jets
406 //cout<<"Event #: "<<event<<" Number of Clusters: "<<fCaloClustersCont->GetNClusters()<<" Number of Tracks: "<<fTracksCont->GetNParticles()<<endl;
408 // Int_t nclusters = fInputEvent->GetNumberOfCaloClusters();
411 // get number of jets and tracks
412 const Int_t Njets = jets->GetEntries();
413 if(Njets<1) return kTRUE;
416 AliVTrack *track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle(0));
418 track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle());
421 if (fCaloClustersCont) {
422 AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0);
424 TLorentzVector nPart;
425 cluster->GetMomentum(nPart, fVertex);
426 cluster = fCaloClustersCont->GetNextAcceptCluster();
430 // Start Jet Analysis
431 // initialize jet parameters
433 Double_t highestjetpt=0.0;
435 // loop over jets in an event - to find highest jet pT and apply some cuts && JetQA Sparse
436 for (Int_t ijet = 0; ijet < Njets; ijet++){
438 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
442 if(!AcceptMyJet(jet)) continue;
446 if(highestjetpt<jet->Pt()){
448 highestjetpt=jet->Pt();
450 } // end of looping over jets
452 fHistHighJetPt->Fill(ijethi);
453 // **********************************************************************
455 // **********************************************************************
457 // loop over jets in the event and make appropriate cuts
458 for (Int_t iJets = 0; iJets < Njets; ++iJets) {
459 AliEmcalJet *jet = static_cast<AliEmcalJet*>(fJets->At(iJets));
460 if (!jet) // see if we have a jet
463 // phi of jet, constrained to 1.6 < Phi < 2.94
464 float jetphi = jet->Phi(); // phi of jet
466 if(!AcceptMyJet(jet)) continue;
468 //AliEmcalJet::EFlavourTag tag=AliEmcalJet::kDStar;
469 //jet->AddFlavourTag(tag);
471 Bool_t bkgrnd1 = kFALSE;
472 Bool_t sig1 = kFALSE;
474 Int_t JetClusters = jet->GetNumberOfClusters();
475 Int_t JetTracks = jet -> GetNumberOfTracks();
476 fHistnJetTrackvnJetClusters->Fill(JetClusters,JetTracks);
477 // Initializations and Calculations
478 Double_t jetptraw = jet->Pt(); // raw pT of jet
479 Double_t jetPt = -500; // initialize corr jet pt LOCAL
480 Double_t jetarea = -500; // initialize jet area
481 jetarea = jet->Area(); // jet area
482 jetPt = jet->Pt() - jetarea*fRhoVal; // semi-corrected pT of jet from GLOBAL rho value
483 fHistCorJetPt->Fill(jetPt);
485 if(jet->Pt() > fJetHIpt) {
486 if(!fTracksCont || !fCaloClustersCont) return kTRUE;
490 Float_t DCAxy = -999;
495 Int_t NumbCluster = -999;
496 NumbCluster = fCaloClustersCont->GetNClusters();
497 Double_t JetQA[5] = {Njets, jet->GetNumberOfTracks(), jet->GetNumberOfClusters(),jet->Eta(), jet->Phi()};
498 fhnJetQA->Fill(JetQA);
500 //***********************************************
501 //****************Track Matched to Closest Cluster
504 for(int iCluster = 0; iCluster <= NumbCluster; iCluster++){
505 //Get closest track to cluster to track matching!!!!!
506 //AliVCluster *cluster = fCaloClustersCont->GetNextAcceptedCluster(iCluster);
507 AliVCluster *cluster = fCaloClustersCont->GetCluster(iCluster);
509 if(! IsJetCluster(jet, iCluster, kFALSE)) continue;
512 TLorentzVector nPart;
513 cluster->GetMomentum(nPart, fVertex);
514 //fHistClustersPt[fCentBin]->Fill(nPart.Pt());
515 Double_t fclusE = -999;
516 fclusE = cluster->E();
519 cluster->GetPosition(pos); // Get cluster position
523 AliVTrack *mt = NULL;
524 //AliESDtrack *mt = NULL;
525 AliESDtrack *ESDmt = NULL;
526 AliAODCaloCluster *acl = dynamic_cast<AliAODCaloCluster*>(cluster);
529 //mt = static_cast<AliVTrack*>(acl->GetTrackMatched(0));
533 AliESDCaloCluster *ecl = dynamic_cast<AliESDCaloCluster*>(cluster);
534 Int_t im = ecl->GetTrackMatchedIndex();
536 if(fTracksCont && im>=0) {
537 //mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
538 mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
541 ESDmt = static_cast<AliESDtrack*>(mt);
544 Double_t pcluster = mt->P();
545 //Double_t esdp = ESDmt->P();
546 //Int_t LabelNumb, IDNumb;
547 //LabelNumb = ESDmt->GetLabel();
548 //IDNumb= ESDmt -> GetID();
550 dEdx = mt->GetTPCsignal();
551 Double_t p = mt->P();
553 //nsigpion = fPIDResponse->NumberOfSigmasTPC(mt,AliPID::kPion);
554 Double_t nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(mt,AliPID::kElectron);
555 Double_t nSigmaElectron_TOF = fPIDResponse->NumberOfSigmasTOF(mt,AliPID::kElectron);
556 dEdx = mt->GetTPCsignal();
557 ESDmt->GetImpactParameters(DCAxy, DCAz);
559 Double_t HF_tracks[18] = {fCent, mt->Pt(), pcluster ,mt->Eta(), mt->Phi(), EovP, DCAxy, DCAz, dEdx,nSigmaElectron_TPC, nSigmaElectron_TOF,0 /*nSigmaElectron_EMCAL*/, jetptraw, jetphi, jet->Eta(),fclusE,cp.PseudoRapidity(),cp.Phi()};
560 fhnPIDHF->Fill(HF_tracks); // fill Sparse Histo with trigger entries
568 AliPicoTrack::GetEtaPhiDiff(mt, cluster, dphi, deta);
569 fHistPtDEtaDPhiClusTrack->Fill(nPart.Pt(),deta,dphi);
575 //cluster = fCaloClustersCont->GetNextAcceptCluster();
576 //if(! IsJetCluster(jet, cluster, kFALSE)) continue;
580 Double_t p = mt->P();
582 cluster->GetPosition(pos); // Get cluster position
583 //AliESDtrack *trackESD = fESD->GetTrack(Ntracks);
585 // nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(mt,AliPID::kElectron);
586 // nSigmaElectron_TOF= fPIDResponse->NumberOfSigmasTOF(mt,AliPID::kElectron);
590 //if(!fesdTrackCuts->AcceptTrack(mt)) continue;
591 //dEdx = mt->GetTPCsignal();
592 //mt->GetImpactParameters(DCAxy, DCAz);
593 //nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(trackESD,AliPID::kElectron);
594 //nSigmaElectron_TOF = fPIDResponse->NumberOfSigmasTOF(trackESD,AliPID::kElectron);
597 //Double_t HF_tracks[18] = {fCent, mt->Pt(), mt->P() ,mt->Eta(), mt->Phi(), EovP, DCAxy, DCAz, dEdx, nSigmaElectron_TPC, nSigmaElectron_TOF, nSigmaElectron_EMCAL, jet->Pt(), jet->Phi(), jet->Eta(),fclusE,cp.PseudoRapidity(),cp.Phi()};
598 //fhnPIDHF->Fill(HF_tracks); // fill Sparse Histo with trigger entries
600 //cluster = fCaloClustersCont->GetNextAcceptCluster();
601 //if(! IsJetCluster(jet, cluster, kFALSE)) continue;
604 //AliESDtrack *ESDacceptedTrack = NULL;
607 //******************************Cluster Matched To Closest Track
608 //**************************************************************
611 Int_t NumbTrackContainer = -999;
612 NumbTrackContainer = fTracksCont->GetNParticles();
613 for(int iTracks = 0; iTracks <= NumbTrackContainer; iTracks++){
614 AliVTrack *AcceptedTrack =static_cast<AliVTrack*>(fTracksCont->GetParticle(iTracks));
616 AliError(Form("Couldn't get AliVTrack Container %d\n", iTracks));
619 if(!IsJetTrack(jet,iTracks,kFALSE))continue;
620 //Get matched cluster
621 Int_t emc1 = AcceptedTrack->GetEMCALcluster();
623 Double_t acceptTrackP = AcceptedTrack->P();
624 Double_t acceptTrackPt = AcceptedTrack->Pt();
625 Double_t acceptTrackEta = AcceptedTrack->Eta();
626 Double_t acceptTrackPhi = AcceptedTrack->Phi();
627 Double_t nSigmaElectron_TPC_at = fPIDResponse->NumberOfSigmasTPC(AcceptedTrack,AliPID::kElectron);
628 Double_t nSigmaElectron_TOF_at = fPIDResponse->NumberOfSigmasTOF(AcceptedTrack,AliPID::kElectron);
631 AliESDtrack *ESDacceptedTrack = static_cast<AliESDtrack*>(AcceptedTrack);
633 if(!ESDacceptedTrack){
634 AliError(Form("Couldn't get AliESDTrack %d\n", iTracks));
637 //Double_t DCAxy_at, DCAz_at;
638 Double_t dEdxat = AcceptedTrack->GetTPCsignal();
639 //ESDacceptedTrack->GetImpactParameters(DCAxy_at, DCAz_at);
642 if(fCaloClustersCont && emc1>=0) {
643 AliVCluster *clusMatch = fCaloClustersCont->GetCluster(emc1);
645 AliError(Form("Couldn't get matched AliVCluster %d\n", emc1));
651 Double_t mClusterE = clusMatch->E();
653 clusMatch->GetPosition(pos_mc); // Get cluster position
654 TVector3 mcp(pos_mc);
655 Double_t EovP_mc = -999;
656 EovP_mc = mClusterE/acceptTrackP;
658 bkgrnd1 = kTRUE; //Hadron Background
660 if(0.8 < EovP_mc < 1.2){
661 if(-1.5<nSigmaElectron_TPC_at<5.0){
662 if(4.0<acceptTrackPt<10.0){
663 sig1 = kTRUE; //Electron Candidate
668 Double_t HF_tracks2[18] = {fCent, acceptTrackPt, acceptTrackP ,acceptTrackEta, acceptTrackPhi, EovP_mc, 0, 0, dEdxat,nSigmaElectron_TPC_at, nSigmaElectron_TOF_at,0 , jetPt, jet->Phi(), jet->Eta(),mClusterE,mcp.PseudoRapidity(),mcp.Phi()};
669 fhnPIDHFTtoC->Fill(HF_tracks2); // fill Sparse Histo with trigger entries
671 //AcceptedTrack = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle());
673 } //loop over tracks for matching to closest cluster
678 } // highest pt jet cut
681 if(bkgrnd1 == kTRUE) {
682 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kBckgrd1;
683 jet->AddFlavourTag(tag);
685 if(sig1 == kTRUE && !bkgrnd1){
686 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kSig1;
687 jet->AddFlavourTag(tag);
690 } // LOOP over JETS in event
694 if(fGlobalQA == 1) CheckClusTrackMatchingQA();
699 //________________________________________________________________________
700 void AliAnalysisTaskEmcalJetHF::Terminate(Option_t *)
702 cout<<"###########################"<<endl;
703 cout<<"#### Task Finished ####"<<endl;
704 cout<<"###########################"<<endl;
705 cout<<"###########################"<<endl;
706 } // end of terminate
709 //________________________________________________________________________
710 void AliAnalysisTaskEmcalJetHF::CheckClusTrackMatchingQA()
713 if(!fTracksCont || !fCaloClustersCont) return;
715 Int_t trkcounter = 0;
716 Int_t cluscounter = 0;
720 //Get closest cluster to track
721 AliVTrack *track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle(0));
723 //if(!track) continue;
724 AliESDtrack *ESDtrackQA1 = static_cast<AliESDtrack*>(track);
725 if(!ESDtrackQA1) continue;
726 if(!fPIDResponse) continue;
727 Double_t pQA1 = track->P();
728 Double_t nSigmaElectron_TPC_QA1 = fPIDResponse->NumberOfSigmasTPC(ESDtrackQA1,AliPID::kElectron);
729 Double_t nSigmaElectron_TOF_QA1 = fPIDResponse->NumberOfSigmasTOF(ESDtrackQA1,AliPID::kElectron);
730 Double_t dEdxQA1 = ESDtrackQA1->GetTPCsignal();
731 //Get matched cluster
732 Int_t emc1 = track->GetEMCALcluster();
733 if(fCaloClustersCont && emc1>=0) {
734 AliVCluster *clusMatch = fCaloClustersCont->GetCluster(emc1);
735 //if(!clusMatch) continue;
737 Double_t ClusterE_QA1 = clusMatch->E();
738 Double_t EovPQA1 = ClusterE_QA1/pQA1;
740 clusMatch->GetPosition(pos_mc1); // Get cluster position
741 TVector3 mc1(pos_mc1);
742 fHistnSigElecPt->Fill(nSigmaElectron_TPC_QA1,track->Pt());
743 Double_t HF_tracks3[11] = {track->Pt(), track->P() , track->Eta(), track->Phi(), EovPQA1, dEdxQA1 ,nSigmaElectron_TPC_QA1, nSigmaElectron_TOF_QA1, clusMatch->E(), mc1.PseudoRapidity(),mc1.Phi()};
744 fhnTrackClusterQA->Fill(HF_tracks3);
745 AliPicoTrack::GetEtaPhiDiff(track, clusMatch, dphi, deta);
746 fHistPtDEtaDPhiTrackClus->Fill(track->Pt(),deta,dphi);
752 track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle());
756 //Get closest track to cluster
757 AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0);
759 if(!cluster) continue;
761 Double_t ClusterE_QA2 = cluster->E();
762 //Double_t EovPQA1 = ClusterE_QA1/pQA1;
764 cluster->GetPosition(pos_mc2); // Get cluster position
765 TVector3 mc2(pos_mc2);
767 TLorentzVector nPart;
768 cluster->GetMomentum(nPart, fVertex);
771 AliVTrack *mt = NULL;
772 AliAODCaloCluster *acl = dynamic_cast<AliAODCaloCluster*>(cluster);
775 if(acl->GetNTracksMatched()>1)
776 mt = static_cast<AliVTrack*>(acl->GetTrackMatched(0));
778 AliESDtrack *ESDtrackQA2 = static_cast<AliESDtrack*>(mt);
779 if(!ESDtrackQA2) continue;
780 Double_t nSigmaElectron_TPC_QA2 = fPIDResponse->NumberOfSigmasTPC(ESDtrackQA1,AliPID::kElectron);
781 Double_t nSigmaElectron_TOF_QA2 = fPIDResponse->NumberOfSigmasTOF(ESDtrackQA1,AliPID::kElectron);
782 Double_t dEdxQA1 = ESDtrackQA2->GetTPCsignal();
783 Double_t EovPQA2 = -999;
784 Double_t pQA2 = mt->P();
785 EovPQA2 = ClusterE_QA2/pQA2;
787 //Double_t HF_tracks4[11] = {mt->Pt(), mt->P() , mt->Eta(), mt->Phi(), EovPQA2, dEdxQA2 ,nSigmaElectron_TPC_QA2, nSigmaElectron_TOF_QA2, mc2.PseudoRapidity(),mc2.Phi()};
788 //fhnClusterTrackQA->Fill(HF_tracks4);
791 AliESDCaloCluster *ecl = dynamic_cast<AliESDCaloCluster*>(cluster);
793 Int_t im = ecl->GetTrackMatchedIndex();
794 if(fTracksCont && im>=0) {
795 mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
799 AliPicoTrack::GetEtaPhiDiff(mt, cluster, dphi, deta);
800 fHistPtDEtaDPhiClusTrack->Fill(nPart.Pt(),deta,dphi);
801 cluster = fCaloClustersCont->GetNextAcceptCluster();
806 //Get closest track to cluster
807 AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0);
810 AliError(Form("Couldn't get CtoT AliCluster Container"));
813 Double_t ClusterE_QA2 = cluster->E();
815 cluster->GetPosition(pos_mc2); // Get cluster position
816 TVector3 mc2(pos_mc2);
817 TLorentzVector nPart;
818 cluster->GetMomentum(nPart, fVertex);
820 AliVTrack *mt = NULL;
821 AliESDCaloCluster *ecl = dynamic_cast<AliESDCaloCluster*>(cluster);
823 AliError(Form("Couldn't get CtoT AliESDCluster Container %d\n"));
826 Int_t im = ecl->GetTrackMatchedIndex();
827 if(fTracksCont && im>=0) {
828 //mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
830 //AliError(Form("Couldn't get CT AliVTrack Container %d\n",im));
833 //AliPicoTrack::GetEtaPhiDiff(mt, cluster, dphi, deta);
834 fHistPtDEtaDPhiClusTrack->Fill(nPart.Pt(),deta,dphi);
835 AliESDtrack *ESDtrackQA2 = static_cast<AliESDtrack*>(mt);
837 AliError(Form("Couldn't get CT AliESDTrack Container %d\n"));
840 Double_t nSigmaElectron_TPC_QA2 = fPIDResponse->NumberOfSigmasTPC(ESDtrackQA2,AliPID::kElectron);
841 Double_t nSigmaElectron_TOF_QA2 = fPIDResponse->NumberOfSigmasTOF(ESDtrackQA2,AliPID::kElectron);
842 Double_t dEdxQA1 = ESDtrackQA2->GetTPCsignal();
843 Double_t EovPQA2 = -999;
844 Double_t pQA2 = mt->P();
845 EovPQA2 = ClusterE_QA2/pQA2;
849 //cluster = fCaloClustersCont->GetNextAcceptCluster();
850 cluster = static_cast<AliVCluster*>(fCaloClustersCont->GetNextAcceptCluster());
856 //________________________________________________________________________
857 Int_t AliAnalysisTaskEmcalJetHF::AcceptMyJet(AliEmcalJet *jet) {
858 //applies all jet cuts except pt
859 if ((jet->Phi()<fPhimin)||(jet->Phi()>fPhimax)) return 0;
860 if ((jet->Eta()<fEtamin)||(jet->Eta()>fEtamax)) return 0;
861 if (jet->Area()<fAreacut) return 0;
862 // prevents 0 area jets from sneaking by when area cut == 0
863 if (jet->Area()==0) return 0;
864 //exclude jets with extremely high pt tracks which are likely misreconstructed
865 if(jet->MaxTrackPt()>100) return 0;
867 //passed all above cuts
871 //________________________________________________________________________
872 Int_t AliAnalysisTaskEmcalJetHF::GetCentBin(Double_t cent) const
873 { // Get centrality bin.
876 if (cent>=0 && cent<10)
878 else if (cent>=10 && cent<20)
880 else if (cent>=20 && cent<30)
882 else if (cent>=30 && cent<40)
884 else if (cent>=40 && cent<50)
886 else if (cent>=50 && cent<90)
891 //________________________________________________________________________________
893 void AliAnalysisTaskEmcalJetHF::FlagFlavour(AliEmcalJet *jet){
895 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kDStar;
896 if (fCandidateType==kD0toKpi) tag=AliEmcalJet::kD0;
897 if (fIsDInJet) jet->AddFlavourTag(tag);
903 //____________________________________________________________________________________________
904 THnSparse* AliAnalysisTaskEmcalJetHF::NewTHnSparseDHF(const char* name, UInt_t entries)
906 // generate new THnSparseD PID, axes are defined in GetDimParams()
908 UInt_t tmp = entries;
911 tmp = tmp &~ -tmp; // clear lowest bit
914 TString hnTitle(name);
915 const Int_t dim = count;
922 while(c<dim && i<32){
926 GetDimParamsHF(i, label, nbins[c], xmin[c], xmax[c]);
927 hnTitle += Form(";%s",label.Data());
935 return new THnSparseD(name, hnTitle.Data(), dim, nbins, xmin, xmax);
936 } // end of NewTHnSparseF PID
938 THnSparse* AliAnalysisTaskEmcalJetHF::NewTHnSparseDJetQA(const char* name, UInt_t entries)
940 // generate new THnSparseD JetQA, axes are defined in GetDimParamsJetQA()
942 UInt_t tmp = entries;
945 tmp = tmp &~ -tmp; // clear lowest bit
948 TString hnTitle(name);
949 const Int_t dim = count;
956 while(c<dim && i<32){
960 GetDimParamsJetQA(i, label, nbins[c], xmin[c], xmax[c]);
961 hnTitle += Form(";%s",label.Data());
969 return new THnSparseD(name, hnTitle.Data(), dim, nbins, xmin, xmax);
970 } // end of NewTHnSparseF JetQA
973 void AliAnalysisTaskEmcalJetHF::GetDimParamsHF(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
975 // stores label and binning of axis for THnSparse
976 const Double_t pi = TMath::Pi();
981 label = "V0 centrality (%)";
988 label = "Track p_{T}";
1002 label = "Track Eta";
1009 label = "Track Phi";
1016 label = "E/p of track";
1037 label = "dEdX of track - TPC";
1044 label = "nSigma electron TPC";
1051 label = "nSigma electron TOF";
1058 label = "nSigma electron Emcal";
1086 label = "Cluster Energy";
1093 label = "Cluster Eta";
1100 label = "Cluster Phi";
1109 } // end of getting dim-params
1111 void AliAnalysisTaskEmcalJetHF::GetDimParamsJetQA(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1113 // stores label and binning of axis for THnSparse
1114 const Double_t pi = TMath::Pi();
1119 label = "number of Jets in Event";
1126 label = "number of Clusters in a Jet";
1133 label = "number of Tracks in a Jet";
1154 label = "Cluster Energy";
1161 label = "Cluster Eta";
1168 label = "Cluster Phi";
1175 label = "Is EMCalCluster";
1182 label = "Number of Matched Tracks to Cluster";
1196 label = "Track Eta";
1210 label="Is Track EMCal";
1217 label = "Get Track EMCal Cluster";
1224 label = "Track Matched Phi";
1233 } // end of getting dim-params