Changes:
[u/mrichter/AliRoot.git] / PWG0 / AliCorrectionMatrix.cxx
1 /* $Id$ */
2
3 // ------------------------------------------------------
4 //
5 // Class to handle corrections.
6 //
7 // ------------------------------------------------------
8 //
9
10 #include <TFile.h>
11 #include <TCanvas.h>
12 #include <TH2F.h>
13
14 #include <AliLog.h>
15
16 #include "AliCorrectionMatrix.h"
17
18 //____________________________________________________________________
19 ClassImp(AliCorrectionMatrix)
20
21 //____________________________________________________________________
22 AliCorrectionMatrix::AliCorrectionMatrix() : TNamed(),
23   fhMeas(0),
24   fhGene(0),
25   fhCorr(0)
26 {
27   // default constructor
28 }
29
30 //____________________________________________________________________
31 AliCorrectionMatrix::AliCorrectionMatrix(const Char_t* name, const Char_t* title) : TNamed(name, title),
32   fhMeas(0),
33   fhGene(0),
34   fhCorr(0)
35 {
36   // constructor initializing tnamed
37 }
38
39 //____________________________________________________________________
40 AliCorrectionMatrix::AliCorrectionMatrix(const AliCorrectionMatrix& c) : TNamed(c),
41   fhMeas(0),
42   fhGene(0),
43   fhCorr(0)
44 {
45   // copy constructor
46   ((AliCorrectionMatrix &)c).Copy(*this);
47 }
48
49 //____________________________________________________________________
50 AliCorrectionMatrix::~AliCorrectionMatrix()
51 {
52   //
53   // destructor
54   //
55
56   if (fhMeas)
57   {
58     delete fhMeas;
59     fhMeas = 0;
60   }
61
62   if (fhGene)
63   {
64     delete fhGene;
65     fhGene = 0;
66   }
67
68   if (fhCorr)
69   {
70     delete fhCorr;
71     fhCorr = 0;
72   }
73 }
74
75 //____________________________________________________________________
76 AliCorrectionMatrix &AliCorrectionMatrix::operator=(const AliCorrectionMatrix &c)
77 {
78   // assigment operator
79
80   if (this != &c)
81     ((AliCorrectionMatrix &) c).Copy(*this);
82
83   return *this;
84 }
85
86 //____________________________________________________________________
87 void AliCorrectionMatrix::Copy(TObject& c) const
88 {
89   // copy function
90
91   AliCorrectionMatrix& target = (AliCorrectionMatrix &) c;
92
93   if (fhMeas)
94     target.fhMeas = dynamic_cast<TH1*> (fhMeas->Clone());
95
96   if (fhGene)
97     target.fhGene = dynamic_cast<TH1*> (fhGene->Clone());
98
99   if (fhCorr)
100     target.fhCorr = dynamic_cast<TH1*> (fhCorr->Clone());
101 }
102
103 //________________________________________________________________________
104 void AliCorrectionMatrix::SetAxisTitles(const Char_t* titleX, const Char_t* titleY, const Char_t* titleZ)
105 {
106   //
107   // method for setting the axis titles of the histograms
108   //
109
110   fhMeas ->SetXTitle(titleX);  fhMeas ->SetYTitle(titleY);  fhMeas ->SetZTitle(titleZ);
111   fhGene ->SetXTitle(titleX);  fhGene ->SetYTitle(titleY);  fhGene ->SetZTitle(titleZ);
112   fhCorr ->SetXTitle(titleX);  fhCorr ->SetYTitle(titleY);  fhCorr ->SetZTitle(titleZ);
113 }
114
115 //____________________________________________________________________
116 Long64_t AliCorrectionMatrix::Merge(TCollection* list)
117 {
118   // Merge a list of AliCorrectionMatrix objects with this (needed for
119   // PROOF). 
120   // Returns the number of merged objects (including this).
121
122   if (!list)
123     return 0;
124   
125   if (list->IsEmpty())
126     return 1;
127
128   TIterator* iter = list->MakeIterator();
129   TObject* obj;
130
131   // collections of measured and generated histograms
132   TList* collectionMeas = new TList;
133   TList* collectionGene = new TList;
134   
135   Int_t count = 0;
136   while ((obj = iter->Next())) {
137     
138     AliCorrectionMatrix* entry = dynamic_cast<AliCorrectionMatrix*> (obj);
139     if (entry == 0) 
140       continue;
141
142     collectionMeas->Add(entry->GetMeasuredHistogram());
143     collectionGene->Add(entry->GetGeneratedHistogram());
144
145     count++;
146   }
147   fhMeas->Merge(collectionMeas);
148   fhGene->Merge(collectionGene);
149
150   delete collectionMeas;
151   delete collectionGene;
152
153   return count+1;
154 }
155
156 //____________________________________________________________________
157 void AliCorrectionMatrix::Divide()
158 {
159   //
160   // divide the histograms to get the correction
161   // 
162
163   if (!fhMeas || !fhGene)
164     return;
165
166   fhCorr->Divide(fhGene, fhMeas, 1, 1, "B");
167
168   Int_t emptyBins = 0;
169   for (Int_t x=1; x<=fhCorr->GetNbinsX(); ++x)
170     for (Int_t y=1; y<=fhCorr->GetNbinsY(); ++y)
171       for (Int_t z=1; z<=fhCorr->GetNbinsZ(); ++z)
172         if (fhCorr->GetBinContent(x, y, z) == 0)
173           ++emptyBins;
174
175   if (emptyBins > 0)
176     printf("INFO: In %s we have %d empty bins (of %d) in the correction map\n", GetName(), emptyBins, fhCorr->GetNbinsX() * fhCorr->GetNbinsY() * fhCorr->GetNbinsZ());
177 }
178
179 //____________________________________________________________________
180 Bool_t AliCorrectionMatrix::LoadHistograms(const Char_t* fileName, const Char_t* dir)
181 {
182   //
183   // loads the histograms from a file
184   //
185
186   TFile* fin = TFile::Open(fileName);
187
188   if(!fin) {
189     //Info("LoadHistograms",Form(" %s file does not exist",fileName));
190     return kFALSE;
191   }
192   
193   if(fhGene)  {delete fhGene;  fhGene=0;}
194   if(fhCorr)  {delete fhCorr;  fhCorr=0;}
195   if(fhMeas)  {delete fhMeas;  fhMeas=0;}
196   
197   fhMeas  = dynamic_cast<TH1*> (fin->Get(Form("%s/meas_%s", dir,GetName())));
198   if(!fhMeas)  Info("LoadHistograms","No meas  hist available");
199
200   fhGene  = dynamic_cast<TH1*> (fin->Get(Form("%s/gene_%s",dir, GetName())));
201   if(!fhGene)  Info("LoadHistograms","No gene  hist available");
202
203   fhCorr  = dynamic_cast<TH1*> (fin->Get(Form("%s/corr_%s",dir, GetName())));
204   if(!fhCorr) 
205   {
206     Info("LoadHistograms","No corr  hist available");
207     return kFALSE;
208   }
209       
210   return kTRUE;
211 }
212
213 //____________________________________________________________________
214 void AliCorrectionMatrix::SaveHistograms()
215 {
216   //
217   // saves the histograms
218   //
219
220   if (fhMeas)
221     fhMeas ->Write();
222
223   if (fhGene)
224     fhGene ->Write();
225
226   if (fhCorr)
227     fhCorr->Write();
228 }
229
230 //____________________________________________________________________
231 void AliCorrectionMatrix::DrawHistograms()
232 {
233   //
234   // draws all the four histograms on one TCanvas
235   //
236
237   TCanvas* canvas = new TCanvas(Form("correction_%s",fName.Data()), 
238                                 Form("correction_%s",fName.Data()), 800, 800);
239   canvas->Divide(2, 2);
240
241   canvas->cd(1);
242   if (fhMeas)
243     fhMeas->Draw("COLZ");
244   
245   canvas->cd(2);
246   if (fhGene)
247     fhGene->Draw("COLZ");
248
249   canvas->cd(3);
250   if (fhCorr)
251     fhCorr->Draw("COLZ");
252
253   canvas->cd(4);
254
255   // add: draw here the stat. errors of the correction histogram
256 }
257
258 //____________________________________________________________________
259 void AliCorrectionMatrix::ReduceInformation()
260 {
261   // this function deletes the measured and generated histograms to reduce the amount of data
262   // in memory
263
264   if (fhMeas)
265   {
266     delete fhMeas;
267     fhMeas = 0;
268   }
269
270   if (fhGene)
271   {
272     delete fhGene;
273     fhGene = 0;
274   }
275 }