18 #include <TClonesArray.h>
22 #include <AliVCluster.h>
23 #include <AliVEvent.h>
24 #include <AliVParticle.h>
25 #include <AliEMCALGeometry.h>
27 #include "AliTLorentzVector.h"
75 fFastJetWrapper(
"AliEmcalJetTask",
"AliEmcalJetTask")
107 fFastJetWrapper(name,name)
126 Error(
"AddUtility",
"Jet utility %s already connected.", utility->GetName());
143 while ((utility=static_cast<AliEmcalJetUtility*>(next()))) utility->
Init();
191 if (n == 0)
return kFALSE;
208 AliError(
"No tracks or clusters, returning.");
214 AliDebug(2,Form(
"Jet type = %d",
fJetType));
216 AliTLorentzVector mom;
221 while ((tracks = static_cast<AliParticleContainer*>(nextPartColl()))) {
222 AliDebug(2,Form(
"Tracks from collection %d: '%s'.", iColl-1, tracks->GetName()));
223 tracks->ResetCurrentID();
228 AliDebug(2,Form(
"Skipping track %d because it is neutral.", tracks->GetCurrentID()));
233 AliDebug(2,Form(
"Skipping track %d because it is charged.", tracks->GetCurrentID()));
239 Double_t rnd =
gRandom->Rndm();
241 AliDebug(2,Form(
"Track %d rejected due to artificial tracking inefficiency", tracks->GetCurrentID()));
246 AliDebug(2,Form(
"Track %d accepted (label = %d, pt = %f)", tracks->GetCurrentID(), t->GetLabel(), t->Pt()));
256 while ((clusters = static_cast<AliClusterContainer*>(nextClusColl()))) {
257 AliDebug(2,Form(
"Clusters from collection %d: '%s'.", iColl-1, clusters->GetName()));
258 clusters->ResetCurrentID();
261 clusters->
GetMomentum(mom, clusters->GetCurrentID());
262 Double_t cEta = mom.Eta();
263 Double_t cPhi = mom.Phi_0_2pi();
264 Double_t cPt = mom.Pt();
265 Double_t cPx = mom.Px();
266 Double_t cPy = mom.Py();
267 Double_t cPz = mom.Pz();
269 Double_t e = TMath::Sqrt(cPx*cPx+cPy*cPy+cPz*cPz);
271 AliDebug(2,Form(
"Cluster %d accepted (label = %d, energy = %.3f)", clusters->GetCurrentID(), c->GetLabel(), e));
298 static Int_t indexes[9999] = {-1};
301 AliDebug(1,Form(
"%d jets found", (Int_t)jets_incl.size()));
302 for (UInt_t ijet = 0, jetCount = 0; ijet < jets_incl.size(); ++ijet) {
303 Int_t ij = indexes[ijet];
306 if (jets_incl[ij].perp() <
fMinJetPt)
continue;
313 AliEmcalJet(jets_incl[ij].perp(), jets_incl[ij].eta(), jets_incl[ij].phi(), jets_incl[ij].m());
327 if ((jet->
Phi() >
fGeom->GetArm1PhiMin() * TMath::DegToRad()) &&
328 (jet->
Phi() <
fGeom->GetArm1PhiMax() * TMath::DegToRad()) &&
329 (jet->
Eta() >
fGeom->GetArm1EtaMin()) &&
330 (jet->
Eta() <
fGeom->GetArm1EtaMax()))
336 AliDebug(2,Form(
"Added jet n. %d, pt = %f, area = %f, constituents = %d", jetCount, jet->
Pt(), jet->
Area(), jet->
GetNumberOfConstituents()));
351 static Float_t pt[9999] = {0};
353 const Int_t n = (Int_t)array.size();
358 for (Int_t i = 0; i < n; i++)
359 pt[i] = array[i].perp();
361 TMath::Sort(n, pt, indexes);
383 if (!(InputEvent()->FindListObject(
fJetsName))) {
384 fJets =
new TClonesArray(
"AliEmcalJet");
386 ::Info(
"AliEmcalJetTask::ExecOnce",
"Jet collection with name '%s' has been added to the event.",
fJetsName.Data());
387 InputEvent()->AddObject(
fJets);
390 AliError(Form(
"%s: Object with name %s already in event! Returning", GetName(),
fJetsName.Data()));
422 std::vector<fastjet::PseudoJet>& constituents_unsub, Int_t flag, TClonesArray *particles_sub)
426 Double_t neutralE = 0.;
442 for (UInt_t ic = 0; ic < constituents.size(); ++ic) {
445 uid = constituents[ic].user_index();
448 if (constituents[ic].perp()<1.e-10) {
452 uid =
GetIndexSub(constituents[ic].phi(), constituents_unsub);
455 AliError(
"correspondence between un/subtracted constituent not found");
460 AliDebug(3,Form(
"Processing constituent %d", uid));
464 Double_t gphi = constituents[ic].phi();
465 if (gphi < 0) gphi += TMath::TwoPi();
466 gphi *= TMath::RadToDeg();
467 Double_t geta = constituents[ic].eta();
468 if ((gphi >
fGeom->GetArm1PhiMin()) && (gphi < fGeom->GetArm1PhiMax()) &&
469 (geta >
fGeom->GetArm1EtaMin()) && (geta < fGeom->GetArm1EtaMax()))
474 constituents[ic].py(),
475 constituents[ic].pz(),
476 constituents[ic].e());
482 AliDebug(3,Form(
"Constituent %d is a track from collection %d and with ID %d", uid, iColl, tid));
485 AliError(Form(
"Could not find particle container %d",iColl));
490 AliError(Form(
"Could not find track %d",tid));
494 Double_t cEta = t->Eta();
495 Double_t cPhi = t->Phi();
496 Double_t cPt = t->Pt();
497 Double_t cP = t->P();
498 if (t->Charge() == 0) {
501 if (cPt > maxNe) maxNe = cPt;
504 if (cPt > maxCh) maxCh = cPt;
508 if (TMath::Abs(t->GetLabel()) >
fMinMCLabel) mcpt += cPt;
511 if (cPhi < 0) cPhi += TMath::TwoPi();
512 cPhi *= TMath::RadToDeg();
513 if ((cPhi >
fGeom->GetArm1PhiMin()) && (cPhi < fGeom->GetArm1PhiMax()) &&
514 (cEta >
fGeom->GetArm1EtaMin()) && (cEta < fGeom->GetArm1EtaMax())) {
520 if (flag == 0 || particles_sub == 0) {
524 Int_t part_sub_id = particles_sub->GetEntriesFast();
526 part_sub->
SetPtEtaPhiM(constituents[ic].perp(),constituents[ic].eta(),constituents[ic].phi(),constituents[ic].m());
541 AliTLorentzVector nP;
544 Double_t cEta = nP.Eta();
545 Double_t cPhi = nP.Phi_0_2pi();
546 Double_t cPt = nP.Pt();
547 Double_t cP = nP.P();
550 if (cPt > maxNe) maxNe = cPt;
553 if (TMath::Abs(c->GetLabel()) >
fMinMCLabel) mcpt += c->GetMCEnergyFraction() > 1e-6 ? cPt * c->GetMCEnergyFraction() : cPt;
556 if (cPhi<0) cPhi += TMath::TwoPi();
557 cPhi *= TMath::RadToDeg();
558 if ((cPhi >
fGeom->GetArm1PhiMin()) && (cPhi < fGeom->GetArm1PhiMax()) &&
559 (cEta >
fGeom->GetArm1EtaMin()) && (cEta < fGeom->GetArm1EtaMax())) {
565 if (flag == 0 || particles_sub == 0) {
569 Int_t part_sub_id = particles_sub->GetEntriesFast();
571 part_sub->
SetPtEtaPhiM(constituents[ic].perp(),constituents[ic].eta(),constituents[ic].phi(),constituents[ic].m());
579 AliError(Form(
"%s: No logical way to end up here (uid = %d).", GetName(), uid));
586 jet->
SetNEF(neutralE / jet->
E());
610 for (UInt_t ii = 0; ii < constituents_unsub.size(); ii++) {
612 Double_t phi_unsub = constituents_unsub[ii].phi();
613 dphi=phi_unsub-phi_sub;
614 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
615 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
616 if(TMath::Abs(dphi)<
phimin){ phimin=TMath::Abs(dphi);
618 if (constituents_unsub[index].user_index()!=-1)
return constituents_unsub[index].user_index();
632 AliFatal(
"Jet finder task is locked! Changing properties is not allowed.");
650 fOfflineTriggerMask = offlineTriggerMask;
653 AliWarning(
"Manually setting the event selection for jet finders is not allowed! Using trigger=old_trigger | your_trigger");
654 fOfflineTriggerMask = fOfflineTriggerMask | offlineTriggerMask;
669 while ((tracks = static_cast<AliParticleContainer*>(nextPartColl()))) {
684 while ((clusters = static_cast<AliClusterContainer*>(nextClusColl()))) {
699 while ((clusters = static_cast<AliClusterContainer*>(nextClusColl()))) {
714 while ((tracks = static_cast<AliParticleContainer*>(nextPartColl()))) {
730 while ((tracks = static_cast<AliParticleContainer*>(nextPartColl()))) {
745 return fastjet::kt_algorithm;
747 return fastjet::antikt_algorithm;
749 return fastjet::cambridge_algorithm;
751 return fastjet::genkt_algorithm;
753 return fastjet::cambridge_for_passive_algorithm;
755 return fastjet::genkt_for_passive_algorithm;
757 return fastjet::plugin_algorithm;
759 return fastjet::undefined_jet_algorithm;
762 ::Error(
"AliEmcalJetTask::ConvertToFJAlgo",
"Jet algorithm %d not recognized!!!", algo);
763 return fastjet::undefined_jet_algorithm;
777 return fastjet::E_scheme;
780 return fastjet::pt_scheme;
783 return fastjet::pt2_scheme;
786 return fastjet::Et_scheme;
789 return fastjet::Et2_scheme;
792 return fastjet::BIpt_scheme;
795 return fastjet::BIpt2_scheme;
798 return fastjet::external_scheme;
801 ::Error(
"AliEmcalJetTask::ConvertToFJRecoScheme",
"Recombination scheme %d not recognized!!!", reco);
802 return fastjet::external_scheme;
void SetMaxNeutralPt(Double32_t t)
fastjet::PseudoJet GetJetAreaVector(UInt_t idx) const
ClassImp(AliAnalysisTaskTriggerRates) AliAnalysisTaskTriggerRates
TObjArray fClusterCollArray
cluster collection array
void AddTrackAt(Int_t track, Int_t idx)
void SetParticlePtCut(Double_t cut)
virtual AliVParticle * GetNextAcceptParticle()
TClonesArray * fJets
=true ghost particles will be filled in AliEmcalJet obj
void SetEtaRange(Double_t emi, Double_t ema)
virtual Bool_t GetMomentum(TLorentzVector &mom, Int_t i) const
Base task in the EMCAL framework.
void FillJetConstituents(AliEmcalJet *jet, std::vector< fastjet::PseudoJet > &constituents, std::vector< fastjet::PseudoJet > &constituents_sub, Int_t flag=0, TClonesArray *particles_sub=0)
void AddClusterAt(Int_t clus, Int_t idx)
Bool_t fFillGhost
=true to enable FJ 2.x behavior
AliEmcalJetUtility * AddUtility(AliEmcalJetUtility *utility)
virtual void ProcessJet(AliEmcalJet *jet, Int_t ij, AliFJWrapper &fjw)=0
void ExecuteUtilities(AliEmcalJet *jet, Int_t ij)
void SetMaxRap(Double_t maxrap)
virtual void Terminate(AliFJWrapper &fjw)=0
void SetAreaE(Double_t a)
ERecoScheme_t fRecombScheme
void SetRecombScheme(const fastjet::RecombinationScheme &scheme)
Double_t fTrackEfficiency
virtual ~AliEmcalJetTask()
static FJRecoScheme ConvertToFJRecoScheme(ERecoScheme_t reco)
General jet finder task implementing a wrapper for FastJet.
static TString GenerateJetName(EJetType_t jetType, EJetAlgo_t jetAlgo, ERecoScheme_t recoScheme, Double_t radius, AliParticleContainer *partCont, AliClusterContainer *clusCont, TString tag)
UShort_t GetNumberOfConstituents() const
Container for particles within the EMCAL framework.
Bool_t fIsPSelSet
=true if already initialized
TObjArray fParticleCollArray
particle/track collection array
AliParticleContainer * GetParticleContainer(Int_t i=0) const
const std::vector< fastjet::PseudoJet > & GetInclusiveJets() const
Double_t GetJetArea(UInt_t idx) const
AliEMCALGeometry * fGeom
!emcal geometry
void SetLegacyMode(Bool_t mode)
virtual AliVParticle * GetParticle(Int_t i=-1) const
void SetPtEtaPhiM(Double_t pt, Double_t eta, Double_t phi, Double_t m)
void SetAlgorithm(const fastjet::JetAlgorithm &algor)
AliClusterContainer * GetClusterContainer(Int_t i=0) const
void SetMaxChargedPt(Double32_t t)
virtual void Clear(const Option_t *="")
void SetNEF(Double_t nef)
Bool_t GetSortedArray(Int_t indexes[], std::vector< fastjet::PseudoJet > array) const
void AddGhost(const Double_t dPx, const Double_t dPy, const Double_t dPz, const Double_t dE)
AliVCluster * GetCluster(Int_t i) const
virtual void Prepare(AliFJWrapper &fjw)=0
Int_t fMinMCLabel
minimum MC label value for the tracks/clusters being considered MC particles
void SetJetTask(AliEmcalJetTask *jetTask)
void SetMinJetClusE(Double_t min)
void SelectCollisionCandidates(UInt_t offlineTriggerMask=AliVEvent::kMB)
void SetGhostArea(Double_t gharea)
void SetNumberOfCharged(Int_t n)
std::vector< fastjet::PseudoJet > GetJetConstituents(UInt_t idx) const
void SetAreaEta(Double_t a)
static FJJetAlgo ConvertToFJAlgo(EJetAlgo_t algo)
void SetParticleEtaLimits(Double_t min, Double_t max)
const std::vector< fastjet::PseudoJet > & GetInputVectors() const
void SetMinJetTrackPt(Double_t min)
void SetNeedEmcalGeom(Bool_t n)
Bool_t GetMomentum(TLorentzVector &mom, const AliVCluster *vc, Double_t mass) const
Represent a jet reconstructed using the EMCal jet framework.
void SetNumberOfTracks(Int_t n)
Bool_t fLegacyMode
=true if emcal particles are given as input (for clusters)
void SetClusPtCut(Double_t cut)
virtual void AddInputVector(Double_t px, Double_t py, Double_t pz, Double_t E, Int_t index=-99999)
void SetMinJetClusPt(Double_t min)
Int_t GetIndexSub(Double_t phi_sub, std::vector< fastjet::PseudoJet > &constituents_unsub)
void SetPhiRange(Double_t pmi, Double_t pma)
void SetClusECut(Double_t cut)
void SetAreaPhi(Double_t a)
void SetAreaType(const fastjet::AreaType &atype)
void SetParticlePhiLimits(Double_t min, Double_t max)
void SetPtEmc(Double_t pt)
Container structure for EMCAL clusters.
AliVCluster * GetNextAcceptCluster()
Container for jet within the EMCAL jet framework.
AliFJWrapper fFastJetWrapper
jet collection
void TerminateUtilities()
void SetNumberOfClusters(Int_t n)
void SetAxisInEmcal(Bool_t b)
static const Int_t fgkConstIndexShift
fastjet wrapper
void SetAreaEmc(Double_t a)
void SetNumberOfNeutrals(Int_t n)