From dbfadc4e427a33bffa1fdc5f4cb81ca3b79724f3 Mon Sep 17 00:00:00 2001 From: Andreas Suter Date: Sat, 21 Oct 2023 17:47:32 +0200 Subject: [PATCH] switched PMusrCanvas where possible to smart pointers. --- src/classes/PMusrCanvas.cpp | 166 ++++-------------------------------- src/include/PMusrCanvas.h | 26 +++--- 2 files changed, 29 insertions(+), 163 deletions(-) diff --git a/src/classes/PMusrCanvas.cpp b/src/classes/PMusrCanvas.cpp index b52b0017..47026d1b 100644 --- a/src/classes/PMusrCanvas.cpp +++ b/src/classes/PMusrCanvas.cpp @@ -119,7 +119,6 @@ ClassImpQ(PMusrCanvas) PMusrCanvas::PMusrCanvas() { fTimeout = 0; - fTimeoutTimer = nullptr; fScaleN0AndBkg = true; fValid = false; @@ -134,16 +133,6 @@ PMusrCanvas::PMusrCanvas() fImp = nullptr; fBar = nullptr; fPopupMain = nullptr; - fPopupFourier = nullptr; - - fStyle = nullptr; - fMainCanvas = nullptr; - fTitlePad = nullptr; - fDataTheoryPad = nullptr; - fParameterPad = nullptr; - fTheoryPad = nullptr; - fInfoPad = nullptr; - fMultiGraphLegend = nullptr; fHistoFrame = nullptr; @@ -153,11 +142,6 @@ PMusrCanvas::PMusrCanvas() InitFourier(); InitAverage(); - fCurrentFourierPhaseText = nullptr; - - fRRFText = nullptr; - fRRFLatexText = nullptr; - fXRangePresent = false; fYRangePresent = false; fXmin = 0.0; @@ -193,7 +177,6 @@ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, fBatchMode(batch), fPlotNumber(number) { fTimeout = 0; - fTimeoutTimer = nullptr; fAveragedView = false; fMultiGraphData = nullptr; @@ -206,11 +189,6 @@ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, CreateStyle(); InitMusrCanvas(title, wtopx, wtopy, ww, wh); - fCurrentFourierPhaseText = nullptr; - - fRRFText = nullptr; - fRRFLatexText = nullptr; - fXRangePresent = false; fYRangePresent = false; fXmin = 0.0; @@ -252,7 +230,6 @@ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, fMarkerList(markerList), fColorList(colorList) { fTimeout = 0; - fTimeoutTimer = nullptr; fMultiGraphData = nullptr; fMultiGraphDiff = nullptr; @@ -263,11 +240,6 @@ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, CreateStyle(); InitMusrCanvas(title, wtopx, wtopy, ww, wh); - fCurrentFourierPhaseText = nullptr; - - fRRFText = nullptr; - fRRFLatexText = nullptr; - fXRangePresent = false; fYRangePresent = false; fXmin = 0.0; @@ -287,31 +259,6 @@ PMusrCanvas::PMusrCanvas(const Int_t number, const Char_t* title, PMusrCanvas::~PMusrCanvas() { // cleanup - if (fTimeoutTimer) { - delete fTimeoutTimer; - fTimeoutTimer = nullptr; - } - if (fCurrentFourierPhaseText) { - delete fCurrentFourierPhaseText; - fCurrentFourierPhaseText = nullptr; - } - if (fRRFLatexText) { - delete fRRFLatexText; - fRRFLatexText = nullptr; - } - if (fRRFText) { - delete fRRFText; - fRRFText = nullptr; - } - if (fStyle) { - delete fStyle; - fStyle = nullptr; - } - if (fTitlePad) { - fTitlePad->Clear(); - delete fTitlePad; - fTitlePad = nullptr; - } if (fData.size() > 0) { for (UInt_t i=0; iClear(); - delete fMultiGraphLegend; - fMultiGraphLegend = nullptr; - } if (fMultiGraphData) { delete fMultiGraphData; fMultiGraphData = nullptr; @@ -335,29 +277,6 @@ PMusrCanvas::~PMusrCanvas() delete fMultiGraphDiff; fMultiGraphDiff = nullptr; } - if (fDataTheoryPad) { - delete fDataTheoryPad; - fDataTheoryPad = nullptr; - } - if (fParameterPad) { - fParameterPad->Clear(); - delete fParameterPad; - fParameterPad = nullptr; - } - if (fTheoryPad) { - fTheoryPad->Clear(); - delete fTheoryPad; - fTheoryPad = nullptr; - } - if (fInfoPad) { - fInfoPad->Clear(); - delete fInfoPad; - fInfoPad = nullptr; - } - if (fMainCanvas) { - delete fMainCanvas; - fMainCanvas = nullptr; - } } //-------------------------------------------------------------------------- @@ -409,7 +328,7 @@ void PMusrCanvas::SetMsrHandler(PMsrHandler *msrHandler) (fMsrHandler->GetMsrPlotList()->at(0).fRRFFreq != 0.0)) || (fMsrHandler->GetMsrGlobal()->GetRRFPacking() > 0 && fMsrHandler->GetMsrGlobal()->GetRRFUnit().CompareTo("??"))) { - fRRFLatexText = new TLatex(); + fRRFLatexText = std::make_unique(); fRRFLatexText->SetNDC(kTRUE); fRRFLatexText->SetTextFont(62); fRRFLatexText->SetTextSize(0.03); @@ -417,7 +336,7 @@ void PMusrCanvas::SetMsrHandler(PMsrHandler *msrHandler) Int_t rrfUnitTag = -1; Double_t rrfFreq = 0.0; if (fMsrHandler->GetMsrPlotList()->at(0).fRRFPacking > 0) { // RRF single histo PLOT - fRRFText = new TString("RRF: "); + fRRFText = std::make_unique("RRF: "); rrfUnitTag = fMsrHandler->GetMsrPlotList()->at(0).fRRFUnit; rrfFreq = fMsrHandler->GetMsrPlotList()->at(0).fRRFFreq; TString rrfFreqStr(""); @@ -446,7 +365,7 @@ void PMusrCanvas::SetMsrHandler(PMsrHandler *msrHandler) *fRRFText += TString(", RRF packing = "); *fRRFText += fMsrHandler->GetMsrPlotList()->at(0).fRRFPacking; } else { // RRF single histo FIT - fRRFText = new TString("RRF: "); + fRRFText = std::make_unique("RRF: "); rrfUnitTag = fMsrHandler->GetMsrGlobal()->GetRRFUnitTag(); rrfFreq = fMsrHandler->GetMsrGlobal()->GetRRFFreq(fMsrHandler->GetMsrGlobal()->GetRRFUnit().Data()); TString rrfFreqStr(""); @@ -493,11 +412,7 @@ void PMusrCanvas::SetTimeout(Int_t timeout) if (fTimeout <= 0) return; - if (fTimeoutTimer) { - delete fTimeoutTimer; - fTimeoutTimer = nullptr; - } - fTimeoutTimer = new TTimer(); + fTimeoutTimer.reset(new TTimer()); fTimeoutTimer->Connect("Timeout()", "PMusrCanvas", this, "Done()"); @@ -1542,7 +1457,7 @@ void PMusrCanvas::LastCanvasClosed() void PMusrCanvas::WindowClosed() { // std::cerr << ">> fMainCanvas->GetName()=" << fMainCanvas->GetName() << std::endl; - gROOT->GetListOfCanvases()->Remove(fMainCanvas); + gROOT->GetListOfCanvases()->Remove(fMainCanvas.get()); LastCanvasClosed(); } @@ -2323,7 +2238,7 @@ void PMusrCanvas::CreateStyle() { TString musrStyle("musrStyle"); musrStyle += fPlotNumber; - fStyle = new TStyle(musrStyle, musrStyle); + fStyle = std::make_unique(musrStyle, musrStyle); fStyle->SetOptStat(0); // no statistics options fStyle->SetOptTitle(0); // no title fStyle->cd(); @@ -2407,25 +2322,11 @@ void PMusrCanvas::InitMusrCanvas(const Char_t* title, Int_t wtopx, Int_t wtopy, fImp = nullptr; fBar = nullptr; fPopupMain = nullptr; - fPopupFourier = nullptr; - - fMainCanvas = nullptr; - fTitlePad = nullptr; - fDataTheoryPad = nullptr; - fParameterPad = nullptr; - fTheoryPad = nullptr; - fInfoPad = nullptr; - fMultiGraphLegend = nullptr; // invoke canvas TString canvasName = TString("fMainCanvas"); canvasName += fPlotNumber; - fMainCanvas = new TCanvas(canvasName.Data(), title, wtopx, wtopy, ww, wh); - if (fMainCanvas == nullptr) { - std::cerr << std::endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke " << canvasName.Data(); - std::cerr << std::endl; - return; - } + fMainCanvas = std::make_unique(canvasName.Data(), title, wtopx, wtopy, ww, wh); fMainCanvas->Connect("Closed()", "PMusrCanvas", this, "LastCanvasClosed()"); @@ -2436,11 +2337,11 @@ void PMusrCanvas::InitMusrCanvas(const Char_t* title, Int_t wtopx, Int_t wtopy, fBar = fImp->GetMenuBar(); fPopupMain = fBar->AddPopup("&Musrfit"); - fPopupFourier = new TGPopupMenu(); + fPopupFourier = std::make_unique(); fPopupMain->AddEntry("&Data", P_MENU_ID_DATA+P_MENU_PLOT_OFFSET*fPlotNumber); fPopupMain->AddSeparator(); - fPopupMain->AddPopup("&Fourier", fPopupFourier); + fPopupMain->AddPopup("&Fourier", fPopupFourier.get()); fPopupFourier->AddEntry("Show Real", P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_REAL); fPopupFourier->AddEntry("Show Imag", P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_IMAG); fPopupFourier->AddEntry("Show Real+Imag", P_MENU_ID_FOURIER+P_MENU_PLOT_OFFSET*fPlotNumber+P_MENU_ID_FOURIER_REAL_AND_IMAG); @@ -2470,57 +2371,32 @@ void PMusrCanvas::InitMusrCanvas(const Char_t* title, Int_t wtopx, Int_t wtopy, // divide the canvas into 4 pads // title pad - fTitlePad = new TPaveText(0.0, YTITLE, 1.0, 1.0, "NDC"); - if (fTitlePad == nullptr) { - std::cerr << std::endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke fTitlePad"; - std::cerr << std::endl; - return; - } + fTitlePad = std::make_unique(0.0, YTITLE, 1.0, 1.0, "NDC"); fTitlePad->SetFillColor(TColor::GetColor(255,255,255)); fTitlePad->SetTextAlign(12); // middle, left fTitlePad->AddText(title); fTitlePad->Draw(); // data/theory pad - fDataTheoryPad = new TPad("dataTheoryPad", "dataTheoryPad", 0.0, YINFO, XTHEO, YTITLE); - if (fDataTheoryPad == nullptr) { - std::cerr << std::endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke fDataTheoryPad"; - std::cerr << std::endl; - return; - } + fDataTheoryPad = std::make_unique("dataTheoryPad", "dataTheoryPad", 0.0, YINFO, XTHEO, YTITLE); fDataTheoryPad->SetFillColor(TColor::GetColor(255,255,255)); fDataTheoryPad->Draw(); // parameter pad - fParameterPad = new TPaveText(XTHEO, 0.5, 1.0, YTITLE, "NDC"); - if (fParameterPad == nullptr) { - std::cerr << std::endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke fParameterPad"; - std::cerr << std::endl; - return; - } + fParameterPad = std::make_unique(XTHEO, 0.5, 1.0, YTITLE, "NDC"); fParameterPad->SetFillColor(TColor::GetColor(255,255,255)); fParameterPad->SetTextAlign(13); // top, left fParameterPad->SetTextFont(102); // courier bold, scalable so that greek parameters will be plotted properly // theory pad - fTheoryPad = new TPaveText(XTHEO, 0.1, 1.0, 0.5, "NDC"); - if (fTheoryPad == nullptr) { - std::cerr << std::endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke fTheoryPad"; - std::cerr << std::endl; - return; - } + fTheoryPad = std::make_unique(XTHEO, 0.1, 1.0, 0.5, "NDC"); fTheoryPad->SetFillColor(TColor::GetColor(255,255,255)); fTheoryPad->SetTextAlign(13); // top, left fTheoryPad->SetTextFont(102); // courier bold, scalable so that greek parameters will be plotted properly // info pad - fInfoPad = new TLegend(0.0, 0.0, 1.0, YINFO, "NDC"); - if (fInfoPad == nullptr) { - std::cerr << std::endl << ">> PMusrCanvas::PMusrCanvas(): **PANIC ERROR** Couldn't invoke fInfoPad"; - std::cerr << std::endl; - return; - } + fInfoPad = std::make_unique(0.0, 0.0, 1.0, YINFO, "NDC"); fInfoPad->SetFillColor(TColor::GetColor(255,255,255)); fInfoPad->SetTextAlign(12); // middle, left @@ -4913,11 +4789,7 @@ void PMusrCanvas::PlotData(Bool_t unzoom) // set y-axis label fMultiGraphData->GetYaxis()->SetTitle(yAxisTitle.Data()); } else { // more than one data set present, hence add a legend - if (fMultiGraphLegend) { - delete fMultiGraphLegend; - } - fMultiGraphLegend = new TLegend(0.8, 0.8, 1.0, 1.0); - assert(fMultiGraphLegend != nullptr); + fMultiGraphLegend.reset(new TLegend(0.8, 0.8, 1.0, 1.0)); PStringVector legendLabel; for (UInt_t i=0; iSetNDC(kTRUE); fCurrentFourierPhaseText->SetText(x, y, str.Data()); fCurrentFourierPhaseText->SetTextFont(62); diff --git a/src/include/PMusrCanvas.h b/src/include/PMusrCanvas.h index f24ff83e..14278665 100644 --- a/src/include/PMusrCanvas.h +++ b/src/include/PMusrCanvas.h @@ -255,28 +255,28 @@ class PMusrCanvas : public TObject, public TQObject Double_t fXmin, fXmax, fYmin, fYmax; ///< data/theory frame range PDoubleVector fCurrentFourierPhase; ///< holds the current Fourier phase(s) - TLatex *fCurrentFourierPhaseText; ///< used in Re/Im Fourier to show the current phase in the pad - TString *fRRFText; ///< RRF information - TLatex *fRRFLatexText; ///< used to display RRF info + std::unique_ptr fCurrentFourierPhaseText; ///< used in Re/Im Fourier to show the current phase in the pad + std::unique_ptr fRRFText; ///< RRF information + std::unique_ptr fRRFLatexText; ///< used to display RRF info - TStyle *fStyle; ///< A collection of all graphics attributes + std::unique_ptr fStyle; ///< A collection of all graphics attributes - TTimer *fTimeoutTimer; ///< timeout timer in order to terminate if no action is taking place for too long + std::unique_ptr fTimeoutTimer; ///< timeout timer in order to terminate if no action is taking place for too long // canvas menu related variables TRootCanvas *fImp; ///< ROOT native GUI version of main window with menubar and drawing area TGMenuBar *fBar; ///< menu bar TGPopupMenu *fPopupMain; ///< popup menu Musrfit in the main menu bar - TGPopupMenu *fPopupFourier; ///< popup menu of the Musrfit/Fourier sub menu + std::unique_ptr fPopupFourier; ///< popup menu of the Musrfit/Fourier sub menu // canvas related variables - TCanvas *fMainCanvas; ///< main canvas - TPaveText *fTitlePad; ///< title pad used to display a title - TPad *fDataTheoryPad; ///< data/theory pad used to display the data/theory - TPaveText *fParameterPad; ///< parameter pad used to display the fitting parameters - TPaveText *fTheoryPad; ///< theory pad used to display the theory and functions - TLegend *fInfoPad; ///< info pad used to display a legend of the data plotted - TLegend *fMultiGraphLegend; ///< used for non-muSR plots to display a legend + std::unique_ptr fMainCanvas; ///< main canvas + std::unique_ptr fTitlePad; ///< title pad used to display a title + std::unique_ptr fDataTheoryPad; ///< data/theory pad used to display the data/theory + std::unique_ptr fParameterPad; ///< parameter pad used to display the fitting parameters + std::unique_ptr fTheoryPad; ///< theory pad used to display the theory and functions + std::unique_ptr fInfoPad; ///< info pad used to display a legend of the data plotted + std::unique_ptr fMultiGraphLegend; ///< used for non-muSR plots to display a legend TH1F *fHistoFrame; ///< fHistoFrame is a 'global' frame needed in order to plot histograms with (potentially) different x-frames