6 #include <TClonesArray.h>
10 #include <THnSparse.h>
13 #include <TLorentzVector.h>
19 #include <AliAnalysisDataSlot.h>
20 #include <AliAnalysisDataContainer.h>
22 #include "TMatrixDSym.h"
23 #include "TMatrixDSymEigen.h"
26 #include "AliVCluster.h"
27 #include "AliVTrack.h"
32 #include "AliMCEvent.h"
33 #include "AliGenPythiaEventHeader.h"
34 #include "AliAODMCHeader.h"
35 #include "AliMCEvent.h"
36 #include "AliAnalysisManager.h"
42 #include "AliAODEvent.h"
54 fMinFractionShared(0),
55 fJetShapeType(kGenShapes),
57 fJetSelection(kInclusive),
66 fangWindowRecoil(0.6),
73 fOneConstSelectOn(kFALSE),
85 fTreeObservableTagging(0x0)
88 SetMakeGeneralHistograms(kTRUE);
95 fMinFractionShared(0),
96 fJetShapeType(kGenShapes),
98 fJetSelection(kInclusive),
100 fPtThreshold(-9999.),
105 fangWindowRecoil(0.6),
109 fCentSelectOn(kTRUE),
112 fOneConstSelectOn(kFALSE),
124 fTreeObservableTagging(0x0)
131 DefineOutput(1, TList::Class());
132 DefineOutput(2, TTree::Class());
150 Bool_t oldStatus = TH1::AddDirectoryStatus();
151 TH1::AddDirectory(kFALSE);
155 const char* nameoutput = GetOutputSlot(2)->GetContainer()->GetName();
158 const Int_t
nVar = 21;
161 TString *fShapesVarNames =
new TString [
nVar];
163 fShapesVarNames[0] =
"partonCode";
164 fShapesVarNames[1] =
"ptJet";
165 fShapesVarNames[2] =
"ptDJet";
166 fShapesVarNames[3] =
"mJet";
167 fShapesVarNames[4] =
"nbOfConst";
168 fShapesVarNames[5] =
"angularity";
169 fShapesVarNames[6] =
"circularity";
170 fShapesVarNames[7] =
"lesub";
171 fShapesVarNames[8] =
"CoreFraction";
172 fShapesVarNames[9] =
"Nsubjet1";
173 fShapesVarNames[10] =
"Nsubjet2";
174 fShapesVarNames[11] =
"SubjetFraction";
175 fShapesVarNames[12] =
"weightPythia";
177 fShapesVarNames[13] =
"NT70";
178 fShapesVarNames[14] =
"nConstNT70";
179 fShapesVarNames[15] =
"NT80";
180 fShapesVarNames[16] =
"nConstNT80";
181 fShapesVarNames[17] =
"NT90";
182 fShapesVarNames[18] =
"nConstNT90";
183 fShapesVarNames[19] =
"NT95";
184 fShapesVarNames[20] =
"nConstNT95";
187 for(Int_t ivar=0; ivar <
nVar; ivar++){
188 cout<<
"looping over variables"<<endl;
193 fPhiJetCorr6=
new TH2F(
"fPhiJetCorr6",
"fPhiJetCorr6", 50, 0, 2*TMath::Pi(), 50, 0, 2*TMath::Pi());
195 fEtaJetCorr6=
new TH2F(
"fEtaJetCorr6",
"fEtaJetCorr6", 50, -1.5, 1.5, 50, -1.5, 1.5);
198 fPhiJetCorr7=
new TH2F(
"fPhiJetCorr7",
"fPhiJetCorr7", 50, 0, 2*TMath::Pi(), 50, 0, 2*TMath::Pi());
200 fEtaJetCorr7=
new TH2F(
"fEtaJetCorr7",
"fEtaJetCorr7", 50, -1.5, 1.5, 50, -1.5, 1.5);
203 fPtJetCorr=
new TH2F(
"fPtJetCorr",
"fPtJetCorr", 100, 0, 200, 100, 0, 200);
205 fPtJet=
new TH1F(
"fPtJet",
"fPtJet", 100, 0, 200);
208 fhpTjetpT=
new TH2F(
"fhpTjetpT",
"fhpTjetpT", 200, 0, 200, 200, 0, 200);
210 fhPt=
new TH1F(
"fhPt",
"fhPt", 200, 0, 200);
212 fhPhi=
new TH1F(
"fhPhi",
"fhPhi", 100, -TMath::Pi(), TMath::Pi());
215 fNbOfConstvspT=
new TH2F(
"fNbOfConstvspT",
"fNbOfConstvspT", 100, 0, 100, 200, 0, 200);
220 TH1::AddDirectory(oldStatus);
224 delete [] fShapesVarNames;
248 AliAODTrack *triggerHadron = 0x0;
255 if (triggerHadronLabel==-99999) {
261 TClonesArray *trackArrayAn = partContAn->GetArray();
262 triggerHadron =
static_cast<AliAODTrack*
>(trackArrayAn->At(triggerHadronLabel));
264 if (!triggerHadron) {
275 fhPt->Fill(triggerHadron->Pt());
280 jetCont->ResetCurrentID();
288 Int_t ifound=0, jfound=0;
289 Int_t ilab=-1, jlab=-1;
298 Float_t dphiRecoil = 0.;
325 Float_t dRp1 = TMath::Sqrt(jp1 * jp1 + detap1 * detap1);
335 dRp1 = TMath::Sqrt(jp1 * jp1 + detap1 * detap1);
346 Double_t ptSubtracted = 0;
347 ptSubtracted= jet1->
Pt();
370 Float_t nTFractions[8]={0.,0.,0.,0.,0.,0.,0.,0.};
372 for (Int_t ishape=13; ishape<21; ishape++)
fShapesVar[ishape] = nTFractions[ishape-13];
402 AliVParticle *vp1 = 0x0;
407 Printf(
"AliVParticle associated to constituent not found");
412 Double_t dr2 = (vp1->Eta()-jet->
Eta())*(vp1->Eta()-jet->
Eta()) + dphi*dphi;
413 Double_t dr = TMath::Sqrt(dr2);
414 num=num+vp1->Pt()*dr;
440 AliVParticle *vp1 = 0x0;
445 Printf(
"AliVParticle associated to constituent not found");
449 num=num+vp1->Pt()*vp1->Pt();
452 return TMath::Sqrt(num)/den;
462 return PTD(jet, jetContNb);
477 Double_t pxjet=jet->
Px();
478 Double_t pyjet=jet->
Py();
479 Double_t pzjet=jet->
Pz();
483 TVector3 ppJ1(pxjet, pyjet, pzjet);
484 TVector3 ppJ3(- pxjet* pzjet, - pyjet * pzjet, pxjet * pxjet + pyjet * pyjet);
486 TVector3 ppJ2(-pyjet, pxjet, 0);
488 AliVParticle *vp1 = 0x0;
493 Printf(
"AliVParticle associated to constituent not found");
497 TVector3 pp(vp1->Px(), vp1->Py(), vp1->Pz());
500 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
501 TVector3 pPerp = pp - pLong;
504 Float_t ppjX = pPerp.Dot(ppJ2);
505 Float_t ppjY = pPerp.Dot(ppJ3);
506 Float_t ppjT = TMath::Sqrt(ppjX * ppjX + ppjY * ppjY);
507 if(ppjT<=0)
return 0;
509 mxx += (ppjX * ppjX / ppjT);
510 myy += (ppjY * ppjY / ppjT);
511 mxy += (ppjX * ppjY / ppjT);
516 if(sump2==0)
return 0;
518 Double_t ele[4] = {mxx / sump2, mxy / sump2, mxy / sump2, myy / sump2};
519 TMatrixDSym m0(2,ele);
522 TMatrixDSymEigen m(m0);
524 TMatrixD evecm = m.GetEigenVectors();
525 eval = m.GetEigenValues();
529 if (eval[0] < eval[1]) jev = 1;
532 evec0 = TMatrixDColumn(evecm, jev);
533 Double_t compx=evec0[0];
534 Double_t compy=evec0[1];
535 TVector2 evec(compx, compy);
537 if(jev==1) circ=2*eval[0];
538 if(jev==0) circ=2*eval[1];
569 AliVParticle *vp1 = 0x0;
570 AliVParticle *vp2 = 0x0;
571 std::vector<int> ordindex;
576 if(ordindex.size()<2)
return -1;
580 Printf(
"AliVParticle associated to Leading constituent not found");
586 Printf(
"AliVParticle associated to Subleading constituent not found");
606 return LeSub(jet, jetContNb);
631 const AliVVertex *vert = InputEvent()->GetPrimaryVertex();
632 Double_t dVtx[3]={vert->GetX(),vert->GetY(),vert->GetZ()};
633 if(Reclusterer->AliEmcalJetFinder::Filter(Jet, JetCont, dVtx)){;}
645 AliVParticle *JetParticle=0x0;
646 Double_t SubJetiness_Numerator = 0;
647 Double_t SubJetiness_Denominator = 0;
654 for (Int_t j=1; j<=N; j++){
662 DeltaR1=TMath::Power((Reclusterer->
GetJet(Index)->
Pt()),A)*TMath::Power((TMath::Sqrt((((JetParticle->Eta())-(Reclusterer->
GetJet(Index)->
Eta()))*((JetParticle->Eta())- (Reclusterer->
GetJet(Index)->
Eta())))+((
RelativePhi((Reclusterer->
GetJet(Index)->
Phi()),JetParticle->Phi()))*(
RelativePhi((Reclusterer->
GetJet(Index)->
Phi()),JetParticle->Phi()))))),B);
665 DeltaR2=TMath::Power((Reclusterer->
GetJet(Index)->
Pt()),A)*TMath::Power((TMath::Sqrt((((JetParticle->Eta())-(Reclusterer->
GetJet(Index)->
Eta()))*((JetParticle->Eta())- (Reclusterer->
GetJet(Index)->
Eta())))+((
RelativePhi((Reclusterer->
GetJet(Index)->
Phi()),JetParticle->Phi()))*(
RelativePhi((Reclusterer->
GetJet(Index)->
Phi()),JetParticle->Phi()))))),B);
666 if (DeltaR2<DeltaR1) DeltaR1=DeltaR2;
669 SubJetiness_Numerator=SubJetiness_Numerator+(JetParticle->Pt()*DeltaR1);
670 if (A>=0) SubJetiness_Denominator=SubJetiness_Denominator+(TMath::Power((Reclusterer->
GetJet(
SubJetOrdering(Jet,Reclusterer,1,0,kTRUE))->
Pt()),A)*JetParticle->Pt()*TMath::Power(JetRadius,B));
671 else SubJetiness_Denominator=SubJetiness_Denominator+(TMath::Power((Reclusterer->
GetJet(
SubJetOrdering(Jet,Reclusterer,N,0,kTRUE))->
Pt()),A)*JetParticle->Pt()*TMath::Power(JetRadius,B));
673 if (SubJetiness_Denominator!=0 && !Error)
return SubJetiness_Numerator/SubJetiness_Denominator;
684 AliVParticle *JetParticle=0x0;
685 Double_t SubJetiness_Numerator = 0;
686 Double_t SubJetiness_Denominator = 0;
690 if(Index==-999)
return -2;
691 SubJetiness_Numerator=(Reclusterer->
GetJet(Index)->
Pt());
692 SubJetiness_Denominator=Jet->
Pt();
693 return SubJetiness_Numerator/SubJetiness_Denominator;
705 AliVParticle *vp1 = 0x0;
710 Printf(
"AliVParticle associated to constituent not found");
715 Double_t dr2 = (vp1->Eta()-jet->
Eta())*(vp1->Eta()-jet->
Eta()) + dphi*dphi;
716 Double_t dr = TMath::Sqrt(dr2);
720 return num/jet->
Pt();
744 Double_t SortingVariable;
745 Int_t ArraySize =N+1;
746 TArrayD *JetSorter =
new TArrayD(ArraySize);
747 TArrayD *JetIndexSorter =
new TArrayD(ArraySize);
748 for (Int_t i=0; i<ArraySize; i++){
749 JetSorter->SetAt(0,i);
751 for (Int_t i=0; i<ArraySize; i++){
752 JetIndexSorter->SetAt(0,i);
756 SubJet=Reclusterer->
GetJet(i);
757 if (Type==0) SortingVariable=SubJet->
Pt();
758 else if (Type==1) SortingVariable=SubJet->
E();
759 else if (Type==2) SortingVariable=SubJet->
M();
760 for (Int_t j=0; j<N; j++){
761 if (SortingVariable>JetSorter->GetAt(j)){
762 for (Int_t k=N-1; k>=j; k--){
763 JetSorter->SetAt(JetSorter->GetAt(k),k+1);
764 JetIndexSorter->SetAt(JetIndexSorter->GetAt(k),k+1);
766 JetSorter->SetAt(SortingVariable,j);
767 JetIndexSorter->SetAt(i,j);
772 if (!Index)
return JetSorter->GetAt(N-1);
773 else return JetIndexSorter->GetAt(N-1);
798 AliVParticle *vp1 = 0x0;
803 Printf(
"AliVParticle associated to constituent not found");
807 Double_t ppt=vp1->Pt();
810 Double_t deta = vp1->Eta()-jet->
Eta();
811 mxx += ppt*ppt*deta*deta;
812 myy += ppt*ppt*dphi*dphi;
813 mxy -= ppt*ppt*deta*TMath::Abs(dphi);
819 if(sump2==0)
return 0;
821 Double_t ele[4] = {mxx , mxy , mxy , myy };
822 TMatrixDSym m0(2,ele);
825 TMatrixDSymEigen m(m0);
827 TMatrixD evecm = m.GetEigenVectors();
828 eval = m.GetEigenValues();
832 if (eval[0] < eval[1]) jev = 1;
835 evec0 = TMatrixDColumn(evecm, jev);
836 Double_t compx=evec0[0];
837 Double_t compy=evec0[1];
838 TVector2 evec(compx, compy);
840 if(jev==1) sig=TMath::Sqrt(TMath::Abs(eval[0])/sump2);
841 if(jev==0) sig=TMath::Sqrt(TMath::Abs(eval[1])/sump2);
855 return Sigma2(jet, jetContNb);
867 Double_t ptJet = jet->
Pt();
869 AliVParticle *vp1 = 0x0;
870 std::vector<int> ordindex;
880 Printf(
"AliVParticle associated to Leading constituent not found");
884 if (nTFractions[0] <= 0.7*ptJet){
885 nTFractions[0] += vp1->Pt();
889 if (nTFractions[2] <= 0.8*ptJet){
890 nTFractions[2] += vp1->Pt();
894 if (nTFractions[4] <= 0.9*ptJet){
895 nTFractions[4] += vp1->Pt();
899 if (nTFractions[6] <= 0.95*ptJet){
900 nTFractions[6] += vp1->Pt();
911 TClonesArray *tracksArray = partCont->GetArray();
913 if(!partCont || !tracksArray)
return -99999;
914 AliAODTrack *track = 0x0;
918 TList *trackList =
new TList();
920 for (Int_t iTrigger=0; iTrigger<100; iTrigger++) triggers[iTrigger] = 0;
923 for(Int_t iTrack=0; iTrack <= tracksArray->GetEntriesFast(); iTrack++){
928 if (!emcPart)
continue;
929 if(TMath::Abs(emcPart->
Eta())>0.9)
continue;
930 if (emcPart->
Pt()<0.15)
continue;
932 if ((emcPart->
Pt() >= minpT) && (emcPart->
Pt()< maxpT)) {
933 trackList->Add(emcPart);
934 triggers[iTT] = iTrack;
939 track =
static_cast<AliAODTrack*
>(tracksArray->At(iTrack));
940 if (!track)
continue;
941 if(TMath::Abs(track->Eta())>0.9)
continue;
942 if (track->Pt()<0.15)
continue;
943 if (!(track->TestFilterBit(768)))
continue;
945 if ((track->Pt() >= minpT) && (track->Pt()< maxpT)) {
946 trackList->Add(track);
947 triggers[iTT] = iTrack;
954 if (iTT == 0)
return -99999;
955 Int_t nbRn = 0, index = 0 ;
956 TRandom3* random =
new TRandom3(0);
957 nbRn = random->Integer(iTT);
959 index = triggers[nbRn];
968 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
969 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
970 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
971 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
972 double dphi = mphi-vphi;
973 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
974 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
void SetRadius(Double_t val)
Float_t GetSigma2(AliEmcalJet *jet, Int_t jetContNb=0)
Double_t GetFirstOrderSubtractedAngularity() const
Float_t * fShapesVar
! jet shapes used for the tagging
Float_t GetJetMass(AliEmcalJet *jet, Int_t jetContNb=0)
void SetJetMinPt(Double_t val)
Double_t GetSecondOrderSubtractedSigma2() const
Float_t GetPartonEta6() const
AliJetContainer * GetJetContainer(Int_t i=0) const
Float_t GetPartonEta7() const
Double_t GetSecondOrderSubtractedConstituent() const
ClassImp(AliAnalysisTaskEmcalJetShapesMC) AliAnalysisTaskEmcalJetShapesMC
Float_t GetPythiaEventWeight() const
Float_t GetPartonPhi7() const
JetShapeType fJetShapeType
Double_t GetSecondOrderSubtractedpTD() const
Bool_t RetrieveEventObjects()
Double_t GetFirstOrderSubtractedLeSub() const
Float_t CoreFrac(AliEmcalJet *jet, Int_t jetContNb=0)
Float_t GetJetCircularity(AliEmcalJet *jet, Int_t jetContNb=0)
Float_t GetJetpTD(AliEmcalJet *jet, Int_t jetContNb=0)
Int_t GetPartonFlag7() const
Container for particles within the EMCAL framework.
Float_t GetPartonPhi6() const
Double_t GetFirstOrderSubtractedpTD() const
UShort_t GetNumberOfTracks() const
Float_t GetJetCoreFrac(AliEmcalJet *jet, Int_t jetContNb=0)
AliParticleContainer * GetParticleContainer(Int_t i=0) const
Double_t GetSecondOrderSubtractedLeSub() const
Int_t GetPartonFlag6() const
AliParticleContainer * GetParticleContainer() const
Double_t GetFirstOrderSubtractedConstituent() const
void SetJetAlgorithm(Int_t val)
Float_t GetJetNumberOfConstituents(AliEmcalJet *jet, Int_t jetContNb=0)
Task to store and correlate the MC shapes.
std::vector< int > SortConstituentsPt(TClonesArray *tracks) const
TTree * fTreeObservableTagging
! Tree with tagging variables subtracted MC or true MC or raw
Double_t RelativePhi(Double_t mphi, Double_t vphi)
Double_t GetSecondOrderSubtractedAngularity() const
Double_t GetSubjetFraction(AliEmcalJet *Jet, Int_t JetContNb, Double_t JetRadius, AliEmcalJetFinder *Reclusterer)
AliAnalysisTaskEmcalJetShapesMC()
Double_t fCent
!event centrality
Double_t GetSecondOrderSubtracted() const
Float_t PTD(AliEmcalJet *jet, Int_t jetContNb=0)
void Terminate(Option_t *option)
AliEmcalJet * GetNextAcceptJet()
Bool_t Data(TH1F *h, Double_t *rangefit, Bool_t writefit, Double_t &sgn, Double_t &errsgn, Double_t &bkg, Double_t &errbkg, Double_t &sgnf, Double_t &errsgnf, Double_t &sigmafit, Int_t &status)
Float_t GetJetAngularity(AliEmcalJet *jet, Int_t jetContNb=0)
TH2F * fhpTjetpT
! control plot fo the recoil analysis
Int_t SelectTrigger(Float_t minpT, Float_t maxpT)
AliEmcalJet * GetJet(Int_t index)
Float_t Angularity(AliEmcalJet *jet, Int_t jetContNb=0)
Double_t GetFirstOrderSubtractedCircularity() const
JetSelectionType fJetSelection
Bool_t RetrieveEventObjects()
AliEmcalList * fOutput
!output list
Double_t SubJetOrdering(AliEmcalJet *Jet, AliEmcalJetFinder *Reclusterer, Int_t N, Int_t Type, Bool_t Index)
Short_t TrackAt(Int_t idx) const
void NTValues(AliEmcalJet *jet, Int_t jetContNb, Float_t *nTFractions)
Double_t GetSecondOrderSubtractedCircularity() const
Float_t GetJetLeSub(AliEmcalJet *jet, Int_t jetContNb=0)
void UserCreateOutputObjects()
Store some informaion about a Pythia eventThis class is used to store some information about a Pythia...
void SetMakeGeneralHistograms(Bool_t g)
Base task in the EMCAL jet framework.
Represent a jet reconstructed using the EMCal jet framework.
const AliEmcalPythiaInfo * GetPythiaInfo() const
Float_t Circularity(AliEmcalJet *jet, Int_t jetContNb=0)
AliEmcalJetFinder * Recluster(AliEmcalJet *Jet, Int_t JetContNb, Double_t SubJetRadius, Double_t SubJetMinPt, Int_t Algorithm, const char *Name)
Declaration of class AliEmcalPythiaInfo.
virtual ~AliAnalysisTaskEmcalJetShapesMC()
void UserCreateOutputObjects()
Double_t GetFirstOrderSubtractedSigma2() const
Float_t Sigma2(AliEmcalJet *jet, Int_t jetContNb=0)
AliEmcalJetShapeProperties * GetShapeProperties() const
Double_t NSubJettiness(AliEmcalJet *Jet, Int_t JetContNb, Double_t JetRadius, AliEmcalJetFinder *Reclusterer, Int_t N, Int_t A, Int_t B)
Float_t GetPartonPt7() const
Float_t LeSub(AliEmcalJet *jet, Int_t jetContNb=0)
Double_t GetFirstOrderSubtracted() const
Container for jet within the EMCAL jet framework.
Float_t GetPartonPt6() const