]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG/muon/AliAnalysisMuMuGlobal.cxx
Merge branch 'TPCdev' of https://git.cern.ch/reps/AliRoot into TPCdev
[u/mrichter/AliRoot.git] / PWG / muon / AliAnalysisMuMuGlobal.cxx
1 #include "AliAnalysisMuMuGlobal.h"
2
3 /**
4  * \ingroup pwg-muon-mumu
5  *
6  * \class AliAnalysisMuMuGlobal
7  *
8  * Very simple histogramming analysis for global event properties, like vertex, bunch-crossing,
9  * background, etc...
10  *
11  * Warning : not really ready for prime-time
12  *
13  */
14
15 #include "TH1.h"
16 #include "AliVVertex.h"
17 #include "AliVEvent.h"
18 #include "AliAODEvent.h"
19 #include "AliAnalysisMuonUtility.h"
20 #include "AliAODTZERO.h"
21 #include "AliESDEvent.h"
22 #include "AliAnalysisMuMuBinning.h"
23 #include <set>
24 #include "AliMergeableCollection.h"
25 #include "AliAnalysisMuonUtility.h"
26 #include "AliESDUtils.h"
27
28 ClassImp(AliAnalysisMuMuGlobal)
29
30 //_____________________________________________________________________________
31 AliAnalysisMuMuGlobal::AliAnalysisMuMuGlobal() : AliAnalysisMuMuBase()
32 {
33   /// ctor
34 }
35
36 //_____________________________________________________________________________
37 Bool_t AliAnalysisMuMuGlobal::SelectAnyTriggerClass(const TString& firedTriggerClasses, TString& acceptedTriggerClasses) const
38 {
39   if ( firedTriggerClasses.Length()>0)
40   {
41     acceptedTriggerClasses = "NOTRIGGERSELECTION";
42     return kTRUE;
43   }
44   return kFALSE;
45 }
46
47 //_____________________________________________________________________________
48 void AliAnalysisMuMuGlobal::FillHistosForEvent(const char* eventSelection,
49                                                const char* triggerClassName,
50                                                const char* centrality)
51 {
52   // Fill event-wise histograms
53   
54   if (!IsHistogramDisabled("BCX"))
55   {
56     Histo(eventSelection,triggerClassName,centrality,"BCX")->Fill(1.0*Event()->GetBunchCrossNumber());
57   }
58   if (!IsHistogramDisabled("Nevents"))
59   {
60     Histo(eventSelection,triggerClassName,centrality,"Nevents")->Fill(1.0);
61   }
62   
63   if (!IsHistogramDisabled("EventsWOL0inputs"))
64   {
65     UInt_t l0 = AliAnalysisMuonUtility::GetL0TriggerInputs(Event());
66     
67     if ( l0 == 0 ) Histo(eventSelection,triggerClassName,centrality,"EventsWOL0inputs")->Fill(1.);
68   }
69   
70   const AliVVertex* vertex = Event()->GetPrimaryVertex();
71   const AliVVertex* vertexFromSPD = AliAnalysisMuonUtility::GetVertexSPD(Event());
72   
73   if ( vertex )
74   {
75     if ( vertex->GetNContributors() > 0 )
76     {
77       if (!IsHistogramDisabled("Xvertex"))
78       {
79         Histo(eventSelection,triggerClassName,centrality,"Xvertex")->Fill(vertex->GetX());
80       }
81       if (!IsHistogramDisabled("Yvertex"))
82       {
83         Histo(eventSelection,triggerClassName,centrality,"Yvertex")->Fill(vertex->GetY());
84       }
85       if (!IsHistogramDisabled("Zvertex"))
86       {
87         Histo(eventSelection,triggerClassName,centrality,"Zvertex")->Fill(vertex->GetZ());
88       }
89       if ( vertexFromSPD )
90       {
91         if (!IsHistogramDisabled("ZvertexMinusZvertexSPD"))
92         {
93           Histo(eventSelection,triggerClassName,centrality,"ZvertexMinusZvertexSPD")->Fill(vertexFromSPD->GetZ()-vertex->GetZ());
94         }
95         if (!IsHistogramDisabled("SPDXvertex"))
96         {
97           Histo(eventSelection,triggerClassName,centrality,"SPDXvertex")->Fill(vertexFromSPD->GetX());
98         }
99         if (!IsHistogramDisabled("SPDYvertex"))
100         {
101           Histo(eventSelection,triggerClassName,centrality,"SPDYvertex")->Fill(vertexFromSPD->GetY());
102         }
103         if (!IsHistogramDisabled("SPDZvertex"))
104         {
105           Histo(eventSelection,triggerClassName,centrality,"SPDZvertex")->Fill(vertexFromSPD->GetZ());
106         }
107         if (!IsHistogramDisabled("SPDZvertexNContributors"))
108         {
109           Histo(eventSelection,triggerClassName,centrality,"SPDZvertexNContributors")->Fill(vertexFromSPD->GetNContributors());
110         }
111         if (!IsHistogramDisabled("ZvertexMinusSPDZvertexNContributors"))
112         {
113           Histo(eventSelection,triggerClassName,centrality,"ZvertexMinusSPDZvertexNContributors")->Fill(vertexFromSPD->GetNContributors(),vertex->GetZ() - vertexFromSPD->GetZ());
114         }
115         if (!IsHistogramDisabled("SPDZvertexResolutionNContributors"))
116         {
117           Double_t cov[6]={0};
118           static_cast<const AliAODVertex*>(vertexFromSPD)->GetCovarianceMatrix(cov);
119           
120           Histo(eventSelection,triggerClassName,centrality,"SPDZvertexResolutionNContributors")->Fill(vertexFromSPD->GetNContributors(),TMath::Sqrt(cov[5]));
121         }
122
123       }
124       if (!IsHistogramDisabled("VertexType"))
125       {
126         Histo(eventSelection,triggerClassName,centrality,"VertexType")->Fill(vertex->GetTitle(),1.0);
127       }
128       if (!IsHistogramDisabled("VertexClass"))
129       {
130         Histo(eventSelection,triggerClassName,centrality,"VertexClass")->Fill(static_cast<const AliAODVertex*>(vertex)->GetType(),1.0);
131       }
132     }
133     if (!IsHistogramDisabled("ZvertexNContributors"))
134     {
135       Histo(eventSelection,triggerClassName,centrality,"ZvertexNContributors")->Fill(vertex->GetNContributors());
136     }
137   }
138   
139   if ( AliAnalysisMuonUtility::IsAODEvent(Event()) )
140   {
141     const AliAODTZERO* tzero = static_cast<const AliAODEvent*>(Event())->GetTZEROData();
142     
143     if (tzero && !IsHistogramDisabled("T0Zvertex"))
144     {
145       Histo(eventSelection,triggerClassName,centrality,"T0Zvertex")->Fill(tzero->GetT0VertexRaw());
146     }
147   }
148   else
149   {
150     const AliESDTZERO* tzero = static_cast<const AliESDEvent*>(Event())->GetESDTZERO();
151     
152     if (tzero && !IsHistogramDisabled("T0Zvertex"))
153     {
154       Histo(eventSelection,triggerClassName,centrality,"T0Zvertex")->Fill(tzero->GetT0zVertex());
155     }
156   }
157   
158   AliVVZERO* vzero = Event()->GetVZEROData();
159   
160   if (vzero)
161   {
162     Float_t v0a = vzero->GetV0ATime();
163     Float_t v0c = vzero->GetV0CTime();
164     
165     Float_t x = v0a-v0c;
166     Float_t y = v0a+v0c;
167     
168     if( vertexFromSPD )
169     {
170       Float_t multV0A = vzero->GetMTotV0A();
171       Float_t multV0C = vzero->GetMTotV0C();
172       Float_t multV0 = multV0A + multV0C; //Corrected V0 tot mult?
173       
174       Float_t v0aMult = AliESDUtils::GetCorrV0A(multV0A,vertexFromSPD->GetZ());
175       Float_t v0cMult = AliESDUtils::GetCorrV0C(multV0C,vertexFromSPD->GetZ());
176     
177       if (!IsHistogramDisabled("V0AMult"))
178       {
179         Histo(eventSelection,triggerClassName,centrality,"V0AMult")->Fill(v0aMult);
180       }
181       if (!IsHistogramDisabled("V0CMult"))
182       {
183         Histo(eventSelection,triggerClassName,centrality,"V0CMult")->Fill(v0cMult);
184       }
185       if (!IsHistogramDisabled("V0Mult"))
186       {
187         Histo(eventSelection,triggerClassName,centrality,"V0Mult")->Fill(multV0);
188       }
189     }
190     
191     
192     if (!IsHistogramDisabled("V02D"))
193     {
194       Histo(eventSelection,triggerClassName,centrality,"V02D")->Fill(x,y);
195     }
196     
197     Bool_t background,pileup,satellite;
198     
199     Bool_t tzero = AliAnalysisMuonUtility::EAGetTZEROFlags(Event(),background,pileup,satellite);
200     
201     if (tzero)
202     {
203       if ( background )
204       {
205         if (!IsHistogramDisabled("V02DwT0BG"))
206         {
207           Histo(eventSelection,triggerClassName,centrality,"V02DwT0BG")->Fill(x,y);
208         }
209       }
210       
211       if ( pileup )
212       {
213         if (!IsHistogramDisabled("V02DwT0PU"))
214         {
215           Histo(eventSelection,triggerClassName,centrality,"V02DwT0PU")->Fill(x,y);
216         }
217         
218         if ( !IsHistogramDisabled("PileUpEstimators") )
219         {
220           Histo(eventSelection,triggerClassName,centrality,"PileUpEstimators")->Fill("TZERO",1.0);
221         }
222       }
223       
224       if ( satellite )
225       {
226         if (!IsHistogramDisabled("V02DwT0SAT"))
227         {
228           Histo(eventSelection,triggerClassName,centrality,"V02DwT0SAT")->Fill(x,y);
229         }
230       }
231       
232       if ( !background && !pileup && !satellite )
233       {
234         if (!IsHistogramDisabled("V02DwT0BB"))
235         {
236           Histo(eventSelection,triggerClassName,centrality,"V02DwT0BB")->Fill(x,y);
237         }
238       }
239     }
240   }
241   
242   //  /* FIXME : how to properly get multiplicity from AOD and ESD consistently ?
243   //   is is doable at all ?
244   
245   TH1* hpileup = Histo(eventSelection,triggerClassName,centrality,"PileUpEstimators");
246   
247   
248   //  virtual Bool_t  IsPileupFromSPD(Int_t minContributors=3, Double_t minZdist=0.8, Double_t nSigmaZdist=3., Double_t nSigmaDiamXY=2., Double_t nSigmaDiamZ=5.) const;
249   
250   const Double_t nSigmaZdist=3.0;
251   const Double_t nSigmaDiamXY=2.0;
252   const Double_t nSigmaDiamZ=5.0;
253   
254   for ( Int_t minContributors = 3; minContributors <= 6; ++minContributors )
255   {
256     for ( double minZdist = 0.6; minZdist <= 0.8; minZdist += 0.2 )
257     {
258       if ( Event()->IsPileupFromSPD(minContributors,minZdist,nSigmaZdist,nSigmaDiamXY,nSigmaDiamZ) )
259       {
260         hpileup->Fill(Form("SPD:n%dd%d",minContributors,static_cast<Int_t>(10*minZdist)),1);
261       }
262     }
263   }
264   
265   
266 }
267
268 //_____________________________________________________________________________
269 void AliAnalysisMuMuGlobal::FillHistosForMCEvent(const char* eventSelection,
270                                                  const char* triggerClassName,
271                                                  const char* centrality)
272 {
273   // Fill MCEvent-wise histograms
274   
275   Double_t Zvertex = AliAnalysisMuonUtility::GetMCVertexZ(Event(),MCEvent());
276   
277   if (!IsHistogramDisabled("Zvertex"))
278   {
279     MCHisto(eventSelection,triggerClassName,centrality,"Zvertex")->Fill(Zvertex);
280   }
281
282   if (!IsHistogramDisabled("RecZvertexVsMCZvertex"))
283   {
284     const AliVVertex* vertex = Event()->GetPrimaryVertex();
285     if  (vertex && vertex->GetNContributors()>0)
286     {
287       MCHisto(eventSelection,triggerClassName,centrality,"RecZvertexVsMCZvertex")->Fill(Zvertex,vertex->GetZ());
288     }
289     
290     const AliVVertex* vertexFromSPD = AliAnalysisMuonUtility::GetVertexSPD(Event());
291     if  (vertexFromSPD && vertexFromSPD->GetNContributors()>0)
292     {
293       MCHisto(eventSelection,triggerClassName,centrality,"RecSPDZvertexVsMCZvertex")->Fill(Zvertex,vertexFromSPD->GetZ());
294       MCHisto(eventSelection,triggerClassName,centrality,"NofEvWSPDZvertexVsMCZvertex")->Fill(Zvertex,1);
295     }
296     else MCHisto(eventSelection,triggerClassName,centrality,"NofEvWOSPDZvertexVsMCZvertex")->Fill(Zvertex,1);
297   }
298   
299 }
300
301 //_____________________________________________________________________________
302 void AliAnalysisMuMuGlobal::DefineHistogramCollection(const char* eventSelection,
303                                                       const char* triggerClassName,
304                                                       const char* centrality)
305 {
306   /// Actually create the histograms for phyics/triggerClassName
307   
308 //  AliInfo(Form("%s %s %s %d",eventSelection,triggerClassName,centrality,hasMC));
309   
310   if (HistogramCollection()->Histo(Form("/%s/%s/%s/Zvertex",eventSelection,triggerClassName,centrality)))
311   {
312     return;
313   }
314
315   Double_t xmin = -40;
316   Double_t xmax = +40;
317   Int_t nbins = GetNbins(xmin,xmax,0.5);
318   
319   CreateEventHistos(kHistoForData | kHistoForMCInput,eventSelection,triggerClassName,centrality,"Zvertex","z vertex",nbins,xmin,xmax);
320   
321   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"SPDZvertex","SPD z vertex",nbins,xmin,xmax);
322   
323   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"T0Zvertex","T0 zvertex",nbins,xmin,xmax);
324   
325   CreateEventHistos(kHistoForMCInput,eventSelection,triggerClassName,centrality,
326                     "RecZvertexVsMCZvertex","Reconstructed vertex (w/ Ncontrib>=1) vs MC vertex",nbins,xmin,xmax,nbins,xmin,xmax);
327   CreateEventHistos(kHistoForMCInput,eventSelection,triggerClassName,centrality,
328                     "RecSPDZvertexVsMCZvertex","Reconstructed SPD vertex (w/ Ncontrib>=1) vs MC vertex",nbins,xmin,xmax,nbins,xmin,xmax);
329   CreateEventHistos(kHistoForMCInput,eventSelection,triggerClassName,centrality,
330                     "NofEvWSPDZvertexVsMCZvertex","Number of events with SPD vertex (w/ Ncontrib>=1) vs MC vertex",nbins,xmin,xmax);
331   CreateEventHistos(kHistoForMCInput,eventSelection,triggerClassName,centrality,
332                     "NofEvWOSPDZvertexVsMCZvertex","Number of events with SPD vertex (w/ Ncontrib>=1) vs MC vertex",nbins,xmin,xmax);
333   
334
335   xmin = -5;
336   xmax = 5;
337   nbins = GetNbins(xmin,xmax,0.01);
338   
339   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"ZvertexMinusZvertexSPD","Primary vertex z - SPD vertex",nbins,xmin,xmax);
340   
341   xmin = -1;
342   xmax = 50;
343   nbins = GetNbins(xmin,xmax,1);
344   
345   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"ZvertexNContributors","z vertex vs nof contributors",nbins,xmin,xmax);
346   
347   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"SPDZvertexNContributors","SPD z vertex vs nof contributors",nbins,xmin,xmax);
348   
349   Double_t ymin = -10;
350   Double_t ymax = 10;
351   Int_t nbinsy = GetNbins(ymin,ymax,0.01);
352   
353   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"ZvertexMinusSPDZvertexNContributors","Primary vertex z - SPD vertex vs nof contributors",nbins,xmin,xmax,nbinsy,ymin,ymax);
354   
355   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"SPDZvertexResolutionNContributors","SPD vertex resolution vs nof contributors",nbins,xmin,xmax,nbinsy,ymin,ymax);
356   
357   xmin = -2;
358   xmax = 2;
359   nbins = GetNbins(xmin,xmax,0.01);
360   
361   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"Xvertex","x vertex",nbins,xmin,xmax);
362   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"Yvertex","y vertex",nbins,xmin,xmax);
363   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"SPDXvertex","SPD x vertex",nbins,xmin,xmax);
364   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"SPDYvertex","SPD y vertex",nbins,xmin,xmax);
365   
366   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"Nevents","number of events",2,-0.5,1.5);
367    CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"EventsWOL0inputs","number of events w/o L0 inputs",2,-0.5,1.5);
368   
369   CreateEventHistos(kHistoForMCInput | kHistoForData,eventSelection,triggerClassName,centrality,
370                     "VertexType","Type of vertexer used",10,0,10);
371   
372   CreateEventHistos(kHistoForMCInput | kHistoForData,eventSelection,triggerClassName,centrality,
373                     "VertexClass","Type of vertex used",10,0,10);
374
375
376   xmin = 0;
377   xmax = 3564;
378   nbins = GetNbins(xmin,xmax,1.0);
379   
380   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"BCX","bunch-crossing ids",nbins,xmin-0.5,xmax-0.5);
381   
382   
383   xmin = -30;
384   xmax = +30;
385   nbins = GetNbins(xmin,xmax,0.1);
386   
387   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"V02D","V0C+V0A versus V0A-V0C;Time V0A - V0C (ns);Time V0A+V0C (ns)",nbins,xmin,xmax,nbins,xmin,xmax);
388   
389   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"V02DwT0BB","V0C+V0A versus V0A-V0C with T0 BB;Time V0A - V0C (ns);Time V0A+V0C (ns)",nbins,xmin,xmax,nbins,xmin,xmax);
390   
391   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"V02DwT0BG","V0C+V0A versus V0A-V0C with T0 background flag on;Time V0A - V0C (ns);Time V0A+V0C (ns)",nbins,xmin,xmax,nbins,xmin,xmax);
392   
393   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"V02DwT0PU","V0C+V0A versus V0A-V0C with T0 pile up flag on;Time V0A - V0C (ns);Time V0A+V0C (ns)",nbins,xmin,xmax,nbins,xmin,xmax);
394   
395   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"V02DwT0SAT","V0C+V0A versus V0A-V0C with T0 satellite flag on;Time V0A - V0C (ns);Time V0A+V0C (ns)",nbins,xmin,xmax,nbins,xmin,xmax);
396   
397   xmin = 0;
398   xmax = 600;
399   nbins = GetNbins(xmin,xmax,1);
400   
401   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"V0AMult","V0A multiplicity;V0A mult;N_{events}",nbins,xmin,xmax);
402   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"V0CMult","V0C multiplicity;V0C mult;N_{events}",nbins,xmin,xmax);
403   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"V0Mult","V0 multiplicity;V0 mult;N_{events}",nbins,xmin,xmax);
404   
405   if ( !IsHistogramDisabled("Centrality") )
406   {
407     TObjArray* centralities = Binning()->CreateBinObjArray("centrality");
408     TIter next(centralities);
409     AliAnalysisMuMuBinning::Range* r;
410     std::set<std::string> estimators;
411     
412     while ( ( r = static_cast<AliAnalysisMuMuBinning::Range*>(next())) )
413     {
414       estimators.insert(r->Quantity().Data());
415     }
416     
417     std::set<std::string>::const_iterator it;
418     
419     for ( it = estimators.begin(); it != estimators.end(); ++it )
420     {
421       TH1* h = new TH1F("Centrality","Centrality",12,-10,110);
422       HistogramCollection()->Adopt(Form("/%s/%s/%s",eventSelection,triggerClassName,it->c_str()),h);
423     }
424     
425     delete centralities;
426   }
427   
428   CreateEventHistos(kHistoForData,eventSelection,triggerClassName,centrality,"PileUpEstimators","pile up estimators",10,0,10);
429 }
430