3 // ------------------------------------------------------
5 // Class to handle 2d-corrections.
7 // ------------------------------------------------------
14 #include "AliCorrectionMatrix2D.h"
16 //____________________________________________________________________
17 ClassImp(AliCorrectionMatrix2D)
19 //____________________________________________________________________
20 AliCorrectionMatrix2D::AliCorrectionMatrix2D() :
23 // default constructor
26 //____________________________________________________________________
27 AliCorrectionMatrix2D::AliCorrectionMatrix2D(const AliCorrectionMatrix2D& c)
28 : AliCorrectionMatrix(c)
31 ((AliCorrectionMatrix2D &)c).Copy(*this);
34 //____________________________________________________________________
35 AliCorrectionMatrix2D &AliCorrectionMatrix2D::operator=(const AliCorrectionMatrix2D &c)
40 ((AliCorrectionMatrix2D &) c).Copy(*this);
45 //____________________________________________________________________
46 AliCorrectionMatrix2D::AliCorrectionMatrix2D(const Char_t* name, const Char_t* title,
47 Int_t nBinX, Float_t Xmin, Float_t Xmax,
48 Int_t nBinY, Float_t Ymin, Float_t Ymax)
49 : AliCorrectionMatrix(name, title)
55 // do not add this hists to the directory
56 Bool_t oldStatus = TH1::AddDirectoryStatus();
57 TH1::AddDirectory(kFALSE);
59 fhMeas = new TH2F("measured", Form("%s measured", GetTitle()), nBinX, Xmin, Xmax, nBinY, Ymin, Ymax);
60 fhGene = new TH2F("generated", Form("%s generated", GetTitle()), nBinX, Xmin, Xmax, nBinY, Ymin, Ymax);
61 fhCorr = new TH2F("correction", Form("%s correction", GetTitle()), nBinX, Xmin, Xmax, nBinY, Ymin, Ymax);
63 TH1::AddDirectory(oldStatus);
70 //____________________________________________________________________
71 AliCorrectionMatrix2D::AliCorrectionMatrix2D(const Char_t* name, const Char_t* title,
72 Int_t nBinX, Float_t *X, Int_t nBinY, Float_t *Y)
73 : AliCorrectionMatrix(name, title)
79 // do not add this hists to the directory
80 Bool_t oldStatus = TH1::AddDirectoryStatus();
81 TH1::AddDirectory(kFALSE);
83 fhMeas = new TH2F("measured", Form("%s measured",title), nBinX, X, nBinY, Y);
84 fhGene = new TH2F("generated", Form("%s generated",title), nBinX, X, nBinY, Y);
85 fhCorr = new TH2F("correction", Form("%s correction",title), nBinX, X, nBinY, Y);
87 TH1::AddDirectory(oldStatus);
94 //____________________________________________________________________
95 AliCorrectionMatrix2D::~AliCorrectionMatrix2D()
101 // histograms already deleted in base class
104 TH2* AliCorrectionMatrix2D::GetGeneratedHistogram() const
106 // return generated histogram casted to correct type
107 return dynamic_cast<TH2*> (fhGene);
110 TH2* AliCorrectionMatrix2D::GetMeasuredHistogram() const
112 // return measured histogram casted to correct type
113 return dynamic_cast<TH2*> (fhMeas);
116 //____________________________________________________________________
117 TH1* AliCorrectionMatrix2D::Get1DCorrectionHistogram(Char_t* opt, Float_t min, Float_t max)
120 // integrate the correction over one variable
126 if (strcmp(opt,"x")==0) {
127 Int_t binMin = fhMeas->GetYaxis()->FindBin(min);
128 Int_t binMax = fhGene->GetYaxis()->FindBin(max);
131 meas1D = ((TH2F*)fhMeas)->ProjectionX();
132 gene1D = ((TH2F*)fhGene)->ProjectionX();
135 Printf("Getting 1D map. Including y-bins %d to %d", binMin, binMax);
137 meas1D = ((TH2F*)fhMeas)->ProjectionX(Form("%s_x_pm", GetName()),binMin,binMax);
138 gene1D = ((TH2F*)fhGene)->ProjectionX(Form("%s_x_pg", GetName()),binMin,binMax);
141 else if (strcmp(opt,"y")==0) {
142 Int_t binMin = fhMeas->GetXaxis()->FindBin(min);
143 Int_t binMax = fhMeas->GetXaxis()->FindBin(max);
146 meas1D = ((TH2F*)fhMeas)->ProjectionY();
147 gene1D = ((TH2F*)fhGene)->ProjectionY();
150 Printf("Getting 1D map. Including x-bins %d to %d \n", binMin, binMax);
152 meas1D = ((TH2F*)fhMeas)->ProjectionY(Form("%s_y_pm", GetName()), binMin, binMax);
153 gene1D = ((TH2F*)fhGene)->ProjectionY(Form("%s_y_pg", GetName()), binMin, binMax);
157 Printf("ERROR: Invalid option");
163 gene1D->SetName(Form("corr_1D_%s",fName.Data()));
164 gene1D->SetTitle(Form("corr_1D_%s",fName.Data()));
166 TH1* divided = (TH1*) gene1D->Clone(Form("corr_1D_%s",fName.Data()));
169 divided->Divide(gene1D, meas1D, 1, 1, "B");
171 Printf("%p %p", gene1D, meas1D);
173 return (TH1F*)divided;
176 //____________________________________________________________________
177 void AliCorrectionMatrix2D::FillMeas(Float_t ax, Float_t ay)
179 // add value to measured histogram
180 ((TH2F*)fhMeas)->Fill(ax, ay);
183 //____________________________________________________________________
184 void AliCorrectionMatrix2D::FillGene(Float_t ax, Float_t ay)
186 // add value to generated histogram
187 ((TH2F*)fhGene)->Fill(ax, ay);
190 //____________________________________________________________________
191 Float_t AliCorrectionMatrix2D::GetCorrection(Float_t ax, Float_t ay) const
193 // returns a value of the correction map
194 return fhCorr->GetBinContent(fhCorr->FindBin(ax,ay));
197 //____________________________________________________________________
198 void AliCorrectionMatrix2D::RemoveEdges(Float_t cut, Int_t nBinsXedge, Int_t nBinsYedge)
200 // remove edges of correction histogram by removing
201 // - bins with content less than cut
202 // - bins next to bins with zero bin content
204 Int_t nBinsX = fhCorr->GetNbinsX();
205 Int_t nBinsY = fhCorr->GetNbinsY();
207 // set bin content to zero for bins with content smaller cut
208 for (Int_t bx=0; bx<=nBinsX; bx++) {
209 for (Int_t by=0; by<=nBinsY; by++) {
210 if (fhCorr->GetBinContent(bx,by)>cut) {
211 fhCorr->SetBinContent(bx,by,0);
212 fhCorr->SetBinError(bx,by,0);
217 // set bin content to zero for bins next to bins with zero
218 TH2F* tmp = (TH2F*)fhCorr->Clone("tmp");
221 Bool_t done = kFALSE;
222 Int_t nBinsXCount = 0;
223 Int_t nBinsYCount = 0;
225 if (nBinsXCount<nBinsXedge)
226 for (Int_t bx=0; bx<=nBinsX; bx++) {
227 for (Int_t by=0; by<=nBinsY; by++) {
228 if ((fhCorr->GetBinContent(bx+1,by)==0)||
229 (fhCorr->GetBinContent(bx-1,by)==0))
230 tmp->SetBinContent(bx,by,1);
234 if (nBinsYCount<nBinsYedge)
235 for (Int_t bx=0; bx<=nBinsX; bx++) {
236 for (Int_t by=0; by<=nBinsY; by++) {
237 if ((fhCorr->GetBinContent(bx,by+1)==0)||
238 (fhCorr->GetBinContent(bx,by-1)==0))
239 tmp->SetBinContent(bx,by,1);
242 for (Int_t bx=0; bx<=nBinsX; bx++) {
243 for (Int_t by=0; by<=nBinsY; by++) {
244 if (tmp->GetBinContent(bx,by)==1) {
245 fhCorr->SetBinContent(bx,by,0);
246 fhCorr->SetBinError(bx,by,0);
252 if ((nBinsXCount>=nBinsXedge)&&(nBinsYCount>=nBinsYedge)) done=kTRUE;
258 //____________________________________________________________________
259 void AliCorrectionMatrix2D::Rebin(Int_t x, Int_t y)
261 // rebins the histograms, recalculates the correction
263 GetGeneratedHistogram()->Rebin2D(x, y);
264 GetMeasuredHistogram()->Rebin2D(x, y);
265 GetCorrectionHistogram()->Rebin2D(x, y);