]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG/muon/AliAnalysisMuMuSingle.cxx
expand particle map when needed
[u/mrichter/AliRoot.git] / PWG / muon / AliAnalysisMuMuSingle.cxx
CommitLineData
5376e016
CP
1#include "AliAnalysisMuMuSingle.h"
2
3/**
4 *
5 * \ingroup pwg-muon-mumu
6 *
7 * \class AliAnalysisMuMuSingle
8 *
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...
12 *
13 */
14
15
16#include "TH2F.h"
17#include "AliMuonTrackCuts.h"
18#include "AliAnalysisMuonUtility.h"
19#include "TMath.h"
20#include "AliLog.h"
21#include "AliVParticle.h"
22#include "TLorentzVector.h"
23#include "AliAnalysisMuMuCutCombination.h"
24#include "AliAnalysisMuMuCutRegistry.h"
25#include "AliMergeableCollection.h"
26
27ClassImp(AliAnalysisMuMuSingle)
28
29//_____________________________________________________________________________
30AliAnalysisMuMuSingle::AliAnalysisMuMuSingle()
31: AliAnalysisMuMuBase(),
32fMuonTrackCuts(0x0),
33fShouldSeparatePlusAndMinus(kFALSE),
34fAccEffHisto(0x0)
35{
36 /// ctor
37}
38
39//_____________________________________________________________________________
40AliAnalysisMuMuSingle::~AliAnalysisMuMuSingle()
41{
42 /// dtor
43 delete fMuonTrackCuts;
44 delete fAccEffHisto;
45}
46
47
48//_____________________________________________________________________________
49void
50AliAnalysisMuMuSingle::CreateTrackHisto(const char* eventSelection,
51 const char* triggerClassName,
52 const char* centrality,
53 const char* hname, const char* htitle,
54 Int_t nbinsx, Double_t xmin, Double_t xmax,
55 Int_t nbinsy, Double_t ymin, Double_t ymax,
56 Bool_t separatePlusAndMinus) const
57{
58 /// Append histograms for single track to our histogram collection
59
60 if ( IsHistogramDisabled(hname) ) return;
61
62 if ( separatePlusAndMinus )
63 {
64 const char* suffix[] = { "Plus", "Minus" };
65 const char* symbol[] = { "+", "-" };
66
67 for ( Int_t i = 0; i < 2; ++i )
68 {
69 TString shtitle(htitle);
70 TString shname(hname);
71
72 shtitle.ReplaceAll("#mu",Form("#mu^{%s}",symbol[i]));
73
74 shname += suffix[i];
75
76 CreateTrackHistos(eventSelection,triggerClassName,centrality,shname.Data(),shtitle.Data(),
77 nbinsx,xmin,xmax,nbinsy,ymin,ymax);
78 }
79 }
80 else
81 {
82 CreateTrackHistos(eventSelection,triggerClassName,centrality,hname,htitle,
83 nbinsx,xmin,xmax,nbinsy,ymin,ymax);
84 }
85}
86
87//_____________________________________________________________________________
88Bool_t AliAnalysisMuMuSingle::IsRabsOK(const AliVParticle& part) const
89{
90 Double_t thetaAbsEndDeg = AliAnalysisMuonUtility::GetThetaAbsDeg(&part);
91
92 return ( thetaAbsEndDeg > 2. && thetaAbsEndDeg < 10. );
93}
94
95//_____________________________________________________________________________
96Bool_t AliAnalysisMuMuSingle::IsEtaInRange(const AliVParticle& part, Double_t& etamin, Double_t& etamax) const
97{
98 return (part.Eta() >= etamin && part.Eta() <= etamax);
99}
100
101//_____________________________________________________________________________
102void AliAnalysisMuMuSingle::SetRun(const AliInputEventHandler* eventHandler)
103{
104 MuonTrackCuts()->SetRun(eventHandler);
105}
106
107//_____________________________________________________________________________
108Int_t AliAnalysisMuMuSingle::EAGetNumberOfMuonTracks() const
109{
110 // Get the number of muon tracks *that are not ghosts*
111
112 Int_t ntracks = AliAnalysisMuonUtility::GetNTracks(Event());
113
114 for ( Int_t i = 0; i < ntracks; ++i )
115 {
116 AliVParticle* track = AliAnalysisMuonUtility::GetTrack(i,Event());
117 if (AliAnalysisMuonUtility::IsMuonGhost(track)) --ntracks;
118 }
119
120 return ntracks;
121}
122
123////_____________________________________________________________________________
124//Int_t AliAnalysisMuMuSingle::EAGetNumberOfSelectMuonTracks() const
125//{
126// // Get the number of "very good" muon tracks :
127// // Rabs + DCA + pT > 1.5 Gev/C
128//
129// Int_t nTracks = AliAnalysisMuonUtility::GetNTracks(Event());
130//
131// UInt_t check = kAll | kMatched | kRabs | kDCA | kEta | kPt1dot5;
132//
133// Int_t nGood(0);
134//
135// for ( Int_t i = 0; i < nTracks; ++i )
136// {
137// ULong64_t m = GetTrackMask(i);
138// if ( ( m & check ) == check )
139// {
140// ++nGood;
141// }
142// }
143// return nGood;
144//}
145
146//_____________________________________________________________________________
147Double_t AliAnalysisMuMuSingle::EAGetTrackDCA(const AliVParticle& track) const
148{
149 // Get track DCA
150
151 Double_t xdca = AliAnalysisMuonUtility::GetXatDCA(&track);
152 Double_t ydca = AliAnalysisMuonUtility::GetYatDCA(&track);
153
154 return TMath::Sqrt(xdca*xdca+ydca*ydca);
155}
156
157//_____________________________________________________________________________
158void AliAnalysisMuMuSingle::DefineHistogramCollection(const char* eventSelection,
159 const char* triggerClassName,
160 const char* centrality)
161{
162 /// Actually create the histograms for phyics/triggerClassName
163
164 if ( Histo(eventSelection,triggerClassName,centrality,"AliAnalysisMuMuSingle") )
165 {
166 return;
167 }
168
169 AliAnalysisMuMuBase::EDataType dt = AliAnalysisMuMuBase::kHistoForData;
170
171 // dummy histogram to signal that we already defined all our histograms (see above)
172 CreateEventHistos(dt,eventSelection,triggerClassName,centrality,"AliAnalysisMuMuSingle","Dummy semaphore",1,0,1);
173
174 Double_t ptMin = 0;
175 Double_t ptMax = 12*3;
176 Int_t nbinsPt = GetNbins(ptMin,ptMax,0.5);
177 Double_t pMin = 0;
178 Double_t pMax = 100*3;
179 Int_t nbinsP = GetNbins(pMin,pMax,2.0);
180 Double_t etaMin = -5;
181 Double_t etaMax = -2;
182 Int_t nbinsEta = GetNbins(etaMin,etaMax,0.05);
183
184 Double_t rapidityMin = -5;
185 Double_t rapidityMax = -2;
186 Int_t nbinsRapidity = GetNbins(rapidityMin,rapidityMax,0.05);
187
188 Double_t phiMin = -TMath::Pi();
189 Double_t phiMax = TMath::Pi();
190 Int_t nbinsPhi = GetNbins(phiMin,phiMax,0.05);
191
192 CreateTrackHisto(eventSelection,triggerClassName,centrality,"Chi2MatchTrigger","Chi2 Match Trigger",72,0,72);
193
194 CreateTrackHisto(eventSelection,triggerClassName,centrality,"EtaRapidityMu", "Eta distribution vs Rapidity for #mu", nbinsRapidity,rapidityMin,rapidityMax,nbinsEta,etaMin,etaMax, fShouldSeparatePlusAndMinus);
195
196 CreateTrackHisto(eventSelection,triggerClassName,centrality,"PtEtaMu", "P_{T} distribution vs Eta for #mu", nbinsEta,etaMin,etaMax, nbinsPt,ptMin,ptMax,fShouldSeparatePlusAndMinus);
197
198 CreateTrackHisto(eventSelection,triggerClassName,centrality,"PtRapidityMu", "P_{T} distribution vs Rapidity for #mu", nbinsRapidity,rapidityMin,rapidityMax, nbinsPt,ptMin,ptMax,fShouldSeparatePlusAndMinus);
199
200 CreateTrackHisto(eventSelection,triggerClassName,centrality,"PtPhiMu", "P_{T} distribution vs phi for #mu", nbinsPhi,phiMin,phiMax, nbinsPt,ptMin,ptMax,fShouldSeparatePlusAndMinus);
201
202
203 CreateTrackHisto(eventSelection,triggerClassName,centrality,"PEtaMu", "P distribution for #mu",nbinsEta,etaMin,etaMax,nbinsP,pMin,pMax,fShouldSeparatePlusAndMinus);
204
205 Double_t chi2min = 0;
206 Double_t chi2max = 20;
207 Int_t nbinchi2 = GetNbins(chi2min,chi2max,0.05);
208
209 CreateTrackHisto(eventSelection, triggerClassName, centrality, "Chi2Mu", "chisquare per NDF #mu", nbinchi2, chi2min, chi2max,-1, 0.0, 0.0, fShouldSeparatePlusAndMinus);
210
211 Double_t xmin = 0;
212 Double_t xmax = 150;
213 Int_t nbins = GetNbins(xmin,xmax,2.0);
214
215 CreateTrackHisto(eventSelection,triggerClassName,centrality,"dcaP23Mu","#mu DCA vs P for 2-3 degrees;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax,fShouldSeparatePlusAndMinus);
216
217 CreateTrackHisto(eventSelection,triggerClassName,centrality,"dcaP310Mu","#mu DCA vs P for 3-10 degrees;P (GeV);DCA (cm)",nbinsP,pMin,pMax,nbins,xmin,xmax,fShouldSeparatePlusAndMinus);
218
219 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);
220
221 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);
222
223}
224
225//_____________________________________________________________________________
226void AliAnalysisMuMuSingle::FillHistosForTrack(const char* eventSelection,
227 const char* triggerClassName,
228 const char* centrality,
229 const char* trackCutName,
230 const AliVParticle& track)
231{
232 /// Fill histograms for one track
233
234 if (!AliAnalysisMuonUtility::IsMuonTrack(&track) ) return;
235
236 if ( HasMC() )
237 {
238 MuonTrackCuts()->SetIsMC();
239 }
240
241 TLorentzVector p(track.Px(),track.Py(),track.Pz(),
242 TMath::Sqrt(AliAnalysisMuonUtility::MuonMass2()+track.P()*track.P()));
243
244
245 TString charge("");
246
247 if ( ShouldSeparatePlusAndMinus() )
248 {
249 if ( track.Charge() < 0 )
250 {
251 charge = "Minus";
252 }
253 else
254 {
255 charge = "Plus";
256 }
257 }
258
259 Double_t dca = EAGetTrackDCA(track);
260
261 Double_t theta = AliAnalysisMuonUtility::GetThetaAbsDeg(&track);
262
263 if (!IsHistogramDisabled("Chi2MatchTrigger"))
264 {
265 Histo(eventSelection,triggerClassName,centrality,trackCutName,"Chi2MatchTrigger")->Fill(AliAnalysisMuonUtility::GetChi2MatchTrigger(&track));
266 }
267
268 if (!IsHistogramDisabled("EtaRapidityMu*"))
269 {
270 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("EtaRapidityMu%s",charge.Data()))->Fill(p.Rapidity(),p.Eta());
271 }
272
273 if (!IsHistogramDisabled("PtEtaMu*"))
274 {
275 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("PtEtaMu%s",charge.Data()))->Fill(p.Eta(),p.Pt());
276 }
277
278 if (!IsHistogramDisabled("PtRapidityMu*"))
279 {
280 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("PtRapidityMu%s",charge.Data()))->Fill(p.Rapidity(),p.Pt());
281 }
282
283 if (!IsHistogramDisabled("PEtaMu*"))
284 {
285 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("PEtaMu%s",charge.Data()))->Fill(p.Eta(),p.P());
286 }
287
288 if (!IsHistogramDisabled("PtPhiMu*"))
289 {
290 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("PtPhiMu%s",charge.Data()))->Fill(p.Phi(),p.Pt());
291 }
292
293 if (!IsHistogramDisabled("Chi2Mu*"))
294 {
295 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("Chi2Mu%s",charge.Data()))->Fill(AliAnalysisMuonUtility::GetChi2perNDFtracker(&track));
296 }
297
298 if ( theta >= 2.0 && theta < 3.0 )
299 {
300
301 if (!IsHistogramDisabled("dcaP23Mu*"))
302 {
303 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("dcaP23Mu%s",charge.Data()))->Fill(p.P(),dca);
304 }
305
306 if ( p.Pt() > 2 )
307 {
308 if (!IsHistogramDisabled("dcaPwPtCut23Mu*"))
309 {
310 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("dcaPwPtCut23Mu%s",charge.Data()))->Fill(p.P(),dca);
311 }
312 }
313 }
314 else if ( theta >= 3.0 && theta < 10.0 )
315 {
316 if (!IsHistogramDisabled("dcaP310Mu*"))
317 {
318 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("dcaP310Mu%s",charge.Data()))->Fill(p.P(),dca);
319 }
320 if ( p.Pt() > 2 )
321 {
322 if (!IsHistogramDisabled("dcaPwPtCut310Mu*"))
323 {
324 Histo(eventSelection,triggerClassName,centrality,trackCutName,Form("dcaPwPtCut310Mu%s",charge.Data()))->Fill(p.P(),dca);
325 }
326 }
327 }
328}
329
330//_____________________________________________________________________________
331AliMuonTrackCuts* AliAnalysisMuMuSingle::MuonTrackCuts()
332{
333 /// Get (and create the first time) our internal track cuts
334 if (!fMuonTrackCuts)
335 {
336 fMuonTrackCuts = new AliMuonTrackCuts;
337
338 fMuonTrackCuts->SetAllowDefaultParams(kTRUE);
339
340 fMuonTrackCuts->SetFilterMask(AliMuonTrackCuts::kMuEta |
341 AliMuonTrackCuts::kMuThetaAbs |
342 AliMuonTrackCuts::kMuPdca |
343 AliMuonTrackCuts::kMuMatchApt |
344 AliMuonTrackCuts::kMuMatchLpt |
345 AliMuonTrackCuts::kMuMatchHpt |
346 AliMuonTrackCuts::kMuTrackChiSquare);
347
348 }
349
350 return fMuonTrackCuts;
351}
352
353//_____________________________________________________________________________
354void AliAnalysisMuMuSingle::SetMuonTrackCuts(const AliMuonTrackCuts& trackCuts)
355{
356 /// Set our muontrackcuts from external source
357 delete fMuonTrackCuts;
358 fMuonTrackCuts = static_cast<AliMuonTrackCuts*>(trackCuts.Clone());
359}