2 // Jet QG tagging analysis task.
4 // Author: D. Caffarri, L. Cunqueiro
6 #include <TClonesArray.h>
10 #include <THnSparse.h>
13 #include <TLorentzVector.h>
20 #include "TMatrixDSym.h"
21 #include "TMatrixDSymEigen.h"
24 #include "AliVCluster.h"
25 #include "AliVTrack.h"
26 #include "AliEmcalJet.h"
27 #include "AliRhoParameter.h"
29 #include "AliEmcalParticle.h"
30 #include "AliMCEvent.h"
31 #include "AliGenPythiaEventHeader.h"
32 #include "AliAODMCHeader.h"
33 #include "AliMCEvent.h"
34 #include "AliAnalysisManager.h"
35 #include "AliJetContainer.h"
36 #include "AliParticleContainer.h"
37 #include "AliPythiaInfo.h"
41 #include "AliAODEvent.h"
43 #include "AliAnalysisTaskEmcalQGTagging.h"
48 ClassImp(AliAnalysisTaskEmcalQGTagging)
50 //________________________________________________________________________
51 AliAnalysisTaskEmcalQGTagging::AliAnalysisTaskEmcalQGTagging() :
52 AliAnalysisTaskEmcalJet("AliAnalysisTaskEmcalQGTagging", kTRUE),
54 fMinFractionShared(0),
57 fJetSelection(kInclusive),
63 fangWindowRecoil(0.6),
75 fTreeObservableTagging(0)
78 SetMakeGeneralHistograms(kTRUE);
81 //________________________________________________________________________
82 AliAnalysisTaskEmcalQGTagging::AliAnalysisTaskEmcalQGTagging(const char *name) :
83 AliAnalysisTaskEmcalJet(name, kTRUE),
85 fMinFractionShared(0),
88 fJetSelection(kInclusive),
94 fangWindowRecoil(0.6),
106 fTreeObservableTagging(0)
109 // Standard constructor.
111 SetMakeGeneralHistograms(kTRUE);
113 DefineOutput(1, TTree::Class());
117 //________________________________________________________________________
118 AliAnalysisTaskEmcalQGTagging::~AliAnalysisTaskEmcalQGTagging()
123 //________________________________________________________________________
124 void AliAnalysisTaskEmcalQGTagging::UserCreateOutputObjects()
126 // Create user output.
128 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
130 Bool_t oldStatus = TH1::AddDirectoryStatus();
131 TH1::AddDirectory(kFALSE);
133 fTreeObservableTagging = new TTree("fTreeJetShape", "fTreeJetShape");
135 fShapesVar = new Float_t [nVar];
136 TString *fShapesVarNames = new TString [nVar];
138 fShapesVarNames[0] = "partonCode";
139 fShapesVarNames[1] = "ptJet";
140 fShapesVarNames[2] = "ptDJet";
141 fShapesVarNames[3] = "mJet";
142 fShapesVarNames[4] = "nbOfConst";
143 fShapesVarNames[5] = "angularity";
144 fShapesVarNames[6] = "circularity";
145 fShapesVarNames[7] = "lesub";
146 fShapesVarNames[8] = "sigma2";
148 fShapesVarNames[9] = "ptJetMatch";
149 fShapesVarNames[10] = "ptDJetMatch";
150 fShapesVarNames[11] = "mJetMatch";
151 fShapesVarNames[12] = "nbOfConstMatch";
152 fShapesVarNames[13] = "angularityMatch";
153 fShapesVarNames[14] = "circularityMatch";
154 fShapesVarNames[15] = "lesubMatch";
155 fShapesVarNames[16] = "sigma2Match";
156 fShapesVarNames[17]="weightPythia";
158 for(Int_t ivar=0; ivar < nVar; ivar++){
159 cout<<"looping over variables"<<endl;
160 fTreeObservableTagging->Branch(fShapesVarNames[ivar].Data(), &fShapesVar[ivar], Form("%s/F", fShapesVarNames[ivar].Data()));
162 //if( ivar == 4 ) fTreeObservableTagging->Branch(fShapesVarNames[ivar].Data(), &fShapesVar[ivar], Form("%s/I", fShapesVarNames[ivar].Data()));
166 fh2ResponseUW= new TH2F("fh2ResponseUW", "fh2ResponseUW", 100, 0, 200, 100, 0, 200);
167 fOutput->Add(fh2ResponseUW);
168 fh2ResponseW= new TH2F("fh2ResponseW", "fh2ResponseW", 100, 0, 200, 100, 0, 200);
169 fOutput->Add(fh2ResponseW);
170 fPhiJetCorr6= new TH2F("fPhiJetCorr6", "fPhiJetCorr6", 50, 0, 2*TMath::Pi(), 50, 0, 2*TMath::Pi());
171 fOutput->Add(fPhiJetCorr6);
172 fEtaJetCorr6= new TH2F("fEtaJetCorr6", "fEtaJetCorr6", 50, -1.5, 1.5, 50, -1.5, 1.5);
173 fOutput->Add(fEtaJetCorr6);
175 fPhiJetCorr7= new TH2F("fPhiJetCorr7", "fPhiJetCorr7", 50, 0, 2*TMath::Pi(), 50, 0, 2*TMath::Pi());
176 fOutput->Add(fPhiJetCorr7);
177 fEtaJetCorr7= new TH2F("fEtaJetCorr7", "fEtaJetCorr7", 50, -1.5, 1.5, 50, -1.5, 1.5);
178 fOutput->Add(fEtaJetCorr7);
180 fPtJetCorr= new TH2F("fPtJetCorr", "fPtJetCorr", 100, 0, 200, 100, 0, 200);
181 fOutput->Add(fPtJetCorr);
182 fPtJet= new TH1F("fPtJet", "fPtJet", 100, 0, 200);
183 fOutput->Add(fPtJet);
185 fhpTjetpT= new TH2F("fhpTjetpT", "fhpTjetpT", 100, 0, 200, 100, 0, 200);
186 fOutput->Add(fhpTjetpT);
187 fhPt= new TH1F("fhPt", "fhPt", 100, 0, 200);
189 fhPhi= new TH1F("fhPhi", "fhPhi", 100, -TMath::Pi(), TMath::Pi());
192 fOutput->Add(fTreeObservableTagging);
193 TH1::AddDirectory(oldStatus);
194 PostData(1, fOutput); // Post data for ALL output slots > 0 here.
198 //________________________________________________________________________
199 Bool_t AliAnalysisTaskEmcalQGTagging::Run()
201 // Run analysis code here, if needed. It will be executed before FillHistograms().
206 //________________________________________________________________________
207 Bool_t AliAnalysisTaskEmcalQGTagging::FillHistograms()
210 //cout<<"base container"<<endl;
211 AliEmcalJet* jet1 = NULL;
212 AliJetContainer *jetCont = GetJetContainer(0);
214 if(fCent>10) return 0;
216 AliAODTrack *triggerHadron = 0x0;
218 if (fJetSelection == kRecoil) {
219 //Printf("Recoil jets!!!, fminpTTrig = %f, fmaxpTTrig = %f", fminpTTrig, fmaxpTTrig);
220 Int_t triggerHadronLabel = SelectTrigger(fminpTTrig, fmaxpTTrig);
221 if (triggerHadronLabel==-9999) {
222 Printf ("Trigger Hadron not found, return");
225 AliParticleContainer *partContAn = GetParticleContainer(0);
226 TClonesArray *trackArrayAn = partContAn->GetArray();
227 triggerHadron = static_cast<AliAODTrack*>(trackArrayAn->At(triggerHadronLabel));
228 if (!triggerHadron) {
229 Printf("No Trigger hadron with the found label!!");
235 jetCont->ResetCurrentID();
236 while((jet1 = jetCont->GetNextAcceptJet())) {
238 AliEmcalJet* jet2 = 0x0;
239 fPtJet->Fill(jet1->Pt());
240 AliEmcalJet *jetUS = NULL;
244 if (!(fJetShapeType == kData)) {
245 AliPythiaInfo *partonsInfo = 0x0;
247 if((fJetShapeType == kTrueDet) || (fJetShapeType == kDetEmb)){
248 AliJetContainer *jetContTrue = GetJetContainer(1);
249 AliJetContainer *jetContUS = GetJetContainer(2);
250 if(fJetShapeSub==kConstSub){
251 for(Int_t i = 0; i<jetContUS->GetNJets(); i++) {
252 jetUS = jetContUS->GetJet(i);
253 if(jetUS->GetLabel()==jet1->GetLabel()) {
255 if(ifound==1) ilab = i;
258 if(ilab==-1) continue;
259 jetUS=jetContUS->GetJet(ilab);
261 jet2=jetUS->ClosestJet();
263 if(!(fJetShapeSub==kConstSub)) jet2 = jet1->ClosestJet();
265 Printf("jet2 not exists, returning");
269 fh2ResponseUW->Fill(jet1->Pt(),jet2->Pt());
272 if(!(fJetShapeSub==kConstSub)) fraction = jetCont->GetFractionSharedPt(jet1);
273 if(fJetShapeSub==kConstSub) fraction = jetContUS->GetFractionSharedPt(jetUS);
274 cout<<"hey a jet"<<fraction<<" "<<jet1->Pt()<<" "<<jet2->Pt()<<" "<<fCent<<endl;
276 if(fraction<fMinFractionShared) continue;
277 partonsInfo = (AliPythiaInfo*) jetContTrue->GetPythiaInfo();
278 if(!partonsInfo) return 0;
282 partonsInfo = (AliPythiaInfo*) jetCont->GetPythiaInfo();
284 if(!partonsInfo) return 0;
287 Double_t jp1=(jet2->Phi())-(partonsInfo->GetPartonPhi6());
288 Double_t detap1=(jet2->Eta())-(partonsInfo->GetPartonEta6());
289 kWeight=partonsInfo->GetPythiaEventWeight();
290 fh2ResponseW->Fill(jet1->Pt(),jet2->Pt(),kWeight);
291 if (jp1< -1*TMath::Pi()) jp1 = (-2*TMath::Pi())-jp1;
292 else if (jp1 > TMath::Pi()) jp1 = (2*TMath::Pi())-jp1;
293 Float_t dRp1 = TMath::Sqrt(jp1 * jp1 + detap1 * detap1);
294 fEtaJetCorr6->Fill(jet2->Eta(), partonsInfo->GetPartonEta6());
295 fPhiJetCorr6->Fill(jet2->Phi(), partonsInfo->GetPartonPhi6());
296 if(dRp1 < fRMatching) {
297 fShapesVar[0] = partonsInfo->GetPartonFlag6();
298 fPtJetCorr ->Fill(partonsInfo->GetPartonPt6(), jet2->Pt());
301 jp1=(jet2->Phi())-(partonsInfo->GetPartonPhi7());
302 detap1=(jet2->Eta())-(partonsInfo->GetPartonEta7());
303 if (jp1< -1*TMath::Pi()) jp1= (-2*TMath::Pi())-jp1;
304 else if (jp1 > TMath::Pi()) jp1 = (2*TMath::Pi())-jp1;
305 dRp1 = TMath::Sqrt(jp1 * jp1 + detap1 * detap1);
306 fEtaJetCorr7->Fill(jet2->Eta(), partonsInfo->GetPartonEta7());
307 fPhiJetCorr7->Fill(jet2->Phi(), partonsInfo->GetPartonPhi7());
308 if(dRp1 < fRMatching) {
309 fShapesVar[0] = partonsInfo->GetPartonFlag7();
310 fPtJetCorr->Fill(partonsInfo->GetPartonPt7(), jet2->Pt());
318 Double_t ptSubtracted = 0;
320 Float_t dphiRecoil = 0.;
321 if (fJetSelection == kRecoil){
322 dphiRecoil = RelativePhi(triggerHadron->Phi(), jet1->Phi());
323 if (TMath::Abs(dphiRecoil) < TMath::Pi() - fangWindowRecoil) {
324 // Printf("Recoil jets back to back not found! continuing");
327 //Printf("Recoil jets back to back found! filling histos!");
328 fhpTjetpT->Fill(triggerHadron->Pt(), jet1->Pt());
329 //Printf("triggerHadron =%f, jet1 = %f", triggerHadron->Pt(), jet1->Pt());
330 fhPt->Fill(triggerHadron->Pt());
331 fhPhi->Fill(RelativePhi(triggerHadron->Phi(), jet1->Phi()));
334 if (((fJetShapeType == kData) || (fJetShapeType == kDetEmb)) && (fJetShapeSub == kConstSub))
335 ptSubtracted = jet1->Pt();
336 else ptSubtracted = jet1->Pt() - GetRhoVal(0)*jet1->Area();
338 if ((fJetShapeType == kData || fJetShapeType== kDetEmb))
339 if (ptSubtracted < fPtThreshold) continue;
341 fShapesVar[1] = ptSubtracted;
342 fShapesVar[2] = GetJetpTD(jet1,0);
343 fShapesVar[3] = GetJetMass(jet1,0);
344 fShapesVar[4] = 1.*GetJetNumberOfConstituents(jet1,0);
345 fShapesVar[5] = GetJetAngularity(jet1,0);
346 fShapesVar[6] = GetJetCircularity(jet1,0);
347 fShapesVar[7] = GetJetLeSub(jet1,0);
348 fShapesVar[8] = GetSigma2(jet1,0);
350 Float_t ptMatch=0., ptDMatch=0., massMatch=0., constMatch=0.,angulMatch=0.,circMatch=0., lesubMatch=0., sigma2Match=0.;
352 if (fJetShapeType == kTrueDet || fJetShapeType == kDetEmb) {
355 ptDMatch=GetJetpTD(jet2, kMatched);
356 massMatch=GetJetMass(jet2,kMatched);
357 constMatch=1.*GetJetNumberOfConstituents(jet2,kMatched);
358 angulMatch=GetJetAngularity(jet2, kMatched);
359 circMatch=GetJetCircularity(jet2, kMatched);
360 lesubMatch=GetJetLeSub(jet2, kMatched);
361 sigma2Match = GetSigma2(jet2, kMatched);
365 if (fJetShapeType == kTrue || fJetShapeType == kData) {
378 fShapesVar[9] = ptMatch;
379 fShapesVar[10] = ptDMatch;
380 fShapesVar[11] = massMatch;
381 fShapesVar[12] = constMatch;
382 fShapesVar[13] = angulMatch;
383 fShapesVar[14] = circMatch;
384 fShapesVar[15] = lesubMatch;
385 fShapesVar[16] = sigma2Match;
386 fShapesVar[17] = kWeight;
387 fTreeObservableTagging->Fill();
396 //________________________________________________________________________
397 Float_t AliAnalysisTaskEmcalQGTagging::GetJetMass(AliEmcalJet *jet,Int_t jetContNb=0) {
398 //calc subtracted jet mass
399 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
400 return jet->GetSecondOrderSubtracted();
405 //________________________________________________________________________
406 Float_t AliAnalysisTaskEmcalQGTagging::Angularity(AliEmcalJet *jet, Int_t jetContNb = 0){
408 AliJetContainer *jetCont = GetJetContainer(jetContNb);
409 if (!jet->GetNumberOfTracks())
413 AliVParticle *vp1 = 0x0;
414 for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
415 vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
416 Double_t dphi = vp1->Phi()-jet->Phi();
417 if(dphi<-1.*TMath::Pi()) dphi+=TMath::TwoPi();
418 if(dphi>TMath::Pi()) dphi-=TMath::TwoPi();
419 Double_t dr2 = (vp1->Eta()-jet->Eta())*(vp1->Eta()-jet->Eta()) + dphi*dphi;
420 Double_t dr = TMath::Sqrt(dr2);
421 num=num+vp1->Pt()*dr;
427 //________________________________________________________________________
428 Float_t AliAnalysisTaskEmcalQGTagging::GetJetAngularity(AliEmcalJet *jet, Int_t jetContNb = 0) {
430 if((fJetShapeSub==kDerivSub) && (jetContNb==0))
431 return jet->GetSecondOrderSubtractedAngularity();
433 return Angularity(jet, jetContNb);
438 //________________________________________________________________________
439 Float_t AliAnalysisTaskEmcalQGTagging::PTD(AliEmcalJet *jet, Int_t jetContNb = 0){
441 AliJetContainer *jetCont = GetJetContainer(jetContNb);
442 if (!jet->GetNumberOfTracks())
446 AliVParticle *vp1 = 0x0;
447 for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
448 vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
449 num=num+vp1->Pt()*vp1->Pt();
452 return TMath::Sqrt(num)/den;
455 //________________________________________________________________________
456 Float_t AliAnalysisTaskEmcalQGTagging::GetJetpTD(AliEmcalJet *jet, Int_t jetContNb = 0) {
457 //calc subtracted jet mass
458 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
459 return jet->GetSecondOrderSubtractedpTD();
461 return PTD(jet, jetContNb);
465 //_____________________________________________________________________________
466 Float_t AliAnalysisTaskEmcalQGTagging::Circularity(AliEmcalJet *jet, Int_t jetContNb = 0){
468 AliJetContainer *jetCont = GetJetContainer(jetContNb);
469 if (!jet->GetNumberOfTracks())
476 Double_t pxjet=jet->Px();
477 Double_t pyjet=jet->Py();
478 Double_t pzjet=jet->Pz();
481 //2 general normalized vectors perpendicular to the jet
482 TVector3 ppJ1(pxjet, pyjet, pzjet);
483 TVector3 ppJ3(- pxjet* pzjet, - pyjet * pzjet, pxjet * pxjet + pyjet * pyjet);
485 TVector3 ppJ2(-pyjet, pxjet, 0);
487 AliVParticle *vp1 = 0x0;
488 for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
489 vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
492 TVector3 pp(vp1->Px(), vp1->Py(), vp1->Pz());
495 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
496 TVector3 pPerp = pp - pLong;
497 //projection onto the two perpendicular vectors defined above
499 Float_t ppjX = pPerp.Dot(ppJ2);
500 Float_t ppjY = pPerp.Dot(ppJ3);
501 Float_t ppjT = TMath::Sqrt(ppjX * ppjX + ppjY * ppjY);
502 if(ppjT<=0) return 0;
504 mxx += (ppjX * ppjX / ppjT);
505 myy += (ppjY * ppjY / ppjT);
506 mxy += (ppjX * ppjY / ppjT);
511 if(sump2==0) return 0;
513 Double_t ele[4] = {mxx / sump2, mxy / sump2, mxy / sump2, myy / sump2};
514 TMatrixDSym m0(2,ele);
517 TMatrixDSymEigen m(m0);
519 TMatrixD evecm = m.GetEigenVectors();
520 eval = m.GetEigenValues();
521 // Largest eigenvector
523 // cout<<eval[0]<<" "<<eval[1]<<endl;
524 if (eval[0] < eval[1]) jev = 1;
527 evec0 = TMatrixDColumn(evecm, jev);
528 Double_t compx=evec0[0];
529 Double_t compy=evec0[1];
530 TVector2 evec(compx, compy);
532 if(jev==1) circ=2*eval[0];
533 if(jev==0) circ=2*eval[1];
544 //________________________________________________________________________
545 Float_t AliAnalysisTaskEmcalQGTagging::GetJetCircularity(AliEmcalJet *jet, Int_t jetContNb =0 ) {
546 //calc subtracted jet mass
548 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
549 return jet->GetSecondOrderSubtractedCircularity();
551 return Circularity(jet, jetContNb);
555 //________________________________________________________________________
556 Float_t AliAnalysisTaskEmcalQGTagging::LeSub(AliEmcalJet *jet, Int_t jetContNb =0 ){
558 AliJetContainer *jetCont = GetJetContainer(jetContNb);
559 if (!jet->GetNumberOfTracks())
563 AliVParticle *vp1 = 0x0;
564 AliVParticle *vp2 = 0x0;
565 std::vector<int> ordindex;
566 ordindex=jet->SortConstituentsPt(jetCont->GetParticleContainer()->GetArray());
568 vp1 = static_cast<AliVParticle*>(jet->TrackAt(ordindex[0], jetCont->GetParticleContainer()->GetArray()));
569 vp2 = static_cast<AliVParticle*>(jet->TrackAt(ordindex[1], jetCont->GetParticleContainer()->GetArray()));
577 //________________________________________________________________________
578 Float_t AliAnalysisTaskEmcalQGTagging::GetJetLeSub(AliEmcalJet *jet, Int_t jetContNb =0) {
579 //calc subtracted jet mass
581 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
582 return jet->GetSecondOrderSubtractedLeSub();
584 return LeSub(jet, jetContNb);
588 //________________________________________________________________________
589 Float_t AliAnalysisTaskEmcalQGTagging::GetJetNumberOfConstituents(AliEmcalJet *jet,Int_t jetContNb=0) {
590 //calc subtracted jet mass
592 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
593 return jet->GetSecondOrderSubtractedConstituent();
595 return jet->GetNumberOfTracks();
600 //______________________________________________________________________________
601 Float_t AliAnalysisTaskEmcalQGTagging::Sigma2(AliEmcalJet *jet, Int_t jetContNb=0){
603 AliJetContainer *jetCont = GetJetContainer(jetContNb);
604 if (!jet->GetNumberOfTracks())
612 AliVParticle *vp1 = 0x0;
613 for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
614 vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
615 Double_t ppt=vp1->Pt();
616 Double_t dphi = vp1->Phi()-jet->Phi();
617 if(dphi<-1.*TMath::Pi()) dphi+=TMath::TwoPi();
618 if(dphi>TMath::Pi()) dphi-=TMath::TwoPi();
619 Double_t deta = vp1->Eta()-jet->Eta();
620 mxx += ppt*ppt*deta*deta;
621 myy += ppt*ppt*dphi*dphi;
622 mxy -= ppt*ppt*deta*dphi;
628 if(sump2==0) return 0;
630 Double_t ele[4] = {mxx , mxy , mxy , myy };
631 TMatrixDSym m0(2,ele);
634 TMatrixDSymEigen m(m0);
636 TMatrixD evecm = m.GetEigenVectors();
637 eval = m.GetEigenValues();
638 // Largest eigenvector
640 // cout<<eval[0]<<" "<<eval[1]<<endl;
641 if (eval[0] < eval[1]) jev = 1;
644 evec0 = TMatrixDColumn(evecm, jev);
645 Double_t compx=evec0[0];
646 Double_t compy=evec0[1];
647 TVector2 evec(compx, compy);
649 if(jev==1) sig=TMath::Sqrt(TMath::Abs(eval[0])/sump2);
650 if(jev==0) sig=TMath::Sqrt(TMath::Abs(eval[1])/sump2);
656 //________________________________________________________________________
657 Float_t AliAnalysisTaskEmcalQGTagging::GetSigma2(AliEmcalJet *jet, Int_t jetContNb=0) {
658 //calc subtracted jet mass
660 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
661 return jet->GetSecondOrderSubtractedSigma2();
663 return Sigma2(jet, jetContNb);
667 //________________________________________________________________________
668 Int_t AliAnalysisTaskEmcalQGTagging::SelectTrigger(Float_t minpT, Float_t maxpT){
670 AliParticleContainer *partCont = GetParticleContainer(0);
671 TClonesArray *tracksArray = partCont->GetArray();
673 if(!partCont || !tracksArray) return 0;
674 AliAODTrack *track = 0x0;
676 TList *trackList = new TList();
678 for (Int_t iTrigger=0; iTrigger<100; iTrigger++) triggers[iTrigger] = 0;
681 for(Int_t iTrack=0; iTrack <= tracksArray->GetEntriesFast(); iTrack++){
682 track = static_cast<AliAODTrack*>(tracksArray->At(iTrack));
683 if (!track) continue;
685 if(TMath::Abs(track->Eta())>0.9) continue;
686 if (track->Pt()<0.15) continue;
687 if (!(track->TestFilterBit(768))) continue;
689 if ((track->Pt() >= minpT) && (track->Pt()< maxpT)) {
690 trackList->Add(track);
691 triggers[iTT] = iTrack;
696 if (iTT == 0) return -9999;
697 Int_t nbRn = 0, index = 0 ;
698 TRandom3* random = new TRandom3(0);
699 nbRn = random->Integer(iTT);
701 index = triggers[nbRn];
702 //Printf("iTT= %d, nbRn = %d, Index = %d",iTT, nbRn, index );
707 //__________________________________________________________________________________
708 Double_t AliAnalysisTaskEmcalQGTagging::RelativePhi(Double_t mphi,Double_t vphi){
710 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
711 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
712 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
713 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
714 double dphi = mphi-vphi;
715 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
716 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
717 return dphi;//dphi in [-Pi, Pi]
721 //________________________________________________________________________
722 Bool_t AliAnalysisTaskEmcalQGTagging::RetrieveEventObjects() {
724 // retrieve event objects
726 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
732 //_______________________________________________________________________
733 void AliAnalysisTaskEmcalQGTagging::Terminate(Option_t *)
735 // Called once at the end of the analysis.
737 // fTreeObservableTagging = dynamic_cast<TTree*>(GetOutputData(1));
738 // if (!fTreeObservableTagging){
739 // Printf("ERROR: fTreeObservableTagging not available");