fJetShapeCircularitySecondDer(0),
fJetShapeCircularityFirstSub(0),
fJetShapeCircularitySecondSub(0),
+ fJetShapeSigma2FirstDer(0),
+ fJetShapeSigma2SecondDer(0),
+ fJetShapeSigma2FirstSub(0),
+ fJetShapeSigma2SecondSub(0),
fJetShapeConstituentFirstDer(0),
fJetShapeConstituentSecondDer(0),
fJetShapeConstituentFirstSub(0),
fJetShapeCircularitySecondDer(0),
fJetShapeCircularityFirstSub(0),
fJetShapeCircularitySecondSub(0),
+ fJetShapeSigma2FirstDer(0),
+ fJetShapeSigma2SecondDer(0),
+ fJetShapeSigma2FirstSub(0),
+ fJetShapeSigma2SecondSub(0),
fJetShapeConstituentFirstDer(0),
fJetShapeConstituentSecondDer(0),
fJetShapeConstituentFirstSub(0),
fJetShapeConstituentSecondSub(0),
- fJetShapeLeSubFirstDer(0),
+ fJetShapeLeSubFirstDer(0),
fJetShapeLeSubSecondDer(0),
fJetShapeLeSubFirstSub(0),
fJetShapeLeSubSecondSub(0)
fJetShapeCircularitySecondDer(0),
fJetShapeCircularityFirstSub(0),
fJetShapeCircularitySecondSub(0),
+ fJetShapeSigma2FirstDer(0),
+ fJetShapeSigma2SecondDer(0),
+ fJetShapeSigma2FirstSub(0),
+ fJetShapeSigma2SecondSub(0),
fJetShapeConstituentFirstDer(0),
fJetShapeConstituentSecondDer(0),
fJetShapeConstituentFirstSub(0),
fJetShapeCircularitySecondDer(jet.fJetShapeCircularitySecondDer),
fJetShapeCircularityFirstSub(jet.fJetShapeCircularityFirstSub),
fJetShapeCircularitySecondSub(jet.fJetShapeCircularitySecondSub),
+ fJetShapeSigma2FirstDer(jet.fJetShapeSigma2FirstDer),
+ fJetShapeSigma2SecondDer(jet.fJetShapeSigma2SecondDer),
+ fJetShapeSigma2FirstSub(jet.fJetShapeSigma2FirstSub),
+ fJetShapeSigma2SecondSub(jet.fJetShapeSigma2SecondSub),
fJetShapeConstituentFirstDer(jet.fJetShapeConstituentFirstDer),
fJetShapeConstituentSecondDer(jet.fJetShapeConstituentSecondDer),
fJetShapeConstituentFirstSub(jet.fJetShapeConstituentFirstSub),
fJetShapeCircularitySecondDer = jet.fJetShapeCircularitySecondDer;
fJetShapeCircularityFirstSub = jet.fJetShapeCircularityFirstSub;
fJetShapeCircularitySecondSub = jet.fJetShapeCircularitySecondSub;
+ fJetShapeSigma2FirstDer = jet.fJetShapeSigma2FirstDer;
+ fJetShapeSigma2SecondDer = jet.fJetShapeSigma2SecondDer;
+ fJetShapeSigma2FirstSub = jet.fJetShapeSigma2FirstSub;
+ fJetShapeSigma2SecondSub = jet.fJetShapeSigma2SecondSub;
fJetShapeConstituentFirstDer = jet.fJetShapeConstituentFirstDer;
fJetShapeConstituentSecondDer = jet.fJetShapeConstituentSecondDer;
fJetShapeConstituentFirstSub = jet.fJetShapeConstituentFirstSub;
Double_t GetFirstOrderSubtractedCircularity() const { return fJetShapeCircularityFirstSub ; }
Double_t GetSecondOrderSubtractedCircularity() const { return fJetShapeCircularitySecondSub ; }
+ //Sigma2
+ void SetFirstDerivativeSigma2(Double_t d) { fJetShapeSigma2FirstDer = d ; }
+ void SetSecondDerivativeSigma2(Double_t d) { fJetShapeSigma2SecondDer = d ; }
+ void SetFirstOrderSubtractedSigma2(Double_t d) { fJetShapeSigma2FirstSub = d ; }
+ void SetSecondOrderSubtractedSigma2(Double_t d) { fJetShapeSigma2SecondSub = d ; }
+ Double_t GetFirstDerivativeSigma2() const { return fJetShapeSigma2FirstDer ; }
+ Double_t GetSecondDerivativeSigma2() const { return fJetShapeSigma2SecondDer ; }
+ Double_t GetFirstOrderSubtractedSigma2() const { return fJetShapeSigma2FirstSub ; }
+ Double_t GetSecondOrderSubtractedSigma2() const { return fJetShapeSigma2SecondSub ; }
+
+
//number of contituents
void SetFirstDerivativeConstituent(Double_t d) { fJetShapeConstituentFirstDer = d ; }
void SetSecondDerivativeConstituent(Double_t d) { fJetShapeConstituentSecondDer = d ; }
Double_t fJetShapeCircularityFirstSub; //! result from shape derivatives for jet circularity: 1st order subtracted
Double_t fJetShapeCircularitySecondSub; //! result from shape derivatives for jetcircularity: 2nd order subtracted
+ Double_t fJetShapeSigma2FirstDer; //! result from shape derivatives for jet sigma2: 1st derivative
+ Double_t fJetShapeSigma2SecondDer; //! result from shape derivatives for jet sigma2: 2nd derivative
+ Double_t fJetShapeSigma2FirstSub; //! result from shape derivatives for jet sigma2: 1st order subtracted
+ Double_t fJetShapeSigma2SecondSub; //! result from shape derivatives for jetsigma2: 2nd order subtracted
+
Double_t fJetShapeConstituentFirstDer; //! result from shape derivatives for jet const: 1st derivative
Double_t fJetShapeConstituentSecondDer; //! result from shape derivatives for jet const: 2nd derivative
Double_t fJetShapeConstituentFirstSub; //! result from shape derivatives for jet const: 1st order subtracted
fjw.DoGenericSubtractionJetAngularity();
fjw.DoGenericSubtractionJetpTD();
fjw.DoGenericSubtractionJetCircularity();
+ fjw.DoGenericSubtractionJetSigma2();
fjw.DoGenericSubtractionJetConstituent();
fjw.DoGenericSubtractionJetLeSub();
}
jet->SetFirstOrderSubtractedCircularity(jetCircularityInfo[ij].first_order_subtracted());
jet->SetSecondOrderSubtractedCircularity(jetCircularityInfo[ij].second_order_subtracted());
}
+
+ std::vector<fastjet::contrib::GenericSubtractorInfo> jetSigma2Info = fjw.GetGenSubtractorInfoJetSigma2();
+ Int_t ns = (Int_t)jetSigma2Info.size();
+ if(ns>ij && ns>0) {
+ jet->SetFirstDerivativeSigma2(jetSigma2Info[ij].first_derivative());
+ jet->SetSecondDerivativeSigma2(jetSigma2Info[ij].second_derivative());
+ jet->SetFirstOrderSubtractedSigma2(jetSigma2Info[ij].first_order_subtracted());
+ jet->SetSecondOrderSubtractedSigma2(jetSigma2Info[ij].second_order_subtracted());
+ }
+
std::vector<fastjet::contrib::GenericSubtractorInfo> jetConstituentInfo = fjw.GetGenSubtractorInfoJetConstituent();
Int_t nco= (Int_t)jetConstituentInfo.size();
}
#endif
- // loop over constituents
+ // Fill constituent info
std::vector<fastjet::PseudoJet> constituents(fjw.GetJetConstituents(ij));
jet->SetNumberOfTracks(constituents.size());
jet->SetNumberOfClusters(constituents.size());
Double_t mcpt = 0;
Double_t emcpt = 0;
- for(UInt_t ic = 0; ic < constituents.size(); ++ic) {
- Int_t uid = constituents[ic].user_index();
- AliDebug(3,Form("Processing constituent %d", uid));
- if ((uid == -1) /*&& (constituents[ic].kt2() < 1e-25)*/) { //ghost particle
- ++gall;
- Double_t gphi = constituents[ic].phi();
- if (gphi<0)
- gphi += TMath::TwoPi();
- gphi *= TMath::RadToDeg();
- Double_t geta = constituents[ic].eta();
- if ((gphi > geom->GetArm1PhiMin()) && (gphi < geom->GetArm1PhiMax()) &&
- (geta > geom->GetArm1EtaMin()) && (geta < geom->GetArm1EtaMax()))
- ++gemc;
- } else if ((uid > 0) && fTracks) { // track constituent
- Int_t tid = uid - 100;
- AliVParticle *t = static_cast<AliVParticle*>(fTracks->At(tid));
- if (!t) {
- AliError(Form("Could not find track %d",tid));
- continue;
- }
- if (jetCount < fMarkConst) {
- AliDebug(2,Form("Marking track %d with bit map %d", tid, fJetType));
- t->SetBit(fJetType);
- }
- Double_t cEta = t->Eta();
- Double_t cPhi = t->Phi();
- Double_t cPt = t->Pt();
- Double_t cP = t->P();
- if (t->Charge() == 0) {
- neutralE += cP;
- ++nneutral;
- if (cPt > maxNe)
- maxNe = cPt;
- } else {
- ++ncharged;
- if (cPt > maxCh)
- maxCh = cPt;
- }
- if (fIsMcPart || TMath::Abs(t->GetLabel()) > fMinMCLabel) // check if MC particle
- mcpt += cPt;
-
- if (cPhi<0)
- cPhi += TMath::TwoPi();
- cPhi *= TMath::RadToDeg();
- if ((cPhi > geom->GetArm1PhiMin()) && (cPhi < geom->GetArm1PhiMax()) &&
- (cEta > geom->GetArm1EtaMin()) && (cEta < geom->GetArm1EtaMax())) {
- emcpt += cPt;
- ++cemc;
- }
-
- jet->AddTrackAt(tid, nt);
- ++nt;
- } else if (fClus) { // cluster constituent
- Int_t cid = -uid - 100;
- AliVCluster *c = 0;
- Double_t cEta=0,cPhi=0,cPt=0,cP=0;
- if (fIsEmcPart) {
- AliEmcalParticle *ep = static_cast<AliEmcalParticle*>(fClus->At(cid));
- if (!ep)
- continue;
- c = ep->GetCluster();
- if (!c)
- continue;
- if (jetCount < fMarkConst)
- ep->SetBit(fJetType);
- cEta = ep->Eta();
- cPhi = ep->Phi();
- cPt = ep->Pt();
- cP = ep->P();
- } else {
- c = static_cast<AliVCluster*>(fClus->At(cid));
- if (!c)
- continue;
- if (jetCount < fMarkConst)
- c->SetBit(fJetType);
- TLorentzVector nP;
- c->GetMomentum(nP, vertex);
- cEta = nP.Eta();
- cPhi = nP.Phi();
- cPt = nP.Pt();
- cP = nP.P();
- }
-
- neutralE += cP;
- if (cPt > maxNe)
- maxNe = cPt;
-
- if (c->GetLabel() > fMinMCLabel) // MC particle
- mcpt += c->GetMCEnergyFraction() > 1e-6 ? cPt * c->GetMCEnergyFraction() : cPt;
-
- if (cPhi<0)
- cPhi += TMath::TwoPi();
- cPhi *= TMath::RadToDeg();
- if ((cPhi > geom->GetArm1PhiMin()) && (cPhi < geom->GetArm1PhiMax()) &&
- (cEta > geom->GetArm1EtaMin()) && (cEta < geom->GetArm1EtaMax())) {
- emcpt += cPt;
- ++cemc;
- }
-
- jet->AddClusterAt(cid, nc);
- ++nc;
- ++nneutral;
- } else {
- AliError(Form("%s: No logical way to end up here.", GetName()));
- continue;
- }
- } /* end of constituent loop */
-
+ FillJetConstituents(constituents,jet,vertex,jetCount,nt,nc,maxCh,maxNe,ncharged,nneutral,neutralE,mcpt,cemc,emcpt,gall,gemc);
jet->SetNumberOfTracks(nt);
jet->SetNumberOfClusters(nc);
jet->SortConstituents();
AliEmcalJet *jet_sub = new ((*fJetsSub)[jetCount])
AliEmcalJet(jets_sub[ijet].perp(), jets_sub[ijet].eta(), jets_sub[ijet].phi(), jets_sub[ijet].m());
jet_sub->SetLabel(ijet);
+ // Fill constituent info
+ std::vector<fastjet::PseudoJet> constituents_sub(fjw.GetJetConstituents(ijet));
+ jet_sub->SetNumberOfTracks(constituents_sub.size());
+ jet_sub->SetNumberOfClusters(constituents_sub.size());
+ Int_t nt = 0;
+ Int_t nc = 0;
+ Double_t neutralE = 0;
+ Double_t maxCh = 0;
+ Double_t maxNe = 0;
+ Int_t gall = 0;
+ Int_t gemc =0;
+ Int_t cemc = 0;
+ Int_t ncharged = 0;
+ Int_t nneutral = 0;
+ Double_t mcpt = 0;
+ Double_t emcpt = 0;
+
+ FillJetConstituents(constituents_sub,jet_sub,vertex,jetCount,nt,nc,maxCh,maxNe,ncharged,nneutral,neutralE,mcpt,cemc,emcpt,gall,gemc);
+ jet_sub->SetNumberOfTracks(nt);
+ jet_sub->SetNumberOfClusters(nc);
+ jet_sub->SortConstituents();
+
+
+
fastjet::PseudoJet area(fjw.GetJetAreaVector(ijet));
jet_sub->SetArea(area.perp());
jet_sub->SetAreaEta(area.eta());
}
}
#endif
+
+
+
+
+
} //constituent subtraction
}
return 1;
}
+
+//___________________________________________________________________________________________________________________
+void AliEmcalJetTask::FillJetConstituents(std::vector<fastjet::PseudoJet>& constituents,AliEmcalJet *jet,Double_t vertex[3],Int_t jetCount,Int_t& nt,Int_t& nc,Double_t& maxCh,Double_t& maxNe,Int_t& ncharged,Int_t& nneutral,Double_t& neutralE,Double_t& mcpt,Int_t& cemc,Double_t& emcpt,Int_t& gall,Int_t& gemc){
+ nt = 0;
+ nc = 0;
+ neutralE = 0;
+ maxCh = 0;
+ maxNe = 0;
+ gall = 0;
+ gemc =0;
+ cemc = 0;
+ ncharged = 0;
+ nneutral = 0;
+ mcpt = 0;
+ emcpt = 0;
+ AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance();
+ for(UInt_t ic = 0; ic < constituents.size(); ++ic) {
+ Int_t uid = constituents[ic].user_index();
+ AliDebug(3,Form("Processing constituent %d", uid));
+ if ((uid == -1) /*&& (constituents[ic].kt2() < 1e-25)*/) { //ghost particle
+ ++gall;
+ Double_t gphi = constituents[ic].phi();
+ if (gphi<0)
+ gphi += TMath::TwoPi();
+ gphi *= TMath::RadToDeg();
+ Double_t geta = constituents[ic].eta();
+ if ((gphi > geom->GetArm1PhiMin()) && (gphi < geom->GetArm1PhiMax()) &&
+ (geta > geom->GetArm1EtaMin()) && (geta < geom->GetArm1EtaMax()))
+ ++gemc;
+ } else if ((uid > 0) && fTracks) { // track constituent
+ Int_t tid = uid - 100;
+ AliVParticle *t = static_cast<AliVParticle*>(fTracks->At(tid));
+ if (!t) {
+ AliError(Form("Could not find track %d",tid));
+ continue;
+ }
+ if (jetCount < fMarkConst) {
+ AliDebug(2,Form("Marking track %d with bit map %d", tid, fJetType));
+ t->SetBit(fJetType);
+ }
+ Double_t cEta = t->Eta();
+ Double_t cPhi = t->Phi();
+ Double_t cPt = t->Pt();
+ Double_t cP = t->P();
+ if (t->Charge() == 0) {
+ neutralE += cP;
+ ++nneutral;
+ if (cPt > maxNe)
+ maxNe = cPt;
+ } else {
+ ++ncharged;
+ if (cPt > maxCh)
+ maxCh = cPt;
+ }
+ if (fIsMcPart || TMath::Abs(t->GetLabel()) > fMinMCLabel) // check if MC particle
+ mcpt += cPt;
+
+ if (cPhi<0)
+ cPhi += TMath::TwoPi();
+ cPhi *= TMath::RadToDeg();
+ if ((cPhi > geom->GetArm1PhiMin()) && (cPhi < geom->GetArm1PhiMax()) &&
+ (cEta > geom->GetArm1EtaMin()) && (cEta < geom->GetArm1EtaMax())) {
+ emcpt += cPt;
+ ++cemc;
+ }
+
+ jet->AddTrackAt(tid, nt);
+ ++nt;
+ } else if (fClus) { // cluster constituent
+ Int_t cid = -uid - 100;
+ AliVCluster *c = 0;
+ Double_t cEta=0,cPhi=0,cPt=0,cP=0;
+ if (fIsEmcPart) {
+ AliEmcalParticle *ep = static_cast<AliEmcalParticle*>(fClus->At(cid));
+ if (!ep)
+ continue;
+ c = ep->GetCluster();
+ if (!c)
+ continue;
+ if (jetCount < fMarkConst)
+ ep->SetBit(fJetType);
+ cEta = ep->Eta();
+ cPhi = ep->Phi();
+ cPt = ep->Pt();
+ cP = ep->P();
+ } else {
+ c = static_cast<AliVCluster*>(fClus->At(cid));
+ if (!c)
+ continue;
+ if (jetCount < fMarkConst)
+ c->SetBit(fJetType);
+ TLorentzVector nP;
+ c->GetMomentum(nP, vertex);
+ cEta = nP.Eta();
+ cPhi = nP.Phi();
+ cPt = nP.Pt();
+ cP = nP.P();
+ }
+
+ neutralE += cP;
+ if (cPt > maxNe)
+ maxNe = cPt;
+
+ if (c->GetLabel() > fMinMCLabel) // MC particle
+ mcpt += c->GetMCEnergyFraction() > 1e-6 ? cPt * c->GetMCEnergyFraction() : cPt;
+
+ if (cPhi<0)
+ cPhi += TMath::TwoPi();
+ cPhi *= TMath::RadToDeg();
+ if ((cPhi > geom->GetArm1PhiMin()) && (cPhi < geom->GetArm1PhiMax()) &&
+ (cEta > geom->GetArm1EtaMin()) && (cEta < geom->GetArm1EtaMax())) {
+ emcpt += cPt;
+ ++cemc;
+ }
+
+ jet->AddClusterAt(cid, nc);
+ ++nc;
+ ++nneutral;
+ } else {
+ AliError(Form("%s: No logical way to end up here.", GetName()));
+ continue;
+ }
+
+
+
+
+ }
+
+
+}
+//______________________________________________________________________________________
#include "AliAnalysisTaskSE.h"
#include "AliFJWrapper.h"
#include "AliAODMCParticle.h"
-
+#include "AliEmcalJet.h"
class AliEmcalJetTask : public AliAnalysisTaskSE {
public:
void UserCreateOutputObjects();
void UserExec(Option_t *option);
void Terminate(Option_t *option);
-
+ void FillJetConstituents(std::vector<fastjet::PseudoJet>& constituents,AliEmcalJet *jet,Double_t vertex[3],Int_t jetCount,Int_t& nt,Int_t& nc,Double_t& maxCh,Double_t& maxNe,Int_t& ncharged,Int_t& nneutral,Double_t& neutralE,Double_t& mcpt,Int_t& cemc,Double_t& emcpt,Int_t& gall,Int_t& gemc);
+
Bool_t IsLocked() { if(fLocked) {AliFatal("Jet finder task is locked! Changing properties is not allowed."); return kTRUE;} else return kFALSE;};
void SetLocked() { fLocked = kTRUE;}
void SelectConstituents(UInt_t constSel, UInt_t MCconstSel) { fConstSel = constSel; fMCConstSel = MCconstSel; };
const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetAngularity() const {return fGenSubtractorInfoJetAngularity ; }
const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetpTD() const {return fGenSubtractorInfoJetpTD ; }
const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetCircularity() const {return fGenSubtractorInfoJetCircularity ; }
+ const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetSigma2() const {return fGenSubtractorInfoJetSigma2; }
const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetConstituent() const {return fGenSubtractorInfoJetConstituent ; }
const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetLeSub() const {return fGenSubtractorInfoJetLeSub ; }
const std::vector<fastjet::PseudoJet> GetConstituentSubtrJets() const {return fConstituentSubtrJets ; }
virtual Int_t DoGenericSubtractionJetAngularity();
virtual Int_t DoGenericSubtractionJetpTD();
virtual Int_t DoGenericSubtractionJetCircularity();
+ virtual Int_t DoGenericSubtractionJetSigma2();
virtual Int_t DoGenericSubtractionJetConstituent();
virtual Int_t DoGenericSubtractionJetLeSub();
virtual Int_t DoConstituentSubtraction();
std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetAngularity; //!
std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetpTD; //!
std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetCircularity; //!
+ std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetSigma2; //!
std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetConstituent; //!
std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetLeSub; //!
#endif
, fGenSubtractorInfoJetAngularity ( )
, fGenSubtractorInfoJetpTD ( )
, fGenSubtractorInfoJetCircularity( )
+ , fGenSubtractorInfoJetSigma2()
, fGenSubtractorInfoJetConstituent ( )
, fGenSubtractorInfoJetLeSub ( )
#endif
#endif
return 0;
}
+//_________________________________________________________________________________________________
+Int_t AliFJWrapper::DoGenericSubtractionJetSigma2() {
+ //Do generic subtraction for jet mass
+#ifdef FASTJET_VERSION
+ if(fUseExternalBkg) fGenSubtractor = new fj::contrib::GenericSubtractor(fRho,fRhom);
+ else fGenSubtractor = new fj::contrib::GenericSubtractor(fBkrdEstimator);
+
+ // Define jet shape
+ AliJetShapeSigma2 shapesigma2;
+ // clear the generic subtractor info vector
+ fGenSubtractorInfoJetSigma2.clear();
+ for (unsigned i = 0; i < fInclusiveJets.size(); i++) {
+ fj::contrib::GenericSubtractorInfo infoSigma;
+ if(fInclusiveJets[i].perp()>0.)
+ double subtracted_shape = (*fGenSubtractor)(shapesigma2, fInclusiveJets[i], infoSigma);
+ fGenSubtractorInfoJetSigma2.push_back(infoSigma);
+ }
+#endif
+ return 0;
+}
//_________________________________________________________________________________________________
Int_t AliFJWrapper::DoGenericSubtractionJetConstituent() {
//Do generic subtraction for jet mass
}
};
+class AliJetShapeSigma2 : public fastjet::FunctionOfPseudoJet<Double32_t>{
+ public:
+ virtual std::string description() const{return "cms sigma2";}
+ Double32_t result(const fastjet::PseudoJet &jet) const {
+ if (!jet.has_constituents())
+ return 0;
+ Double_t mxx = 0.;
+ Double_t myy = 0.;
+ Double_t mxy = 0.;
+ int nc = 0;
+ Double_t sump2 = 0.;
+
+
+ std::vector<fastjet::PseudoJet> constits = jet.constituents();
+ for(UInt_t ic = 0; ic < constits.size(); ++ic) {
+ Double_t ppt=constits[ic].perp();
+ Double_t dphi = constits[ic].phi()-jet.phi();
+ if(dphi<-1.*TMath::Pi()) dphi+=TMath::TwoPi();
+ if(dphi>TMath::Pi()) dphi-=TMath::TwoPi();
+ Double_t deta = constits[ic].eta()-jet.eta();
+ mxx += ppt*ppt*deta*deta;
+ myy += ppt*ppt*dphi*dphi;
+ mxy -= ppt*ppt*deta*dphi;
+ nc++;
+ sump2 += ppt*ppt;
+ }
+ if(nc<2) return 0;
+ if(sump2==0) return 0;
+ // Sphericity Matrix
+ Double_t ele[4] = {mxx , mxy, mxy, myy };
+ TMatrixDSym m0(2,ele);
+
+ // Find eigenvectors
+ TMatrixDSymEigen m(m0);
+ TVectorD eval(2);
+ TMatrixD evecm = m.GetEigenVectors();
+ eval = m.GetEigenValues();
+ // Largest eigenvector
+ int jev = 0;
+ if (eval[0] < eval[1]) jev = 1;
+ TVectorD evec0(2);
+ // Principle axis
+ evec0 = TMatrixDColumn(evecm, jev);
+ Double_t compx=evec0[0];
+ Double_t compy=evec0[1];
+ TVector2 evec(compx, compy);
+ Double_t sigma2=0;
+ if(jev==1) sigma2=TMath::Sqrt(TMath::Abs(eval[0])/sump2);
+ if(jev==0) sigma2=TMath::Sqrt(TMath::Abs(eval[1])/sump2);
+
+ return sigma2;
+
+ }
+};
+
+
+
class AliJetShapeLeSub : public fastjet::FunctionOfPseudoJet<Double32_t>{
public:
virtual std::string description() const{return "leading mins subleading";}