Make sure that histograms are obtained from output list in
[u/mrichter/AliRoot.git] / PWG2 / FORWARD / analysis2 / AliForwardUtil.cxx
1 #include "AliForwardUtil.h"
2 #include <AliAnalysisManager.h>
3 #include "AliAODForwardMult.h"
4 #include <AliLog.h>
5 #include <AliInputEventHandler.h>
6 #include <AliESDEvent.h>
7 #include <AliPhysicsSelection.h>
8 #include <AliTriggerAnalysis.h>
9 #include <AliMultiplicity.h>
10 #include <TH2D.h>
11 #include <TH1I.h>
12 #include <TMath.h>
13
14 //====================================================================
15 AliForwardUtil::Histos::~Histos()
16 {
17   if (fFMD1i) delete fFMD1i;
18   if (fFMD2i) delete fFMD2i;
19   if (fFMD2o) delete fFMD2o;
20   if (fFMD3i) delete fFMD3i;
21   if (fFMD3o) delete fFMD3o;
22 }
23
24 //____________________________________________________________________
25 TH2D*
26 AliForwardUtil::Histos::Make(UShort_t d, Char_t r, 
27                              const TAxis& etaAxis) const
28 {
29   Int_t ns = (r == 'I' || r == 'i') ? 20 : 40;
30   TH2D* hist = new TH2D(Form("FMD%d%c_cache", d, r), 
31                         Form("FMD%d%c cache", d, r),
32                         etaAxis.GetNbins(), etaAxis.GetXmin(), 
33                         etaAxis.GetXmax(), ns, 0, 2*TMath::Pi());
34   hist->SetXTitle("#eta");
35   hist->SetYTitle("#phi [radians]");
36   hist->SetZTitle("d^{2}N_{ch}/d#etad#phi");
37   hist->Sumw2();
38   hist->SetDirectory(0);
39
40   return hist;
41 }
42 //____________________________________________________________________
43 void
44 AliForwardUtil::Histos::Init(const TAxis& etaAxis)
45 {
46   fFMD1i = Make(1, 'I', etaAxis);
47   fFMD2i = Make(2, 'I', etaAxis);
48   fFMD2o = Make(2, 'O', etaAxis);
49   fFMD3i = Make(3, 'I', etaAxis);
50   fFMD3o = Make(3, 'O', etaAxis);
51 }
52 //____________________________________________________________________
53 void
54 AliForwardUtil::Histos::Clear(Option_t* option)
55 {
56   fFMD1i->Reset(option);
57   fFMD2i->Reset(option);
58   fFMD2o->Reset(option);
59   fFMD3i->Reset(option);
60   fFMD3o->Reset(option);
61 }
62
63 //____________________________________________________________________
64 TH2D*
65 AliForwardUtil::Histos::Get(UShort_t d, Char_t r) const
66 {
67   switch (d) { 
68   case 1: return fFMD1i;
69   case 2: return (r == 'I' || r == 'i' ? fFMD2i : fFMD2o);
70   case 3: return (r == 'I' || r == 'i' ? fFMD3i : fFMD3o);
71   }
72   return 0;
73 }
74 #if 0
75 //____________________________________________________________________
76 TH2D*
77 AliForwardUtil::Histos::Get(UShort_t d, Char_t r)
78 {
79   switch (d) { 
80   case 1: return fFMD1i;
81   case 2: return (r == 'I' || r == 'i' ? fFMD2i : fFMD2o);
82   case 3: return (r == 'I' || r == 'i' ? fFMD3i : fFMD3o);
83   }
84   default: return 0;
85 }
86 #endif
87 //====================================================================
88 TList*
89 AliForwardUtil::RingHistos::DefineOutputList(TList* d) const
90 {
91   if (!d) return 0;
92   TList* list = new TList;
93   list->SetName(fName.Data());
94   d->Add(list);
95   return list;
96 }
97 //____________________________________________________________________
98 TList*
99 AliForwardUtil::RingHistos::GetOutputList(TList* d) const
100 {
101   if (!d) return 0;
102   TList* list = static_cast<TList*>(d->FindObject(fName.Data()));
103   return list;
104 }
105
106 //____________________________________________________________________
107 TH1*
108 AliForwardUtil::RingHistos::GetOutputHist(TList* d, const char* name) const
109 {
110   return static_cast<TH1*>(d->FindObject(name));
111 }
112
113 //====================================================================
114 Bool_t
115 AliForwardUtil::ReadTriggers(AliESDEvent* esd, UInt_t& triggers,
116                              TH1I* hTriggers)
117 {
118   triggers = 0;
119
120   // Get the analysis manager - should always be there 
121   AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
122   if (!am) { 
123     AliWarningGeneral("ReadTriggers","No analysis manager defined!");
124     return kFALSE;
125   }
126
127   // Get the input handler - should always be there 
128   AliInputEventHandler* ih = 
129     static_cast<AliInputEventHandler*>(am->GetInputEventHandler());
130   if (!ih) { 
131     AliWarningGeneral("ReadTriggers","No input handler");
132     return kFALSE;
133   }
134   
135   // Get the physics selection - add that by using the macro 
136   // AddTaskPhysicsSelection.C 
137   AliPhysicsSelection* ps = 
138     static_cast<AliPhysicsSelection*>(ih->GetEventSelection());
139   if (!ps) { 
140     AliWarningGeneral("ReadTriggers","No physics selection");
141     return kFALSE;
142   }
143   
144   // Check if this is a collision candidate (INEL)
145   Bool_t inel = ps->IsCollisionCandidate(esd);
146   if (inel) { 
147     triggers |= AliAODForwardMult::kInel;
148     hTriggers->Fill(0.5);
149   }
150
151   // IF this is inel, see if we have a tracklet 
152   if (inel) { 
153     const AliMultiplicity* spdmult = esd->GetMultiplicity();
154     if (!spdmult) {
155       AliWarningGeneral("ReadTriggers","No SPD multiplicity");
156     }
157     else { 
158       Int_t n = spdmult->GetNumberOfTracklets();
159       for (Int_t j = 0; j < n; j++) { 
160         if(TMath::Abs(spdmult->GetEta(j)) < 1) { 
161           triggers |= AliAODForwardMult::kInelGt0;
162           hTriggers->Fill(1.5);
163           break;
164         }
165       }
166     }
167   }
168
169   // Analyse some trigger stuff 
170   AliTriggerAnalysis ta;
171   if (ta.IsOfflineTriggerFired(esd, AliTriggerAnalysis::kNSD1)) {
172     triggers |= AliAODForwardMult::kNSD;
173     hTriggers->Fill(2.5);
174   }
175
176   // Get trigger stuff 
177   TString trigStr = esd->GetFiredTriggerClasses();
178   if (trigStr.Contains("CBEAMB-ABCE-NOPF-ALL")) {
179     triggers |= AliAODForwardMult::kEmpty;
180     hTriggers->Fill(3.5);
181   }
182
183   if (trigStr.Contains("CINT1A-ABCE-NOPF-ALL")) {
184     triggers |= AliAODForwardMult::kA;
185     hTriggers->Fill(4.5);
186   }
187
188   if (trigStr.Contains("CINT1B-ABCE-NOPF-ALL")) {
189     triggers |= AliAODForwardMult::kB;
190     hTriggers->Fill(5.5);
191   }
192
193
194   if (trigStr.Contains("CINT1C-ABCE-NOPF-ALL")) {
195     triggers |= AliAODForwardMult::kC;
196     hTriggers->Fill(6.5);
197   }
198
199   if (trigStr.Contains("CINT1-E-NOPF-ALL")) {
200     triggers |= AliAODForwardMult::kE;
201     hTriggers->Fill(7.5);
202   }
203
204   return kTRUE;
205 }
206 //____________________________________________________________________
207 Bool_t
208 AliForwardUtil::ReadVertex(AliESDEvent* esd, Double_t& vz, Double_t maxErr)
209 {
210   // Get the vertex 
211   const AliESDVertex* vertex = esd->GetPrimaryVertexSPD();
212   if (!vertex) { 
213 #ifdef VERBOSE
214     AliWarningGeneral("ReadVertex","No SPD vertex found in ESD");
215 #endif
216     return kFALSE;
217   }
218
219   // Check that enough tracklets contributed 
220   if(vertex->GetNContributors() <= 0) {
221 #ifdef VERBOSE
222     AliWarningGeneral("ReadVertex",
223                       Form("Number of contributors to vertex is %d<=0",
224                            vertex->GetNContributors()));
225 #endif
226     return kFALSE;
227   }
228
229   // Check that the uncertainty isn't too large 
230   if (vertex->GetZRes() > maxErr) { 
231 #ifdef VERBOSE
232     AliWarningGeneral("ReadVertex",
233                       Form("Uncertaintity in Z of vertex is too large %f > %d", 
234                            vertex->GetZRes(), maxErr));
235 #endif
236     return kFALSE;
237   }
238
239   // Get the z coordiante 
240   vz = vertex->GetZ();
241                
242   return kTRUE;
243 }
244
245 //
246 // EOF
247 //