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"
25 #include "AliVCluster.h"
26 #include "AliVTrack.h"
27 #include "AliEmcalJet.h"
28 #include "AliRhoParameter.h"
30 #include "AliEmcalParticle.h"
31 #include "AliMCEvent.h"
32 #include "AliGenPythiaEventHeader.h"
33 #include "AliAODMCHeader.h"
34 #include "AliMCEvent.h"
35 #include "AliAnalysisManager.h"
36 #include "AliJetContainer.h"
37 #include "AliParticleContainer.h"
38 #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),
68 fTreeObservableTagging(0)
71 SetMakeGeneralHistograms(kTRUE);
74 //________________________________________________________________________
75 AliAnalysisTaskEmcalQGTagging::AliAnalysisTaskEmcalQGTagging(const char *name) :
76 AliAnalysisTaskEmcalJet(name, kTRUE),
78 fMinFractionShared(0),
92 fTreeObservableTagging(0)
95 // Standard constructor.
97 SetMakeGeneralHistograms(kTRUE);
99 DefineOutput(1, TTree::Class());
103 //________________________________________________________________________
104 AliAnalysisTaskEmcalQGTagging::~AliAnalysisTaskEmcalQGTagging()
109 //________________________________________________________________________
110 void AliAnalysisTaskEmcalQGTagging::UserCreateOutputObjects()
112 // Create user output.
114 AliAnalysisTaskEmcalJet::UserCreateOutputObjects();
116 Bool_t oldStatus = TH1::AddDirectoryStatus();
117 TH1::AddDirectory(kFALSE);
119 fTreeObservableTagging = new TTree("fTreeJetShape", "fTreeJetShape");
121 fShapesVar = new Float_t [nVar];
122 TString *fShapesVarNames = new TString [nVar];
124 fShapesVarNames[0] = "partonCode";
125 fShapesVarNames[1] = "ptJet";
126 fShapesVarNames[2] = "ptDJet";
127 fShapesVarNames[3] = "mJet";
128 fShapesVarNames[4] = "nbOfConst";
129 fShapesVarNames[5] = "angularity";
130 fShapesVarNames[6] = "circularity";
131 fShapesVarNames[7] = "lesub";
132 fShapesVarNames[8] = "sigma2";
134 fShapesVarNames[9] = "ptJetMatch";
135 fShapesVarNames[10] = "ptDJetMatch";
136 fShapesVarNames[11] = "mJetMatch";
137 fShapesVarNames[12] = "nbOfConstMatch";
138 fShapesVarNames[13] = "angularityMatch";
139 fShapesVarNames[14] = "circularityMatch";
140 fShapesVarNames[15] = "lesubMatch";
141 fShapesVarNames[16] = "sigma2Match";
142 fShapesVarNames[17]="weightPythia";
144 for(Int_t ivar=0; ivar < nVar; ivar++){
145 cout<<"looping over variables"<<endl;
146 fTreeObservableTagging->Branch(fShapesVarNames[ivar].Data(), &fShapesVar[ivar], Form("%s/F", fShapesVarNames[ivar].Data()));
148 //if( ivar == 4 ) fTreeObservableTagging->Branch(fShapesVarNames[ivar].Data(), &fShapesVar[ivar], Form("%s/I", fShapesVarNames[ivar].Data()));
152 fh2ResponseUW= new TH2F("fh2ResponseUW", "fh2ResponseUW", 100, 0, 200, 100, 0, 200);
153 fOutput->Add(fh2ResponseUW);
154 fh2ResponseW= new TH2F("fh2ResponseW", "fh2ResponseW", 100, 0, 200, 100, 0, 200);
155 fOutput->Add(fh2ResponseW);
156 fPhiJetCorr6= new TH2F("fPhiJetCorr6", "fPhiJetCorr6", 50, 0, 2*TMath::Pi(), 50, 0, 2*TMath::Pi());
157 fOutput->Add(fPhiJetCorr6);
158 fEtaJetCorr6= new TH2F("fEtaJetCorr6", "fEtaJetCorr6", 50, -1.5, 1.5, 50, -1.5, 1.5);
159 fOutput->Add(fEtaJetCorr6);
161 fPhiJetCorr7= new TH2F("fPhiJetCorr7", "fPhiJetCorr7", 50, 0, 2*TMath::Pi(), 50, 0, 2*TMath::Pi());
162 fOutput->Add(fPhiJetCorr7);
163 fEtaJetCorr7= new TH2F("fEtaJetCorr7", "fEtaJetCorr7", 50, -1.5, 1.5, 50, -1.5, 1.5);
164 fOutput->Add(fEtaJetCorr7);
166 fPtJetCorr= new TH2F("fPtJetCorr", "fPtJetCorr", 100, 0, 200, 100, 0, 200);
167 fOutput->Add(fPtJetCorr);
168 fPtJet= new TH1F("fPtJet", "fPtJet", 100, 0, 200);
169 fOutput->Add(fPtJet);
172 fOutput->Add(fTreeObservableTagging);
173 TH1::AddDirectory(oldStatus);
174 PostData(1, fOutput); // Post data for ALL output slots > 0 here.
178 //________________________________________________________________________
179 Bool_t AliAnalysisTaskEmcalQGTagging::Run()
181 // Run analysis code here, if needed. It will be executed before FillHistograms().
186 //________________________________________________________________________
187 Bool_t AliAnalysisTaskEmcalQGTagging::FillHistograms()
190 //cout<<"base container"<<endl;
191 AliEmcalJet* jet1 = NULL;
192 AliJetContainer *jetCont = GetJetContainer(0);
194 if(fCent>10) return 0;
196 jetCont->ResetCurrentID();
197 while((jet1 = jetCont->GetNextAcceptJet())) {
199 AliEmcalJet* jet2 = 0x0;
200 fPtJet->Fill(jet1->Pt());
201 AliEmcalJet *jetUS = NULL;
205 if (!(fJetShapeType == kData)) {
206 AliPythiaInfo *partonsInfo = 0x0;
208 if((fJetShapeType == kTrueDet) || (fJetShapeType == kDetEmb)){
209 AliJetContainer *jetContTrue = GetJetContainer(1);
210 AliJetContainer *jetContUS = GetJetContainer(2);
211 if(fJetShapeSub==kConstSub){
212 for(Int_t i = 0; i<jetContUS->GetNJets(); i++) {
213 jetUS = jetContUS->GetJet(i);
214 if(jetUS->GetLabel()==jet1->GetLabel()) {
216 if(ifound==1) ilab = i;
219 if(ilab==-1) continue;
220 jetUS=jetContUS->GetJet(ilab);
222 jet2=jetUS->ClosestJet();}
223 if(!(fJetShapeSub==kConstSub)) jet2 = jet1->ClosestJet();
225 Printf("jet2 not exists, returning");
229 fh2ResponseUW->Fill(jet1->Pt(),jet2->Pt());
232 if(!(fJetShapeSub==kConstSub)) fraction = jetCont->GetFractionSharedPt(jet1);
233 if(fJetShapeSub==kConstSub) fraction = jetContUS->GetFractionSharedPt(jetUS);
234 cout<<"hey a jet"<<fraction<<" "<<jet1->Pt()<<" "<<jet2->Pt()<<" "<<fCent<<endl;
236 if(fraction<fMinFractionShared) continue;
237 partonsInfo = (AliPythiaInfo*) jetContTrue->GetPythiaInfo();
238 if(!partonsInfo) return 0;
242 partonsInfo = (AliPythiaInfo*) jetCont->GetPythiaInfo();
244 if(!partonsInfo) return 0;
247 Double_t jp1=(jet2->Phi())-(partonsInfo->GetPartonPhi6());
248 Double_t detap1=(jet2->Eta())-(partonsInfo->GetPartonEta6());
249 kWeight=partonsInfo->GetPythiaEventWeight();
250 fh2ResponseW->Fill(jet1->Pt(),jet2->Pt(),kWeight);
251 if (jp1< -1*TMath::Pi()) jp1 = (-2*TMath::Pi())-jp1;
252 else if (jp1 > TMath::Pi()) jp1 = (2*TMath::Pi())-jp1;
253 Float_t dRp1 = TMath::Sqrt(jp1 * jp1 + detap1 * detap1);
254 fEtaJetCorr6->Fill(jet2->Eta(), partonsInfo->GetPartonEta6());
255 fPhiJetCorr6->Fill(jet2->Phi(), partonsInfo->GetPartonPhi6());
256 if(dRp1 < fRMatching) {
257 fShapesVar[0] = partonsInfo->GetPartonFlag6();
258 fPtJetCorr ->Fill(partonsInfo->GetPartonPt6(), jet2->Pt());
261 jp1=(jet2->Phi())-(partonsInfo->GetPartonPhi7());
262 detap1=(jet2->Eta())-(partonsInfo->GetPartonEta7());
263 if (jp1< -1*TMath::Pi()) jp1= (-2*TMath::Pi())-jp1;
264 else if (jp1 > TMath::Pi()) jp1 = (2*TMath::Pi())-jp1;
265 dRp1 = TMath::Sqrt(jp1 * jp1 + detap1 * detap1);
266 fEtaJetCorr7->Fill(jet2->Eta(), partonsInfo->GetPartonEta7());
267 fPhiJetCorr7->Fill(jet2->Phi(), partonsInfo->GetPartonPhi7());
268 if(dRp1 < fRMatching) {
269 fShapesVar[0] = partonsInfo->GetPartonFlag7();
270 fPtJetCorr ->Fill(partonsInfo->GetPartonPt7(), jet2->Pt());
278 Double_t ptSubtracted = 0;
280 if (((fJetShapeType == kData) || (fJetShapeType == kDetEmb)) && (fJetShapeSub == kConstSub))
281 ptSubtracted = jet1->Pt();
282 else ptSubtracted = jet1->Pt() - GetRhoVal(0)*jet1->Area();
284 if ((fJetShapeType == kData || fJetShapeType== kDetEmb))
285 if ( ptSubtracted < fPtThreshold) continue;
287 fShapesVar[1] = ptSubtracted;
288 fShapesVar[2] = GetJetpTD(jet1,0);
289 fShapesVar[3] = GetJetMass(jet1,0);
290 fShapesVar[4] = 1.*GetJetNumberOfConstituents(jet1,0);
291 fShapesVar[5] = GetJetAngularity(jet1,0);
292 fShapesVar[6] = GetJetCircularity(jet1,0);
293 fShapesVar[7] = GetJetLeSub(jet1,0);
294 fShapesVar[8] = GetSigma2(jet1,0);
296 Float_t ptMatch=0., ptDMatch=0., massMatch=0., constMatch=0.,angulMatch=0.,circMatch=0., lesubMatch=0., sigma2Match=0.;
298 if (fJetShapeType == kTrueDet || fJetShapeType == kDetEmb) {
301 ptDMatch=GetJetpTD(jet2, kMatched);
302 massMatch=GetJetMass(jet2,kMatched);
303 constMatch=1.*GetJetNumberOfConstituents(jet2,kMatched);
304 angulMatch=GetJetAngularity(jet2, kMatched);
305 circMatch=GetJetCircularity(jet2, kMatched);
306 lesubMatch=GetJetLeSub(jet2, kMatched);
307 sigma2Match = GetSigma2(jet2, kMatched);
311 if (fJetShapeType == kTrue || fJetShapeType == kData) {
324 fShapesVar[9] = ptMatch;
325 fShapesVar[10] = ptDMatch;
326 fShapesVar[11] = massMatch;
327 fShapesVar[12] = constMatch;
328 fShapesVar[13] = angulMatch;
329 fShapesVar[14] = circMatch;
330 fShapesVar[15] = lesubMatch;
331 fShapesVar[16] = sigma2Match;
332 fShapesVar[17] = kWeight;
333 fTreeObservableTagging->Fill();
342 //________________________________________________________________________
343 Float_t AliAnalysisTaskEmcalQGTagging::GetJetMass(AliEmcalJet *jet,Int_t jetContNb=0) {
344 //calc subtracted jet mass
345 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
346 return jet->GetSecondOrderSubtracted();
351 //________________________________________________________________________
352 Float_t AliAnalysisTaskEmcalQGTagging::Angularity(AliEmcalJet *jet, Int_t jetContNb = 0){
354 AliJetContainer *jetCont = GetJetContainer(jetContNb);
355 if (!jet->GetNumberOfTracks())
359 AliVParticle *vp1 = 0x0;
360 for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
361 vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
362 Double_t dphi = vp1->Phi()-jet->Phi();
363 if(dphi<-1.*TMath::Pi()) dphi+=TMath::TwoPi();
364 if(dphi>TMath::Pi()) dphi-=TMath::TwoPi();
365 Double_t dr2 = (vp1->Eta()-jet->Eta())*(vp1->Eta()-jet->Eta()) + dphi*dphi;
366 Double_t dr = TMath::Sqrt(dr2);
367 num=num+vp1->Pt()*dr;
373 //________________________________________________________________________
374 Float_t AliAnalysisTaskEmcalQGTagging::GetJetAngularity(AliEmcalJet *jet, Int_t jetContNb = 0) {
376 if((fJetShapeSub==kDerivSub) && (jetContNb==0))
377 return jet->GetSecondOrderSubtractedAngularity();
379 return Angularity(jet, jetContNb);
384 //________________________________________________________________________
385 Float_t AliAnalysisTaskEmcalQGTagging::PTD(AliEmcalJet *jet, Int_t jetContNb = 0){
387 AliJetContainer *jetCont = GetJetContainer(jetContNb);
388 if (!jet->GetNumberOfTracks())
392 AliVParticle *vp1 = 0x0;
393 for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
394 vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
395 num=num+vp1->Pt()*vp1->Pt();
398 return TMath::Sqrt(num)/den;
401 //________________________________________________________________________
402 Float_t AliAnalysisTaskEmcalQGTagging::GetJetpTD(AliEmcalJet *jet, Int_t jetContNb = 0) {
403 //calc subtracted jet mass
404 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
405 return jet->GetSecondOrderSubtractedpTD();
407 return PTD(jet, jetContNb);
411 //_____________________________________________________________________________
412 Float_t AliAnalysisTaskEmcalQGTagging::Circularity(AliEmcalJet *jet, Int_t jetContNb = 0){
414 AliJetContainer *jetCont = GetJetContainer(jetContNb);
415 if (!jet->GetNumberOfTracks())
422 Double_t pxjet=jet->Px();
423 Double_t pyjet=jet->Py();
424 Double_t pzjet=jet->Pz();
427 //2 general normalized vectors perpendicular to the jet
428 TVector3 ppJ1(pxjet, pyjet, pzjet);
429 TVector3 ppJ3(- pxjet* pzjet, - pyjet * pzjet, pxjet * pxjet + pyjet * pyjet);
431 TVector3 ppJ2(-pyjet, pxjet, 0);
433 AliVParticle *vp1 = 0x0;
434 for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
435 vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
438 TVector3 pp(vp1->Px(), vp1->Py(), vp1->Pz());
441 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
442 TVector3 pPerp = pp - pLong;
443 //projection onto the two perpendicular vectors defined above
445 Float_t ppjX = pPerp.Dot(ppJ2);
446 Float_t ppjY = pPerp.Dot(ppJ3);
447 Float_t ppjT = TMath::Sqrt(ppjX * ppjX + ppjY * ppjY);
448 if(ppjT<=0) return 0;
450 mxx += (ppjX * ppjX / ppjT);
451 myy += (ppjY * ppjY / ppjT);
452 mxy += (ppjX * ppjY / ppjT);
457 if(sump2==0) return 0;
459 Double_t ele[4] = {mxx / sump2, mxy / sump2, mxy / sump2, myy / sump2};
460 TMatrixDSym m0(2,ele);
463 TMatrixDSymEigen m(m0);
465 TMatrixD evecm = m.GetEigenVectors();
466 eval = m.GetEigenValues();
467 // Largest eigenvector
469 // cout<<eval[0]<<" "<<eval[1]<<endl;
470 if (eval[0] < eval[1]) jev = 1;
473 evec0 = TMatrixDColumn(evecm, jev);
474 Double_t compx=evec0[0];
475 Double_t compy=evec0[1];
476 TVector2 evec(compx, compy);
478 if(jev==1) circ=2*eval[0];
479 if(jev==0) circ=2*eval[1];
490 //________________________________________________________________________
491 Float_t AliAnalysisTaskEmcalQGTagging::GetJetCircularity(AliEmcalJet *jet, Int_t jetContNb =0 ) {
492 //calc subtracted jet mass
494 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
495 return jet->GetSecondOrderSubtractedCircularity();
497 return Circularity(jet, jetContNb);
501 //________________________________________________________________________
502 Float_t AliAnalysisTaskEmcalQGTagging::LeSub(AliEmcalJet *jet, Int_t jetContNb =0 ){
504 AliJetContainer *jetCont = GetJetContainer(jetContNb);
505 if (!jet->GetNumberOfTracks())
509 AliVParticle *vp1 = 0x0;
510 AliVParticle *vp2 = 0x0;
511 std::vector<int> ordindex;
512 ordindex=jet->SortConstituentsPt(jetCont->GetParticleContainer()->GetArray());
514 vp1 = static_cast<AliVParticle*>(jet->TrackAt(ordindex[0], jetCont->GetParticleContainer()->GetArray()));
515 vp2 = static_cast<AliVParticle*>(jet->TrackAt(ordindex[1], jetCont->GetParticleContainer()->GetArray()));
523 //________________________________________________________________________
524 Float_t AliAnalysisTaskEmcalQGTagging::GetJetLeSub(AliEmcalJet *jet, Int_t jetContNb =0) {
525 //calc subtracted jet mass
527 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
528 return jet->GetSecondOrderSubtractedLeSub();
530 return LeSub(jet, jetContNb);
534 //________________________________________________________________________
535 Float_t AliAnalysisTaskEmcalQGTagging::GetJetNumberOfConstituents(AliEmcalJet *jet,Int_t jetContNb=0) {
536 //calc subtracted jet mass
538 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
539 return jet->GetSecondOrderSubtractedConstituent();
541 return jet->GetNumberOfTracks();
546 //______________________________________________________________________________
547 Float_t AliAnalysisTaskEmcalQGTagging::Sigma2(AliEmcalJet *jet, Int_t jetContNb=0){
549 AliJetContainer *jetCont = GetJetContainer(jetContNb);
550 if (!jet->GetNumberOfTracks())
558 AliVParticle *vp1 = 0x0;
559 for(UInt_t i = 0; i < jet->GetNumberOfTracks(); i++) {
560 vp1 = static_cast<AliVParticle*>(jet->TrackAt(i, jetCont->GetParticleContainer()->GetArray()));
561 Double_t ppt=vp1->Pt();
562 Double_t dphi = vp1->Phi()-jet->Phi();
563 if(dphi<-1.*TMath::Pi()) dphi+=TMath::TwoPi();
564 if(dphi>TMath::Pi()) dphi-=TMath::TwoPi();
565 Double_t deta = vp1->Eta()-jet->Eta();
566 mxx += ppt*ppt*deta*deta;
567 myy += ppt*ppt*dphi*dphi;
568 mxy -= ppt*ppt*deta*dphi;
574 if(sump2==0) return 0;
576 Double_t ele[4] = {mxx , mxy , mxy , myy };
577 TMatrixDSym m0(2,ele);
580 TMatrixDSymEigen m(m0);
582 TMatrixD evecm = m.GetEigenVectors();
583 eval = m.GetEigenValues();
584 // Largest eigenvector
586 // cout<<eval[0]<<" "<<eval[1]<<endl;
587 if (eval[0] < eval[1]) jev = 1;
590 evec0 = TMatrixDColumn(evecm, jev);
591 Double_t compx=evec0[0];
592 Double_t compy=evec0[1];
593 TVector2 evec(compx, compy);
595 if(jev==1) sig=TMath::Sqrt(TMath::Abs(eval[0])/sump2);
596 if(jev==0) sig=TMath::Sqrt(TMath::Abs(eval[1])/sump2);
602 //________________________________________________________________________
603 Float_t AliAnalysisTaskEmcalQGTagging::GetSigma2(AliEmcalJet *jet, Int_t jetContNb=0) {
604 //calc subtracted jet mass
606 if((fJetShapeSub==kDerivSub)&&(jetContNb==0))
607 return jet->GetSecondOrderSubtractedSigma2();
609 return Sigma2(jet, jetContNb);
613 //________________________________________________________________________
614 Bool_t AliAnalysisTaskEmcalQGTagging::RetrieveEventObjects() {
616 // retrieve event objects
618 if (!AliAnalysisTaskEmcalJet::RetrieveEventObjects())
624 //_______________________________________________________________________
625 void AliAnalysisTaskEmcalQGTagging::Terminate(Option_t *)
627 // Called once at the end of the analysis.
629 // fTreeObservableTagging = dynamic_cast<TTree*>(GetOutputData(1));
630 // if (!fTreeObservableTagging){
631 // Printf("ERROR: fTreeObservableTagging not available");