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"
73 ClassImp(AliAnalysisTaskEmcalJetHF)
75 //________________________________________________________________________
76 AliAnalysisTaskEmcalJetHF::AliAnalysisTaskEmcalJetHF() :
77 AliAnalysisTaskEmcalJet("heavyF",kFALSE),
80 fEventTrigEMCALL1Gamma1(0),
81 fEventTrigEMCALL1Gamma2(0),
85 fPhimin(-10), fPhimax(10),
86 fEtamin(-0.9), fEtamax(0.9),
93 fPIDResponse(0x0), fTPCResponse(),
94 fEsdtrackCutsITSTPC(),
97 fJetsCont(0), fTracksCont(0), fCaloClustersCont(0), fTracksJetCont(0), fCaloClustersJetCont(0),
101 fHistCorJetPt(0), fHistJetPt(0),
104 fHistnJetTrackvnJetClusters(0),
105 fHistPtDEtaDPhiTrackClus(0),
106 fHistPtDEtaDPhiClusTrack(0),
107 fhnPIDHF(0x0), fhnJetQA(0x0), fhnClusterTrackQA(0x0), fhnTrackClusterQA(0x0), fhnPIDHFTtoC(0x0)
109 // Default constructor.
110 for (Int_t i = 0;i<6;++i){
111 fHistJetPtvsTrackPt[i] = 0;
119 SetMakeGeneralHistograms(kTRUE);
123 //________________________________________________________________________
124 AliAnalysisTaskEmcalJetHF::AliAnalysisTaskEmcalJetHF(const char *name) :
125 AliAnalysisTaskEmcalJet(name,kTRUE),
128 fEventTrigEMCALL1Gamma1(0),
129 fEventTrigEMCALL1Gamma2(0),
133 fPhimin(-10), fPhimax(10),
134 fEtamin(-0.9), fEtamax(0.9),
141 fPIDResponse(0x0), fTPCResponse(),
142 fEsdtrackCutsITSTPC(),
145 fJetsCont(0), fTracksCont(0), fCaloClustersCont(0), fTracksJetCont(0), fCaloClustersJetCont(0),
149 fHistCorJetPt(0), fHistJetPt(0),
152 fHistnJetTrackvnJetClusters(0),
153 fHistPtDEtaDPhiTrackClus(0),
154 fHistPtDEtaDPhiClusTrack(0),
155 fhnPIDHF(0x0), fhnJetQA(0x0), fhnClusterTrackQA(0x0), fhnTrackClusterQA(0x0), fhnPIDHFTtoC(0x0)
157 for (Int_t i = 0;i<6;++i){
158 fHistJetPtvsTrackPt[i] = 0;
165 SetMakeGeneralHistograms(kTRUE);
167 DefineInput(0,TChain::Class());
168 DefineOutput(1, TList::Class());
171 //_______________________________________________________________________
172 AliAnalysisTaskEmcalJetHF::~AliAnalysisTaskEmcalJetHF()
182 //________________________________________________________________________
183 void AliAnalysisTaskEmcalJetHF::UserCreateOutputObjects()
187 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
189 //fJetsCont = GetJetContainer(0);
190 if(fJetsCont) { //get particles and clusters connected to jets
191 fTracksJetCont = fJetsCont->GetParticleContainer();
192 fCaloClustersJetCont = fJetsCont->GetClusterContainer();
194 else { //no jets, just analysis tracks and clusters
195 fTracksCont = GetParticleContainer(0);
196 fCaloClustersCont = GetClusterContainer(0);
198 fTracksCont->SetClassName("AliVTrack");
199 fCaloClustersCont->SetClassName("AliVCluster");
201 fHistJetPhi = new TH1F("NjetvsPhi", "NjetvsPhi", 288,-2*TMath::Pi(),2*TMath::Pi());
202 fHistJetPt = new TH1F("NjetvsJetPt", "NjetvsJetPt", 300, 0, 300);
203 fOutput->Add(fHistJetPhi);
204 fOutput->Add(fHistJetPt);
210 fHistRhovsCent = new TH2F("RhovsCent", "RhovsCent", 100, 0.0, 100.0, 400, 0, 400);
211 fHistCorJetPt = new TH1F("NjetvsCorrJetPt", "NjetvsCorrJetPt", 300, -100, 200);
212 fHistnSigElecPt = new TH2F("nsig_v_pt(TPC)","nsig_v_pt(TPC)",200,0,100,100,-10,10);
213 fHistnJetTrackvnJetClusters = new TH2F("NumbJetTracksvJetClusters","NumbJetTracksvJetClusters",21,0,20,21,0,20);
214 fHistHighJetPt = new TH1F("HighestPtJetPerEvent","HighJetPt",300,0,150);
216 histname = "fHistPtDEtaDPhiTrackClus";
217 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);
218 fOutput->Add(fHistPtDEtaDPhiTrackClus);
220 histname = "fHistPtDEtaDPhiClusTrack";
221 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);
222 fOutput->Add(fHistPtDEtaDPhiClusTrack);
224 // PT bins used to be (2000, -100, 300)
228 // creating centrality dependent histos that don't involve Global Rho
229 for (Int_t i = 0;i<6;++i){
230 name = TString(Form("JetPtvsTrackPt_%i",i));
231 title = TString(Form("Jet pT vs Leading Track pT cent bin %i",i));
232 fHistJetPtvsTrackPt[i] = new TH2F(name,title, 500, -100, 400, 100,0,100);
233 fOutput->Add(fHistJetPtvsTrackPt[i]);
235 name = TString(Form("TrackPt_%i",i));
236 title = TString(Form("Track pT cent bin %i",i));
237 fHistTrackPt[i] = new TH1F(name,title,400,0,200);
238 fOutput->Add(fHistTrackPt[i]);
240 name = TString(Form("EP0_%i",i));
241 title = TString(Form("EP VZero cent bin %i",i));
242 fHistEP0[i] = new TH1F(name,title,144,-TMath::Pi(),TMath::Pi());
243 fOutput->Add(fHistEP0[i]);
245 name = TString(Form("EP0A_%i",i));
246 title = TString(Form("EP VZero cent bin %i",i));
247 fHistEP0A[i] = new TH1F(name,title,144,-TMath::Pi(),TMath::Pi());
248 fOutput->Add(fHistEP0A[i]);
250 name = TString(Form("EP0C_%i",i));
251 title = TString(Form("EP VZero cent bin %i",i));
252 fHistEP0C[i] = new TH1F(name,title,144,-TMath::Pi(),TMath::Pi());
253 fOutput->Add(fHistEP0C[i]);
255 name = TString(Form("EPAvsC_%i",i));
256 title = TString(Form("EP VZero cent bin %i",i));
257 fHistEPAvsC[i] = new TH2F(name,title,144,-TMath::Pi(),TMath::Pi(),100,-TMath::Pi(),TMath::Pi());
258 fOutput->Add(fHistEPAvsC[i]);
262 fOutput->Add(fHistRhovsCent);
263 fOutput->Add(fHistCorJetPt);
264 fOutput->Add(fHistnSigElecPt);
265 fOutput->Add(fHistnJetTrackvnJetClusters);
266 fOutput->Add(fHistHighJetPt);
269 // ****************************** PID *****************************************************
270 // set up PID handler
271 AliAnalysisManager *man=AliAnalysisManager::GetAnalysisManager();
272 AliInputEventHandler* inputHandler = (AliInputEventHandler*) (man->GetInputEventHandler());
274 AliFatal("Input handler needed");
278 // PID response object
279 //fPIDResponse = (AliPIDResponse*)inputHandler->GetPIDResponse();
280 // inputHandler->CreatePIDResponse(fIsMC); // needed to create object, why though?
281 fPIDResponse = inputHandler->GetPIDResponse();
283 AliError("PIDResponse object was not created");
286 // ****************************************************************************************
287 UInt_t bitcoded = 0; // bit coded, see GetDimParamsPID() below
288 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;
289 fhnPIDHF = NewTHnSparseDHF("fhnPIDHFCtoT", bitcoded);
291 UInt_t bitcoded1 = 0; // bit coded, see GetDimParamsPID() below
292 bitcoded1 = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4;
293 fhnJetQA = NewTHnSparseDJetQA("fhnJetQA", bitcoded1);
295 UInt_t bitcoded2 = 0; // bit coded, see GetDimParamsPID() below
296 bitcoded2 = 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<8 | 1<<9 | 1<<10 | 1<<15 | 1<<16 | 1<<17;
297 fhnClusterTrackQA = NewTHnSparseDHF("fhnClusterTrackQA", bitcoded2);
299 UInt_t bitcoded3 = 0; // bit coded, see GetDimParamsPID() below
300 bitcoded3 = 1<<1 | 1<<2 | 1<<3 | 1<<4 | 1<<5 | 1<<8 | 1<<9 | 1<<10 | 1<<15 | 1<<16 | 1<<17;
301 fhnTrackClusterQA = NewTHnSparseDHF("fhnTrackClusterQA", bitcoded3);
303 UInt_t bitcoded7 = 0; // bit coded, see GetDimParamsPID() below
304 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;
305 fhnPIDHFTtoC = NewTHnSparseDHF("fhnPIDHFTtoC", bitcoded7);
307 cout << "_______________Created Sparse__________________" << endl;
309 fOutput->Add(fhnPIDHF);
310 fOutput->Add(fhnJetQA);
311 fOutput->Add(fhnClusterTrackQA);
312 fOutput->Add(fhnTrackClusterQA);
313 fOutput->Add(fhnPIDHFTtoC);
315 PostData(1, fOutput);
319 //________________________________________________________
320 void AliAnalysisTaskEmcalJetHF::ExecOnce()
322 // Initialize the analysis
323 AliAnalysisTaskEmcalJet::ExecOnce();
325 if (fJetsCont && fJetsCont->GetArray() == 0) fJetsCont = 0;
326 if (fTracksCont && fTracksCont->GetArray() == 0) fTracksCont = 0;
327 if (fCaloClustersCont && fCaloClustersCont->GetArray() == 0) fCaloClustersCont = 0;
332 //________________________________________________________________________
333 Bool_t AliAnalysisTaskEmcalJetHF::Run()
335 // check to see if we have any tracks
336 if (!fTracks) return kTRUE;
337 if (!fJets) return kTRUE;
339 // what kind of event do we have: AOD or ESD?
341 if (dynamic_cast<AliAODEvent*>(InputEvent())) useAOD = kTRUE;
342 else useAOD = kFALSE;
344 fEventTrigEMCALL1Gamma1 = kFALSE;
345 fEventTrigEMCALL1Gamma2 = kFALSE;
347 // if we have ESD event, set up ESD object
349 fESD = dynamic_cast<AliESDEvent*>(InputEvent());
351 AliError(Form("ERROR: fESD not available\n"));
356 // if we have AOD event, set up AOD object
358 fAOD = dynamic_cast<AliAODEvent*>(InputEvent());
360 AliError(Form("ERROR: fAOD not available\n"));
365 // get magnetic field info for DCA
366 Double_t MagF = fESD->GetMagneticField();
367 Double_t MagSign = 1.0;
368 if(MagF<0)MagSign = -1.0;
369 // set magnetic field
370 if (!TGeoGlobalMagField::Instance()->GetField()) {
371 AliMagF* field = new AliMagF("Maps","Maps", MagSign, MagSign, AliMagF::k5kG);
372 TGeoGlobalMagField::Instance()->SetField(field);
375 // get centrality bin
376 Int_t centbin = GetCentBin(fCent);
377 //for pp analyses we will just use the first centrality bin
378 if (centbin == -1) centbin = 0;
380 // get vertex information
381 Double_t fvertex[3]={0,0,0};
382 InputEvent()->GetPrimaryVertex()->GetXYZ(fvertex);
383 //Double_t zVtx=fvertex[2];
385 // create pointer to list of input event
386 TList *list = InputEvent()->GetList();
388 AliError(Form("ERROR: list not attached\n"));
392 // background density
393 fRhoVal = fRho->GetVal();
395 // initialize TClonesArray pointers to jets and tracks
396 TClonesArray *jets = 0;
397 //TClonesArray *tracks = 0;
398 //TClonesArray *clusters = 0;
399 //TClonesArray * clusterList = 0;
402 jets = dynamic_cast<TClonesArray*>(list->FindObject(fJets));
404 AliError(Form("Pointer to jets %s == 0", fJets->GetName()));
406 } // verify existence of jets
409 //cout<<"Event #: "<<event<<" Number of Clusters: "<<fCaloClustersCont->GetNClusters()<<" Number of Tracks: "<<fTracksCont->GetNParticles()<<endl;
411 // Int_t nclusters = fInputEvent->GetNumberOfCaloClusters();
414 // get number of jets and tracks
415 const Int_t Njets = jets->GetEntries();
416 if(Njets<1) return kTRUE;
419 AliVTrack *track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle(0));
421 track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle());
424 if (fCaloClustersCont) {
425 AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0);
427 TLorentzVector nPart;
428 cluster->GetMomentum(nPart, fVertex);
429 cluster = fCaloClustersCont->GetNextAcceptCluster();
433 // Start Jet Analysis
434 // initialize jet parameters
436 Double_t highestjetpt=0.0;
438 // loop over jets in an event - to find highest jet pT and apply some cuts && JetQA Sparse
439 for (Int_t ijet = 0; ijet < Njets; ijet++){
441 AliEmcalJet *jet = static_cast<AliEmcalJet*>(jets->At(ijet));
445 if(!AcceptMyJet(jet)) continue;
449 if(highestjetpt<jet->Pt()){
451 highestjetpt=jet->Pt();
453 } // end of looping over jets
455 fHistHighJetPt->Fill(ijethi);
456 // **********************************************************************
458 // **********************************************************************
460 // loop over jets in the event and make appropriate cuts
461 for (Int_t iJets = 0; iJets < Njets; ++iJets) {
462 AliEmcalJet *jet = static_cast<AliEmcalJet*>(fJets->At(iJets));
463 if (!jet) // see if we have a jet
466 // phi of jet, constrained to 1.6 < Phi < 2.94
467 float jetphi = jet->Phi(); // phi of jet
469 if(!AcceptMyJet(jet)) continue;
471 //AliEmcalJet::EFlavourTag tag=AliEmcalJet::kDStar;
472 //jet->AddFlavourTag(tag);
474 //MV: removed to avoid compiler warnings
475 // Bool_t bkgrnd1 = kFALSE;
476 // Bool_t sig1 = kFALSE;
478 Int_t JetClusters = jet->GetNumberOfClusters();
479 Int_t JetTracks = jet -> GetNumberOfTracks();
480 fHistnJetTrackvnJetClusters->Fill(JetClusters,JetTracks);
481 // Initializations and Calculations
482 Double_t jetptraw = jet->Pt(); // raw pT of jet
483 Double_t jetPt = -500; // initialize corr jet pt LOCAL
484 Double_t jetarea = -500; // initialize jet area
485 jetarea = jet->Area(); // jet area
486 jetPt = jet->Pt() - jetarea*fRhoVal; // semi-corrected pT of jet from GLOBAL rho value
487 fHistCorJetPt->Fill(jetPt);
489 if(jet->Pt() > fJetHIpt) {
490 if(!fTracksCont || !fCaloClustersCont) return kTRUE;
494 Float_t DCAxy = -999;
499 Int_t NumbCluster = -999;
500 NumbCluster = fCaloClustersCont->GetNClusters();
501 Double_t JetQA[5] = {static_cast<Double_t>(Njets), static_cast<Double_t>(jet->GetNumberOfTracks()), static_cast<Double_t>(jet->GetNumberOfClusters()),jet->Eta(), jet->Phi()};
502 fhnJetQA->Fill(JetQA);
504 //***********************************************
505 //****************Track Matched to Closest Cluster
508 for(int iCluster = 0; iCluster <= NumbCluster; iCluster++){
509 //Get closest track to cluster to track matching!!!!!
510 //AliVCluster *cluster = fCaloClustersCont->GetNextAcceptedCluster(iCluster);
511 AliVCluster *cluster = fCaloClustersCont->GetCluster(iCluster);
513 if(! IsJetCluster(jet, iCluster, kFALSE)) continue;
516 TLorentzVector nPart;
517 cluster->GetMomentum(nPart, fVertex);
518 //fHistClustersPt[fCentBin]->Fill(nPart.Pt());
519 Double_t fclusE = -999;
520 fclusE = cluster->E();
523 cluster->GetPosition(pos); // Get cluster position
527 AliVTrack *mt = NULL;
528 //AliESDtrack *mt = NULL;
529 AliESDtrack *ESDmt = NULL;
530 AliAODCaloCluster *acl = dynamic_cast<AliAODCaloCluster*>(cluster);
533 //mt = static_cast<AliVTrack*>(acl->GetTrackMatched(0));
537 AliESDCaloCluster *ecl = dynamic_cast<AliESDCaloCluster*>(cluster);
538 Int_t im = ecl->GetTrackMatchedIndex();
540 if(fTracksCont && im>=0) {
541 //mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
542 mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
545 ESDmt = static_cast<AliESDtrack*>(mt);
548 Double_t pcluster = mt->P();
549 //Double_t esdp = ESDmt->P();
550 //Int_t LabelNumb, IDNumb;
551 //LabelNumb = ESDmt->GetLabel();
552 //IDNumb= ESDmt -> GetID();
554 dEdx = mt->GetTPCsignal();
555 Double_t p = mt->P();
557 //nsigpion = fPIDResponse->NumberOfSigmasTPC(mt,AliPID::kPion);
558 Double_t nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(mt,AliPID::kElectron);
559 Double_t nSigmaElectron_TOF = fPIDResponse->NumberOfSigmasTOF(mt,AliPID::kElectron);
560 dEdx = mt->GetTPCsignal();
561 ESDmt->GetImpactParameters(DCAxy, DCAz);
563 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()};
564 fhnPIDHF->Fill(HF_tracks); // fill Sparse Histo with trigger entries
572 AliPicoTrack::GetEtaPhiDiff(mt, cluster, dphi, deta);
573 fHistPtDEtaDPhiClusTrack->Fill(nPart.Pt(),deta,dphi);
579 //cluster = fCaloClustersCont->GetNextAcceptCluster();
580 //if(! IsJetCluster(jet, cluster, kFALSE)) continue;
584 Double_t p = mt->P();
586 cluster->GetPosition(pos); // Get cluster position
587 //AliESDtrack *trackESD = fESD->GetTrack(Ntracks);
589 // nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(mt,AliPID::kElectron);
590 // nSigmaElectron_TOF= fPIDResponse->NumberOfSigmasTOF(mt,AliPID::kElectron);
594 //if(!fesdTrackCuts->AcceptTrack(mt)) continue;
595 //dEdx = mt->GetTPCsignal();
596 //mt->GetImpactParameters(DCAxy, DCAz);
597 //nSigmaElectron_TPC = fPIDResponse->NumberOfSigmasTPC(trackESD,AliPID::kElectron);
598 //nSigmaElectron_TOF = fPIDResponse->NumberOfSigmasTOF(trackESD,AliPID::kElectron);
601 //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()};
602 //fhnPIDHF->Fill(HF_tracks); // fill Sparse Histo with trigger entries
604 //cluster = fCaloClustersCont->GetNextAcceptCluster();
605 //if(! IsJetCluster(jet, cluster, kFALSE)) continue;
608 //AliESDtrack *ESDacceptedTrack = NULL;
611 //******************************Cluster Matched To Closest Track
612 //**************************************************************
615 Int_t NumbTrackContainer = -999;
616 NumbTrackContainer = fTracksCont->GetNParticles();
617 for(int iTracks = 0; iTracks <= NumbTrackContainer; iTracks++){
618 AliVTrack *AcceptedTrack =static_cast<AliVTrack*>(fTracksCont->GetParticle(iTracks));
620 AliError(Form("Couldn't get AliVTrack Container %d\n", iTracks));
623 if(!IsJetTrack(jet,iTracks,kFALSE))continue;
624 //Get matched cluster
625 Int_t emc1 = AcceptedTrack->GetEMCALcluster();
627 Double_t acceptTrackP = AcceptedTrack->P();
628 Double_t acceptTrackPt = AcceptedTrack->Pt();
629 Double_t acceptTrackEta = AcceptedTrack->Eta();
630 Double_t acceptTrackPhi = AcceptedTrack->Phi();
631 Double_t nSigmaElectron_TPC_at = fPIDResponse->NumberOfSigmasTPC(AcceptedTrack,AliPID::kElectron);
632 Double_t nSigmaElectron_TOF_at = fPIDResponse->NumberOfSigmasTOF(AcceptedTrack,AliPID::kElectron);
635 AliESDtrack *ESDacceptedTrack = static_cast<AliESDtrack*>(AcceptedTrack);
637 if(!ESDacceptedTrack){
638 AliError(Form("Couldn't get AliESDTrack %d\n", iTracks));
641 //Double_t DCAxy_at, DCAz_at;
642 Double_t dEdxat = AcceptedTrack->GetTPCsignal();
643 //ESDacceptedTrack->GetImpactParameters(DCAxy_at, DCAz_at);
646 if(fCaloClustersCont && emc1>=0) {
647 AliVCluster *clusMatch = fCaloClustersCont->GetCluster(emc1);
649 AliError(Form("Couldn't get matched AliVCluster %d\n", emc1));
655 Double_t mClusterE = clusMatch->E();
657 clusMatch->GetPosition(pos_mc); // Get cluster position
658 TVector3 mcp(pos_mc);
659 Double_t EovP_mc = -999;
660 EovP_mc = mClusterE/acceptTrackP;
661 //MV: removed to avoid compiler warnings
662 // if(EovP_mc < 0.2){
663 // bkgrnd1 = kTRUE; //Hadron Background
666 //Code without meaning:
667 //if(0.8 < EovP_mc < 1.2){
668 // if(-1.5<nSigmaElectron_TPC_at<5.0){
669 // if(4.0<acceptTrackPt<10.0){
672 // if(EovP_mc >0.8 && EovP_mc<1.2){
673 // if(nSigmaElectron_TPC_at>-1.5 && nSigmaElectron_TPC_at<5.0){
674 // if(acceptTrackPt>4.0 && acceptTrackPt<10.0){
675 // sig1 = kTRUE; //Electron Candidate
680 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()};
681 fhnPIDHFTtoC->Fill(HF_tracks2); // fill Sparse Histo with trigger entries
683 //AcceptedTrack = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle());
685 } //loop over tracks for matching to closest cluster
690 } // highest pt jet cut
693 if(bkgrnd1 == kTRUE) {
694 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kBckgrd1;
695 jet->AddFlavourTag(tag);
697 if(sig1 == kTRUE && !bkgrnd1){
698 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kSig1;
699 jet->AddFlavourTag(tag);
702 } // LOOP over JETS in event
706 if(fGlobalQA == 1) CheckClusTrackMatchingQA();
711 //________________________________________________________________________
712 void AliAnalysisTaskEmcalJetHF::Terminate(Option_t *)
714 cout<<"###########################"<<endl;
715 cout<<"#### Task Finished ####"<<endl;
716 cout<<"###########################"<<endl;
717 cout<<"###########################"<<endl;
718 } // end of terminate
721 //________________________________________________________________________
722 void AliAnalysisTaskEmcalJetHF::CheckClusTrackMatchingQA()
725 if(!fTracksCont || !fCaloClustersCont) return;
727 Int_t trkcounter = 0;
728 Int_t cluscounter = 0;
732 //Get closest cluster to track
733 AliVTrack *track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle(0));
735 //if(!track) continue;
736 AliESDtrack *ESDtrackQA1 = static_cast<AliESDtrack*>(track);
737 if(!ESDtrackQA1) continue;
738 if(!fPIDResponse) continue;
739 Double_t pQA1 = track->P();
740 Double_t nSigmaElectron_TPC_QA1 = fPIDResponse->NumberOfSigmasTPC(ESDtrackQA1,AliPID::kElectron);
741 Double_t nSigmaElectron_TOF_QA1 = fPIDResponse->NumberOfSigmasTOF(ESDtrackQA1,AliPID::kElectron);
742 Double_t dEdxQA1 = ESDtrackQA1->GetTPCsignal();
743 //Get matched cluster
744 Int_t emc1 = track->GetEMCALcluster();
745 if(fCaloClustersCont && emc1>=0) {
746 AliVCluster *clusMatch = fCaloClustersCont->GetCluster(emc1);
747 //if(!clusMatch) continue;
749 Double_t ClusterE_QA1 = clusMatch->E();
750 Double_t EovPQA1 = ClusterE_QA1/pQA1;
752 clusMatch->GetPosition(pos_mc1); // Get cluster position
753 TVector3 mc1(pos_mc1);
754 fHistnSigElecPt->Fill(nSigmaElectron_TPC_QA1,track->Pt());
755 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()};
756 fhnTrackClusterQA->Fill(HF_tracks3);
757 AliPicoTrack::GetEtaPhiDiff(track, clusMatch, dphi, deta);
758 fHistPtDEtaDPhiTrackClus->Fill(track->Pt(),deta,dphi);
764 track = static_cast<AliVTrack*>(fTracksCont->GetNextAcceptParticle());
768 //Get closest track to cluster
769 AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0);
771 if(!cluster) continue;
773 Double_t ClusterE_QA2 = cluster->E();
774 //Double_t EovPQA1 = ClusterE_QA1/pQA1;
776 cluster->GetPosition(pos_mc2); // Get cluster position
777 TVector3 mc2(pos_mc2);
779 TLorentzVector nPart;
780 cluster->GetMomentum(nPart, fVertex);
783 AliVTrack *mt = NULL;
784 AliAODCaloCluster *acl = dynamic_cast<AliAODCaloCluster*>(cluster);
787 if(acl->GetNTracksMatched()>1)
788 mt = static_cast<AliVTrack*>(acl->GetTrackMatched(0));
790 AliESDtrack *ESDtrackQA2 = static_cast<AliESDtrack*>(mt);
791 if(!ESDtrackQA2) continue;
792 Double_t nSigmaElectron_TPC_QA2 = fPIDResponse->NumberOfSigmasTPC(ESDtrackQA1,AliPID::kElectron);
793 Double_t nSigmaElectron_TOF_QA2 = fPIDResponse->NumberOfSigmasTOF(ESDtrackQA1,AliPID::kElectron);
794 Double_t dEdxQA1 = ESDtrackQA2->GetTPCsignal();
795 Double_t EovPQA2 = -999;
796 Double_t pQA2 = mt->P();
797 EovPQA2 = ClusterE_QA2/pQA2;
799 //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()};
800 //fhnClusterTrackQA->Fill(HF_tracks4);
803 AliESDCaloCluster *ecl = dynamic_cast<AliESDCaloCluster*>(cluster);
805 Int_t im = ecl->GetTrackMatchedIndex();
806 if(fTracksCont && im>=0) {
807 mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
811 AliPicoTrack::GetEtaPhiDiff(mt, cluster, dphi, deta);
812 fHistPtDEtaDPhiClusTrack->Fill(nPart.Pt(),deta,dphi);
813 cluster = fCaloClustersCont->GetNextAcceptCluster();
818 //Get closest track to cluster
819 AliVCluster *cluster = fCaloClustersCont->GetNextAcceptCluster(0);
822 AliError(Form("Couldn't get CtoT AliCluster Container"));
825 Double_t ClusterE_QA2 = cluster->E();
827 cluster->GetPosition(pos_mc2); // Get cluster position
828 TVector3 mc2(pos_mc2);
829 TLorentzVector nPart;
830 cluster->GetMomentum(nPart, fVertex);
832 AliVTrack *mt = NULL;
833 AliESDCaloCluster *ecl = dynamic_cast<AliESDCaloCluster*>(cluster);
835 AliError(Form("Couldn't get CtoT AliESDCluster Container %d\n"));
838 Int_t im = ecl->GetTrackMatchedIndex();
839 if(fTracksCont && im>=0) {
840 //mt = static_cast<AliVTrack*>(fTracksCont->GetParticle(im));
842 //AliError(Form("Couldn't get CT AliVTrack Container %d\n",im));
845 //AliPicoTrack::GetEtaPhiDiff(mt, cluster, dphi, deta);
846 fHistPtDEtaDPhiClusTrack->Fill(nPart.Pt(),deta,dphi);
847 AliESDtrack *ESDtrackQA2 = static_cast<AliESDtrack*>(mt);
849 AliError(Form("Couldn't get CT AliESDTrack Container %d\n"));
852 Double_t nSigmaElectron_TPC_QA2 = fPIDResponse->NumberOfSigmasTPC(ESDtrackQA2,AliPID::kElectron);
853 Double_t nSigmaElectron_TOF_QA2 = fPIDResponse->NumberOfSigmasTOF(ESDtrackQA2,AliPID::kElectron);
854 Double_t dEdxQA1 = ESDtrackQA2->GetTPCsignal();
855 Double_t EovPQA2 = -999;
856 Double_t pQA2 = mt->P();
857 EovPQA2 = ClusterE_QA2/pQA2;
861 //cluster = fCaloClustersCont->GetNextAcceptCluster();
862 cluster = static_cast<AliVCluster*>(fCaloClustersCont->GetNextAcceptCluster());
868 //________________________________________________________________________
869 Int_t AliAnalysisTaskEmcalJetHF::AcceptMyJet(AliEmcalJet *jet) {
870 //applies all jet cuts except pt
871 if ((jet->Phi()<fPhimin)||(jet->Phi()>fPhimax)) return 0;
872 if ((jet->Eta()<fEtamin)||(jet->Eta()>fEtamax)) return 0;
873 if (jet->Area()<fAreacut) return 0;
874 // prevents 0 area jets from sneaking by when area cut == 0
875 if (jet->Area()==0) return 0;
876 //exclude jets with extremely high pt tracks which are likely misreconstructed
877 if(jet->MaxTrackPt()>100) return 0;
879 //passed all above cuts
883 //________________________________________________________________________
884 Int_t AliAnalysisTaskEmcalJetHF::GetCentBin(Double_t cent) const
885 { // Get centrality bin.
888 if (cent>=0 && cent<10)
890 else if (cent>=10 && cent<20)
892 else if (cent>=20 && cent<30)
894 else if (cent>=30 && cent<40)
896 else if (cent>=40 && cent<50)
898 else if (cent>=50 && cent<90)
903 //________________________________________________________________________________
905 void AliAnalysisTaskEmcalJetHF::FlagFlavour(AliEmcalJet *jet){
907 AliEmcalJet::EFlavourTag tag=AliEmcalJet::kDStar;
908 if (fCandidateType==kD0toKpi) tag=AliEmcalJet::kD0;
909 if (fIsDInJet) jet->AddFlavourTag(tag);
915 //____________________________________________________________________________________________
916 THnSparse* AliAnalysisTaskEmcalJetHF::NewTHnSparseDHF(const char* name, UInt_t entries)
918 // generate new THnSparseD PID, axes are defined in GetDimParams()
920 UInt_t tmp = entries;
923 tmp = tmp &~ -tmp; // clear lowest bit
926 TString hnTitle(name);
927 const Int_t dim = count;
934 while(c<dim && i<32){
938 GetDimParamsHF(i, label, nbins[c], xmin[c], xmax[c]);
939 hnTitle += Form(";%s",label.Data());
947 return new THnSparseD(name, hnTitle.Data(), dim, nbins, xmin, xmax);
948 } // end of NewTHnSparseF PID
950 THnSparse* AliAnalysisTaskEmcalJetHF::NewTHnSparseDJetQA(const char* name, UInt_t entries)
952 // generate new THnSparseD JetQA, axes are defined in GetDimParamsJetQA()
954 UInt_t tmp = entries;
957 tmp = tmp &~ -tmp; // clear lowest bit
960 TString hnTitle(name);
961 const Int_t dim = count;
968 while(c<dim && i<32){
972 GetDimParamsJetQA(i, label, nbins[c], xmin[c], xmax[c]);
973 hnTitle += Form(";%s",label.Data());
981 return new THnSparseD(name, hnTitle.Data(), dim, nbins, xmin, xmax);
982 } // end of NewTHnSparseF JetQA
985 void AliAnalysisTaskEmcalJetHF::GetDimParamsHF(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
987 // stores label and binning of axis for THnSparse
988 const Double_t pi = TMath::Pi();
993 label = "V0 centrality (%)";
1000 label = "Track p_{T}";
1014 label = "Track Eta";
1021 label = "Track Phi";
1028 label = "E/p of track";
1049 label = "dEdX of track - TPC";
1056 label = "nSigma electron TPC";
1063 label = "nSigma electron TOF";
1070 label = "nSigma electron Emcal";
1098 label = "Cluster Energy";
1105 label = "Cluster Eta";
1112 label = "Cluster Phi";
1121 } // end of getting dim-params
1123 void AliAnalysisTaskEmcalJetHF::GetDimParamsJetQA(Int_t iEntry, TString &label, Int_t &nbins, Double_t &xmin, Double_t &xmax)
1125 // stores label and binning of axis for THnSparse
1126 const Double_t pi = TMath::Pi();
1131 label = "number of Jets in Event";
1138 label = "number of Clusters in a Jet";
1145 label = "number of Tracks in a Jet";
1166 label = "Cluster Energy";
1173 label = "Cluster Eta";
1180 label = "Cluster Phi";
1187 label = "Is EMCalCluster";
1194 label = "Number of Matched Tracks to Cluster";
1208 label = "Track Eta";
1222 label="Is Track EMCal";
1229 label = "Get Track EMCal Cluster";
1236 label = "Track Matched Phi";
1245 } // end of getting dim-params