264 int startBinX = hist->GetXaxis()->FindBin(
fPeakX.GetLow());
265 int startBinY = hist->GetYaxis()->FindBin(
fPeakY.GetLow());
267 int stopBinX = hist->GetXaxis()->FindBin(
fPeakX.GetHigh());
268 int stopBinY = hist->GetYaxis()->FindBin(
fPeakY.GetHigh());
270 subtracted =
new TH2D(
"sub_hist",
"subtracted histogram",
271 stopBinX - startBinX + 1,
272 hist->GetXaxis()->GetBinLowEdge(startBinX),
273 hist->GetXaxis()->GetBinLowEdge(stopBinX+1),
274 stopBinY - startBinY + 1,
275 hist->GetYaxis()->GetBinLowEdge(startBinY),
276 hist->GetYaxis()->GetBinLowEdge(stopBinY+1));
278 unsubtracted =
new TH2D(
"unsub_hist",
"unsubtracted histogram",
279 stopBinX - startBinX + 1,
280 hist->GetXaxis()->GetBinLowEdge(startBinX),
281 hist->GetXaxis()->GetBinLowEdge(stopBinX+1),
282 stopBinY - startBinY + 1,
283 hist->GetYaxis()->GetBinLowEdge(startBinY),
284 hist->GetYaxis()->GetBinLowEdge(stopBinY+1));
286 for (
int i=startBinX; i<=stopBinX; ++i) {
287 for (
int j=startBinY; j<=stopBinY; ++j) {
288 subtracted->SetBinContent(i-startBinX+1, j-startBinY+1, hist->GetBinContent(i, j));
289 subtracted->SetBinError(i-startBinX+1, j-startBinY+1, hist->GetBinError(i, j));
291 unsubtracted->SetBinContent(i-startBinX+1, j-startBinY+1, hist->GetBinContent(i, j));
292 unsubtracted->SetBinError(i-startBinX+1, j-startBinY+1, hist->GetBinError(i, j));
297 y_sub =
new TH1D(
"y_sub",
"Y subtraction",
298 stopBinX - startBinX + 1,
299 hist->GetXaxis()->GetBinLowEdge(startBinX),
300 hist->GetXaxis()->GetBinLowEdge(stopBinX+1));
302 for (
auto &gate :
fBackY) {
303 int start = hist->GetYaxis()->FindBin(gate.GetLow());
304 int stop = hist->GetYaxis()->FindBin(gate.GetHigh());
306 for (
int j=start; j<=stop; ++j) {
308 for (
int i=startBinX; i<=stopBinX; ++i) {
309 y_sub->SetBinContent(i-startBinX+1,
310 y_sub->GetBinContent(i-startBinX+1) + hist->GetBinContent(i, j));
311 y_sub->SetBinError(i-startBinX+1,
312 std::sqrt(std::pow(
y_sub->GetBinError(i-startBinX+1), 2) +
313 std::pow(hist->GetBinError(i,j), 2)));
319 x_sub =
new TH1D(
"x_sub",
"X subtraction",
320 stopBinY - startBinY + 1,
321 hist->GetYaxis()->GetBinLowEdge(startBinY),
322 hist->GetYaxis()->GetBinLowEdge(stopBinY+1));
324 for (
auto &gate :
fBackX) {
325 int start = hist->GetXaxis()->FindBin(gate.GetLow());
326 int stop = hist->GetXaxis()->FindBin(gate.GetHigh());
328 for (
int i=start; i<=stop; ++i) {
330 for (
int j=startBinY; j<=stopBinY; ++j) {
331 x_sub->SetBinContent(j-startBinY+1,
332 x_sub->GetBinContent(j-startBinY+1) + hist->GetBinContent(i, j));
333 x_sub->SetBinError(j-startBinY+1,
334 std::sqrt(std::pow(
x_sub->GetBinError(j-startBinY+1), 2) +
335 std::pow(hist->GetBinError(i,j), 2)));
341 int nBinsBackground = 0;
344 double backback_err = 0;
350 int startX = hist->GetXaxis()->FindBin(gateX.GetLow());
351 int stopX = hist->GetXaxis()->FindBin(gateX.GetHigh());
352 int startY = hist->GetYaxis()->FindBin(gateY.GetLow());
353 int stopY = hist->GetYaxis()->FindBin(gateY.GetHigh());
355 for (
int i=startX; i<=stopX; ++i) {
356 for (
int j=startY; j<=stopY; ++j) {
357 nBinsBackground += 1;
358 backback += hist->GetBinContent(i, j);
359 backback_err = std::sqrt(std::pow(backback_err, 2) +
360 std::pow(hist->GetBinError(i, j), 2));
365 if (nBinsBackground > 0) {
366 backback = backback/(double)nBinsBackground;
367 backback_err = backback_err/(double)nBinsBackground;
370 std::vector<int> nBinsSlice(stopBinX + stopBinY - startBinX - startBinY + 1);
371 std::vector<double> sumSlice(stopBinX + stopBinY - startBinX - startBinY + 1);
372 std::vector<double> sumErrSlice(stopBinX + stopBinY - startBinX - startBinY + 1);
374 int startSum = startBinX + startBinY;
375 int stopSum = stopBinX + stopBinY;
382 int startX = hist->GetXaxis()->FindBin(gateX.GetLow());
383 int stopX = hist->GetXaxis()->FindBin(gateX.GetHigh());
384 int startY = hist->GetYaxis()->FindBin(gateY.GetLow());
385 int stopY = hist->GetYaxis()->FindBin(gateY.GetHigh());
388 for (
int s=startSum; s<=stopSum; ++s) {
389 for (
int i=startX; i<=stopX; ++i) {
391 if (j >= startY && j <= stopY) {
392 nBinsSlice[s-startSum] += 1;
393 sumSlice[s-startSum] += hist->GetBinContent(i, j);
394 sumErrSlice[s-startSum] = std::sqrt(std::pow(sumErrSlice[s-startSum], 2) +
395 std::pow(hist->GetBinError(i, j), 2));
401 for (
int k = 0; k<nBinsSlice.size(); ++k) {
402 if (nBinsSlice[k] > 0) {
403 sumSlice[k] = sumSlice[k]/(double)nBinsSlice[k];
404 sumErrSlice[k] = sumErrSlice[k]/(double)nBinsSlice[k];
408 int peakWidthY = stopBinY - startBinY + 1;
409 int peakWidthX = stopBinX - startBinX + 1;
412 x_sub->Scale((
double)1.0/(
double)nBinsX);
415 y_sub->Scale((
double)1.0/(
double)nBinsY);
418 for (
int i=1; i<=peakWidthX; ++i) {
419 for (
int j=1; j<=peakWidthY; ++j) {
420 double counts =
subtracted->GetBinContent(i, j);
423 if (nBinsSlice[i+j-2]>0) {
424 subtracted->SetBinContent(i, j, counts -
x_sub->GetBinContent(j) -
y_sub->GetBinContent(i) - sumSlice[i+j-2] + 2.0*backback);
425 subtracted->SetBinError(i, j, std::sqrt(std::pow(error, 2) +
426 std::pow(
x_sub->GetBinError(j), 2) +
427 std::pow(
y_sub->GetBinError(i), 2) +
428 std::pow(sumErrSlice[i+j-2], 2) +
429 std::pow(2.0*backback_err, 2)));
432 subtracted->SetBinContent(i, j, counts -
x_sub->GetBinContent(j) -
y_sub->GetBinContent(i) + backback);
433 subtracted->SetBinError(i, j, std::sqrt(std::pow(error, 2) +
434 std::pow(
x_sub->GetBinError(j), 2) +
435 std::pow(
y_sub->GetBinError(i), 2) +
436 std::pow(backback_err, 2)));