10 #include "KVDataSetRepository.h"
11 #include "KVDataRepositoryManager.h"
12 #include "KVDataSetManager.h"
16 #include "KVDBSystem.h"
19 #include "KVAvailableRunsFile.h"
20 #include "KVNumberList.h"
23 #include "KVRunFile.h"
38 fAllTasks.SetOwner(
kTRUE);
54 if (!fRepository)
return nullptr;
58 avrf = fRepository->NewAvailableRunsFile(
type,
this);
59 fAvailableRuns.
Add(avrf);
100 n.Append(
Form(
".%d.%d.%d", GetKVMajorVersion(),
101 GetKVMinorVersion(), GetKVPatchVersion()));
118 return (fDBName !=
"" ? fDBName.Data() : GetName());
132 fDBase.reset(
new TFile(full_path_to_dbfile,
"READ"));
134 if (fDBase->IsOpen()) {
135 fDataBase =
dynamic_cast<KVExpDB*
>(fDBase->Get(GetDBName()));
137 KVError::Error(
this,
"OpenDBFile",
"%s not found in file %s", GetDBName().Data(),
138 GetDBFileName().Data());
141 fDataBase->ReadObjects(fDBase.get());
157 TString dbfile = GetDBFileName();
164 TString dataset_alias = GetDataSetEnv(
"DataSet.Directory", GetName());
170 return dbfile_fullpath;
182 auto envar = GetDataSetEnv<KVString>(
Form(
"%s.DataAnalysisTask.Title", t->
GetName()));
183 if (envar !=
"") t->
SetTitle(envar);
184 envar = GetDataSetEnv<KVString>(
Form(
"%s.DataAnalysisTask.Analyser", t->
GetName()));
186 envar = GetDataSetEnv<KVString>(
Form(
"%s.DataAnalysisTask.UserClass.Base", t->
GetName()));
188 envar = GetDataSetEnv<KVString>(
Form(
"%s.DataAnalysisTask.Prereq", t->
GetName()));
190 envar = GetDataSetEnv<KVString>(
Form(
"%s.DataAnalysisTask.UserClass.ExtraACliCIncludes", t->
GetName()));
192 auto nev = GetDataSetEnv<int>(
Form(
"%s.DataAnalysisTask.StatusUpdateInterval", t->
GetName()));
208 TString dbfile_fullpath = GetFullPathToDB();
220 KVError::Error(
this,
"SaveDataBase",
"Cannot create directory %s required to save database",
227 KVError::Error(
this,
"SaveDataBase",
"Cannot create directory %s required to save database, even though %s exists: check disk space ?",
233 KVError::Error(
this,
"SaveDataBase",
"Cannot create directory %s required to save database",
246 WriteDBFile(dbfile_fullpath.
Data());
261 KVError::Error(
this,
"WriteDBFile",
"Database has not been built");
264 fDBase.reset(
new TFile(full_path_to_dbfile,
"recreate"));
266 fDataBase->Write(GetDBName());
267 fDataBase->WriteObjects(fDBase.get());
335 auto minimal = (_opt.
Contains(
"MINIMAL"));
337 auto rebuild_database = [&](
bool start_from_minimal =
false) {
338 start_from_minimal =
false;
339 if(start_from_minimal)
340 Info(
"OpenDataBase",
"Updating existing minimal database...");
344 Info(
"OpenDataBase",
"Creating a new minimal database...");
346 Info(
"OpenDataBase",
"Creating a new full database...");
349 fDataBaseUpdateInProgress =
true;
352 auto is_glob_db = (fDataBase == gExpDB);
353 if(!start_from_minimal)
362 Info(
"OpenDataBase",
"No database defined for dataset");
363 fDataBaseUpdateInProgress =
false;
368 fDataBase->CompleteDataBase();
370 if (fDataBase && is_glob_db) fDataBase->cd();
371 fDataBaseUpdateInProgress =
false;
374 if (
update || DataBaseNeedsUpdate()) {
378 else if (!fDataBase) {
383 if (!LoadPlugin(
"KVExpDB", GetDBName())) {
384 KVError::Error(
this,
"GetDataBase",
"Cannot load required plugin library");
388 TString dbfile_fullpath = GetFullPathToDB();
390 OpenDBFile(dbfile_fullpath.
Data());
394 if (fDataBase && fDataBase->IsMinimal() && !minimal)
395 rebuild_database(
true);
397 else if (fDataBase && fDataBase->IsMinimal() && !minimal) {
400 rebuild_database(
true);
413 cout <<
"Dataset name=" << GetName() <<
" (" << GetTitle() <<
")";
415 cout <<
" [ AVAILABLE: ";
416 cout << fDatatypes.Data();
420 cout <<
" [UNAVAILABLE]";
445 cout <<
" *** No available analysis tasks ***"
450 for (
int i = 1; i <= GetNtasks(); i++) {
452 cout <<
"\t" << i <<
". " << dat->
GetTitle() << endl;
458 cout <<
"Available data types: " << fDatatypes.Data() << endl;
489 SetAvailable(fRepository->CheckSubdirExists(GetDataPathSubdir()));
493 auto data_types = GetDataSetEnv<KVString>(
"KVDataSet.DataTypes");
494 if (data_types ==
"") {
495 KVError::Warning(
this,
"CheckAvailable",
"No datatypes defined for this dataset: %s\nCheck value of KVDataSet.DataTypes or %s.KVDataSet.DataTypes",
496 GetName(), GetName());
501 data_types.Begin(
" ");
502 while (!data_types.End()) {
505 (fRepository && fRepository->CheckSubdirExists(GetDataPathSubdir(), GetDataTypeSubdir(
type.Data())))
507 AddAvailableDataType(
type.Data());
511 SetAvailable(fDatatypes !=
"");
520 if (fDatatypes !=
"") fDatatypes +=
" ";
546 TIter nxt(task_list);
553 SetDataSetSpecificTaskParameters(new_task);
554 fAllTasks.Add(new_task);
556 if (HasDataType(new_task->
GetPrereq())) {
557 fTasks.Add(new_task);
574 return fTasks.GetSize();
605 if (!GetAvailableRunsFile(datatype)) {
607 "No available runs file for type %s", datatype.
Data());
610 return GetAvailableRunsFile(datatype)->GetListOfAvailableSystems();
626 return GetListOfAvailableSystems(datan->
GetPrereq());
648 if (!GetAvailableRunsFile(datatype)) {
650 "No available runs file for type %s", datatype.
Data());
653 return GetAvailableRunsFile(datatype)->GetListOfAvailableRunFilesForSystem(systol);
675 return GetListOfAvailableRunFilesForSystem(datan->
GetPrereq(), systol);
687 if (!GetAvailableRunsFile(datatype)) {
689 "No available runs file for type %s", datatype.
Data());
692 return GetAvailableRunsFile(datatype)->GetSystemsForRunFiles(rl);
740 TString path = GetDataSetEnv(
"DataSet.Directory",
name);
745 fCalibDir = GetDATADIRFilePath(path);
760 return fCalibDir.Data();
793 if (fRepository) fRepository->
cd();
857 if (!GetRepository())
return nullptr;
859 auto file_open = [&](
const TString & fpth) {
860 return file_opener(
type, fpth, GetName());
863 if (
type==
"raw" && GetDataSetEnv<KVString>(
"MFM.WithEbyedat")==
"yes") {
864 TString ebydir = GetDataSetDir();
865 ebydir +=
"/ebyedat";
866 gEnv->
SetValue(
"KVMFMDataFileReader.ActionsDirectory", ebydir);
867 if (GetDataSetEnv<KVString>(
"MFM.EbyedatActionsExpName")!=
"")
868 gEnv->
SetValue(
"KVMFMDataFileReader.ActionsExpName", GetDataSetEnv<KVString>(
"MFM.EbyedatActionsExpName"));
869 TObject*
f = GetRepository()->OpenFile(GetRunfileName(
type, run), file_open, GetDataPathSubdir(), GetDataTypeSubdir(
type));
871 gEnv->
SetValue(
"KVMFMDataFileReader.ActionsDirectory",
"");
872 gEnv->
SetValue(
"KVMFMDataFileReader.ActionsExpName",
"");
875 return GetRepository()->OpenFile(GetRunfileName(
type, run), file_open, GetDataPathSubdir(), GetDataTypeSubdir(
type));
892 if (fRepository)
file = GetRunfileName(
type, run);
895 return fRepository->GetFullPathToOpenFile(
file, GetDataPathSubdir(), GetDataTypeSubdir(
type));
910 if (!HasDataType(
type)) {
912 "No data of type \"%s\" available for dataset %s", (
const char*)
type,
917 return GetAvailableRunsFile(
type)->GetFileName(run);
936 if (!HasDataType(
type)) {
938 "No data of type \"%s\" available for dataset %s", (
const char*)
type,
945 if (!GetAvailableRunsFile(
type)->GetRunInfo(run, date,
filename)) {
947 "Runfile not found for run %d index %d (data type: %s)", run.
run(), run.
index(), (
const char*)
type);
1002 auto arf = GetAvailableRunsFile(datatype);
1006 if (
v.value().has_index())
return v;
1007 int r =
v.value().run();
1009 auto db = GetDataBase(
"minimal");
1010 if (db->HasIndexMultiplier() &&
r > db->GetIndexMultiplier()) {
1011 r /= db->GetIndexMultiplier();
1012 int i =
v.value().run() % db->GetIndexMultiplier();
1032 if (!HasDataType(
type)) {
1034 "No data of type \"%s\" available for dataset %s", (
const char*)
type,
1038 return GetAvailableRunsFile(
type)->CheckAvailable(run);
1077 auto fmt = GetDataSetEnv<TString>(
Form(
"DataSet.RunFileName.%s",
type));
1083 if (fmt.Contains(
"%D")) {
1114 if (!HasDataType(
type)) {
1116 "No data of type \"%s\" available for dataset %s", (
const char*)
type,
1121 CleanRunfileDataBase(
type);
1138 if (!fRepository)
return nullptr;
1142 return fRepository->CreateNewFile(
this,
type, tmp.
Data());
1167 if (!fRepository)
return;
1172 KVError::Error(
this,
"DeleteRunfile",
"Run %s of type %s does not exist.",
1178 auto doNotDelete = GetDataSetEnv<KVString>(
"DataSet.RunFile.DoNotDelete",
"all");
1179 if (doNotDelete ==
"all" || doNotDelete.Contains(
type)) {
1180 KVError::Error(
this,
"DeleteRunFile",
"%s files cannot be deleted", (
const char*)
type);
1183 fRepository->DeleteFile(
this,
type,
filename, confirm);
1185 if (!fRepository->CheckFileStatus(
this,
type,
filename.Data()))
1186 GetAvailableRunsFile(
type)->Remove(run);
1218 if (NL.IsEmpty()) NL = GetRunList(
type);
1219 if (NL.IsEmpty())
return;
1221 DeleteRunfile(
type,
r, confirm);
1244 if (!min_date && !max_date)
return {};
1246 if (min_date) printf(
"date minimum %s\n", min_date.value().AsString());
1247 if (max_date) printf(
"date maximum %s\n", max_date.value().AsString());
1251 for (
auto _sys : systems) {
1253 auto lrun = GetListOfAvailableRunFilesForSystem(
type, sys);
1255 for (
auto _run : lrun) {
1258 if (min_date && max_date) {
1259 if (min_date.value() < run->GetFileWrittenDatime() && run->GetFileWrittenDatime() < max_date.value()) {
1260 numb.
Add(run->GetRunIndex());
1263 else if (min_date) {
1264 if (min_date.value() < run->GetFileWrittenDatime()) {
1265 numb.
Add(run->GetRunIndex());
1268 else if (max_date) {
1269 if (run->GetFileWrittenDatime() < max_date.value()) {
1270 numb.
Add(run->GetRunIndex());
1298 auto ll = GetListOfAvailableSystems(ref_type);
1301 Info(
"GetRunList_StageSelection",
"No data available of type \"%s\"", ref_type.
Data());
1305 Info(
"GetRunList_StageSelection",
"No data available of type \"%s\" for system %s", ref_type.
Data(), system->
GetName());
1309 Info(
"GetRunList_StageSelection",
"Liste des runs presents dans \"%s\" mais absent dans \"%s\"", ref_type.
Data(),
type.Data());
1313 for (
Int_t nl = 0; nl < ll.GetEntries(); nl += 1) {
1316 if (system && sys != system)
continue;
1318 auto nsys = GetRunList(
type, sys);
1319 auto nsys_ref = GetRunList(ref_type, sys);
1320 Int_t nref = nsys_ref.GetNValues();
1322 nsys_ref.Remove(nsys);
1324 Info(
"GetRunList_StageSelection",
"\nKVDBSystem : %s --> %d runs manquants sur %d : %s",
1326 nsys_ref.GetNValues(),
1328 nsys_ref.AsString().Data()
1330 manquant.
Add(nsys_ref);
1351 auto ll = GetListOfAvailableSystems(ref_type);
1354 Info(
"GetRunList_StageSelection",
"No data available of type \"%s\"", ref_type.
Data());
1358 Info(
"GetRunList_StageSelection",
"Liste des runs presents dans \"%s\" mais absent dans \"%s\"", ref_type.
Data(),
type.Data());
1362 for (
Int_t nl = 0; nl < ll.GetEntries(); nl += 1) {
1365 if (!systems.
Contains(sys))
continue;
1367 auto nsys = GetRunList(
type, sys);
1368 auto nsys_ref = GetRunList(ref_type, sys);
1369 Int_t nref = nsys_ref.GetNValues();
1371 nsys_ref.Remove(nsys);
1373 Info(
"GetRunList_StageSelection",
"\nKVDBSystem : %s --> %d runs manquants sur %d : %s",
1375 nsys_ref.GetNValues(),
1377 nsys_ref.AsString().Data()
1379 manquant.
Add(nsys_ref);
1399 auto lrun = GetListOfAvailableRunFilesForSystem(
type, sys);
1407 auto ll = GetListOfAvailableSystems(
type);
1410 Info(
"GetRunList_VersionSelection",
"No data available of type \"%s\"",
type.Data());
1414 for (
Int_t nl = 0; nl < nsys; nl += 1) {
1416 auto lrun = GetListOfAvailableRunFilesForSystem(
type, sys);
1439 if (!fRepository)
return;
1444 fRepository->CommitFile(
file,
type,
this);
1453 TString oldfile = GetAvailableRunsFile(
type)->GetFileName(run);
1454 if (oldfile !=
"" && oldfile != newfile) {
1456 fRepository->DeleteFile(
this,
type, oldfile.
Data(),
1459 if (!fRepository->CheckFileStatus(
this,
type, oldfile.
Data()))
1460 GetAvailableRunsFile(
type)->Remove(run);
1462 if (oldfile != newfile) {
1464 GetAvailableRunsFile(
type)->Add(run, newfile.
Data());
1506 auto doubles = GetAvailableRunsFile(data_type)->CheckMultiRunfiles();
1507 if (doubles.empty()) {
1508 cout <<
"OK. No runs appear more than once." << endl;
1511 cout <<
"Runs which appear more than once: " << endl << endl;
1514 for (
auto& rr : doubles) {
1518 GetAvailableRunsFile(data_type)->GetRunInfos(rr, dates, filenames);
1520 cout <<
"Run " << rr <<
" : " << dates.
GetEntries() <<
" files >>>>>>" << endl;
1521 for (
int i = 0; i < dates.
GetEntries(); i++) {
1558 if (!fRepository)
return;
1562 if (doubles.empty()) {
1563 cout <<
"OK. No runs appear more than once." << endl;
1566 cout <<
"Runs which appear more than once: " << endl << endl;
1570 for (
auto& rr : doubles) {
1573 TDatime most_recent(
"1998-12-25 00:00:00");
1574 Int_t i_most_recent = 0;
1575 cout <<
"Run " << rr <<
" : " << dates.
GetEntries() <<
" files >>>>>>" << endl;
1576 for (
int i = 0; i < dates.
GetEntries(); i++) {
1579 if (rundate > most_recent) {
1580 most_recent = rundate;
1586 for (
int i = 0; i < dates.
GetEntries(); i++) {
1587 if (i == i_most_recent) {
1591 cout <<
"DELETE : ";
1596 if (i != i_most_recent) {
1598 fRepository->DeleteFile(
this, data_type,
1600 String().Data(), confirm);
1623 if (!fRepository)
return;
1625 Info(
"CleanRunfileDataBase",
"Checking for spurious duplicates (non-existent files)...");
1630 if (!doubles.empty()) {
1631 for (
auto& ri : doubles) {
1636 for (
auto f : files) {
1638 if (!fRepository->CheckFileStatus(
this, data_type, fname)) {
1639 Info(
"CleanRunfileDataBase",
"File %s does not exist : remove from database...", fname.
Data());
1646 Info(
"CleanRunfileDataBase",
"Database is apparently consistent");
1674 "Dataset \"%s\" not found in repository \"%s\"", GetName(),
1679 if (GetRunfileDate(data_type, run) < ds->
GetRunfileDate(data_type, run))
1703 auto _or = gDataRepositoryManager->
GetRepository(other_repos);
1705 return CheckRunfileUpToDate(data_type, run, _or);
1707 "No data repository known with this name : %s", (
const char*) other_repos);
1719 const Char_t* other_repos)
1724 if (!fRepository)
return;
1730 "No data repository known with this name : %s", other_repos);
1733 auto runlist = GetAvailableRunsFile(data_type)->GetRunList();
1734 Int_t need_update = 0;
1735 for (
auto& rr : runlist) {
1737 if (!CheckRunfileUpToDate(data_type, rr, _or)) {
1738 cout <<
" *** run " << rr <<
" needs update ***" <<
1740 cout <<
"\t\tREPOSITORY: " << fRepository->
1741 GetName() <<
"\tDATE: " << GetRunfileDate(data_type, rr).value().AsString() << endl;
1742 cout <<
"\t\tREPOSITORY: " << other_repos <<
"\tDATE: " << _or->
1743 GetDataSetManager()->GetDataSet(GetName())->
1744 GetRunfileDate(data_type, rr).value().AsString() << endl;
1749 cout <<
" *** All runfiles are up to date for data type " <<
1762 const Char_t* other_repos)
1768 if (!fRepository)
return updates;
1770 auto _or = gDataRepositoryManager->
GetRepository(other_repos);
1773 "No data repository known with this name : %s", other_repos);
1776 auto runlist = GetAvailableRunsFile(data_type)->GetRunList();
1777 for (
auto& rr : runlist) {
1779 if (!CheckRunfileUpToDate(data_type, rr, _or)) {
1802 if (!fRepository || !HasDataType(data_type)) {
1804 "No data of type %s available. Runlist will be empty.",
1809 return GetAvailableRunsFile(data_type)->GetRunList(system);
1890 "No user class required for analysis task \"%s\"", dat->
GetTitle());
1904 unique_ptr<TMethodCall> methcall(
new TMethodCall(cl,
"Make",
Form(
"\"%s\"", classname)));
1906 if (!methcall->IsValid()) {
1907 KVError::Error(
this,
"MakeAnalysisClass",
"static Make(const Char_t*) method for class %s is not valid",
1913 methcall->Execute();
1993 auto plugin_class = GetDataSetEnv<KVString>(
Form(
"DataSet.RunFileClass.%s",
type.Data()));
1997 if (IsThisAPlugin(plugin_class, base_class)) {
2000 ph = LoadPlugin(base_class, plugin_class);
2004 base_class = plugin_class;
2015 std::unique_ptr<TMethodCall> methcall;
2016 if (strcmp(opt,
"")) {
2018 methcall = std::make_unique<TMethodCall>(cl,
"Open",
Form(
"\"%s\", \"%s\"", fname.
Data(), opt));
2022 methcall = std::make_unique<TMethodCall>(cl,
"Open",
Form(
"\"%s\"", fname.
Data()));
2025 if (!methcall->IsValid()) {
2026 if (ph)
KVError::Error(
this,
"OpenDataSetFile",
"Open method for class %s is not valid", ph->
GetClass());
2027 else KVError::Error(
this,
"OpenDataSetFile",
"Open method for class %s is not valid", base_class.
Data());
2033 methcall->Execute(retval);
2067 if (!_task.
Contains(
"nalysis")) _task +=
" analysis";
2070 auto dat = GetAnalysisTaskAny(_task.
Data());
2073 "called for unknown or unavailable analysis task : %s", _task.
Data());
2076 return make_analysis_class(dat, classname);
2096 auto dat = GetAnalysisTask(task);
2099 "called for unknown or unavailable analysis task index : %d", task);
2102 return make_analysis_class(dat, classname);
2117 return OpenDataSetFile(GetName(), filename,
file);
2136 abspath.
Form(
"%s/%s", datasetdir.
Data(), filename);
2137 return SearchAndOpenKVFile(abspath,
file);
2140 return SearchAndOpenKVFile(filename,
file, datasetdir);
2154 return GetFullPathToDataSetFile(GetName(),
filename);
2172 if (!SearchKVFile(
filename, fullpath, datasetdir)) {
2192 return SearchKVFile(
filename, fullpath, datasetdir);
2206 return FindDataSetFile(GetName(),
filename);
2233 KVError::Error(
this,
"GetAnalysisTaskAny",
"No task found with the following keywords in its title : %s", keywords);
2259 if (!SearchKVFile(GetDataSetDir(), path)) {
2261 Info(
"DataBaseNeedsUpdate",
"%s: Creating new dataset directory %s",
2262 GetName(), GetDataSetDir());
2266 "%s: Dataset directory %s does not exist and cannot be created ?",
2267 GetName(), GetDataSetDir());
2271 SearchKVFile(GetDataSetDir(), path);
2275 of1 <<
"$(KV_WORK_DIR)/db/" << GetName() <<
"/DataBase.root : Runlist.csv Systems.dat" << endl;
2276 of1 <<
"\t@echo Database needs update" << endl;
2280 of2 <<
"# Automatically generated dummy Runlist.csv file" << endl;
2284 of3 <<
"# Automatically generated dummy Systems.dat file" << endl;
2331 if (
gEnv->
Defined(
Form(
"%s.DataRepository.DefaultOutputRepository", GetRepository()->GetName())))
2332 return TString(
gEnv->
GetValue(
Form(
"%s.DataRepository.DefaultOutputRepository", GetRepository()->GetName()),
""));
2333 TString orep = GetDataSetEnv(
Form(
"%s.DataAnalysisTask.OutputRepository", taskname), GetRepository()->GetName());
2347 auto repo = GetRepository();
2348 for (
auto& run : runs) {
2352 repo->CopyFileFromRepository(
this,
type,
filename, destpath);
2368 auto repo = GetRepository();
2372 KVError::Error(
this,
"CopyRunfilesToRepository",
"Unknown destination repository : %s", destrepo);
2373 gDataRepositoryManager->
Print();
2377 KVDataSet* dest_ds = dest_repo->GetDataSetManager()->GetDataSet(GetName());
2378 dest_repo->CreateAllNeededSubdirectories(dest_ds,
type);
2379 for (
auto& run : runs) {
2382 repo->CopyFileFromRepository(
this,
type,
filename, destpath);
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 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 Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
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.
void GetRunInfos(const run_index_t &run, KVList &dates, KVList &names)
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)
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 Add(const run_index_t &run, const KVString &filename)
static ValType GetDataSetEnv(const KVString &dataset, const KVString &type, const ValType &defval={})
Database class used to store information on different colliding systems studied during an experiment....
Bool_t IsCollision() const
retourne kTRUE, si le systeme est une collision ie projectile+cible
Define and manage data analysis tasks.
virtual void SetDataAnalyser(const Char_t *d)
virtual Bool_t WithUserClass() const
virtual void SetPrereq(const Char_t *p)
virtual void SetStatusUpdateInterval(Long64_t n)
virtual const Char_t * GetUserBaseClass() const
virtual Bool_t CheckUserBaseClassIsLoaded() const
void SetExtraAClicIncludes(const KVString &list)
virtual const Char_t * GetPrereq() const
virtual void SetUserBaseClass(const Char_t *d)
void Print(Option_t *opt="") const
KVDataSetRepository * GetRepository(const TString &name) const
KVDataSet * GetDataSet(Int_t) const
Return pointer to DataSet using index in list of all datasets, index>=0.
A repository for experimental datasets.
KVDataSetManager * GetDataSetManager() const
Return pointer to data set manager for this repository.
Manage an experimental dataset corresponding to a given experiment or campaign.
std::optional< TDatime > GetRunfileDate(const KVString &type, const run_index_t &run)
TString GetFullPathToRunfile(const KVString &type, const run_index_t &run) const
TString GetFullPathToDB() const
void ls(Option_t *opt="") const override
Print dataset information.
TString GetOutputRepository(const Char_t *taskname) const
void OpenDBFile(const Char_t *full_path_to_dbfile) const
Open the database from a file on disk.
void SetRepository(KVDataSetRepository *)
Set pointer to data repository in which dataset is stored.
TString GetDBName() const
void CheckMultiRunfiles(const Char_t *data_type)
Bool_t CheckRunfileAvailable(const KVString &type, const run_index_t &run)
void CleanRunfileDataBase(const Char_t *data_type)
void CheckUpToDate(const Char_t *data_type, const Char_t *other_repos)
run_index_list GetRunList(const Char_t *data_type, const KVDBSystem *sys=0) const
void OpenDataBase(const TString &="") const
TString GetFullPathToDataSetFile(const Char_t *filename) const
void CopyRunfilesFromRepository(const Char_t *type, const run_index_list &runs, const Char_t *destdir)
Copies the runfiles of given "type" into the local directory "destdir".
run_index_list GetRunList_DateSelection(const TString &type, const KVUnownedList &systems, std::optional< KVDatime > min_date=std::nullopt, std::optional< KVDatime > max_date=std::nullopt)
const Char_t * GetDataSetDir() const
void CommitRunfile(const KVString &type, const run_index_t &run, TFile *file)
void AddAvailableDataType(const Char_t *)
KVUniqueNameList GetSystemsForRunFiles(const TString &datatype, const run_index_list &) const
bool make_analysis_class(const KVDataAnalysisTask *, const Char_t *classname)
KVDataAnalysisTask * GetAnalysisTask(Int_t) const
KVAvailableRunsFile * GetAvailableRunsFile(const TString &type) const
void SaveDataBase() const
KVDataAnalysisTask * GetAnalysisTaskAny(const Char_t *keywords) const
virtual TString GetBaseFileName(const Char_t *type, const run_index_t &run) const
void SetAnalysisTasks(const KVSeqCollection *)
TFile * NewRunfile(const KVString &type, const run_index_t &run)
KVList GetListOfAvailableRunFilesForSystem(const TString &datatype, KVDBSystem *systol)
void DeleteRunfile(const KVString &type, const run_index_t &run, Bool_t confirm=kTRUE)
TObject * file_opener(const TString &, const TString &, Option_t *="")
run_index_list GetRunList_VersionSelection(const TString &type, const TString &version, KVDBSystem *sys=0)
KVExpDB * GetDataBase(const TString &opt="") const
void DeleteRunfiles(const Char_t *type, const run_index_list &lrun={}, Bool_t confirm=kTRUE)
Bool_t CheckRunfileUpToDate(const KVString &data_type, const run_index_t &run, KVDataSetRepository *other_repos)
TObject * open_runfile(const KVString &type, const run_index_t &run)
void CopyRunfilesToRepository(const Char_t *type, const run_index_list &runs, const Char_t *destrepo)
KVDataSetRepository * GetRepository() const
Get pointer to data repository in which dataset is stored.
KVString GetRunfileName(const KVString &type, const run_index_t &run) const
Bool_t DataBaseNeedsUpdate() const
Bool_t OpenDataSetFile(const Char_t *filename, std::ifstream &file)
void SetDataSetSpecificTaskParameters(KVDataAnalysisTask *) const
Check configuration variables to see if the task parameters have been "tweaked" for the dataset.
run_index_list GetRunList_StageSelection(const TString &other_type, const TString &base_type, KVDBSystem *sys=0, Bool_t OnlyCol=kFALSE)
void WriteDBFile(const Char_t *full_path_to_dbfile) const
Write the database to disk.
void Print(Option_t *opt="") const override
void SetName(const char *name) override
void UpdateAvailableRuns(const KVString &type)
run_index_list GetUpdatableRuns(const Char_t *data_type, const Char_t *other_repos)
bool MakeAnalysisClass(const Char_t *task, const Char_t *classname)
KVDataSet()
Default constructor.
std::optional< run_index_t > GetRunNumberFromFileName(const TString &datatype, const TString &filename)
void CleanMultiRunfiles(const Char_t *data_type, Bool_t confirm=kTRUE)
static Bool_t FindDataSetFile(const TString &dataset, const Char_t *filename)
KVUnownedList GetListOfAvailableSystems(const TString &datatype)
TString GetDBFileName() const
Extension of TDatime to handle various useful date formats.
Base class to describe database of an experiment ,,.
static KVExpDB * MakeDataBase(const Char_t *name, const Char_t *datasetdir, Bool_t minimal=false)
Extended TList class which owns its objects by default.
Description of an individual data file in an experimental dataset.
const Char_t * GetVersion() const
const run_index_t & GetRunIndex() const
KaliVeda extensions to ROOT collection classes.
TObject * At(Int_t idx) const override
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Optimised list in which named objects can only be placed once.
Extended TList class which does not own its objects by default.
static TClass * GetClass(Bool_t load=kTRUE, Bool_t silent=kFALSE)
virtual Int_t GetEntries() const
Bool_t Contains(const char *name) const
const char * AsSQLString() const
virtual const char * GetValue(const char *name, const char *dflt) const
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=nullptr)
Bool_t Defined(const char *name) const
TObject * FindObject(const char *name) const override
virtual void SetTitle(const char *title="")
const char * GetName() const override
const char * GetTitle() const override
virtual void SetName(const char *name)
const char * GetClass() const
const char * Data() const
void Form(const char *fmt,...)
TString & Remove(EStripType s, char c)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TString & ReplaceAll(const char *s1, const char *s2)
Bool_t cd(const char *path)
virtual int Chmod(const char *file, UInt_t mode)
virtual const char * DirName(const char *pathname)
virtual char * ConcatFileName(const char *dir, const char *name)
virtual int mkdir(const char *name, Bool_t recursive=kFALSE)
virtual Int_t Exec(const char *shellcmd)
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
virtual const char * BaseName(const char *pathname)
virtual Bool_t IsAbsoluteFileName(const char *dir)
List of runfiles specified by run number and file index ,.
void Add(const run_index_t &r)
Specifies a runfile according to run number and file index ,.
TString as_string() const
int index(int no_index=-1) const
void Error(UserClass p, const char *location, const char *va_(fmt),...)
void Warning(UserClass p, const char *location, const char *va_(fmt),...)
void update(const LAYERDATA &prevLayerData, LAYERDATA &currLayerData, double factorWeightDecay, EnumRegularization regularization)