3 // Container with name, TClonesArray and cuts for jets
7 #include <TClonesArray.h>
9 #include "AliEmcalJet.h"
10 #include "AliVEvent.h"
12 #include "AliEMCALGeometry.h"
13 #include "AliParticleContainer.h"
14 #include "AliClusterContainer.h"
15 #include "AliLocalRhoParameter.h"
16 #include "AliPythiaInfo.h"
18 #include "AliJetContainer.h"
20 ClassImp(AliJetContainer)
22 //________________________________________________________________________
23 AliJetContainer::AliJetContainer():
24 AliEmcalContainer("AliJetContainer"),
25 fJetAcceptanceType(kUser),
47 fLeadingHadronType(0),
52 fParticleContainer(0),
61 // Default constructor.
63 fClassName = "AliEmcalJet";
66 //________________________________________________________________________
67 AliJetContainer::AliJetContainer(const char *name):
68 AliEmcalContainer(name),
69 fJetAcceptanceType(kUser),
91 fLeadingHadronType(0),
96 fParticleContainer(0),
105 // Standard constructor.
107 fClassName = "AliEmcalJet";
110 //________________________________________________________________________
111 void AliJetContainer::SetArray(AliVEvent *event)
115 AliEmcalContainer::SetArray(event);
117 if(fJetAcceptanceType==kTPC) {
118 AliDebug(2,Form("%s: set TPC acceptance cuts",GetName()));
121 else if(fJetAcceptanceType==kEMCAL) {
122 AliDebug(2,Form("%s: set EMCAL acceptance cuts",GetName()));
128 //________________________________________________________________________
129 void AliJetContainer::SetEMCALGeometry() {
130 fGeom = AliEMCALGeometry::GetInstance();
132 AliError(Form("%s: Can not create geometry", GetName()));
137 //________________________________________________________________________
138 void AliJetContainer::LoadRho(AliVEvent *event)
142 if (!fRhoName.IsNull() && !fRho) {
143 fRho = dynamic_cast<AliRhoParameter*>(event->FindListObject(fRhoName));
145 AliError(Form("%s: Could not retrieve rho %s!", GetName(), fRhoName.Data()));
151 //________________________________________________________________________
152 void AliJetContainer::LoadLocalRho(AliVEvent *event)
156 if (!fLocalRhoName.IsNull() && !fLocalRho) {
157 fLocalRho = dynamic_cast<AliLocalRhoParameter*>(event->FindListObject(fLocalRhoName));
159 AliError(Form("%s: Could not retrieve rho %s!", GetName(), fLocalRhoName.Data()));
165 //________________________________________________________________________
166 void AliJetContainer::LoadRhoMass(AliVEvent *event)
170 if (!fRhoMassName.IsNull() && !fRhoMass) {
171 fRhoMass = dynamic_cast<AliRhoParameter*>(event->FindListObject(fRhoMassName));
173 AliError(Form("%s: Could not retrieve rho_mass %s!", GetName(), fRhoMassName.Data()));
178 //________________________________________________________________________
179 void AliJetContainer::LoadPythiaInfo(AliVEvent *event)
183 if (!fPythiaInfoName.IsNull() && !fPythiaInfo) {
184 fPythiaInfo = dynamic_cast<AliPythiaInfo*>(event->FindListObject(fPythiaInfoName));
186 AliError(Form("%s: Could not retrieve parton infos! %s!", GetName(), fPythiaInfoName.Data()));
194 //________________________________________________________________________
195 AliEmcalJet* AliJetContainer::GetLeadingJet(const char* opt)
197 // Get the leading jet; if opt contains "rho" the sorting is according to pt-A*rho
202 Int_t tempID = fCurrentID;
204 AliEmcalJet *jetMax = GetNextAcceptJet(0);
205 AliEmcalJet *jet = 0;
207 if (option.Contains("rho")) {
208 while ((jet = GetNextAcceptJet())) {
209 if ( (jet->Pt()-jet->Area()*GetRhoVal()) > (jetMax->Pt()-jetMax->Area()*GetRhoVal()) )
214 while ((jet = GetNextAcceptJet())) {
215 if (jet->Pt() > jetMax->Pt()) jetMax = jet;
224 //________________________________________________________________________
225 AliEmcalJet* AliJetContainer::GetJet(Int_t i) const {
227 //Get i^th jet in array
229 if(i<0 || i>fClArray->GetEntriesFast()) return 0;
230 AliEmcalJet *jet = static_cast<AliEmcalJet*>(fClArray->At(i));
235 //________________________________________________________________________
236 AliEmcalJet* AliJetContainer::GetAcceptJet(Int_t i) {
238 //Only return jet if is accepted
240 AliEmcalJet *jet = GetJet(i);
241 if(!AcceptJet(jet)) return 0;
246 //________________________________________________________________________
247 AliEmcalJet* AliJetContainer::GetJetWithLabel(Int_t lab) const {
249 //Get particle with label lab in array
251 Int_t i = GetIndexFromLabel(lab);
255 //________________________________________________________________________
256 AliEmcalJet* AliJetContainer::GetAcceptJetWithLabel(Int_t lab) {
258 //Get particle with label lab in array
260 Int_t i = GetIndexFromLabel(lab);
261 return GetAcceptJet(i);
264 //________________________________________________________________________
265 AliEmcalJet* AliJetContainer::GetNextAcceptJet(Int_t i) {
267 //Get next accepted jet; if i >= 0 (re)start counter from i; return 0 if no accepted jet could be found
269 if (i>=0) fCurrentID = i;
271 const Int_t njets = GetNEntries();
272 AliEmcalJet *jet = 0;
273 while (fCurrentID < njets && !jet) {
274 jet = GetAcceptJet(fCurrentID);
281 //________________________________________________________________________
282 AliEmcalJet* AliJetContainer::GetNextJet(Int_t i) {
284 //Get next jet; if i >= 0 (re)start counter from i; return 0 if no jet could be found
286 if (i>=0) fCurrentID = i;
288 const Int_t njets = GetNEntries();
289 AliEmcalJet *jet = 0;
290 while (fCurrentID < njets && !jet) {
291 jet = GetJet(fCurrentID);
298 //________________________________________________________________________
299 Double_t AliJetContainer::GetJetPtCorr(Int_t i) const {
300 AliEmcalJet *jet = GetJet(i);
302 return jet->Pt() - fRho->GetVal()*jet->Area();
305 //________________________________________________________________________
306 Double_t AliJetContainer::GetJetPtCorrLocal(Int_t i) const {
307 AliEmcalJet *jet = GetJet(i);
309 return jet->Pt() - fLocalRho->GetLocalVal(jet->Phi(), fJetRadius)*jet->Area();
312 //________________________________________________________________________
313 void AliJetContainer::GetMomentum(TLorentzVector &mom, Int_t i) const
315 //Get momentum of the i^th jet in array
317 AliEmcalJet *jet = GetJet(i);
318 if(jet) jet->GetMom(mom);
321 //________________________________________________________________________
322 Bool_t AliJetContainer::AcceptBiasJet(const AliEmcalJet *jet)
324 // Accept jet with a bias.
326 if (fLeadingHadronType == 0) {
327 if (jet->MaxTrackPt() < fPtBiasJetTrack) return kFALSE;
329 else if (fLeadingHadronType == 1) {
330 if (jet->MaxClusterPt() < fPtBiasJetClus) return kFALSE;
333 if (jet->MaxTrackPt() < fPtBiasJetTrack && jet->MaxClusterPt() < fPtBiasJetClus) return kFALSE;
339 //________________________________________________________________________
340 Bool_t AliJetContainer::AcceptJet(const AliEmcalJet *jet)
342 // Return true if jet is accepted.
344 fRejectionReason = 0;
347 AliDebug(11,"No jet found");
348 fRejectionReason |= kNullObject;
352 if (jet->Pt() <= fJetPtCut) {
353 AliDebug(11,Form("Cut rejecting jet: JetPtCut %.1f",fJetPtCut));
354 fRejectionReason |= kPtCut;
358 Double_t jetPhi = jet->Phi();
359 Double_t jetEta = jet->Eta();
361 // if limits are given in (-pi, pi) range
362 if (fJetMinPhi < 0) jetPhi -= TMath::Pi() * 2;
364 if (jetEta < fJetMinEta || jetEta > fJetMaxEta || jetPhi < fJetMinPhi || jetPhi > fJetMaxPhi) {
365 AliDebug(11,"Cut rejecting jet: Acceptance");
366 fRejectionReason |= kAcceptanceCut;
370 if (jet->TestBits(fJetBitMap) != (Int_t)fJetBitMap) {
371 AliDebug(11,"Cut rejecting jet: Bit map");
372 fRejectionReason |= kBitMapCut;
376 if (jet->Area() <= fJetAreaCut) {
377 AliDebug(11,"Cut rejecting jet: Area");
378 fRejectionReason |= kAreaCut;
382 if (jet->AreaEmc() < fAreaEmcCut) {
383 AliDebug(11,"Cut rejecting jet: AreaEmc");
384 fRejectionReason |= kAreaEmcCut;
388 if (fZLeadingChCut < 1 && GetZLeadingCharged(jet) > fZLeadingChCut) {
389 AliDebug(11,"Cut rejecting jet: ZLeading");
390 fRejectionReason |= kZLeadingChCut;
394 if (fZLeadingEmcCut < 1 && GetZLeadingEmc(jet) > fZLeadingEmcCut) {
395 AliDebug(11,"Cut rejecting jet: ZLeadEmc");
396 fRejectionReason |= kZLeadingEmcCut;
400 if (jet->NEF() < fNEFMinCut || jet->NEF() > fNEFMaxCut) {
401 AliDebug(11,"Cut rejecting jet: NEF");
402 fRejectionReason |= kNEFCut;
406 if (!AcceptBiasJet(jet)) {
407 AliDebug(11,"Cut rejecting jet: Bias");
408 fRejectionReason |= kMinLeadPtCut;
412 if (jet->MaxTrackPt() > fMaxTrackPt) {
413 AliDebug(11,"Cut rejecting jet: MaxTrackPt");
414 fRejectionReason |= kMaxTrackPtCut;
419 if (jet->MaxClusterPt() > fMaxClusterPt) {
420 AliDebug(11,"Cut rejecting jet: MaxClusPt");
421 fRejectionReason |= kMaxClusterPtCut;
425 if (fFlavourSelection != 0 && !jet->TestFlavourTag(fFlavourSelection)) {
426 AliDebug(11,"Cut rejecting jet: Flavour");
427 fRejectionReason |= kFlavourCut;
431 if(fTagStatus>-1 && jet->GetTagStatus()!=fTagStatus) {
432 AliDebug(11,"Cut rejecting jet: tag status");
433 fRejectionReason |= kTagStatus;
440 //________________________________________________________________________
441 Double_t AliJetContainer::GetLeadingHadronPt(const AliEmcalJet *jet) const
443 if (fLeadingHadronType == 0) // charged leading hadron
444 return jet->MaxTrackPt();
445 else if (fLeadingHadronType == 1) // neutral leading hadron
446 return jet->MaxClusterPt();
447 else // charged or neutral
448 return jet->MaxPartPt();
451 //________________________________________________________________________
452 void AliJetContainer::GetLeadingHadronMomentum(TLorentzVector &mom, const AliEmcalJet *jet) const
454 Double_t maxClusterPt = 0;
455 Double_t maxClusterEta = 0;
456 Double_t maxClusterPhi = 0;
458 Double_t maxTrackPt = 0;
459 Double_t maxTrackEta = 0;
460 Double_t maxTrackPhi = 0;
462 if (fClusterContainer && fClusterContainer->GetArray() && (fLeadingHadronType == 1 || fLeadingHadronType == 2)) {
463 AliVCluster *cluster = jet->GetLeadingCluster(fClusterContainer->GetArray());
465 TLorentzVector nPart;
466 cluster->GetMomentum(nPart, const_cast<Double_t*>(fVertex));
468 maxClusterEta = nPart.Eta();
469 maxClusterPhi = nPart.Phi();
470 maxClusterPt = nPart.Pt();
474 if (fParticleContainer && fParticleContainer->GetArray() && (fLeadingHadronType == 0 || fLeadingHadronType == 2)) {
475 AliVParticle *track = jet->GetLeadingTrack(fParticleContainer->GetArray());
477 maxTrackEta = track->Eta();
478 maxTrackPhi = track->Phi();
479 maxTrackPt = track->Pt();
483 if (maxTrackPt > maxClusterPt)
484 mom.SetPtEtaPhiM(maxTrackPt,maxTrackEta,maxTrackPhi,0.139);
486 mom.SetPtEtaPhiM(maxClusterPt,maxClusterEta,maxClusterPhi,0.139);
489 //________________________________________________________________________
490 Double_t AliJetContainer::GetZLeadingEmc(const AliEmcalJet *jet) const
493 if (fClusterContainer && fClusterContainer->GetArray()) {
496 AliVCluster *cluster = jet->GetLeadingCluster(fClusterContainer->GetArray());
498 cluster->GetMomentum(mom, const_cast<Double_t*>(fVertex));
500 return GetZ(jet,mom);
509 //________________________________________________________________________
510 Double_t AliJetContainer::GetZLeadingCharged(const AliEmcalJet *jet) const
513 if (fParticleContainer && fParticleContainer->GetArray() ) {
516 AliVParticle *track = jet->GetLeadingTrack(fParticleContainer->GetArray());
518 mom.SetPtEtaPhiM(track->Pt(),track->Eta(),track->Phi(),0.139);
520 return GetZ(jet,mom);
529 //________________________________________________________________________
530 Double_t AliJetContainer::GetZ(const AliEmcalJet *jet, TLorentzVector mom) const
533 Double_t pJetSq = jet->Px()*jet->Px() + jet->Py()*jet->Py() + jet->Pz()*jet->Pz();
536 return (mom.Px()*jet->Px() + mom.Py()*jet->Py() + mom.Pz()*jet->Pz())/pJetSq;
538 AliWarning(Form("%s: strange, pjet*pjet seems to be zero pJetSq: %f",GetName(), pJetSq));
544 //________________________________________________________________________
545 void AliJetContainer::SetJetEtaPhiEMCAL()
547 //Set default cuts for full jets
549 if(!fGeom) SetEMCALGeometry();
551 SetJetEtaLimits(fGeom->GetArm1EtaMin() + fJetRadius, fGeom->GetArm1EtaMax() - fJetRadius);
553 if(fRunNumber>=177295 && fRunNumber<=197470) //small SM masked in 2012 and 2013
554 SetJetPhiLimits(1.405+fJetRadius,3.135-fJetRadius);
556 SetJetPhiLimits(fGeom->GetArm1PhiMin() * TMath::DegToRad() + fJetRadius, fGeom->GetArm1PhiMax() * TMath::DegToRad() - fJetRadius);
559 AliWarning("Could not get instance of AliEMCALGeometry. Using manual settings for EMCAL year 2011!!");
560 SetJetEtaLimits(-0.7+fJetRadius,0.7-fJetRadius);
561 SetJetPhiLimits(1.405+fJetRadius,3.135-fJetRadius);
565 //________________________________________________________________________
566 void AliJetContainer::SetJetEtaPhiTPC()
568 //Set default cuts for charged jets
570 SetJetEtaLimits(-0.9+fJetRadius, 0.9-fJetRadius);
571 SetJetPhiLimits(-10, 10);
574 //________________________________________________________________________
575 void AliJetContainer::PrintCuts()
577 // Reset cuts to default values
579 Printf("PtBiasJetTrack: %f",fPtBiasJetTrack);
580 Printf("PtBiasJetClus: %f",fPtBiasJetClus);
581 Printf("JetPtCut: %f", fJetPtCut);
582 Printf("JetAreaCut: %f",fJetAreaCut);
583 Printf("AreaEmcCut: %f",fAreaEmcCut);
584 Printf("JetMinEta: %f", fJetMinEta);
585 Printf("JetMaxEta: %f", fJetMaxEta);
586 Printf("JetMinPhi: %f", fJetMinPhi);
587 Printf("JetMaxPhi: %f", fJetMaxPhi);
588 Printf("MaxClusterPt: %f",fMaxClusterPt);
589 Printf("MaxTrackPt: %f",fMaxTrackPt);
590 Printf("LeadingHadronType: %d",fLeadingHadronType);
591 Printf("ZLeadingEmcCut: %f",fZLeadingEmcCut);
592 Printf("ZLeadingChCut: %f",fZLeadingChCut);
596 //________________________________________________________________________
597 void AliJetContainer::ResetCuts()
599 // Reset cuts to default values
610 fMaxClusterPt = 1000;
612 fLeadingHadronType = 0;
613 fZLeadingEmcCut = 10.;
614 fZLeadingChCut = 10.;
617 //________________________________________________________________________
618 void AliJetContainer::SetClassName(const char *clname)
620 // Set the class name
623 if (cls.InheritsFrom("AliEmcalJet")) fClassName = clname;
624 else AliError(Form("Unable to set class name %s for a AliJetContainer, it must inherits from AliEmcalJet!",clname));
627 //________________________________________________________________________
628 Double_t AliJetContainer::GetFractionSharedPt(const AliEmcalJet *jet1) const
631 // Get fraction of shared pT between matched jets
632 // Uses ClosestJet() jet pT as baseline: fraction = \Sum_{const,jet1} pT,const,i / pT,jet,closest
633 // Only works if tracks array of both jets is the same
636 AliEmcalJet *jet2 = jet1->ClosestJet();
639 Double_t fraction = 0.;
640 Double_t jetPt2 = jet2->Pt();
644 AliVParticle *vpf = 0x0;
646 for(Int_t icc=0; icc<jet2->GetNumberOfTracks(); icc++) {
647 Int_t idx = (Int_t)jet2->TrackAt(icc);
649 for(Int_t icf=0; icf<jet1->GetNumberOfTracks(); icf++) {
650 if(idx == jet1->TrackAt(icf) && iFound==0 ) {
652 vpf = static_cast<AliVParticle*>(jet1->TrackAt(icf, fParticleContainer->GetArray()));
653 if(vpf) sumPt += vpf->Pt();
658 fraction = sumPt/jetPt2;