23 #ifndef GW_H1CALIBRATOR_H
53 H1Calibrator::H1Calibrator()
65 if (fXRawAxis != 0)
delete fXRawAxis;
66 if (fYRawAxis != 0)
delete fYRawAxis;
67 if (fZRawAxis != 0)
delete fZRawAxis;
68 if (fHistoCal != 0)
delete fHistoCal;
75 printf(
"Info in <H1Calibrator::Calibrate> histo NOT defined !!\n");
80 printf(
"Info in <H1Calibrator::Calibrate> function NOT defined !!\n");
86 if ( (!opt.Contains(
"x")) && (!opt.Contains(
"y")) && (!opt.Contains(
"z")) ) opt =
"x";
87 if (histo->GetDimension() == 1) opt =
"x";
88 if ( (histo->GetDimension() == 2) && (!opt.Contains(
"x")) && (!opt.Contains(
"y")) ) opt =
"x";
93 if (opt.Contains(
"x")) {
94 CalibOneAxis(
function,
"x");
96 if (opt.Contains(
"y")) {
97 CalibOneAxis(
function,
"y");
99 if (opt.Contains(
"z")) {
100 CalibOneAxis(
function,
"z");
109 const Double_t c,
const Option_t *option)
112 if ((b==0.0) && (c==0.0)) {
113 printf(
"Info in <H1Calibrator::Calibrate> Invalid parameters !!\n");
118 printf(
"Info in <H1Calibrator::Calibrate> histo NOT defined !!\n");
122 TString opt = option;
124 if ( (!opt.Contains(
"x")) && (!opt.Contains(
"y")) && (!opt.Contains(
"z")) ) opt =
"x";
125 if (histo->GetDimension() == 1) opt =
"x";
126 if ( (histo->GetDimension() == 2) && (!opt.Contains(
"x")) && (!opt.Contains(
"y")) ) opt =
"x";
131 if (opt.Contains(
"x")) {
132 CalibOneAxis(a,b,c,
"x");
134 if (opt.Contains(
"y")) {
135 CalibOneAxis(a,b,c,
"y");
137 if (opt.Contains(
"z")) {
138 CalibOneAxis(a,b,c,
"z");
155 printf(
"Info in <H1Calibrator::Calibrate> histo NOT defined !!\n");
159 printf(
"Info in <H1Calibrator::Calibrate> functionX NOT defined !!\n");
163 printf(
"Info in <H1Calibrator::Calibrate> functionY NOT defined !!\n");
170 CalibOneAxis(functionX,
"x");
171 CalibOneAxis(functionY,
"y");
178 const Double_t ay,
const Double_t by,
const Double_t cy)
181 printf(
"Info in <H1Calibrator::Calibrate> histo NOT defined !!\n");
188 CalibOneAxis(ax,bx,cx,
"x");
189 CalibOneAxis(ay,by,cy,
"y");
204 printf(
"Info in <H1Calibrator::Calibrate> histo NOT defined !!\n");
208 printf(
"Info in <H1Calibrator::Calibrate> functionX NOT defined !!\n");
212 printf(
"Info in <H1Calibrator::Calibrate> functionY NOT defined !!\n");
216 printf(
"Info in <H1Calibrator::Calibrate> functionZ NOT defined !!\n");
223 CalibOneAxis(functionX,
"x");
224 CalibOneAxis(functionY,
"y");
225 CalibOneAxis(functionZ,
"z");
234 printf(
"Info in <H1Calibrator::Calibrate> histo NOT defined !!\n");
238 printf(
"Info in <H1Calibrator::Calibrate> function1 NOT defined !!\n");
242 printf(
"Info in <H1Calibrator::Calibrate> function2 NOT defined !!\n");
246 TString opt = option;
248 if ( (!opt.Contains(
"xy")) && (!opt.Contains(
"xz")) && (!opt.Contains(
"yz")) ) opt =
"xy";
253 if (!opt.CompareTo(
"xy")) {
254 CalibOneAxis(function1,
"x");
255 CalibOneAxis(function2,
"y");
257 if (!opt.CompareTo(
"xz")) {
258 CalibOneAxis(function1,
"x");
259 CalibOneAxis(function2,
"z");
261 if (!opt.CompareTo(
"yz")) {
262 CalibOneAxis(function1,
"y");
263 CalibOneAxis(function2,
"z");
271 const Double_t ay,
const Double_t by,
const Double_t cy,
const Double_t az,
272 const Double_t bz,
const Double_t cz)
275 printf(
"Info in <H1Calibrator::Calibrate> histo NOT defined !!\n");
282 CalibOneAxis(ax,bx,cx,
"x");
283 CalibOneAxis(ay,by,cy,
"y");
284 CalibOneAxis(az,bz,cz,
"z");
291 const Double_t by,
const Double_t az,
const Double_t bz)
293 Calibrate(histo,ax,bx,0.0,ay,by,0.0,az,bz,0.0);
298 const Double_t a2,
const Double_t b2,
const Double_t c2,
const Option_t *option)
301 printf(
"Info in <H1Calibrator::Calibrate> histo NOT defined !!\n");
305 TString opt = option;
307 if ( (!opt.Contains(
"xy")) && (!opt.Contains(
"xz")) && (!opt.Contains(
"yz")) ) opt =
"xy";
312 if (!opt.CompareTo(
"xy")) {
313 CalibOneAxis(a1,b1,c1,
"x");
314 CalibOneAxis(a2,b2,c2,
"y");
316 if (!opt.CompareTo(
"xz")) {
317 CalibOneAxis(a1,b1,c1,
"x");
318 CalibOneAxis(a2,b2,c2,
"z");
320 if (!opt.CompareTo(
"yz")) {
321 CalibOneAxis(a1,b1,c1,
"y");
322 CalibOneAxis(a2,b2,c2,
"z");
330 const Double_t a2,
const Double_t b2,
const Option_t *option)
332 Calibrate(histo,a1,b1,0.0,a2,b2,0.0,option);
338 printf(
"Info in <H1Calibrator::GetHistoCal> fHistoCal not defined, return 0 !!\n");
348 fHistoCal->GetXaxis()->SetRange(fXRawAxis->GetFirst(),fXRawAxis->GetLast());
349 fHistoCal->GetYaxis()->SetRange(fYRawAxis->GetFirst(),fYRawAxis->GetLast());
350 fHistoCal->GetZaxis()->SetRange(fZRawAxis->GetFirst(),fZRawAxis->GetLast());
351 fHistoCal->Draw(opt);
355 void H1Calibrator::Set(
const TH1 *
histo)
359 printf(
"Info in <H1Calibrator::Set> histo NOT defined !!\n");
364 if (fHistoCal != 0) {
delete fHistoCal; fHistoCal=0;}
365 if (fXRawAxis != 0) {
delete fXRawAxis; fXRawAxis=0;}
366 if (fYRawAxis != 0) {
delete fYRawAxis; fYRawAxis=0;}
367 if (fZRawAxis != 0) {
delete fZRawAxis; fZRawAxis=0;}
370 fHistoCal = (TH1 *)histo->Clone(
"HistoCal");
371 fXRawAxis = (TAxis *)histo->GetXaxis()->Clone(
"XAxisCal");
372 fYRawAxis = (TAxis *)histo->GetYaxis()->Clone(
"YAxisCal");
373 fZRawAxis = (TAxis *)histo->GetZaxis()->Clone(
"ZAxisCal");
374 fHistoCal->SetTitle(
"Calibrated Histogram");
378 void H1Calibrator::CalibOneAxis(
const TF1 *
function,
const Option_t *option)
381 printf(
"Info in <H1Calibrator::CalibOneAxis> function NOT defined !!\n");
385 TString opt = option;
391 if (!opt.CompareTo(
"x")) {
392 xmin =
function->Eval(fXRawAxis->GetXmin());
393 xmax =
function->Eval(fXRawAxis->GetXmax());
394 if (!fXRawAxis->IsVariableBinSize()) {
396 fHistoCal->GetXaxis()->SetLimits(xmin,xmax);
399 fHistoCal->GetXaxis()->SetLimits(xmax,xmin);
402 Double_t *xbins =
new Double_t[fXRawAxis->GetNbins()+1];
403 const TArrayD *array = fXRawAxis->GetXbins();
404 xmin =
function->Eval(fXRawAxis->GetXmin());
406 for (Int_t i = 0 ; i < fXRawAxis->GetNbins()+1; i++) {
407 xbins[i] =
function->Eval((*array)[i]);
411 for (Int_t i=0 ; i<fXRawAxis->GetNbins()+1; i++) {
412 xbins[i] =
function->Eval((*array)[fXRawAxis->GetNbins()-i]);
415 fHistoCal->GetXaxis()->Set(fXRawAxis->GetNbins(),xbins);
420 if (!opt.CompareTo(
"y")) {
421 xmin =
function->Eval(fYRawAxis->GetXmin());
422 xmax =
function->Eval(fYRawAxis->GetXmax());
423 if (!fYRawAxis->IsVariableBinSize()) {
425 fHistoCal->GetYaxis()->SetLimits(xmin,xmax);
428 fHistoCal->GetYaxis()->SetLimits(xmax,xmin);
431 Double_t *xbins =
new Double_t[fYRawAxis->GetNbins()+1];
432 const TArrayD *array = fYRawAxis->GetXbins();
434 for (Int_t i = 0 ; i < fYRawAxis->GetNbins()+1; i++) {
435 xbins[i] =
function->Eval((*array)[i]);
439 for (Int_t i = 0 ; i < fYRawAxis->GetNbins()+1; i++) {
440 xbins[i] =
function->Eval((*array)[fYRawAxis->GetNbins()-i]);
443 fHistoCal->GetYaxis()->Set(fYRawAxis->GetNbins(),xbins);
448 if (!opt.CompareTo(
"z")) {
449 xmin =
function->Eval(fZRawAxis->GetXmin());
450 xmax =
function->Eval(fZRawAxis->GetXmax());
451 if (!fZRawAxis->IsVariableBinSize()) {
453 fHistoCal->GetZaxis()->SetLimits(xmin,xmax);
456 fHistoCal->GetZaxis()->SetLimits(xmax,xmin);
459 Double_t *xbins =
new Double_t[fZRawAxis->GetNbins()+1];
460 const TArrayD *array = fZRawAxis->GetXbins();
462 for (Int_t i=0 ; i<fZRawAxis->GetNbins()+1; i++) {
463 xbins[i] =
function->Eval((*array)[i]);
467 for (Int_t i = 0 ; i < fZRawAxis->GetNbins()+1; i++) {
468 xbins[i] =
function->Eval((*array)[fZRawAxis->GetNbins()-i]);
471 fHistoCal->GetZaxis()->Set(fZRawAxis->GetNbins(),xbins);
478 void H1Calibrator::CalibOneAxis(
const Double_t a,
const Double_t
b,
const Double_t c,
const Option_t *option)
480 if ((b==0.0) && (c==0.0)) {
481 printf(
"Info in <H1Calibrator::CalibOneAxis> invalid parameters !!\n");
485 TF1 *
function =
new TF1(
"ftemp",
"pol2(0)");
486 function->SetParameter(0,a);
487 function->SetParameter(1,b);
488 function->SetParameter(2,c);
490 CalibOneAxis(
function,option);
492 if (
function != 0)
delete function;
497 void H1Calibrator::CalibOneAxis(
const Double_t a,
const Double_t b,
const Option_t *option)
500 printf(
"Info in <H1Calibrator::CalibOneAxis> invalid parameters !!\n");
504 TF1 *
function =
new TF1(
"ftemp",
"pol1(0)");
505 function->SetParameter(0,a);
506 function->SetParameter(1,b);
508 CalibOneAxis(
function,option);
510 if (
function != 0)
delete function;
515 void H1Calibrator::Invert()
517 if (fHistoCal == 0) {
518 printf(
"Info in <H1Calibrator::Invert> fHistoCal not defined !!\n");
521 TH1 *HistoCalTemp = (TH1 *)fHistoCal->Clone(
"HistoCalTemp");
522 if (HistoCalTemp == 0) {
523 printf(
"Info in <H1Calibrator::Invert> HistoCalTemp not defined !!\n");
526 if (fHistoCal->GetDimension() > 1) {
527 printf(
"Info in <H1Calibrator::Invert> Method not already defined for Histogram Dimension >= 2 !!\n");
532 for (Int_t i=0 ; i <= fHistoCal->GetNbinsX()+1 ; i++) {
533 fHistoCal->SetBinContent(i,HistoCalTemp->GetBinContent(fHistoCal->GetNbinsX()+1-i));
535 if (HistoCalTemp != 0)
delete HistoCalTemp;
printf("******************************************************************** \n")
void Calibrate(const TH1 *, const TF1 *, const Option_t *AxisOption="x")
void DrawResult(const Option_t *opt="") const
draw the calibrated histogram in the current pad with same range of the raw histogram ...
TH1 * GetHistoCal() const
return the calibrated histogram
H1Calibrator is a service class in order to calibrate a TH1 The raw histogram must never be changed T...
header file for the calibration facility