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),
65 fangWindowRecoil(0.6),
72 fOneConstSelectOn(kFALSE),
84 fTreeObservableTagging(0x0)
87 for(
Int_t i=0;i<33;i++){
89 SetMakeGeneralHistograms(kTRUE);
96 fMinFractionShared(0),
97 fJetShapeType(kGenShapes),
99 fJetSelection(kInclusive),
100 fPtThreshold(-9999.),
105 fangWindowRecoil(0.6),
109 fCentSelectOn(kTRUE),
112 fOneConstSelectOn(kFALSE),
124 fTreeObservableTagging(0x0)
130 for(
Int_t i=0;i<33;i++){
135 DefineOutput(1, TList::Class());
136 DefineOutput(2, TTree::Class());
157 Bool_t oldStatus = TH1::AddDirectoryStatus();
158 TH1::AddDirectory(oldStatus);
164 const char* nameoutput = GetOutputSlot(2)->GetContainer()->GetName();
171 fShapesVarNames[0] =
"partonCode";
172 fShapesVarNames[1] =
"ptJet";
173 fShapesVarNames[2] =
"ptDJet";
174 fShapesVarNames[3] =
"mJet";
175 fShapesVarNames[4] =
"nbOfConst";
176 fShapesVarNames[5] =
"angularity";
177 fShapesVarNames[6] =
"Nsubjet1kt";
178 fShapesVarNames[7] =
"Nsubjet2kt";
179 fShapesVarNames[8] =
"Nsubjet1Min";
180 fShapesVarNames[9] =
"Nsubjet2Min";
181 fShapesVarNames[10] =
"DeltaRkt";
182 fShapesVarNames[11] =
"DeltaRMin";
183 fShapesVarNames[12] =
"SDSymm";
184 fShapesVarNames[13] =
"SDDeltaR";
185 fShapesVarNames[14] =
"SDGroomedFrac";
186 fShapesVarNames[15] =
"SDGroomedN";
187 fShapesVarNames[16] =
"SDSymmkt";
188 fShapesVarNames[17] =
"SDDeltaRkt";
189 fShapesVarNames[18] =
"SDGroomedFrackt";
190 fShapesVarNames[19] =
"SDGroomedNkt";
191 fShapesVarNames[20] =
"SDSymmAkt";
192 fShapesVarNames[21] =
"SDDeltaRAkt";
193 fShapesVarNames[22] =
"SDGroomedFracAkt";
194 fShapesVarNames[23] =
"SDGroomedNAkt";
195 fShapesVarNames[24] =
"SDSymmBeta1";
196 fShapesVarNames[25] =
"SDDeltaRBeta1";
197 fShapesVarNames[26] =
"SDGroomedFracBeta1";
198 fShapesVarNames[27] =
"SDGroomedNBeta1";
199 fShapesVarNames[28] =
"SDSymmBeta2";
200 fShapesVarNames[29] =
"SDDeltaRBeta2";
201 fShapesVarNames[30] =
"SDGroomedFracBeta2";
202 fShapesVarNames[31] =
"SDGroomedNBeta2";
203 fShapesVarNames[32] =
"weightPythia";
228 cout<<
"looping over variables"<<endl;
233 fPhiJetCorr6=
new TH2F(
"fPhiJetCorr6",
"fPhiJetCorr6", 50, 0, 2*TMath::Pi(), 50, 0, 2*TMath::Pi());
235 fEtaJetCorr6=
new TH2F(
"fEtaJetCorr6",
"fEtaJetCorr6", 50, -1.5, 1.5, 50, -1.5, 1.5);
238 fPhiJetCorr7=
new TH2F(
"fPhiJetCorr7",
"fPhiJetCorr7", 50, 0, 2*TMath::Pi(), 50, 0, 2*TMath::Pi());
240 fEtaJetCorr7=
new TH2F(
"fEtaJetCorr7",
"fEtaJetCorr7", 50, -1.5, 1.5, 50, -1.5, 1.5);
243 fPtJetCorr=
new TH2F(
"fPtJetCorr",
"fPtJetCorr", 100, 0, 200, 100, 0, 200);
245 fPtJet=
new TH1F(
"fPtJet",
"fPtJet", 100, 0, 200);
248 fhpTjetpT=
new TH2F(
"fhpTjetpT",
"fhpTjetpT", 200, 0, 200, 200, 0, 200);
250 fhPt=
new TH1F(
"fhPt",
"fhPt", 200, 0, 200);
252 fhPhi=
new TH1F(
"fhPhi",
"fhPhi", 100, -TMath::Pi(), TMath::Pi());
255 fNbOfConstvspT=
new TH2F(
"fNbOfConstvspT",
"fNbOfConstvspT", 100, 0, 100, 200, 0, 200);
264 delete [] fShapesVarNames;
288 AliAODTrack *triggerHadron = 0x0;
295 if (triggerHadronLabel==-99999) {
301 TClonesArray *trackArrayAn = partContAn->GetArray();
302 triggerHadron =
static_cast<AliAODTrack*
>(trackArrayAn->At(triggerHadronLabel));
304 if (!triggerHadron) {
315 fhPt->Fill(triggerHadron->Pt());
320 jetCont->ResetCurrentID();
328 Int_t ifound=0, jfound=0;
329 Int_t ilab=-1, jlab=-1;
365 Float_t dRp1 = TMath::Sqrt(jp1 * jp1 + detap1 * detap1);
375 dRp1 = TMath::Sqrt(jp1 * jp1 + detap1 * detap1);
387 ptSubtracted= jet1->
Pt();
462 AliVParticle *vp1 = 0x0;
467 Printf(
"AliVParticle associated to constituent not found");
472 Double_t dr2 = (vp1->Eta()-jet->
Eta())*(vp1->Eta()-jet->
Eta()) + dphi*dphi;
474 num=num+vp1->Pt()*dr;
500 AliVParticle *vp1 = 0x0;
505 Printf(
"AliVParticle associated to constituent not found");
509 num=num+vp1->Pt()*vp1->Pt();
512 return TMath::Sqrt(num)/den;
522 return PTD(jet, jetContNb);
543 TVector3 ppJ1(pxjet, pyjet, pzjet);
544 TVector3 ppJ3(- pxjet* pzjet, - pyjet * pzjet, pxjet * pxjet + pyjet * pyjet);
546 TVector3 ppJ2(-pyjet, pxjet, 0);
548 AliVParticle *vp1 = 0x0;
553 Printf(
"AliVParticle associated to constituent not found");
557 TVector3 pp(vp1->Px(), vp1->Py(), vp1->Pz());
560 TVector3 pLong = pp.Dot(ppJ1) / ppJ1.Mag2() * ppJ1;
561 TVector3 pPerp = pp - pLong;
564 Float_t ppjX = pPerp.Dot(ppJ2);
565 Float_t ppjY = pPerp.Dot(ppJ3);
566 Float_t ppjT = TMath::Sqrt(ppjX * ppjX + ppjY * ppjY);
567 if(ppjT<=0)
return 0;
569 mxx += (ppjX * ppjX / ppjT);
570 myy += (ppjY * ppjY / ppjT);
571 mxy += (ppjX * ppjY / ppjT);
576 if(sump2==0)
return 0;
578 Double_t ele[4] = {mxx / sump2, mxy / sump2, mxy / sump2, myy / sump2};
579 TMatrixDSym m0(2,ele);
582 TMatrixDSymEigen m(m0);
584 TMatrixD evecm = m.GetEigenVectors();
585 eval = m.GetEigenValues();
589 if (eval[0] < eval[1]) jev = 1;
592 evec0 = TMatrixDColumn(evecm, jev);
595 TVector2 evec(compx, compy);
597 if(jev==1) circ=2*eval[0];
598 if(jev==0) circ=2*eval[1];
629 AliVParticle *vp1 = 0x0;
630 AliVParticle *vp2 = 0x0;
631 std::vector<int> ordindex;
636 if(ordindex.size()<2)
return -1;
640 Printf(
"AliVParticle associated to Leading constituent not found");
646 Printf(
"AliVParticle associated to Subleading constituent not found");
666 return LeSub(jet, jetContNb);
693 const AliVVertex *vert = InputEvent()->GetPrimaryVertex();
697 if(Reclusterer->AliEmcalJetFinder::Filter(Jet, JetCont, dVtx)){;}
710 AliVParticle *JetParticle=0x0;
712 Double_t SubJetiness_Denominator = 0;
716 if(Index==-999)
return -2;
717 SubJetiness_Numerator=(Reclusterer->
GetJet(Index)->
Pt());
718 SubJetiness_Denominator=Jet->
Pt();
719 return SubJetiness_Numerator/SubJetiness_Denominator;
731 AliVParticle *vp1 = 0x0;
736 Printf(
"AliVParticle associated to constituent not found");
741 Double_t dr2 = (vp1->Eta()-jet->
Eta())*(vp1->Eta()-jet->
Eta()) + dphi*dphi;
746 return num/jet->
Pt();
771 Int_t ArraySize =N+1;
774 for (
Int_t i=0; i<ArraySize; i++){
775 JetSorter->SetAt(0,i);
777 for (
Int_t i=0; i<ArraySize; i++){
778 JetIndexSorter->SetAt(0,i);
782 SubJet=Reclusterer->
GetJet(i);
783 if (Type==0) SortingVariable=SubJet->
Pt();
784 else if (Type==1) SortingVariable=SubJet->
E();
785 else if (Type==2) SortingVariable=SubJet->
M();
786 for (
Int_t j=0; j<N; j++){
787 if (SortingVariable>JetSorter->GetAt(j)){
788 for (
Int_t k=N-1; k>=j; k--){
789 JetSorter->SetAt(JetSorter->GetAt(k),k+1);
790 JetIndexSorter->SetAt(JetIndexSorter->GetAt(k),k+1);
792 JetSorter->SetAt(SortingVariable,j);
793 JetIndexSorter->SetAt(i,j);
798 if (!Index)
return JetSorter->GetAt(N-1);
799 else return JetIndexSorter->GetAt(N-1);
824 AliVParticle *vp1 = 0x0;
829 Printf(
"AliVParticle associated to constituent not found");
837 mxx += ppt*ppt*deta*deta;
838 myy += ppt*ppt*dphi*dphi;
839 mxy -= ppt*ppt*deta*TMath::Abs(dphi);
845 if(sump2==0)
return 0;
847 Double_t ele[4] = {mxx , mxy , mxy , myy };
848 TMatrixDSym m0(2,ele);
851 TMatrixDSymEigen m(m0);
853 TMatrixD evecm = m.GetEigenVectors();
854 eval = m.GetEigenValues();
858 if (eval[0] < eval[1]) jev = 1;
861 evec0 = TMatrixDColumn(evecm, jev);
864 TVector2 evec(compx, compy);
866 if(jev==1) sig=TMath::Sqrt(TMath::Abs(eval[0])/sump2);
867 if(jev==0) sig=TMath::Sqrt(TMath::Abs(eval[1])/sump2);
881 return Sigma2(jet, jetContNb);
895 AliVParticle *vp1 = 0x0;
896 std::vector<int> ordindex;
906 Printf(
"AliVParticle associated to Leading constituent not found");
910 if (nTFractions[0] <= 0.7*ptJet){
911 nTFractions[0] += vp1->Pt();
915 if (nTFractions[2] <= 0.8*ptJet){
916 nTFractions[2] += vp1->Pt();
920 if (nTFractions[4] <= 0.9*ptJet){
921 nTFractions[4] += vp1->Pt();
925 if (nTFractions[6] <= 0.95*ptJet){
926 nTFractions[6] += vp1->Pt();
964 return JetFinder->
Nsubjettiness(Jet,JetCont,dVtx,N,Algorithm,0.2,Beta,Option,0,0,0);
976 TClonesArray *tracksArray = partCont->GetArray();
978 if(!partCont || !tracksArray)
return -99999;
979 AliAODTrack *track = 0x0;
985 for (
Int_t iTrigger=0; iTrigger<100; iTrigger++) triggers[iTrigger] = 0;
988 for(
Int_t iTrack=0; iTrack <= tracksArray->GetEntriesFast(); iTrack++){
993 if (!emcPart)
continue;
994 if(TMath::Abs(emcPart->
Eta())>0.9)
continue;
995 if (emcPart->
Pt()<0.15)
continue;
997 if ((emcPart->
Pt() >= minpT) && (emcPart->
Pt()< maxpT)) {
998 trackList->Add(emcPart);
999 triggers[iTT] = iTrack;
1004 track =
static_cast<AliAODTrack*
>(tracksArray->At(iTrack));
1005 if (!track)
continue;
1006 if(TMath::Abs(track->Eta())>0.9)
continue;
1007 if (track->Pt()<0.15)
continue;
1008 if (!(track->TestFilterBit(768)))
continue;
1010 if ((track->Pt() >= minpT) && (track->Pt()< maxpT)) {
1011 trackList->Add(track);
1012 triggers[iTT] = iTrack;
1019 if (iTT == 0)
return -99999;
1020 Int_t nbRn = 0, index = 0 ;
1021 TRandom3* random =
new TRandom3(0);
1022 nbRn = random->Integer(iTT);
1024 index = triggers[nbRn];
1033 if (vphi < -1*TMath::Pi()) vphi += (2*TMath::Pi());
1034 else if (vphi > TMath::Pi()) vphi -= (2*TMath::Pi());
1035 if (mphi < -1*TMath::Pi()) mphi += (2*TMath::Pi());
1036 else if (mphi > TMath::Pi()) mphi -= (2*TMath::Pi());
1037 double dphi = mphi-vphi;
1038 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
1039 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
1060 AliInfo(
"Terminate");
1061 AliAnalysisTaskSE::Terminate();
1065 AliError(
"fOutput not available");
1071 Printf(
"ERROR: fTreeObservableTagging not available");
1080 std::vector<fastjet::PseudoJet> fInputVectors;
1081 Double_t JetInvMass=0, PseudJetInvMass=0, TrackMom = 0, TrackEnergy = 0;
1086 Double_t FJTrackEta[9999],FJTrackPhi[9999],FJTrackPt[9999],EmcalJetTrackEta[9999],EmcalJetTrackPhi[9999],EmcalJetTrackPt[9999];
1087 UShort_t FJNTracks=0,EmcalJetNTracks=0;
1090 AliVParticle *fTrk = fJet->
TrackAt(i, fTrackCont->GetArray());
1091 if (!fTrk)
continue;
1092 JetInvMass += fTrk->M();
1094 fastjet::PseudoJet PseudoTracks(fTrk->Px(), fTrk->Py(), fTrk->Pz(),fTrk->E());
1095 TrackMom += TMath::Sqrt(TMath::Power(fTrk->Px(),2)+TMath::Power(fTrk->Py(),2)+TMath::Power(fTrk->Pz(),2));
1096 TrackEnergy += fTrk->E();
1097 PseudoTracks.set_user_index(fJet->
TrackAt(i)+100);
1098 PseudJetInvMass += PseudoTracks.m();
1099 fInputVectors.push_back(PseudoTracks);
1100 EmcalJetTrackEta[i]=fTrk->Eta();
1101 EmcalJetTrackPhi[i]=fTrk->Phi();
1102 EmcalJetTrackPt[i]=fTrk->Pt();
1105 fastjet::JetDefinition *fJetDef;
1106 fastjet::ClusterSequence *fClustSeqSA;
1110 fJetDef =
new fastjet::JetDefinition(fastjet::antikt_algorithm,
fJetRadius*2, static_cast<fastjet::RecombinationScheme>(0), fastjet::BestFJ30 );
1113 fClustSeqSA =
new fastjet::ClusterSequence(fInputVectors, *fJetDef);
1114 }
catch (fastjet::Error) {
1115 AliError(
" [w] FJ Exception caught.");
1119 std::vector<fastjet::PseudoJet> fOutputJets;
1120 fOutputJets.clear();
1121 fOutputJets=fClustSeqSA->inclusive_jets(0);
1124 std::vector<fastjet::PseudoJet> jet_constituents = fOutputJets[0].constituents();
1125 fastjet::contrib::SoftDrop softdrop(beta, zcut);
1127 softdrop.set_verbose_structure(kTRUE);
1130 fastjet::contrib::Recluster *recluster;
1131 if(ReclusterAlgo == 1) recluster =
new fastjet::contrib::Recluster(fastjet::kt_algorithm,1,
true);
1132 if(ReclusterAlgo == 2) recluster =
new fastjet::contrib::Recluster(fastjet::antikt_algorithm,1,
true);
1133 if(ReclusterAlgo == 0) recluster =
new fastjet::contrib::Recluster(fastjet::cambridge_algorithm,1,
true);
1134 softdrop.set_reclustering(
true,recluster);
1135 fastjet::PseudoJet finaljet = softdrop(fOutputJets[0]);
1159 Int_t NGroomedBranches;
1160 SymParam=(finaljet.structure_of<fastjet::contrib::SoftDrop>().symmetry());
1161 Mu=(finaljet.structure_of<fastjet::contrib::SoftDrop>().mu());
1162 DeltaR=(finaljet.structure_of<fastjet::contrib::SoftDrop>().delta_R());
1163 NGroomedBranches=finaljet.structure_of<fastjet::contrib::SoftDrop>().dropped_count();
1164 GroomedPt=finaljet.perp();
1166 if(ReclusterAlgo==0){
1171 if(ReclusterAlgo==1){
1177 if(ReclusterAlgo==2){
void SetRadius(Double_t val)
Float_t GetSigma2(AliEmcalJet *jet, Int_t jetContNb=0)
Double_t GetFirstOrderSubtractedAngularity() const
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 Nsubjettiness(AliEmcalJet *pJet, AliJetContainer *pContJets, Double_t dVtx[3], Int_t N, Int_t Algorithm, Double_t Radius, Double_t Beta, Int_t Option=0, Int_t Measure=0, Double_t Beta_SD=0, Double_t ZCut=0.1)
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
Int_t TrackAt(Int_t idx) 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
Get particle container attached to this task.
Double_t fjNSubJettiness(AliEmcalJet *Jet, Int_t JetContNb, Int_t N, Int_t Algorithm, Double_t Beta, Int_t Option)
Double_t GetSecondOrderSubtractedLeSub() const
Int_t GetPartonFlag6() const
AliParticleContainer * GetParticleContainer() const
Double_t GetFirstOrderSubtractedConstituent() const
void SetRecombSheme(Int_t val)
void SetJetAlgorithm(Int_t val)
Float_t GetJetNumberOfConstituents(AliEmcalJet *jet, Int_t jetContNb=0)
Task to store and correlate the MC shapes.
TTree * fTreeObservableTagging
! Tree with tagging variables subtracted MC or true MC or raw
Double_t RelativePhi(Double_t mphi, Double_t vphi)
Bool_t Run()
Run function. This is the core function of the analysis and contains the user code. Therefore users have to implement this function.
Double_t GetSecondOrderSubtractedAngularity() const
Double_t GetSubjetFraction(AliEmcalJet *Jet, Int_t JetContNb, Double_t JetRadius, AliEmcalJetFinder *Reclusterer)
void SoftDrop(AliEmcalJet *fJet, AliJetContainer *fJetCont, double zcut, double beta, Int_t ReclusterAlgo)
AliAnalysisTaskEmcalJetShapesMC()
AliEmcalJetFinder * Recluster(AliEmcalJet *Jet, Int_t JetContNb, Double_t JetRadius, Double_t SubJetRadius, Double_t SubJetMinPt, Int_t Algorithm, const char *Name)
Double_t fCent
!event centrality
Double_t GetSecondOrderSubtracted() const
Float_t PTD(AliEmcalJet *jet, Int_t jetContNb=0)
void SetJetMaxEta(Double_t val)
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)
Int_t SelectTrigger(Float_t minpT, Float_t maxpT)
AliEmcalJet * GetJet(Int_t index)
Enhanced TList-derived class that implements correct merging for pt_hard binned production.
Float_t Angularity(AliEmcalJet *jet, Int_t jetContNb=0)
Bool_t FillHistograms()
Function filling histograms.
Double_t GetFirstOrderSubtractedCircularity() const
JetSelectionType fJetSelection
Bool_t RetrieveEventObjects()
Retrieve common objects from event.
AliEmcalList * fOutput
!output list
Double_t SubJetOrdering(AliEmcalJet *Jet, AliEmcalJetFinder *Reclusterer, Int_t N, Int_t Type, Bool_t Index)
void NTValues(AliEmcalJet *jet, Int_t jetContNb, Float_t *nTFractions)
Double_t GetSecondOrderSubtractedCircularity() const
Double_t DeltaR(const AliVParticle *part1, const AliVParticle *part2)
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)
Declaration of class AliEmcalPythiaInfo.
virtual ~AliAnalysisTaskEmcalJetShapesMC()
void UserCreateOutputObjects()
Main initialization function on the worker.
Double_t GetFirstOrderSubtractedSigma2() const
Float_t Sigma2(AliEmcalJet *jet, Int_t jetContNb=0)
AliEmcalJetShapeProperties * GetShapeProperties() const
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.
std::vector< int > GetPtSortedTrackConstituentIndexes(TClonesArray *tracks) const
Float_t GetPartonPt6() const