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 <noreply@anthropic.com>
This commit is contained in:
2026-06-06 16:54:46 +02:00
parent 6cb69a78a7
commit 41301bd988
+126 -417
View File
@@ -42,6 +42,7 @@
#include <string>
#include <sstream>
#include <memory>
#include <vector>
#include <TROOT.h>
#include <TSystem.h>
@@ -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; i<tokens->GetEntries(); i++) {
ostr = dynamic_cast<TObjString*>(tokens->At(i));
str = ostr->GetString() + TString("/") + *runInfo.GetRunName(idx);
std::vector<std::string> tokens = PStringUtils::Split(str.Data(), ":");
for (UInt_t i=0; i<tokens.size(); i++) {
str = TString(tokens[i]) + TString("/") + *runInfo.GetRunName(idx);
TestFileName(str, ext);
if (!str.IsNull()) {
pathName = str;
break;
}
}
// cleanup
if (tokens) {
delete tokens;
tokens = nullptr;
}
}
// check if the file is found in the generated default path
if (pathName.CompareTo("???") == 0) { // not found in MUSRFULLDATAPATH search
str = TString(musrpath);
// MUSRFULLDATAPATH has the structure: path_1:path_2:...:path_n
TObjArray *tokens = str.Tokenize(":");
TObjString *ostr;
std::vector<std::string> 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; i<tokens->GetEntries(); i++) {
ostr = dynamic_cast<TObjString*>(tokens->At(i));
str = ostr->GetString() + TString("/DATA/") +
for (UInt_t i=0; i<tokens.size(); i++) {
str = TString(tokens[i]) + TString("/DATA/") +
*runInfo.GetInstitute(idx) + TString("/") +
*runInfo.GetBeamline(idx) + TString("/") +
*runInfo.GetRunName(idx);
@@ -1218,11 +1211,6 @@ Bool_t PRunDataHandler::FileExistsCheck(PMsrRunBlock &runInfo, const UInt_t idx)
break;
}
}
// clean up
if (tokens) {
delete tokens;
tokens = nullptr;
}
}
// no proper path name found
@@ -1307,21 +1295,14 @@ Bool_t PRunDataHandler::FileExistsCheck(const Bool_t fileName, const Int_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; i<tokens->GetEntries(); i++) {
ostr = dynamic_cast<TObjString*>(tokens->At(i));
str = ostr->GetString() + TString("/") + fln;
std::vector<std::string> tokens = PStringUtils::Split(str.Data(), ":");
for (UInt_t i=0; i<tokens.size(); i++) {
str = TString(tokens[i]) + TString("/") + fln;
if (gSystem->AccessPathName(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; i<tokens->GetEntries(); i++) {
ostr = dynamic_cast<TObjString*>(tokens->At(i));
str = ostr->GetString() + TString("/") + fileName;
std::vector<std::string> tokens = PStringUtils::Split(str.Data(), ":");
for (UInt_t i=0; i<tokens.size(); i++) {
str = TString(tokens[i]) + TString("/") + fileName;
if (gSystem->AccessPathName(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<TObjString*>(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<TObjString*>(lineIter.Next());
while (objTok != nullptr) {
if (!objTok->GetString().CompareTo("RA-L")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // "="
if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // HV value
runData.SetRingAnode(0, objTok->GetString().Atof()); // fill RA-R value into the runData structure
break;
}
}
objTok = dynamic_cast<TObjString*>(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<TObjString*>(lineIter.Next());
while (objTok != nullptr){
if (!objTok->GetString().CompareTo("RA-R")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // "="
if (objTok != nullptr && !objTok->GetString().CompareTo("=")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // HV value
runData.SetRingAnode(1, objTok->GetString().Atof()); // fill RA-R value into the runData structure
break;
}
}
objTok = dynamic_cast<TObjString*>(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<TObjString*>(lineIter.Next());
while (objTok != nullptr){
if (!objTok->GetString().CompareTo("RA-T")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // "="
if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // HV value
runData.SetRingAnode(2, objTok->GetString().Atof()); // fill RA-T value into the runData structure
break;
}
}
objTok = dynamic_cast<TObjString*>(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<TObjString*>(lineIter.Next());
while (objTok != nullptr){
if (!objTok->GetString().CompareTo("RA-B")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // "="
if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // HV value
runData.SetRingAnode(3, objTok->GetString().Atof()); // fill RA-B value into the runData structure
break;
}
}
objTok = dynamic_cast<TObjString*>(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<std::string> 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<TObjString*>(summIter.Next()); // next summary line...
@@ -1962,97 +1861,22 @@ Bool_t PRunDataHandler::ReadRootFile()
TString s;
TObjArrayIter summIter(runSummary);
TObjString *os(dynamic_cast<TObjString*>(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<TObjString*>(lineIter.Next());
while (objTok != nullptr) {
if (!objTok->GetString().CompareTo("RA-L")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // "="
if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // HV value
runData.SetRingAnode(0, objTok->GetString().Atof()); // fill RA-R value into the runData structure
break;
}
}
objTok = dynamic_cast<TObjString*>(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<TObjString*>(lineIter.Next());
while (objTok != nullptr){
if (!objTok->GetString().CompareTo("RA-R")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // "="
if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // HV value
runData.SetRingAnode(1, objTok->GetString().Atof()); // fill RA-R value into the runData structure
break;
}
}
objTok = dynamic_cast<TObjString*>(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<TObjString*>(lineIter.Next());
while (objTok != nullptr){
if (!objTok->GetString().CompareTo("RA-T")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // "="
if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // HV value
runData.SetRingAnode(2, objTok->GetString().Atof()); // fill RA-T value into the runData structure
break;
}
}
objTok = dynamic_cast<TObjString*>(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<TObjString*>(lineIter.Next());
while (objTok != nullptr){
if (!objTok->GetString().CompareTo("RA-B")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // "="
if ((objTok != nullptr) && !objTok->GetString().CompareTo("=")) {
objTok = dynamic_cast<TObjString*>(lineIter.Next()); // HV value
runData.SetRingAnode(3, objTok->GetString().Atof()); // fill RA-B value into the runData structure
break;
}
}
objTok = dynamic_cast<TObjString*>(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<std::string> 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<TObjString*>(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<std::string> 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; i<tokens->GetEntries(); i++) {
ostr = dynamic_cast<TObjString*>(tokens->At(i));
str = ostr->GetString();
for (UInt_t i=0; i<tokens.size(); i++) {
str = tokens[i];
val = ToInt(str, ok);
if (ok) {
histoData.push_back(val);
} else {
std::cerr << std::endl << ">> 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; i<tokens->GetEntries(); i++) {
ostr = dynamic_cast<TObjString*>(tokens->At(i));
str = ostr->GetString();
for (UInt_t i=0; i<tokens.size(); i++) {
str = tokens[i];
val = ToInt(str, ok);
if (ok) {
histoData.push_back(val);
} else {
std::cerr << std::endl << ">> 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<std::string> 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<TObjString*>(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<TObjString*>(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<TObjString*>(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<TObjString*>(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<TObjString*>(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<Int_t>(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; i<tokens->GetEntries(); i++) {
ostr = dynamic_cast<TObjString*>(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.size(); i++) {
data[i-1].push_back(TString(tokens[i]).Atof());
}
}
}
@@ -3638,16 +3414,14 @@ Bool_t PRunDataHandler::ReadAsciiFile()
} else if (dataTag) {
if (line.IsWhitespace()) // ignore empty lines
continue;
TObjString *ostr;
TObjArray *tokens;
// Remove trailing end of line
line.Remove(TString::kTrailing, '\r');
line.Remove(TString::kTrailing, '\r');
// check if data have x, y [, error y] structure, and that x, y, and error y are numbers
tokens = line.Tokenize(" ,\t");
std::vector<std::string> 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<TObjString*>(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<TObjString*>(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<TObjString*>(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<std::string> 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; i<tokens->GetEntries(); i++) {
ostr = dynamic_cast<TObjString*>(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.size(); i++) {
runData.fDataNonMusr.AppendDataTag(TString(tokens[i]));
}
continue;
}
@@ -3954,18 +3711,12 @@ Bool_t PRunDataHandler::ReadDBFile()
// check if first real data line
if (firstData) {
// check if data are given just as rows are as labelled columns (see description above)
tokens = workStr.Tokenize(",");
ostr = dynamic_cast<TObjString*>(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<TObjString*>(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<TObjString*>(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<TObjString*>(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<TObjString*>(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<TObjString*>(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<Int_t>(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; i<tokens->GetEntries()-1; i+=3) {
for (UInt_t i=0; i+1<tokens.size(); i+=3) {
// handle value
ostr = dynamic_cast<TObjString*>(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<TObjString*>(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<std::string> 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<noOfEntries; i++) {
ostr = dynamic_cast<TObjString*>(tokens->At(i));
tstr = ostr->GetString();
noOfEntries = tokens.size();
for (UInt_t i=0; i<noOfEntries; i++) {
tstr = TString(tokens[i]);
if (!tstr.EndsWith("Err", TString::kExact)) {
noOfDataSets++;
isData.push_back(true);
@@ -4274,8 +3996,8 @@ Bool_t PRunDataHandler::ReadDatFile()
std::cerr << std::endl;
return false;
}
if (tokens->GetEntries() != 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<noOfEntries; i++) {
// 1st: check that entry is indeed a number
ostr = dynamic_cast<TObjString*>(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<std::string> 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; i<tok->GetEntries(); i++) {
ostr = dynamic_cast<TObjString*>(tok->At(i));
str = ostr->GetString();
for (UInt_t i=0; i<tok.size(); i++) {
str = TString(tok[i]);
// check tokens
if (!str.CompareTo("yy", TString::kExact)) { // check for 'yy'
@@ -6700,10 +6413,6 @@ TString PRunDataHandler::FileNameFromTemplate(TString &fileNameTemplate, Int_t r
}
}
// clean up
if (tok)
delete tok;
// everything fine here
ok = true;