10 #include "KVAvailableRunsFile.h"
16 #include "KVDataRepository.h"
17 #include "KVRunFile.h"
45 Error(
"IsRunFileName",
"No default format set for datatype: %s",
152 bool with_index = fmt.
Contains(
"%I");
153 bool two_part_date =
false;
154 bool got_date =
false;
158 if (np_fn == np_fmt + 1) {
165 if (np_fmt == np_fn || (with_index && np_fn == np_fmt - 1)) {
166 _file.
Begin(separators);
167 _fmt.
Begin(separators);
168 int index(-1), run(0);
169 char date1[100], date2[100];
172 while (!_file.
End()) {
180 sscanf(run_part.
Data(), fmt_part.
Data(), &run, date1);
184 sscanf(run_part.
Data(), fmt_part.
Data(), &run);
190 else if (fmt_part.
Contains(
"%D1")) {
192 sscanf(run_part.
Data(), fmt_part.
Data(), date1);
195 else if (fmt_part.
Contains(
"%D2")) {
197 sscanf(run_part.
Data(), fmt_part.
Data(), date2);
202 sscanf(run_part.
Data(), fmt_part.
Data(), date1);
283 ,
bool with_version_and_username)
301 auto& runs_table = RunListTable->
get_table(
"Available_Runs");
303 runs_table[
"run"] = run_num.
run();
305 runs_table[
"index"] = run_num.
index();
307 runs_table[
"index"].set_null();
313 auto& sys_table = RunListTable->
get_table(
"Systems");
318 sys_table.insert_single_row();
323 sys_id = sys_table[
"id"].get_data<
int>();
325 runs_table[
"sys_id"] = sys_id;
326 if (with_version_and_username) {
328 runs_table[
"username"] = userinfo->fUser;
331 runs_table.insert_single_row();
359 std::unique_ptr<KVSQLite::database> _db;
362 RunListTable = db_handle.get();
367 RunListTable = _db.get();
370 auto& runs_table = RunListTable->
get_table(
"Available_Runs");
371 auto& sys_table = RunListTable->
get_table(
"Systems");
375 std::cout << std::endl <<
"Updating runlist : " << std::flush;
381 TIter next(dir_list.get());
384 Int_t ntot = dir_list->GetSize();
387 std::unique_ptr<KVExpDB> db_garbage;
391 db_garbage.reset(db);
393 while ((objs = (
KVBase*) next())) {
410 run_num->set_run(
r);
if(i) run_num->set_index(i);
417 bool add_to_db =
true;
422 occurences = RunListTable->
count(
"Available_Runs",
"*", selection);
423 add_to_db = (occurences == 0);
431 Info(
"Update",
"the current run [%s] is not in database", objs->
GetName());
433 Warning(
"Update",
"%s GetFileInfo return kFALSE", objs->
GetName());
439 std::cout << '>
' << std::flush;
442 std::cout << " DONE" << std::endl;
443 making_new_db = false;
456 Bool_t KVAvailableRunsFile::GetRunInfo(const run_index_t& run, TDatime& modtime, TString& filename)
458 // Look for a given run/index number in the file, and read the file's modification date/time and
filename
467 if (filenames.GetEntries() == 1) {
472 else if (filenames.GetEntries() > 1) {
474 "Multiple versions of this runfile exist in the repository. Infos for most recent file will be returned.");
476 "You should clean the repository using KVDataSet::CleanMultiRunfiles.");
478 TDatime most_recent(
"1998-12-25 00:00:00");
479 Int_t i_most_recent = 0;
480 for (
int i = 0; i < dates.GetEntries(); i++) {
483 if (rundate > most_recent) {
484 most_recent = rundate;
525 auto& runtable = RunDB->get_table(
"Available_Runs");
527 while (RunDB->get_next_result()) {
558 auto sys_list = std::make_unique<TList>();
561 std::unique_ptr<KVExpDB> garbage_db;
564 garbage_db.reset(db);
571 sys_list->SetOwner(
kTRUE);
572 runDB->select_data(
"Available_Runs,Systems",
"run,index,filename,date,version,username",
Form(
"system = '%s'", systol->
GetName()),
true);
573 while (runDB->get_next_result()) {
574 auto a_run = db->
GetDBRun((*runDB)[
"Available_Runs"][
"run"].get_data<int>());
576 std::optional<int>
index = ((*runDB)[
"Available_Runs"][
"index"].is_null() ?
577 std::nullopt : std::optional<int>((*runDB)[
"Available_Runs"][
"index"].get_data<int>()));
579 KVString kvversion = (*runDB)[
"Available_Runs"][
"version"].get_data<
KVString>();
580 KVString username = (*runDB)[
"Available_Runs"][
"username"].get_data<
KVString>();
584 TString start_date = a_run->GetRunFile({run,
index}).GetStartDate();
585 if (start_date !=
"") fDatime.
Set(start_date);
593 sys_list->SetOwner(kFALSE);
594 runDB->select_data(
"Systems",
"system",
"id > 1");
595 while (runDB->get_next_result()) {
596 auto sys = db->
GetSystem((*runDB)[
"Systems"][
"system"].get_data<
TString>());
597 if (sys && sys->GetNGoodRunFiles()) sys_list->
Add(sys);
600 TIter it_sys(sys_list.get());
602 runDB->select_data(
"Available_Runs,Systems",
"run,index",
Form(
"system = '%s'", sys->GetName()),
true);
603 std::map<int, int> nruns;
605 while (runDB->get_next_result()) {
606 auto run = (*runDB)[
"Available_Runs"][
"run"].get_data<
int>();
607 auto index = (*runDB)[
"Available_Runs"][
"index"].is_null() ? -1 : (*runDB)[
"Available_Runs"][
"index"].get_data<
int>();
613 sys->SetNumberRuns(nruns.size());
620 if (sys_list && sys_list->GetSize() > 1)
643 (*runDB)[
"Available_Runs"][
"version"] = kvversion;
644 (*runDB)[
"Available_Runs"][
"username"] = username;
645 runDB->update(
"Available_Runs",
"version,username", selection);
662 runDB->delete_data(
"Available_Runs", selection);
691 std::forward_list<run_index_t> multiruns;
695 runDB->select_data(
"Available_Runs",
"run,index,COUNT(*)",
"",
false,
"GROUP BY run, index HAVING COUNT(*)>1");
697 while (runDB->get_next_result()) {
698 multiruns.push_front({(*runDB)[
"Available_Runs"][
"run"].get_data<
int>(),
699 ((*runDB)[
"Available_Runs"][
"index"].is_null() ?
700 std::nullopt : std::optional<int>((*runDB)[
"Available_Runs"][
"index"].get_data<int>()))});
725 TString selection, tables(
"Available_Runs");
728 tables +=
",Systems";
732 std::unique_ptr<KVExpDB> garbage_db;
735 garbage_db.reset(db);
740 runDB->select_data(tables,
"run,index", selection);
742 while (runDB->get_next_result()) {
743 auto run = (*runDB)[
"Available_Runs"][
"run"].get_data<
int>();
744 auto index = (*runDB)[
"Available_Runs"][
"index"].is_null() ? -1 : (*runDB)[
"Available_Runs"][
"index"].get_data<
int>();
770 Error(
"GetFileName",
"Dataset has not been set for this file.");
817 Error(
"GetFilePath",
"Dataset has not been set for this file.");
870 Error(
"CheckDirectoryForAvailableRunsFile",
"cannot create directory %s - check access permissions",
GetFilePath().Data());
877 Error(
"CheckDirectoryForAvailableRunsFile",
"directory %s is not writable - check access permissions",
GetFilePath().Data());
907 auto& t = db->add_table(sys_tab);
909 t.prepare_insert_single_row();
910 t[
"system"] =
"unknown";
911 t.insert_single_row();
926 db->add_table(run_tab);
928 if (!called_by_update)
Update(db);
950 runDB->select_data(
"Available_Runs",
"run,version", selection);
951 while (runDB->get_next_result()) {
952 if ((*runDB)[
"Available_Runs"][
"version"].is_null())
return true;
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize fs
char * Form(const char *fmt,...)
void AssignAndDelete(TString &target, char *tobedeleted)
R__EXTERN TSystem * gSystem
Handles lists of available runs for different datasets and types of data.
Bool_t CheckDirectoryForAvailableRunsFile()
Bool_t InfosNeedUpdate(const run_index_t &run, const KVString &filename)
virtual void Remove(const run_index_t &run, const KVString &filename="")
Remove from the db ALL entries corresponding to the given run/index (and filename if given)
Bool_t FileExists() const
void UpdateInfos(const run_index_t &run, const KVString &filename, const KVString &kvversion, const KVString &username)
Bool_t ExtractDateFromFileName(const Char_t *name, KVDatime &date)
const Char_t * GetDataType() const
TString SelectRunAndOrIndex(const run_index_t &run)
dataset to which this file belongs
std::forward_list< run_index_t > CheckMultiRunfiles()
Returns a list with all run/indexes for which more than one file is in the available runs db.
const KVDataSet * fDataSet
void GetRunInfos(const run_index_t &run, KVList *dates, KVList *names)
virtual void Update(const std::unique_ptr< KVSQLite::database > &db_handle={})
KVString GetFileName() const
virtual std::unique_ptr< KVSQLite::database > OpenAvailableRunsFile(bool called_by_update=false)
KVString GetFullPathToAvailableRunsFile() const
run_index_list GetRunList(const KVDBSystem *system=0)
std::optional< run_index_t > IsRunFileName(const Char_t *filename)
TString SelectFileName(const KVString &filename)
bool insert_runfile_into_database(KVDataRepository *repository, const KVBase *objs, KVSQLite::database *RunListTable, const run_index_t &run_num, KVDBRun *run, bool with_version_and_username=false)
KVString GetFilePath() const
static KVString date_read_from_filename
virtual bool get_file_modification_date(KVDataRepository *repository, const KVBase *objs, KVDatime &modt)
virtual void Add(const run_index_t &run, const KVString &filename)
std::unique_ptr< TList > GetListOfAvailableSystems(const KVDBSystem *systol=0)
Base class for KaliVeda framework.
static const Char_t * GetWORKDIRFilePath(const Char_t *namefile="")
static bool is_gnuinstall()
virtual Bool_t IsCalled(const Char_t *name) const
static const Char_t * GetKVVersion()
Returns KaliVeda version string.
virtual Int_t GetNumber() const
void SetEvents(ULong64_t evt_number)
Description of an experimental run in database ,,.
const Char_t * GetSystemName() const
KVDBSystem * GetSystem() const
Database class used to store information on different colliding systems studied during an experiment....
Base class for managing repositories of experimental data.
virtual std::unique_ptr< KVUniqueNameList > GetDirectoryListing(const KVDataSet *dataset, const Char_t *datatype="", const Char_t *subdir="")
virtual Bool_t GetFileInfo(const KVDataSet *dataset, const Char_t *datatype, const Char_t *runfile, FileStat_t &fs) const
KVDataRepository * GetRepository() const
Get pointer to data repository in which dataset is stored.
const Char_t * GetDataSetDir() const
virtual const Char_t * GetDataPathSubdir() const
Returns name of top-level directory in data repository used to store data files for this dataset.
KVExpDB * GetDataBase(Option_t *opt="") const
const Char_t * GetDataTypeSubdir(const Char_t *type) const
Extension of TDatime to handle various useful date formats.
static Bool_t IsGANACQFormat(const Char_t *date)
static Bool_t IsSQLFormat(const Char_t *date)
static Bool_t IsGANACQ2010Format(const Char_t *date)
void SetSQLDate(const Char_t *SQLDateString)
void SetGanacqNarvalDate(const Char_t *GanacqDateString)
static Bool_t IsGANACQNarvalFormat(const Char_t *date)
void SetGanacq2010Date(const Char_t *GanacqDateString)
void SetGanacqDate(const Char_t *GanacqDateString)
Base class to describe database of an experiment ,,.
virtual KVDBSystem * GetSystem(const Char_t *system) const
KVDBRun * GetDBRun(Int_t number) const
const KVDBRunFile & GetDBRunFile(const run_index_t &r) const
Int_t GetIndexMultiplier() const
Bool_t HasIndexMultiplier() const
Extended TList class which owns its objects by default.
Description of an individual data file in an experimental dataset.
Interface to ROOT SQLite database backend.
bool select_data(const TString &tables, const TString &columns="*", const TString &selection="", bool distinct=false, const TString &anything_else="") const
bool get_next_result() const
KVSQLite::table & get_table(const TString &name)
int count(const TString &tables, const TString &column="*", const TString &selection="", bool distinct=false, const TString &anything_else="") const
void primary_key(const TString &cols)
void foreign_key(const TString &child_key, const TString &parent_table, const TString &parent_key)
column & add_column(const KVSQLite::column &c)
void prepare_insert_single_row()
void Add(TObject *obj) override
void Delete(Option_t *option="") override
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
void Begin(TString delim) const
KVString Next(Bool_t strip_whitespace=kFALSE) const
Int_t GetNValues(TString delim) const
const char * AsSQLString() const
virtual const char * GetValue(const char *name, const char *dflt) const
virtual void Add(TObject *obj)
const char * GetName() const override
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
const char * Data() const
TString & Append(char c, Ssiz_t rep=1)
void Form(const char *fmt,...)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TString & ReplaceAll(const char *s1, const char *s2)
virtual int Chmod(const char *file, UInt_t mode)
virtual char * ConcatFileName(const char *dir, const char *name)
virtual int mkdir(const char *name, Bool_t recursive=kFALSE)
virtual UserGroup_t * GetUserInfo(const char *user=nullptr)
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
virtual const char * BaseName(const char *pathname)
virtual char * ExpandPathName(const char *path)
Specifies a runfile according to run number and file index ,.
int index(int no_index=-1) const
unsigned long long ULong64_t
BinData::ErrorType GetDataType(const TGraph *gr, DataOptions &fitOpt)
Double_t Max(Double_t a, Double_t b)