4 #include "TClonesArray.h"
8 #include "TMatrixDSym.h"
9 #include "TMatrixDSymEigen.h"
11 #include "AliAODEvent.h"
12 #include "AliAODTrack.h"
13 #include "AliAODJet.h"
14 #include "AliAnalysisTaskJetsTM.h"
16 ClassImp(AliAnalysisTaskJetsTM)
18 // Thrust Major (TM) analysis of reconstructed jets.
19 // TM is the thrust in the plane perpendicular to the jet axis
20 // The present amalysis performs the following steps:
21 // (a) Construct to orthogonal unit vectors (e1, e2) in the plane perpendicular to the jet axis
22 // (b) Calculate the components of all particles with jT > 1 GeV with respect to e1, e2
23 // (c) Construct the sphericity matrix
24 // (d) Find the two orthogonal eigenvectors of the spericity matrix
25 // (e) Caluclate the components of all particles with jT < 1 GeV in the reference frame spanned by the eigenvectors
26 // (f) Calculate the azimuthal angle in this frame
29 // Author: andreas.morsch@cern.ch
32 AliAnalysisTaskJetsTM::AliAnalysisTaskJetsTM(const char *name)
33 : AliAnalysisTaskSE(name)
45 DefineOutput(1, TList::Class());
49 //________________________________________________________________________
50 void AliAnalysisTaskJetsTM::UserCreateOutputObjects()
55 fPtH = new TH1F("fPtH" , " p_{T} distribution of jets" , 50, 0., 100.0);
56 fPtSum = new TH2F("fPtSum" , " p_{T} sum in cone" , 50, 0., 100.0, 50, 0, 100.);
57 fPtTH = new TH1F("fPtTH", " p_{T} distribution of tracks", 50, 0., 100.0);
58 fPhiM = new TH1F("fPhiM", " phi^{major} distribution of tracks", 64, 0., 3.2);
59 fPhiMPt = new TH2F("fPhiMPt", " phi^{major} distribution of tracks vs pt", 64, 0., 3.2, 20, 0., 2.);
60 fPhiMPtJ = new TH2F("fPhiMPtJ", " phi^{major} distribution of tracks vs pt Jet", 64, 0., 3.2, 40, 0., 100.);
68 fHists->Add(fPhiMPtJ);
72 //________________________________________________________________________
73 void AliAnalysisTaskJetsTM::UserExec(Option_t *)
76 // Called for each event
79 Printf("ERROR: AOD not available");
83 AliAODEvent* aodE = dynamic_cast<AliAODEvent*> (fInputEvent);
84 TClonesArray* jets = dynamic_cast<TClonesArray*> (aodE->FindListObject("jetsAOD_FASTKT04"));
85 Int_t nJ = jets->GetEntries();
91 // Find highest pT jet with pt > 20 GeV
93 for (Int_t i = 0; i < nJ; i++) {
94 AliAODJet* jet = dynamic_cast<AliAODJet*> (jets->At(i));
95 Float_t ptJ = jet->Pt();
96 Float_t etaJ = TMath::Abs(jet->Eta());
97 if ((ptJ > 20.) && (ptJ > ptmax) && etaJ < 0.5) {
103 if (imax == -1) return;
106 AliAODJet* jet = dynamic_cast<AliAODJet*> (jets->At(imax));
107 Float_t ptJ = jet->Pt();
108 Float_t phiJ = jet->Phi();
109 Float_t etaJ = jet->Eta();
114 // The transverse plane
116 // 2 normalized vectors perpendicular to the jet direction
118 Float_t pxJ = jet->Px();
119 Float_t pyJ = jet->Py();
120 Float_t pzJ = jet->Pz();
122 TVector3 ppJ1(pxJ, pyJ, pzJ);
123 TVector3 ppJ3(- pxJ * pzJ, - pyJ * pzJ, pxJ * pxJ + pyJ * pyJ);
125 TVector3 ppJ2(-pyJ, pxJ, 0);
129 // 1st track loop to determine the sphericity matrix
131 Int_t nT = aodE->GetNumberOfTracks();
132 // Initialize Shericity matrix
144 for (Int_t i = 0; i < nT; i++) {
145 AliAODTrack* track = aodE->GetTrack(i);
147 // Track quality cuts
148 if (!track->TestFilterBit(1<<4)) continue;
149 fPtTH->Fill(track->Pt());
153 TVector3 pp(track->Px(), track->Py(), track->Pz());
155 Float_t phi = track->Phi();
156 Float_t eta = track->Eta();
157 Float_t pt = track->Pt();
158 Float_t jT = pp.Perp(ppJ1);
164 Float_t deta = eta - etaJ;
165 Float_t dphi = phi - phiJ;
167 if (dphi > TMath::Pi()) dphi = 2. * TMath::Pi() - dphi;
168 if (dphi < - TMath::Pi()) dphi = - 2. * TMath::Pi() - dphi;
169 Float_t r = TMath::Sqrt(dphi * dphi + deta * deta);
171 if (r < 0.4) ptsum += pt;
172 if (r < 0.5 && jT > 1.) {
173 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
174 TVector3 pPerp = pp - pLong;
176 Float_t ppjX = pPerp.Dot(ppJ2);
177 Float_t ppjY = pPerp.Dot(ppJ3);
178 Float_t ppjT = TMath::Sqrt(ppjX * ppjX + ppjY * ppjY);
180 mxx += (ppjX * ppjX / ppjT);
181 myy += (ppjY * ppjY / ppjT);
182 mxy += (ppjX * ppjY / ppjT);
194 fPtSum->Fill(ptJ, ptsum);
197 // At this point we have mxx, myy, mxy
200 const Double_t ele[4] = {mxx / sump2, mxy / sump2, mxy / sump2, myy / sump2};
201 TMatrixDSym m0(2, ele);
203 TMatrixDSymEigen m(m0);
205 TMatrixD evecm = m.GetEigenVectors();
206 eval = m.GetEigenValues();
207 // Largest eigenvector
209 if (eval[0] < eval[1]) jev = 1;
212 evec0 = TMatrixDColumn(evecm, jev);
213 TVector2 evec(evec0[0], evec0[1]);
214 // Principle axis from leading partice
215 Float_t phiM = TMath::ATan2(phiMax, etaMax);
216 TVector2 evecM(TMath::Cos(phiM), TMath::Sin(phiM));
217 Float_t phistM = evecM.DeltaPhi(evec);
218 if (TMath::Abs(phistM) > TMath::Pi()/2.) evec*=(-1.);
221 // 2nd correlation with principal axis
223 for (Int_t i = 0; i < nT; i++) {
224 AliAODTrack* track = aodE->GetTrack(i);
226 // Track quality cuts
227 if (!track->TestFilterBit(1<<4)) continue;
230 TVector3 pp(track->Px(), track->Py(), track->Pz());
231 Float_t phi = track->Phi();
232 Float_t eta = track->Eta();
233 Float_t pt = track->Pt();
234 Float_t jT = pp.Perp(ppJ1);
236 if (jT > 1.) continue;
237 Float_t deta = eta - etaJ;
238 Float_t dphi = phi - phiJ;
239 if (dphi > TMath::Pi()) dphi = 2. * TMath::Pi() - dphi;
240 if (dphi < - TMath::Pi()) dphi = - 2. * TMath::Pi() - dphi;
242 Float_t r = TMath::Sqrt(dphi * dphi + deta * deta);
244 if (r > 0.7) continue;
246 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
247 TVector3 pPerp = pp - pLong;
249 Float_t ppjX = pPerp.Dot(ppJ2);
250 Float_t ppjY = pPerp.Dot(ppJ3);
251 Float_t ppjT = TMath::Sqrt(ppjX * ppjX + ppjY * ppjY);
253 TVector2 vr(ppjX, ppjY) ;
254 Float_t phistr = evec.DeltaPhi(vr);
256 fPhiMPt ->Fill(phistr, pt);
257 fPhiMPtJ->Fill(phistr, ptJ);
266 //________________________________________________________________________
267 void AliAnalysisTaskJetsTM::Terminate(Option_t *)