bf21645b |
1 | /* $Id$ */ |
2 | |
3 | // ------------------------------------------------------ |
4 | // |
5 | // Class to handle 3d-corrections. |
6 | // |
7 | // ------------------------------------------------------ |
8 | // |
9 | |
10 | #include <TH3F.h> |
f10a1859 |
11 | #include <TH1F.h> |
bf21645b |
12 | |
13 | #include <AliLog.h> |
14 | |
15 | #include "AliCorrectionMatrix3D.h" |
847489f7 |
16 | #include "AliPWG0Helper.h" |
bf21645b |
17 | |
18 | //____________________________________________________________________ |
19 | ClassImp(AliCorrectionMatrix3D) |
20 | |
21 | //____________________________________________________________________ |
22 | AliCorrectionMatrix3D::AliCorrectionMatrix3D() : |
23 | AliCorrectionMatrix() |
24 | { |
25 | // default constructor |
26 | } |
27 | |
28 | //____________________________________________________________________ |
29 | AliCorrectionMatrix3D::AliCorrectionMatrix3D(const AliCorrectionMatrix3D& c) |
30 | : AliCorrectionMatrix(c) |
31 | { |
32 | // copy constructor |
33 | ((AliCorrectionMatrix3D &)c).Copy(*this); |
34 | } |
35 | |
61385583 |
36 | //____________________________________________________________________ |
37 | AliCorrectionMatrix3D &AliCorrectionMatrix3D::operator=(const AliCorrectionMatrix3D &c) |
38 | { |
39 | // assigment operator |
40 | |
41 | if (this != &c) |
42 | ((AliCorrectionMatrix3D &) c).Copy(*this); |
43 | |
44 | return *this; |
45 | } |
46 | |
bf21645b |
47 | //____________________________________________________________________ |
48 | AliCorrectionMatrix3D::AliCorrectionMatrix3D(const Char_t* name, const Char_t* title, |
49 | Int_t nBinX, Float_t Xmin, Float_t Xmax, |
50 | Int_t nBinY, Float_t Ymin, Float_t Ymax, |
51 | Int_t nBinZ, Float_t Zmin, Float_t Zmax) |
52 | : AliCorrectionMatrix(name, title) |
53 | { |
54 | // |
55 | // constructor |
56 | // |
57 | |
083a636e |
58 | Float_t* binLimitsX = new Float_t[nBinX+1]; |
59 | for (Int_t i=0; i<=nBinX; ++i) |
60 | binLimitsX[i] = Xmin + (Xmax - Xmin) / nBinX * i; |
29771dc8 |
61 | |
083a636e |
62 | Float_t* binLimitsY = new Float_t[nBinY+1]; |
63 | for (Int_t i=0; i<=nBinY; ++i) |
64 | binLimitsY[i] = Ymin + (Ymax - Ymin) / nBinY * i; |
29771dc8 |
65 | |
083a636e |
66 | Float_t* binLimitsZ = new Float_t[nBinZ+1]; |
67 | for (Int_t i=0; i<=nBinZ; ++i) |
68 | binLimitsZ[i] = Zmin + (Zmax - Zmin) / nBinZ * i; |
bf21645b |
69 | |
083a636e |
70 | CreateHists(nBinX, binLimitsX, nBinY, binLimitsY, nBinZ, binLimitsZ); |
71 | |
72 | delete[] binLimitsX; |
73 | delete[] binLimitsY; |
74 | delete[] binLimitsZ; |
bf21645b |
75 | } |
76 | |
1afae8ff |
77 | AliCorrectionMatrix3D::AliCorrectionMatrix3D(const Char_t* name, const Char_t* title, |
78 | Int_t nBinX, Float_t Xmin, Float_t Xmax, |
79 | Int_t nBinY, Float_t Ymin, Float_t Ymax, |
80 | Int_t nBinZ, const Float_t* zbins) |
81 | : AliCorrectionMatrix(name, title) |
82 | { |
83 | // constructor with variable bin sizes |
84 | |
85 | Float_t* binLimitsX = new Float_t[nBinX+1]; |
86 | for (Int_t i=0; i<=nBinX; ++i) |
87 | binLimitsX[i] = Xmin + (Xmax - Xmin) / nBinX * i; |
88 | |
89 | Float_t* binLimitsY = new Float_t[nBinY+1]; |
90 | for (Int_t i=0; i<=nBinY; ++i) |
91 | binLimitsY[i] = Ymin + (Ymax - Ymin) / nBinY * i; |
92 | |
083a636e |
93 | CreateHists(nBinX, binLimitsX, nBinY, binLimitsY, nBinZ, zbins); |
29771dc8 |
94 | |
083a636e |
95 | delete[] binLimitsX; |
96 | delete[] binLimitsY; |
97 | } |
29771dc8 |
98 | |
083a636e |
99 | AliCorrectionMatrix3D::AliCorrectionMatrix3D(const Char_t* name, const Char_t* title, |
100 | Int_t nBinX, const Float_t* xbins, |
101 | Int_t nBinY, Float_t Ymin, Float_t Ymax, |
102 | Int_t nBinZ, const Float_t* zbins) |
103 | : AliCorrectionMatrix(name, title) |
104 | { |
105 | // constructor with variable bin sizes |
106 | |
107 | Float_t* binLimitsY = new Float_t[nBinY+1]; |
108 | for (Int_t i=0; i<=nBinY; ++i) |
109 | binLimitsY[i] = Ymin + (Ymax - Ymin) / nBinY * i; |
110 | |
111 | CreateHists(nBinX, xbins, nBinY, binLimitsY, nBinZ, zbins); |
1afae8ff |
112 | |
1afae8ff |
113 | delete[] binLimitsY; |
083a636e |
114 | } |
115 | |
116 | //____________________________________________________________________ |
117 | void AliCorrectionMatrix3D::CreateHists(Int_t nBinX, const Float_t* binLimitsX, |
118 | Int_t nBinY, const Float_t* binLimitsY, |
119 | Int_t nBinZ, const Float_t* binLimitsZ) |
120 | { |
121 | // create the histograms |
122 | |
123 | // do not add this hists to the directory |
124 | Bool_t oldStatus = TH1::AddDirectoryStatus(); |
125 | TH1::AddDirectory(kFALSE); |
126 | |
127 | fhMeas = new TH3F("measured", Form("%s measured",GetTitle()), nBinX, binLimitsX, nBinY, binLimitsY, nBinZ, binLimitsZ); |
128 | fhGene = new TH3F("generated", Form("%s generated",GetTitle()), nBinX, binLimitsX, nBinY, binLimitsY, nBinZ, binLimitsZ); |
129 | fhCorr = new TH3F("correction", Form("%s correction",GetTitle()), nBinX, binLimitsX, nBinY, binLimitsY, nBinZ, binLimitsZ); |
1afae8ff |
130 | |
131 | fhMeas->Sumw2(); |
132 | fhGene->Sumw2(); |
133 | fhCorr->Sumw2(); |
083a636e |
134 | |
135 | TH1::AddDirectory(oldStatus); |
1afae8ff |
136 | } |
137 | |
083a636e |
138 | |
bf21645b |
139 | //____________________________________________________________________ |
140 | AliCorrectionMatrix3D::~AliCorrectionMatrix3D() |
141 | { |
142 | // |
143 | // destructor |
144 | // |
145 | |
146 | // histograms already deleted in base class |
147 | } |
148 | |
149 | //____________________________________________________________________ |
150 | TH3F* AliCorrectionMatrix3D::GetGeneratedHistogram() |
151 | { |
152 | // return generated histogram casted to correct type |
153 | return dynamic_cast<TH3F*> (fhGene); |
154 | } |
155 | |
156 | //____________________________________________________________________ |
157 | TH3F* AliCorrectionMatrix3D::GetMeasuredHistogram() |
158 | { |
159 | // return measured histogram casted to correct type |
160 | return dynamic_cast<TH3F*> (fhMeas); |
161 | } |
162 | |
163 | //____________________________________________________________________ |
164 | TH3F* AliCorrectionMatrix3D::GetCorrectionHistogram() |
165 | { |
166 | // return correction histogram casted to correct type |
167 | return dynamic_cast<TH3F*> (fhCorr); |
168 | } |
169 | |
170 | //____________________________________________________________________ |
171 | void AliCorrectionMatrix3D::FillMeas(Float_t ax, Float_t ay, Float_t az) |
172 | { |
173 | // add value to measured histogram |
174 | GetMeasuredHistogram()->Fill(ax, ay, az); |
175 | } |
176 | |
177 | //____________________________________________________________________ |
178 | void AliCorrectionMatrix3D::FillGene(Float_t ax, Float_t ay, Float_t az) |
179 | { |
180 | // add value to generated histogram |
181 | GetGeneratedHistogram()->Fill(ax, ay, az); |
182 | } |
183 | |
184 | //____________________________________________________________________ |
185 | Float_t AliCorrectionMatrix3D::GetCorrection(Float_t ax, Float_t ay, Float_t az) const |
186 | { |
187 | // returns a value of the correction map |
188 | return fhCorr->GetBinContent(fhCorr->FindBin(ax, ay, az)); |
189 | } |
190 | |
191 | //____________________________________________________________________ |
192 | //void AliCorrectionMatrix3D::RemoveEdges(Float_t cut, Int_t nBinsXedge, Int_t nBinsYedge, Int_t nBinsZedge) |
193 | void AliCorrectionMatrix3D::RemoveEdges(Float_t, Int_t, Int_t, Int_t) |
194 | { |
195 | // so what do we do here... |
196 | } |
197 | |
198 | //____________________________________________________________________ |
199 | void AliCorrectionMatrix3D::SaveHistograms() |
200 | { |
201 | // |
202 | // saves the histograms |
203 | // |
204 | |
205 | AliCorrectionMatrix::SaveHistograms(); |
206 | |
92d2d8ad |
207 | if (GetGeneratedHistogram() && GetMeasuredHistogram()) |
29771dc8 |
208 | { |
209 | gDirectory->cd(GetName()); |
210 | |
211 | AliPWG0Helper::CreateDividedProjections(GetGeneratedHistogram(), GetMeasuredHistogram(), 0, kFALSE, kTRUE); |
212 | |
213 | gDirectory->cd(".."); |
214 | } |
bf21645b |
215 | } |
f10a1859 |
216 | |
217 | //____________________________________________________________________ |
218 | Int_t AliCorrectionMatrix3D::CheckEmptyBins(Float_t xmin, Float_t xmax, Float_t ymin, Float_t ymax, Float_t zmin, Float_t zmax, Bool_t quiet) |
219 | { |
220 | // |
221 | // counts the number of empty Bins in a given region |
222 | // |
223 | |
224 | TH3F* hist = GetGeneratedHistogram(); |
225 | if (!hist) |
226 | return -1; |
227 | |
228 | Int_t emptyBins = 0; |
229 | for (Int_t x=hist->GetXaxis()->FindBin(xmin); x<=hist->GetXaxis()->FindBin(xmax); ++x) |
230 | for (Int_t y=hist->GetYaxis()->FindBin(ymin); y<=hist->GetYaxis()->FindBin(ymax); ++y) |
231 | for (Int_t z=hist->GetZaxis()->FindBin(zmin); z<=hist->GetZaxis()->FindBin(zmax); ++z) |
232 | if (hist->GetBinContent(x, y, z) == 0) |
233 | { |
234 | if (!quiet) |
235 | printf("Empty bin in %s at vtx = %f, eta = %f, pt = %f\n", GetName(), hist->GetXaxis()->GetBinCenter(x), hist->GetYaxis()->GetBinCenter(y), hist->GetZaxis()->GetBinCenter(z)); |
236 | ++emptyBins; |
237 | } |
238 | |
239 | return emptyBins; |
240 | } |
241 | |
242 | //____________________________________________________________________ |
243 | TH1F* AliCorrectionMatrix3D::PlotBinErrors(Float_t xmin, Float_t xmax, Float_t ymin, Float_t ymax, Float_t zmin, Float_t zmax) |
244 | { |
245 | // |
246 | // makes a 1d plots of the relative bin errors |
247 | // |
248 | |
249 | TH3F* hist = GetCorrectionHistogram(); |
250 | if (!hist) |
251 | return 0; |
252 | |
253 | TH1F* target = new TH1F("relerrors", "relerrors", 100, 0, 10); |
254 | |
255 | for (Int_t x=hist->GetXaxis()->FindBin(xmin); x<=hist->GetXaxis()->FindBin(xmax); ++x) |
256 | for (Int_t y=hist->GetYaxis()->FindBin(ymin); y<=hist->GetYaxis()->FindBin(ymax); ++y) |
257 | for (Int_t z=hist->GetZaxis()->FindBin(zmin); z<=hist->GetZaxis()->FindBin(zmax); ++z) |
258 | if (hist->GetBinContent(x, y, z) != 0) |
259 | target->Fill(100 * hist->GetBinError(x, y, z) / hist->GetBinContent(x, y, z)); |
260 | |
261 | return target; |
262 | } |
263 | |