5 #include "TMatrixDSym.h"
6 #include "TMatrixDSymEigen.h"
12 #ifdef FASTJET_VERSION
15 Double32_t AliJetShapeGRNum::result(
const fastjet::PseudoJet &jet)
const {
16 if (!jet.has_constituents())
20 std::vector<fastjet::PseudoJet> constits = jet.constituents();
21 for(UInt_t ic = 0; ic < constits.size(); ++ic) {
25 for(UInt_t jc = ic+1; jc < constits.size(); ++jc) {
29 Double_t dphi = constits[ic].phi()-constits[jc].phi();
30 if(dphi<-1.*TMath::Pi()) dphi+=TMath::TwoPi();
31 if(dphi>TMath::Pi()) dphi-=TMath::TwoPi();
32 Double_t dr2 = (constits[ic].eta()-constits[jc].eta())*(constits[ic].eta()-constits[jc].eta()) + dphi*dphi;
34 Double_t dr = TMath::Sqrt(dr2);
37 Double_t noise = TMath::Exp(-x*x/(2*fDRStep*fDRStep))/(TMath::Sqrt(2.*TMath::Pi())*fDRStep);
38 A += constits[ic].perp()*constits[jc].perp()*dr2*noise;
45 Double32_t AliJetShapeGRDen::result(
const fastjet::PseudoJet &jet)
const {
46 if (!jet.has_constituents())
50 std::vector<fastjet::PseudoJet> constits = jet.constituents();
51 for(UInt_t ic = 0; ic < constits.size(); ++ic) {
55 for(UInt_t jc = ic+1; jc < constits.size(); ++jc) {
59 Double_t dphi = constits[ic].phi()-constits[jc].phi();
60 if(dphi<-1.*TMath::Pi()) dphi+=TMath::TwoPi();
61 if(dphi>TMath::Pi()) dphi-=TMath::TwoPi();
62 Double_t dr2 = (constits[ic].eta()-constits[jc].eta())*(constits[ic].eta()-constits[jc].eta()) + dphi*dphi;
64 Double_t dr = TMath::Sqrt(dr2);
67 Double_t erf = 0.5*(1.+TMath::Erf(x/(TMath::Sqrt(2.)*fDRStep)));
68 A += constits[ic].perp()*constits[jc].perp()*dr2*erf;
75 Double32_t AliJetShapeAngularity::result(
const fastjet::PseudoJet &jet)
const {
76 if (!jet.has_constituents())
80 std::vector<fastjet::PseudoJet> constits = jet.constituents();
81 for(UInt_t ic = 0; ic < constits.size(); ++ic) {
82 Double_t dphi = constits[ic].phi()-jet.phi();
83 if(dphi<-1.*TMath::Pi()) dphi+=TMath::TwoPi();
84 if(dphi>TMath::Pi()) dphi-=TMath::TwoPi();
85 Double_t dr2 = (constits[ic].eta()-jet.eta())*(constits[ic].eta()-jet.eta()) + dphi*dphi;
86 Double_t dr = TMath::Sqrt(dr2);
87 num=num+constits[ic].perp()*dr;
88 den=den+constits[ic].perp();
93 Double32_t AliJetShapepTD::result(
const fastjet::PseudoJet &jet)
const {
94 if (!jet.has_constituents())
98 std::vector<fastjet::PseudoJet> constits = jet.constituents();
99 for(UInt_t ic = 0; ic < constits.size(); ++ic) {
100 num=num+constits[ic].perp()*constits[ic].perp();
101 den=den+constits[ic].perp();
103 return TMath::Sqrt(num)/den;
106 Double32_t AliJetShapeCircularity::result(
const fastjet::PseudoJet &jet)
const {
107 if (!jet.has_constituents())
114 Double_t pxjet=jet.px();
115 Double_t pyjet=jet.py();
116 Double_t pzjet=jet.pz();
119 TVector3 ppJ1(pxjet, pyjet, pzjet);
120 TVector3 ppJ3(- pxjet* pzjet, - pyjet * pzjet, pxjet * pxjet + pyjet * pyjet);
122 TVector3 ppJ2(-pyjet, pxjet, 0);
125 std::vector<fastjet::PseudoJet> constits = jet.constituents();
126 for(UInt_t ic = 0; ic < constits.size(); ++ic) {
127 TVector3 pp(constits[ic].px(), constits[ic].py(), constits[ic].pz());
129 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
130 TVector3 pPerp = pp - pLong;
132 Float_t ppjX = pPerp.Dot(ppJ2);
133 Float_t ppjY = pPerp.Dot(ppJ3);
134 Float_t ppjT = TMath::Sqrt(ppjX * ppjX + ppjY * ppjY);
135 if(ppjT<=0)
return 0;
136 mxx += (ppjX * ppjX / ppjT);
137 myy += (ppjY * ppjY / ppjT);
138 mxy += (ppjX * ppjY / ppjT);
143 if(sump2==0)
return 0;
145 Double_t ele[4] = {mxx / sump2, mxy / sump2, mxy / sump2, myy / sump2};
146 TMatrixDSym m0(2,ele);
149 TMatrixDSymEigen m(m0);
151 TMatrixD evecm = m.GetEigenVectors();
152 eval = m.GetEigenValues();
155 if (eval[0] < eval[1]) jev = 1;
158 evec0 = TMatrixDColumn(evecm, jev);
159 Double_t compx=evec0[0];
160 Double_t compy=evec0[1];
161 TVector2 evec(compx, compy);
163 if(jev==1) circ=2*eval[0];
164 if(jev==0) circ=2*eval[1];
169 Double32_t AliJetShapeSigma2::result(
const fastjet::PseudoJet &jet)
const {
170 if (!jet.has_constituents())
178 std::vector<fastjet::PseudoJet> constits = jet.constituents();
179 for(UInt_t ic = 0; ic < constits.size(); ++ic) {
180 Double_t ppt=constits[ic].perp();
181 Double_t dphi = constits[ic].phi()-jet.phi();
182 if(dphi<-1.*TMath::Pi()) dphi+=TMath::TwoPi();
183 if(dphi>TMath::Pi()) dphi-=TMath::TwoPi();
184 Double_t deta = constits[ic].eta()-jet.eta();
185 mxx += ppt*ppt*deta*deta;
186 myy += ppt*ppt*dphi*dphi;
187 mxy -= ppt*ppt*deta*TMath::Abs(dphi);
192 if(sump2==0)
return 0;
194 Double_t ele[4] = {mxx , mxy, mxy, myy };
195 TMatrixDSym m0(2,ele);
198 TMatrixDSymEigen m(m0);
200 TMatrixD evecm = m.GetEigenVectors();
201 eval = m.GetEigenValues();
204 if (eval[0] < eval[1]) jev = 1;
207 evec0 = TMatrixDColumn(evecm, jev);
208 Double_t compx=evec0[0];
209 Double_t compy=evec0[1];
210 TVector2 evec(compx, compy);
212 if(jev==1) sigma2=TMath::Sqrt(TMath::Abs(eval[0])/sump2);
213 if(jev==0) sigma2=TMath::Sqrt(TMath::Abs(eval[1])/sump2);
219 Double32_t AliJetShape1subjettiness_kt::result(
const fastjet::PseudoJet &jet)
const {
220 if (!jet.has_constituents())
223 return fFastjetWrapper->AliFJWrapper::NSubjettinessDerivativeSub(1,0,0.2,1.0,0.4,jet,0);
227 Double32_t AliJetShape2subjettiness_kt::result(
const fastjet::PseudoJet &jet)
const {
228 if (!jet.has_constituents())
231 return fFastjetWrapper->AliFJWrapper::NSubjettinessDerivativeSub(2,0,0.2,1.0,0.4,jet,0);
234 Double32_t AliJetShape3subjettiness_kt::result(
const fastjet::PseudoJet &jet)
const {
235 if (!jet.has_constituents())
238 return fFastjetWrapper->AliFJWrapper::NSubjettinessDerivativeSub(3,0,0.2,1.0,0.4,jet,0);
241 Double32_t AliJetShapeOpeningAngle_kt::result(
const fastjet::PseudoJet &jet)
const {
242 if (!jet.has_constituents())
245 return fFastjetWrapper->AliFJWrapper::NSubjettinessDerivativeSub(2,0,0.2,1.0,0.4,jet,1);