KaliVeda  1.12/06
Heavy-Ion Analysis Toolkit
KVExpDB.cpp
Go to the documentation of this file.
1 //Created by KVClassFactory on Tue Jul 12 11:43:52 2016
2 //Author: bonnet,,,
3 
4 #include "KVExpDB.h"
5 #include "KVDBSystem.h"
6 #include "KVNumberList.h"
7 #include "TSystem.h"
8 #include <KVFileReader.h>
9 #include <iostream>
10 using namespace std;
11 
12 KVExpDB* gExpDB = nullptr;
13 
15 
16 
17 
20 void KVExpDB::init()
21 {
22  //default initialisations
23 
24  fRuns = AddTable("Runs", "List of available runs");
25  fRuns->SetDefaultFormat("Run %d"); // default format for run names
26  fSystems = AddTable("Systems", "List of available systems");
27 }
28 
29 
30 
33 
35  : KVDataBase()
36 {
37  // Default constructor
38 }
39 
40 
41 
42 
45 
47  : KVDataBase(name), fDataSet(name)
48 {
49  // Constructor inherited from KVDataBase
50  init();
51 }
52 
53 
54 
55 
58 
59 KVExpDB::KVExpDB(const Char_t* name, const Char_t* title)
60  : KVDataBase(name, title), fDataSet(name)
61 {
62  // Constructor inherited from KVDataBase
63  init();
64 }
65 
66 
67 
68 
71 
73 {
74  // Destructor
75  if (gExpDB == this) gExpDB = nullptr;
76 }
77 
78 
79 
85 
87  UInt_t last_run)
88 {
89  //If the KVDBRecord 'rec' (i.e. set of calibration parameters, reaction system, etc.) is
90  //associated to, or valid for, a range of runs, we use this method in order to link the record
91  //and the runs. The list of associated runs will be kept with the record, and each of the runs
92  //will have a link to the record.
93 
94  for (UInt_t ii = first_run; ii <= last_run; ii++) {
95  LinkRecordToRun(rec, ii);
96  }
97 }
98 
99 
105 
107 {
108  //If the KVDBRecord 'rec' (i.e. set of calibration parameters, reaction system, etc.) is
109  //associated to, or valid for, a range of runs, we use this method in order to link the record
110  //and the runs. The list of associated runs will be kept with the record, and each of the runs
111  //will have a link to the record.
112  nl.Begin();
113  while (!nl.End()) {
114  Int_t rr = nl.Next();
115  //Info("LinkRecordToRunRange","run number %d",rr);
116  LinkRecordToRun(rec, rr);
117  }
118 }
119 
120 
121 
123 
125 {
126 
127  KVDBRecord* run = 0;
128  if ((run = fRuns->GetRecord(rnumber)))
129  rec->AddLink("Runs", run);
130 
131 }
132 
133 
134 
142 
144  UInt_t run_ranges[][2])
145 {
146  //Call LinkRecordToRunRange for a set of run ranges stored in the two-dimensional array
147  //in the following way:
148  // run_ranges[0][0] = first run of first run range
149  // run_ranges[0][1] = last run of first run range
150  // run_ranges[1][0] = first run of second run range etc. etc.
151  //rr_number is the number of run ranges in the array
152 
153  for (UInt_t i = 0; i < rr_number; i++) {
154  LinkRecordToRunRange(rec, run_ranges[i][0], run_ranges[i][1]);
155  }
156 }
157 
158 
159 
162 
164  UInt_t run_ranges[][2])
165 {
166  //Link the records contained in the list to the set of runs (see LinkRecordToRunRanges).
167 
168  if (!list) {
169  Error("LinkListToRunRanges",
170  "NULL pointer passed for parameter TList");
171  return;
172  }
173  if (list->GetSize() == 0) {
174  Error("LinkListToRunRanges(TList*,UInt_t,UInt_t*)",
175  "The list is empty");
176  return;
177  }
178  TIter next(list);
179  KVDBRecord* rec;
180 
181  for (UInt_t ru_ra = 0; ru_ra < rr_number; ru_ra++) {
182  UInt_t first_run = run_ranges[ru_ra][0];
183  UInt_t last_run = run_ranges[ru_ra][1];
184  for (UInt_t i = first_run; i <= last_run; i++) {
185  KVDBRecord* run = GetDBRun(i);
186  while ((rec = (KVDBRecord*) next())) {
187  if (run)
188  rec->AddLink("Runs", run);
189  }
190  next.Reset();
191  }
192  }
193 }
194 
195 
198 
200 {
201  //Link the records contained in the list to the set of runs (see LinkRecordToRunRanges).
202 
203  if (!list) {
204  Error("LinkListToRunRange",
205  "NULL pointer passed for parameter TList");
206  return;
207  }
208  if (list->GetSize() == 0) {
209  Error("LinkListToRunRange(TList*,KVNumberList)",
210  "The list is empty");
211  return;
212  }
213  TIter next(list);
214  KVDBRecord* rec;
215  while ((rec = (KVDBRecord*) next())) {
216  LinkRecordToRunRange(rec, nl);
217  }
218 }
219 
220 
221 
247 
249 {
250  //Reads list of systems with associated run ranges, creates KVDBSystem
251  //records for these systems, and links them to the appropriate KVDBRun
252  //records using LinkListToRunRanges.
253  //
254  //There are 2 formats for the description of systems:
255  //
256  //+129Xe + natSn 25 MeV/A '+' indicates beginning of system description
257  //129 54 119 50 0.1 25.0 A,Z of projectile and target, target thickness (mg/cm2), beam energy (MeV/A)
258  //Run Range : 614 636 runs associated with system
259  //Run Range : 638 647 runs associated with system
260  //
261  //This is sufficient in the simple case where the experiment has a single
262  //layer target oriented perpendicular to the beam. However, for more
263  //complicated targets we can specify as follows :
264  //
265  //+155Gd + 238U 36 MeV/A
266  //155 64 238 92 0.1 36.0
267  //Target : 3 0.0 target with 3 layers, angle 0 degrees
268  //C 0.02 1st layer : carbon, 20 g/cm2
269  //238U 0.1 2nd layer : uranium-238, 100 g/cm2
270  //C 0.023 3rd layer : carbon, 23 g/cm2
271  //Run Range : 770 804
272  //
273  //Lines beginning '#' are comments.
274 
275 
276  std::ifstream fin;
277  if (OpenCalibFile("Systems", fin)) {
278  Info("ReadSystemList()", "Reading Systems parameters ...");
279 
280  TString line;
281 
282  char next_char = fin.peek();
283  while (next_char != '+' && fin.good()) {
284  line.ReadLine(fin, kFALSE);
285  next_char = fin.peek();
286  }
287 
288  while (fin.good() && !fin.eof() && next_char == '+') {
289  KVDBSystem* sys = new KVDBSystem("NEW SYSTEM");
290  AddSystem(sys);
291  sys->Load(fin);
292  next_char = fin.peek();
293  }
294  fin.close();
295  }
296  else {
297  Error("ReadSystemList()", "Could not open file %s",
298  GetCalibFileName("Systems").Data());
299  }
300  // if any runs are not associated with any system
301  // we create an 'unknown' system and associate it to all runs
302  KVDBSystem* sys = 0;
303  TIter nextRun(GetRuns());
304  KVDBRun* run;
305  while ((run = (KVDBRun*)nextRun())) {
306  if (!run->GetSystem()) {
307  if (!sys) {
308  sys = new KVDBSystem("[unknown]");
309  AddSystem(sys);
310  }
311  sys->AddRun(run);
312  }
313  }
314 
315  // rehash the record table now that all names are set
316  fSystems->Rehash();
317 }
318 
319 
320 
327 
329 {
330  //Write the 'Systems.dat' file for this database.
331  //The actual name of the file is given by the value of the environment variable
332  //[dataset_name].INDRADB.Systems (if it exists), otherwise the value of
333  //INDRADB.Systems is used. The file is written in the
334  //$KVROOT/[dataset_directory] directory.
335 
336  ofstream sysfile;
337  KVBase::SearchAndOpenKVFile(GetDBEnv("Systems"), sysfile, fDataSet.Data());
338  TIter next(GetSystems());
339  KVDBSystem* sys;
340  TDatime now;
341  sysfile << "# " << GetDBEnv("Systems") << " file written by "
342  << ClassName() << "::WriteSystemsFile on " << now.AsString() << endl;
343  cout << GetDBEnv("Systems") << " file written by "
344  << ClassName() << "::WriteSystemsFile on " << now.AsString() << endl;
345  while ((sys = (KVDBSystem*)next())) {
346  if (strcmp(sys->GetName(), "[unknown]")) { //do not write dummy 'unknown' system
347  sys->Save(sysfile);
348  sysfile << endl;
349  }
350  }
351  sysfile.close();
352 }
353 
354 
355 
360 
361 void KVExpDB::Save(const Char_t* what)
362 {
363  //Save (in the appropriate text file) the informations on:
364  // what = "Systems" : write Systems.dat file
365  // what = "Runlist" : write Runlist.csv
366  if (!strcmp(what, "Systems")) WriteSystemsFile();
367  else if (!strcmp(what, "Runlist")) WriteRunListFile();
368 }
369 
370 
371 
372 
380 
382 {
383  //Write a file containing a line describing each run in the database.
384  //The delimiter symbol used in each line is '|' by default.
385  //The first line of the file will be a header description, given by calling
386  //KVDBRun::WriteRunListHeader() for the first run in the database.
387  //Then we call KVDBRun::WriteRunListLine() for each run.
388  //These are virtual methods redefined by child classes of KVDBRun.
389 
390  ofstream rlistf;
391  KVBase::SearchAndOpenKVFile(GetDBEnv("Runlist"), rlistf, fDataSet.Data());
392  TDatime now;
393  rlistf << "# " << GetDBEnv("Runlist") << " file written by "
394  << ClassName() << "::WriteRunListFile on " << now.AsString() << endl;
395  cout << GetDBEnv("Runlist") << " file written by "
396  << ClassName() << "::WriteRunListFile on " << now.AsString() << endl;
397  if (GetRuns() && GetRuns()->GetEntries() > 0) {
398  TIter next_run(GetRuns());
399  //write header in file
400  ((KVDBRun*) GetRuns()->At(0))->WriteRunListHeader(rlistf, GetDBEnv("Runlist.Separator")[0]);
401  KVDBRun* run;
402  while ((run = (KVDBRun*) next_run())) {
403 
404  run->WriteRunListLine(rlistf, GetDBEnv("Runlist.Separator")[0]);
405 
406  }
407  }
408  else {
409  Warning("WriteRunListFile()", "run list is empty !!!");
410  }
411  rlistf.close();
412 }
413 
414 
415 
431 
432 Bool_t KVExpDB::OpenCalibFile(const Char_t* type, ifstream& fs) const
433 {
434  //Find and open calibration parameter file of given type. Return kTRUE if all OK.
435  //types are defined in $KVROOT/KVFiles/.kvrootrc by lines such as (use INDRA as example)
436  //
437  //# Default name for file describing systems for each dataset.
438  //INDRADB.Systems: Systems.dat
439  //
440  //A file with the given name will be looked for in the dataset calibration file
441  //directory given by GetDataSetDir()
442  //
443  //Filenames specific to a given dataset may also be defined:
444  //
445  //INDRA_camp5.INDRADB.Pedestals: Pedestals5.dat
446  //
447  //where 'INDRA_camp5' is the name of the dataset in question.
448 
450 }
451 
452 
453 
475 
476 Bool_t KVExpDB::FindCalibFile(const Char_t* type, TString& fullpath) const
477 {
478  //Find calibration parameter file of given type. Return kTRUE if all OK.
479  //In this case fullpath contains the full path to the file.
480  //
481  //Types are defined in $KVROOT/KVFiles/.kvrootrc by lines such as (use INDRA as example)
482  //
483  //~~~~
484  //# Default name for file describing systems for each dataset.
485  //INDRADB.Systems: Systems.dat
486  //~~~~
487  //
488  //A file with the given name will be looked for in the dataset calibration file
489  //directory given by GetDataSetDir()
490  //
491  //Filenames specific to a given dataset may also be defined:
492  //
493  //~~~~
494  //INDRA_camp5.INDRADB.Pedestals: Pedestals5.dat
495  //~~~~
496  //
497  //where 'INDRA_camp5' is the name of the dataset in question.
499 }
500 
501 
502 
503 
516 
518 {
519  // Print compact listing of runs in the number list like this:
520  //
521  // root [9] gIndraDB->PrintRuns("8100-8120")
522  // RUN SYSTEM TRIGGER EVENTS COMMENTS
523  // ------------------------------------------------------------------------------------------------------------------
524  // 8100 129Xe + 58Ni 8 MeV/A M>=2 968673
525  // 8101 129Xe + 58Ni 8 MeV/A M>=2 969166
526  // 8102 129Xe + 58Ni 8 MeV/A M>=2 960772
527  // 8103 129Xe + 58Ni 8 MeV/A M>=2 970029
528  // 8104 129Xe + 58Ni 8 MeV/A M>=2 502992 disjonction ht chassis 1
529  // 8105 129Xe + 58Ni 8 MeV/A M>=2 957015 intensite augmentee a 200 pA
530 
531  printf("RUN\tSYSTEM\t\t\t\tTRIGGER\t\tEVENTS\t\tCOMMENTS\n");
532  printf("------------------------------------------------------------------------------------------------------------------\n");
533  nl.Begin();
534  while (!nl.End()) {
535  KVDBRun* run = GetDBRun(nl.Next());
536  if (!run) continue;
537  printf("%4d\t%-30s\t%s\t\t%llu\t\t%s\n",
538  run->GetNumber(), (run->GetSystem() ? run->GetSystem()->GetName() : " "), run->GetTriggerString(),
539  run->GetEvents(), run->GetComments());
540  }
541 }
542 
543 
544 
546 
548 {
549  gExpDB = this;
550 }
551 
552 
553 
554 
568 
569 KVExpDB* KVExpDB::MakeDataBase(const Char_t* name, const Char_t* datasetdir)
570 {
571  //Static function which will create and 'Build' the database object corresponding to 'name'
572  //These are defined as 'Plugin' objects in the file $KVROOT/KVFiles/.kvrootrc :
573  //
574  // Plugin.KVExpDB: INDRA_camp1 KVDataBase1 KVIndra "KVDataBase1()"
575  // +Plugin.KVExpDB: INDRA_camp2 KVDataBase2 KVIndra "KVDataBase2()"
576  // +Plugin.KVExpDB: INDRA_camp4 KVDataBase4 KVIndra "KVDataBase4()"
577  // +Plugin.KVExpDB: INDRA_camp5 KVDataBase5 KVIndra5 "KVDataBase5()"
578  //
579  //The 'name' ("INDRA_camp1" etc.) corresponds to the name of a dataset in $KVROOT/KVFiles/manip.list
580  //This name is stored in member variable fDataSet.
581  //The constructors/macros used have arguments (const Char_t* name)
582 
583  //does plugin exist for given name ?
584  TPluginHandler* ph;
585  if (!(ph = KVBase::LoadPlugin("KVExpDB", name))) {
586  return 0;
587  }
588  //execute constructor/macro for database
589  KVExpDB* mda = (KVExpDB*) ph->ExecPlugin(1, name);
590  mda->SetDataSetDir(datasetdir);
591 
592  mda->Build();
593 
594  return mda;
595 }
596 
597 
598 
602 
603 ULong64_t KVExpDB::GetTotalEvents(int first_run, int last_run) const
604 {
605  // Return total number of events in range [first_run,last_run]
606  // (if last_run=-1, go to last known run)
607 
608  ULong64_t total = 0;
609  TIter next(GetRuns());
610  KVDBRun* dbr;
611  while ((dbr = (KVDBRun*)next())) {
612  if (dbr->GetNumber() >= first_run) {
613  if ((last_run > 0 && dbr->GetNumber() <= last_run)
614  || last_run == -1) total += dbr->GetEvents();
615  }
616  }
617  return total;
618 }
619 
620 
621 
624 
626 {
627  // Return total number of events for given system
628 
629  if (!GetSystem(system)) {
630  Error("GetTotalEvents", "No system with name : %s", system.Data());
631  return 0;
632  }
633  TIter it(GetSystem(system)->GetRuns());
634  ULong64_t total = 0;
635  KVDBRun* dbr;
636  while ((dbr = (KVDBRun*)it())) {
637  total += dbr->GetEvents();
638  }
639  return total;
640 }
641 
642 
643 
644 
649 
650 TString KVExpDB::GetDBEnv(const Char_t* type) const
651 {
652  //Will look for gEnv->GetValue name "name_of_dataset.fDBType.type",
653  //then "fDBType.type" if no dataset-specific value is found,
654  //then "EXPDB.type" if no database-specific value is found
655 
656  if (fDataSet == "") return "";
657  TString p = KVBase::GetDataSetEnv(fDataSet, Form("%s.%s", fDBType.Data(), type), "");
658  if (!p.Length()) return KVBase::GetDataSetEnv(fDataSet, Form("EXPDB.%s", type), "");
659  return p;
660 }
661 
662 
663 
675 
677 {
678  // Looks for file with name given by one of the following variables:
679  //
680  // [DBtype].Comments
681  // [dataset].[DBtype].Comments
682  //
683  // and opens it to read and add comments on runs.
684  // Format of file is:
685  //
686  // run=3830-3836 | really amazing data in these runs
687  //
688 
689  TString comments_file = GetCalibFileName("Comments");
690  if (comments_file == "") return;
691  TString fullpath;
692  if (!FindCalibFile("Comments", fullpath)) return;
693  Info("ReadComments", "Reading run comments in file %s...", fullpath.Data());
694 
695  KVFileReader fr;
696  if (!fr.OpenFileToRead(fullpath)) {
697  Error("ReadComments", "Problem opening file %s", fullpath.Data());
698  return;
699  }
700 
701  while (fr.IsOK()) {
702  fr.ReadLine("|");
703  if (fr.GetCurrentLine().BeginsWith("#")) {
704 
705  }
706  else if (fr.GetCurrentLine() == "") {
707 
708  }
709  else {
710  if (fr.GetNparRead() == 2) {
711  KVString srun(fr.GetReadPar(0));
712  srun.Begin("=");
713  srun.Next();
714  KVNumberList lruns(srun.Next());
715  KVString comments(fr.GetReadPar(1));
716  lruns.Begin();
717  while (!lruns.End()) {
718  Int_t run = lruns.Next();
719  KVDBRun* dbrun = GetDBRun(run);
720  if (dbrun)
721  dbrun->SetComments(comments.Data());
722  }
723  }
724  }
725  }
726 }
727 
728 
729 
int Int_t
unsigned int UInt_t
KVExpDB * gExpDB
Definition: KVExpDB.cpp:12
ClassImp(KVPartitionList) void KVPartitionList
Initialisation.
char Char_t
const Bool_t kFALSE
bool Bool_t
int type
char * Form(const char *fmt,...)
static const Char_t * GetDataSetEnv(const Char_t *dataset, const Char_t *type, const Char_t *defval)
Definition: KVBase.cpp:1582
static Bool_t SearchAndOpenKVFile(const Char_t *name, std::ifstream &file, const Char_t *kvsubdir="", KVLockfile *locks=0)
Definition: KVBase.cpp:601
static Bool_t SearchKVFile(const Char_t *name, TString &fullpath, const Char_t *kvsubdir="")
Definition: KVBase.cpp:541
static TPluginHandler * LoadPlugin(const Char_t *base, const Char_t *uri="0")
Definition: KVBase.cpp:756
Record folder for the database.
Definition: KVDBRecord.h:42
virtual Bool_t AddLink(const Char_t *key_name, KVDBRecord *rec, Bool_t linkback=kTRUE)
Definition: KVDBRecord.cpp:122
virtual Int_t GetNumber() const
Definition: KVDBRecord.h:72
Description of an experimental run in database ,.
Definition: KVDBRun.h:35
ULong64_t GetEvents() const
Definition: KVDBRun.h:133
void SetComments(const KVString &comments)
Definition: KVDBRun.h:181
KVDBSystem * GetSystem() const
Definition: KVDBRun.cpp:242
virtual void WriteRunListLine(std::ostream &, Char_t delim='|') const
Definition: KVDBRun.cpp:96
const Char_t * GetTriggerString() const
Definition: KVDBRun.h:107
const Char_t * GetComments() const
Definition: KVDBRun.h:146
Database class used to store information on different colliding systems studied during an experiment.
Definition: KVDBSystem.h:51
virtual void Save(std::ostream &) const
Definition: KVDBSystem.cpp:258
void AddRun(KVDBRecord *)
Definition: KVDBSystem.cpp:433
virtual void Load(std::istream &)
Definition: KVDBSystem.cpp:301
void Rehash(void)
Definition: KVDBTable.cpp:172
virtual KVDBRecord * GetRecord(const Char_t *rec_name) const
Definition: KVDBTable.h:57
Simple cross-referenced database structure.
Definition: KVDataBase.h:136
Base class to describe database of an experiment ,.
Definition: KVExpDB.h:18
void AddSystem(KVDBSystem *r)
Definition: KVExpDB.h:92
Bool_t FindCalibFile(const Char_t *type, TString &fullpath) const
Definition: KVExpDB.cpp:476
virtual void Build()
Definition: KVExpDB.h:142
virtual ~KVExpDB()
Destructor.
Definition: KVExpDB.cpp:72
virtual KVDBSystem * GetSystem(const Char_t *system) const
Definition: KVExpDB.h:83
virtual void ReadComments()
Definition: KVExpDB.cpp:676
virtual void ReadSystemList()
Definition: KVExpDB.cpp:248
virtual void cd()
Definition: KVExpDB.cpp:547
KVDBTable * fRuns
table of runs
Definition: KVExpDB.h:26
virtual void LinkRecordToRun(KVDBRecord *rec, Int_t run)
Definition: KVExpDB.cpp:124
KVDBRun * GetDBRun(Int_t number) const
Definition: KVExpDB.h:74
virtual KVSeqCollection * GetRuns() const
Definition: KVExpDB.h:70
TString GetCalibFileName(const Char_t *type) const
Definition: KVExpDB.h:107
virtual void LinkListToRunRanges(TList *list, UInt_t rr_number, UInt_t run_ranges[][2])
Link the records contained in the list to the set of runs (see LinkRecordToRunRanges).
Definition: KVExpDB.cpp:163
KVDBTable * fSystems
table of systems
Definition: KVExpDB.h:27
virtual void PrintRuns(KVNumberList &) const
Definition: KVExpDB.cpp:517
ULong64_t GetTotalEvents(int first_run, int last_run=-1) const
Definition: KVExpDB.cpp:603
virtual KVSeqCollection * GetSystems() const
Definition: KVExpDB.h:87
virtual void Save(const Char_t *)
Definition: KVExpDB.cpp:361
TString fDBType
used by GetDBEnv
Definition: KVExpDB.h:23
virtual void LinkRecordToRunRanges(KVDBRecord *rec, UInt_t rr_number, UInt_t run_ranges[][2])
Definition: KVExpDB.cpp:143
virtual void LinkListToRunRange(TList *list, const KVNumberList &nl)
Link the records contained in the list to the set of runs (see LinkRecordToRunRanges).
Definition: KVExpDB.cpp:199
void WriteSystemsFile() const
Definition: KVExpDB.cpp:328
KVExpDB()
Default constructor.
Definition: KVExpDB.cpp:34
const Char_t * GetDataSetDir() const
Definition: KVExpDB.h:134
void init()
default initialisations
Definition: KVExpDB.cpp:20
virtual void LinkRecordToRunRange(KVDBRecord *rec, UInt_t first_run, UInt_t last_run)
Definition: KVExpDB.cpp:86
void SetDataSetDir(const Char_t *d)
Definition: KVExpDB.h:138
static KVExpDB * MakeDataBase(const Char_t *name, const Char_t *datasetdir)
Definition: KVExpDB.cpp:569
void WriteRunListFile() const
Definition: KVExpDB.cpp:381
virtual TString GetDBEnv(const Char_t *) const
Definition: KVExpDB.cpp:650
Bool_t OpenCalibFile(const Char_t *type, std::ifstream &fs) const
Definition: KVExpDB.cpp:432
TString fDataSet
the name of the dataset to which this database is associated
Definition: KVExpDB.h:21
Handle reading text files.
Definition: KVFileReader.h:19
KVString GetCurrentLine()
Definition: KVFileReader.h:131
TString GetReadPar(Int_t pos)
Definition: KVFileReader.h:167
Bool_t OpenFileToRead(KVString filename)
Definition: KVFileReader.h:59
void ReadLine(const Char_t *pattern)
Definition: KVFileReader.h:84
Bool_t IsOK()
Definition: KVFileReader.h:74
Int_t GetNparRead()
Definition: KVFileReader.h:150
Strings used to represent a set of ranges of values.
Definition: KVNumberList.h:83
Bool_t End(void) const
Definition: KVNumberList.h:196
void Begin(void) const
Int_t Next(void) const
virtual TObject * At(Int_t idx) const
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:72
void Begin(TString delim) const
Definition: KVString.cpp:562
KVString Next(Bool_t strip_whitespace=kFALSE) const
Definition: KVString.cpp:675
virtual Int_t GetSize() const
const char * AsString() const
void Reset()
virtual const char * GetName() const
virtual const char * ClassName() const
virtual void Warning(const char *method, const char *msgfmt,...) const
virtual void Error(const char *method, const char *msgfmt,...) const
virtual void Info(const char *method, const char *msgfmt,...) const
Longptr_t ExecPlugin(int nargs, const T &... params)
Ssiz_t Length() const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
const char * Data() const
unsigned long long ULong64_t
TLine * line