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)
302 auto& runs_table = RunListTable->
get_table(
"Available_Runs");
304 runs_table[
"run"] = run_num.
run();
306 runs_table[
"index"] = run_num.
index();
308 runs_table[
"index"].set_null();
314 auto& sys_table = RunListTable->
get_table(
"Systems");
319 sys_table.insert_single_row();
324 sys_id = sys_table[
"id"].get_data<
int>();
326 runs_table[
"sys_id"] = sys_id;
327 if (with_version_and_username) {
329 runs_table[
"username"] = userinfo->fUser;
332 runs_table.insert_single_row();
361 std::unique_ptr<KVSQLite::database> _db;
364 RunListTable = db_handle.get();
369 RunListTable = _db.get();
372 auto& runs_table = RunListTable->
get_table(
"Available_Runs");
373 auto& sys_table = RunListTable->
get_table(
"Systems");
377 std::cout << std::endl <<
"Updating runlist : " << std::flush;
383 TIter next(dir_list.get());
386 Int_t ntot = dir_list->GetSize();
389 std::unique_ptr<KVExpDB> db_garbage;
393 db_garbage.reset(db);
395 while ((objs = (
KVBase*) next())) {
411 if (i) run_num->set_index(i);
416 if (run && run->
HasRunFile(run_num.value())) {
418 bool add_to_db =
true;
423 occurences = RunListTable->
count(
"Available_Runs",
"*", selection);
424 add_to_db = (occurences == 0);
432 Info(
"Update",
"the current run [%s] is not in database", objs->
GetName());
434 Warning(
"Update",
"%s GetFileInfo return kFALSE", objs->
GetName());
440 std::cout << '>
' << std::flush;
443 std::cout << " DONE" << std::endl;
444 making_new_db = false;
458 Bool_t KVAvailableRunsFile::GetRunInfo(const run_index_t& run, TDatime& modtime, TString& filename)
460 // Look for a given run/index number in the file, and read the file's modification date/time and
filename
469 if (filenames.GetEntries() == 1) {
474 else if (filenames.GetEntries() > 1) {
476 "Multiple versions of this runfile exist in the repository. Infos for most recent file will be returned.");
478 "You should clean the repository using KVDataSet::CleanMultiRunfiles.");
480 TDatime most_recent(
"1998-12-25 00:00:00");
481 Int_t i_most_recent = 0;
482 for (
int i = 0; i < dates.GetEntries(); i++) {
485 if (rundate > most_recent) {
486 most_recent = rundate;
528 auto& runtable = RunDB->get_table(
"Available_Runs");
530 while (RunDB->get_next_result()) {
562 auto sys_list = std::make_unique<TList>();
565 std::unique_ptr<KVExpDB> garbage_db;
568 garbage_db.reset(db);
575 sys_list->SetOwner(
kTRUE);
576 runDB->select_data(
"Available_Runs,Systems",
"run,index,filename,date,version,username",
Form(
"system = '%s'", systol->
GetName()),
true);
577 while (runDB->get_next_result()) {
578 auto a_run = db->
GetDBRun((*runDB)[
"Available_Runs"][
"run"].get_data<int>());
580 std::optional<int>
index = ((*runDB)[
"Available_Runs"][
"index"].is_null() ?
581 std::nullopt : std::optional<int>((*runDB)[
"Available_Runs"][
"index"].get_data<int>()));
583 KVString kvversion = (*runDB)[
"Available_Runs"][
"version"].get_data<
KVString>();
584 KVString username = (*runDB)[
"Available_Runs"][
"username"].get_data<
KVString>();
588 TString start_date = a_run->GetRunFile({run,
index}).GetStartDate();
589 if (start_date !=
"") fDatime.
Set(start_date);
597 sys_list->SetOwner(kFALSE);
598 runDB->select_data(
"Systems",
"system",
"id > 1");
599 while (runDB->get_next_result()) {
600 auto sys = db->
GetSystem((*runDB)[
"Systems"][
"system"].get_data<
TString>());
601 if (sys && sys->GetNGoodRunFiles()) sys_list->
Add(sys);
604 TIter it_sys(sys_list.get());
606 runDB->select_data(
"Available_Runs,Systems",
"run,index",
Form(
"system = '%s'", sys->GetName()),
true);
607 std::map<int, int> nruns;
609 while (runDB->get_next_result()) {
610 auto run = (*runDB)[
"Available_Runs"][
"run"].get_data<
int>();
611 auto index = (*runDB)[
"Available_Runs"][
"index"].is_null() ? -1 : (*runDB)[
"Available_Runs"][
"index"].get_data<
int>();
617 sys->SetNumberRuns(nruns.size());
624 if (sys_list && sys_list->GetSize() > 1)
647 (*runDB)[
"Available_Runs"][
"version"] = kvversion;
648 (*runDB)[
"Available_Runs"][
"username"] = username;
649 runDB->update(
"Available_Runs",
"version,username", selection);
668 runDB->delete_data(
"Available_Runs", selection);
700 std::forward_list<run_index_t> multiruns;
704 runDB->select_data(
"Available_Runs",
"run,index,COUNT(*)",
"",
false,
"GROUP BY run, index HAVING COUNT(*)>1");
706 while (runDB->get_next_result()) {
707 multiruns.push_front({(*runDB)[
"Available_Runs"][
"run"].get_data<
int>(),
708 ((*runDB)[
"Available_Runs"][
"index"].is_null() ?
709 std::nullopt : std::optional<int>((*runDB)[
"Available_Runs"][
"index"].get_data<int>()))});
735 TString selection, tables(
"Available_Runs");
738 tables +=
",Systems";
742 std::unique_ptr<KVExpDB> garbage_db;
745 garbage_db.reset(db);
751 runDB->select_data(tables,
"run,index", selection);
752 while (runDB->get_next_result()) {
753 auto run = (*runDB)[
"Available_Runs"][
"run"].get_data<
int>();
754 auto index = (*runDB)[
"Available_Runs"][
"index"].is_null() ? -1 : (*runDB)[
"Available_Runs"][
"index"].get_data<
int>();
781 Error(
"GetFileName",
"Dataset has not been set for this file.");
828 Error(
"GetFilePath",
"Dataset has not been set for this file.");
881 Error(
"CheckDirectoryForAvailableRunsFile",
"cannot create directory %s - check access permissions",
GetFilePath().Data());
888 Error(
"CheckDirectoryForAvailableRunsFile",
"directory %s is not writable - check access permissions",
GetFilePath().Data());
918 auto& t = db->add_table(sys_tab);
920 t.prepare_insert_single_row();
921 t[
"system"] =
"unknown";
922 t.insert_single_row();
937 db->add_table(run_tab);
939 if (!called_by_update)
Update(db);
964 runDB->select_data(
"Available_Runs",
"run,version", selection);
965 while (runDB->get_next_result()) {
966 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()
virtual std::unique_ptr< DataBase > OpenAvailableRunsFile(bool called_by_update=false)
Bool_t InfosNeedUpdate(const run_index_t &run, const KVString &filename)
bool insert_runfile_into_database(KVDataRepository *repository, const KVBase *objs, DataBase *RunListTable, const run_index_t &run_num, KVDBRun *run, bool with_version_and_username=false)
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.
virtual void Update(const std::unique_ptr< DataBase > &db_handle={})
const KVDataSet * fDataSet
void GetRunInfos(const run_index_t &run, KVList *dates, KVList *names)
KVString GetFileName() const
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)
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.
void Error(const char *method, const char *msgfmt,...) const override
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.
void Warning(const char *method, const char *msgfmt,...) const override
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
Bool_t HasRunFile(const run_index_t &run_index) 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
KVString GetDataTypeSubdir(const Char_t *type) const
virtual const Char_t * GetDataPathSubdir() const
KVExpDB * GetDataBase(Option_t *opt="") 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 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)