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 //MV: removed to avoid compiler warnings
472 // Bool_t bkgrnd1 = kFALSE;
473 // Bool_t sig1 = kFALSE;
475 Int_t JetClusters = jet->GetNumberOfClusters();
476 Int_t JetTracks = jet -> GetNumberOfTracks();
477 fHistnJetTrackvnJetClusters->Fill(JetClusters,JetTracks);
478 // Initializations and Calculations
479 Double_t jetptraw = jet->Pt(); // raw pT of jet
480 Double_t jetPt = -500; // initialize corr jet pt LOCAL
481 Double_t jetarea = -500; // initialize jet area
482 jetarea = jet->Area(); // jet area
483 jetPt = jet->Pt() - jetarea*fRhoVal; // semi-corrected pT of jet from GLOBAL rho value
484 fHistCorJetPt->Fill(jetPt);
486 if(jet->Pt() > fJetHIpt) {
487 if(!fTracksCont || !fCaloClustersCont) return kTRUE;
491 Float_t DCAxy = -999;
496 Int_t NumbCluster = -999;
497 NumbCluster = fCaloClustersCont->GetNClusters();
498 Double_t JetQA[5] = {Njets, jet->GetNumberOfTracks(), jet->GetNumberOfClusters(),jet->Eta(), jet->Phi()};
499 fhnJetQA->Fill(JetQA);
501 //***********************************************
502 //****************Track Matched to Closest Cluster
505 for(int iCluster = 0; iCluster <= NumbCluster; iCluster++){
506 //Get closest track to cluster to track matching!!!!!
507 //AliVCluster *cluster = fCaloClustersCont->GetNextAcceptedCluster(iCluster);
508 AliVCluster *cluster = fCaloClustersCont->GetCluster(iCluster);
510 if(! IsJetCluster(jet, iCluster, kFALSE)) continue;
513 TLorentzVector nPart;
514 cluster->GetMomentum(nPart, fVertex);
515 //fHistClustersPt[fCentBin]->Fill(nPart.Pt());
516 Double_t fclusE = -999;
517 fclusE = cluster->E();
520 cluster->GetPosition(pos); // Get cluster position
524 AliVTrack *mt = NULL;
525 //AliESDtrack *mt = NULL;
526 AliESDtrack *ESDmt = NULL;
527 AliAODCaloCluster *acl = dynamic_cast<AliAODCaloCluster*>(cluster);
530 //mt = static_cast<AliVTrack*>(acl->GetTrackMatched(0));
534 AliESDCaloCluster *ecl = dynamic_cast<AliESDCaloCluster*>(cluster);
535 Int_t im = ecl->GetTrackMatchedIndex();
537 if(fTracksCont && im>=0) {
538 //mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
539 mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
542 ESDmt = static_cast<AliESDtrack*>(mt);
545 Double_t pcluster = mt->P();
546 //Double_t esdp = ESDmt->P();
547 //Int_t LabelNumb, IDNumb;
548 //LabelNumb = ESDmt->GetLabel();
549 //IDNumb= ESDmt -> GetID();
551 dEdx = mt->GetTPCsignal();
552 Double_t p = mt->P();
554 //nsigpion = fPIDResponse->NumberOfSigmasTPC(mt,AliPID::kPion);
555 Double_t nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(mt,AliPID::kElectron);
556 Double_t nSigmaElectron_TOF = fPIDResponse->NumberOfSigmasTOF(mt,AliPID::kElectron);
557 dEdx = mt->GetTPCsignal();
558 ESDmt->GetImpactParameters(DCAxy, DCAz);
560 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()};
561 fhnPIDHF->Fill(HF_tracks); // fill Sparse Histo with trigger entries
569 AliPicoTrack::GetEtaPhiDiff(mt, cluster, dphi, deta);
570 fHistPtDEtaDPhiClusTrack->Fill(nPart.Pt(),deta,dphi);
576 //cluster = fCaloClustersCont->GetNextAcceptCluster();
577 //if(! IsJetCluster(jet, cluster, kFALSE)) continue;
581 Double_t p = mt->P();
583 cluster->GetPosition(pos); // Get cluster position
584 //AliESDtrack *trackESD = fESD->GetTrack(Ntracks);
586 // nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(mt,AliPID::kElectron);
587 // nSigmaElectron_TOF= fPIDResponse->NumberOfSigmasTOF(mt,AliPID::kElectron);
591 //if(!fesdTrackCuts->AcceptTrack(mt)) continue;
592 //dEdx = mt->GetTPCsignal();
593 //mt->GetImpactParameters(DCAxy, DCAz);
594 //nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(trackESD,AliPID::kElectron);
595 //nSigmaElectron_TOF = fPIDResponse->NumberOfSigmasTOF(trackESD,AliPID::kElectron);
598 //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()};
599 //fhnPIDHF->Fill(HF_tracks); // fill Sparse Histo with trigger entries
601 //cluster = fCaloClustersCont->GetNextAcceptCluster();
602 //if(! IsJetCluster(jet, cluster, kFALSE)) continue;
605 //AliESDtrack *ESDacceptedTrack = NULL;
608 //******************************Cluster Matched To Closest Track
609 //**************************************************************
612 Int_t NumbTrackContainer = -999;
613 NumbTrackContainer = fTracksCont->GetNParticles();
614 for(int iTracks = 0; iTracks <= NumbTrackContainer; iTracks++){
615 AliVTrack *AcceptedTrack =static_cast<AliVTrack*>(fTracksCont->GetParticle(iTracks));
617 AliError(Form("Couldn't get AliVTrack Container %d\n", iTracks));
620 if(!IsJetTrack(jet,iTracks,kFALSE))continue;
621 //Get matched cluster
622 Int_t emc1 = AcceptedTrack->GetEMCALcluster();
624 Double_t acceptTrackP = AcceptedTrack->P();
625 Double_t acceptTrackPt = AcceptedTrack->Pt();
626 Double_t acceptTrackEta = AcceptedTrack->Eta();
627 Double_t acceptTrackPhi = AcceptedTrack->Phi();
628 Double_t nSigmaElectron_TPC_at = fPIDResponse->NumberOfSigmasTPC(AcceptedTrack,AliPID::kElectron);
629 Double_t nSigmaElectron_TOF_at = fPIDResponse->NumberOfSigmasTOF(AcceptedTrack,AliPID::kElectron);
632 AliESDtrack *ESDacceptedTrack = static_cast<AliESDtrack*>(AcceptedTrack);
634 if(!ESDacceptedTrack){
635 AliError(Form("Couldn't get AliESDTrack %d\n", iTracks));
638 //Double_t DCAxy_at, DCAz_at;
639 Double_t dEdxat = AcceptedTrack->GetTPCsignal();
640 //ESDacceptedTrack->GetImpactParameters(DCAxy_at, DCAz_at);
643 if(fCaloClustersCont && emc1>=0) {
644 AliVCluster *clusMatch = fCaloClustersCont->GetCluster(emc1);
646 AliError(Form("Couldn't get matched AliVCluster %d\n", emc1));
652 Double_t mClusterE = clusMatch->E();
654 clusMatch->GetPosition(pos_mc); // Get cluster position
655 TVector3 mcp(pos_mc);
656 Double_t EovP_mc = -999;
657 EovP_mc = mClusterE/acceptTrackP;
658 //MV: removed to avoid compiler warnings
659 // if(EovP_mc < 0.2){
660 // bkgrnd1 = kTRUE; //Hadron Background
663 //Code without meaning:
664 //if(0.8 < EovP_mc < 1.2){
665 // if(-1.5<nSigmaElectron_TPC_at<5.0){
666 // if(4.0<acceptTrackPt<10.0){
669 // if(EovP_mc >0.8 && EovP_mc<1.2){
670 // if(nSigmaElectron_TPC_at>-1.5 && nSigmaElectron_TPC_at<5.0){
671 // if(acceptTrackPt>4.0 && acceptTrackPt<10.0){
672 // sig1 = kTRUE; //Electron Candidate
677 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()};
678 fhnPIDHFTtoC->Fill(HF_tracks2); // fill Sparse Histo with trigger entries
680 //AcceptedTrack = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle());
682 } //loop over tracks for matching to closest cluster
687 } // highest pt jet cut
690 if(bkgrnd1 == kTRUE) {
691 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kBckgrd1;
692 jet->AddFlavourTag(tag);
694 if(sig1 == kTRUE && !bkgrnd1){
695 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kSig1;
696 jet->AddFlavourTag(tag);
699 } // LOOP over JETS in event
703 if(fGlobalQA == 1) CheckClusTrackMatchingQA();
708 //________________________________________________________________________
709 void AliAnalysisTaskEmcalJetHF::Terminate(Option_t *)
711 cout<<"###########################"<<endl;
712 cout<<"#### Task Finished ####"<<endl;
713 cout<<"###########################"<<endl;
714 cout<<"###########################"<<endl;
715 } // end of terminate
718 //________________________________________________________________________
719 void AliAnalysisTaskEmcalJetHF::CheckClusTrackMatchingQA()
722 if(!fTracksCont || !fCaloClustersCont) return;
724 Int_t trkcounter = 0;
725 Int_t cluscounter = 0;
729 //Get closest cluster to track
730 AliVTrack *track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle(0));
732 //if(!track) continue;
733 AliESDtrack *ESDtrackQA1 = static_cast<AliESDtrack*>(track);
734 if(!ESDtrackQA1) continue;
735 if(!fPIDResponse) continue;
736 Double_t pQA1 = track->P();
737 Double_t nSigmaElectron_TPC_QA1 = fPIDResponse->NumberOfSigmasTPC(ESDtrackQA1,AliPID::kElectron);
738 Double_t nSigmaElectron_TOF_QA1 = fPIDResponse->NumberOfSigmasTOF(ESDtrackQA1,AliPID::kElectron);
739 Double_t dEdxQA1 = ESDtrackQA1->GetTPCsignal();
740 //Get matched cluster
741 Int_t emc1 = track->GetEMCALcluster();
742 if(fCaloClustersCont && emc1>=0) {
743 AliVCluster *clusMatch = fCaloClustersCont->GetCluster(emc1);
744 //if(!clusMatch) continue;
746 Double_t ClusterE_QA1 = clusMatch->E();
747 Double_t EovPQA1 = ClusterE_QA1/pQA1;
749 clusMatch->GetPosition(pos_mc1); // Get cluster position
750 TVector3 mc1(pos_mc1);
751 fHistnSigElecPt->Fill(nSigmaElectron_TPC_QA1,track->Pt());
752 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()};
753 fhnTrackClusterQA->Fill(HF_tracks3);
754 AliPicoTrack::GetEtaPhiDiff(track, clusMatch, dphi, deta);
755 fHistPtDEtaDPhiTrackClus->Fill(track->Pt(),deta,dphi);
761 track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle());
765 //Get closest track to cluster
766 AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0);
768 if(!cluster) continue;
770 Double_t ClusterE_QA2 = cluster->E();
771 //Double_t EovPQA1 = ClusterE_QA1/pQA1;
773 cluster->GetPosition(pos_mc2); // Get cluster position
774 TVector3 mc2(pos_mc2);
776 TLorentzVector nPart;
777 cluster->GetMomentum(nPart, fVertex);
780 AliVTrack *mt = NULL;
781 AliAODCaloCluster *acl = dynamic_cast<AliAODCaloCluster*>(cluster);
784 if(acl->GetNTracksMatched()>1)
785 mt = static_cast<AliVTrack*>(acl->GetTrackMatched(0));
787 AliESDtrack *ESDtrackQA2 = static_cast<AliESDtrack*>(mt);
788 if(!ESDtrackQA2) continue;
789 Double_t nSigmaElectron_TPC_QA2 = fPIDResponse->NumberOfSigmasTPC(ESDtrackQA1,AliPID::kElectron);
790 Double_t nSigmaElectron_TOF_QA2 = fPIDResponse->NumberOfSigmasTOF(ESDtrackQA1,AliPID::kElectron);
791 Double_t dEdxQA1 = ESDtrackQA2->GetTPCsignal();
792 Double_t EovPQA2 = -999;
793 Double_t pQA2 = mt->P();
794 EovPQA2 = ClusterE_QA2/pQA2;
796 //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()};
797 //fhnClusterTrackQA->Fill(HF_tracks4);
800 AliESDCaloCluster *ecl = dynamic_cast<AliESDCaloCluster*>(cluster);
802 Int_t im = ecl->GetTrackMatchedIndex();
803 if(fTracksCont && im>=0) {
804 mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
808 AliPicoTrack::GetEtaPhiDiff(mt, cluster, dphi, deta);
809 fHistPtDEtaDPhiClusTrack->Fill(nPart.Pt(),deta,dphi);
810 cluster = fCaloClustersCont->GetNextAcceptCluster();
815 //Get closest track to cluster
816 AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0);
819 AliError(Form("Couldn't get CtoT AliCluster Container"));
822 Double_t ClusterE_QA2 = cluster->E();
824 cluster->GetPosition(pos_mc2); // Get cluster position
825 TVector3 mc2(pos_mc2);
826 TLorentzVector nPart;
827 cluster->GetMomentum(nPart, fVertex);
829 AliVTrack *mt = NULL;
830 AliESDCaloCluster *ecl = dynamic_cast<AliESDCaloCluster*>(cluster);
832 AliError(Form("Couldn't get CtoT AliESDCluster Container %d\n"));
835 Int_t im = ecl->GetTrackMatchedIndex();
836 if(fTracksCont && im>=0) {
837 //mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
839 //AliError(Form("Couldn't get CT AliVTrack Container %d\n",im));
842 //AliPicoTrack::GetEtaPhiDiff(mt, cluster, dphi, deta);
843 fHistPtDEtaDPhiClusTrack->Fill(nPart.Pt(),deta,dphi);
844 AliESDtrack *ESDtrackQA2 = static_cast<AliESDtrack*>(mt);
846 AliError(Form("Couldn't get CT AliESDTrack Container %d\n"));
849 Double_t nSigmaElectron_TPC_QA2 = fPIDResponse->NumberOfSigmasTPC(ESDtrackQA2,AliPID::kElectron);
850 Double_t nSigmaElectron_TOF_QA2 = fPIDResponse->NumberOfSigmasTOF(ESDtrackQA2,AliPID::kElectron);
851 Double_t dEdxQA1 = ESDtrackQA2->GetTPCsignal();
852 Double_t EovPQA2 = -999;
853 Double_t pQA2 = mt->P();
854 EovPQA2 = ClusterE_QA2/pQA2;
858 //cluster = fCaloClustersCont->GetNextAcceptCluster();
859 cluster = static_cast<AliVCluster*>(fCaloClustersCont->GetNextAcceptCluster());
865 //________________________________________________________________________
866 Int_t AliAnalysisTaskEmcalJetHF::AcceptMyJet(AliEmcalJet *jet) {
867 //applies all jet cuts except pt
868 if ((jet->Phi()<fPhimin)||(jet->Phi()>fPhimax)) return 0;
869 if ((jet->Eta()<fEtamin)||(jet->Eta()>fEtamax)) return 0;
870 if (jet->Area()<fAreacut) return 0;
871 // prevents 0 area jets from sneaking by when area cut == 0
872 if (jet->Area()==0) return 0;
873 //exclude jets with extremely high pt tracks which are likely misreconstructed
874 if(jet->MaxTrackPt()>100) return 0;
876 //passed all above cuts
880 //________________________________________________________________________
881 Int_t AliAnalysisTaskEmcalJetHF::GetCentBin(Double_t cent) const
882 { // Get centrality bin.
885 if (cent>=0 && cent<10)
887 else if (cent>=10 && cent<20)
889 else if (cent>=20 && cent<30)
891 else if (cent>=30 && cent<40)
893 else if (cent>=40 && cent<50)
895 else if (cent>=50 && cent<90)
900 //________________________________________________________________________________
902 void AliAnalysisTaskEmcalJetHF::FlagFlavour(AliEmcalJet *jet){
904 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kDStar;
905 if (fCandidateType==kD0toKpi) tag=AliEmcalJet::kD0;
906 if (fIsDInJet) jet->AddFlavourTag(tag);
912 //____________________________________________________________________________________________
913 THnSparse* AliAnalysisTaskEmcalJetHF::NewTHnSparseDHF(const char* name, UInt_t entries)
915 // generate new THnSparseD PID, axes are defined in GetDimParams()
917 UInt_t tmp = entries;
920 tmp = tmp &~ -tmp; // clear lowest bit
923 TString hnTitle(name);
924 const Int_t dim = count;
931 while(c<dim && i<32){
935 GetDimParamsHF(i, label, nbins[c], xmin[c], xmax[c]);
936 hnTitle += Form(";%s",label.Data());
944 return new THnSparseD(name, hnTitle.Data(), dim, nbins, xmin, xmax);
945 } // end of NewTHnSparseF PID
947 THnSparse* AliAnalysisTaskEmcalJetHF::NewTHnSparseDJetQA(const char* name, UInt_t entries)
949 // generate new THnSparseD JetQA, axes are defined in GetDimParamsJetQA()
951 UInt_t tmp = entries;
954 tmp = tmp &~ -tmp; // clear lowest bit
957 TString hnTitle(name);
958 const Int_t dim = count;
965 while(c<dim && i<32){
969 GetDimParamsJetQA(i, label, nbins[c], xmin[c], xmax[c]);
970 hnTitle += Form(";%s",label.Data());
978 return new THnSparseD(name, hnTitle.Data(), dim, nbins, xmin, xmax);
979 } // end of NewTHnSparseF JetQA
982 void AliAnalysisTaskEmcalJetHF::GetDimParamsHF(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
984 // stores label and binning of axis for THnSparse
985 const Double_t pi = TMath::Pi();
990 label = "V0 centrality (%)";
997 label = "Track p_{T}";
1011 label = "Track Eta";
1018 label = "Track Phi";
1025 label = "E/p of track";
1046 label = "dEdX of track - TPC";
1053 label = "nSigma electron TPC";
1060 label = "nSigma electron TOF";
1067 label = "nSigma electron Emcal";
1095 label = "Cluster Energy";
1102 label = "Cluster Eta";
1109 label = "Cluster Phi";
1118 } // end of getting dim-params
1120 void AliAnalysisTaskEmcalJetHF::GetDimParamsJetQA(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1122 // stores label and binning of axis for THnSparse
1123 const Double_t pi = TMath::Pi();
1128 label = "number of Jets in Event";
1135 label = "number of Clusters in a Jet";
1142 label = "number of Tracks in a Jet";
1163 label = "Cluster Energy";
1170 label = "Cluster Eta";
1177 label = "Cluster Phi";
1184 label = "Is EMCalCluster";
1191 label = "Number of Matched Tracks to Cluster";
1205 label = "Track Eta";
1219 label="Is Track EMCal";
1226 label = "Get Track EMCal Cluster";
1233 label = "Track Matched Phi";
1242 } // end of getting dim-params