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