#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "TH2F.h" #include "TCanvas.h" #include "TPad.h" #include #include #include #include "TAxis.h" #include "TH1.h" #include "TArrayD.h" using namespace std; void invoke(double c0, double c1, double c2, void (*func)(double, double, double)) { return c0,c1,c2; } Double_t ScaleX(Double_t x, double c0, double c1, double c2, void scaleaxis(double c0, double c1, double c2)) { Double_t v; invoke(c0,c1,2, scaleaxis); cout << "c0=" << c0 << "c1=" << c1 << "c2=" << c2 << endl; v = c0 + c1*x + c2*x*x; return v; } void ScaleAxis(TAxis *a, double c0, double c1, double c2, void scaleaxis(double c0, double c1, double c2), Double_t (*Scale)(Double_t, double, double, double, void scaleaxis(double, double, double))) { if (!a) return; invoke(c0,c1,c2, scaleaxis); if (a->GetXbins()->GetSize()) { TArrayD X(*(a->GetXbins())); for(Int_t i = 0; i < X.GetSize(); i++) X[i] = Scale(X[i],c0,c1,c2,scaleaxis); a->Set((X.GetSize() - 1), X.GetArray()); } else { a->Set( a->GetNbins(), Scale(a->GetXmin(),c0,c1,c2,scaleaxis), Scale(a->GetXmax(),c0,c1,c2,scaleaxis)); } return; } void ScaleXaxis(TH1 *h, double c0, double c1, double c2, void scaleaxis(double c0, double c1, double c2), Double_t (*Scale)(Double_t, double, double, double, void scaleaxis(double, double, double))) { if (!h) return; invoke(c0,c1,c2, scaleaxis); ScaleAxis(h->GetXaxis(), Scale(Double_t x,c0,c1,c2,scaleaxis)); return; } void scaleaxis(double c0, double c1, double c2) { TFile *RootIn = TFile::Open("filein.hist","READ"); TFile *RootOut = new TFile("fileout.hist","RECREATE"); TH1F *h = (TH1F*)RootIn->Get("zint"); ScaleXaxis(h,ScaleX(Double_t x,c0,c1,c2,scaleaxis)); h->ResetStats(); h->Draw(); h->Write(); RootOut->Write(); RootIn->Close(); RootOut->Close(); }