3#include "TGNumberEntry.h"
4#include "TInterpreter.h"
14 : TGMainFrame(nullptr, 10, 10, kHorizontalFrame), fMatrix(
mat),
15 fPeakFitter(new
TPeakFitter()), fMaxBinning(maxBinning)
17 TString tmp_gate_word(gate_axis);
18 tmp_gate_word.ToUpper();
19 if(tmp_gate_word.EqualTo(
"X")) {
35 gInterpreter->SaveContext();
48 fProjectionCanvas->GetCanvas()->Connect(
"RangeChanged()",
"TBGSubtraction",
this,
"DoProjectionCanvasZoomed()");
50 fGateCanvas->GetCanvas()->Connect(
"RangeChanged()",
"TBGSubtraction",
this,
"DoGateCanvasZoomed()");
53 fProjectionCanvas->GetCanvas()->Connect(
"ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
"TBGSubtraction",
this,
54 "ProjectionStatusInfo(Int_t,Int_t,Int_t,TObject*)");
55 fGateCanvas->GetCanvas()->Connect(
"ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
"TBGSubtraction",
this,
56 "GateStatusInfo(Int_t,Int_t,Int_t,TObject*)");
64 fGateSlider->Connect(
"PositionChanged()",
"TBGSubtraction",
this,
"DoSlider()");
66 fBGSlider1->Connect(
"PositionChanged()",
"TBGSubtraction",
this,
"DoSlider()");
67 fBGSlider2->Connect(
"PositionChanged()",
"TBGSubtraction",
this,
"DoSlider()");
69 fPeakSlider->Connect(
"PointerPositionChanged()",
"TBGSubtraction",
this,
"DoSlider()");
70 fPeakSlider->Connect(
"PositionChanged()",
"TBGSubtraction",
this,
"DoSlider()");
72 fBinningSlider->Connect(
"PositionChanged(Int_t)",
"TBGSubtraction",
this,
"DoSlider()");
75 fPeakFitButton->Connect(
"Clicked()",
"TBGSubtraction",
this,
"DoPeakFit()");
77 fBGCheckButton1->Connect(
"Clicked()",
"TBGSubtraction",
this,
"UpdateBackground()");
78 fBGCheckButton2->Connect(
"Clicked()",
"TBGSubtraction",
this,
"UpdateBackground()");
80 fWrite2FileButton->Connect(
"Clicked()",
"TBGSubtraction",
this,
"WriteHistograms()");
83 fAxisCombo->Connect(
"Selected(Int_t,Int_t)",
"TBGSubtraction",
this,
"AxisComboSelected()");
84 fPeakCombo->Connect(
"Selected(Int_t,Int_t)",
"TBGSubtraction",
this,
"PeakComboSelected()");
88 fGateEntryLow->Connect(
"ValueSet(Long_t)",
"TBGSubtraction",
this,
"DoEntry(Long_t)");
89 fGateEntryHigh->Connect(
"ValueSet(Long_t)",
"TBGSubtraction",
this,
"DoEntry(Long_t)");
90 fBGEntryLow1->Connect(
"ValueSet(Long_t)",
"TBGSubtraction",
this,
"DoEntry(Long_t)");
91 fBGEntryHigh1->Connect(
"ValueSet(Long_t)",
"TBGSubtraction",
this,
"DoEntry(Long_t)");
92 fBGEntryLow2->Connect(
"ValueSet(Long_t)",
"TBGSubtraction",
this,
"DoEntry(Long_t)");
93 fBGEntryHigh2->Connect(
"ValueSet(Long_t)",
"TBGSubtraction",
this,
"DoEntry(Long_t)");
94 fBGEntryHigh2->Connect(
"ValueSet(Long_t)",
"TBGSubtraction",
this,
"UpdateProjectionSliders()");
97 fBGParamEntry->Connect(
"ValueSet(Long_t)",
"TBGSubtraction",
this,
"UpdateBackground()");
108 fProjectionCanvas->GetCanvas()->Disconnect(
"RangeChanged()",
this,
"DoProjectionCanvasZoomed()");
110 fGateCanvas->GetCanvas()->Disconnect(
"RangeChanged()",
this,
"DoGateCanvasZoomed()");
113 fProjectionCanvas->GetCanvas()->Disconnect(
"ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
this,
114 "ProjectionStatusInfo(Int_t,Int_t,Int_t,TObject*)");
115 fGateCanvas->GetCanvas()->Disconnect(
"ProcessedEvent(Int_t,Int_t,Int_t,TObject*)",
this,
116 "GateStatusInfo(Int_t,Int_t,Int_t,TObject*)");
124 fGateSlider->Disconnect(
"PositionChanged()",
this,
"DoSlider()");
126 fBGSlider1->Disconnect(
"PositionChanged()",
this,
"DoSlider()");
127 fBGSlider2->Disconnect(
"PositionChanged()",
this,
"DoSlider()");
129 fPeakSlider->Disconnect(
"PointerPositionChanged()",
this,
"DoSlider()");
130 fPeakSlider->Disconnect(
"PositionChanged()",
this,
"DoSlider()");
132 fBinningSlider->Disconnect(
"PositionChanged(Int_t)",
this,
"DoSlider()");
143 fAxisCombo->Disconnect(
"Selected(Int_t,Int_t)",
this,
"AxisComboSelected()");
144 fPeakCombo->Disconnect(
"Selected(Int_t,Int_t)",
this,
"PeakComboSelected()");
148 fGateEntryLow->Disconnect(
"ValueSet(Long_t)",
this,
"DoEntry(Long_t)");
149 fGateEntryHigh->Disconnect(
"ValueSet(Long_t)",
this,
"DoEntry(Long_t)");
150 fBGEntryLow1->Disconnect(
"ValueSet(Long_t)",
this,
"DoEntry(Long_t)");
151 fBGEntryHigh1->Disconnect(
"ValueSet(Long_t)",
this,
"DoEntry(Long_t)");
152 fBGEntryLow2->Disconnect(
"ValueSet(Long_t)",
this,
"DoEntry(Long_t)");
153 fBGEntryHigh2->Disconnect(
"ValueSet(Long_t)",
this,
"DoEntry(Long_t)");
154 fBGEntryHigh2->Disconnect(
"ValueSet(Long_t)",
this,
"UpdateProjectionSliders()");
157 fBGParamEntry->Disconnect(
"ValueSet(Long_t)",
this,
"UpdateBackground()");
166 Double_t def_gate_low = 0.3;
167 Double_t def_gate_high = 0.4;
168 Double_t def_bg_low = 0.7;
169 Double_t def_bg_high = 0.8;
170 Double_t def_peak_low = 0.4;
171 Double_t def_peak_high = 0.5;
181 Double_t x_width = xmax - xmin;
184 fGateEntryHigh->SetNumber(xmax - (1.0 - def_gate_high) * x_width);
189 fBGEntryHigh1->SetNumber(xmax - (1.0 - def_bg_high) * x_width);
194 fBGEntryHigh2->SetNumber(xmax - (1.0 - def_bg_high) * x_width);
205 fGateCanvas->GetCanvas()->GetRange(xmin, ymin, xmax, ymax);
206 x_width = xmax - xmin;
210 fPeakValue = xmin + (def_peak_low + 0.05) * x_width;
265 TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, xmin, xmax);
269 TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, xmin, xmax);
275 TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, xmin, xmax);
278 TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, xmin, xmax);
282 TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, xmin, xmax);
285 TGNumberFormat::kNEAAnyNumber, TGNumberFormat::kNELLimitMinMax, xmin, xmax);
290 fGateFrame =
new TGVerticalFrame(
this, 200, 200);
295 auto* gcanvas =
new GCanvas(canvas->GetName(), canvas->GetWindowWidth(), canvas->GetWindowHeight(), canvas->GetCanvasID());
299 std::array<Int_t, 2> parts = {20, 50};
315 TGNumberFormat::kNEANonNegative,
316 TGNumberFormat::kNELLimitMin,
338 fBly =
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX, 1, 1, 3, 1);
339 fLayoutCanvases =
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX | kLHintsExpandY, 1, 1, 3, 4);
340 fLayoutParam =
new TGLayoutHints(kLHintsCenterX | kLHintsExpandX, 1, 1, 3, 20);
342 fBly1 =
new TGLayoutHints(kLHintsTop | kLHintsCenterX | kLHintsExpandX | kLHintsExpandY, 20, 10, 15, 0);
394 SetWindowName(
"Gater and Subtractor");
400 Resize(GetDefaultSize());
441 if(
fPeak ==
nullptr) {
442 std::cerr <<
"Something went wrong and the peak is a nullptr?" << std::endl;
516 auto* frm =
reinterpret_cast<TGFrame*
>(gTQSender);
517 if(frm->IsA()->InheritsFrom(TGSlider::Class())) {
518 auto* slider =
static_cast<TGSlider*
>(frm);
519 index = slider->WidgetId();
521 auto* slider =
static_cast<TGDoubleSlider*
>(frm);
522 index = slider->WidgetId();
567 static int old_selection = -1;
574 std::cout <<
"Selecting the x axis" << std::endl;
577 std::cout <<
"Selecting the y axis" << std::endl;
590 static int oldPeakId = -1;
593 if(oldPeakId != peakId) {
598 std::cout <<
"Selecting gaussian peak" << std::endl;
600 std::cout <<
"fPeak = " <<
fPeak << std::endl;
603 std::cout <<
"Selecting radware peak" << std::endl;
607 std::cout <<
"Selecting two hit addback peak" << std::endl;
611 std::cout <<
"Selecting three hit addback peak" << std::endl;
615 std::cerr <<
"Unknown peak id " << peakId <<
", only know kGauss (" <<
kGauss <<
"), kRWPeak (" <<
kRWPeak <<
"), kABPeak (" <<
kABPeak <<
"), and kAB3Peak (" <<
kAB3Peak <<
")" << std::endl;
671 if((check_button !=
nullptr) && check_button->IsDown()) {
672 if(low_marker ==
nullptr) {
676 if(high_marker ==
nullptr) {
680 low_marker->
SetLocalX(low_entry->GetNumber());
681 high_marker->
SetLocalX(high_entry->GetNumber());
684 double low_bg_bin_edge =
fProjection->GetXaxis()->GetBinLowEdge(low_marker->
GetBinX());
685 double high_bg_bin_edge =
fProjection->GetXaxis()->GetBinLowEdge(high_marker->
GetBinX());
751 auto* entry =
reinterpret_cast<TGNumberEntry*
>(gTQSender);
752 int index = entry->WidgetId();
803 fGateCanvas->GetCanvas()->GetRange(xmin, ymin, xmax, ymax);
814 Double_t rel_lower_peak_val = (old_lower_peak_val - old_limit_min) / (old_limit_max - old_limit_min);
815 Double_t rel_upper_peak_val = (old_upper_peak_val - old_limit_min) / (old_limit_max - old_limit_min);
816 Double_t rel_peak_val = (old_peak_val - old_limit_min) / (old_limit_max - old_limit_min);
820 fPeakValue = xmin + rel_peak_val * (xmax - xmin);
850 Double_t rel_lower_gate_val = (old_lower_gate_val - old_limit_min) / (old_limit_max - old_limit_min);
851 Double_t rel_upper_gate_val = (old_upper_gate_val - old_limit_min) / (old_limit_max - old_limit_min);
852 Double_t rel_lower_bg1_val = (old_lower_bg1_val - old_limit_min) / (old_limit_max - old_limit_min);
853 Double_t rel_upper_bg1_val = (old_upper_bg1_val - old_limit_min) / (old_limit_max - old_limit_min);
854 Double_t rel_lower_bg2_val = (old_lower_bg2_val - old_limit_min) / (old_limit_max - old_limit_min);
855 Double_t rel_upper_bg2_val = (old_upper_bg2_val - old_limit_min) / (old_limit_max - old_limit_min);
857 fGateEntryLow->SetNumber(xmin + rel_lower_gate_val * (xmax - xmin));
858 fGateEntryHigh->SetNumber(xmin + rel_upper_gate_val * (xmax - xmin));
859 fBGEntryLow1->SetNumber(xmin + rel_lower_bg1_val * (xmax - xmin));
860 fBGEntryHigh1->SetNumber(xmin + rel_upper_bg1_val * (xmax - xmin));
861 fBGEntryLow2->SetNumber(xmin + rel_lower_bg2_val * (xmax - xmin));
862 fBGEntryHigh2->SetNumber(xmin + rel_upper_bg2_val * (xmax - xmin));
891 const char* proj_name = Form(
"gate_%d_%d",
static_cast<Int_t
>(
fGateEntryLow->GetNumber()),
916 const char* bg_name1 =
934 const char* bg_name2 =
950 TH1* bg_hist =
nullptr;
951 Double_t under_peak_bg = 0.0;
955 under_peak_bg = bg_hist->Integral(bg_hist->FindBin(
fGateSlider->GetMinPosition()),
960 Double_t bg_region = 0.0;
972 ratio = under_peak_bg / bg_region;
975 Int_t first_bin = -1;
1102 auto* canvas =
new TCanvas;
1114 if(file_name ==
nullptr) {
1115 std::cout <<
"Please enter a file name" << std::endl;
1119 TFile f(file_name,
"Update");
1120 std::cout <<
"Writing " <<
fHistogramDescription->GetText() <<
" histograms to " << f.GetName() << std::endl;
1193 double minimumRatio = 0.;
1194 double maximumRatio = 1.;
1201 minimumRatio = (oldMinimum - unZoomedMinimum) / (unZoomedMaximum - unZoomedMinimum);
1202 maximumRatio = (oldMaximum - unZoomedMinimum) / (unZoomedMaximum - unZoomedMinimum);
1210 if(minimumRatio != 0. || maximumRatio != 1.) {
1213 fSubtractedBinHist->GetYaxis()->SetRangeUser(unZoomedMinimum + minimumRatio * (unZoomedMaximum - unZoomedMinimum),
1214 unZoomedMinimum + maximumRatio * (unZoomedMaximum - unZoomedMinimum));
void SetLocalX(const double &val)
void Draw(Option_t *opt="") override
void SetStyle(Style_t style)
void SetBinX(const int &val)
void SetHist(const TH1 *val)
void SetLineX(double x1, double x2, double y1, double y2)
void SetColor(Color_t color)
TSinglePeak * fPeak
the peak to be fit (will be a class that inherits from TSinglePeak)
TGNumberEntry * fBGEntryHigh1
TPeakFitter * fPeakFitter
the peak fitter that fPeak is added to
TGNumberEntry * fGateEntryLow
TRootEmbeddedCanvas * fProjectionCanvas
TGHorizontalFrame * fButtonFrame
Double_t fPeakLowLimit
lower limit for peak slider range
TGVerticalFrame * fProjectionFrame
void DoProjectionCanvasZoomed()
TGHSlider * fBinningSlider
TGDoubleHSlider * fBGSlider2
TGCheckButton * fBGCheckButton1
TGNumberEntry * fBGEntryHigh2
TGTextEntry * fWrite2FileName
void UpdateProjectionSliders()
TGTextButton * fWrite2FileButton
TGCheckButton * fAutoUpdateCheckButton
GMarker * fHighGateMarker
void StatusInfo(Int_t event, Int_t px, Int_t py, TObject *selected)
TGNumberEntry * fBGEntryLow2
void SetStatusFromUpdateCheckButton()
void UpdateBinningSlider()
TGHorizontalFrame * fPeakFitFrame
TBGSubtraction(TH2 *mat, const char *gate_axis="x", int maxBinning=20)
TGDoubleHSlider * fBGSlider1
TGHorizontalFrame * fBGEntryFrame1
TGHorizontalFrame * fDescriptionFrame
TGHorizontalFrame * fBinningFrame
TGStatusBar * fProjectionStatus
TGHorizontalFrame * fBGParamFrame
void DrawBGMarkers(TGCheckButton *&check_button, GMarker *&low_marker, GMarker *&high_marker, TGNumberEntry *&low_entry, TGNumberEntry *&high_entry, Color_t color=kBlue)
Int_t fMaxBinning
maximum binning possible with binning slider (hard-coded, for now?)
TGTextEntry * fHistogramDescription
TGTextButton * fPeakFitButton
Double_t fPeakHighLimit
upper limit for peak slider range
TGDoubleHSlider * fGateSlider
void DoGateCanvasZoomed()
TGLayoutHints * fLayoutCanvases
TGLayoutHints * fLayoutParam
TGNumberEntry * fBGParamEntry
void ProjectionStatusInfo(Int_t event, Int_t px, Int_t py, TObject *selected)
TGNumberEntry * fBGEntryLow1
GMarker * fHighPeakMarker
TGCheckButton * fBGCheckButton2
Double_t fPeakValue
centroid for fit
@ kHistogramDescriptionEntry
TRootEmbeddedCanvas * fGateCanvas
Double_t fPeakHighValue
high range for fit
void InitializeInterface()
TGTripleHSlider * fPeakSlider
TGHorizontalFrame * fGateEntryFrame
void GateStatusInfo(Int_t event, Int_t px, Int_t py, TObject *selected)
Double_t fPeakLowValue
low range for fit
TGNumberEntry * fGateEntryHigh
void DoSlider(Int_t pos=0)
TGVerticalFrame * fGateFrame
TGHorizontalFrame * fBGEntryFrame2
void RemovePeak(TSinglePeak *peak)
void SetRange(const Double_t &low, const Double_t &high)
void AddPeak(TSinglePeak *peak)
TFitResultPtr Fit(TH1 *fit_hist, Option_t *opt="")
void Draw(Option_t *opt="") override
virtual void Centroid(const Double_t ¢roid)=0