KaliVeda
Toolkit for HIC analysis
KVSimDirGUI.cpp
1 //Created by KVClassFactory on Wed Jul 18 11:55:11 2012
2 //Author: John Frankland,,,
3 
4 #include "KVUnownedList.h"
5 #include "KVSimDirGUI.h"
6 #include "KVDataSetManager.h"
7 #include "KVBatchSystemManager.h"
8 #include "KVDataSet.h"
9 #include "KVDBSystem.h"
10 #include "KVDBRun.h"
11 #include "KVSimFile.h"
12 #include "KVFileDialog.h"
13 #include "KVInputDialog.h"
14 #include "KV2Body.h"
15 #include "TGLabel.h"
16 #include "TGButtonGroup.h"
17 #include "TGMsgBox.h"
18 #include "TSystem.h"
19 #include <KVDataAnalyser.h>
20 #include <KVSimDirFilterAnalyser.h>
21 #include <KVSimReader.h>
22 #include <TG3DLine.h>
23 #include <iostream>
24 using namespace std;
25 
26 #include "KVBatchSystemParametersGUI.h"
27 #include "KVDropDownDialog.h"
28 
30 
31 #ifdef WITH_RSQLITE
32 
35 
36 TString KVSimDirGUI::AddTableForDataSet(KVSimDir* sd, int ds_table_number)
37 {
38  // Add a new dataset table for the given KVSimDir object
39 
40  TString ds_table_name = Form("Table_%d", ds_table_number);
41  KVSQLite::table DStable(ds_table_name);
42  DStable.add_column("Id", KVSQLite::column_type::INTEGER);
43  DStable.primary_key("Id");
44  DStable.add_column("FileName", KVSQLite::column_type::TEXT);
45  DStable.add_column("TreeInfo", KVSQLite::column_type::TEXT);
46  DStable.add_column("AuxDir", KVSQLite::column_type::INTEGER);
47  DStable.add_column("Filtered", KVSQLite::column_type::INTEGER);
48  DStable.add_column("Events", KVSQLite::column_type::INTEGER);
49  DStable.add_column("DataSet", KVSQLite::column_type::TEXT);
50  DStable.add_column("System", KVSQLite::column_type::TEXT);
51  DStable.add_column("Run", KVSQLite::column_type::INTEGER);
52  DStable.add_column("TreeName", KVSQLite::column_type::TEXT);
53  DStable.add_column("BranchName", KVSQLite::column_type::TEXT);
54  DStable.add_column("OrigFile", KVSQLite::column_type::TEXT);
55  DStable.add_column("FiltType", KVSQLite::column_type::TEXT);
56  DStable.add_column("DataQualityAudit", KVSQLite::column_type::TEXT);
57  DStable.add_column("Gemini", KVSQLite::column_type::INTEGER);
58  DStable.add_column("GemDecayPerEvent", KVSQLite::column_type::INTEGER);
59  fConfigDB.add_table(DStable);
60  // update name of dataset table in main table
61  fConfigDB["Datasets"]["Table"] = ds_table_name;
62  fConfigDB.update("Datasets", "Table", Form("Name=\"%s\"", sd->GetName()));
63  return ds_table_name;
64 }
65 
66 
67 
71 
72 void KVSimDirGUI::FillDataSetTableWithInfos(TString ds_table_name, KVSimDir* sd)
73 {
74  // backwards-compatibility: add missing 'AuxDir' and 'DataQualityAudit' columns
75  // to table for each dataset
76  if(!fConfigDB[ds_table_name].has_column("AuxDir"))
77  fConfigDB.add_column(ds_table_name, "AuxDir", "INTEGER");
78  if(!fConfigDB[ds_table_name].has_column("DataQualityAudit"))
79  fConfigDB.add_column(ds_table_name, "DataQualityAudit", "TEXT");
80  fConfigDB.prepare_data_insertion(ds_table_name);
81  KVSQLite::table& dstable = fConfigDB[ds_table_name];
82  if (sd->GetSimDataList()->GetEntries()) {
83  TIter it1(sd->GetSimDataList());
84  KVSimFile* sf = nullptr;
85  while ((sf = (KVSimFile*)it1())) {
86  dstable["Id"].set_null();
87  dstable["FileName"] = sf->GetName();
88  dstable["TreeInfo"] = sf->GetTitle();
89  dstable["AuxDir"] = (int)sd->IsFromAuxDirectory(sf);
90  dstable["Filtered"] = 0;
91  dstable["Events"] = (Int_t)sf->GetEvents();
92  dstable["TreeName"] = sf->GetTreeName();
93  dstable["BranchName"] = sf->GetBranchName();
94  fConfigDB.insert_data_row();
95  }
96  }
97  if (sd->GetFiltDataList()->GetEntries()) {
98  TIter it1(sd->GetFiltDataList());
99  KVSimFile* sf = nullptr;
100  while ((sf = (KVSimFile*)it1())) {
101  dstable["Id"].set_null();
102  dstable["FileName"] = sf->GetName();
103  dstable["TreeInfo"] = sf->GetTitle();
104  dstable["AuxDir"] = (int)sd->IsFromAuxDirectory(sf);
105  dstable["Filtered"] = 1;
106  dstable["Events"] = (Int_t)sf->GetEvents();
107  dstable["TreeName"] = sf->GetTreeName();
108  dstable["BranchName"] = sf->GetBranchName();
109  dstable["DataSet"] = sf->GetDataSet();
110  dstable["System"] = sf->GetSystem();
111  dstable["Run"] = sf->GetRun();
112  dstable["FiltType"] = sf->GetFilterType();
113  dstable["DataQualityAudit"] = sf->GetDataQualityAudit();
114  dstable["OrigFile"] = sf->GetOriginalFile();
115  dstable["Gemini"] = sf->IsGemini();
116  dstable["GemDecayPerEvent"] = sf->GetGemDecayPerEvent();
117  fConfigDB.insert_data_row();
118  }
119  }
120  fConfigDB.end_data_insertion();
121 }
122 
123 #endif
124 
125 
129 
131  : fGuirc(".kvsimdirguirc")
132 #ifdef WITH_RSQLITE
133  , fConfigDB(gSystem->ExpandPathName("$(HOME)/.kvsimdirguidb"))
134 #endif
135  , menus {this}
136 {
137  // Default constructor
138  // main frame
139 
140  fSelectedSimDir = nullptr;
141  fWithPROOF = kFALSE;
142 
143  // make Aclic create all *.so *.d files in separate temporary directories
144  //this is to avoid problems with KVParticleCondition when using PROOF
146 
147  MainFrame = new TGMainFrame(gClient->GetRoot(), 10, 10, kMainFrame | kVerticalFrame);
148  MainFrame->SetName("KaliVedaSim GUI");
149  MainFrame->SetWindowName("KaliVedaSim GUI");
150  MainFrame->Connect("CloseWindow()", "KVSimDirGUI", this, "Exit()");
151 
152  // create menu bar
153  menus.menu_bar = new TGMenuBar(MainFrame, 1, 1, kHorizontalFrame);
154 
155  // mode menu
156  menus.mode.menu = menus.add_popup("&Mode");
157  menus.mode.menu->AddEntry("Analysis", menus.mode.analysis);
158  menus.mode.menu->AddEntry("Filter", menus.mode.filter);
161 
162  // analysis menu
163  menus.analysis.menu = menus.add_popup("&Analysis");
164  menus.analysis.menu->AddEntry("Select analysis class", menus.analysis.select_analysis_class);
166  menus.analysis.generate = menus.add_popup("Generate analysis class...", menus.analysis.menu);
169 
171 
172  // filtering menu
173  menus.filter.menu = menus.add_popup("&Filtering");
174  menus.filter.geometry = menus.add_popup("Detector geometry", menus.filter.menu);
175  if (!gDataSetManager) {
177  dsm->Init();
178  }
179  // datasets have id = 100 + i where i can be given to gDataSetManager->GetDataSet(i)
180  menus.filter.ndatasets = gDataSetManager->GetNtotal();
181  for (int i = 0; i < menus.filter.ndatasets; i++)
182  menus.filter.geometry->AddEntry(gDataSetManager->GetDataSet(i)->GetName(), menus.filter.first_dataset + i);
183 
184  menus.filter.reaction = menus.add_popup("Entrance channel", menus.filter.menu);
186 
189 
191 
192  menus.filter.data_quality = menus.add_popup("Detector performances", menus.filter.menu);
193  for(int i = 0; i<gDataSetManager->GetNtotal(); ++i)
194  fill_dqa_menus_for_dataset(gDataSetManager->GetDataSet(i));
195 
196  menus.filter.id_extension = menus.add_popup("Extend ID range...", menus.filter.menu);
197 
199  menus.filter.options->AddLabel("Filter type");
203  //menus.filter.options->AddEntry("Full", menus.filter.full_filter);
205  menus.filter.options->AddLabel("Kinematics");
211  menus.filter.options->AddLabel("Rotation");
213  menus.filter.options->AddEntry("Randomize phi", menus.filter.random_phi);
215  menus.filter.options->AddLabel("Secondary decay");
217  menus.filter.options->AddEntry("Use Gemini++", menus.filter.use_gemini);
218  menus.filter.options->AddEntry("Add Erot to E*", menus.filter.add_rot_energy);
219 
220  // set default options
221  FilterType(kFTSeuils);
223  Kinematics(kKCM);
225  SetRandomPhi(true);
227  SetGeminiDecay(false);
230 
231  fFilterMode = false;
232  fAnalysisMode = true;
233  menus.menu_bar->RemovePopup("Filtering");
234 
235  // add menu bar to main frame
236  MainFrame->AddFrame(menus.menu_bar);//, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX, 0, 0, 1, 1));
237  auto lh = new TGHorizontal3DLine(MainFrame);
238  MainFrame->AddFrame(lh, new TGLayoutHints(kLHintsTop | kLHintsExpandX));
239 
240  // status bar
241  fStatusBar = new TGStatusBar(MainFrame);
242  MainFrame->AddFrame(fStatusBar, new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX));
243 
245 
246  TGHorizontalFrame* hftop = new TGHorizontalFrame(MainFrame, 10, 10, kHorizontalFrame);
247 
248  TGCompositeFrame* vf = new TGVerticalFrame(hftop, 200, 500, kVerticalFrame);
249  // sim dir buttons
250  TGCompositeFrame* hf = new TGHorizontalFrame(vf, 10, 10, kHorizontalFrame);
251  BaddDir = new TGPictureButton(hf, gClient->GetPicture("package_add.xpm"));
252  hf->AddFrame(BaddDir, new TGLayoutHints(kLHintsLeft | kLHintsTop, 3, 2, 2, 2));
253  BaddDir->Resize(40, 40);
254  BaddDir->SetToolTipText("Add dataset");
255  BaddDir->Connect("Clicked()", "KVSimDirGUI", this, "AddSimDir()");
256  BimpSim = new TGPictureButton(hf, gClient->GetPicture("bld_text.xpm"));
257  hf->AddFrame(BimpSim, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
258  BimpSim->Resize(40, 40);
259  BimpSim->SetToolTipText("Import simulation");
260  BimpSim->Connect("Clicked()", "KVSimDirGUI", this, "ImportSimulation()");
261  BremDir = new TGPictureButton(hf, gClient->GetPicture("package_delete.xpm"));
262  hf->AddFrame(BremDir, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
263  BremDir->Resize(40, 40);
264  BremDir->SetToolTipText("Remove dataset");
265  BremDir->Connect("Clicked()", "KVSimDirGUI", this, "RemSimDir()");
266  BrefreshDir = new TGPictureButton(hf, gClient->GetPicture("refresh2.xpm"));
267  hf->AddFrame(BrefreshDir, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
268  BrefreshDir->Resize(40, 40);
269  BrefreshDir->SetToolTipText("Update");
270  BrefreshDir->Connect("Clicked()", "KVSimDirGUI", this, "RefreshSimDir()");
271  BimpSim->SetEnabled(kFALSE);
272  BremDir->SetEnabled(kFALSE);
273  BrefreshDir->SetEnabled(kFALSE);
274 
275  vf->AddFrame(hf, new TGLayoutHints(kLHintsTop | kLHintsLeft, 2, 2, 2, 2));
276 
277  // canvas widget
278  fDirListCanvas = new TGCanvas(vf, 172, 400);
279  // canvas viewport
280  fDirListViewPort = fDirListCanvas->GetViewPort();
281  // list tree
282  fDirListTree = new TGListTree(fDirListCanvas, kHorizontalFrame);
283 
284  popen = gClient->GetPicture("package_add.xpm");
285  pclose = gClient->GetPicture("package_add.xpm");
286 
287  fDirListViewPort->AddFrame(fDirListTree);
288  fDirListTree->SetLayoutManager(new TGHorizontalLayout(fDirListTree));
289  fDirListTree->MapSubwindows();
290  fDirListTree->Connect("Clicked(TGListTreeItem*,Int_t)", "KVSimDirGUI", this, "SelectSimDir(TGListTreeItem*,Int_t)");
291  fDirListTree->Connect("DoubleClicked(TGListTreeItem*,Int_t)", "KVSimDirGUI", this, "AddAuxDir(TGListTreeItem*,Int_t)");
292  fDirListCanvas->SetContainer(fDirListTree);
293  fDirListCanvas->MapSubwindows();
294  vf->AddFrame(fDirListCanvas, new TGLayoutHints(kLHintsTop | kLHintsExpandY, 5, 2, 2, 10));
295 
296  hftop->AddFrame(vf, new TGLayoutHints(kLHintsExpandY | kLHintsTop, 2, 2, 2, 2));
297 
298  /* lists of data in simdir */
299  vf = new TGVerticalFrame(hftop, 600, 500, kVerticalFrame);
300  TGGroupFrame* group = new TGGroupFrame(vf, "Simulations");
301  fLVsimData = new KVListView(KVSimFile::Class(), group, 550, 200);
302  fLVsimData->SetDataColumns(3);
303  fLVsimData->SetDataColumn(0, "Name");
304  fLVsimData->SetDataColumn(1, "Info", "GetTitle");
305  fLVsimData->SetDataColumn(2, "Events");
306  fLVsimData->ActivateSortButtons();
307  fLVsimData->AllowContextMenu(kFALSE);
308  group->AddFrame(fLVsimData, new TGLayoutHints(kLHintsTop | kLHintsExpandX | kLHintsExpandY, 5, 5, 10, 10));
310  group = new TGGroupFrame(vf, "Filtered Simulations");
311  fLVfiltData = new KVListView(KVSimFile::Class(), group, 550, 200);
312  fLVfiltData->SetDataColumns(9);
313  fLVfiltData->SetDataColumn(0, "Simulation", "GetOriginalFile");
314  fLVfiltData->SetDataColumn(1, "DataSet/Geometry", "GetDataSet");
315  fLVfiltData->SetDataColumn(2, "System/Kinematics", "GetSystem");
316  fLVfiltData->SetDataColumn(3, "Run");
317  fLVfiltData->SetDataColumn(4, "FilterType");
318  fLVfiltData->SetDataColumn(5, "Detector performances", "GetDataQualityAudit");
319  fLVfiltData->SetDataColumn(6, "Gemini", "IsGemini");
320  fLVfiltData->SetDataColumn(7, "Decay/event", "GetGemDecayPerEvent");
321  fLVfiltData->SetDataColumn(8, "Events");
322  fLVfiltData->ActivateSortButtons();
323  fLVfiltData->AllowContextMenu(kFALSE);
324  group->AddFrame(fLVfiltData, new TGLayoutHints(kLHintsTop | kLHintsExpandX | kLHintsExpandY, 5, 5, 10, 10));
326 
327  hftop->AddFrame(vf, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10, 10, 10, 10));
328  MainFrame->AddFrame(hftop, new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 1, 1, 1, 1));
329 
330  vf = new TGVerticalFrame(MainFrame, 600, 200, kVerticalFrame);
331  hf = new TGHorizontalFrame(vf, 600, 200, kHorizontalFrame);
332 
333  auto lab = new TGLabel(hf, "Events : ");
334  hf->AddFrame(lab, new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 2, 2, 2, 2));
335  fCBAllEvents = new TGCheckButton(hf, "all");
336  hf->AddFrame(fCBAllEvents, new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 2, 2, 2, 2));
338  hf->AddFrame(fNENumberEvents, new TGLayoutHints(kLHintsCenterY | kLHintsLeft, 2, 2, 2, 2));
339  fCBAllEvents->Connect("Toggled(Bool_t)", "KVSimDirGUI", this, "EnableEventNumberEntry(Bool_t)");
340  fCBAllEvents->SetState(kButtonDown, kTRUE);
341 
342  proof_analysis = new TGPictureButton(hf, gClient->GetPicture("proof_base.xpm"));
343  proof_analysis->Connect("Pressed()", "KVSimDirGUI", this, "EnableProof()");
344  proof_analysis->Connect("Released()", "KVSimDirGUI", this, "DisableProof()");
345  if (!gBatchSystemManager) new KVBatchSystemManager;
346  gBatchSystemManager->GetDefaultBatchSystem()->cd();
347  proof_analysis->SetToolTipText(gBatchSystem->GetTitle());
348  proof_analysis->Resize(40, 40);
349  proof_analysis->AllowStayDown(kTRUE);
350 
351  TGPictureButton* launch_analysis = new TGPictureButton(hf, gClient->GetPicture("query_submit.xpm"));
352  launch_analysis->Connect("Clicked()", "KVSimDirGUI", this, "Run()");
353  launch_analysis->SetToolTipText("Run analysis/filter");
354  launch_analysis->Resize(40, 40);
355 
356  hf->AddFrame(launch_analysis, new TGLayoutHints(kLHintsCenterY | kLHintsRight, 5, 2, 2, 2));
357  hf->AddFrame(proof_analysis, new TGLayoutHints(kLHintsCenterY | kLHintsRight, 5, 2, 2, 2));
358 
359  vf->AddFrame(hf, new TGLayoutHints(kLHintsExpandX | kLHintsTop, 0, 0, 0, 0));
360  MainFrame->AddFrame(vf, new TGLayoutHints(kLHintsExpandX | kLHintsTop, 10, 10, 15, 10));
361 
362 
363  MainFrame->SetMWMHints(kMWMDecorAll,
364  kMWMFuncAll,
366  MainFrame->MapSubwindows();
367 
368  MainFrame->Resize(MainFrame->GetDefaultSize());
369  MainFrame->MapWindow();
370  // MainFrame->Resize(200,500);
371 #ifdef WITH_RSQLITE
372  // define tables in DB if not already done
373  bool sqlite_conversion = false;
374  if (!fConfigDB.get_number_of_tables()) {
375  sqlite_conversion = true;
376  KVSQLite::table datasets("Datasets");
377  datasets.add_column("Id", "INTEGER");
378  datasets.primary_key("Id");
379  datasets.add_column("Name", "TEXT");
380  datasets.add_column("Directory", "TEXT");
381  datasets.add_column("AuxDir", "TEXT");
382  datasets.add_column("Table", "TEXT");
383  fConfigDB.add_table(datasets);
384  }
385  if (!sqlite_conversion) {
386  // check Datasets table has AuxDir column
387  if (!fConfigDB["Datasets"].has_column("AuxDir"))
388  fConfigDB.add_column("Datasets", "AuxDir", "TEXT");
389  // use existing sqlite database to reconstruct simdirs
390  ReconstructSimDirsFromDB();
391  FillTreeList();
392  return;
393  }
394 #endif
395  // use .guirc to fill the list of sim dirs
396  KVString simdirs = fGuirc.GetValue("SimDirs", "");
397  if (simdirs != "") {
398 #ifdef WITH_RSQLITE
399  if (sqlite_conversion) {
400  // we are converting from the old TEnv back end to sqlite
401  // need to fill table of Datasets
402  fConfigDB.prepare_data_insertion("Datasets");
403  }
404  int ds_table = 0;
405 #endif
406  simdirs.Begin(" ");
407  std::unordered_map<std::string,int> simdirs_to_remove;
408  while (!simdirs.End()) {
409  KVString simdir = simdirs.Next();
410  KVString simdirectory = fGuirc.GetValue(Form("%s.Directory", simdir.Data()), "");
411  // check for stale (removed) directories!
412  if(gSystem->AccessPathName(simdirectory))
413  {
414  KVError::Warning(this, "KVSimDirGUI", "Dataset %s: directory %s no longer exists [CLEANUP]",
415  simdir.Data(), simdirectory.Data());
416  ++simdirs_to_remove[simdir.Data()];
417  remove_dataset_from_sqlitedb(simdir.Data());
418  continue;
419  }
420  KVSimDir* sd = new KVSimDir(simdir, simdirectory);
421 #ifdef WITH_RSQLITE
422  if (sqlite_conversion) {
423  fConfigDB["Datasets"]["Name"] = simdir;
424  fConfigDB["Datasets"]["Directory"] = simdirectory;
425  fConfigDB["Datasets"]["AuxDir"].set_null();
426  fConfigDB.insert_data_row();
427  }
428 #endif
429  sd->AnalyseDirectory();
430  fListOfDirs.Add(sd);
431  }
432  if(simdirs_to_remove.size())
433  {
434  KVString new_sim_dirs;
435  simdirs.Begin(" ");
436  while(!simdirs.End())
437  {
438  auto simdirectory = simdirs.Next(kTRUE);
439  if(auto search = simdirs_to_remove.find(simdirectory.Data()); search == simdirs_to_remove.end())
440  {
441  if(new_sim_dirs.Length())
442  new_sim_dirs.Append(" ");
443  new_sim_dirs += simdirectory;
444  }
445  simdirs = new_sim_dirs;
446  fGuirc.SetValue("SimDirs", simdirs);
447  fGuirc.SaveLevel(kEnvUser);
448  }
449  }
450 #ifdef WITH_RSQLITE
451  if (sqlite_conversion) {
452  fConfigDB.end_data_insertion();
453  TIter itdir(&fListOfDirs);
454  KVSimDir* sd = nullptr;
455  while ((sd = (KVSimDir*)itdir())) {
456  // add table for dataset
457  TString ds_table_name = AddTableForDataSet(sd, ds_table);
458  // fill table with infos
459  FillDataSetTableWithInfos(ds_table_name, sd);
460  ++ds_table;
461  }
462  }
463 #endif
464  FillTreeList();
465  }
466 }
467 
468 
469 
471 
473 {
474  EmptyTreeList();
475  TIter next(&fListOfDirs);
476  TObject* o;
477  while ((o = next())) {
478  TGListTreeItem* item0 = fDirListTree->AddItem(NULL, o->GetName());
479  item0->SetPictures(popen, pclose);
480  fDirListTree->CloseItem(item0);
481  }
482 }
483 
484 
485 
487 
489 {
490  TGListTreeItem* first = fDirListTree->GetFirstItem();
491  while (first) {
492  fDirListTree->DeleteItem(first);
493  first = fDirListTree->GetFirstItem();
494  }
495  BremDir->SetEnabled(kFALSE);
496  BimpSim->SetEnabled(kFALSE);
497  BrefreshDir->SetEnabled(kFALSE);
498 }
499 
500 
501 
503 
505 {
506  static TString dir(".");
507  TGFileInfo fi;
508  fi.fIniDir = StrDup(dir);
509  new KVFileDialog(gClient->GetDefaultRoot(), MainFrame, kKVFDDirectory, &fi);
510  if (fi.fFilename) {
511  TString simdirname;
512  Bool_t ok;
513  TString quest;
514  quest.Form("Enter name for dataset %s", fi.fIniDir);
515  new KVInputDialog(MainFrame, quest, &simdirname, &ok);
516  simdirname.ReplaceAll(" ", "_"); //no spaces in name
517  if (ok) {
518  KVSimDir* sd = new KVSimDir(simdirname, fi.fIniDir);
519  sd->AnalyseDirectory();
520  fListOfDirs.Add(sd);
521  FillTreeList();
522  fLVsimData->Display(sd->GetSimDataList());
523  fLVfiltData->Display(sd->GetFiltDataList());
524  // add to guirc file
525  TString simdirs = fGuirc.GetValue("SimDirs", "");
526  if (simdirs != "") simdirs += " ";
527  simdirs += simdirname;
528  fGuirc.SetValue("SimDirs", simdirs);
529  fGuirc.SetValue(Form("%s.Directory", simdirname.Data()), sd->GetDirectory());
530  fGuirc.SaveLevel(kEnvUser);
531 #ifdef WITH_RSQLITE
532  //update database
533  int ds_table_num = 0;
534  if (fConfigDB.count("Datasets")) {
535  // get name/number of last dataset table
536  KVNameValueList table_names = fConfigDB.get_name_value_list("Datasets", "Name", "Table");
537  // don't assume tables are sorted according to table number!
538  for(auto& par : table_names)
539  {
540  int tab_num = -1;
541  if(sscanf(par.GetString(), "Table_%d", &tab_num)==1)
542  if(tab_num>ds_table_num) ds_table_num=tab_num;
543  }
544  ++ds_table_num;
545  }
546  fConfigDB.prepare_data_insertion("Datasets");
547  fConfigDB["Datasets"]["Name"] = simdirname;
548  fConfigDB["Datasets"]["Directory"] = sd->GetDirectory();
549  fConfigDB["Datasets"]["AuxDir"].set_null();
550  fConfigDB.insert_data_row();
551  fConfigDB.end_data_insertion();
552  TString table_name = AddTableForDataSet(sd, ds_table_num);
553  FillDataSetTableWithInfos(table_name, sd);
554 #endif
555  }
556  }
557  dir = fi.fIniDir;
558 }
559 
560 
561 
563 
565 {
566  if (!fSelectedSimDir) return;
567  fSelectedSimDir->AnalyseDirectory();
568  fLVsimData->Display(fSelectedSimDir->GetSimDataList());
569  fLVfiltData->Display(fSelectedSimDir->GetFiltDataList());
570 #ifdef WITH_RSQLITE
571  fConfigDB.select_data("Datasets", "Table", Form("Name=\"%s\"", fSelectedSimDir->GetName()));
572  TString ds_table_name;
573  while (fConfigDB.get_next_result()) ds_table_name = fConfigDB["Datasets"]["Table"].get_data<TString>();
574  fConfigDB.clear_table(ds_table_name);
575  FillDataSetTableWithInfos(ds_table_name, fSelectedSimDir);
576 #endif
577 }
578 
579 
580 
582 
583 void KVSimDirGUI::remove_dataset_from_sqlitedb(const Char_t* ds_name)
584 {
585 #ifdef WITH_RSQLITE
586  fConfigDB.select_data("Datasets", "Table", Form("Name = '%s'", ds_name));
587  TString ds_table_name;
588  while (fConfigDB.get_next_result()) ds_table_name = fConfigDB["Datasets"]["Table"].get_data<TString>();
589  fConfigDB.delete_rows_in_table("Datasets", Form("Name = '%s'", ds_name));
590  // and delete table with dataset data
591  fConfigDB.delete_table(ds_table_name);
592 #endif
593 }
594 
595 
596 
598 
600 {
601  if (!fSelectedSimDir) return;
602  fListOfDirs.Remove(fSelectedSimDir);
603  // there is no way of removing a name-value pair from a TEnv!!
604  fGuirc.SetValue(Form("%s.Directory", fSelectedSimDir->GetName()), "");
605 
606  // remove from datasets table
607  remove_dataset_from_sqlitedb(fSelectedSimDir->GetName());
608 
609  delete fSelectedSimDir;
610  fSelectedSimDir = nullptr;
611  FillTreeList();
612  fLVsimData->RemoveAll();
613  fLVfiltData->RemoveAll();
614  // update guirc file
615  TString simdirs = "";
616  TIter next(&fListOfDirs);
617  KVSimDir* togo;
618  while ((togo = (KVSimDir*)next())) {
619  if (simdirs != "") simdirs += " ";
620  simdirs += togo->GetName();
621  fGuirc.SetValue(Form("%s.Directory", togo->GetName()), togo->GetDirectory());
622  }
623  fGuirc.SetValue("SimDirs", simdirs);
624  fGuirc.SaveLevel(kEnvUser);
625 }
626 
627 
628 
630 
632 {
633  fSelectedSimDir = (KVSimDir*)fListOfDirs.FindObject(simdir->GetText());
634  if (fSelectedSimDir) {
635  fLVsimData->Display(fSelectedSimDir->GetSimDataList());
636  fLVfiltData->Display(fSelectedSimDir->GetFiltDataList());
637  BremDir->SetEnabled();
638  BimpSim->SetEnabled();
639  BrefreshDir->SetEnabled();
640  }
641  else {
642  BremDir->SetEnabled(kFALSE);
643  BimpSim->SetEnabled(kFALSE);
644  BrefreshDir->SetEnabled(kFALSE);
645  }
646 }
647 
648 
650 
652 {
653  fSelectedSimDir = (KVSimDir*)fListOfDirs.FindObject(simdir->GetText());
654  if (fSelectedSimDir) {
655  if (!fSelectedSimDir->HasAuxDirectory()) {
656  TString dir(fSelectedSimDir->GetDirectory());
657  TGFileInfo fi;
658  fi.fIniDir = StrDup(dir);
659  new KVFileDialog(gClient->GetDefaultRoot(), MainFrame, kKVFDDirectory, &fi);
660  if (fi.fFilename && TString(fi.fIniDir) != fSelectedSimDir->GetDirectory()) {
661  fSelectedSimDir->SetAuxDirectory(fi.fIniDir);
662  // add info to dataset table in db for next time
663 #ifdef WITH_RSQLITE
664  fConfigDB["Datasets"]["AuxDir"] = fi.fIniDir;
665  fConfigDB.update("Datasets", "AuxDir", Form("Name = '%s'", fSelectedSimDir->GetName()));
666 #endif
667  RefreshSimDir();
668  }
669  }
670  }
671 }
672 
673 
674 
676 
678 {
679  static TString dir(gSystem->pwd());
680  const char* filetypes[] = {
681  "Class header files", "*.h",
682  0, 0
683  };
684  TGFileInfo fi;
685  fi.fIniDir = StrDup(dir);
686  fi.fFileTypes = filetypes;
687  new KVFileDialog(gClient->GetDefaultRoot(), MainFrame, kKVFDOpen, &fi);
688  if (fi.fFilename) {
689  fAnalClass.name = gSystem->BaseName(fi.fFilename);
690  Int_t idot = fAnalClass.name.Index(".");
691  if (idot < 0) return;
692  fAnalClass.name.Remove(idot, 2);
693  if (FindClassSourceFiles(fAnalClass.name, fAnalClass.imp_file, fAnalClass.dec_file, fi.fIniDir)) {
694  fAnalClass.dir_name = fi.fIniDir;
696  }
697  }
698  dir = fi.fIniDir;
699 }
700 
701 
702 
704 
706 {
707  fNENumberEvents->SetState(!on);
708 }
709 
710 
711 
721 
722 void KVSimDirGUI::fill_dqa_menus_for_dataset(const KVDataSet* ds)
723 {
724 // TIter itdqa(menus.filter.data_quality->GetListOfEntries());
725 // while (auto entry = (TGMenuEntry*)itdqa()) {
726 // if (entry->GetPopup())
727 // delete entry->GetPopup();
728 // menus.filter.data_quality->DeleteEntry(entry);
729 // }
730 // menus.filter.DQA_map.clear();
731  // fill data quality menu
732  if(!menus.filter.last_dqa)
733  {
738  menus.filter.data_quality->AddEntry("From file...", menus.filter.last_dqa++);
739 
740  }
741  if (ds->FindDataSetFile("DataQualityAudit.root")) {
742  Info("KVSimDirGUI", "Adding data quality audits for dataset %s...", ds->GetName());
743  std::unique_ptr<TFile> dqaf(TFile::Open(ds->GetFullPathToDataSetFile("DataQualityAudit.root")));
744  // add pop-up with name of dataset
745  auto ds_popup = menus.add_popup(ds->GetName(), menus.filter.data_quality);
746  std::unordered_map<std::string, TGPopupMenu*> DQA_system_popups;
747  menus.filter.DQA_map[menus.filter.last_dqa] = {ds->GetName(), ds_popup/*menus.filter.data_quality*/};
748  ds_popup/*menus.filter.data_quality*/->AddEntry("all reactions", menus.filter.last_dqa++);
749  auto systems = ds->GetDataBase("minimal")->GetSystems();
750  TIter next(systems);
751  KVDBSystem* sys;
752  while ((sys = (KVDBSystem*)next())) {
753  if (sys->IsCollision()) {
754  if (dqaf->FindKey(sys->GetBatchNameWithoutEnergy())) {
755  if (DQA_system_popups.find(sys->GetBatchNameWithoutEnergy().Data()) == DQA_system_popups.end()) {
756  DQA_system_popups[sys->GetBatchNameWithoutEnergy().Data()] =
757  menus.add_popup(sys->GetReactionNameWithoutEnergy(), ds_popup /*menus.filter.data_quality*/);
759  DQA_system_popups[sys->GetBatchNameWithoutEnergy().Data()]};
760  DQA_system_popups[sys->GetBatchNameWithoutEnergy().Data()]->AddEntry("all energies", menus.filter.last_dqa++);
761  }
762  if (dqaf->FindKey(sys->GetBatchName())) {
763  menus.filter.DQA_map[menus.filter.last_dqa] = {Form("%s/%s", ds->GetName(), sys->GetBatchName().Data()),
764  DQA_system_popups[sys->GetBatchNameWithoutEnergy().Data()]};
765  DQA_system_popups[sys->GetBatchNameWithoutEnergy().Data()]->AddEntry(sys->GetReactionEnergyWithoutName(), menus.filter.last_dqa++);
766  }
767  }
768  }
769  }
770  }
771 }
772 
773 
774 
776 
777 void KVSimDirGUI::SelectDataSet(const char* name)
778 {
779  KVDataSet* ds = gDataSetManager->GetDataSet(name);
780  if (ds) {
781  fDataset = name;
782  fSystem = "";
783  fRun = 0;
784  GeoType(kGTROOT);
785  auto systems = ds->GetDataBase("minimal")->GetSystems();
787  while (auto me = (TGMenuEntry*)it()) {
788  if (me->GetEntryId() != menus.filter.ad_hoc_reaction) menus.filter.reaction->DeleteEntry(me);
789  }
791  if (systems) {
792  TIter next(systems);
793  KVDBSystem* sys;
794  int i = menus.filter.ad_hoc_reaction;
795  while ((sys = (KVDBSystem*)next())) {
796  if (sys->IsCollision()) menus.filter.reaction->AddEntry(sys->GetName(), ++i);
797  }
799  }
800  }
801  else
802  fDataset="";
803  // update list of extendible identification telescopes
805 }
806 
807 
808 
814 
816 {
817  // Called when a data quality audit is selected in the list.
818  //
819  // The name of the audit is in fDataQualityAudit: "[dataset]/[system]" or "[dataset]"
820  // (if fDataQualityAudit="" this means no data quality audit, i.e. "[none]" was selected)
821 
822  fDataQualityAudit.Begin("/");
823  auto DQA_dataset = fDataQualityAudit.Next();
824 
825  // remove any existing entries in 'extensible id' list
827  while (auto me = (TGMenuEntry*)it()) {
829  }
830 
831  // no DQA required or no dataset selected: nothing to do
832  if(DQA_dataset.IsNull() || fDataset.IsNull()) return;
833 
834  if(DQA_dataset=="file")
835  {
836  // use audit in file
837  static TString audit_dir(gSystem->pwd());
838  const char* filetypes[] = {
839  "ROOT files", "*.root",
840  0, 0
841  };
842  TGFileInfo fi;
843  fi.fIniDir = StrDup(audit_dir);
844  fi.fFileTypes = filetypes;
845  new KVFileDialog(gClient->GetDefaultRoot(), MainFrame, kKVFDOpen, &fi);
846  if (fi.fFilename) {
847  fDataQualityAudit = Form("file:%s",fi.fFilename);
848  Info("SelectDataQualityAudit","path:%s",fDataQualityAudit.Data());
849  }
850  audit_dir = fi.fIniDir;
851  }
852 
853  KVString arrays_with_exId = gEnv->GetValue("FilterGroupReconstructor.HasExtendibleIdentifications", "");
854  if(arrays_with_exId.IsNull()) return;
855 
856  // we deduce the names of the arrays from the name of the dataset chosen
857  // to define the detector geometry used to filter the data
858  arrays_with_exId.Begin(" ");
859  int i = menus.filter.id_extensions;
860  while(!arrays_with_exId.End())
861  {
862  auto array = arrays_with_exId.Next(kTRUE);
863  if(fDataset.Contains(array))
864  {
865  KVString exId_for_array = gEnv->GetValue(Form("%s.ExtendibleIdentifications",array.Data()),"");
866  if(!exId_for_array.IsNull())
867  {
868  exId_for_array.Begin(" ");
869  while(!exId_for_array.End())
870  {
871  menus.filter.id_extension->AddEntry(exId_for_array.Next(true), i++);
872  }
873  }
874  }
875  }
876 }
877 
878 
879 
881 
882 void KVSimDirGUI::SelectSystem(const char* sysname)
883 {
885  while (auto me = (TGMenuEntry*)it()) {
886  if (me->GetEntryId() != menus.filter.no_run_number) menus.filter.run_number->DeleteEntry(me);
887  }
889  fRun = 0;
890  fSystem = sysname;
891  KVDBSystem* sys = gDataSetManager->GetDataSet(fDataset)->GetDataBase("minimal")->GetSystem(sysname);
892  if (sys) {
893  for(auto p_dbr : sys->GetRuns())
894  {
895  auto dbr = dynamic_cast<KVDBRun*>(p_dbr);
896  menus.filter.run_number->AddEntry(Form("%d", dbr->GetNumber()), dbr->GetNumber() + menus.filter.no_run_number);
897  menus.filter.last_run = dbr->GetNumber() + menus.filter.no_run_number;
898  }
899  }
900 }
901 
902 
903 
906 
908 {
909  // Called when "Process" button is pressed to launch the analysis
910 
911  if (fAnalysisMode)
912  RunAnalysis("tree");
913  else if (fFilterMode) {
914  if (fDataset == "") { // Make sure a dataset has been chosen
915  new TGMsgBox(gClient->GetRoot(), MainFrame, "KVSimDirGUI::Run", "First choose the dataset which describes the geometry!", kMBIconExclamation);
916  return;
917  }
918  RunAnalysis("filter");
919  }
920 }
921 
922 
923 
925 
927 {
928  auto selected_sim_runs = fLVsimData->GetSelectedObjects();
929  auto selected_filt_runs = fLVfiltData->GetSelectedObjects();
930  KVUnownedList runs_to_analyse, aux_runs_to_analyse;
931  TString analysis_task;
932  if (type == "tree") { // analysis of simulated or filtered events
933  if (!selected_sim_runs.GetEntries() && !selected_filt_runs.GetEntries()) {
934  new TGMsgBox(gClient->GetRoot(), MainFrame, "KVSimDirGUI::RunAnalysis", "Choose one or more simulated or filtered data files!", kMBIconExclamation);
935  return;
936  }
937  // if (selected_sim_runs->GetEntries() && selected_filt_runs->GetEntries()) {
938  // new TGMsgBox(gClient->GetRoot(), MainFrame, "KVSimDirGUI::RunAnalysis", "Choose EITHER simulated or filtered data files!", kMBIconExclamation);
939  // return;
940  // }
941  if (!fAnalClass.with_files()) {
942  new TGMsgBox(gClient->GetRoot(), MainFrame, "KVSimDirGUI::RunAnalysis", "Choose a valid analysis class!", kMBIconExclamation);
943  return;
944  }
945  if (selected_sim_runs.GetEntries()) {
946  if (selected_filt_runs.GetEntries()) {
947  // if both simulated & filtered events are selected, we assume the user wants to analyse filtered
948  // data while having access to the original non-filtered data as an auxiliary/"friend" tree
949  runs_to_analyse = selected_filt_runs;
950  analysis_task = "analysis filtered";
951  aux_runs_to_analyse = selected_sim_runs;
952  }
953  else {
954  runs_to_analyse = selected_sim_runs;
955  analysis_task = "analysis simulated";
956  }
957  }
958  else {
959  runs_to_analyse = selected_filt_runs;
960  analysis_task = "analysis filtered";
961  }
962  }
963  else {
964  // filtering
965  if (selected_filt_runs.GetEntries()) {
966  new TGMsgBox(gClient->GetRoot(), MainFrame, "KVSimDirGUI::RunFilter", "Only simulated events can be filtered!", kMBIconExclamation);
967  return;
968  }
969  if (!selected_sim_runs.GetEntries()) {
970  new TGMsgBox(gClient->GetRoot(), MainFrame, "KVSimDirGUI::RunFilter", "Choose a simulated data file to filter!", kMBIconExclamation);
971  return;
972  }
973  runs_to_analyse = selected_sim_runs;
974  analysis_task = "filter simulated";
975  // if working directory is outside of the default directory of the current KVSimDir
976  // set auxiliary directory to current working directory (where filter should output any new files)
977  fSelectedSimDir = dynamic_cast<KVSimFile*>(runs_to_analyse.First())->GetSimDir();
978  if (!fSelectedSimDir->HasAuxDirectory() && TString(gSystem->pwd())!=TString(fSelectedSimDir->GetDirectory())) {
979  fSelectedSimDir->SetAuxDirectory(gSystem->pwd());
980 #ifdef WITH_RSQLITE
981  // add info to dataset table in db for next time
982  fConfigDB["Datasets"]["AuxDir"] = gSystem->pwd();
983  fConfigDB.update("Datasets", "AuxDir", Form("Name = '%s'", fSelectedSimDir->GetName()));
984 #endif
985  }
986  }
987  KVDataAnalysisTask* anTask = gDataSetManager->GetAnalysisTaskAny(analysis_task);
988  gDataAnalyser = KVDataAnalyser::GetAnalyser(anTask->GetDataAnalyser());
989  gDataAnalyser->SetAnalysisTask(anTask);
990  gDataAnalyser->SetFileList(runs_to_analyse);
991  if (aux_runs_to_analyse.GetEntries()) gDataAnalyser->SetAuxFileList(aux_runs_to_analyse);
992  if (anTask->WithUserClass()) {
993  gDataAnalyser->SetUserClass(fAnalClass);
994  if (!gDataAnalyser->IsUserClassValid()) {
995  new TGMsgBox(gClient->GetRoot(), MainFrame, "KVSimDirGUI::RunAnalysis", "Compilation failed. Correct mistakes and try again!", kMBIconExclamation);
996  }
997  }
998  else if (strcmp(anTask->GetUserBaseClass(), ""))
999  gDataAnalyser->SetUserClass(KVDataAnalyser::UserClass{anTask->GetUserBaseClass()}, kFALSE);//task with default "user" class
1000  Bool_t all_events = fCBAllEvents->IsDown();
1001  if (!all_events)
1002  gDataAnalyser->SetNbEventToRead((Long64_t)fNENumberEvents->GetNumber());
1003  else
1004  gDataAnalyser->SetNbEventToRead(0);
1005  fCancelJob = kFALSE;
1006  if (type == "filter") {
1007  // set extra infos in kvsimdiranalyser for auto jobname
1008  if (fCustomKinematics) {
1009  // if an ad hoc system is used for the kinematics, we have to use it instead of fSystem,
1010  // but only after first checking if it is legit
1011  KV2Body cd(fReactionKinematics);
1012  // check valid ad hoc system given by user
1013  if (cd.IsZombie()) {
1014  KVError::Error(this, "SetFilterOptions", "Please check the format of the ad hoc system name you gave");
1015  WarningBox("Bad System", "Please check the format of the ad hoc system name you gave", kFALSE);
1016  fCancelJob = kTRUE;
1017  }
1018  else {
1019  cd.CalculateKinematics();
1020  cd.Print();
1021  fSystem = fReactionKinematics;
1022  }
1023  }
1024 
1025  KVSimDirAnalyser* simda = dynamic_cast<KVSimDirAnalyser*>(gDataAnalyser);
1026  simda->SetDataSetForFilter(fDataset);
1027  simda->SetSystemForFilter(fSystem);
1028  }
1029  Bool_t cancel_batch_job = kFALSE;
1030  if (fWithPROOF) {
1031  gBatchSystem->Clear();
1032  KVNameValueList batchParams;
1033  gBatchSystem->GetBatchSystemParameterList(batchParams);
1034  new KVBatchSystemParametersGUI(MainFrame, &batchParams, gDataAnalyser, &cancel_batch_job);
1035  if (!cancel_batch_job) {
1036  gBatchSystem->SetBatchSystemParameters(batchParams);
1037  gDataAnalyser->SetBatchSystem(gBatchSystem);
1038  }
1039  }
1040  if (!cancel_batch_job && !fCancelJob) {
1041  if (type == "filter")
1042  SetFilterOptions(); // this may yet set fCancelJob=true...
1043  if (!fCancelJob) {
1044  if(type == "filter")
1045  {
1046  // at this point it is best to make sure the full database has been built and is available for the dataset
1047  // we may have only built a minimal db with runs&systems. we don't want every prooflite/batch job to try
1048  // to build the database at the same time
1049  Info("RunAnalysis", "Forcing rebuild of complete dataset for %s if necessary", fDataset.Data());
1050  gDataSetManager->GetDataSet(fDataset)->cd();
1051  }
1052  gDataAnalyser->Run();
1053  }
1054  }
1055  if(!fWithPROOF || (fWithPROOF && gBatchSystem->IsCalled("PROOFLite")))
1056  RefreshSimDir();
1057 }
1058 
1059 
1060 
1062 
1063 TString KVSimDirGUI::GetKinematicsString()
1064 {
1065  TString kinema;
1066  if (fKine == kKCM) kinema = "cm";
1067  else if (fKine == kKProj) kinema = "proj";
1068  else kinema = "lab";
1069 
1070  return kinema;
1071 }
1072 
1073 
1074 
1076 
1078 {
1079  TString filter;
1080  switch (fFilterType) {
1081  case kFTGeo:
1082  filter = "Geo";
1083  break;
1084  case kFTSeuils:
1085  filter = "GeoThresh";
1086  break;
1087  case kFTFull:
1088  filter = "Full";
1089  }
1090 
1091  return filter;
1092 }
1093 
1094 
1095 
1097 
1098 void KVSimDirGUI::SetFilterOptions()
1099 {
1100  TString kinema = GetKinematicsString();
1101  TString filter = GetFilterTypeString();
1102 
1103  TString options;
1104  options = Form("Dataset=%s,", fDataset.Data());
1105  if (fSystem != "") options += Form("System=%s,", fSystem.Data());
1106  else if (kinema != "lab") {
1107  // a kinematical frame transform is required, but no system is given!
1108  new TGMsgBox(gClient->GetRoot(), MainFrame,
1109  "KVSimDirGUI::SetFilterOptions",
1110  Form("Cannot transform kinematics from %s to lab without a defined reaction (system)!", kinema.Data()),
1111  kMBIconExclamation);
1112  fCancelJob = true;
1113  return;
1114  }
1115  options += Form("Filter=%s,", filter.Data());
1116  options += Form("Kinematics=%s", kinema.Data());
1117  if (fDataQualityAudit != "") {
1118  options += Form(",DataQualityAudit=%s", fDataQualityAudit.Data());
1119  // add list of any extensible IDs given
1120  fExtensibleIDs="";
1122  while (auto me = (TGMenuEntry*)it())
1123  {
1124  if(menus.filter.id_extension->IsEntryChecked(me->GetEntryId()))
1125  {
1126  if(fExtensibleIDs.Length())
1127  fExtensibleIDs+="|";
1128  fExtensibleIDs+=me->GetName();
1129  }
1130  }
1131  if(fExtensibleIDs.Length())
1132  options += Form(",ExtensibleID=%s",fExtensibleIDs.Data());
1133  }
1134  if (fRun != 0) {
1135  TString r;
1136  r.Form(",Run=%d", fRun);
1137  options += r;
1138  }
1139  else if (filter == "Full" && (fCustomKinematics || fSystem == "")) {
1140  // "Full" filter requires run number to work: either given explicitly or taken from first run of database system (not ad hoc)
1141  new TGMsgBox(gClient->GetRoot(), MainFrame,
1142  "KVSimDirGUI::SetFilterOptions",
1143  Form("To use 'FULL' (run-dependent) filter requires either a run number or a system from the dataset!"),
1144  kMBIconExclamation);
1145  fCancelJob = true;
1146  return;
1147  }
1148  if (!fRandomPhi) options += ",PhiRot=no";
1149  if (fGemDecay) {
1150  options += ",Gemini=yes";
1151  options += Form(",GemDecayPerEvent=%d", fGemDecayPerEvent);
1152  if (fGemAddRotEner) options += Form(",GemAddRotEner=yes");
1153  }
1154 
1155  gDataAnalyser->SetUserClassOptions(options);
1156 
1157  std::cout << options << std::endl;
1158 }
1159 
1160 
1161 
1164 
1166 {
1167  // Import simulation data from currently selected directory
1168 
1169  const char* filetypes[] = {
1170  "All files", "*.*",
1171  0, 0
1172  };
1173  TGFileInfo fi;
1174  fi.fIniDir = StrDup(fSelectedSimDir->GetDirectory());
1175  fi.fFileTypes = filetypes;
1176  fi.SetMultipleSelection(true);
1177 
1178  new KVFileDialog(gClient->GetDefaultRoot(), MainFrame, kKVFDOpen, &fi);
1179 
1180  bool one_file = (!fi.fMultipleSelection && fi.fFilename);
1181  bool many_files = (fi.fMultipleSelection && fi.fFileNamesList);//may only be one
1182  if (one_file || many_files) {
1183  // set up list of KVSimReader plugins
1184  KVString plugins = KVBase::GetListOfPlugins("KVSimReader");
1185  KVString choices;
1186  plugins.Begin(" ");
1187  while (!plugins.End()) {
1188  // get URI corresponding to plugin
1189  KVString uri = KVBase::GetPluginURI("KVSimReader", plugins.Next());
1190  if (choices.Length()) choices += " ";
1191  choices += uri;
1192  }
1193  // get model from user
1194  TString model;
1195  Bool_t ok;
1196  new KVDropDownDialog(MainFrame, "Choose the simulation model and type of events", choices, 0, &model, &ok);
1197  if (ok) {
1198 
1199  if (one_file) {
1200  unique_ptr<KVSimReader> SR(KVSimReader::MakeSimReader(model));
1201  SR->SetOutputDirectory(fSelectedSimDir->GetDirectory());
1202  SR->ConvertAndSaveEventsInFile(fi.fFilename);
1203  }
1204  else {
1205  if (fi.fFileNamesList->GetEntries() == 1) {
1206  unique_ptr<KVSimReader> SR(KVSimReader::MakeSimReader(model));
1207  SR->SetOutputDirectory(fSelectedSimDir->GetDirectory());
1208  SR->ConvertAndSaveEventsInFile(fi.fFileNamesList->First()->GetName());
1209  }
1210  else {
1211  TIter it(fi.fFileNamesList);
1212  TObject* o;
1213  int i = 1;
1214  while ((o = it())) {
1215  unique_ptr<KVSimReader> SR(KVSimReader::MakeSimReader(model));
1216  SR->SetMultiFiles();
1217  SR->SetFileIndex(i++);
1218  SR->SetOutputDirectory(fSelectedSimDir->GetDirectory());
1219  SR->ConvertAndSaveEventsInFile(o->GetName());
1220  }
1221  }
1222  }
1223 
1224  RefreshSimDir();
1225  }
1226  }
1227  else if (fi.fMultipleSelection && fi.fFileNamesList) {
1228  fi.fFileNamesList->ls();
1229  }
1230 }
1231 
1232 
1233 
1236 
1238 {
1239  // Get name of new class
1240  TString classname;
1241  Bool_t ok;
1242  new KVInputDialog(MainFrame, "Enter name of new analysis class", &classname, &ok, "Enter name of new analysis class");
1243  // check new classname is not name of existing class
1244  KVString impfile, decfile;
1245  if (KVBase::FindClassSourceFiles(classname, impfile, decfile)) {
1246  ok = ok && WarningBox("Replacing existing class",
1247  Form("%s is the name of an existing class defined in [%s,%s].\nDo you want to overwrite this class?\n(All existing code will be lost)",
1248  classname.Data(), decfile.Data(), impfile.Data()),
1249  kTRUE);
1250  }
1251  if (ok) {
1252  KVSimDirFilterAnalyser::Make(classname);
1253  fStatusBar->SetText(Form("Generated new filtered analysis class %s", classname.Data()), 1);
1254  }
1255 }
1256 
1257 
1258 
1261 
1263 {
1264  // Get name of new class
1265  TString classname;
1266  Bool_t ok;
1267  new KVInputDialog(MainFrame, "Enter name of new analysis class", &classname, &ok, "Enter name of new analysis class");
1268  // check new classname is not name of existing class
1269  KVString impfile, decfile;
1270  if (KVBase::FindClassSourceFiles(classname, impfile, decfile)) {
1271  ok = ok && WarningBox("Replacing existing class",
1272  Form("%s is the name of an existing class defined in [%s,%s].\nDo you want to overwrite this class?\n(All existing code will be lost)",
1273  classname.Data(), decfile.Data(), impfile.Data()),
1274  kTRUE);
1275  }
1276  if (ok) {
1277  KVSimDirAnalyser::Make(classname);
1278  fStatusBar->SetText(Form("Generated new simulated analysis class %s", classname.Data()), 1);
1279  }
1280 }
1281 
1282 
1283 
1289 
1290 Bool_t KVSimDirGUI::WarningBox(const char* title, const char* msg, Bool_t confirm)
1291 {
1292  // Warning box in case of problems
1293  // if confirm=kTRUE we ask for a yes/no answer from the user:
1294  // if 'yes' is pressed, we return kTRUE, if 'no', kFALSE.
1295  // by default, only a 'dismiss' button is shown, and this method always returns kTRUE.
1296 
1297  Bool_t reply = kTRUE;
1298  if (!confirm)
1299  new TGMsgBox(gClient->GetRoot(), MainFrame, title, msg, kMBIconExclamation);
1300  else {
1301  Int_t ret_code = 0;
1302  new TGMsgBox(gClient->GetRoot(), MainFrame, title, msg, kMBIconExclamation, kMBYes | kMBNo, &ret_code);
1303  reply = (ret_code & kMBYes);
1304  }
1305  return reply;
1306 }
1307 
1308 
1309 
1311 
1313 {
1314  int parts[] = {14, 25, 10, 14, 9, 7, 10};
1315  fStatusBar->SetParts(parts, 7);
1316  fStatusBar->SetText(fDataset.Data(), 0);
1317  fStatusBar->SetText(fCustomKinematics ? fReactionKinematics.Data() : fSystem.Data(), 1);
1318  fStatusBar->SetText(Form("Run: %d", fRun), 2);
1319  fStatusBar->SetText(Form("Audit: %s", fDataQualityAudit.Data()), 3);
1320  fStatusBar->SetText(GetFilterTypeString().Data(), 4);
1321  fStatusBar->SetText(GetKinematicsString().Data(), 5);
1322  TString gemphi;
1323  if (fGemDecay) {
1324  gemphi = Form("Gem++, %d/ev.", fGemDecayPerEvent);
1325  if (fGemAddRotEner) gemphi += " +Erot";
1326  }
1327  if (fRandomPhi) {
1328  if (gemphi.Length()) gemphi += "; ";
1329  gemphi += "phi RNDM";
1330  }
1331  fStatusBar->SetText(gemphi, 6);
1332 }
1333 
1334 
1335 
1337 
1339 {
1340  fStatusBar->SetParts(2);
1341  if (!fAnalClass.name.IsNull()) {
1342  fStatusBar->SetText(Form("Analysis class: %s", fAnalClass.name.Data()), 0);
1343  fStatusBar->SetText(Form("Found header file %s and implementation file %s", fAnalClass.dec_file.Data(), fAnalClass.imp_file.Data()), 1);
1344  }
1345  else
1346  fStatusBar->SetText("Analysis class:", 0);
1347 }
1348 
1349 
1350 #ifdef WITH_RSQLITE
1351 
1355 
1356 void KVSimDirGUI::ReconstructSimDirsFromDB()
1357 {
1358  // Rebuild all KVSimDir/KVSimFile objects from information in sqlite DB
1359 
1360  // backwards-compatility: add any missing columns to dataset tables
1361  fConfigDB.select_data("Datasets");
1362  KVNameValueList tables;
1363  while (fConfigDB.get_next_result()) {
1364  // make sure the directory associated with each dataset still exists!
1365  auto dataset_dir = fConfigDB["Datasets"]["Directory"].get_data<TString>();
1366  if(gSystem->AccessPathName(dataset_dir))
1367  continue;
1368  auto sd = new KVSimDir(fConfigDB["Datasets"]["Name"].get_data<TString>(),
1369  dataset_dir);
1370  if (!fConfigDB["Datasets"]["AuxDir"].is_null())
1371  {
1372  // make sure the auxiliary directory associated with each dataset still exists!
1373  auto aux_dir = fConfigDB["Datasets"]["AuxDir"].get_data<TString>();
1374  if(!gSystem->AccessPathName(aux_dir))
1375  sd->SetAuxDirectory(aux_dir);
1376  }
1377  fListOfDirs.Add(sd);
1378  tables.SetValue(fConfigDB["Datasets"]["Name"].get_data<TString>(),
1379  fConfigDB["Datasets"]["Table"].get_data<TString>());
1380  }
1381  for (int i = 0; i < tables.GetNpar(); ++i)
1382  {
1383  auto tab = tables.GetValue<TString>(i);
1384  if(!fConfigDB[tab].has_column("AuxDir"))
1385  fConfigDB.add_column(tab, "AuxDir", "INTEGER");
1386  if(!fConfigDB[tab].has_column("DataQualityAudit"))
1387  fConfigDB.add_column(tab, "DataQualityAudit", "TEXT");
1388  }
1389  for (int i = 0; i < tables.GetNpar(); ++i) {
1390  KVSimDir* sd = (KVSimDir*)fListOfDirs.FindObject(tables.GetParameter(i)->GetName());
1391  fConfigDB.select_data(tables.GetValue<TString>(i));
1392  KVSQLite::table& dstable = fConfigDB[tables.GetValue<TString>(i)];
1393  while (fConfigDB.get_next_result()) {
1394  bool from_aux_dir = !dstable["AuxDir"].is_null() ? dstable["AuxDir"].get_data<int>() : false;
1395  if (dstable["Filtered"].get_data<int>()) {
1396  // filtered/reconstructed data
1397  TString dqa;
1398  if (!dstable["DataQualityAudit"].is_null())
1399  dqa = dstable["DataQualityAudit"].get_data<TString>();
1400  KVSimFile* f = new KVSimFile(
1401  nullptr,
1402  dstable["FileName"].get_data<TString>(), dstable["TreeInfo"].get_data<TString>(),
1403  dstable["Events"].get_data<int>(), dstable["TreeName"].get_data<TString>(),
1404  dstable["BranchName"].get_data<TString>(), dstable["DataSet"].get_data<TString>(),
1405  dstable["System"].get_data<TString>(), dstable["Run"].get_data<int>(),
1406  dstable["OrigFile"].get_data<TString>(),
1407  dstable["FiltType"].get_data<TString>(),
1408  dqa
1409  );
1410  f->SetGemini(dstable["Gemini"].get_data<bool>());
1411  if (f->IsGemini()) f->SetGemDecayPerEvent(dstable["GemDecayPerEvent"].get_data<int>());
1412  sd->AddFiltData(f, from_aux_dir);
1413  }
1414  else {
1415  // simulation data
1416  KVSimFile* f = new KVSimFile(
1417  nullptr,
1418  dstable["FileName"].get_data<TString>(), dstable["TreeInfo"].get_data<TString>(),
1419  dstable["Events"].get_data<int>(), dstable["TreeName"].get_data<TString>(),
1420  dstable["BranchName"].get_data<TString>());
1421  sd->AddSimData(f, from_aux_dir);
1422  }
1423  }
1424  }
1425 }
1426 
1427 #endif
1428 
int Int_t
kVerticalFrame
kHorizontalFrame
kMainFrame
ROOT::R::TRInterface & r
#define f(i)
bool Bool_t
char Char_t
constexpr Bool_t kFALSE
constexpr Bool_t kTRUE
R__EXTERN TEnv * gEnv
kEnvUser
kButtonDown
#define gClient
kMWMFuncAll
kMWMDecorAll
kMWMInputModeless
kLHintsRight
kLHintsExpandY
kLHintsLeft
kLHintsCenterY
kLHintsTop
kLHintsExpandX
kMBNo
kMBYes
kMBIconExclamation
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void on
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 name[80]
#define quest
char * Form(const char *fmt,...)
char * StrDup(const char *str)
R__EXTERN TSystem * gSystem
Relativistic binary kinematics calculator.
Definition: KV2Body.h:178
void CalculateKinematics()
Definition: KV2Body.cpp:693
void Print(Option_t *opt="") const override
Definition: KV2Body.cpp:874
static const Char_t * GetListOfPlugins(const Char_t *base)
Definition: KVBase.cpp:1251
static Bool_t FindClassSourceFiles(const KVString &class_name, KVString &imp_file, KVString &dec_file, const KVString &dir_name=".")
Definition: KVBase.cpp:1095
Bool_t IsCalled(const Char_t *name, bool case_insensitive=false) const
Definition: KVBase.h:193
static const Char_t * GetPluginURI(const Char_t *base, const Char_t *plugin)
Definition: KVBase.cpp:1168
Handles list of all available batch systems for processing non-interactive data analysis tasks.
KVBatchSystem * GetDefaultBatchSystem() const
Utility GUI used for setting batch system parameters.
void Clear(Option_t *opt="") override
void cd()
Make this the default batch system.
virtual void SetBatchSystemParameters(const KVNameValueList &)
Use the parameters in the list to set all relevant parameters for batch system.
virtual void GetBatchSystemParameterList(KVNameValueList &)
Description of an experimental run in database ,,.
Definition: KVDBRun.h:41
Database class used to store information on different colliding systems studied during an experiment....
Definition: KVDBSystem.h:51
Bool_t IsCollision() const
retourne kTRUE, si le systeme est une collision ie projectile+cible
Definition: KVDBSystem.cpp:128
TString GetBatchName()
Definition: KVDBSystem.cpp:669
TString GetBatchNameWithoutEnergy()
Definition: KVDBSystem.cpp:702
TString GetReactionNameWithoutEnergy()
Definition: KVDBSystem.cpp:733
TString GetReactionEnergyWithoutName()
Definition: KVDBSystem.cpp:758
KVUnownedList GetRuns() const
Returns a sorted list of all the runs associated with this system.
Definition: KVDBSystem.cpp:139
virtual void SetFileList(const KVUnownedList &)
virtual void Run()
Check all task variables, then run analyser.
void SetBatchSystem(KVBatchSystem *bs)
void SetUserClassOptions(const Char_t *o="")
virtual void SetAuxFileList(const KVUnownedList &)
void SetAnalysisTask(KVDataAnalysisTask *at)
void SetUserClass(const UserClass &kvs, Bool_t check=kTRUE)
static KVDataAnalyser * GetAnalyser(const Char_t *plugin)
Bool_t IsUserClassValid() const
void SetNbEventToRead(Long64_t nb=0)
Define and manage data analysis tasks.
virtual Bool_t WithUserClass() const
virtual const Char_t * GetDataAnalyser() const
virtual const Char_t * GetUserBaseClass() const
Manage all datasets contained in a given data repository.
Bool_t Init(KVDataSetRepository *=0)
KVDataAnalysisTask * GetAnalysisTaskAny(const Char_t *keywords) const
Int_t GetNtotal() const
KVDataSet * GetDataSet(Int_t) const
Return pointer to DataSet using index in list of all datasets, index>=0.
Manage an experimental dataset corresponding to a given experiment or campaign.
Definition: KVDataSet.h:146
TString GetFullPathToDataSetFile(const Char_t *filename) const
Definition: KVDataSet.cpp:2149
KVExpDB * GetDataBase(const TString &opt="") const
Definition: KVDataSet.cpp:288
void cd() const
Definition: KVDataSet.cpp:778
static Bool_t FindDataSetFile(const TString &dataset, const Char_t *filename)
Definition: KVDataSet.cpp:2185
Ask user to choose between several options in a drop-down list.
virtual KVDBSystem * GetSystem(const Char_t *system) const
Definition: KVExpDB.h:164
virtual KVSeqCollection * GetSystems() const
Definition: KVExpDB.h:168
Modified version of TGFileDialog file selection dialog.
Definition: KVFileDialog.h:49
General purpose dialog box asking for some input in the form of a string.
Definition: KVInputDialog.h:24
Enhanced version of ROOT TGListView widget.
Definition: KVListView.h:147
virtual void ActivateSortButtons()
Definition: KVListView.cpp:73
virtual void SetDataColumns(Int_t ncolumns)
Definition: KVListView.cpp:92
virtual void Display(const TCollection *l)
Definition: KVListView.h:174
KVUnownedList GetSelectedObjects() const
Definition: KVListView.h:253
virtual void RemoveAll()
Definition: KVListView.h:194
void AllowContextMenu(Bool_t on=kTRUE)
Definition: KVListView.h:292
virtual void SetDataColumn(Int_t index, const Char_t *name, const Char_t *method="", Int_t mode=kTextCenterX)
Definition: KVListView.cpp:107
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
KVNamedParameter * GetParameter(Int_t idx) const
return the parameter object with index idx
void SetValue(const Char_t *name, value_type value)
Int_t GetNpar() const
return the number of stored parameters
value_type GetValue(const Char_t *name) const
int get_number_of_tables() const
Definition: SQLiteDB.h:518
table & add_table(const table &)
Definition: SQLiteDB.cpp:254
bool update(const TString &table, const TString &columns, const TString &selection="")
Definition: SQLiteDB.cpp:1220
void delete_table(const TString &table)
Definition: SQLiteDB.cpp:1278
column & add_column(const TString &table, const TString &name, const TString &type)
Definition: SQLiteDB.cpp:1323
void delete_rows_in_table(const TString &table, const TString &selection="")
Definition: SQLiteDB.cpp:1300
void insert_data_row()
Definition: SQLiteDB.cpp:529
void end_data_insertion()
Definition: SQLiteDB.cpp:616
bool select_data(const TString &tables, const TString &columns="*", const TString &selection="", bool distinct=false, const TString &anything_else="") const
Definition: SQLiteDB.cpp:822
KVNameValueList get_name_value_list(const TString &table, const TString &name_column, const TString &value_column, const TString &selection="", const TString &anything_else="")
Definition: SQLiteDB.cpp:1050
bool get_next_result() const
Definition: SQLiteDB.cpp:959
bool prepare_data_insertion(const TString &)
Definition: SQLiteDB.cpp:303
void clear_table(const TString &name)
Delete all rows in table, but does not remove table.
Definition: SQLiteDB.cpp:1131
int count(const TString &tables, const TString &column="*", const TString &selection="", bool distinct=false, const TString &anything_else="") const
Definition: SQLiteDB.cpp:1162
void primary_key(const TString &cols)
Definition: SQLiteDB.h:428
column & add_column(const KVSQLite::column &c)
Definition: SQLiteDB.cpp:1659
TObject * First() const override
TObject * Remove(TObject *obj) override
Remove object from list.
void Add(TObject *obj) override
TObject * FindObject(const char *name) const override
Class piloting analyses of simulated data.
void SetDataSetForFilter(const TString &f)
void SetSystemForFilter(const TString &f)
static void Make(const Char_t *kvsname="MySimulatedAnalysis")
Generate a new simulated analysis selector class.
static void Make(const Char_t *kvsname="MyFilteredAnalysis")
Generate a new filtered analysis selector class.
GUI for analysing and filtering simulated data.
Definition: KVSimDirGUI.h:168
void SelectDataSet(const char *)
void NewFilteredAnalysisClass()
Get name of new class.
void RemSimDir()
void EmptyTreeList()
void RefreshSimDir()
void SelectAnalysisClass()
void FilterType(Int_t i)
Definition: KVSimDirGUI.h:508
void AddSimDir()
void NewSimulatedAnalysisClass()
Get name of new class.
void SetAnalysisStatusBar()
void SelectSystem(const char *)
menu_struct menus
Definition: KVSimDirGUI.h:458
void FillTreeList()
void SelectDataQualityAudit()
void AddAuxDir(TGListTreeItem *simdir, Int_t)
void SetRandomPhi(Bool_t on)
Definition: KVSimDirGUI.h:524
void SetFilterStatusBar()
void Run()
void ChangeOutputDirectory();
void EnableEventNumberEntry(Bool_t)
TString GetFilterTypeString()
void RunAnalysis(const TString &type)
Bool_t WarningBox(const char *title, const char *msg, Bool_t confirm)
void SetGeminiDecay(Bool_t on)
Definition: KVSimDirGUI.h:528
void GeoType(Int_t i)
Definition: KVSimDirGUI.h:512
void Kinematics(Int_t i)
Definition: KVSimDirGUI.h:516
void SelectSimDir(TGListTreeItem *, Int_t)
void ImportSimulation()
Import simulation data from currently selected directory.
Handle directory containing simulated and/or filtered simulated data ,.
Definition: KVSimDir.h:46
const KVList * GetFiltDataList() const
Definition: KVSimDir.h:79
void SetAuxDirectory(const TString &)
Definition: KVSimDir.cpp:114
void AddFiltData(KVSimFile *, bool=false)
Definition: KVSimDir.cpp:365
Bool_t HasAuxDirectory() const
Definition: KVSimDir.cpp:139
const Char_t * GetDirectory() const
Definition: KVSimDir.h:64
Bool_t IsFromAuxDirectory(KVSimFile *) const
returns true if given file is in the auxiliary directory
Definition: KVSimDir.cpp:149
const KVList * GetSimDataList() const
Definition: KVSimDir.h:75
void AnalyseDirectory()
Definition: KVSimDir.cpp:167
void AddSimData(KVSimFile *, bool=false)
Definition: KVSimDir.cpp:348
Handle file containing simulated and/or filtered simulated data ,.
Definition: KVSimFile.h:20
const Char_t * GetSystem() const
Definition: KVSimFile.h:100
const Char_t * GetBranchName() const
Definition: KVSimFile.h:137
const Char_t * GetOriginalFile() const
Definition: KVSimFile.h:142
Int_t GetRun() const
Definition: KVSimFile.h:115
const Char_t * GetFilterType() const
Definition: KVSimFile.h:110
Bool_t IsGemini() const
Definition: KVSimFile.h:52
const Char_t * GetDataSet() const
Definition: KVSimFile.h:95
Long64_t GetEvents() const
Definition: KVSimFile.h:90
const Char_t * GetDataQualityAudit() const
Definition: KVSimFile.h:152
const Char_t * GetTreeName() const
Definition: KVSimFile.h:132
Int_t GetGemDecayPerEvent() const
Definition: KVSimFile.h:64
static KVSimReader * MakeSimReader(const char *model_uri)
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:73
void Begin(TString delim) const
Definition: KVString.cpp:565
Bool_t End() const
Definition: KVString.cpp:634
KVString Next(Bool_t strip_whitespace=kFALSE) const
Definition: KVString.cpp:695
Extended TList class which does not own its objects by default.
Definition: KVUnownedList.h:20
void ls(Option_t *option="") const override
virtual Int_t GetEntries() 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)
virtual void SaveLevel(EEnvLevel level)
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
virtual void SetToolTipText(const char *text, Long_t delayms=400)
virtual void AllowStayDown(Bool_t a)
virtual void SetEnabled(Bool_t e=kTRUE)
virtual void SetContainer(TGFrame *f)
TGViewPort * GetViewPort() const
void MapSubwindows() override
Bool_t IsDown() const override
void SetState(EButtonState state, Bool_t emit=kFALSE) override
TGDimension GetDefaultSize() const override
virtual void SetLayoutManager(TGLayoutManager *l)
virtual void AddFrame(TGFrame *f, TGLayoutHints *l=nullptr)
void MapSubwindows() override
TList * fFileNamesList
char * fFilename
void SetMultipleSelection(Bool_t option)
const char ** fFileTypes
char * fIniDir
Bool_t fMultipleSelection
virtual void Resize(TGDimension size)
void MapWindow() override
virtual const char * GetText() const=0
virtual void SetPictures(const TGPicture *, const TGPicture *)
Int_t DeleteItem(TGListTreeItem *item)
TGListTreeItem * GetFirstItem() const
void AddItem(const char *string)
void CloseItem(TGListTreeItem *item)
void SetWindowName(const char *name=nullptr) override
void SetMWMHints(UInt_t value, UInt_t funcs, UInt_t input)
virtual TGPopupMenu * RemovePopup(const char *s)
virtual void SetState(Bool_t enable=kTRUE)
virtual Double_t GetNumber() const
virtual Bool_t IsEntryChecked(Int_t id)
virtual void AddLabel(const char *s, const TGPicture *p=nullptr, TGMenuEntry *before=nullptr)
virtual void CheckEntry(Int_t id)
virtual void DisableEntry(Int_t id)
virtual void AddEntry(const char *s, Int_t id, void *ud=nullptr, const TGPicture *p=nullptr, TGMenuEntry *before=nullptr)
virtual void UnCheckEntry(Int_t id)
virtual void DeleteEntry(Int_t id)
virtual void AddSeparator(TGMenuEntry *before=nullptr)
virtual void RCheckEntry(Int_t id, Int_t IDfirst, Int_t IDlast)
const TList * GetListOfEntries() const
virtual void SetParts(Int_t *parts, Int_t npart)
virtual void SetText(const char *text, Int_t partidx=0)
virtual void SetName(const char *name)
TObject * First() const override
const char * GetName() const override
const char * GetTitle() const override
static TClass * Class()
virtual const char * GetName() const
R__ALWAYS_INLINE Bool_t IsZombie() const
virtual void Info(const char *method, const char *msgfmt,...) const
Bool_t Connect(const char *signal, const char *receiver_class, void *receiver, const char *slot)
Ssiz_t Length() const
const char * Data() const
TString & Append(char c, Ssiz_t rep=1)
Bool_t IsNull() const
TString & Remove(EStripType s, char c)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TString & ReplaceAll(const char *s1, const char *s2)
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
const char * pwd()
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
virtual const char * BaseName(const char *pathname)
virtual void SetBuildDir(const char *build_dir, Bool_t isflat=kFALSE)
virtual const char * TempDirectory() const
long long Long64_t
void Error(UserClass p, const char *location, const char *va_(fmt),...)
Definition: KVError.h:116
void Warning(UserClass p, const char *location, const char *va_(fmt),...)
Definition: KVError.h:125
std::map< int, DQA_entry > DQA_map
Definition: KVSimDirGUI.h:322
void handle_menu(menu_type &m)
Definition: KVSimDirGUI.h:453
TGPopupMenu * add_popup(const char *name, TGPopupMenu *parent)
Definition: KVSimDirGUI.h:442
analysis_struct analysis
Definition: KVSimDirGUI.h:300
ClassImp(TPyArg)