From 08a5812736f0455037f7eb8e7372c2851243027a Mon Sep 17 00:00:00 2001 From: Andreas Suter Date: Fri, 13 Oct 2023 11:56:52 +0200 Subject: [PATCH] replaced raw pointers by smart pointers for musrfit.cpp. --- src/musrfit.cpp | 110 +++++++++++------------------------------------- 1 file changed, 25 insertions(+), 85 deletions(-) diff --git a/src/musrfit.cpp b/src/musrfit.cpp index 3ce6abcc..b8256e8e 100644 --- a/src/musrfit.cpp +++ b/src/musrfit.cpp @@ -45,6 +45,7 @@ #include #include +#include #include #include @@ -146,7 +147,7 @@ void musrfit_write_ascii(TString fln, PRunData *data, int runCounter) // generate dump file name TString count("_"); count += runCounter; - Ssiz_t index = fln.Index("."); + Ssiz_t index = fln.Last('.'); fln.Insert(index, count); std::ofstream f; @@ -289,14 +290,14 @@ void musrfit_write_root(TFile &f, TString fln, PRunData *data, int runCounter) snprintf(name, sizeof(name),"c%d", runCounter); - TCanvas *c = new TCanvas(name, title.Data(), 10, 10, 800, 600); + std::unique_ptr c = std::unique_ptr(new TCanvas(name, title.Data(), 10, 10, 800, 600)); // create histos Double_t diff = data->GetDataTimeStep(); Double_t start = -diff/2.0; Double_t end = data->GetDataTimeStep()*data->GetValue()->size(); - TH1F *hdata = new TH1F("hdata", "run data", data->GetValue()->size(), start, end); - TH1F *htheo = new TH1F("htheo", "run theory", data->GetValue()->size(), start, end); + std::unique_ptr hdata = std::unique_ptr(new TH1F("hdata", "run data", data->GetValue()->size(), start, end)); + std::unique_ptr htheo = std::unique_ptr(new TH1F("htheo", "run theory", data->GetValue()->size(), start, end)); // fill data for (unsigned int i=0; iGetValue()->size(); i++) { @@ -312,21 +313,7 @@ void musrfit_write_root(TFile &f, TString fln, PRunData *data, int runCounter) htheo->SetLineWidth(3); htheo->Draw("C SAME"); - f.WriteTObject(c); - - // clean up - if (hdata) { - delete hdata; - hdata = nullptr; - } - if (htheo) { - delete htheo; - htheo = nullptr; - } - if (c) { - delete c; - c = nullptr; - } + f.WriteTObject(c.get()); } //-------------------------------------------------------------------------- @@ -631,40 +618,22 @@ int main(int argc, char *argv[]) // read startup file char startup_path_name[128]; - TSAXParser *saxParser = new TSAXParser(); - PStartupHandler *startupHandler = new PStartupHandler(); + std::unique_ptr saxParser(new TSAXParser()); + std::unique_ptr startupHandler(new PStartupHandler()); if (!startupHandler->StartupFileFound()) { std::cerr << std::endl << ">> musrfit **WARNING** couldn't find " << startupHandler->GetStartupFilePath().Data(); std::cerr << std::endl; - // clean up - if (saxParser) { - delete saxParser; - saxParser = nullptr; - } - if (startupHandler) { - delete startupHandler; - startupHandler = nullptr; - } } else { strcpy(startup_path_name, startupHandler->GetStartupFilePath().Data()); - saxParser->ConnectToHandler("PStartupHandler", startupHandler); + saxParser->ConnectToHandler("PStartupHandler", startupHandler.get()); //status = saxParser->ParseFile(startup_path_name); // parsing the file as above seems to lead to problems in certain environments; // use the parseXmlFile function instead (see PStartupHandler.cpp for the definition) - status = parseXmlFile(saxParser, startup_path_name); + status = parseXmlFile(saxParser.get(), startup_path_name); // check for parse errors if (status) { // error std::cerr << std::endl << ">> musrfit **WARNING** Reading/parsing musrfit_startup.xml failed."; std::cerr << std::endl; - // clean up - if (saxParser) { - delete saxParser; - saxParser = nullptr; - } - if (startupHandler) { - delete startupHandler; - startupHandler = nullptr; - } } } @@ -674,11 +643,11 @@ int main(int argc, char *argv[]) #endif // read msr-file - PMsrHandler *msrHandler = nullptr; + std::unique_ptr msrHandler; if (startupHandler) - msrHandler = new PMsrHandler(filename, &startup_options); + msrHandler = std::unique_ptr(new PMsrHandler(filename, &startup_options)); else - msrHandler = new PMsrHandler(filename); + msrHandler = std::unique_ptr(new PMsrHandler(filename)); status = msrHandler->ReadMsrFile(); if (status != PMUSR_SUCCESS) { switch (status) { @@ -694,13 +663,13 @@ int main(int argc, char *argv[]) } return status; } - + // read all the necessary runs (raw data) - PRunDataHandler *dataHandler; + std::unique_ptr dataHandler; if (startupHandler) - dataHandler = new PRunDataHandler(msrHandler, startupHandler->GetDataPathList()); + dataHandler = std::unique_ptr(new PRunDataHandler(msrHandler.get(), startupHandler->GetDataPathList())); else - dataHandler = new PRunDataHandler(msrHandler); + dataHandler = std::unique_ptr(new PRunDataHandler(msrHandler.get())); dataHandler->ReadData(); @@ -718,10 +687,10 @@ int main(int argc, char *argv[]) } // generate the necessary fit histogramms for the fit - PRunListCollection *runListCollection = nullptr; + std::unique_ptr runListCollection; if (success) { // feed all the necessary histogramms for the fit - runListCollection = new PRunListCollection(msrHandler, dataHandler); + runListCollection = std::unique_ptr(new PRunListCollection(msrHandler.get(), dataHandler.get())); for (unsigned int i=0; i < msrHandler->GetMsrRunList()->size(); i++) { success = runListCollection->Add(i, kFit); if (!success) { @@ -733,19 +702,19 @@ int main(int argc, char *argv[]) } // start timeout thread - TThread *th = nullptr; + std::unique_ptr th; if (timeout_enabled) { pid_t musrfit_pid = getpid(); - th = new TThread(musrfit_timeout, (void*)&musrfit_pid); + th = std::unique_ptr(new TThread(musrfit_timeout, (void*)&musrfit_pid)); if (th) { th->Run(); } } // do fitting - PFitter *fitter = nullptr; + std::unique_ptr fitter; if (success) { - fitter = new PFitter(msrHandler, runListCollection, chisq_only); + fitter = std::unique_ptr(new PFitter(msrHandler.get(), runListCollection.get(), chisq_only)); if (fitter->IsValid()) { fitter->DoFit(); if (!fitter->IsScanOnly()) @@ -785,9 +754,9 @@ int main(int argc, char *argv[]) std::cout << std::endl << "will write dump file ..." << std::endl; dump.ToLower(); if (dump.Contains("ascii")) - musrfit_dump_ascii(filename, runListCollection); + musrfit_dump_ascii(filename, runListCollection.get()); else if (dump.Contains("root")) - musrfit_dump_root(filename, runListCollection); + musrfit_dump_root(filename, runListCollection.get()); else std::cout << std::endl << "do not know format " << dump.Data() << ", sorry :-| " << std::endl; } @@ -830,35 +799,6 @@ int main(int argc, char *argv[]) } } - // clean up - if (th) { - th->Delete(); - } - if (saxParser) { - delete saxParser; - saxParser = nullptr; - } - if (startupHandler) { - delete startupHandler; - startupHandler = nullptr; - } - if (msrHandler) { - delete msrHandler; - msrHandler = nullptr; - } - if (dataHandler) { - delete dataHandler; - dataHandler = nullptr; - } - if (runListCollection) { - delete runListCollection; - runListCollection = nullptr; - } - if (fitter) { - delete fitter; - fitter = nullptr; - } - std::cout << std::endl << "done ..." << std::endl; return PMUSR_SUCCESS;