21 TH1D
Scale(
const TH1 *h, TFormula f)
23 TRandom3 dither(0430204771);
25 newhist.SetBins(h->GetNbinsX(), f.Eval(h->GetXaxis()->GetXmin()), f.Eval(h->GetXaxis()->GetXmax()));
26 for (
int i = 0; i < h->GetNbinsX(); ++i) {
27 for (
int c = 0; c < h->GetBinContent(i); ++c) {
28 auto x = h->GetXaxis()->GetBinLowEdge(i) + dither.Rndm() * h->GetXaxis()->GetBinWidth(i);
29 newhist.Fill(f.Eval(x));
45 TH1D
ScalePoly(
const TH1 *h, std::vector<Double_t> pars)
47 std::string funcstr =
"pol" + std::to_string(pars.size() - 1);
48 TFormula f(
"func", funcstr.c_str());
49 for (
size_t n = 0; n < pars.size(); ++n) {
50 f.SetParameter(n, pars[n]);
66 auto y = [&](Double_t x) {
return m * x + c; };
67 auto xlo = h->GetXaxis()->GetXmin();
68 auto xhi = h->GetXaxis()->GetXmax();
69 h->GetXaxis()->SetLimits(y(xlo), y(xhi));
86 for (
int i = h.GetNbinsX(); i > shift; --i) {
87 h.SetBinContent(i, h.GetBinContent(i - shift));
88 h.SetBinError(i, h.GetBinError(i - shift));
90 for (
int i = shift; i >= 0; --i) {
91 h.SetBinContent(i, 0);
96 for (
int i = 0; i < h.GetNbinsX() + shift; ++i) {
97 h.SetBinContent(i, h.GetBinContent(i - shift));
98 h.SetBinError(i, h.GetBinError(i - shift));
100 for (
int i = h.GetNbinsX() + shift; i < h.GetNbinsX(); ++i) {
101 h.SetBinContent(i, 0);
121 TH1D *
Add(TH1 *hist1, TH1 *hist2,
const char *name,
double c1 ,
double c2 )
123 TH1D *out = (TH1D *)hist1->Clone(name);
124 out->Add(hist1, hist2, c1, c2);
125 for (
int i = 0; i < hist1->GetNbinsX(); ++i) {
126 out->SetBinError(i, sqrt(pow(c1 * hist1->GetBinError(i), 2) + pow(c2 * hist2->GetBinError(i), 2)));
131 TH1D *
Add(std::vector<TH1*> hists,
const char *name) {
132 if (hists.size() == 0) {
return NULL; }
133 TH1D *out = (TH1D *)hists[0]->Clone(name);
134 for (
int i=1; i<hists.size(); ++i) {
135 out->Add(hists[i], 1);
140 TH1D *
Add(std::vector<int> hists,
const char *name) {
142 std::vector<TH1*> sum_spectra;
143 for (
auto &i : hists) {
144 sum_spectra.push_back(spectra[i]);
146 return Add(sum_spectra, name);
149 TH1D *
Add(
int iStart,
int iStop,
const char *name) {
151 std::vector<TH1*> sum_spectra;
152 for (
int i=iStart; i<=iStop; ++i) {
153 sum_spectra.push_back(spectra[i]);
155 return Add(sum_spectra, name);
171 TH2D *
Add(TH2 *hist1, TH2 *hist2,
const char *name,
double c1 ,
double c2 )
173 TH2D *out = (TH2D *)hist1->Clone(name);
174 out->Add(hist1, hist2, c1, c2);
175 for (
int i = 0; i < hist1->GetNbinsX(); ++i) {
176 for (
int j = 0; j < hist1->GetNbinsY(); ++j) {
177 out->SetBinError(i, j, sqrt(pow(c1 * hist1->GetBinError(i, j), 2) + pow(c2 * hist2->GetBinError(i, j), 2)));
183 TH2D *
Add(std::vector<TH2*> hists,
const char *name) {
184 if (hists.size() == 0) {
return NULL; }
185 TH2D *out = (TH2D*)hists[0]->Clone(name);
186 for (
int i=1; i<hists.size(); ++i) {
187 out->Add(hists[i], 1);
192 TH2D *
Add2(std::vector<int> hists,
const char *name) {
194 std::vector<TH2*> sum_spectra;
195 for (
auto &i : hists) {
196 sum_spectra.push_back(spectra[i]);
198 return Add(sum_spectra, name);
201 TH2D *
Add2(
int iStart,
int iStop,
const char *name) {
203 std::vector<TH2*> sum_spectra;
204 for (
int i=iStart; i<=iStop; ++i) {
205 sum_spectra.push_back(spectra[i]);
207 return Add(sum_spectra, name);
220 TH1D *
Multiply(TH1 *hist1,
const char *name,
double c1 ) {
221 TH1D *out = (TH1D*)hist1->Clone(name);
223 for (
int i=0; i < hist1->GetNbinsX(); ++i) {
224 out->SetBinError(i, c1*hist1->GetBinError(i));
238 TH1D *clone = (TH1D *)h->Clone();
239 for (
int i = 0; i < h->GetNbinsX(); ++i) {
240 h->SetBinContent(i, clone->GetBinContent(h->GetNbinsX() - i));
241 h->SetBinError(i, clone->GetBinError(h->GetNbinsX() - i));
255 TH2D *
RotateTH2(TH2 *hist,
float angle,
const char *name, TCutG *bananaGate )
259 int iMax = hist->GetNbinsX();
260 int jMax = hist->GetNbinsY();
262 float xMin = ((TAxis *)hist->GetXaxis())->GetXmin();
263 float xMax = ((TAxis *)hist->GetXaxis())->GetXmax();
264 float yMin = ((TAxis *)hist->GetYaxis())->GetXmin();
265 float yMax = ((TAxis *)hist->GetYaxis())->GetXmax();
267 float cosangle = TMath::Cos(angle * TMath::Pi() / 180.);
268 float sinangle = TMath::Sin(angle * TMath::Pi() / 180.);
270 int nOutX = iMax * cosangle + jMax * sinangle;
271 int nOutY = iMax * sinangle + jMax * cosangle;
273 TH2D *out_h =
new TH2D(name, name, nOutX, xMin * cosangle - yMax * sinangle, xMax * cosangle - yMin * sinangle,
274 nOutY, xMin * sinangle + yMin * cosangle, xMax * sinangle + yMax * cosangle);
277 float binWidthX = ((TAxis *)hist->GetXaxis())->GetBinCenter(1) - ((TAxis *)hist->GetXaxis())->GetBinCenter(0);
278 float binWidthY = ((TAxis *)hist->GetYaxis())->GetBinCenter(1) - ((TAxis *)hist->GetYaxis())->GetBinCenter(0);
280 for (
int i = 0; i < iMax; i++) {
281 for (
int j = 0; j < jMax; j++) {
282 float x = ((TAxis *)hist->GetXaxis())->GetBinCenter(i);
283 float y = ((TAxis *)hist->GetYaxis())->GetBinCenter(j);
286 if (!bananaGate->IsInside(x, y)) {
292 for (
int w = 1; w <= hist->GetBinContent(i, j); w++) {
293 float xRan = x + (random.Rndm() - 0.5) * binWidthX;
294 float yRan = y + (random.Rndm() - 0.5) * binWidthY;
295 float projX = xRan * cosangle - yRan * sinangle;
296 float projY = xRan * sinangle + yRan * cosangle;
298 out_h->Fill(projX, projY);
321 void RebinX(TVirtualPad *canvas,
int rebin) {
322 if (!canvas) {
if (!gPad) {
return; } canvas = gPad; }
332 for (
int i=0; i<nPads; ++i) {
334 RebinX(canvas->cd(i+1), rebin);
340 void RebinY(TVirtualPad *canvas,
int rebin) {
341 if (!canvas) {
if (!gPad) {
return; } canvas = gPad; }
351 for (
int i=0; i<nPads; ++i) {
353 RebinY(canvas->cd(i+1), rebin);
359 void Rebin(TVirtualPad *canvas,
int rebin) {
360 if (!canvas) {
if (!gPad) {
return; } canvas = gPad; }
366 if (hists.size() > 0) {
367 for (
int i=0; i<hists.size(); ++i) {
374 for (
int i=0; i<nPads; ++i) {
376 Rebin(canvas->cd(i+1), rebin);
382 void Norm(TH1 *hist, TH1 *ref,
double low,
double high) {
384 gate.
Norm(hist, ref);
387 void NormBackSub(TH1 *hist, TH1 *ref,
double low,
double high,
double backlow,
double backhigh) {
void NormBackSub(TH1 *hist, TH1 *ref, Gate background)
void Norm(TH1 *hist, TH1 *ref)
std::vector< TH2 * > List2DSpectra(bool quiet)
void ScaleLabelsLinear(TH1 *h, Double_t m, Double_t c)
Scales the labels of a histogram. Preferable over GamR::Spect::Scale and GamR::Spect::ScalePoly as it...
void Shift(TH1 &h, Int_t shift)
TH2 * RebinY(TH2 *hist, int rebin)
TH1 * Rebin(TH1 *hist, int rebin)
TH2D * Add2(std::vector< int > hists, const char *name)
TH1D * Multiply(TH1 *hist1, const char *name, double c1)
std::vector< TH1 * > List1DSpectra(bool quiet)
TH1D Scale(const TH1 *h, TFormula f)
Scales a histogram along the X axis and dithers to avoid quantization errors.
void NormBackSub(TH1 *hist, TH1 *ref, double low, double high, double backlow, double backhigh)
TH2D * RotateTH2(TH2 *hist, float angle, const char *name, TCutG *bananaGate)
TH1D ScalePoly(const TH1 *h, std::vector< Double_t > pars)
Scales histogram by a polynomial.
TH2 * RebinX(TH2 *hist, int rebin)
TH1D * Add(TH1 *hist1, TH1 *hist2, const char *name, double c1, double c2)
void Norm(TH1 *hist, TH1 *ref, double low, double high)
int GetNPads(TVirtualPad *pad)
std::vector< TH1D * > GetHists1D(TVirtualPad *canvas)
TH2D * GetHist2D(TVirtualPad *canvas)