18 #include <TClonesArray.h>
22 #include <AliVCluster.h>
23 #include <AliVEvent.h>
24 #include <AliVParticle.h>
25 #include <AliEMCALGeometry.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));
219 while ((tracks = static_cast<AliParticleContainer*>(nextPartColl()))) {
220 AliDebug(2,Form(
"Tracks from collection %d: '%s'.", iColl-1, tracks->GetName()));
227 AliDebug(2,Form(
"Track %d rejected due to artificial tracking inefficiency", it.current_index()));
232 AliDebug(2,Form(
"Track %d accepted (label = %d, pt = %f)", it.current_index(), it->second->GetLabel(), it->first.Pt()));
242 while ((clusters = static_cast<AliClusterContainer*>(nextClusColl()))) {
243 AliDebug(2,Form(
"Clusters from collection %d: '%s'.", iColl-1, clusters->GetName()));
246 AliDebug(2,Form(
"Cluster %d accepted (label = %d, energy = %.3f)", it.current_index(), it->second->GetLabel(), it->first.E()));
273 static Int_t indexes[9999] = {-1};
276 AliDebug(1,Form(
"%d jets found", (
Int_t)jets_incl.size()));
277 for (
UInt_t ijet = 0, jetCount = 0; ijet < jets_incl.size(); ++ijet) {
278 Int_t ij = indexes[ijet];
281 if (jets_incl[ij].perp() <
fMinJetPt)
continue;
288 AliEmcalJet(jets_incl[ij].perp(), jets_incl[ij].eta(), jets_incl[ij].phi(), jets_incl[ij].m());
303 if ((jet->
Phi() >
fGeom->GetArm1PhiMin() * TMath::DegToRad()) &&
304 (jet->
Phi() <
fGeom->GetArm1PhiMax() * TMath::DegToRad()) &&
305 (jet->
Eta() >
fGeom->GetArm1EtaMin()) &&
306 (jet->
Eta() <
fGeom->GetArm1EtaMax()))
312 AliDebug(2,Form(
"Added jet n. %d, pt = %f, area = %f, constituents = %d", jetCount, jet->
Pt(), jet->
Area(), jet->
GetNumberOfConstituents()));
334 for (
Int_t i = 0; i < n; i++)
335 pt[i] = array[i].perp();
337 TMath::Sort(n, pt, indexes);
357 if (!(InputEvent()->FindListObject(
fJetsName))) {
358 fJets =
new TClonesArray(
"AliEmcalJet");
360 ::Info(
"AliEmcalJetTask::ExecOnce",
"Jet collection with name '%s' has been added to the event.",
fJetsName.Data());
361 InputEvent()->AddObject(
fJets);
364 AliError(Form(
"%s: Object with name %s already in event! Returning", GetName(),
fJetsName.Data()));
396 std::vector<fastjet::PseudoJet>& constituents_unsub,
Int_t flag, TClonesArray *particles_sub)
416 for (
UInt_t ic = 0; ic < constituents.size(); ++ic) {
419 uid = constituents[ic].user_index();
422 if (constituents[ic].perp()<1.e-10) {
426 uid =
GetIndexSub(constituents[ic].phi(), constituents_unsub);
429 AliError(
"correspondence between un/subtracted constituent not found");
434 AliDebug(3,Form(
"Processing constituent %d", uid));
438 Double_t gphi = constituents[ic].phi();
439 if (gphi < 0) gphi += TMath::TwoPi();
440 gphi *= TMath::RadToDeg();
441 Double_t geta = constituents[ic].eta();
442 if ((gphi >
fGeom->GetArm1PhiMin()) && (gphi < fGeom->GetArm1PhiMax()) &&
443 (geta >
fGeom->GetArm1EtaMin()) && (geta < fGeom->GetArm1EtaMax()))
448 constituents[ic].py(),
449 constituents[ic].pz(),
450 constituents[ic].e());
456 AliDebug(3,Form(
"Constituent %d is a track from collection %d and with ID %d", uid, iColl, tid));
459 AliError(Form(
"Could not find particle container %d",iColl));
464 AliError(Form(
"Could not find track %d",tid));
472 if (t->Charge() == 0) {
475 if (cPt > maxNe) maxNe = cPt;
478 if (cPt > maxCh) maxCh = cPt;
482 if (TMath::Abs(t->GetLabel()) >
fMinMCLabel) mcpt += cPt;
485 if (cPhi < 0) cPhi += TMath::TwoPi();
486 cPhi *= TMath::RadToDeg();
487 if ((cPhi >
fGeom->GetArm1PhiMin()) && (cPhi < fGeom->GetArm1PhiMax()) &&
488 (cEta >
fGeom->GetArm1EtaMin()) && (cEta < fGeom->GetArm1EtaMax())) {
494 if (flag == 0 || particles_sub == 0) {
498 Int_t part_sub_id = particles_sub->GetEntriesFast();
500 part_sub->
SetPtEtaPhiM(constituents[ic].perp(),constituents[ic].eta(),constituents[ic].phi(),constituents[ic].m());
524 if (cPt > maxNe) maxNe = cPt;
527 if (TMath::Abs(c->GetLabel()) >
fMinMCLabel) mcpt += c->GetMCEnergyFraction() > 1e-6 ? cPt * c->GetMCEnergyFraction() : cPt;
530 if (cPhi<0) cPhi += TMath::TwoPi();
531 cPhi *= TMath::RadToDeg();
532 if ((cPhi >
fGeom->GetArm1PhiMin()) && (cPhi < fGeom->GetArm1PhiMax()) &&
533 (cEta >
fGeom->GetArm1EtaMin()) && (cEta < fGeom->GetArm1EtaMax())) {
539 if (flag == 0 || particles_sub == 0) {
543 Int_t part_sub_id = particles_sub->GetEntriesFast();
545 part_sub->
SetPtEtaPhiM(constituents[ic].perp(),constituents[ic].eta(),constituents[ic].phi(),constituents[ic].m());
553 AliError(Form(
"%s: No logical way to end up here (uid = %d).", GetName(), uid));
560 jet->
SetNEF(neutralE / jet->
E());
584 for (
UInt_t ii = 0; ii < constituents_unsub.size(); ii++) {
586 Double_t phi_unsub = constituents_unsub[ii].phi();
587 dphi=phi_unsub-phi_sub;
588 if (dphi < -1*TMath::Pi()) dphi += (2*TMath::Pi());
589 else if (dphi > TMath::Pi()) dphi -= (2*TMath::Pi());
590 if(TMath::Abs(dphi)<
phimin){ phimin=TMath::Abs(dphi);
592 if (constituents_unsub[index].user_index()!=-1)
return constituents_unsub[index].user_index();
606 AliFatal(
"Jet finder task is locked! Changing properties is not allowed.");
624 fOfflineTriggerMask = offlineTriggerMask;
627 AliWarning(
"Manually setting the event selection for jet finders is not allowed! Using trigger=old_trigger | your_trigger");
628 fOfflineTriggerMask = fOfflineTriggerMask | offlineTriggerMask;
643 while ((tracks = static_cast<AliParticleContainer*>(nextPartColl()))) {
658 while ((clusters = static_cast<AliClusterContainer*>(nextClusColl()))) {
673 while ((clusters = static_cast<AliClusterContainer*>(nextClusColl()))) {
688 while ((tracks = static_cast<AliParticleContainer*>(nextPartColl()))) {
704 while ((tracks = static_cast<AliParticleContainer*>(nextPartColl()))) {
719 return fastjet::kt_algorithm;
721 return fastjet::antikt_algorithm;
723 return fastjet::cambridge_algorithm;
725 return fastjet::genkt_algorithm;
727 return fastjet::cambridge_for_passive_algorithm;
729 return fastjet::genkt_for_passive_algorithm;
731 return fastjet::plugin_algorithm;
733 return fastjet::undefined_jet_algorithm;
736 ::Error(
"AliEmcalJetTask::ConvertToFJAlgo",
"Jet algorithm %d not recognized!!!", algo);
737 return fastjet::undefined_jet_algorithm;
751 return fastjet::E_scheme;
754 return fastjet::pt_scheme;
757 return fastjet::pt2_scheme;
760 return fastjet::Et_scheme;
763 return fastjet::Et2_scheme;
766 return fastjet::BIpt_scheme;
769 return fastjet::BIpt2_scheme;
772 return fastjet::external_scheme;
775 ::Error(
"AliEmcalJetTask::ConvertToFJRecoScheme",
"Recombination scheme %d not recognized!!!", reco);
776 return fastjet::external_scheme;
791 if( eta < 0.9 && eta > -0.9 ) {
794 if (eta < 0.9 - r && eta > -0.9 + r)
814 return jetAcceptanceType;
822 if (!
fGeom)
return kFALSE;
824 if ( eta < fGeom->GetArm1EtaMax() - r && eta >
fGeom->GetArm1EtaMin() + r ) {
826 if ( phi < 3.135 - r && phi > 1.405 + r )
830 if ( phi < fGeom->GetEMCALPhiMax() * TMath::DegToRad() - r && phi >
fGeom->GetArm1PhiMin() * TMath::DegToRad() + r)
843 if (!
fGeom)
return kFALSE;
844 if (eta < fGeom->GetArm1EtaMax() - r && eta >
fGeom->GetArm1EtaMin() + r ) {
845 if ( phi < fGeom->GetDCALPhiMax() * TMath::DegToRad() - r && phi >
fGeom->GetDCALPhiMin() * TMath::DegToRad() + r)
void SetMaxNeutralPt(Double32_t t)
fastjet::PseudoJet GetJetAreaVector(UInt_t idx) const
TObjArray fClusterCollArray
cluster collection array
void AddTrackAt(Int_t track, Int_t idx)
void SetParticlePtCut(Double_t cut)
TClonesArray * fJets
=true ghost particles will be filled in AliEmcalJet obj
void SetEtaRange(Double_t emi, Double_t ema)
const AliClusterIterableMomentumContainer accepted_momentum() const
Base task in the EMCAL framework.
bidirectional stl iterator over the EMCAL iterable container
Bool_t IsJetInEmcal(Double_t eta, Double_t phi, Double_t r)
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)
Declaration of class AliTLorentzVector.
virtual void ProcessJet(AliEmcalJet *jet, Int_t ij, AliFJWrapper &fjw)=0
void ExecuteUtilities(AliEmcalJet *jet, Int_t ij)
Full acceptance, i.e. no acceptance cut applied – left to user.
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
TPC fiducial acceptance (each eta edge narrowed by jet R)
const std::vector< fastjet::PseudoJet > & GetInclusiveJets() const
void SetJetAcceptanceType(UInt_t type)
UInt_t FindJetAcceptanceType(Double_t eta, Double_t phi, Double_t r)
Bool_t IsJetInDcal(Double_t eta, Double_t phi, Double_t r)
Double_t GetJetArea(UInt_t idx) const
AliEMCALGeometry * fGeom
!emcal geometry
Double_t Phi_0_2pi() const
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
Double_t Phi_0_2pi() 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)
ClassImp(AliAnalysisTaskCRC) AliAnalysisTaskCRC
const AliParticleIterableMomentumContainer accepted_momentum() const
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)
Int_t fRunNumber
!run number (triggering RunChanged()
virtual void AddInputVector(Double_t px, Double_t py, Double_t pz, Double_t E, Int_t index=-99999)
void SetMinJetClusPt(Double_t min)
DCal fiducial acceptance (each eta, phi edge narrowed by jet R)
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.
EMCal fiducial acceptance (each eta, phi edge narrowed by jet R)
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)