1 #include "AliAnalysisMuMuSingle.h"
5 * \ingroup pwg-muon-mumu
7 * \class AliAnalysisMuMuSingle
9 * Histogramming of single muon tracks. Mostly to get control plots for
10 * the AliAnalysisMuMuMinv sub-analysis, with respect to track cuts used,
11 * like Rabs, p x DCA, etc...
16 #include "AliMuonTrackCuts.h"
17 #include "AliAnalysisMuonUtility.h"
20 #include "AliVParticle.h"
21 #include "TLorentzVector.h"
22 #include "AliAnalysisMuMuCutCombination.h"
23 #include "AliAnalysisMuMuCutRegistry.h"
24 #include "AliMergeableCollection.h"
26 ClassImp(AliAnalysisMuMuSingle)
28 //_____________________________________________________________________________
29 AliAnalysisMuMuSingle::AliAnalysisMuMuSingle()
30 : AliAnalysisMuMuBase(),
32 fShouldSeparatePlusAndMinus(kFALSE),
38 //_____________________________________________________________________________
39 AliAnalysisMuMuSingle::~AliAnalysisMuMuSingle()
42 delete fMuonTrackCuts;
47 //_____________________________________________________________________________
49 AliAnalysisMuMuSingle::CreateTrackHisto(const char* eventSelection,
50 const char* triggerClassName,
51 const char* centrality,
52 const char* hname, const char* htitle,
53 Int_t nbinsx, Double_t xmin, Double_t xmax,
54 Int_t nbinsy, Double_t ymin, Double_t ymax,
55 Bool_t separatePlusAndMinus) const
57 /// Append histograms for single track to our histogram collection
59 if ( IsHistogramDisabled(hname) ) return;
61 if ( separatePlusAndMinus )
63 const char* suffix[] = { "Plus", "Minus" };
64 const char* symbol[] = { "+", "-" };
66 for ( Int_t i = 0; i < 2; ++i )
68 TString shtitle(htitle);
69 TString shname(hname);
71 shtitle.ReplaceAll("#mu",Form("#mu^{%s}",symbol[i]));
75 CreateTrackHistos(kHistoForData | kHistoForMCInput,eventSelection,triggerClassName,centrality,shname.Data(),shtitle.Data(),
76 nbinsx,xmin,xmax,nbinsy,ymin,ymax);
81 CreateTrackHistos(kHistoForData | kHistoForMCInput,eventSelection,triggerClassName,centrality,hname,htitle,
82 nbinsx,xmin,xmax,nbinsy,ymin,ymax);
86 //_____________________________________________________________________________
87 Bool_t AliAnalysisMuMuSingle::IsPDCAOK(const AliVParticle& part)
89 UInt_t selectionMask = MuonTrackCuts() ? MuonTrackCuts()->GetSelectionMask(&part) : 0;
91 return ( ( selectionMask & AliMuonTrackCuts::kMuPdca ) == AliMuonTrackCuts::kMuPdca );
94 //_____________________________________________________________________________
95 Bool_t AliAnalysisMuMuSingle::IsRabsOK(const AliVParticle& part) const
97 Double_t thetaAbsEndDeg = AliAnalysisMuonUtility::GetThetaAbsDeg(&part);
99 return ( thetaAbsEndDeg > 2. && thetaAbsEndDeg < 10. );
102 //_____________________________________________________________________________
103 Bool_t AliAnalysisMuMuSingle::IsEtaInRange(const AliVParticle& part) const
105 return (part.Eta() > -4.0 && part.Eta() < -2.5);
108 //_____________________________________________________________________________
109 void AliAnalysisMuMuSingle::SetRun(const AliInputEventHandler* eventHandler)
111 MuonTrackCuts()->SetRun(eventHandler);
114 //_____________________________________________________________________________
115 Int_t AliAnalysisMuMuSingle::EAGetNumberOfMuonTracks() const
117 // Get the number of muon tracks *that are not ghosts*
119 Int_t ntracks = AliAnalysisMuonUtility::GetNTracks(Event());
121 for ( Int_t i = 0; i < ntracks; ++i )
123 AliVParticle* track = AliAnalysisMuonUtility::GetTrack(i,Event());
124 if (AliAnalysisMuonUtility::IsMuonGhost(track)) --ntracks;
130 ////_____________________________________________________________________________
131 //Int_t AliAnalysisMuMuSingle::EAGetNumberOfSelectMuonTracks() const
133 // // Get the number of "very good" muon tracks :
134 // // Rabs + DCA + pT > 1.5 Gev/C
136 // Int_t nTracks = AliAnalysisMuonUtility::GetNTracks(Event());
138 // UInt_t check = kAll | kMatched | kRabs | kDCA | kEta | kPt1dot5;
142 // for ( Int_t i = 0; i < nTracks; ++i )
144 // ULong64_t m = GetTrackMask(i);
145 // if ( ( m & check ) == check )
153 //_____________________________________________________________________________
154 Double_t AliAnalysisMuMuSingle::EAGetTrackDCA(const AliVParticle& track) const
158 Double_t xdca = AliAnalysisMuonUtility::GetXatDCA(&track);
159 Double_t ydca = AliAnalysisMuonUtility::GetYatDCA(&track);
161 return TMath::Sqrt(xdca*xdca+ydca*ydca);
164 //_____________________________________________________________________________
165 void AliAnalysisMuMuSingle::DefineHistogramCollection(const char* eventSelection,
166 const char* triggerClassName,
167 const char* centrality)
169 /// Actually create the histograms for phyics/triggerClassName
171 if ( Histo(eventSelection,triggerClassName,centrality,"AliAnalysisMuMuSingle") )
176 AliAnalysisMuMuBase::EDataType dt = AliAnalysisMuMuBase::kHistoForData;
178 // dummy histogram to signal that we already defined all our histograms (see above)
179 CreateEventHistos(dt,eventSelection,triggerClassName,centrality,"AliAnalysisMuMuSingle","Dummy semaphore",1,0,1);
182 Double_t ptMax = 12*3;
183 Int_t nbinsPt = GetNbins(ptMin,ptMax,0.5);
185 Double_t pMax = 100*3;
186 Int_t nbinsP = GetNbins(pMin,pMax,2.0);
187 Double_t etaMin = -5;
188 Double_t etaMax = -2;
189 Int_t nbinsEta = GetNbins(etaMin,etaMax,0.05);
191 Double_t rapidityMin = -5;
192 Double_t rapidityMax = -2;
193 Int_t nbinsRapidity = GetNbins(rapidityMin,rapidityMax,0.05);
195 Double_t phiMin = -TMath::Pi();
196 Double_t phiMax = TMath::Pi();
197 Int_t nbinsPhi = GetNbins(phiMin,phiMax,0.05);
199 CreateTrackHisto(eventSelection,triggerClassName,centrality,"Chi2MatchTrigger","Chi2 Match Trigger",72,0,72);
201 CreateTrackHisto(eventSelection,triggerClassName,centrality,"EtaRapidityMu", "Eta distribution vs Rapidity for #mu", nbinsRapidity,rapidityMin,rapidityMax,nbinsEta,etaMin,etaMax, fShouldSeparatePlusAndMinus);
203 CreateTrackHisto(eventSelection,triggerClassName,centrality,"PtEtaMu", "P_{T} distribution vs Eta for #mu", nbinsEta,etaMin,etaMax, nbinsPt,ptMin,ptMax,fShouldSeparatePlusAndMinus);
205 CreateTrackHisto(eventSelection,triggerClassName,centrality,"PtRapidityMu", "P_{T} distribution vs Rapidity for #mu", nbinsRapidity,rapidityMin,rapidityMax, nbinsPt,ptMin,ptMax,fShouldSeparatePlusAndMinus);
207 CreateTrackHisto(eventSelection,triggerClassName,centrality,"PtPhiMu", "P_{T} distribution vs phi for #mu", nbinsPhi,phiMin,phiMax, nbinsPt,ptMin,ptMax,fShouldSeparatePlusAndMinus);
210 CreateTrackHisto(eventSelection,triggerClassName,centrality,"PEtaMu", "P distribution for #mu",nbinsEta,etaMin,etaMax,nbinsP,pMin,pMax,fShouldSeparatePlusAndMinus);
212 Double_t chi2min = 0;
213 Double_t chi2max = 20;
214 Int_t nbinchi2 = GetNbins(chi2min,chi2max,0.05);
216 CreateTrackHisto(eventSelection, triggerClassName, centrality, "Chi2Mu", "chisquare per NDF #mu", nbinchi2, chi2min, chi2max,-1, 0.0, 0.0, fShouldSeparatePlusAndMinus);
220 Int_t nbins = GetNbins(xmin,xmax,2.0);
222 CreateTrackHisto(eventSelection,triggerClassName,centrality,"dcaP23Mu","#mu DCA vs P for 2-3 degrees;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax,fShouldSeparatePlusAndMinus);
224 CreateTrackHisto(eventSelection,triggerClassName,centrality,"dcaP310Mu","#mu DCA vs P for 3-10 degrees;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax,fShouldSeparatePlusAndMinus);
226 CreateTrackHisto(eventSelection,triggerClassName,centrality,"dcaPwPtCut23Mu","#mu DCA vs P for 2-3 degrees with Pt Cut;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax,fShouldSeparatePlusAndMinus);
228 CreateTrackHisto(eventSelection,triggerClassName,centrality,"dcaPwPtCut310Mu","#mu DCA vs P for 3-10 degrees with Pt Cut;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax,fShouldSeparatePlusAndMinus);
232 //_____________________________________________________________________________
233 void AliAnalysisMuMuSingle::FillHistosForTrack(const char* eventSelection,
234 const char* triggerClassName,
235 const char* centrality,
236 const char* trackCutName,
237 const AliVParticle& track)
239 /// Fill histograms for one track
241 if (!AliAnalysisMuonUtility::IsMuonTrack(&track) ) return;
245 MuonTrackCuts()->SetIsMC();
248 TLorentzVector p(track.Px(),track.Py(),track.Pz(),
249 TMath::Sqrt(AliAnalysisMuonUtility::MuonMass2()+track.P()*track.P()));
254 if ( ShouldSeparatePlusAndMinus() )
256 if ( track.Charge() < 0 )
266 Double_t dca = EAGetTrackDCA(track);
268 Double_t theta = AliAnalysisMuonUtility::GetThetaAbsDeg(&track);
270 if (!IsHistogramDisabled("Chi2MatchTrigger"))
272 Histo(eventSelection,triggerClassName,centrality,trackCutName,"Chi2MatchTrigger")->Fill(AliAnalysisMuonUtility::GetChi2MatchTrigger(&track));
275 if (!IsHistogramDisabled("EtaRapidityMu*"))
277 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("EtaRapidityMu%s",charge.Data()))->Fill(p.Rapidity(),p.Eta());
280 if (!IsHistogramDisabled("PtEtaMu*"))
282 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("PtEtaMu%s",charge.Data()))->Fill(p.Eta(),p.Pt());
285 if (!IsHistogramDisabled("PtRapidityMu*"))
287 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("PtRapidityMu%s",charge.Data()))->Fill(p.Rapidity(),p.Pt());
290 if (!IsHistogramDisabled("PEtaMu*"))
292 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("PEtaMu%s",charge.Data()))->Fill(p.Eta(),p.P());
295 if (!IsHistogramDisabled("PtPhiMu*"))
297 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("PtPhiMu%s",charge.Data()))->Fill(p.Phi(),p.Pt());
300 if (!IsHistogramDisabled("Chi2Mu*"))
302 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("Chi2Mu%s",charge.Data()))->Fill(AliAnalysisMuonUtility::GetChi2perNDFtracker(&track));
305 if ( theta >= 2.0 && theta < 3.0 )
308 if (!IsHistogramDisabled("dcaP23Mu*"))
310 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("dcaP23Mu%s",charge.Data()))->Fill(p.P(),dca);
315 if (!IsHistogramDisabled("dcaPwPtCut23Mu*"))
317 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("dcaPwPtCut23Mu%s",charge.Data()))->Fill(p.P(),dca);
321 else if ( theta >= 3.0 && theta < 10.0 )
323 if (!IsHistogramDisabled("dcaP310Mu*"))
325 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("dcaP310Mu%s",charge.Data()))->Fill(p.P(),dca);
329 if (!IsHistogramDisabled("dcaPwPtCut310Mu*"))
331 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("dcaPwPtCut310Mu%s",charge.Data()))->Fill(p.P(),dca);
337 //_____________________________________________________________________________
338 AliMuonTrackCuts* AliAnalysisMuMuSingle::MuonTrackCuts()
340 /// Get (and create the first time) our internal track cuts
343 fMuonTrackCuts = new AliMuonTrackCuts;
345 fMuonTrackCuts->SetAllowDefaultParams(kTRUE);
347 fMuonTrackCuts->SetFilterMask(AliMuonTrackCuts::kMuEta |
348 AliMuonTrackCuts::kMuThetaAbs |
349 AliMuonTrackCuts::kMuPdca |
350 AliMuonTrackCuts::kMuMatchApt |
351 AliMuonTrackCuts::kMuMatchLpt |
352 AliMuonTrackCuts::kMuMatchHpt |
353 AliMuonTrackCuts::kMuTrackChiSquare);
357 return fMuonTrackCuts;
360 //_____________________________________________________________________________
361 void AliAnalysisMuMuSingle::SetMuonTrackCuts(const AliMuonTrackCuts& trackCuts)
363 /// Set our muontrackcuts from external source
364 delete fMuonTrackCuts;
365 fMuonTrackCuts = static_cast<AliMuonTrackCuts*>(trackCuts.Clone());