3 // ------------------------------------------------------
5 // Class to handle 3d-corrections.
7 // ------------------------------------------------------
10 #include <TDirectory.h>
18 #include "AliCorrectionMatrix3D.h"
19 #include "AliCorrectionMatrix2D.h"
20 #include "AliPWG0Helper.h"
22 //____________________________________________________________________
23 ClassImp(AliCorrectionMatrix3D)
25 //____________________________________________________________________
26 AliCorrectionMatrix3D::AliCorrectionMatrix3D() :
29 // default constructor
32 //____________________________________________________________________
33 AliCorrectionMatrix3D::AliCorrectionMatrix3D(const AliCorrectionMatrix3D& c)
34 : AliCorrectionMatrix(c)
37 ((AliCorrectionMatrix3D &)c).Copy(*this);
40 //____________________________________________________________________
41 AliCorrectionMatrix3D &AliCorrectionMatrix3D::operator=(const AliCorrectionMatrix3D &c)
46 ((AliCorrectionMatrix3D &) c).Copy(*this);
51 //____________________________________________________________________
52 AliCorrectionMatrix3D::AliCorrectionMatrix3D(const Char_t* name, const Char_t* title,
53 Int_t nBinX, Float_t Xmin, Float_t Xmax,
54 Int_t nBinY, Float_t Ymin, Float_t Ymax,
55 Int_t nBinZ, Float_t Zmin, Float_t Zmax)
56 : AliCorrectionMatrix(name, title)
62 Float_t* binLimitsX = new Float_t[nBinX+1];
63 for (Int_t i=0; i<=nBinX; ++i)
64 binLimitsX[i] = Xmin + (Xmax - Xmin) / nBinX * i;
66 Float_t* binLimitsY = new Float_t[nBinY+1];
67 for (Int_t i=0; i<=nBinY; ++i)
68 binLimitsY[i] = Ymin + (Ymax - Ymin) / nBinY * i;
70 Float_t* binLimitsZ = new Float_t[nBinZ+1];
71 for (Int_t i=0; i<=nBinZ; ++i)
72 binLimitsZ[i] = Zmin + (Zmax - Zmin) / nBinZ * i;
74 CreateHists(nBinX, binLimitsX, nBinY, binLimitsY, nBinZ, binLimitsZ);
81 AliCorrectionMatrix3D::AliCorrectionMatrix3D(const Char_t* name, const Char_t* title,
82 Int_t nBinX, Float_t Xmin, Float_t Xmax,
83 Int_t nBinY, Float_t Ymin, Float_t Ymax,
84 Int_t nBinZ, const Float_t* zbins)
85 : AliCorrectionMatrix(name, title)
87 // constructor with variable bin sizes
89 Float_t* binLimitsX = new Float_t[nBinX+1];
90 for (Int_t i=0; i<=nBinX; ++i)
91 binLimitsX[i] = Xmin + (Xmax - Xmin) / nBinX * i;
93 Float_t* binLimitsY = new Float_t[nBinY+1];
94 for (Int_t i=0; i<=nBinY; ++i)
95 binLimitsY[i] = Ymin + (Ymax - Ymin) / nBinY * i;
97 CreateHists(nBinX, binLimitsX, nBinY, binLimitsY, nBinZ, zbins);
103 AliCorrectionMatrix3D::AliCorrectionMatrix3D(const Char_t* name, const Char_t* title, TH3F* hBinning)
104 : AliCorrectionMatrix(name, title)
106 // constructor with variable bin sizes (uses binning of hBinning)
108 // do not add this hists to the directory
109 Bool_t oldStatus = TH1::AddDirectoryStatus();
110 TH1::AddDirectory(kFALSE);
112 fhMeas = (TH3F*)hBinning->Clone("measured");
113 fhGene = (TH3F*)hBinning->Clone("generated");
114 fhCorr = (TH3F*)hBinning->Clone("correction");
116 fhMeas->SetTitle(Form("%s measured", GetTitle()));
117 fhGene->SetTitle(Form("%s generated", GetTitle()));
118 fhCorr->SetTitle(Form("%s correction", GetTitle()));
124 TH1::AddDirectory(oldStatus);
131 //____________________________________________________________________
132 void AliCorrectionMatrix3D::CreateHists(Int_t nBinX, const Float_t* binLimitsX,
133 Int_t nBinY, const Float_t* binLimitsY,
134 Int_t nBinZ, const Float_t* binLimitsZ)
136 // create the histograms
138 // do not add this hists to the directory
139 Bool_t oldStatus = TH1::AddDirectoryStatus();
140 TH1::AddDirectory(kFALSE);
142 fhMeas = new TH3F("measured", Form("%s measured",GetTitle()), nBinX, binLimitsX, nBinY, binLimitsY, nBinZ, binLimitsZ);
143 fhGene = new TH3F("generated", Form("%s generated",GetTitle()), nBinX, binLimitsX, nBinY, binLimitsY, nBinZ, binLimitsZ);
144 fhCorr = new TH3F("correction", Form("%s correction",GetTitle()), nBinX, binLimitsX, nBinY, binLimitsY, nBinZ, binLimitsZ);
150 TH1::AddDirectory(oldStatus);
154 //____________________________________________________________________
155 AliCorrectionMatrix3D::~AliCorrectionMatrix3D()
161 // histograms already deleted in base class
164 //____________________________________________________________________
165 TH3F* AliCorrectionMatrix3D::GetGeneratedHistogram()
167 // return generated histogram casted to correct type
168 return dynamic_cast<TH3F*> (fhGene);
171 //____________________________________________________________________
172 TH3F* AliCorrectionMatrix3D::GetMeasuredHistogram()
174 // return measured histogram casted to correct type
175 return dynamic_cast<TH3F*> (fhMeas);
178 //____________________________________________________________________
179 TH3F* AliCorrectionMatrix3D::GetCorrectionHistogram()
181 // return correction histogram casted to correct type
182 return dynamic_cast<TH3F*> (fhCorr);
185 //____________________________________________________________________
186 AliCorrectionMatrix2D* AliCorrectionMatrix3D::Get2DCorrection(Char_t* opt, Float_t aMin, Float_t aMax)
188 // returns a 2D projection of this correction
190 TString option = opt;
193 if (option.Contains("xy") || option.Contains("yx")) {
194 Int_t bMin = fhMeas->GetZaxis()->FindBin(aMin);
195 Int_t bMax = fhMeas->GetZaxis()->FindBin(aMax);
196 fhMeas->GetZaxis()->SetRange(bMin, bMax);
198 else if (option.Contains("xz") || option.Contains("zx")) {
199 Int_t bMin = fhMeas->GetYaxis()->FindBin(aMin);
200 Int_t bMax = fhMeas->GetYaxis()->FindBin(aMax);
201 fhMeas->GetYaxis()->SetRange(bMin, bMax);
203 else if (option.Contains("yz") || option.Contains("zy")) {
204 Int_t bMin = fhMeas->GetXaxis()->FindBin(aMin);
205 Int_t bMax = fhMeas->GetXaxis()->FindBin(aMax);
206 fhMeas->GetXaxis()->SetRange(bMin, bMax);
209 AliDebug(AliLog::kWarning, Form("WARNING: unknown projection option %s", opt));
213 AliCorrectionMatrix2D* corr2D = new AliCorrectionMatrix2D(Form("%s_%s",GetName(),opt),Form("%s projection %s",GetName(),opt),100,0,100,100,0,100);
215 TH2F* meas = (TH2F*) ((TH3F*)fhMeas)->Project3D(opt);
216 TH2F* gene = (TH2F*) ((TH3F*)fhGene)->Project3D(opt);
218 TH2F* corr = (TH2F*)gene->Clone("corr");
221 corr2D->SetGeneratedHistogram(gene);
222 corr2D->SetMeasuredHistogram(meas);
223 corr2D->SetCorrectionHistogram(corr);
228 fhMeas->GetXaxis()->UnZoom();
229 fhMeas->GetYaxis()->UnZoom();
230 fhMeas->GetZaxis()->UnZoom();
232 fhGene->GetXaxis()->UnZoom();
233 fhGene->GetYaxis()->UnZoom();
234 fhGene->GetZaxis()->UnZoom();
239 //____________________________________________________________________
240 TH1F* AliCorrectionMatrix3D::Get1DCorrectionHistogram(Char_t* opt, Float_t aMin1, Float_t aMax1, Float_t aMin2, Float_t aMax2)
242 // returns a 1D projection of this correction
243 AliDebug(AliLog::kWarning, Form("WARNING: test"));
245 AliCorrectionMatrix2D* corr2D;
246 if (strcmp(opt,"x")==0) {
247 corr2D = Get2DCorrection("xy",aMin1,aMax1);
248 return corr2D->Get1DCorrectionHistogram("x",aMin2,aMax2);
250 if (strcmp(opt,"y")==0) {
251 corr2D = Get2DCorrection("xy",aMin1,aMax1);
252 return corr2D->Get1DCorrectionHistogram("y",aMin2,aMax2);
254 if (strcmp(opt,"z")==0) {
255 corr2D = Get2DCorrection("yz",aMin1,aMax1);
256 return corr2D->Get1DCorrectionHistogram("x",aMin2,aMax2);
258 AliDebug(AliLog::kWarning, Form("WARNING: unknown projection option %s (should be x,y or z)", opt));
265 //____________________________________________________________________
266 void AliCorrectionMatrix3D::FillMeas(Float_t ax, Float_t ay, Float_t az)
268 // add value to measured histogram
269 GetMeasuredHistogram()->Fill(ax, ay, az);
272 //____________________________________________________________________
273 void AliCorrectionMatrix3D::FillGene(Float_t ax, Float_t ay, Float_t az)
275 // add value to generated histogram
276 GetGeneratedHistogram()->Fill(ax, ay, az);
279 //____________________________________________________________________
280 Float_t AliCorrectionMatrix3D::GetCorrection(Float_t ax, Float_t ay, Float_t az) const
282 // returns a value of the correction map
283 return fhCorr->GetBinContent(fhCorr->FindBin(ax, ay, az));
286 //____________________________________________________________________
287 //void AliCorrectionMatrix3D::RemoveEdges(Float_t cut, Int_t nBinsXedge, Int_t nBinsYedge, Int_t nBinsZedge)
288 void AliCorrectionMatrix3D::RemoveEdges(Float_t, Int_t, Int_t, Int_t)
290 // so what do we do here...
293 //____________________________________________________________________
294 void AliCorrectionMatrix3D::SaveHistograms()
297 // saves the histograms
300 AliCorrectionMatrix::SaveHistograms();
302 if (GetGeneratedHistogram() && GetMeasuredHistogram())
304 gDirectory->cd(GetName());
306 AliPWG0Helper::CreateDividedProjections(GetGeneratedHistogram(), GetMeasuredHistogram(), 0, kFALSE, kTRUE);
308 gDirectory->cd("..");
312 //____________________________________________________________________
313 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)
316 // counts the number of empty Bins in a given region
319 TH3F* hist = GetGeneratedHistogram();
324 for (Int_t x=hist->GetXaxis()->FindBin(xmin); x<=hist->GetXaxis()->FindBin(xmax); ++x)
325 for (Int_t y=hist->GetYaxis()->FindBin(ymin); y<=hist->GetYaxis()->FindBin(ymax); ++y)
326 for (Int_t z=hist->GetZaxis()->FindBin(zmin); z<=hist->GetZaxis()->FindBin(zmax); ++z)
327 if (hist->GetBinContent(x, y, z) == 0)
330 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));
337 //____________________________________________________________________
338 TH1F* AliCorrectionMatrix3D::PlotBinErrors(Float_t xmin, Float_t xmax, Float_t ymin, Float_t ymax, Float_t zmin, Float_t zmax)
341 // makes a 1d plots of the relative bin errors
344 TH3F* hist = GetCorrectionHistogram();
348 TH1F* target = new TH1F("relerrors", "relerrors", 100, 0, 10);
350 for (Int_t x=hist->GetXaxis()->FindBin(xmin); x<=hist->GetXaxis()->FindBin(xmax); ++x)
351 for (Int_t y=hist->GetYaxis()->FindBin(ymin); y<=hist->GetYaxis()->FindBin(ymax); ++y)
352 for (Int_t z=hist->GetZaxis()->FindBin(zmin); z<=hist->GetZaxis()->FindBin(zmax); ++z)
353 if (hist->GetBinContent(x, y, z) != 0)
354 target->Fill(100 * hist->GetBinError(x, y, z) / hist->GetBinContent(x, y, z));