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 fJetShapeConstituentFirstDer(0),
65 fJetShapeConstituentSecondDer(0),
66 fJetShapeConstituentFirstSub(0),
67 fJetShapeConstituentSecondSub(0),
68 fJetShapeLeSubFirstDer(0),
69 fJetShapeLeSubSecondDer(0),
70 fJetShapeLeSubFirstSub(0),
71 fJetShapeLeSubSecondSub(0)
76 fClosestJetsDist[0] = 999;
77 fClosestJetsDist[1] = 999;
80 //__________________________________________________________________________________________________
81 AliEmcalJet::AliEmcalJet(Double_t px, Double_t py, Double_t pz) :
83 fPt(TMath::Sqrt(px*px+py*py)),
84 fEta(TMath::ASinH(pz/fPt)),
110 fJetShapeMassFirstDer(0),
111 fJetShapeMassSecondDer(0),
112 fJetShapeMassFirstSub(0),
113 fJetShapeMassSecondSub(0),
118 fGRDenominatorSub(0),
119 fJetShapeAngularityFirstDer(0),
120 fJetShapeAngularitySecondDer(0),
121 fJetShapeAngularityFirstSub(0),
122 fJetShapeAngularitySecondSub(0),
123 fJetShapepTDFirstDer(0),
124 fJetShapepTDSecondDer(0),
125 fJetShapepTDFirstSub(0),
126 fJetShapepTDSecondSub(0),
127 fJetShapeCircularityFirstDer(0),
128 fJetShapeCircularitySecondDer(0),
129 fJetShapeCircularityFirstSub(0),
130 fJetShapeCircularitySecondSub(0),
131 fJetShapeConstituentFirstDer(0),
132 fJetShapeConstituentSecondDer(0),
133 fJetShapeConstituentFirstSub(0),
134 fJetShapeConstituentSecondSub(0),
135 fJetShapeLeSubFirstDer(0),
136 fJetShapeLeSubSecondDer(0),
137 fJetShapeLeSubFirstSub(0),
138 fJetShapeLeSubSecondSub(0)
143 fPhi = TMath::ATan2(py, px);
145 fPhi += 2. * TMath::Pi();
150 fClosestJetsDist[0] = 999;
151 fClosestJetsDist[1] = 999;
154 //_________________________________________________________________________________________________
155 AliEmcalJet::AliEmcalJet(Double_t pt, Double_t eta, Double_t phi, Double_t m) :
184 fJetShapeMassFirstDer(0),
185 fJetShapeMassSecondDer(0),
186 fJetShapeMassFirstSub(0),
187 fJetShapeMassSecondSub(0),
192 fGRDenominatorSub(0),
193 fJetShapeAngularityFirstDer(0),
194 fJetShapeAngularitySecondDer(0),
195 fJetShapeAngularityFirstSub(0),
196 fJetShapeAngularitySecondSub(0),
197 fJetShapepTDFirstDer(0),
198 fJetShapepTDSecondDer(0),
199 fJetShapepTDFirstSub(0),
200 fJetShapepTDSecondSub(0),
201 fJetShapeCircularityFirstDer(0),
202 fJetShapeCircularitySecondDer(0),
203 fJetShapeCircularityFirstSub(0),
204 fJetShapeCircularitySecondSub(0),
205 fJetShapeConstituentFirstDer(0),
206 fJetShapeConstituentSecondDer(0),
207 fJetShapeConstituentFirstSub(0),
208 fJetShapeConstituentSecondSub(0),
209 fJetShapeLeSubFirstDer(0),
210 fJetShapeLeSubSecondDer(0),
211 fJetShapeLeSubFirstSub(0),
212 fJetShapeLeSubSecondSub(0)
218 fPhi += TMath::TwoPi();
222 fClosestJetsDist[0] = 999;
223 fClosestJetsDist[1] = 999;
226 //_________________________________________________________________________________________________
227 AliEmcalJet::AliEmcalJet(const AliEmcalJet &jet) :
235 fAreaEta(jet.fAreaEta),
236 fAreaPhi(jet.fAreaPhi),
237 fAreaEmc(jet.fAreaEmc),
238 fAxisInEmcal(jet.fAxisInEmcal),
239 fFlavourTagging(jet.fFlavourTagging),
240 fMaxCPt(jet.fMaxCPt),
241 fMaxNPt(jet.fMaxNPt),
247 fClusterIDs(jet.fClusterIDs),
248 fTrackIDs(jet.fTrackIDs),
249 fMatched(jet.fMatched),
250 fMatchingType(jet.fMatchingType),
251 fTaggedJet(jet.fTaggedJet),
252 fTagStatus(jet.fTagStatus),
254 fPtVectSub(jet.fPtVectSub),
255 fTriggers(jet.fTriggers),
256 fJetShapeMassFirstDer(jet.fJetShapeMassFirstDer),
257 fJetShapeMassSecondDer(jet.fJetShapeMassSecondDer),
258 fJetShapeMassFirstSub(jet.fJetShapeMassFirstSub),
259 fJetShapeMassSecondSub(jet.fJetShapeMassSecondSub),
261 fGRNumerator(jet.fGRNumerator),
262 fGRDenominator(jet.fGRDenominator),
263 fGRNumeratorSub(jet.fGRNumeratorSub),
264 fGRDenominatorSub(jet.fGRDenominatorSub),
265 fJetShapeAngularityFirstDer(jet.fJetShapeAngularityFirstDer),
266 fJetShapeAngularitySecondDer(jet.fJetShapeAngularitySecondDer),
267 fJetShapeAngularityFirstSub(jet.fJetShapeAngularityFirstSub),
268 fJetShapeAngularitySecondSub(jet.fJetShapeAngularitySecondSub),
269 fJetShapepTDFirstDer(jet.fJetShapepTDFirstDer),
270 fJetShapepTDSecondDer(jet.fJetShapepTDSecondDer),
271 fJetShapepTDFirstSub(jet.fJetShapepTDFirstSub),
272 fJetShapepTDSecondSub(jet.fJetShapepTDSecondSub),
273 fJetShapeCircularityFirstDer(jet.fJetShapeCircularityFirstDer),
274 fJetShapeCircularitySecondDer(jet.fJetShapeCircularitySecondDer),
275 fJetShapeCircularityFirstSub(jet.fJetShapeCircularityFirstSub),
276 fJetShapeCircularitySecondSub(jet.fJetShapeCircularitySecondSub),
277 fJetShapeConstituentFirstDer(jet.fJetShapeConstituentFirstDer),
278 fJetShapeConstituentSecondDer(jet.fJetShapeConstituentSecondDer),
279 fJetShapeConstituentFirstSub(jet.fJetShapeConstituentFirstSub),
280 fJetShapeConstituentSecondSub(jet.fJetShapeConstituentSecondSub),
281 fJetShapeLeSubFirstDer(jet.fJetShapeLeSubFirstDer),
282 fJetShapeLeSubSecondDer(jet.fJetShapeLeSubSecondDer),
283 fJetShapeLeSubFirstSub(jet.fJetShapeLeSubFirstSub),
284 fJetShapeLeSubSecondSub(jet.fJetShapeLeSubSecondSub)
287 fClosestJets[0] = jet.fClosestJets[0];
288 fClosestJets[1] = jet.fClosestJets[1];
289 fClosestJetsDist[0] = jet.fClosestJetsDist[0];
290 fClosestJetsDist[1] = jet.fClosestJetsDist[1];
293 //_________________________________________________________________________________________________
294 AliEmcalJet &AliEmcalJet::operator=(const AliEmcalJet &jet)
296 // Assignment operator.
299 AliVParticle::operator=(jet);
306 fAreaEta = jet.fAreaEta;
307 fAreaPhi = jet.fAreaPhi;
308 fAreaEmc = jet.fAreaEmc;
309 fAxisInEmcal = jet.fAxisInEmcal;
310 fFlavourTagging = jet.fFlavourTagging;
311 fMaxCPt = jet.fMaxCPt;
312 fMaxNPt = jet.fMaxNPt;
318 fClusterIDs = jet.fClusterIDs;
319 fTrackIDs = jet.fTrackIDs;
320 fClosestJets[0] = jet.fClosestJets[0];
321 fClosestJets[1] = jet.fClosestJets[1];
322 fClosestJetsDist[0] = jet.fClosestJetsDist[0];
323 fClosestJetsDist[1] = jet.fClosestJetsDist[1];
324 fMatched = jet.fMatched;
325 fTaggedJet = jet.fTaggedJet;
326 fTagStatus = jet.fTagStatus;
328 fPtVectSub = jet.fPtVectSub;
329 fTriggers = jet.fTriggers;
330 fJetShapeMassFirstDer = jet.fJetShapeMassFirstDer;
331 fJetShapeMassSecondDer = jet.fJetShapeMassSecondDer;
332 fJetShapeMassFirstSub = jet.fJetShapeMassFirstSub;
333 fJetShapeMassSecondSub = jet.fJetShapeMassSecondSub;
335 fGRNumerator = jet.fGRNumerator;
336 fGRDenominator = jet.fGRDenominator;
337 fGRNumeratorSub = jet.fGRNumeratorSub;
338 fGRDenominatorSub = jet.fGRDenominatorSub;
339 fJetShapeAngularityFirstDer = jet.fJetShapeAngularityFirstDer;
340 fJetShapeAngularitySecondDer = jet.fJetShapeAngularitySecondDer;
341 fJetShapeAngularityFirstSub = jet.fJetShapeAngularityFirstSub;
342 fJetShapeAngularitySecondSub = jet.fJetShapeAngularitySecondSub;
343 fJetShapepTDFirstDer = jet.fJetShapepTDFirstDer;
344 fJetShapepTDSecondDer = jet.fJetShapepTDSecondDer;
345 fJetShapepTDFirstSub = jet.fJetShapepTDFirstSub;
346 fJetShapepTDSecondSub = jet.fJetShapepTDSecondSub;
347 fJetShapeCircularityFirstDer = jet.fJetShapeCircularityFirstDer;
348 fJetShapeCircularitySecondDer = jet.fJetShapeCircularitySecondDer;
349 fJetShapeCircularityFirstSub = jet.fJetShapeCircularityFirstSub;
350 fJetShapeCircularitySecondSub = jet.fJetShapeCircularitySecondSub;
351 fJetShapeConstituentFirstDer = jet.fJetShapeConstituentFirstDer;
352 fJetShapeConstituentSecondDer = jet.fJetShapeConstituentSecondDer;
353 fJetShapeConstituentFirstSub = jet.fJetShapeConstituentFirstSub;
354 fJetShapeConstituentSecondSub = jet.fJetShapeConstituentSecondSub;
355 fJetShapeLeSubFirstDer = jet.fJetShapeLeSubFirstDer;
356 fJetShapeLeSubSecondDer = jet.fJetShapeLeSubSecondDer;
357 fJetShapeLeSubFirstSub = jet.fJetShapeLeSubFirstSub;
358 fJetShapeLeSubSecondSub = jet.fJetShapeLeSubSecondSub;
364 //_________________________________________________________________________________________________
365 Int_t AliEmcalJet::Compare(const TObject* obj) const
367 //Return -1 if this is smaller than obj, 0 if objects are equal and 1 if this is larger than obj.
369 const AliEmcalJet *jet = static_cast<const AliEmcalJet *>(obj);
377 //__________________________________________________________________________________________________
378 void AliEmcalJet::GetMom(TLorentzVector &vec) const
380 // Return momentum as four vector.
382 Double_t p = fPt *TMath::CosH(fEta);
383 vec.SetPtEtaPhiE(fPt,fEta,fPhi,TMath::Sqrt(p*p+fM*fM));
386 //__________________________________________________________________________________________________
387 void AliEmcalJet::Print(Option_t* /*option*/) const
389 // Print jet information.
391 Printf("Jet pt=%.2f, eta=%.2f, phi=%.2f, area=%.2f, NEF=%.2f", fPt, fEta, fPhi, fArea, fNEF);
394 //__________________________________________________________________________________________________
395 Double_t AliEmcalJet::PtSubVect(Double_t rho) const
397 // Return vectorial subtracted transverse momentum.
399 Double_t dx = Px() - rho * fArea * TMath::Cos(fAreaPhi);
400 Double_t dy = Py() - rho * fArea * TMath::Sin(fAreaPhi);
401 //Double_t dz = Pz() - rho * fArea * TMath::SinH(fAreaEta);
402 return TMath::Sqrt(dx*dx+dy*dy);
405 //__________________________________________________________________________________________________
406 void AliEmcalJet::SortConstituents()
408 // Sort constituent by index (increasing).
410 std::sort(fClusterIDs.GetArray(), fClusterIDs.GetArray() + fClusterIDs.GetSize());
411 std::sort(fTrackIDs.GetArray(), fTrackIDs.GetArray() + fTrackIDs.GetSize());
414 //__________________________________________________________________________________________________
415 Double_t AliEmcalJet::DeltaR (const AliVParticle* part) const
416 { // Helper function to calculate the distance between two jets or a jet and a particle
417 Double_t dPhi = this->Phi() - part->Phi();
418 Double_t dEta = this->Eta() - part->Eta();
419 dPhi = TVector2::Phi_mpi_pi ( dPhi );
421 return TMath::Sqrt ( dPhi * dPhi + dEta * dEta );
425 //__________________________________________________________________________________________________
426 std::vector<int> AliEmcalJet::SortConstituentsPt( TClonesArray *tracks ) const
427 { //___________________________________________
428 // Sorting by p_T (decreasing) jet constituents
429 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
430 typedef std::pair<Double_t, Int_t> ptidx_pair;
432 // Create vector for Pt sorting
433 std::vector<ptidx_pair> pair_list ;
435 for ( Int_t i_entry = 0; i_entry < GetNumberOfTracks(); i_entry++ )
437 AliVParticle *track = TrackAt(i_entry, tracks);
440 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()));
444 pair_list.push_back( std::make_pair ( track->Pt(), i_entry ) );
447 std::stable_sort( pair_list.begin() , pair_list.end() , sort_descend() );
449 // return an vector of indexes of constituents (sorted descending by pt)
450 std::vector <int> index_sorted_list;
452 for ( std::vector< std::pair<Double_t,Int_t> >::iterator it = pair_list.begin(); it != pair_list.end(); ++it)
453 { index_sorted_list.push_back( (*it).second ); } // populating the return object with indexes of sorted tracks
455 return index_sorted_list;
458 //________________________________________________________________________
459 Double_t AliEmcalJet::GetZ ( const Double_t trkPx, const Double_t trkPy, const Double_t trkPz ) const
461 // Get the z of a constituent inside of a jet
462 Double_t pJetSq = this->Px() * this->Px() + this->Py() * this->Py() + this->Pz() * this->Pz();
465 { return ( trkPx * this->Px() + trkPy * this->Py() + trkPz * this->Pz() ) / pJetSq ; }
467 { AliWarning(Form("%s: strange, pjet*pjet seems to be zero pJetSq: %f",GetName(), pJetSq)); return -1; }
471 //________________________________________________________________________
472 Double_t AliEmcalJet::GetZ ( const AliVParticle* trk ) const
474 // Get Z of constituent trk
475 return GetZ ( trk->Px(), trk->Py(), trk->Pz() );
478 //__________________________________________________________________________________________________
479 AliVParticle* AliEmcalJet::GetLeadingTrack(TClonesArray *tracks) const
481 AliVParticle* maxTrack = 0;
482 for (Int_t i = 0; i < GetNumberOfTracks(); i++) {
483 AliVParticle *track = TrackAt(i, tracks);
485 AliError(Form("Unable to find jet track %d in collection %s (pos in collection %d, max %d)",
486 i,tracks->GetName(),TrackAt(i),tracks->GetEntriesFast()));
489 if (!maxTrack || track->Pt() > maxTrack->Pt())
496 //__________________________________________________________________________________________________
497 AliVCluster* AliEmcalJet::GetLeadingCluster(TClonesArray *clusters) const
499 AliVCluster* maxCluster = 0;
500 for (Int_t i = 0; i < GetNumberOfClusters(); i++) {
501 AliVCluster *cluster = ClusterAt(i, clusters);
503 AliError(Form("Unable to find jet cluster %d in collection %s (pos in collection %d, max %d)",
504 i,clusters->GetName(),ClusterAt(i),clusters->GetEntriesFast()));
507 if (!maxCluster || cluster->E() > maxCluster->E())
508 maxCluster = cluster;
514 //__________________________________________________________________________________________________
515 void AliEmcalJet::ResetMatching()
519 fClosestJetsDist[0] = 999;
520 fClosestJetsDist[1] = 999;
524 //__________________________________________________________________________________________________
525 void AliEmcalJet::PrintGR() {
526 for(Int_t i = 0; i<fGRNumerator.GetSize(); i++) {
527 Printf("num[%d] = %f",i,fGRNumerator.At(i));