6 #include "AliEmcalJet.h"
13 //__________________________________________________________________________________________________
14 AliEmcalJet::AliEmcalJet() :
44 fJetShapeMassFirstDer(0),
45 fJetShapeMassSecondDer(0),
46 fJetShapeMassFirstSub(0),
47 fJetShapeMassSecondSub(0),
53 fJetShapeAngularityFirstDer(0),
54 fJetShapeAngularitySecondDer(0),
55 fJetShapeAngularityFirstSub(0),
56 fJetShapeAngularitySecondSub(0),
57 fJetShapepTDFirstDer(0),
58 fJetShapepTDSecondDer(0),
59 fJetShapepTDFirstSub(0),
60 fJetShapepTDSecondSub(0),
61 fJetShapeCircularityFirstDer(0),
62 fJetShapeCircularitySecondDer(0),
63 fJetShapeCircularityFirstSub(0),
64 fJetShapeCircularitySecondSub(0),
65 fJetShapeSigma2FirstDer(0),
66 fJetShapeSigma2SecondDer(0),
67 fJetShapeSigma2FirstSub(0),
68 fJetShapeSigma2SecondSub(0),
69 fJetShapeConstituentFirstDer(0),
70 fJetShapeConstituentSecondDer(0),
71 fJetShapeConstituentFirstSub(0),
72 fJetShapeConstituentSecondSub(0),
73 fJetShapeLeSubFirstDer(0),
74 fJetShapeLeSubSecondDer(0),
75 fJetShapeLeSubFirstSub(0),
76 fJetShapeLeSubSecondSub(0)
81 fClosestJetsDist[0] = 999;
82 fClosestJetsDist[1] = 999;
85 //__________________________________________________________________________________________________
86 AliEmcalJet::AliEmcalJet(Double_t px, Double_t py, Double_t pz) :
88 fPt(TMath::Sqrt(px * px + py* py)),
89 fEta(TMath::ASinH(pz / fPt)),
116 fJetShapeMassFirstDer(0),
117 fJetShapeMassSecondDer(0),
118 fJetShapeMassFirstSub(0),
119 fJetShapeMassSecondSub(0),
124 fGRDenominatorSub(0),
125 fJetShapeAngularityFirstDer(0),
126 fJetShapeAngularitySecondDer(0),
127 fJetShapeAngularityFirstSub(0),
128 fJetShapeAngularitySecondSub(0),
129 fJetShapepTDFirstDer(0),
130 fJetShapepTDSecondDer(0),
131 fJetShapepTDFirstSub(0),
132 fJetShapepTDSecondSub(0),
133 fJetShapeCircularityFirstDer(0),
134 fJetShapeCircularitySecondDer(0),
135 fJetShapeCircularityFirstSub(0),
136 fJetShapeCircularitySecondSub(0),
137 fJetShapeSigma2FirstDer(0),
138 fJetShapeSigma2SecondDer(0),
139 fJetShapeSigma2FirstSub(0),
140 fJetShapeSigma2SecondSub(0),
141 fJetShapeConstituentFirstDer(0),
142 fJetShapeConstituentSecondDer(0),
143 fJetShapeConstituentFirstSub(0),
144 fJetShapeConstituentSecondSub(0),
145 fJetShapeLeSubFirstDer(0),
146 fJetShapeLeSubSecondDer(0),
147 fJetShapeLeSubFirstSub(0),
148 fJetShapeLeSubSecondSub(0)
153 fPhi = TVector2::Phi_0_2pi(TMath::ATan2(py, px));
158 fClosestJetsDist[0] = 999;
159 fClosestJetsDist[1] = 999;
162 //_________________________________________________________________________________________________
163 AliEmcalJet::AliEmcalJet(Double_t pt, Double_t eta, Double_t phi, Double_t m) :
193 fJetShapeMassFirstDer(0),
194 fJetShapeMassSecondDer(0),
195 fJetShapeMassFirstSub(0),
196 fJetShapeMassSecondSub(0),
201 fGRDenominatorSub(0),
202 fJetShapeAngularityFirstDer(0),
203 fJetShapeAngularitySecondDer(0),
204 fJetShapeAngularityFirstSub(0),
205 fJetShapeAngularitySecondSub(0),
206 fJetShapepTDFirstDer(0),
207 fJetShapepTDSecondDer(0),
208 fJetShapepTDFirstSub(0),
209 fJetShapepTDSecondSub(0),
210 fJetShapeCircularityFirstDer(0),
211 fJetShapeCircularitySecondDer(0),
212 fJetShapeCircularityFirstSub(0),
213 fJetShapeCircularitySecondSub(0),
214 fJetShapeSigma2FirstDer(0),
215 fJetShapeSigma2SecondDer(0),
216 fJetShapeSigma2FirstSub(0),
217 fJetShapeSigma2SecondSub(0),
218 fJetShapeConstituentFirstDer(0),
219 fJetShapeConstituentSecondDer(0),
220 fJetShapeConstituentFirstSub(0),
221 fJetShapeConstituentSecondSub(0),
222 fJetShapeLeSubFirstDer(0),
223 fJetShapeLeSubSecondDer(0),
224 fJetShapeLeSubFirstSub(0),
225 fJetShapeLeSubSecondSub(0)
230 fPhi = TVector2::Phi_0_2pi(fPhi);
234 fClosestJetsDist[0] = 999;
235 fClosestJetsDist[1] = 999;
238 //_________________________________________________________________________________________________
239 AliEmcalJet::AliEmcalJet(const AliEmcalJet& jet) :
247 fAreaEta(jet.fAreaEta),
248 fAreaPhi(jet.fAreaPhi),
250 fAreaEmc(jet.fAreaEmc),
251 fAxisInEmcal(jet.fAxisInEmcal),
252 fFlavourTagging(jet.fFlavourTagging),
253 fMaxCPt(jet.fMaxCPt),
254 fMaxNPt(jet.fMaxNPt),
260 fClusterIDs(jet.fClusterIDs),
261 fTrackIDs(jet.fTrackIDs),
262 fMatched(jet.fMatched),
263 fMatchingType(jet.fMatchingType),
264 fTaggedJet(jet.fTaggedJet),
265 fTagStatus(jet.fTagStatus),
267 fPtSubVect(jet.fPtSubVect),
268 fTriggers(jet.fTriggers),
269 fJetShapeMassFirstDer(jet.fJetShapeMassFirstDer),
270 fJetShapeMassSecondDer(jet.fJetShapeMassSecondDer),
271 fJetShapeMassFirstSub(jet.fJetShapeMassFirstSub),
272 fJetShapeMassSecondSub(jet.fJetShapeMassSecondSub),
274 fGRNumerator(jet.fGRNumerator),
275 fGRDenominator(jet.fGRDenominator),
276 fGRNumeratorSub(jet.fGRNumeratorSub),
277 fGRDenominatorSub(jet.fGRDenominatorSub),
278 fJetShapeAngularityFirstDer(jet.fJetShapeAngularityFirstDer),
279 fJetShapeAngularitySecondDer(jet.fJetShapeAngularitySecondDer),
280 fJetShapeAngularityFirstSub(jet.fJetShapeAngularityFirstSub),
281 fJetShapeAngularitySecondSub(jet.fJetShapeAngularitySecondSub),
282 fJetShapepTDFirstDer(jet.fJetShapepTDFirstDer),
283 fJetShapepTDSecondDer(jet.fJetShapepTDSecondDer),
284 fJetShapepTDFirstSub(jet.fJetShapepTDFirstSub),
285 fJetShapepTDSecondSub(jet.fJetShapepTDSecondSub),
286 fJetShapeCircularityFirstDer(jet.fJetShapeCircularityFirstDer),
287 fJetShapeCircularitySecondDer(jet.fJetShapeCircularitySecondDer),
288 fJetShapeCircularityFirstSub(jet.fJetShapeCircularityFirstSub),
289 fJetShapeCircularitySecondSub(jet.fJetShapeCircularitySecondSub),
290 fJetShapeSigma2FirstDer(jet.fJetShapeSigma2FirstDer),
291 fJetShapeSigma2SecondDer(jet.fJetShapeSigma2SecondDer),
292 fJetShapeSigma2FirstSub(jet.fJetShapeSigma2FirstSub),
293 fJetShapeSigma2SecondSub(jet.fJetShapeSigma2SecondSub),
294 fJetShapeConstituentFirstDer(jet.fJetShapeConstituentFirstDer),
295 fJetShapeConstituentSecondDer(jet.fJetShapeConstituentSecondDer),
296 fJetShapeConstituentFirstSub(jet.fJetShapeConstituentFirstSub),
297 fJetShapeConstituentSecondSub(jet.fJetShapeConstituentSecondSub),
298 fJetShapeLeSubFirstDer(jet.fJetShapeLeSubFirstDer),
299 fJetShapeLeSubSecondDer(jet.fJetShapeLeSubSecondDer),
300 fJetShapeLeSubFirstSub(jet.fJetShapeLeSubFirstSub),
301 fJetShapeLeSubSecondSub(jet.fJetShapeLeSubSecondSub)
304 fClosestJets[0] = jet.fClosestJets[0];
305 fClosestJets[1] = jet.fClosestJets[1];
306 fClosestJetsDist[0] = jet.fClosestJetsDist[0];
307 fClosestJetsDist[1] = jet.fClosestJetsDist[1];
310 //_________________________________________________________________________________________________
311 AliEmcalJet& AliEmcalJet::operator=(const AliEmcalJet& jet)
313 // Assignment operator.
316 AliVParticle::operator=(jet);
323 fAreaEta = jet.fAreaEta;
324 fAreaPhi = jet.fAreaPhi;
326 fAreaEmc = jet.fAreaEmc;
327 fAxisInEmcal = jet.fAxisInEmcal;
328 fFlavourTagging = jet.fFlavourTagging;
329 fMaxCPt = jet.fMaxCPt;
330 fMaxNPt = jet.fMaxNPt;
336 fClusterIDs = jet.fClusterIDs;
337 fTrackIDs = jet.fTrackIDs;
338 fClosestJets[0] = jet.fClosestJets[0];
339 fClosestJets[1] = jet.fClosestJets[1];
340 fClosestJetsDist[0] = jet.fClosestJetsDist[0];
341 fClosestJetsDist[1] = jet.fClosestJetsDist[1];
342 fMatched = jet.fMatched;
343 fTaggedJet = jet.fTaggedJet;
344 fTagStatus = jet.fTagStatus;
346 fPtSubVect = jet.fPtSubVect;
347 fTriggers = jet.fTriggers;
348 fJetShapeMassFirstDer = jet.fJetShapeMassFirstDer;
349 fJetShapeMassSecondDer = jet.fJetShapeMassSecondDer;
350 fJetShapeMassFirstSub = jet.fJetShapeMassFirstSub;
351 fJetShapeMassSecondSub = jet.fJetShapeMassSecondSub;
353 fGRNumerator = jet.fGRNumerator;
354 fGRDenominator = jet.fGRDenominator;
355 fGRNumeratorSub = jet.fGRNumeratorSub;
356 fGRDenominatorSub = jet.fGRDenominatorSub;
357 fJetShapeAngularityFirstDer = jet.fJetShapeAngularityFirstDer;
358 fJetShapeAngularitySecondDer = jet.fJetShapeAngularitySecondDer;
359 fJetShapeAngularityFirstSub = jet.fJetShapeAngularityFirstSub;
360 fJetShapeAngularitySecondSub = jet.fJetShapeAngularitySecondSub;
361 fJetShapepTDFirstDer = jet.fJetShapepTDFirstDer;
362 fJetShapepTDSecondDer = jet.fJetShapepTDSecondDer;
363 fJetShapepTDFirstSub = jet.fJetShapepTDFirstSub;
364 fJetShapepTDSecondSub = jet.fJetShapepTDSecondSub;
365 fJetShapeCircularityFirstDer = jet.fJetShapeCircularityFirstDer;
366 fJetShapeCircularitySecondDer = jet.fJetShapeCircularitySecondDer;
367 fJetShapeCircularityFirstSub = jet.fJetShapeCircularityFirstSub;
368 fJetShapeCircularitySecondSub = jet.fJetShapeCircularitySecondSub;
369 fJetShapeSigma2FirstDer = jet.fJetShapeSigma2FirstDer;
370 fJetShapeSigma2SecondDer = jet.fJetShapeSigma2SecondDer;
371 fJetShapeSigma2FirstSub = jet.fJetShapeSigma2FirstSub;
372 fJetShapeSigma2SecondSub = jet.fJetShapeSigma2SecondSub;
373 fJetShapeConstituentFirstDer = jet.fJetShapeConstituentFirstDer;
374 fJetShapeConstituentSecondDer = jet.fJetShapeConstituentSecondDer;
375 fJetShapeConstituentFirstSub = jet.fJetShapeConstituentFirstSub;
376 fJetShapeConstituentSecondSub = jet.fJetShapeConstituentSecondSub;
377 fJetShapeLeSubFirstDer = jet.fJetShapeLeSubFirstDer;
378 fJetShapeLeSubSecondDer = jet.fJetShapeLeSubSecondDer;
379 fJetShapeLeSubFirstSub = jet.fJetShapeLeSubFirstSub;
380 fJetShapeLeSubSecondSub = jet.fJetShapeLeSubSecondSub;
386 //_________________________________________________________________________________________________
387 Int_t AliEmcalJet::Compare(const TObject* obj) const
389 //Return -1 if this is smaller than obj, 0 if objects are equal and 1 if this is larger than obj.
391 const AliEmcalJet* jet = static_cast<const AliEmcalJet*>(obj);
399 //__________________________________________________________________________________________________
400 void AliEmcalJet::GetMom(TLorentzVector& vec) const
402 // Return momentum as four-vector.
404 vec.SetPtEtaPhiE(fPt, fEta, fPhi, E());
407 //__________________________________________________________________________________________________
408 void AliEmcalJet::Print(Option_t* /*option*/) const
410 // Print jet information.
412 Printf("Jet pt=%.2f, eta=%.2f, phi=%.2f, area=%.2f, NEF=%.2f", fPt, fEta, fPhi, fArea, fNEF);
415 //__________________________________________________________________________________________________
416 Double_t AliEmcalJet::PtSub(Double_t rho, Bool_t save)
418 // Return transverse momentum after scalar subtraction. Save the result if required.
419 // Result can be negative.
421 Double_t ptcorr = fPt - rho * fArea;
427 //__________________________________________________________________________________________________
428 Double_t AliEmcalJet::PtSubVect(Double_t rho, Bool_t save)
430 // Return transverse momentum after vectorial subtraction. Save the result if required.
431 // Result cannot be negative.
433 Double_t dx = Px() - rho * fArea * TMath::Cos(fAreaPhi);
434 Double_t dy = Py() - rho * fArea * TMath::Sin(fAreaPhi);
435 //Double_t dz = Pz() - rho * fArea * TMath::SinH(fAreaEta);
436 Double_t ptcorr = TMath::Sqrt(dx * dx + dy * dy);
442 //__________________________________________________________________________________________________
443 TLorentzVector AliEmcalJet::SubtractRhoVect(Double_t rho, Bool_t save)
445 // Return four-momentum after vectorial subtraction. Save pt if required.
446 // Saved value of pt is negative if the corrected momentum is pointing to the opposite half-plane in the x-y plane w.r.t. the raw momentum.
448 TLorentzVector vecCorr;
450 TLorentzVector vecBg;
451 vecBg.SetPtEtaPhiE(fArea, fAreaEta, fAreaPhi, fAreaE);
456 Double_t dPhi = TMath::Abs(TVector2::Phi_mpi_pi(Phi() - vecCorr.Phi()));
457 Int_t signum = dPhi <= TMath::PiOver2() ? 1 : -1;
458 fPtSubVect = signum * vecCorr.Pt();
463 //__________________________________________________________________________________________________
464 void AliEmcalJet::SortConstituents()
466 // Sort constituent by index (increasing).
468 std::sort(fClusterIDs.GetArray(), fClusterIDs.GetArray() + fClusterIDs.GetSize());
469 std::sort(fTrackIDs.GetArray(), fTrackIDs.GetArray() + fTrackIDs.GetSize());
472 //__________________________________________________________________________________________________
473 Double_t AliEmcalJet::DeltaR(const AliVParticle* part) const
475 // Helper function to calculate the distance between two jets or a jet and a particle
477 Double_t dPhi = Phi() - part->Phi();
478 Double_t dEta = Eta() - part->Eta();
479 dPhi = TVector2::Phi_mpi_pi(dPhi);
480 return TMath::Sqrt(dPhi * dPhi + dEta * dEta);
484 //__________________________________________________________________________________________________
485 std::vector<int> AliEmcalJet::SortConstituentsPt(TClonesArray* tracks) const
487 // Sorting by p_T (decreasing) jet constituents
489 typedef std::pair<Double_t, Int_t> ptidx_pair;
491 // Create vector for Pt sorting
492 std::vector<ptidx_pair> pair_list ;
494 for(Int_t i_entry = 0; i_entry < GetNumberOfTracks(); i_entry++)
496 AliVParticle* track = TrackAt(i_entry, tracks);
499 AliError(Form("Unable to find jet track %d in collection %s (pos in collection %d, max %d)", i_entry, tracks->GetName(), TrackAt(i_entry), tracks->GetEntriesFast()));
503 pair_list.push_back(std::make_pair(track->Pt(), i_entry));
506 std::stable_sort(pair_list.begin() , pair_list.end() , sort_descend());
508 // return an vector of indexes of constituents (sorted descending by pt)
509 std::vector <int> index_sorted_list;
511 for(std::vector< std::pair<Double_t, Int_t> >::iterator it = pair_list.begin(); it != pair_list.end(); ++it)
512 { index_sorted_list.push_back((*it).second); } // populating the return object with indexes of sorted tracks
514 return index_sorted_list;
517 //________________________________________________________________________
518 Double_t AliEmcalJet::GetZ(const Double_t trkPx, const Double_t trkPy, const Double_t trkPz) const
520 // Get the z of a constituent inside of a jet
522 Double_t pJetSq = P();
526 { return (trkPx * Px() + trkPy * Py() + trkPz * Pz()) / pJetSq ; }
528 { AliWarning(Form("%s: strange, pjet*pjet seems to be zero pJetSq: %f", GetName(), pJetSq)); return -1; }
531 //________________________________________________________________________
532 Double_t AliEmcalJet::GetZ(const AliVParticle* trk) const
534 // Get Z of constituent trk
536 return GetZ(trk->Px(), trk->Py(), trk->Pz());
539 //__________________________________________________________________________________________________
540 AliVParticle* AliEmcalJet::GetLeadingTrack(TClonesArray* tracks) const
542 AliVParticle* maxTrack = 0;
543 for(Int_t i = 0; i < GetNumberOfTracks(); i++) {
544 AliVParticle* track = TrackAt(i, tracks);
546 AliError(Form("Unable to find jet track %d in collection %s (pos in collection %d, max %d)",
547 i, tracks->GetName(), TrackAt(i), tracks->GetEntriesFast()));
550 if(!maxTrack || track->Pt() > maxTrack->Pt())
557 //__________________________________________________________________________________________________
558 AliVCluster* AliEmcalJet::GetLeadingCluster(TClonesArray* clusters) const
560 AliVCluster* maxCluster = 0;
561 for(Int_t i = 0; i < GetNumberOfClusters(); i++) {
562 AliVCluster* cluster = ClusterAt(i, clusters);
564 AliError(Form("Unable to find jet cluster %d in collection %s (pos in collection %d, max %d)",
565 i, clusters->GetName(), ClusterAt(i), clusters->GetEntriesFast()));
568 if(!maxCluster || cluster->E() > maxCluster->E())
569 maxCluster = cluster;
575 //__________________________________________________________________________________________________
576 void AliEmcalJet::ResetMatching()
580 fClosestJetsDist[0] = 999;
581 fClosestJetsDist[1] = 999;
585 //__________________________________________________________________________________________________
586 void AliEmcalJet::PrintGR()
588 for(Int_t i = 0; i < fGRNumerator.GetSize(); i++) {
589 Printf("num[%d] = %f", i, fGRNumerator.At(i));