6 #include "AliEmcalJet.h"
13 //__________________________________________________________________________________________________
14 AliEmcalJet::AliEmcalJet() :
43 fJetShapeMassFirstDer(0),
44 fJetShapeMassSecondDer(0),
45 fJetShapeMassFirstSub(0),
46 fJetShapeMassSecondSub(0),
57 fClosestJetsDist[0] = 999;
58 fClosestJetsDist[1] = 999;
61 //__________________________________________________________________________________________________
62 AliEmcalJet::AliEmcalJet(Double_t px, Double_t py, Double_t pz) :
64 fPt(TMath::Sqrt(px*px+py*py)),
65 fEta(TMath::ASinH(pz/fPt)),
91 fJetShapeMassFirstDer(0),
92 fJetShapeMassSecondDer(0),
93 fJetShapeMassFirstSub(0),
94 fJetShapeMassSecondSub(0),
104 fPhi = TMath::ATan2(py, px);
106 fPhi += 2. * TMath::Pi();
111 fClosestJetsDist[0] = 999;
112 fClosestJetsDist[1] = 999;
115 //_________________________________________________________________________________________________
116 AliEmcalJet::AliEmcalJet(Double_t pt, Double_t eta, Double_t phi, Double_t m) :
145 fJetShapeMassFirstDer(0),
146 fJetShapeMassSecondDer(0),
147 fJetShapeMassFirstSub(0),
148 fJetShapeMassSecondSub(0),
158 fPhi += TMath::TwoPi();
162 fClosestJetsDist[0] = 999;
163 fClosestJetsDist[1] = 999;
166 //_________________________________________________________________________________________________
167 AliEmcalJet::AliEmcalJet(const AliEmcalJet &jet) :
175 fAreaEta(jet.fAreaEta),
176 fAreaPhi(jet.fAreaPhi),
177 fAreaEmc(jet.fAreaEmc),
178 fAxisInEmcal(jet.fAxisInEmcal),
179 fFlavourTagging(jet.fFlavourTagging),
180 fMaxCPt(jet.fMaxCPt),
181 fMaxNPt(jet.fMaxNPt),
187 fClusterIDs(jet.fClusterIDs),
188 fTrackIDs(jet.fTrackIDs),
189 fMatched(jet.fMatched),
190 fMatchingType(jet.fMatchingType),
191 fTaggedJet(jet.fTaggedJet),
192 fTagStatus(jet.fTagStatus),
194 fPtVectSub(jet.fPtVectSub),
195 fTriggers(jet.fTriggers),
196 fJetShapeMassFirstDer(jet.fJetShapeMassFirstDer),
197 fJetShapeMassSecondDer(jet.fJetShapeMassSecondDer),
198 fJetShapeMassFirstSub(jet.fJetShapeMassFirstSub),
199 fJetShapeMassSecondSub(jet.fJetShapeMassSecondSub),
201 fGRNumerator(jet.fGRNumerator),
202 fGRDenominator(jet.fGRDenominator),
203 fGRNumeratorSub(jet.fGRNumeratorSub),
204 fGRDenominatorSub(jet.fGRDenominatorSub)
208 fClosestJets[0] = jet.fClosestJets[0];
209 fClosestJets[1] = jet.fClosestJets[1];
210 fClosestJetsDist[0] = jet.fClosestJetsDist[0];
211 fClosestJetsDist[1] = jet.fClosestJetsDist[1];
214 //_________________________________________________________________________________________________
215 AliEmcalJet &AliEmcalJet::operator=(const AliEmcalJet &jet)
217 // Assignment operator.
220 AliVParticle::operator=(jet);
227 fAreaEta = jet.fAreaEta;
228 fAreaPhi = jet.fAreaPhi;
229 fAreaEmc = jet.fAreaEmc;
230 fAxisInEmcal = jet.fAxisInEmcal;
231 fFlavourTagging = jet.fFlavourTagging;
232 fMaxCPt = jet.fMaxCPt;
233 fMaxNPt = jet.fMaxNPt;
239 fClusterIDs = jet.fClusterIDs;
240 fTrackIDs = jet.fTrackIDs;
241 fClosestJets[0] = jet.fClosestJets[0];
242 fClosestJets[1] = jet.fClosestJets[1];
243 fClosestJetsDist[0] = jet.fClosestJetsDist[0];
244 fClosestJetsDist[1] = jet.fClosestJetsDist[1];
245 fMatched = jet.fMatched;
246 fTaggedJet = jet.fTaggedJet;
247 fTagStatus = jet.fTagStatus;
249 fPtVectSub = jet.fPtVectSub;
250 fTriggers = jet.fTriggers;
251 fJetShapeMassFirstDer = jet.fJetShapeMassFirstDer;
252 fJetShapeMassSecondDer = jet.fJetShapeMassSecondDer;
253 fJetShapeMassFirstSub = jet.fJetShapeMassFirstSub;
254 fJetShapeMassSecondSub = jet.fJetShapeMassSecondSub;
256 fGRNumerator = jet.fGRNumerator;
257 fGRDenominator = jet.fGRDenominator;
258 fGRNumeratorSub = jet.fGRNumeratorSub;
259 fGRDenominatorSub = jet.fGRDenominatorSub;
265 //_________________________________________________________________________________________________
266 Int_t AliEmcalJet::Compare(const TObject* obj) const
268 //Return -1 if this is smaller than obj, 0 if objects are equal and 1 if this is larger than obj.
270 const AliEmcalJet *jet = static_cast<const AliEmcalJet *>(obj);
278 //__________________________________________________________________________________________________
279 void AliEmcalJet::GetMom(TLorentzVector &vec) const
281 // Return momentum as four vector.
283 Double_t p = fPt *TMath::CosH(fEta);
284 vec.SetPtEtaPhiE(fPt,fEta,fPhi,TMath::Sqrt(p*p+fM*fM));
287 //__________________________________________________________________________________________________
288 void AliEmcalJet::Print(Option_t* /*option*/) const
290 // Print jet information.
292 Printf("Jet pt=%.2f, eta=%.2f, phi=%.2f, area=%.2f, NEF=%.2f", fPt, fEta, fPhi, fArea, fNEF);
295 //__________________________________________________________________________________________________
296 Double_t AliEmcalJet::PtSubVect(Double_t rho) const
298 // Return vectorial subtracted transverse momentum.
300 Double_t dx = Px() - rho * fArea * TMath::Cos(fAreaPhi);
301 Double_t dy = Py() - rho * fArea * TMath::Sin(fAreaPhi);
302 //Double_t dz = Pz() - rho * fArea * TMath::SinH(fAreaEta);
303 return TMath::Sqrt(dx*dx+dy*dy);
306 //__________________________________________________________________________________________________
307 void AliEmcalJet::SortConstituents()
309 // Sort constituent by index (increasing).
311 std::sort(fClusterIDs.GetArray(), fClusterIDs.GetArray() + fClusterIDs.GetSize());
312 std::sort(fTrackIDs.GetArray(), fTrackIDs.GetArray() + fTrackIDs.GetSize());
315 //__________________________________________________________________________________________________
316 Double_t AliEmcalJet::DeltaR (const AliVParticle* part) const
317 { // Helper function to calculate the distance between two jets or a jet and a particle
318 Double_t dPhi = this->Phi() - part->Phi();
319 Double_t dEta = this->Eta() - part->Eta();
320 dPhi = TVector2::Phi_mpi_pi ( dPhi );
322 return TMath::Sqrt ( dPhi * dPhi + dEta * dEta );
326 //__________________________________________________________________________________________________
327 std::vector<int> AliEmcalJet::SortConstituentsPt( TClonesArray *tracks ) const
328 { //___________________________________________
329 // Sorting by p_T (decreasing) jet constituents
330 //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
331 typedef std::pair<Double_t, Int_t> ptidx_pair;
333 // Create vector for Pt sorting
334 std::vector<ptidx_pair> pair_list ;
336 for ( Int_t i_entry = 0; i_entry < GetNumberOfTracks(); i_entry++ )
338 AliVParticle *track = TrackAt(i_entry, tracks);
341 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()));
345 pair_list.push_back( std::make_pair ( track->Pt(), i_entry ) );
348 std::stable_sort( pair_list.begin() , pair_list.end() , sort_descend() );
350 // return an vector of indexes of constituents (sorted descending by pt)
351 std::vector <int> index_sorted_list;
353 for ( std::vector< std::pair<Double_t,Int_t> >::iterator it = pair_list.begin(); it != pair_list.end(); ++it)
354 { index_sorted_list.push_back( (*it).second ); } // populating the return object with indexes of sorted tracks
356 return index_sorted_list;
359 //__________________________________________________________________________________________________
360 AliVParticle* AliEmcalJet::GetLeadingTrack(TClonesArray *tracks) const
362 AliVParticle* maxTrack = 0;
363 for (Int_t i = 0; i < GetNumberOfTracks(); i++) {
364 AliVParticle *track = TrackAt(i, tracks);
366 AliError(Form("Unable to find jet track %d in collection %s (pos in collection %d, max %d)",
367 i,tracks->GetName(),TrackAt(i),tracks->GetEntriesFast()));
370 if (!maxTrack || track->Pt() > maxTrack->Pt())
377 //__________________________________________________________________________________________________
378 AliVCluster* AliEmcalJet::GetLeadingCluster(TClonesArray *clusters) const
380 AliVCluster* maxCluster = 0;
381 for (Int_t i = 0; i < GetNumberOfClusters(); i++) {
382 AliVCluster *cluster = ClusterAt(i, clusters);
384 AliError(Form("Unable to find jet cluster %d in collection %s (pos in collection %d, max %d)",
385 i,clusters->GetName(),ClusterAt(i),clusters->GetEntriesFast()));
388 if (!maxCluster || cluster->E() > maxCluster->E())
389 maxCluster = cluster;
395 //__________________________________________________________________________________________________
396 void AliEmcalJet::ResetMatching()
400 fClosestJetsDist[0] = 999;
401 fClosestJetsDist[1] = 999;
405 //__________________________________________________________________________________________________
406 void AliEmcalJet::PrintGR() {
407 for(Int_t i = 0; i<fGRNumerator.GetSize(); i++) {
408 Printf("num[%d] = %f",i,fGRNumerator.At(i));