]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG2/FORWARD/analysis/AliFMDAnalysisTaskCollector.cxx
Fixing warnings
[u/mrichter/AliRoot.git] / PWG2 / FORWARD / analysis / AliFMDAnalysisTaskCollector.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /* $Id:$ */
17
18 ///////////////////////////////////////////////////////////////////////////////
19 //                                                                           //
20 //  Here some comments on what this task does                                //
21  
22 #include <TChain.h>
23 #include <TF1.h>
24 #include <TFile.h>
25 #include <TInterpreter.h>
26 #include <TList.h>
27 #include <TMath.h>
28 #include <TROOT.h>
29 #include <TSystem.h>
30 #include <iostream>
31
32 #include "AliFMDAnalysisTaskCollector.h"
33 #include "AliAnalysisManager.h"
34 #include "AliESDFMD.h"
35 #include "AliESDEvent.h"
36 #include "AliAODEvent.h"
37 #include "AliAODHandler.h"
38 #include "AliMCEventHandler.h"
39 #include "AliStack.h"
40 #include "AliMultiplicity.h"
41 #include "AliESDVertex.h"
42 #include "AliFMDAnaParameters.h"
43 //#include "AliFMDGeometry.h"
44
45
46 ClassImp(AliFMDAnalysisTaskCollector)
47
48 //____________________________________________________________________
49 Double_t  AliFMDAnalysisTaskCollector::TripleLandau(Double_t *x, Double_t *par) {
50   
51   Double_t energy        = x[0];
52   Double_t constant = par[0];
53   Double_t mpv      = par[1];
54   Double_t sigma    = par[2];
55   Double_t alpha    = par[3];
56   Double_t beta     = par[4];
57  
58   Double_t f = constant*(TMath::Landau(energy,mpv,sigma,kTRUE)+
59                          alpha*TMath::Landau(energy,2*mpv+2*sigma*TMath::Log(2),2*sigma,kTRUE)+
60                          beta*TMath::Landau(energy,3*mpv+3*sigma*TMath::Log(3),3*sigma,kTRUE) );
61   
62   return f;
63 }
64 //____________________________________________________________________
65
66 AliFMDAnalysisTaskCollector::AliFMDAnalysisTaskCollector()
67 : fDebug(0),
68   fOutputList(0),
69   fArray(0),
70   fZvtxDist(0),
71   fEvents(0),
72   fEmptyEvents(0)
73 {
74   // Default constructor
75   
76  
77 }
78 //____________________________________________________________________
79 AliFMDAnalysisTaskCollector::AliFMDAnalysisTaskCollector(const char* name):
80     AliAnalysisTaskSE(name),
81     fDebug(0),
82     fOutputList(0),
83     fArray(0),
84     fZvtxDist(0),
85     fEvents(0),
86     fEmptyEvents(0)
87 {
88   // Default constructor
89   
90   DefineOutput(1, TList::Class());
91 }
92 //____________________________________________________________________
93 void AliFMDAnalysisTaskCollector::UserCreateOutputObjects()
94 {
95   // Create the output container
96   printf("AnalysisTaskFMD::CreateOutPutData() \n");
97   
98   fOutputList = new TList();//(TList*)GetOutputData(0);
99   AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
100   
101   fArray     = new TObjArray();
102   fArray->SetName("FMD");
103   fArray->SetOwner();
104   TH1F* hEdist = 0;
105   TH1F* hEmptyEdist = 0;
106   TH1F* hRingEdist = 0;
107   for(Int_t nEta = 0; nEta < pars->GetNetaBins(); nEta++) {
108     TObjArray* etaArray = new TObjArray();
109     fArray->AddAtAndExpand(etaArray,nEta);
110     for(Int_t det =1; det<=3;det++)
111       {
112         TObjArray* detArray = new TObjArray();
113         detArray->SetName(Form("FMD%d",det));
114         etaArray->AddAtAndExpand(detArray,det);
115         Int_t nRings = (det==1 ? 1 : 2);
116         for(Int_t ring = 0;ring<nRings;ring++)
117           {
118             Char_t ringChar = (ring == 0 ? 'I' : 'O');
119             hEdist = new TH1F(Form("FMD%d%c_etabin%d",det,ringChar,nEta),Form("FMD%d%c_etabin%d",det,ringChar,nEta),200,0,6);
120             hEdist->SetXTitle("#Delta E / E_{MIP}");
121             fOutputList->Add(hEdist);
122             detArray->AddAtAndExpand(hEdist,ring);
123             
124           } 
125       }
126     
127   }
128   
129   for(Int_t det =1; det<=3;det++)
130     {
131       Int_t nRings = (det==1 ? 1 : 2);
132       for(Int_t ring = 0;ring<nRings;ring++)
133         {
134           Char_t ringChar = (ring == 0 ? 'I' : 'O');
135           hRingEdist = new TH1F(Form("ringFMD%d%c",det,ringChar),Form("ringFMD%d%c",det,ringChar),200,0,6);
136           hRingEdist->SetXTitle("#Delta E / E_{MIP}");
137           fOutputList->Add(hRingEdist);
138           hEmptyEdist = new TH1F(Form("emptyFMD%d%c",det,ringChar),Form("emptyFMD%d%c",det,ringChar),200,0,6);
139           hEmptyEdist->SetXTitle("#Delta E / E_{MIP}");
140           fOutputList->Add(hEmptyEdist);
141           
142         }
143     }
144   fZvtxDist  = new TH1F("ZvtxDist","Vertex distribution",100,-30,30);
145   fZvtxDist->SetXTitle("z vertex");
146   fOutputList->Add(fZvtxDist);
147 }
148
149 //____________________________________________________________________
150 void AliFMDAnalysisTaskCollector::UserExec(Option_t */*option*/)
151 {
152   
153   AliESDEvent* esd = (AliESDEvent*)InputEvent();
154   AliESD* old = esd->GetAliESDOld();
155   if (old) {
156     esd->CopyFromOldESD();
157   }
158   AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
159   TString triggers = esd->GetFiredTriggerClasses();
160   //if(!triggers.IsNull()) return;
161   //Bool_t trigger = pars->IsEventTriggered(esd);
162   
163   Bool_t physics = pars->IsEventTriggered(esd);
164   Bool_t empty   = pars->IsEventTriggered(esd,AliFMDAnaParameters::kEMPTY);
165   //std::cout<<physics<<"   "<<empty<<std::endl;
166   //if(!trigger)
167   //  physics = kFALSE;
168   Double_t vertex[3];
169   
170   Bool_t vtxStatus =   pars->GetVertex(esd,vertex);
171   if(!vtxStatus)
172     physics = kFALSE;
173   
174   if(physics) {
175     fZvtxDist->Fill(vertex[2]);
176     if(TMath::Abs(vertex[2]) > pars->GetVtxCutZ())
177       physics = kFALSE;
178   }
179   std::cout<<"Bananer "<<vtxStatus<<"    "<<physics<<std::endl;
180   AliESDFMD* fmd = esd->GetFMDData();
181   if (!fmd) return;
182   if(physics)
183     fEvents++;
184   else if(empty)
185     fEmptyEvents++;
186   
187   if(!physics && !empty)
188     return;
189   TH1F* Edist = 0;
190   TH1F* emptyEdist = 0;
191   TH1F* ringEdist = 0;
192   for(UShort_t det=1;det<=3;det++) {
193     
194     Int_t nRings = (det==1 ? 1 : 2);
195     for (UShort_t ir = 0; ir < nRings; ir++) {
196       Char_t   ring = (ir == 0 ? 'I' : 'O');
197       emptyEdist = (TH1F*)fOutputList->FindObject(Form("emptyFMD%d%c",det,ring));
198       ringEdist = (TH1F*)fOutputList->FindObject(Form("ringFMD%d%c",det,ring));
199       UShort_t nsec = (ir == 0 ? 20  : 40);
200       UShort_t nstr = (ir == 0 ? 512 : 256);
201       
202       for(UShort_t sec =0; sec < nsec;  sec++)  {
203         for(UShort_t strip = 0; strip < nstr; strip++) {
204           
205           
206           Float_t mult = fmd->Multiplicity(det,ring,sec,strip);
207           if(mult == AliESDFMD::kInvalidMult || mult == 0) continue;
208           
209           Float_t eta = pars->GetEtaFromStrip(det,ring,sec,strip,vertex[2]);
210           
211           Int_t nEta  = pars->GetEtaBin(eta);
212           //      std::cout<<det<<"  "<<ring<<"   "<<sec<<"    "<<strip<<"   "<<vertex[2]<<"   "<<eta<<"   "<<nEta<<std::endl;
213           if(physics) {
214             Edist = (TH1F*)fOutputList->FindObject(Form("FMD%d%c_etabin%d",det,ring,nEta));       
215             Edist->Fill(mult);
216             ringEdist->Fill(mult);
217           }
218           else if(empty) {
219             emptyEdist->Fill(mult);
220             
221           }
222           else {
223             AliWarning("Something is wrong - wrong trigger");
224             continue;
225           }
226          
227           
228         }
229       }
230     }
231     
232     PostData(1, fOutputList); 
233     
234   }
235 }
236 //____________________________________________________________________
237   
238 void AliFMDAnalysisTaskCollector::Terminate(Option_t */*option*/) {
239   std::cout<<"Analysed "<<fEvents<<" events and "<<fEmptyEvents<<" empty"<<std::endl;
240   AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
241  
242     
243     for(Int_t det = 1; det<=3; det++) {
244       Int_t nRings  =  (det == 1 ? 1 : 2);
245       for(Int_t ring = 0;ring<nRings; ring++) {
246         
247         Char_t ringChar = (ring == 0 ? 'I' : 'O');
248         TH1F* hRingEdist = (TH1F*)fOutputList->FindObject(Form("ringFMD%d%c",det,ringChar));
249         TH1F* hEmptyEdist = (TH1F*)fOutputList->FindObject(Form("emptyFMD%d%c",det,ringChar));
250         if(fEmptyEvents)
251           hEmptyEdist->Scale(1./(Float_t)fEmptyEvents);
252         
253         if(fEvents)
254           hRingEdist->Scale(1./(Float_t)fEvents);
255         for(Int_t nEta = 0; nEta < pars->GetNetaBins(); nEta++) {
256           TH1F* hEdist = (TH1F*)fOutputList->FindObject(Form("FMD%d%c_etabin%d",det,ringChar,nEta));
257           if(fEvents)
258             hEdist->Scale(1./(Float_t)fEvents);
259           
260         
261       }
262     }
263   }
264   
265 }
266 //____________________________________________________________________
267 void AliFMDAnalysisTaskCollector::ReadFromFile(const Char_t* filename, Bool_t store, Int_t speciesOption)  {
268
269   //speciesOption:
270   //0: p+p Landau fit
271   //1: Pb+Pb triple landau convolution fit
272   
273   AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
274   //pars->Init(kTRUE,AliFMDAnaParameters::kBackgroundCorrection);
275   
276   TFile fin(filename,"UPDATE");
277   
278   TList* list = (TList*)fin.Get("energyDist");
279   
280   AliFMDAnaCalibEnergyDistribution* EnergyDist = new AliFMDAnaCalibEnergyDistribution();
281   
282   EnergyDist->SetNetaBins(pars->GetNetaBins());
283   EnergyDist->SetEtaLimits(pars->GetEtaMin(),pars->GetEtaMax());
284     
285   TF1* fitFunc = 0;
286   
287   for(Int_t det = 1; det<=3; det++) {
288     Int_t nRings  =  (det == 1 ? 1 : 2);
289     for(Int_t ring = 0;ring<nRings; ring++) {
290       Char_t ringChar = (ring == 0 ? 'I' : 'O');
291       TH1F* hEmptyEdist = (TH1F*)list->FindObject(Form("emptyFMD%d%c",det,ringChar));
292       TH1F* hRingEdist = (TH1F*)list->FindObject(Form("ringFMD%d%c",det,ringChar));
293       fitFunc = FitEnergyDistribution(hEmptyEdist, speciesOption) ;
294       if(fitFunc)
295         fitFunc->Write(Form("emptyFMD%d%c_fitfunc",det,ringChar),TObject::kWriteDelete);
296       fitFunc = FitEnergyDistribution(hRingEdist, speciesOption) ;
297       if(fitFunc)
298         fitFunc->Write(Form("FMD%d%c_fitfunc",det,ringChar),TObject::kWriteDelete);
299       
300       
301       EnergyDist->SetEmptyEnergyDistribution(det,ringChar,hEmptyEdist);
302       EnergyDist->SetRingEnergyDistribution(det,ringChar,hRingEdist);
303       for(Int_t nEta = 0; nEta < pars->GetNetaBins(); nEta++) {
304         TH1F* hEdist = (TH1F*)list->FindObject(Form("FMD%d%c_etabin%d",det,ringChar,nEta));
305         
306         fitFunc = FitEnergyDistribution(hEdist, speciesOption) ;
307         if(fitFunc)
308           fitFunc->Write(Form("FMD%d%c_etabin%d_fitfunc",det,ringChar,nEta),TObject::kWriteDelete);
309         EnergyDist->SetEnergyDistribution(det,ringChar,nEta,hEdist);
310         
311       }
312       
313     }
314     
315   }
316   
317   fin.Write();
318   fin.Close();
319   
320   if(store) {
321     TFile fcalib(pars->GetPath(pars->GetEdistID() ),"RECREATE");
322     EnergyDist->Write(AliFMDAnaParameters::GetEdistID());
323     fcalib.Close();
324   }
325
326
327
328 }
329 //____________________________________________________________________
330 TF1* AliFMDAnalysisTaskCollector::FitEnergyDistribution(TH1F* hEnergy, Int_t /*speciesOption*/) {
331   AliFMDAnaParameters* pars = AliFMDAnaParameters::Instance();
332   TF1* fitFunc = 0;
333   if(hEnergy->GetEntries() != 0) {
334           
335     hEnergy->GetXaxis()->SetRangeUser(0.2,hEnergy->GetXaxis()->GetXmax());
336     
337     if(pars->GetCollisionSystem() == 0)
338       fitFunc =  new TF1("FMDfitFunc","landau",hEnergy->GetBinCenter(hEnergy->GetMaximumBin())-0.2,3);
339     if(pars->GetCollisionSystem() == 1) {
340       fitFunc = new TF1("FMDfitFunc",TripleLandau,hEnergy->GetBinCenter(hEnergy->GetMaximumBin())-0.2,5,5);
341       fitFunc->SetParNames("constant","MPV","sigma","2-Mip weight","3-Mip weight");
342       fitFunc->SetParameters(10,0.8,0.1,0.05,0.01);
343       fitFunc->SetParLimits(1,0.6,1.2);
344       fitFunc->SetParLimits(3,0,1);
345       fitFunc->SetParLimits(4,0,1);
346       
347     }
348     hEnergy->Fit(fitFunc,"","",hEnergy->GetBinCenter(hEnergy->GetMaximumBin())-0.2,3);
349     
350   }
351   return fitFunc;
352   
353 }
354 //____________________________________________________________________
355 //
356 // EOF
357 //