switched PMusrCanvas where possible to smart pointers.

This commit is contained in:
suter_a 2023-10-21 17:47:32 +02:00
parent 93754a9fc2
commit dbfadc4e42
2 changed files with 29 additions and 163 deletions

View File

@ -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; i<fData.size(); i++)
CleanupDataSet(fData[i]);
@ -322,11 +269,6 @@ PMusrCanvas::~PMusrCanvas()
CleanupDataSet(fNonMusrData[i]);
fNonMusrData.clear();
}
if (fMultiGraphLegend) {
fMultiGraphLegend->Clear();
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<TLatex>();
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<TString>("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<TString>("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<TStyle>(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<TCanvas>(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<TGPopupMenu>();
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<TPaveText>(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<TPad>("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<TPaveText>(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<TPaveText>(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<TLegend>(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; i<plotInfo.fRuns.size(); i++) {
runNo = (UInt_t)plotInfo.fRuns[i]-1;
@ -6110,12 +5982,6 @@ void PMusrCanvas::PlotFourierDifference(Bool_t unzoom)
*/
void PMusrCanvas::PlotFourierPhaseValue(Bool_t unzoom)
{
// check if phase TLatex object is present
if (fCurrentFourierPhaseText) {
delete fCurrentFourierPhaseText;
fCurrentFourierPhaseText = nullptr;
}
double x, y;
TString str;
@ -6127,7 +5993,7 @@ void PMusrCanvas::PlotFourierPhaseValue(Bool_t unzoom)
}
x = 0.7;
y = 0.85;
fCurrentFourierPhaseText = new TLatex();
fCurrentFourierPhaseText.reset(new TLatex());
fCurrentFourierPhaseText->SetNDC(kTRUE);
fCurrentFourierPhaseText->SetText(x, y, str.Data());
fCurrentFourierPhaseText->SetTextFont(62);

View File

@ -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<TLatex> fCurrentFourierPhaseText; ///< used in Re/Im Fourier to show the current phase in the pad
std::unique_ptr<TString> fRRFText; ///< RRF information
std::unique_ptr<TLatex> fRRFLatexText; ///< used to display RRF info
TStyle *fStyle; ///< A collection of all graphics attributes
std::unique_ptr<TStyle> 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<TTimer> 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<TGPopupMenu> 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<TCanvas> fMainCanvas; ///< main canvas
std::unique_ptr<TPaveText> fTitlePad; ///< title pad used to display a title
std::unique_ptr<TPad> fDataTheoryPad; ///< data/theory pad used to display the data/theory
std::unique_ptr<TPaveText> fParameterPad; ///< parameter pad used to display the fitting parameters
std::unique_ptr<TPaveText> fTheoryPad; ///< theory pad used to display the theory and functions
std::unique_ptr<TLegend> fInfoPad; ///< info pad used to display a legend of the data plotted
std::unique_ptr<TLegend> 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