]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/FORWARD/analysis2/AliForwardMultiplicityTask.cxx
Adding signal histograms per ring per vertex bin
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / analysis2 / AliForwardMultiplicityTask.cxx
1 // 
2 // Calculate the multiplicity in the forward regions event-by-event 
3 // 
4 // Inputs: 
5 //   - AliESDEvent 
6 //
7 // Outputs: 
8 //   - AliAODForwardMult 
9 // 
10 // Histograms 
11 //   
12 // Corrections used 
13 //
14 #include "AliForwardMultiplicityTask.h"
15 #include "AliTriggerAnalysis.h"
16 #include "AliPhysicsSelection.h"
17 #include "AliLog.h"
18 #include "AliESDEvent.h"
19 #include "AliAODHandler.h"
20 #include "AliMultiplicity.h"
21 #include "AliInputEventHandler.h"
22 #include "AliForwardCorrectionManager.h"
23 #include "AliAnalysisManager.h"
24 #include <TH1.h>
25 #include <TH3D.h>
26 #include <TDirectory.h>
27 #include <TTree.h>
28 #include <TROOT.h>
29
30
31 //====================================================================
32 AliForwardMultiplicityTask::AliForwardMultiplicityTask()
33   : AliForwardMultiplicityBase(),
34     fHData(0),
35     fESDFMD(),
36     fHistos(),
37     fAODFMD(),
38     fAODEP(),
39     fRingSums(),
40     fEventInspector(),
41     fSharingFilter(),
42     fDensityCalculator(),
43     fCorrections(),
44     fHistCollector(),
45     fEventPlaneFinder(),
46     fFMD1icent(0),
47     fFMD2icent(0),
48     fFMD2ocent(0),
49     fFMD3icent(0),
50     fFMD3ocent(0),
51     fList(0),   
52     fListVertexBins(0)
53
54 {
55   // 
56   // Constructor
57   //
58   DGUARD(fDebug, 3,"Default CTOR of AliForwardMultiplicityTask");
59 }
60
61 //____________________________________________________________________
62 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const char* name)
63   : AliForwardMultiplicityBase(name),
64     fHData(0),
65     fESDFMD(),
66     fHistos(),
67     fAODFMD(false),
68     fAODEP(false),
69     fRingSums(),
70     fEventInspector("event"),
71     fSharingFilter("sharing"), 
72     fDensityCalculator("density"),
73     fCorrections("corrections"),
74     fHistCollector("collector"),
75     fEventPlaneFinder("eventplane"),
76     fFMD1icent(0),
77     fFMD2icent(0),
78     fFMD2ocent(0),
79     fFMD3icent(0),
80     fFMD3ocent(0),
81     fList(0),
82     fListVertexBins(0)  
83
84
85 {
86   // 
87   // Constructor 
88   // 
89   // Parameters:
90   //    name Name of task 
91   //
92   DGUARD(fDebug, 3,"named CTOR of AliForwardMultiplicityTask: %s", name);
93   DefineOutput(1, TList::Class());
94   DefineOutput(2, TList::Class());
95 }
96
97 //____________________________________________________________________
98 AliForwardMultiplicityTask::AliForwardMultiplicityTask(const AliForwardMultiplicityTask& o)
99   : AliForwardMultiplicityBase(o),
100     fHData(o.fHData),
101     fESDFMD(o.fESDFMD),
102     fHistos(o.fHistos),
103     fAODFMD(o.fAODFMD),
104     fAODEP(o.fAODEP),
105     fRingSums(o.fRingSums),
106     fEventInspector(o.fEventInspector),
107     fSharingFilter(o.fSharingFilter),
108     fDensityCalculator(o.fDensityCalculator),
109     fCorrections(o.fCorrections),
110     fHistCollector(o.fHistCollector),
111     fEventPlaneFinder(o.fEventPlaneFinder),
112      fFMD1icent(o.fFMD1icent),
113     fFMD2icent(o.fFMD2icent),
114     fFMD2ocent(o.fFMD2ocent),
115     fFMD3icent(o.fFMD3icent),
116     fFMD3ocent(o.fFMD3ocent),
117     fList(o.fList),
118     fListVertexBins(o.fListVertexBins)  
119
120 {
121   // 
122   // Copy constructor 
123   // 
124   // Parameters:
125   //    o Object to copy from 
126   //
127   DGUARD(fDebug, 3,"Copy CTOR of AliForwardMultiplicityTask");
128   DefineOutput(1, TList::Class());
129   DefineOutput(2, TList::Class());
130 }
131
132 //____________________________________________________________________
133 AliForwardMultiplicityTask&
134 AliForwardMultiplicityTask::operator=(const AliForwardMultiplicityTask& o)
135 {
136   // 
137   // Assignment operator 
138   // 
139   // Parameters:
140   //    o Object to assign from 
141   // 
142   // Return:
143   //    Reference to this object 
144   //
145   DGUARD(fDebug,3,"Assignment to AliForwardMultiplicityTask");
146   if (&o == this) return *this;
147   AliForwardMultiplicityBase::operator=(o);
148
149   fHData             = o.fHData;
150   fEventInspector    = o.fEventInspector;
151   fSharingFilter     = o.fSharingFilter;
152   fDensityCalculator = o.fDensityCalculator;
153   fCorrections       = o.fCorrections;
154   fHistCollector     = o.fHistCollector;
155   fEventPlaneFinder  = o.fEventPlaneFinder;
156   fHistos            = o.fHistos;
157   fAODFMD            = o.fAODFMD;
158   fAODEP             = o.fAODEP;
159   fRingSums          = o.fRingSums;
160   fFMD1icent         = o.fFMD1icent;
161   fFMD2icent         = o.fFMD2icent;
162   fFMD2ocent         = o.fFMD2ocent;
163   fFMD3icent         = o.fFMD3icent;
164   fFMD3ocent         = o.fFMD3ocent;
165   fList              = o.fList;
166   fListVertexBins    =o.fListVertexBins;
167   
168   return *this;
169 }
170
171 //____________________________________________________________________
172 void
173 AliForwardMultiplicityTask::SetDebug(Int_t dbg)
174 {
175   // 
176   // Set debug level 
177   // 
178   // Parameters:
179   //    dbg Debug level
180   //
181   fEventInspector.SetDebug(dbg);
182   fSharingFilter.SetDebug(dbg);
183   fDensityCalculator.SetDebug(dbg);
184   fCorrections.SetDebug(dbg);
185   fHistCollector.SetDebug(dbg);
186   fEventPlaneFinder.SetDebug(dbg);
187 }
188
189 //____________________________________________________________________
190 Bool_t
191 AliForwardMultiplicityTask::SetupForData()
192 {
193   // 
194   // Initialise the sub objects and stuff.  Called on first event 
195   // 
196   //
197   DGUARD(fDebug,1,"Initialize sub-algorithms");
198   const TAxis* pe = 0;
199   const TAxis* pv = 0;
200
201   if (!ReadCorrections(pe,pv)) return false;
202
203   fHistos.Init(*pe);
204   fAODFMD.Init(*pe);
205   fAODEP.Init(*pe);
206   fRingSums.Init(*pe);
207
208   fHData = static_cast<TH2D*>(fAODFMD.GetHistogram().Clone("d2Ndetadphi"));
209   fHData->SetStats(0);
210   fHData->SetDirectory(0);
211   fList->Add(fHData);
212
213   TList* rings = new TList;
214   rings->SetName("ringSums");
215   rings->SetOwner();
216   fList->Add(rings);
217
218   rings->Add(fRingSums.Get(1, 'I'));
219   rings->Add(fRingSums.Get(2, 'I'));
220   rings->Add(fRingSums.Get(2, 'O'));
221   rings->Add(fRingSums.Get(3, 'I'));
222   rings->Add(fRingSums.Get(3, 'O'));
223   fRingSums.Get(1, 'I')->SetMarkerColor(AliForwardUtil::RingColor(1, 'I'));
224   fRingSums.Get(2, 'I')->SetMarkerColor(AliForwardUtil::RingColor(2, 'I'));
225   fRingSums.Get(2, 'O')->SetMarkerColor(AliForwardUtil::RingColor(2, 'O'));
226   fRingSums.Get(3, 'I')->SetMarkerColor(AliForwardUtil::RingColor(3, 'I'));
227   fRingSums.Get(3, 'O')->SetMarkerColor(AliForwardUtil::RingColor(3, 'O'));
228
229   for(int i=1;i<=pv->GetNbins();i++)    
230   {
231         TString nametmp=Form("vtxbin%03d",i);
232         //TList* lbin= new TList();
233         //lbin->SetName(nametmp.Data());
234         //lbin->SetOwner();
235         //fListVertexBins->Add(lbin);
236         AliForwardUtil::Histos* bin=new AliForwardUtil::Histos();
237         bin->Init(*pe);
238         bin->Get(1, 'I')->SetName(Form("%s%s",bin->Get(1, 'I')->GetName(),nametmp.Data()));
239         bin->Get(2, 'I')->SetName(Form("%s%s",bin->Get(2, 'I')->GetName(),nametmp.Data()));
240         bin->Get(2, 'O')->SetName(Form("%s%s",bin->Get(2, 'O')->GetName(),nametmp.Data())); 
241         bin->Get(3, 'I')->SetName(Form("%s%s",bin->Get(3, 'I')->GetName(),nametmp.Data()));
242         bin->Get(3, 'O')->SetName(Form("%s%s",bin->Get(3, 'O')->GetName(),nametmp.Data()));
243         fList->Add(bin->Get(1, 'I'));
244         fList->Add(bin->Get(2, 'I'));
245         fList->Add(bin->Get(2, 'O'));
246         fList->Add(bin->Get(3, 'I'));
247         fList->Add(bin->Get(3, 'O'));
248         fListVertexBins->Add(bin);
249
250 }
251
252
253   fEventInspector.SetupForData(*pv);
254   fSharingFilter.SetupForData(*pe);
255   fDensityCalculator.SetupForData(*pe);
256   fCorrections.SetupForData(*pe);
257   fHistCollector.SetupForData(*pv,*pe);
258   fEventPlaneFinder.SetupForData(*pe);
259   
260   fFMD1icent=new TH3D("FMD1Ietavcent","FMD1ietavcent;#eta;cent",pe->GetNbins(),pe->GetXmin(),pe->GetXmax(),101,-0.5,100.5,1,0,1);
261   fFMD2icent=new TH3D("FMD2Ietavcent","FMD2ietavcent;#eta;cent",pe->GetNbins(),pe->GetXmin(),pe->GetXmax(),101,-0.5,100.5,1,0,1);
262   fFMD2ocent=new TH3D("FMD2Oetavcent","FMD2oetavcent;#eta;cent",pe->GetNbins(),pe->GetXmin(),pe->GetXmax(),101,-0.5,100.5,1,0,1);
263   fFMD3icent=new TH3D("FMD3Ietavcent","FMD3ietavcent;#eta;cent",pe->GetNbins(),pe->GetXmin(),pe->GetXmax(),101,-0.5,100.5,1,0,1);
264   fFMD3ocent=new TH3D("FMD3Oetavcent","FMD3oetavcent;#eta;cent",pe->GetNbins(),pe->GetXmin(),pe->GetXmax(),101,-0.5,100.5,1,0,1);
265   fList->Add(fFMD1icent);
266   fList->Add(fFMD2icent);
267   fList->Add(fFMD2ocent);
268   fList->Add(fFMD3icent);
269   fList->Add(fFMD3ocent);
270
271         
272
273   this->Print();
274   return true;
275 }
276
277 //____________________________________________________________________
278 void
279 AliForwardMultiplicityTask::UserCreateOutputObjects()
280 {
281   // 
282   // Create output objects 
283   // 
284   //
285   DGUARD(fDebug,1,"Create user ouput");
286   fList = new TList;
287   fList->SetOwner();
288   fListVertexBins=new TList();
289   fListVertexBins->SetOwner();  
290   
291   AliAnalysisManager* am = AliAnalysisManager::GetAnalysisManager();
292   AliAODHandler*      ah = 
293     dynamic_cast<AliAODHandler*>(am->GetOutputEventHandler());
294   if (!ah) AliFatal("No AOD output handler set in analysis manager");
295     
296     
297   TObject* obj = &fAODFMD;
298   ah->AddBranch("AliAODForwardMult", &obj);
299   TObject* epobj = &fAODEP;
300   ah->AddBranch("AliAODForwardEP", &epobj);
301
302   fEventInspector.CreateOutputObjects(fList);
303   fSharingFilter.CreateOutputObjects(fList);
304   fDensityCalculator.CreateOutputObjects(fList);
305   fCorrections.CreateOutputObjects(fList);
306   fHistCollector.CreateOutputObjects(fList);
307   fEventPlaneFinder.CreateOutputObjects(fList);
308
309   PostData(1, fList);
310 }
311 //____________________________________________________________________
312 void
313 AliForwardMultiplicityTask::UserExec(Option_t*)
314 {
315   // 
316   // Process each event 
317   // 
318   // Parameters:
319   //    option Not used
320   //  
321
322   DGUARD(fDebug,1,"Process the input event");
323   // static Int_t cnt = 0;
324   // cnt++;
325   // Get the input data 
326   AliESDEvent* esd = GetESDEvent();
327   if (!esd) return;
328
329   // Clear stuff 
330   fHistos.Clear();
331   fESDFMD.Clear();
332   fAODFMD.Clear();
333   fAODEP.Clear();
334   
335   Bool_t   lowFlux   = kFALSE;
336   UInt_t   triggers  = 0;
337   UShort_t ivz       = 0;
338   TVector3 ip;
339   Double_t cent      = -1;
340   UShort_t nClusters = 0;
341   UInt_t   found     = fEventInspector.Process(esd, triggers, lowFlux, 
342                                                ivz, ip, cent, nClusters);
343   
344   if (found & AliFMDEventInspector::kNoEvent)    return;
345   if (found & AliFMDEventInspector::kNoTriggers) return;
346
347   // Set trigger bits, and mark this event for storage 
348   fAODFMD.SetTriggerBits(triggers);
349   fAODFMD.SetSNN(fEventInspector.GetEnergy());
350   fAODFMD.SetSystem(fEventInspector.GetCollisionSystem());
351   fAODFMD.SetCentrality(cent);
352   fAODFMD.SetNClusters(nClusters);
353   MarkEventForStore();
354  
355   if (found & AliFMDEventInspector::kNoSPD)      return;
356   if (found & AliFMDEventInspector::kNoFMD)      return;
357   if (found & AliFMDEventInspector::kNoVertex)   return;
358   
359   if (triggers & AliAODForwardMult::kPileUp) return;
360   
361   fAODFMD.SetIpZ(ip.Z());
362
363   if (found & AliFMDEventInspector::kBadVertex) return;
364
365   // We we do not want to use low flux specific code, we disable it here. 
366   if (!fEnableLowFlux) lowFlux = false;
367
368   // Get FMD data 
369   AliESDFMD* esdFMD = esd->GetFMDData();
370   //  // Apply the sharing filter (or hit merging or clustering if you like)
371   if (!fSharingFilter.Filter(*esdFMD, lowFlux, fESDFMD, ip.Z())) { 
372     AliWarning("Sharing filter failed!");
373     return;
374   }
375   
376   // Calculate the inclusive charged particle density 
377   if (!fDensityCalculator.Calculate(fESDFMD, fHistos, lowFlux, cent, ip)) { 
378     // if (!fDensityCalculator.Calculate(*esdFMD, fHistos, ivz, lowFlux)) { 
379     AliWarning("Density calculator failed!");
380     return;
381   }
382
383   if (fEventInspector.GetCollisionSystem() == AliFMDEventInspector::kPbPb) {
384     if (!fEventPlaneFinder.FindEventplane(esd, fAODEP, 
385                                           &(fAODFMD.GetHistogram()), &fHistos))
386       AliWarning("Eventplane finder failed!");
387   }
388   
389   // Do the secondary and other corrections. 
390   if (!fCorrections.Correct(fHistos, ivz)) { 
391     AliWarning("Corrections failed");
392     return;
393   }
394
395   if (!fHistCollector.Collect(fHistos, fRingSums, 
396                               ivz, fAODFMD.GetHistogram(),fList,fAODFMD.GetCentrality(),fListVertexBins)) {
397     AliWarning("Histogram collector failed");
398     return;
399   }
400
401   if (fAODFMD.IsTriggerBits(AliAODForwardMult::kInel))
402     fHData->Add(&(fAODFMD.GetHistogram()));
403
404   PostData(1, fList);
405 }
406
407 //____________________________________________________________________
408 void
409 AliForwardMultiplicityTask::FinishTaskOutput()
410 {
411   if (!fList) 
412     Warning("FinishTaskOutput", "No list defined");
413   else {
414     if (fDebug) 
415       fList->ls();
416   }
417   AliAnalysisTaskSE::FinishTaskOutput();
418 }
419
420 //____________________________________________________________________
421 void
422 AliForwardMultiplicityTask::Terminate(Option_t*)
423 {
424   // 
425   // End of job
426   // 
427   // Parameters:
428   //    option Not used 
429   //
430   DGUARD(fDebug,1,"Processing the merged results");
431
432   TList* list = dynamic_cast<TList*>(GetOutputData(1));
433   if (!list) {
434     AliError(Form("No output list defined (%p)", GetOutputData(1)));
435     if (GetOutputData(1)) GetOutputData(1)->Print();
436     return;
437   }
438
439   TList* output = new TList;
440   output->SetName(Form("%sResults", GetName()));
441   output->SetOwner();
442
443   Double_t nTr = 0, nTrVtx = 0, nAcc = 0;
444   MakeSimpledNdeta(list, output, nTr, nTrVtx, nAcc);
445   MakeRingdNdeta(list, "ringSums", output, "ringResults");
446
447   fSharingFilter.Terminate(list,output,Int_t(nTr));
448   fDensityCalculator.Terminate(list,output,Int_t(nTrVtx));
449   fCorrections.Terminate(list,output,Int_t(nTrVtx));
450
451   PostData(2, output);
452 }
453
454 //
455 // EOF
456 //