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