From 41301bd988ba75406bf1318d4e9f6b331b988248 Mon Sep 17 00:00:00 2001 From: Andreas Suter Date: Sat, 6 Jun 2026 16:54:46 +0200 Subject: [PATCH] PRunDataHandler: replace tokenizer TObjArray/TObjString with PStringUtils Convert all TString::Tokenize() call sites to PStringUtils::Split. The persisted RunSummary TObjArray (read from the MusrRoot file via FindObjectAny and iterated with TObjArrayIter) and the run-title TObjString returned by TLemRunHeader::GetRunTitle() remain ROOT types, since they come from external interfaces / on-disk format, not from tokenization. Co-Authored-By: Claude Opus 4.8 --- src/classes/PRunDataHandler.cpp | 543 ++++++++------------------------ 1 file changed, 126 insertions(+), 417 deletions(-) diff --git a/src/classes/PRunDataHandler.cpp b/src/classes/PRunDataHandler.cpp index 5131dd1c9..9011b10c7 100644 --- a/src/classes/PRunDataHandler.cpp +++ b/src/classes/PRunDataHandler.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -58,6 +59,7 @@ #include "TLemRunHeader.h" #include "MuSR_td_PSI_bin.h" #include "mud.h" +#include "PStringUtils.h" #ifdef PNEXUS_ENABLED #include "PNeXus.h" @@ -1168,30 +1170,22 @@ Bool_t PRunDataHandler::FileExistsCheck(PMsrRunBlock &runInfo, const UInt_t idx) if (pathName.CompareTo("???") == 0) { // not found in local directory and xml path str = TString(musrpath); // MUSRFULLDATAPATH has the structure: path_1:path_2:...:path_n - TObjArray *tokens = str.Tokenize(":"); - TObjString *ostr; - for (Int_t i=0; iGetEntries(); i++) { - ostr = dynamic_cast(tokens->At(i)); - str = ostr->GetString() + TString("/") + *runInfo.GetRunName(idx); + std::vector tokens = PStringUtils::Split(str.Data(), ":"); + for (UInt_t i=0; i tokens = PStringUtils::Split(str.Data(), ":"); pstr = runInfo.GetInstitute(idx); if (pstr == nullptr) { std::cerr << std::endl << ">> PRunDataHandler::FileExistsCheck: **ERROR** Couldn't obtain institute data." << std::endl; @@ -1206,9 +1200,8 @@ Bool_t PRunDataHandler::FileExistsCheck(PMsrRunBlock &runInfo, const UInt_t idx) } pstr->ToUpper(); runInfo.SetBeamline(*pstr, idx); - for (Int_t i=0; iGetEntries(); i++) { - ostr = dynamic_cast(tokens->At(i)); - str = ostr->GetString() + TString("/DATA/") + + for (UInt_t i=0; iGetEntries(); i++) { - ostr = dynamic_cast(tokens->At(i)); - str = ostr->GetString() + TString("/") + fln; + std::vector tokens = PStringUtils::Split(str.Data(), ":"); + for (UInt_t i=0; iAccessPathName(str.Data())!=true) { // found pathName = str; break; } } - // cleanup - if (tokens) { - delete tokens; - tokens = nullptr; - } } // no proper path name found if (pathName.CompareTo("???") == 0) { @@ -1374,21 +1355,14 @@ Bool_t PRunDataHandler::FileExistsCheck(const TString fileName) if (pathName.CompareTo("???") == 0) { // not found in local directory and xml path str = TString(musrpath); // MUSRFULLDATAPATH has the structure: path_1:path_2:...:path_n - TObjArray *tokens = str.Tokenize(":"); - TObjString *ostr; - for (Int_t i=0; iGetEntries(); i++) { - ostr = dynamic_cast(tokens->At(i)); - str = ostr->GetString() + TString("/") + fileName; + std::vector tokens = PStringUtils::Split(str.Data(), ":"); + for (UInt_t i=0; iAccessPathName(str.Data())!=true) { // found pathName = str; break; } } - // cleanup - if (tokens) { - delete tokens; - tokens = nullptr; - } } // no proper path name found if (pathName.CompareTo("???") == 0) { @@ -1544,97 +1518,22 @@ Bool_t PRunDataHandler::ReadRootFile() TString s; TObjArrayIter summIter(runSummary); TObjString *os(dynamic_cast(summIter.Next())); - TObjArray *oa(nullptr); - TObjString *objTok(nullptr); while (os != nullptr) { s = os->GetString(); - // will put four parallel if's since it may be that more than one RA-values are on one line - if (s.Contains("RA-L")) { - oa = s.Tokenize(" "); - TObjArrayIter lineIter(oa); - objTok = dynamic_cast(lineIter.Next()); - while (objTok != nullptr) { - if (!objTok->GetString().CompareTo("RA-L")) { - objTok = dynamic_cast(lineIter.Next()); // "=" - if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { - objTok = dynamic_cast(lineIter.Next()); // HV value - runData.SetRingAnode(0, objTok->GetString().Atof()); // fill RA-R value into the runData structure - break; - } - } - objTok = dynamic_cast(lineIter.Next()); // next token... - } - // clean up - if (oa) { - delete oa; - oa = nullptr; - } - } - - if (s.Contains("RA-R")) { - oa = s.Tokenize(" "); - TObjArrayIter lineIter(oa); - objTok = dynamic_cast(lineIter.Next()); - while (objTok != nullptr){ - if (!objTok->GetString().CompareTo("RA-R")) { - objTok = dynamic_cast(lineIter.Next()); // "=" - if (objTok != nullptr && !objTok->GetString().CompareTo("=")) { - objTok = dynamic_cast(lineIter.Next()); // HV value - runData.SetRingAnode(1, objTok->GetString().Atof()); // fill RA-R value into the runData structure - break; - } - } - objTok = dynamic_cast(lineIter.Next()); // next token... - } - // clean up - if (oa) { - delete oa; - oa = nullptr; - } - } - - if (s.Contains("RA-T")) { - oa = s.Tokenize(" "); - TObjArrayIter lineIter(oa); - objTok = dynamic_cast(lineIter.Next()); - while (objTok != nullptr){ - if (!objTok->GetString().CompareTo("RA-T")) { - objTok = dynamic_cast(lineIter.Next()); // "=" - if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { - objTok = dynamic_cast(lineIter.Next()); // HV value - runData.SetRingAnode(2, objTok->GetString().Atof()); // fill RA-T value into the runData structure - break; - } - } - objTok = dynamic_cast(lineIter.Next()); // next token... - } - // clean up - if (oa) { - delete oa; - oa = nullptr; - } - } - - if (s.Contains("RA-B")) { - oa = s.Tokenize(" "); - TObjArrayIter lineIter(oa); - objTok = dynamic_cast(lineIter.Next()); - while (objTok != nullptr){ - if (!objTok->GetString().CompareTo("RA-B")) { - objTok = dynamic_cast(lineIter.Next()); // "=" - if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { - objTok = dynamic_cast(lineIter.Next()); // HV value - runData.SetRingAnode(3, objTok->GetString().Atof()); // fill RA-B value into the runData structure - break; - } - } - objTok = dynamic_cast(lineIter.Next()); // next token... - } - // clean up - if (oa) { - delete oa; - oa = nullptr; - } + // a summary line has the structure 'RA-L = val RA-R = val ...', i.e. the value + // follows two tokens after the tag. More than one RA-value may be on one line. + std::vector oa = PStringUtils::Split(s.Data(), " "); + for (UInt_t k=0; k+2 < oa.size(); k++) { + if (oa[k+1] != "=") + continue; + if (oa[k] == "RA-L") + runData.SetRingAnode(0, TString(oa[k+2]).Atof()); + else if (oa[k] == "RA-R") + runData.SetRingAnode(1, TString(oa[k+2]).Atof()); + else if (oa[k] == "RA-T") + runData.SetRingAnode(2, TString(oa[k+2]).Atof()); + else if (oa[k] == "RA-B") + runData.SetRingAnode(3, TString(oa[k+2]).Atof()); } os = dynamic_cast(summIter.Next()); // next summary line... @@ -1962,97 +1861,22 @@ Bool_t PRunDataHandler::ReadRootFile() TString s; TObjArrayIter summIter(runSummary); TObjString *os(dynamic_cast(summIter.Next())); - TObjArray *oa(nullptr); - TObjString *objTok(nullptr); while (os != nullptr) { s = os->GetString(); - // will put four parallel if's since it may be that more than one RA-values are on one line - if (s.Contains("RA-L")) { - oa = s.Tokenize(" "); - TObjArrayIter lineIter(oa); - objTok = dynamic_cast(lineIter.Next()); - while (objTok != nullptr) { - if (!objTok->GetString().CompareTo("RA-L")) { - objTok = dynamic_cast(lineIter.Next()); // "=" - if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { - objTok = dynamic_cast(lineIter.Next()); // HV value - runData.SetRingAnode(0, objTok->GetString().Atof()); // fill RA-R value into the runData structure - break; - } - } - objTok = dynamic_cast(lineIter.Next()); // next token... - } - // clean up - if (oa) { - delete oa; - oa = nullptr; - } - } - - if (s.Contains("RA-R")) { - oa = s.Tokenize(" "); - TObjArrayIter lineIter(oa); - objTok = dynamic_cast(lineIter.Next()); - while (objTok != nullptr){ - if (!objTok->GetString().CompareTo("RA-R")) { - objTok = dynamic_cast(lineIter.Next()); // "=" - if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { - objTok = dynamic_cast(lineIter.Next()); // HV value - runData.SetRingAnode(1, objTok->GetString().Atof()); // fill RA-R value into the runData structure - break; - } - } - objTok = dynamic_cast(lineIter.Next()); // next token... - } - // clean up - if (oa) { - delete oa; - oa = nullptr; - } - } - - if (s.Contains("RA-T")) { - oa = s.Tokenize(" "); - TObjArrayIter lineIter(oa); - objTok = dynamic_cast(lineIter.Next()); - while (objTok != nullptr){ - if (!objTok->GetString().CompareTo("RA-T")) { - objTok = dynamic_cast(lineIter.Next()); // "=" - if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { - objTok = dynamic_cast(lineIter.Next()); // HV value - runData.SetRingAnode(2, objTok->GetString().Atof()); // fill RA-T value into the runData structure - break; - } - } - objTok = dynamic_cast(lineIter.Next()); // next token... - } - // clean up - if (oa) { - delete oa; - oa = nullptr; - } - } - - if (s.Contains("RA-B")) { - oa = s.Tokenize(" "); - TObjArrayIter lineIter(oa); - objTok = dynamic_cast(lineIter.Next()); - while (objTok != nullptr){ - if (!objTok->GetString().CompareTo("RA-B")) { - objTok = dynamic_cast(lineIter.Next()); // "=" - if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) { - objTok = dynamic_cast(lineIter.Next()); // HV value - runData.SetRingAnode(3, objTok->GetString().Atof()); // fill RA-B value into the runData structure - break; - } - } - objTok = dynamic_cast(lineIter.Next()); // next token... - } - // clean up - if (oa) { - delete oa; - oa = nullptr; - } + // a summary line has the structure 'RA-L = val RA-R = val ...', i.e. the value + // follows two tokens after the tag. More than one RA-value may be on one line. + std::vector oa = PStringUtils::Split(s.Data(), " "); + for (UInt_t k=0; k+2 < oa.size(); k++) { + if (oa[k+1] != "=") + continue; + if (oa[k] == "RA-L") + runData.SetRingAnode(0, TString(oa[k+2]).Atof()); + else if (oa[k] == "RA-R") + runData.SetRingAnode(1, TString(oa[k+2]).Atof()); + else if (oa[k] == "RA-T") + runData.SetRingAnode(2, TString(oa[k+2]).Atof()); + else if (oa[k] == "RA-B") + runData.SetRingAnode(3, TString(oa[k+2]).Atof()); } os = dynamic_cast(summIter.Next()); // next summary line... @@ -2454,8 +2278,7 @@ Bool_t PRunDataHandler::ReadWkmFile() // read data --------------------------------------------------------- UInt_t group_counter = 0; Int_t val; - TObjArray *tokens; - TObjString *ostr; + std::vector tokens; TString str; UInt_t histoNo = 0; PRawRunDataSet dataSet; @@ -2489,30 +2312,22 @@ Bool_t PRunDataHandler::ReadWkmFile() f.getline(instr, sizeof(instr)); continue; } - tokens = line.Tokenize(" "); + tokens = PStringUtils::Split(line.Data(), " "); - if (!tokens) { // no tokens found + if (tokens.empty()) { // no tokens found std::cerr << std::endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: coulnd't tokenize run data."; return false; } - for (Int_t i=0; iGetEntries(); i++) { - ostr = dynamic_cast(tokens->At(i)); - str = ostr->GetString(); + for (UInt_t i=0; i> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: data line contains non-integer values."; - // clean up - delete tokens; return false; } } - // clean up - if (tokens) { - delete tokens; - tokens = nullptr; - } } f.getline(instr, sizeof(instr)); @@ -2523,29 +2338,21 @@ Bool_t PRunDataHandler::ReadWkmFile() if (strlen(instr) != 0) { // extract values line = TString(instr); - tokens = line.Tokenize(" "); - if (!tokens) { // no tokens found + tokens = PStringUtils::Split(line.Data(), " "); + if (tokens.empty()) { // no tokens found std::cerr << std::endl << ">> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: coulnd't tokenize run data."; return false; } - for (Int_t i=0; iGetEntries(); i++) { - ostr = dynamic_cast(tokens->At(i)); - str = ostr->GetString(); + for (UInt_t i=0; i> PRunDataHandler::ReadWkmFile(): **ERROR** while reading data: data line contains non-integer values."; - // clean up - delete tokens; return false; } } - // clean up - if (tokens) { - delete tokens; - tokens = nullptr; - } } // save the last histo if not empty @@ -3242,8 +3049,7 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() Bool_t headerTag = false; Bool_t dataTag = false; Int_t dataLineCounter = 0; - TObjString *ostr; - TObjArray *tokens = nullptr; + std::vector tokens; TString str; Int_t groups = 0; Int_t channels = 0; @@ -3287,9 +3093,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() if (workStr.BeginsWith("title:", TString::kIgnoreCase)) { runData.SetRunTitle(TString(workStr.Data()+workStr.First(":")+2)); } else if (workStr.BeginsWith("field:", TString::kIgnoreCase)) { - tokens = workStr.Tokenize(":("); // field: val (units) + tokens = PStringUtils::Split(workStr.Data(), ":("); // field: val (units) // check if expected number of tokens present - if (tokens->GetEntries() != 3) { + if (tokens.size() != 3) { std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", invalid field entry in header."; std::cerr << std::endl << ">> " << line.Data(); std::cerr << std::endl; @@ -3297,9 +3103,8 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() break; } // check if field value is a number - ostr = dynamic_cast(tokens->At(1)); - if (ostr->GetString().IsFloat()) { - dval = ostr->GetString().Atof(); + if (TString(tokens[1]).IsFloat()) { + dval = TString(tokens[1]).Atof(); } else { std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", field value is not float/doulbe."; std::cerr << std::endl << ">> " << line.Data(); @@ -3308,10 +3113,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() break; } // check units, accept (G), (T) - ostr = dynamic_cast(tokens->At(2)); - if (ostr->GetString().Contains("G")) + if (TString(tokens[2]).Contains("G")) unitScaling = 1.0; - else if (ostr->GetString().Contains("T")) + else if (TString(tokens[2]).Contains("T")) unitScaling = 1.0e4; else { std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", unkown field units."; @@ -3320,17 +3124,11 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() success = false; break; } - runData.SetField(dval*unitScaling); - - // clean up tokens - if (tokens) { - delete tokens; - tokens = nullptr; - } + runData.SetField(dval*unitScaling); } else if (workStr.BeginsWith("temp:", TString::kIgnoreCase)) { - tokens = workStr.Tokenize(":("); // temp: val (units) + tokens = PStringUtils::Split(workStr.Data(), ":("); // temp: val (units) // check if expected number of tokens present - if (tokens->GetEntries() != 3) { + if (tokens.size() != 3) { std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", invalid temperatue entry in header."; std::cerr << std::endl << ">> " << line.Data(); std::cerr << std::endl; @@ -3338,9 +3136,8 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() break; } // check if field value is a number - ostr = dynamic_cast(tokens->At(1)); - if (ostr->GetString().IsFloat()) { - dval = ostr->GetString().Atof(); + if (TString(tokens[1]).IsFloat()) { + dval = TString(tokens[1]).Atof(); } else { std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", temperature value is not float/doulbe."; std::cerr << std::endl << ">> " << line.Data(); @@ -3348,13 +3145,7 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() success = false; break; } - runData.SetTemperature(0, dval, 0.0); - - // clean up tokens - if (tokens) { - delete tokens; - tokens = nullptr; - } + runData.SetTemperature(0, dval, 0.0); } else if (workStr.BeginsWith("setup:", TString::kIgnoreCase)) { runData.SetSetup(TString(workStr.Data()+workStr.First(":")+2)); } else if (workStr.BeginsWith("groups:", TString::kIgnoreCase)) { @@ -3377,9 +3168,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() break; } } else if (workStr.BeginsWith("resolution:", TString::kIgnoreCase)) { - tokens = workStr.Tokenize(":("); // resolution: val (units) + tokens = PStringUtils::Split(workStr.Data(), ":("); // resolution: val (units) // check if expected number of tokens present - if (tokens->GetEntries() != 3) { + if (tokens.size() != 3) { std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", invalid time resolution entry in header."; std::cerr << std::endl << line.Data(); std::cerr << std::endl; @@ -3387,9 +3178,8 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() break; } // check if timeresolution value is a number - ostr = dynamic_cast(tokens->At(1)); - if (ostr->GetString().IsFloat()) { - dval = ostr->GetString().Atof(); + if (TString(tokens[1]).IsFloat()) { + dval = TString(tokens[1]).Atof(); } else { std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", time resolution value is not float/doulbe."; std::cerr << std::endl << ">> " << line.Data(); @@ -3398,14 +3188,13 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() break; } // check units, accept (fs), (ps), (ns), (us) - ostr = dynamic_cast(tokens->At(2)); - if (ostr->GetString().Contains("fs")) + if (TString(tokens[2]).Contains("fs")) unitScaling = 1.0e-6; - else if (ostr->GetString().Contains("ps")) + else if (TString(tokens[2]).Contains("ps")) unitScaling = 1.0e-3; - else if (ostr->GetString().Contains("ns")) + else if (TString(tokens[2]).Contains("ns")) unitScaling = 1.0; - else if (ostr->GetString().Contains("us")) + else if (TString(tokens[2]).Contains("us")) unitScaling = 1.0e3; else { std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", unkown time resolution units."; @@ -3414,13 +3203,7 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() success = false; break; } - runData.SetTimeResolution(dval*unitScaling); - - // clean up tokens - if (tokens) { - delete tokens; - tokens = nullptr; - } + runData.SetTimeResolution(dval*unitScaling); } else { // error std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** line no " << lineNo << ", illegal header line."; std::cerr << std::endl; @@ -3429,9 +3212,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() } } else if (dataTag) { dataLineCounter++; - tokens = line.Tokenize(" ,\t"); + tokens = PStringUtils::Split(line.Data(), " ,\t"); // check if the number of data line entries is correct - if (tokens->GetEntries() != groups+1) { + if (static_cast(tokens.size()) != groups+1) { std::cerr << std::endl << ">> PRunDataHandler::ReadMduAsciiFile **ERROR** found data line with a wrong data format, cannot be handled (line no " << lineNo << ")"; std::cerr << std::endl << ">> line:"; std::cerr << std::endl << ">> " << line.Data(); @@ -3439,16 +3222,9 @@ Bool_t PRunDataHandler::ReadMduAsciiFile() success = false; break; } - - for (Int_t i=1; iGetEntries(); i++) { - ostr = dynamic_cast(tokens->At(i)); - data[i-1].push_back(ostr->GetString().Atof()); - } - - // clean up tokens - if (tokens) { - delete tokens; - tokens = nullptr; + + for (UInt_t i=1; i tokens = PStringUtils::Split(line.Data(), " ,\t"); // check if the number of data line entries is 2 or 3 - if ((tokens->GetEntries() != 2) && (tokens->GetEntries() != 3)) { + if ((tokens.size() != 2) && (tokens.size() != 3)) { std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** found data line with a structure different than \"x, y [, error y]\", cannot be handled (line no " << lineNo << ")"; std::cerr << std::endl; success = false; @@ -3655,35 +3429,32 @@ Bool_t PRunDataHandler::ReadAsciiFile() } // get x - ostr = dynamic_cast(tokens->At(0)); - if (!ostr->GetString().IsFloat()) { - std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": x = " << ostr->GetString().Data() << " is not a number, sorry."; + if (!TString(tokens[0]).IsFloat()) { + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": x = " << tokens[0] << " is not a number, sorry."; std::cerr << std::endl; success = false; break; } - x = ostr->GetString().Atof(); + x = TString(tokens[0]).Atof(); // get y - ostr = dynamic_cast(tokens->At(1)); - if (!ostr->GetString().IsFloat()) { - std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": y = " << ostr->GetString().Data() << " is not a number, sorry."; + if (!TString(tokens[1]).IsFloat()) { + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": y = " << tokens[1] << " is not a number, sorry."; std::cerr << std::endl; success = false; break; } - y = ostr->GetString().Atof(); + y = TString(tokens[1]).Atof(); // get error y if present - if (tokens->GetEntries() == 3) { - ostr = dynamic_cast(tokens->At(2)); - if (!ostr->GetString().IsFloat()) { - std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": error y = " << ostr->GetString().Data() << " is not a number, sorry."; + if (tokens.size() == 3) { + if (!TString(tokens[2]).IsFloat()) { + std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **ERROR** line no " << lineNo << ": error y = " << tokens[2] << " is not a number, sorry."; std::cerr << std::endl; success = false; break; } - ey = ostr->GetString().Atof(); + ey = TString(tokens[2]).Atof(); if (ey == 0) { std::cerr << std::endl << ">> PRunDataHandler::ReadAsciiFile **WARNING** line no " << lineNo << ": error y = 0 which doesn't make sense. Will set it to 1.0. Please check!!"; std::cerr << std::endl; @@ -3695,12 +3466,6 @@ Bool_t PRunDataHandler::ReadAsciiFile() ey = 1.0; } - // clean up tokens - if (tokens) { - delete tokens; - tokens = nullptr; - } - // keep values xVec.push_back(x); exVec.push_back(1.0); @@ -3878,8 +3643,7 @@ Bool_t PRunDataHandler::ReadDBFile() // variables needed to tokenize strings TString tstr; - TObjString *ostr; - TObjArray *tokens = nullptr; + std::vector tokens; while (!f.eof()) { // get next line from file @@ -3915,16 +3679,9 @@ Bool_t PRunDataHandler::ReadDBFile() dbTag = 4; // filter out all data tags - tokens = workStr.Tokenize(" ,\t"); - for (Int_t i=1; iGetEntries(); i++) { - ostr = dynamic_cast(tokens->At(i)); - runData.fDataNonMusr.AppendDataTag(ostr->GetString()); - } - - // clean up tokens - if (tokens) { - delete tokens; - tokens = nullptr; + tokens = PStringUtils::Split(workStr.Data(), " ,\t"); + for (UInt_t i=1; i(tokens->At(0)); - if (!ostr->GetString().IsFloat()) { + tokens = PStringUtils::Split(workStr.Data(), ","); + if (!TString(tokens[0]).IsFloat()) { labelledFormat = true; } else { labelledFormat = false; } - // clean up tokens - if (tokens) { - delete tokens; - tokens = nullptr; - } // prepare data vector for use PDoubleVector dummy; @@ -3990,15 +3741,13 @@ Bool_t PRunDataHandler::ReadDBFile() return false; } // split string in tokens - tokens = workStr.Tokenize(","); // line has structure: runNo,,, runTitle - ostr = dynamic_cast(tokens->At(0)); - tstr = ostr->GetString(); + tokens = PStringUtils::Split(workStr.Data(), ","); // line has structure: runNo,,, runTitle + tstr = TString(tokens[0]); if (!tstr.IsFloat()) { std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; std::cerr << std::endl << ">> " << workStr.Data(); std::cerr << std::endl << ">> Expected db-data line with structure: runNo,,, runTitle"; std::cerr << std::endl << ">> runNo = " << tstr.Data() << ", seems to be not a number."; - delete tokens; return false; } val = tstr.Atof(); @@ -4008,35 +3757,30 @@ Bool_t PRunDataHandler::ReadDBFile() // remove all possible spaces workStr.ReplaceAll(" ", ""); // split string in tokens - tokens = workStr.Tokenize("=,"); // line has structure: tag = val,err1,err2, - if (tokens->GetEntries() < 3) { + tokens = PStringUtils::Split(workStr.Data(), "=,"); // line has structure: tag = val,err1,err2, + if (tokens.size() < 3) { std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; std::cerr << std::endl << ">> " << workStr.Data(); std::cerr << std::endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; - delete tokens; return false; } - ostr = dynamic_cast(tokens->At(0)); - tstr = ostr->GetString(); + tstr = TString(tokens[0]); idx = GetDataTagIndex(tstr, runData.fDataNonMusr.GetDataTags()); if (idx == -1) { std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; std::cerr << std::endl << ">> " << workStr.Data(); std::cerr << std::endl << ">> data tag error: " << tstr.Data() << " seems not present in the data tag list"; - delete tokens; return false; } - switch (tokens->GetEntries()) { + switch (tokens.size()) { case 3: // tag = val,,, - ostr = dynamic_cast(tokens->At(1)); - tstr = ostr->GetString(); + tstr = TString(tokens[1]); if (!tstr.IsFloat()) { std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; std::cerr << std::endl << ">> " << workStr.Data(); std::cerr << std::endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; std::cerr << std::endl << ">> val = " << tstr.Data() << ", seems to be not a number."; - delete tokens; return false; } val = tstr.Atof(); @@ -4046,27 +3790,23 @@ Bool_t PRunDataHandler::ReadDBFile() case 4: // tag = val,err,, case 5: // tag = val,err1,err2, // handle val - ostr = dynamic_cast(tokens->At(1)); - tstr = ostr->GetString(); + tstr = TString(tokens[1]); if (!tstr.IsFloat()) { std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; std::cerr << std::endl << ">> " << workStr.Data(); std::cerr << std::endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; std::cerr << std::endl << ">> val = " << tstr.Data() << ", seems to be not a number."; - delete tokens; return false; } val = tstr.Atof(); runData.fDataNonMusr.AppendSubData(idx, val); // handle err1 (err2 will be ignored for the time being) - ostr = dynamic_cast(tokens->At(2)); - tstr = ostr->GetString(); + tstr = TString(tokens[2]); if (!tstr.IsFloat()) { std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; std::cerr << std::endl << ">> " << workStr.Data(); std::cerr << std::endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; std::cerr << std::endl << ">> err1 = " << tstr.Data() << ", seems to be not a number."; - delete tokens; return false; } val = tstr.Atof(); @@ -4076,42 +3816,37 @@ Bool_t PRunDataHandler::ReadDBFile() std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; std::cerr << std::endl << ">> " << workStr.Data(); std::cerr << std::endl << ">> Expected db-data line with structure: tag = val,err1,err2,\\"; - delete tokens; return false; } } } else { // handle row formated data // split string in tokens - tokens = workStr.Tokenize(","); // line has structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle - if (tokens->GetEntries() != static_cast(3*runData.fDataNonMusr.GetDataTags()->size()+1)) { + tokens = PStringUtils::Split(workStr.Data(), ","); // line has structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle + if (tokens.size() != 3*runData.fDataNonMusr.GetDataTags()->size()+1) { std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; std::cerr << std::endl << ">> " << workStr.Data(); std::cerr << std::endl << ">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle"; - std::cerr << std::endl << ">> found = " << tokens->GetEntries() << " tokens, however expected " << 3*runData.fDataNonMusr.GetDataTags()->size()+1; + std::cerr << std::endl << ">> found = " << tokens.size() << " tokens, however expected " << 3*runData.fDataNonMusr.GetDataTags()->size()+1; std::cerr << std::endl << ">> Perhaps there are commas without space inbetween, like 12.3,, 3.2,..."; - delete tokens; return false; } // extract data Int_t j=0; - for (Int_t i=0; iGetEntries()-1; i+=3) { + for (UInt_t i=0; i+1(tokens->At(i)); - tstr = ostr->GetString(); + tstr = TString(tokens[i]); if (!tstr.IsFloat()) { std::cerr << std::endl << ">> PRunDataHandler::ReadDBFile **ERROR** in line no " << lineNo << ":"; std::cerr << std::endl << ">> " << workStr.Data(); std::cerr << std::endl << ">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle"; std::cerr << std::endl << ">> value=" << tstr.Data() << " seems not to be a number"; - delete tokens; return false; } runData.fDataNonMusr.AppendSubData(j, tstr.Atof()); // handle 1st error if present (2nd will be ignored for now) - ostr = dynamic_cast(tokens->At(i+1)); - tstr = ostr->GetString(); + tstr = TString(tokens[i+1]); if (tstr.IsWhitespace()) { runData.fDataNonMusr.AppendSubErrData(j, 1.0); } else if (tstr.IsFloat()) { @@ -4121,7 +3856,6 @@ Bool_t PRunDataHandler::ReadDBFile() std::cerr << std::endl << ">> " << workStr.Data(); std::cerr << std::endl << ">> Expected db-data line with structure: val1, err11, err12, ..., valn, errn1, errn2, runNo, , , , runTitle"; std::cerr << std::endl << ">> error1=" << tstr.Data() << " seems not to be a number"; - delete tokens; return false; } j++; @@ -4141,10 +3875,6 @@ Bool_t PRunDataHandler::ReadDBFile() std::cerr << std::endl << ">> number of LABELS found = " << runData.fDataNonMusr.GetLabels()->size(); std::cerr << std::endl << ">> number of Data tags found = " << runData.fDataNonMusr.GetDataTags()->size(); std::cerr << std::endl << ">> They have to be equal!!"; - if (tokens) { - delete tokens; - tokens = nullptr; - } return false; } @@ -4168,12 +3898,6 @@ Bool_t PRunDataHandler::ReadDBFile() } } - // clean up tokens - if (tokens) { - delete tokens; - tokens = nullptr; - } - // keep run name runData.SetRunName(fRunName); @@ -4218,8 +3942,7 @@ Bool_t PRunDataHandler::ReadDatFile() // variables needed to tokenize strings TString tstr; - TObjString *ostr; - TObjArray *tokens = nullptr; + std::vector tokens; UInt_t noOfDataSets = 0, noOfEntries = 0; PBoolVector isData; @@ -4239,8 +3962,8 @@ Bool_t PRunDataHandler::ReadDatFile() if (line.IsWhitespace()) continue; - tokens = line.Tokenize(" \t"); - if (tokens == nullptr) { // error + tokens = PStringUtils::Split(line.Data(), " \t"); + if (tokens.empty()) { // error std::cerr << std::endl << ">> PRunDataHandler::ReadDatFile **ERROR** couldn't tokenize the line, in lineNo: " << lineNo; std::cerr << std::endl << ">> line: '" << line << "'."; std::cerr << std::endl; @@ -4253,10 +3976,9 @@ Bool_t PRunDataHandler::ReadDatFile() // filter out all data tags: this labels are used in the msr-file to select the proper data set // for the dat-files, label and dataTag are the same - noOfEntries = tokens->GetEntries(); - for (Int_t i=0; i(tokens->At(i)); - tstr = ostr->GetString(); + noOfEntries = tokens.size(); + for (UInt_t i=0; iGetEntries() != noOfEntries) { // error - std::cerr << std::endl << ">> PRunDataHandler::ReadDatFile **ERROR** data set with wrong number of entries: " << tokens->GetEntries() << ", should be " << noOfEntries << "."; + if (tokens.size() != noOfEntries) { // error + std::cerr << std::endl << ">> PRunDataHandler::ReadDatFile **ERROR** data set with wrong number of entries: " << tokens.size() << ", should be " << noOfEntries << "."; std::cerr << std::endl << ">> in line: " << lineNo; std::cerr << std::endl << ">> line: '" << line << "'."; std::cerr << std::endl; @@ -4285,8 +4007,7 @@ Bool_t PRunDataHandler::ReadDatFile() UInt_t idx = 0; for (UInt_t i=0; i(tokens->At(i)); - tstr = ostr->GetString(); + tstr = TString(tokens[i]); if (!tstr.IsFloat()) { // make sure it is a number std::cerr << std::endl << ">> PRunDataHandler::ReadDatFile **ERROR** data set entry is not a number: " << tstr.Data(); std::cerr << std::endl << ">> in line: " << lineNo; @@ -4310,11 +4031,6 @@ Bool_t PRunDataHandler::ReadDatFile() } } } - // cleanup - if (tokens) { - delete tokens; - tokens = nullptr; - } } f.close(); @@ -6636,8 +6352,6 @@ TString PRunDataHandler::FileNameFromTemplate(TString &fileNameTemplate, Int_t r { TString result(""); - TObjArray *tok=nullptr; - TObjString *ostr; TString str; // check year string @@ -6660,19 +6374,18 @@ TString PRunDataHandler::FileNameFromTemplate(TString &fileNameTemplate, Int_t r } // tokenize template string - tok = fileNameTemplate.Tokenize("[]"); - if (tok == nullptr) { + std::vector tok = PStringUtils::Split(fileNameTemplate.Data(), "[]"); + if (tok.empty()) { std::cerr << std::endl << ">> PRunDataHandler::FileNameFromTemplate: **ERROR** couldn't tokenize template!" << std::endl; return result; } - if (tok->GetEntries()==1) { + if (tok.size()==1) { std::cerr << std::endl << ">> PRunDataHandler::FileNameFromTemplate: **WARNING** template without tags." << std::endl; } // go through the tokens and generate the result string - for (Int_t i=0; iGetEntries(); i++) { - ostr = dynamic_cast(tok->At(i)); - str = ostr->GetString(); + for (UInt_t i=0; i