6 #include "AliEmcalJet.h"
13 //__________________________________________________________________________________________________
14 AliEmcalJet::AliEmcalJet() :
43 fJetShapeMassFirstDer(0),
44 fJetShapeMassSecondDer(0),
45 fJetShapeMassFirstSub(0),
46 fJetShapeMassSecondSub(0),
52 fJetShapeAngularityFirstDer(0),
53 fJetShapeAngularitySecondDer(0),
54 fJetShapeAngularityFirstSub(0),
55 fJetShapeAngularitySecondSub(0),
56 fJetShapepTDFirstDer(0),
57 fJetShapepTDSecondDer(0),
58 fJetShapepTDFirstSub(0),
59 fJetShapepTDSecondSub(0),
60 fJetShapeCircularityFirstDer(0),
61 fJetShapeCircularitySecondDer(0),
62 fJetShapeCircularityFirstSub(0),
63 fJetShapeCircularitySecondSub(0),
64 fJetShapeSigma2FirstDer(0),
65 fJetShapeSigma2SecondDer(0),
66 fJetShapeSigma2FirstSub(0),
67 fJetShapeSigma2SecondSub(0),
68 fJetShapeConstituentFirstDer(0),
69 fJetShapeConstituentSecondDer(0),
70 fJetShapeConstituentFirstSub(0),
71 fJetShapeConstituentSecondSub(0),
72 fJetShapeLeSubFirstDer(0),
73 fJetShapeLeSubSecondDer(0),
74 fJetShapeLeSubFirstSub(0),
75 fJetShapeLeSubSecondSub(0)
80 fClosestJetsDist[0] = 999;
81 fClosestJetsDist[1] = 999;
84 //__________________________________________________________________________________________________
85 AliEmcalJet::AliEmcalJet(Double_t px, Double_t py, Double_t pz) :
87 fPt(TMath::Sqrt(px*px+py*py)),
88 fEta(TMath::ASinH(pz/fPt)),
114 fJetShapeMassFirstDer(0),
115 fJetShapeMassSecondDer(0),
116 fJetShapeMassFirstSub(0),
117 fJetShapeMassSecondSub(0),
122 fGRDenominatorSub(0),
123 fJetShapeAngularityFirstDer(0),
124 fJetShapeAngularitySecondDer(0),
125 fJetShapeAngularityFirstSub(0),
126 fJetShapeAngularitySecondSub(0),
127 fJetShapepTDFirstDer(0),
128 fJetShapepTDSecondDer(0),
129 fJetShapepTDFirstSub(0),
130 fJetShapepTDSecondSub(0),
131 fJetShapeCircularityFirstDer(0),
132 fJetShapeCircularitySecondDer(0),
133 fJetShapeCircularityFirstSub(0),
134 fJetShapeCircularitySecondSub(0),
135 fJetShapeSigma2FirstDer(0),
136 fJetShapeSigma2SecondDer(0),
137 fJetShapeSigma2FirstSub(0),
138 fJetShapeSigma2SecondSub(0),
139 fJetShapeConstituentFirstDer(0),
140 fJetShapeConstituentSecondDer(0),
141 fJetShapeConstituentFirstSub(0),
142 fJetShapeConstituentSecondSub(0),
143 fJetShapeLeSubFirstDer(0),
144 fJetShapeLeSubSecondDer(0),
145 fJetShapeLeSubFirstSub(0),
146 fJetShapeLeSubSecondSub(0)
151 fPhi = TVector2::Phi_0_2pi(TMath::ATan2(py, px));
156 fClosestJetsDist[0] = 999;
157 fClosestJetsDist[1] = 999;
160 //_________________________________________________________________________________________________
161 AliEmcalJet::AliEmcalJet(Double_t pt, Double_t eta, Double_t phi, Double_t m) :
190 fJetShapeMassFirstDer(0),
191 fJetShapeMassSecondDer(0),
192 fJetShapeMassFirstSub(0),
193 fJetShapeMassSecondSub(0),
198 fGRDenominatorSub(0),
199 fJetShapeAngularityFirstDer(0),
200 fJetShapeAngularitySecondDer(0),
201 fJetShapeAngularityFirstSub(0),
202 fJetShapeAngularitySecondSub(0),
203 fJetShapepTDFirstDer(0),
204 fJetShapepTDSecondDer(0),
205 fJetShapepTDFirstSub(0),
206 fJetShapepTDSecondSub(0),
207 fJetShapeCircularityFirstDer(0),
208 fJetShapeCircularitySecondDer(0),
209 fJetShapeCircularityFirstSub(0),
210 fJetShapeCircularitySecondSub(0),
211 fJetShapeSigma2FirstDer(0),
212 fJetShapeSigma2SecondDer(0),
213 fJetShapeSigma2FirstSub(0),
214 fJetShapeSigma2SecondSub(0),
215 fJetShapeConstituentFirstDer(0),
216 fJetShapeConstituentSecondDer(0),
217 fJetShapeConstituentFirstSub(0),
218 fJetShapeConstituentSecondSub(0),
219 fJetShapeLeSubFirstDer(0),
220 fJetShapeLeSubSecondDer(0),
221 fJetShapeLeSubFirstSub(0),
222 fJetShapeLeSubSecondSub(0)
227 fPhi = TVector2::Phi_0_2pi(fPhi);
231 fClosestJetsDist[0] = 999;
232 fClosestJetsDist[1] = 999;
235 //_________________________________________________________________________________________________
236 AliEmcalJet::AliEmcalJet(const AliEmcalJet &jet) :
244 fAreaEta(jet.fAreaEta),
245 fAreaPhi(jet.fAreaPhi),
246 fAreaEmc(jet.fAreaEmc),
247 fAxisInEmcal(jet.fAxisInEmcal),
248 fFlavourTagging(jet.fFlavourTagging),
249 fMaxCPt(jet.fMaxCPt),
250 fMaxNPt(jet.fMaxNPt),
256 fClusterIDs(jet.fClusterIDs),
257 fTrackIDs(jet.fTrackIDs),
258 fMatched(jet.fMatched),
259 fMatchingType(jet.fMatchingType),
260 fTaggedJet(jet.fTaggedJet),
261 fTagStatus(jet.fTagStatus),
263 fPtVectSub(jet.fPtVectSub),
264 fTriggers(jet.fTriggers),
265 fJetShapeMassFirstDer(jet.fJetShapeMassFirstDer),
266 fJetShapeMassSecondDer(jet.fJetShapeMassSecondDer),
267 fJetShapeMassFirstSub(jet.fJetShapeMassFirstSub),
268 fJetShapeMassSecondSub(jet.fJetShapeMassSecondSub),
270 fGRNumerator(jet.fGRNumerator),
271 fGRDenominator(jet.fGRDenominator),
272 fGRNumeratorSub(jet.fGRNumeratorSub),
273 fGRDenominatorSub(jet.fGRDenominatorSub),
274 fJetShapeAngularityFirstDer(jet.fJetShapeAngularityFirstDer),
275 fJetShapeAngularitySecondDer(jet.fJetShapeAngularitySecondDer),
276 fJetShapeAngularityFirstSub(jet.fJetShapeAngularityFirstSub),
277 fJetShapeAngularitySecondSub(jet.fJetShapeAngularitySecondSub),
278 fJetShapepTDFirstDer(jet.fJetShapepTDFirstDer),
279 fJetShapepTDSecondDer(jet.fJetShapepTDSecondDer),
280 fJetShapepTDFirstSub(jet.fJetShapepTDFirstSub),
281 fJetShapepTDSecondSub(jet.fJetShapepTDSecondSub),
282 fJetShapeCircularityFirstDer(jet.fJetShapeCircularityFirstDer),
283 fJetShapeCircularitySecondDer(jet.fJetShapeCircularitySecondDer),
284 fJetShapeCircularityFirstSub(jet.fJetShapeCircularityFirstSub),
285 fJetShapeCircularitySecondSub(jet.fJetShapeCircularitySecondSub),
286 fJetShapeSigma2FirstDer(jet.fJetShapeSigma2FirstDer),
287 fJetShapeSigma2SecondDer(jet.fJetShapeSigma2SecondDer),
288 fJetShapeSigma2FirstSub(jet.fJetShapeSigma2FirstSub),
289 fJetShapeSigma2SecondSub(jet.fJetShapeSigma2SecondSub),
290 fJetShapeConstituentFirstDer(jet.fJetShapeConstituentFirstDer),
291 fJetShapeConstituentSecondDer(jet.fJetShapeConstituentSecondDer),
292 fJetShapeConstituentFirstSub(jet.fJetShapeConstituentFirstSub),
293 fJetShapeConstituentSecondSub(jet.fJetShapeConstituentSecondSub),
294 fJetShapeLeSubFirstDer(jet.fJetShapeLeSubFirstDer),
295 fJetShapeLeSubSecondDer(jet.fJetShapeLeSubSecondDer),
296 fJetShapeLeSubFirstSub(jet.fJetShapeLeSubFirstSub),
297 fJetShapeLeSubSecondSub(jet.fJetShapeLeSubSecondSub)
300 fClosestJets[0] = jet.fClosestJets[0];
301 fClosestJets[1] = jet.fClosestJets[1];
302 fClosestJetsDist[0] = jet.fClosestJetsDist[0];
303 fClosestJetsDist[1] = jet.fClosestJetsDist[1];
306 //_________________________________________________________________________________________________
307 AliEmcalJet &AliEmcalJet::operator=(const AliEmcalJet &jet)
309 // Assignment operator.
312 AliVParticle::operator=(jet);
319 fAreaEta = jet.fAreaEta;
320 fAreaPhi = jet.fAreaPhi;
321 fAreaEmc = jet.fAreaEmc;
322 fAxisInEmcal = jet.fAxisInEmcal;
323 fFlavourTagging = jet.fFlavourTagging;
324 fMaxCPt = jet.fMaxCPt;
325 fMaxNPt = jet.fMaxNPt;
331 fClusterIDs = jet.fClusterIDs;
332 fTrackIDs = jet.fTrackIDs;
333 fClosestJets[0] = jet.fClosestJets[0];
334 fClosestJets[1] = jet.fClosestJets[1];
335 fClosestJetsDist[0] = jet.fClosestJetsDist[0];
336 fClosestJetsDist[1] = jet.fClosestJetsDist[1];
337 fMatched = jet.fMatched;
338 fTaggedJet = jet.fTaggedJet;
339 fTagStatus = jet.fTagStatus;
341 fPtVectSub = jet.fPtVectSub;
342 fTriggers = jet.fTriggers;
343 fJetShapeMassFirstDer = jet.fJetShapeMassFirstDer;
344 fJetShapeMassSecondDer = jet.fJetShapeMassSecondDer;
345 fJetShapeMassFirstSub = jet.fJetShapeMassFirstSub;
346 fJetShapeMassSecondSub = jet.fJetShapeMassSecondSub;
348 fGRNumerator = jet.fGRNumerator;
349 fGRDenominator = jet.fGRDenominator;
350 fGRNumeratorSub = jet.fGRNumeratorSub;
351 fGRDenominatorSub = jet.fGRDenominatorSub;
352 fJetShapeAngularityFirstDer = jet.fJetShapeAngularityFirstDer;
353 fJetShapeAngularitySecondDer = jet.fJetShapeAngularitySecondDer;
354 fJetShapeAngularityFirstSub = jet.fJetShapeAngularityFirstSub;
355 fJetShapeAngularitySecondSub = jet.fJetShapeAngularitySecondSub;
356 fJetShapepTDFirstDer = jet.fJetShapepTDFirstDer;
357 fJetShapepTDSecondDer = jet.fJetShapepTDSecondDer;
358 fJetShapepTDFirstSub = jet.fJetShapepTDFirstSub;
359 fJetShapepTDSecondSub = jet.fJetShapepTDSecondSub;
360 fJetShapeCircularityFirstDer = jet.fJetShapeCircularityFirstDer;
361 fJetShapeCircularitySecondDer = jet.fJetShapeCircularitySecondDer;
362 fJetShapeCircularityFirstSub = jet.fJetShapeCircularityFirstSub;
363 fJetShapeCircularitySecondSub = jet.fJetShapeCircularitySecondSub;
364 fJetShapeSigma2FirstDer = jet.fJetShapeSigma2FirstDer;
365 fJetShapeSigma2SecondDer = jet.fJetShapeSigma2SecondDer;
366 fJetShapeSigma2FirstSub = jet.fJetShapeSigma2FirstSub;
367 fJetShapeSigma2SecondSub = jet.fJetShapeSigma2SecondSub;
368 fJetShapeConstituentFirstDer = jet.fJetShapeConstituentFirstDer;
369 fJetShapeConstituentSecondDer = jet.fJetShapeConstituentSecondDer;
370 fJetShapeConstituentFirstSub = jet.fJetShapeConstituentFirstSub;
371 fJetShapeConstituentSecondSub = jet.fJetShapeConstituentSecondSub;
372 fJetShapeLeSubFirstDer = jet.fJetShapeLeSubFirstDer;
373 fJetShapeLeSubSecondDer = jet.fJetShapeLeSubSecondDer;
374 fJetShapeLeSubFirstSub = jet.fJetShapeLeSubFirstSub;
375 fJetShapeLeSubSecondSub = jet.fJetShapeLeSubSecondSub;
381 //_________________________________________________________________________________________________
382 Int_t AliEmcalJet::Compare(const TObject* obj) const
384 //Return -1 if this is smaller than obj, 0 if objects are equal and 1 if this is larger than obj.
386 const AliEmcalJet *jet = static_cast<const AliEmcalJet *>(obj);
394 //__________________________________________________________________________________________________
395 void AliEmcalJet::GetMom(TLorentzVector &vec) const
397 // Return momentum as four vector.
399 Double_t p = fPt *TMath::CosH(fEta);
400 vec.SetPtEtaPhiE(fPt,fEta,fPhi,TMath::Sqrt(p*p+fM*fM));
403 //__________________________________________________________________________________________________
404 void AliEmcalJet::Print(Option_t* /*option*/) const
406 // Print jet information.
408 Printf("Jet pt=%.2f, eta=%.2f, phi=%.2f, area=%.2f, NEF=%.2f", fPt, fEta, fPhi, fArea, fNEF);
411 //__________________________________________________________________________________________________
412 Double_t AliEmcalJet::PtSubVect(Double_t rho) const
414 // Return vectorial subtracted transverse momentum.
416 Double_t dx = Px() - rho * fArea * TMath::Cos(fAreaPhi);
417 Double_t dy = Py() - rho * fArea * TMath::Sin(fAreaPhi);
418 //Double_t dz = Pz() - rho * fArea * TMath::SinH(fAreaEta);
419 return TMath::Sqrt(dx*dx+dy*dy);
422 //__________________________________________________________________________________________________
423 void AliEmcalJet::SortConstituents()
425 // Sort constituent by index (increasing).
427 std::sort(fClusterIDs.GetArray(), fClusterIDs.GetArray() + fClusterIDs.GetSize());
428 std::sort(fTrackIDs.GetArray(), fTrackIDs.GetArray() + fTrackIDs.GetSize());
431 //__________________________________________________________________________________________________
432 Double_t AliEmcalJet::DeltaR (const AliVParticle* part) const
433 { // Helper function to calculate the distance between two jets or a jet and a particle
434 Double_t dPhi = this->Phi() - part->Phi();
435 Double_t dEta = this->Eta() - part->Eta();
436 dPhi = TVector2::Phi_mpi_pi ( dPhi );
438 return TMath::Sqrt ( dPhi * dPhi + dEta * dEta );
442 //__________________________________________________________________________________________________
443 std::vector<int> AliEmcalJet::SortConstituentsPt( TClonesArray *tracks ) const
444 { //___________________________________________
445 // Sorting by p_T (decreasing) jet constituents
446 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
447 typedef std::pair<Double_t, Int_t> ptidx_pair;
449 // Create vector for Pt sorting
450 std::vector<ptidx_pair> pair_list ;
452 for ( Int_t i_entry = 0; i_entry < GetNumberOfTracks(); i_entry++ )
454 AliVParticle *track = TrackAt(i_entry, tracks);
457 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()));
461 pair_list.push_back( std::make_pair ( track->Pt(), i_entry ) );
464 std::stable_sort( pair_list.begin() , pair_list.end() , sort_descend() );
466 // return an vector of indexes of constituents (sorted descending by pt)
467 std::vector <int> index_sorted_list;
469 for ( std::vector< std::pair<Double_t,Int_t> >::iterator it = pair_list.begin(); it != pair_list.end(); ++it)
470 { index_sorted_list.push_back( (*it).second ); } // populating the return object with indexes of sorted tracks
472 return index_sorted_list;
475 //________________________________________________________________________
476 Double_t AliEmcalJet::GetZ ( const Double_t trkPx, const Double_t trkPy, const Double_t trkPz ) const
478 // Get the z of a constituent inside of a jet
479 Double_t pJetSq = this->Px() * this->Px() + this->Py() * this->Py() + this->Pz() * this->Pz();
482 { return ( trkPx * this->Px() + trkPy * this->Py() + trkPz * this->Pz() ) / pJetSq ; }
484 { AliWarning(Form("%s: strange, pjet*pjet seems to be zero pJetSq: %f",GetName(), pJetSq)); return -1; }
488 //________________________________________________________________________
489 Double_t AliEmcalJet::GetZ ( const AliVParticle* trk ) const
491 // Get Z of constituent trk
492 return GetZ ( trk->Px(), trk->Py(), trk->Pz() );
495 //__________________________________________________________________________________________________
496 AliVParticle* AliEmcalJet::GetLeadingTrack(TClonesArray *tracks) const
498 AliVParticle* maxTrack = 0;
499 for (Int_t i = 0; i < GetNumberOfTracks(); i++) {
500 AliVParticle *track = TrackAt(i, tracks);
502 AliError(Form("Unable to find jet track %d in collection %s (pos in collection %d, max %d)",
503 i,tracks->GetName(),TrackAt(i),tracks->GetEntriesFast()));
506 if (!maxTrack || track->Pt() > maxTrack->Pt())
513 //__________________________________________________________________________________________________
514 AliVCluster* AliEmcalJet::GetLeadingCluster(TClonesArray *clusters) const
516 AliVCluster* maxCluster = 0;
517 for (Int_t i = 0; i < GetNumberOfClusters(); i++) {
518 AliVCluster *cluster = ClusterAt(i, clusters);
520 AliError(Form("Unable to find jet cluster %d in collection %s (pos in collection %d, max %d)",
521 i,clusters->GetName(),ClusterAt(i),clusters->GetEntriesFast()));
524 if (!maxCluster || cluster->E() > maxCluster->E())
525 maxCluster = cluster;
531 //__________________________________________________________________________________________________
532 void AliEmcalJet::ResetMatching()
536 fClosestJetsDist[0] = 999;
537 fClosestJetsDist[1] = 999;
541 //__________________________________________________________________________________________________
542 void AliEmcalJet::PrintGR() {
543 for(Int_t i = 0; i<fGRNumerator.GetSize(); i++) {
544 Printf("num[%d] = %f",i,fGRNumerator.At(i));