KaliVeda  1.13/01
Heavy-Ion Analysis Toolkit
KVDBSystemDialog.cpp
Go to the documentation of this file.
1 /*
2 $Id: KVDBSystemDialog.cpp,v 1.8 2009/01/16 14:55:20 franklan Exp $
3 $Revision: 1.8 $
4 $Date: 2009/01/16 14:55:20 $
5 */
6 
7 //Created by KVClassFactory on Wed Apr 4 12:10:28 2007
8 //Author: franklan
9 
10 #include "KVDBSystemDialog.h"
11 #ifndef ROOT_TGDockableFrame
12 #include "TGDockableFrame.h"
13 #endif
14 #ifndef ROOT_TGMenu
15 #include "TGMenu.h"
16 #endif
17 #ifndef ROOT_TGMdiDecorFrame
18 #include "TGMdiDecorFrame.h"
19 #endif
20 #ifndef ROOT_TG3DLine
21 #include "TG3DLine.h"
22 #endif
23 #ifndef ROOT_TGMdiFrame
24 #include "TGMdiFrame.h"
25 #endif
26 #ifndef ROOT_TGMdiMainFrame
27 #include "TGMdiMainFrame.h"
28 #endif
29 #ifndef ROOT_TGMdiMenu
30 #include "TGMdiMenu.h"
31 #endif
32 #ifndef ROOT_TGListBox
33 #include "TGListBox.h"
34 #endif
35 #ifndef ROOT_TGNumberEntry
36 #include "TGNumberEntry.h"
37 #endif
38 #ifndef ROOT_TGScrollBar
39 #include "TGScrollBar.h"
40 #endif
41 #ifndef ROOT_TRootBrowser
42 #include "TRootBrowser.h"
43 #endif
44 #ifndef ROOT_TGFrame
45 #include "TGFrame.h"
46 #endif
47 #ifndef ROOT_TGFileDialog
48 #include "TGFileDialog.h"
49 #endif
50 #ifndef ROOT_TGShutter
51 #include "TGShutter.h"
52 #endif
53 #ifndef ROOT_TGButtonGroup
54 #include "TGButtonGroup.h"
55 #endif
56 #ifndef ROOT_TGCanvas
57 #include "TGCanvas.h"
58 #endif
59 #ifndef ROOT_TGFSContainer
60 #include "TGFSContainer.h"
61 #endif
62 #ifndef ROOT_TGFSComboBox
63 #include "TGFSComboBox.h"
64 #endif
65 #ifndef ROOT_TGLabel
66 #include "TGLabel.h"
67 #endif
68 #ifndef ROOT_TGMsgBox
69 #include "TGMsgBox.h"
70 #endif
71 #ifndef ROOT_TGTab
72 #include "TGTab.h"
73 #endif
74 #ifndef ROOT_TGListView
75 #include "TGListView.h"
76 #endif
77 #ifndef ROOT_TGSplitter
78 #include "TGSplitter.h"
79 #endif
80 #ifndef ROOT_TGStatusBar
81 #include "TGStatusBar.h"
82 #endif
83 #ifndef ROOT_TGListTree
84 #include "TGListTree.h"
85 #endif
86 #ifndef ROOT_TGToolTip
87 #include "TGToolTip.h"
88 #endif
89 #ifndef ROOT_TGToolBar
90 #include "TGToolBar.h"
91 #endif
92 
93 #include "Riostream.h"
94 #include "KVDataSet.h"
95 #include "KVDBSystem.h"
96 #include "KVExpDB.h"
97 #include "KVNucleus.h"
98 #include "KVMaterial.h"
99 #include "KVTarget.h"
100 #include "KVInputDialog.h"
101 #include "KVConfig.h"
102 #include "KVUnits.h"
103 #include "KVIonRangeTable.h"
104 
105 using namespace std;
106 
108 
109 
110 
115  KVDBSystem* init_sys, const KVNumberList& runs,
116  UInt_t w, UInt_t h)
117 {
118  //Default constructor
119  //init_sys = initial system corresponding to chosen runs
120 
121  fTarget = 0;
122  fLayer = 0;
123  fSystem = init_sys;
124  fRuns = runs;
125  //'undo' manager
126  fUndo = new KVDatedFileManager(gDataSet->GetDataSetEnv("INDRADB.Systems"), gDataSet->GetDataSetDir());
127  fCurrentSystemsFile = gDataSet->GetDataSetEnv("INDRADB.Systems");
128  CreateMainWindow(p, main, w, h);
129  SetNeedSave(0);
130  if (runs.IsEmpty()) fSetRuns->SetEnabled(kFALSE);
131  FillSystemList();
132  Connect("UpdateRunlist()", "KVINDRARunSheetGUI", const_cast<TGWindow*>(main), "UpdateListOfRuns()");
133  //nothing happens until window closes
134  gClient->WaitFor(fMainFrame1475);
135 }
136 
137 
138 
141 
143 {
144  //Destructor
145  if (fMainFrame1475) {
146  delete fMainFrame1475;
147  fMainFrame1475 = 0;
148  }
149  delete fUndo;
150 }
151 
152 
153 
155 
157 {
158  TTimer::SingleShot(150, "KVDBSystemDialog", this,
159  "CloseWindow()");
160 }
161 
162 
163 
165 
167 {
168  delete this;
169 }
170 
171 
172 
173 
174 
177 
179 {
180  //Delete the currently selected system
181  if (!fSystem) return;
182  TString answer(fSystem->GetName());
183  Bool_t ok = kFALSE;
184  new KVInputDialog(fMainFrame1475, "Do you really want to delete this system ?", &answer, &ok,
185  "Click OK to delete, Cancel to leave");
186  if (!ok) return;
187  //unassociate all runs from system
188  fSystem->RemoveAllRuns();
189  //remove system from database
190  gExpDB->RemoveSystem(fSystem);
191  //delete system
192  delete fSystem;
193  fSystem = 0;
194  //update list of systems
195  FillSystemList();
196  SaveSystems();
197  UpdateRunlist();
198 }
199 
200 
201 
202 
207 
209 {
210  //Use current values of all fields in dialog box to create a new KVDBSystem
211  //We open a dialog to ask for the title of the new system, and for the target
212  //Z and A if a target is defined.
213 
214  TString sys_name;
215 
216  //If a projectile and target are defined, we suggest a standard name
217  if (IsProjectileDefined() && IsTargetDefined()) {
218  sys_name.Form("%ld%s + %s %.3g MeV/A",
219  fNumberEntry1499->GetIntNumber(), // proj A
220  fTextEntry1490->GetText(), // proj symbol
221  fTarget->GetName(), // target symbol
222  fNumberEntry1509->GetNumber() //projectile energy
223  );
224  }
225 
226  Bool_t ok_pressed;
227  new KVInputDialog(
228  fMainFrame1475,
229  "Enter name for new system",
230  &sys_name,
231  &ok_pressed
232  );
233  if (ok_pressed) {
234  cout << "Creating system : " << sys_name.Data() << endl;
235  fSystem = new KVDBSystem(sys_name.Data());
236  if (IsProjectileDefined()) {
237  Int_t Z = (Int_t)fNumberEntry1493->GetIntNumber();
238  fSystem->SetZbeam(Z);
239  Int_t A = (Int_t)fNumberEntry1499->GetIntNumber();
240  fSystem->SetAbeam(A);
241  Double_t E = fNumberEntry1509->GetNumber();
242  fSystem->SetEbeam(E);
243  }
244  if (IsTargetDefined()) {
245  fSystem->SetTarget(fTarget);
246  sys_name.Form("%d", (Int_t)fTarget->GetLayerByIndex(1)->GetZ());
247  new KVInputDialog(
248  fMainFrame1475,
249  "Enter Z of target nucleus",
250  &sys_name,
251  &ok_pressed
252  );
253  fSystem->SetZtarget(sys_name.Atoi());
254  sys_name.Form("%d", (Int_t)fTarget->GetLayerByIndex(1)->GetMass());
255  new KVInputDialog(
256  fMainFrame1475,
257  "Enter A of target nucleus",
258  &sys_name,
259  &ok_pressed
260  );
261  fSystem->SetAtarget(sys_name.Atoi());
262  }
263  //add system to database
264  gExpDB->AddSystem(fSystem);
265  //update list of systems
266  FillSystemList();
267  //select the new system
268  fComboBox1476->Select(fComboBox1476->GetNumberOfEntries() - 2);
269  SaveSystems();
270  fCreateSystem->SetEnabled(kFALSE);
271  }
272 }
273 
274 
275 
276 
280 
282 {
283  //Write new Systems.dat file.
284  //The list of file versions for the 'Undo' is updated
285  gExpDB->Save("Systems");
286  SetNeedSave(0);
287  fUndo->Update();
288  fCurrentSystemsFile = gDataSet->GetDataSetEnv("INDRADB.Systems");
289 }
290 
291 
292 
293 
301 
303 {
304  //Revert unsaved changes to system (if fNeedSave=kTRUE), or
305  //revert to previously saved version of Systems.dat file
306 
307  //to remove unsaved changes, we simply rebuild the database from
308  //the existing files
309  //if there are no unsaved changes, we replace the current Systems.dat
310  //with the previous version
311  if (!NeedSave()) {
312  //is their a previous version of the Systems.dat ?
313  KVString old_vers = fUndo->GetPreviousVersion(fCurrentSystemsFile.Data());
314  if (old_vers == "") return; // no older version : cannot undo
315  //get full path to previous version
316  KVString fullpath_backup;
317  KVBase::SearchKVFile(old_vers.Data(), fullpath_backup, gDataSet->GetDataSetDir());
318  //get full path to Systems.dat file
319  KVString fullpath_systemsdat;
320  KVBase::SearchKVFile(gDataSet->GetDataSetEnv("INDRADB.Systems"), fullpath_systemsdat, gDataSet->GetDataSetDir());
321  //save current Systems.dat with timestamp if it was not already an old version
322  if (fCurrentSystemsFile == gDataSet->GetDataSetEnv("INDRADB.Systems")) {
323  KVBase::BackupFileWithDate(fullpath_systemsdat.Data());
324  }
325  //now make a copy of the previous version, with the name Systems.dat
326  gSystem->CopyFile(fullpath_backup.Data(), fullpath_systemsdat.Data(), kTRUE);
327  fCurrentSystemsFile = old_vers;
328  }
329  //now rebuild the database
330  gDataSet->GetDataBase("update")->cd();
331  SetNeedSave(0);
332  //update list of systems
333  FillSystemList();
334  UpdateRunlist();
335 }
336 
337 
338 
339 
343 
345 {
346  //Fill combo box with list of all systems for the current dataset
347 
348  //clear list of systems
349 #ifdef __WITHOUT_TGCOMBOBOX_REMOVEALL
350  RemoveAll(fComboBox1476);
351 #else
352  fComboBox1476->RemoveAll();
353 #endif
354  fComboBox1476->Select(-1);
355 
356  Int_t index_selected = 0;
357  KVSeqCollection* syslist = gExpDB->GetSystems();
358  syslist->ls();
359  TIter itsys(syslist);
360  TObject* o;
361  Int_t index = 0;
362  while ((o = itsys())) {
363  if ((KVDBSystem*)o == fSystem) index_selected = index;
364  fComboBox1476->AddEntry(o->GetName(), index++);
365  }
366  //Add entry "New system" at end of list
367  fComboBox1476->AddEntry("NEW SYSTEM", index++);
368  fComboBox1476->Select(index_selected);
369 }
370 
371 
372 
375 
377 {
378  //Called when a new system is selected in fComboBox1476
379  if (index < fComboBox1476->GetNumberOfEntries() - 1) {
380  fSystem = (KVDBSystem*)gExpDB->GetSystems()->At(index);
381  fCreateSystem->SetEnabled(kFALSE);
382  fSetRuns->SetEnabled(!fRuns.IsEmpty());
383  }
384  else {
385  fCreateSystem->SetEnabled(kTRUE);
386  fSetRuns->SetEnabled(kFALSE);
387  fSystem = 0;
388  fTarget = 0;
389  }
390  UpdateSystemProperties();
391 }
392 
393 
394 
397 
399 {
400  //Update displayed system properties, e.g. when a new system is selected in fComboBox1476
401  UpdateProjectileProperties();
402  UpdateTargetProperties();
403 }
404 
405 
406 
409 
411 {
412  //Called when "Projectile" check box is checked (on=kTRUE) or unchecked (on=kFALSE)
413  fTextEntry1490->SetEnabled(on);
414  fNumberEntry1493->SetState(on);
415  fNumberEntry1499->SetState(on);
416  fNumberEntry1509->SetState(on);
417 }
418 
419 
420 
424 
426 {
427  //Update displayed projectile properties
428  //Called by UpdateSystemProperties().
429 
430  if (!fSystem) {
431  fCheckButton1376->SetState(kButtonUp);
432  EnableProjectileProperties(kFALSE);
433  return;
434  }
435  KVNucleus proj(fSystem->GetZproj(), fSystem->GetAproj());
436  //if no projectile is defined, the entire "Projectile" part is "greyed out"
437  if (proj.GetZ() == 0) {
438  fCheckButton1376->SetState(kButtonUp);
439  EnableProjectileProperties(kFALSE);
440  }
441  else {
442  fCheckButton1376->SetState(kButtonDown);
443  EnableProjectileProperties(kTRUE);
444  }
445  //update projectile symbol
446  fTextEntry1490->SetText(proj.GetSymbol("EL"));
447  //update projectile Z
448  fNumberEntry1493->SetNumber(proj.GetZ());
449  //update projectile A
450  fNumberEntry1499->SetNumber(proj.GetA());
451  //update projectile E/A
452  fNumberEntry1509->SetNumber(fSystem->GetEproj());
453 }
454 
455 
456 
461 
463 {
464  //Update displayed target properties
465  //Called by UpdateSystemProperties().
466 
467  //clear list of target layers
468 #ifdef __WITHOUT_TGCOMBOBOX_REMOVEALL
469  RemoveAll(fComboBox1515);
470 #else
471  fComboBox1515->RemoveAll();
472 #endif
473  fComboBox1515->Select(-1);
474  if (fSystem) fTarget = fSystem->GetTarget();
475  if (!fTarget) {
476  fNumberEntry1532->SetNumber(0);
477  UpdateTargetLayerProperties(-1);
478  return;
479  }
480  //update target angle
481  fNumberEntry1532->SetNumber(fTarget->GetAngleToBeam());
482  Int_t index = 0;
483  TIter next(fTarget->GetLayers());
484  TObject* obj;
485  while ((obj = next())) {
486  fComboBox1515->AddEntry(obj->GetName(), index++);
487  }
488  fComboBox1515->Select(0);
489 }
490 
491 
492 
496 
498 {
499  //Update displayed target layer properties
500  //Called when a new layer is selected in fComboBox1515
501 
502  if (ind == -1) {
503  fNumberEntry1526->SetNumber(0);
504  fNumberEntry1537->SetNumber(0);
505  fLayer = 0;
506  fTextButton1554->SetEnabled(kFALSE);
507  return;
508  }
509  fLayer = (KVMaterial*)fTarget->GetLayers()->At(ind);
510  //update thickness - actually area density in mg/cm2
511  fNumberEntry1526->SetNumber(fLayer->GetAreaDensity() / (KVUnits::mg / pow(KVUnits::cm, 2)));
512  //update atomic mass
513  fNumberEntry1537->SetNumber(fLayer->GetMass());
514  //update thickness units
515  fLabel1530->SetText("mg/cm2");
516  //enable button to remove layer
517  fTextButton1554->SetEnabled(kTRUE);
518 }
519 
520 
521 
525 
527 {
528  //Called when projectile symbol is changed and the user presses "Return"
529  //Changes Z and A of projectile for system
530 
531  KVNucleus r(fTextEntry1490->GetText());
532  if (!r.GetZ()) {
533  //give warning that symbol is not valid
534  new TGMsgBox(gClient->GetRoot(), fMainFrame1475, "KVDBSystemDialog",
535  "Give a valid atomic symbol for the projectile", kMBIconExclamation);
536  return;
537  }
538  //update projectile Z
539  fNumberEntry1493->SetNumber(r.GetZ());
540  //update projectile A
541  fNumberEntry1499->SetNumber(r.GetA());
542  if (fSystem) {
543  fSystem->SetZbeam(r.GetZ());
544  fSystem->SetAbeam(r.GetA());
545  }
546  SetNeedSave(1);
547 }
548 
549 
550 
554 
556 {
557  //Called when projectile Z is changed
558  //Changes Z and symbol of projectile for system
559 
560  Int_t Z = (Int_t)fNumberEntry1493->GetIntNumber();
561  KVNucleus r(Z);
562  fTextEntry1490->SetText(r.GetSymbol("EL"));
563  Int_t A = r.GetA();
564  fNumberEntry1499->SetNumber(A);
565  if (fSystem) {
566  fSystem->SetZbeam(r.GetZ());
567  fSystem->SetAbeam(r.GetA());
568  }
569  SetNeedSave(1);
570 }
571 
572 
573 
577 
579 {
580  //Called when projectile A is changed
581  //Changes A of projectile for system
582 
583  Int_t A = (Int_t)fNumberEntry1499->GetIntNumber();
584  if (fSystem) fSystem->SetAbeam(A);
585  SetNeedSave(1);
586 }
587 
588 
589 
593 
595 {
596  //Called when projectile E is changed
597  //Changes E of projectile for system
598 
599  Double_t E = fNumberEntry1509->GetNumber();
600  if (fSystem) fSystem->SetEbeam(E);
601  SetNeedSave(1);
602 }
603 
604 
605 
609 
611 {
612  // Called when target layer "thickness" is changed
613  // Note that this is in fact the area density in mg/cm**2
614 
615  Double_t t = fNumberEntry1526->GetNumber();
616  fLayer->SetAreaDensity(t * KVUnits::mg / pow(KVUnits::cm, 2));
617  SetNeedSave(1);
618 }
619 
620 
621 
624 
626 {
627  //Called when target layer A is changed
628 
629  Double_t A = fNumberEntry1537->GetNumber();
630  fLayer->SetMass(A);
631  SetNeedSave(1);
632 }
633 
634 
635 
638 
640 {
641  //Called when target angle is changed
642 
643  Double_t A = fNumberEntry1532->GetNumber();
644  fTarget->SetAngleToBeam(A);
645  SetNeedSave(1);
646 }
647 
648 
649 
656 
658 {
659  //Called when "Add" button is clicked.
660  //Add a new target layer. Creates target if none exists.
661  //The currently selected material in the list will be used
662  //The new layer will be added after any existing layers in the target.
663 
664  //get selected material
665  TNamed* mat = (TNamed*)fMaterialsList->At(fComboBox1542->GetSelected());
666  KVMaterial bidon;
667  KVIonRangeTable* RT = bidon.GetRangeTable();
668  //add to target of current system
669  //if no target is defined, we create a new one
670  if (!fTarget) {
671  fTarget = new KVTarget;
672  if (fSystem) {
673  fSystem->SetTarget(fTarget);
674  cout << "Created target for system : " << fSystem->GetName() << endl;
675  fSystem->SetZtarget((UInt_t)RT->GetZ(mat->GetName()));
676  fSystem->SetAtarget((UInt_t)RT->GetAtomicMass(mat->GetName()));
677  }
678  }
679  //add layer with default area density 0.1 mg/cm2
680  fTarget->AddLayer(mat->GetTitle(), 0.1);
681  //update list of layers in target
682  Int_t nlay = fComboBox1515->GetNumberOfEntries();
683  fComboBox1515->AddEntry(mat->GetName(), nlay);
684  fComboBox1515->Select(nlay + 1);
685  cout << "Added layer " << mat->GetTitle() << " to target" << endl;
686  SetNeedSave(1);
687 }
688 
689 
690 
694 
696 {
697  //Removes currently selected layer from target.
698  //In fact we create a new target which does not have the offending layer
699 
700  cout << "Removing layer : " << fLayer->GetName() << " from target !" << endl;
701  if (fTarget->NumberOfLayers() == 1) {
702  //last layer in target - destroy target
703  delete fTarget;
704  fTarget = 0;
705  if (fSystem) fSystem->SetTarget(0);
706  fLayer = 0;
707  }
708  else {
709  KVTarget* new_target = new KVTarget;
710  TIter next(fTarget->GetLayers());
711  KVMaterial* mat;
712  while ((mat = (KVMaterial*)next())) {
713  if (mat != fLayer) {
714  new_target->AddLayer(mat->GetType(), mat->GetAreaDensity());
715  }
716  }
717  new_target->SetAngleToBeam(fTarget->GetAngleToBeam());
718  delete fTarget;
719  fTarget = 0;
720  if (fSystem) fSystem->SetTarget(new_target);
721  fLayer = 0;
722  }
723  UpdateTargetProperties();
724  SetNeedSave(1);
725 }
726 
727 
728 
738 
740 {
741  //Called when "SetRuns" button is clicked.
742  //The selected system is associated with the runlist passed to the constructor.
743  //The Systems.dat file is updated
744  //Any previous association run<->system is removed
745 
746 // KVNumberList tmp;
747 // fSystem->GetRunList(tmp);
748 // tmp.Add(fRuns);
749 // fSystem->SetRuns(tmp);
750  fRuns.Begin();
751  while (!fRuns.End()) fSystem->AddRun(fRuns.Next());
752  SaveSystems();
753  UpdateRunlist();
754 }
755 
756 
757 
758 #ifdef __WITHOUT_TGCOMBOBOX_REMOVEALL
759 
762 
764 {
765  //replaces functionality of TGComboBox::RemoveAll for ROOT versions < 5.11/02
766 
767  Int_t n = box->GetListBox()->GetNumberOfEntries();
768  if (n) box->RemoveEntries(0, n - 1);
769  if (box->GetSelectedEntry()) {
770  ((TGTextLBEntry*)box->GetSelectedEntry())->SetTitle("");
771  gClient->NeedRedraw(box->GetSelectedEntry());
772  }
773  else {
774  box->GetTextEntry()->SetTitle("");
775  gClient->NeedRedraw(box->GetTextEntry());
776  }
777 }
778 
780 
781 
784 {
785  //replaces functionality of TGListBox::RemoveAll for ROOT versions < 5.11/02
786 
787  Int_t n = box->GetNumberOfEntries();
788  if (n) box->RemoveEntries(0, n - 1);
789  if (box->GetSelectedEntry()) {
790  ((TGTextLBEntry*)box->GetSelectedEntry())->SetTitle("");
791  gClient->NeedRedraw(box->GetSelectedEntry());
792  }
793 }
794 
795 #endif
796 
797 
800 
802  UInt_t w, UInt_t h)
803 {
804 
805  //Creates main window and displays it
806 
807  fMainFrame1475 = new TGTransientFrame(p, main, w, h);
808  fMainFrame1475->SetLayoutBroken(kTRUE);
809  fMainFrame1475->Connect("CloseWindow()", "KVDBSystemDialog", this,
810  "DoClose()");
811  fMainFrame1475->DontCallClose(); // to avoid double deletions.
812  // use hierarchical cleaning
813  fMainFrame1475->SetCleanup(kDeepCleanup);
814 
815  ULong_t red, cyan, green, yellow, magenta; // will reflect user color changes
816  gClient->GetColorByName("#ff00ff", magenta);
817  gClient->GetColorByName("#ff0000", red);
818  gClient->GetColorByName("#00ff00", green);
819  gClient->GetColorByName("#00ffff", cyan);
820  gClient->GetColorByName("#ffff00", yellow);
821 
822  // combo box displaying list of systems for current dataset
823  fComboBox1476 = new TGComboBox(fMainFrame1475, -1, kHorizontalFrame | kSunkenFrame | kDoubleBorder | kOwnBackground);
824  fComboBox1476->Select(-1);
825  fMainFrame1475->AddFrame(fComboBox1476, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
826  fComboBox1476->MoveResize(88, 8, 296, 22);
827  fComboBox1476->Connect("Selected(Int_t)",
828  "KVDBSystemDialog", this,
829  "SelectSystem(Int_t)");
830 
831  TGLabel* fLabel1487 = new TGLabel(fMainFrame1475, "System");
832  fLabel1487->SetTextJustify(36);
833  fMainFrame1475->AddFrame(fLabel1487, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
834  fLabel1487->MoveResize(8, 8, 64, 18);
835 
836  // "System properties" group frame
837  TGGroupFrame* fGroupFrame1488 = new TGGroupFrame(fMainFrame1475, "System properties");
838  fGroupFrame1488->SetLayoutBroken(kTRUE);
839 
840  fCheckButton1376 = new TGCheckButton(fGroupFrame1488, "Projectile");
841  fCheckButton1376->SetToolTipText("Define projectile for system");
842  fGroupFrame1488->AddFrame(fCheckButton1376, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
843  fCheckButton1376->MoveResize(18, 24, 72, 19);
844  fCheckButton1376->Connect("Toggled(Bool_t)",
845  "KVDBSystemDialog", this,
846  "EnableProjectileProperties(Bool_t)");
847 
848  TGFont* ufont; // will reflect user font changes
849  ufont = gClient->GetFont("-adobe-helvetica-medium-r-*-*-12-*-*-*-*-*-iso8859-1");
850 
851  TGGC* uGC; // will reflect user GC changes
852  // graphics context changes
853  GCValues_t valEntry1490;
855  gClient->GetColorByName("#000000", valEntry1490.fForeground);
856  gClient->GetColorByName("#c6c3c6", valEntry1490.fBackground);
857  valEntry1490.fFillStyle = kFillSolid;
858  valEntry1490.fFont = ufont->GetFontHandle();
859  valEntry1490.fGraphicsExposures = kFALSE;
860  uGC = gClient->GetGC(&valEntry1490, kTRUE);
861  fTextEntry1490 = new TGTextEntry(fGroupFrame1488, new TGTextBuffer(15), -1, uGC->GetGC(), ufont->GetFontStruct(), kSunkenFrame | kDoubleBorder | kOwnBackground);
862  fTextEntry1490->SetMaxLength(3);
863  fTextEntry1490->SetAlignment(kTextLeft);
864  fTextEntry1490->SetText("p");
865  fTextEntry1490->Resize(24, fTextEntry1490->GetDefaultHeight());
866  fTextEntry1490->SetToolTipText("Chemical symbol for projectile nuclei");
867  fTextEntry1490->Connect("ReturnPressed()",
868  "KVDBSystemDialog", this, "ProjectileSymbolChanged()");
869 
870  fGroupFrame1488->AddFrame(fTextEntry1490, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
871  fTextEntry1490->MoveResize(100, 24, 24, 22);
872  fNumberEntry1493 = new TGNumberEntry(fGroupFrame1488, (Double_t) 1, 3, -1, (TGNumberFormat::EStyle) 0, (TGNumberFormat::EAttribute) 2, (TGNumberFormat::ELimit) 2, 1, 92);
873  fGroupFrame1488->AddFrame(fNumberEntry1493, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
874  fNumberEntry1493->MoveResize(158, 24, 43, 22);
875  fNumberEntry1493->Connect("ValueSet(Long_t)",
876  "KVDBSystemDialog", this, "ProjectileZChanged(Long_t)");
877 
878  TGLabel* fLabel1497 = new TGLabel(fGroupFrame1488, "Z=");
879  fLabel1497->SetTextJustify(36);
880  fGroupFrame1488->AddFrame(fLabel1497, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
881  fLabel1497->MoveResize(130, 24, 24, 18);
882  TGLabel* fLabel1498 = new TGLabel(fGroupFrame1488, "A=");
883  fLabel1498->SetTextJustify(36);
884  fGroupFrame1488->AddFrame(fLabel1498, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
885  fLabel1498->MoveResize(206, 24, 24, 18);
886  fNumberEntry1499 = new TGNumberEntry(fGroupFrame1488, (Double_t) 1, 3, -1, (TGNumberFormat::EStyle) 0, (TGNumberFormat::EAttribute) 2, (TGNumberFormat::ELimit) 2, 1, 250);
887  fGroupFrame1488->AddFrame(fNumberEntry1499, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
888  fNumberEntry1499->MoveResize(232, 24, 43, 22);
889  fNumberEntry1499->Connect("ValueSet(Long_t)",
890  "KVDBSystemDialog", this, "ProjectileAChanged(Long_t)");
891 
892  TGLabel* fLabel1503 = new TGLabel(fGroupFrame1488, "Q=");
893  fLabel1503->SetTextJustify(36);
894  fGroupFrame1488->AddFrame(fLabel1503, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
895  fLabel1503->MoveResize(280, 24, 24, 18);
896  //the "Q" field is inactive for the moment
897  fLabel1503->Disable();
898  TGNumberEntry* fNumberEntry1504 = new TGNumberEntry(fGroupFrame1488, (Double_t) 0, 3, -1, (TGNumberFormat::EStyle) 0);
899  fGroupFrame1488->AddFrame(fNumberEntry1504, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
900  fNumberEntry1504->MoveResize(312, 24, 43, 22);
901  //the "Q" field is inactive for the moment
902  fNumberEntry1504->SetState(kFALSE);
903  TGLabel* fLabel1508 = new TGLabel(fGroupFrame1488, "Energy=");
904  fLabel1508->SetTextJustify(36);
905  fGroupFrame1488->AddFrame(fLabel1508, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
906  fLabel1508->MoveResize(96, 56, 48, 18);
907  fNumberEntry1509 = new TGNumberEntry(fGroupFrame1488, (Double_t) 0, 9, -1, (TGNumberFormat::EStyle) 5);
908  fGroupFrame1488->AddFrame(fNumberEntry1509, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
909  fNumberEntry1509->MoveResize(152, 56, 80, 22);
910  fNumberEntry1509->Connect("ValueSet(Long_t)",
911  "KVDBSystemDialog", this, "ProjectileEChanged(Long_t)");
912 
913  TGLabel* fLabel1513 = new TGLabel(fGroupFrame1488, "MeV/nucleon");
914  fLabel1513->SetTextJustify(36);
915  fGroupFrame1488->AddFrame(fLabel1513, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
916  fLabel1513->MoveResize(240, 56, 80, 18);
917 
918  // "Target" group frame
919  TGGroupFrame* fGroupFrame1514 = new TGGroupFrame(fGroupFrame1488, "Target");
920  fGroupFrame1514->SetLayoutBroken(kTRUE);
921 
922 
923  // combo box with layers of target
924  fComboBox1515 = new TGComboBox(fGroupFrame1514, -1, kHorizontalFrame | kSunkenFrame | kDoubleBorder | kOwnBackground);
925  fComboBox1515->Resize(104, 22);
926  fComboBox1515->Select(-1);
927  fComboBox1515->Connect("Selected(Int_t)",
928  "KVDBSystemDialog", this, "UpdateTargetLayerProperties(Int_t)");
929 
930  fGroupFrame1514->AddFrame(fComboBox1515, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
931  fComboBox1515->MoveResize(80, 48, 104, 22);
932  fNumberEntry1526 = new TGNumberEntry(fGroupFrame1514, (Double_t) 0, 6, -1, (TGNumberFormat::EStyle) 5, (TGNumberFormat::EAttribute) 2);
933  fGroupFrame1514->AddFrame(fNumberEntry1526, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
934  fNumberEntry1526->MoveResize(8, 80, 59, 22);
935  fNumberEntry1526->Connect("ValueSet(Long_t)",
936  "KVDBSystemDialog", this, "TargetLayerThicknessChanged(Long_t)");
937 
938  fLabel1530 = new TGLabel(fGroupFrame1514, "mg/cm2");
939  fLabel1530->SetTextJustify(36);
940  fGroupFrame1514->AddFrame(fLabel1530, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
941  fLabel1530->MoveResize(72, 80, 46, 18);
942  TGLabel* fLabel1531 = new TGLabel(fGroupFrame1514, "Angle=");
943  fLabel1531->SetTextJustify(36);
944  fGroupFrame1514->AddFrame(fLabel1531, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
945  fLabel1531->MoveResize(104, 16, 40, 18);
946  fNumberEntry1532 = new TGNumberEntry(fGroupFrame1514, (Double_t) 0, 8, -1, (TGNumberFormat::EStyle) 5);
947  fGroupFrame1514->AddFrame(fNumberEntry1532, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
948  fNumberEntry1532->MoveResize(152, 16, 75, 22);
949  fNumberEntry1532->Connect("ValueSet(Long_t)",
950  "KVDBSystemDialog", this, "TargetAngleChanged(Long_t)");
951 
952  TGLabel* fLabel1536 = new TGLabel(fGroupFrame1514, "A=");
953  fLabel1536->SetTextJustify(36);
954  fGroupFrame1514->AddFrame(fLabel1536, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
955  fLabel1536->MoveResize(136, 80, 16, 18);
956  fNumberEntry1537 = new TGNumberEntry(fGroupFrame1514, (Double_t) 1, 6, -1, (TGNumberFormat::EStyle) 5, (TGNumberFormat::EAttribute) 2, (TGNumberFormat::ELimit) 2, 1, 250);
957  fGroupFrame1514->AddFrame(fNumberEntry1537, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
958  fNumberEntry1537->MoveResize(160, 80, 64, 22);
959  fNumberEntry1537->Connect("ValueSet(Long_t)",
960  "KVDBSystemDialog", this, "TargetLayerAChanged(Long_t)");
961 
962  // "Add new layer" group frame
963  TGGroupFrame* fGroupFrame1541 = new TGGroupFrame(fGroupFrame1514, "Add new layer");
964  fGroupFrame1541->SetLayoutBroken(kTRUE);
965 
966 
967  // combo box for choosing new layer for target
968  fComboBox1542 = new TGComboBox(fGroupFrame1541, -1, kHorizontalFrame | kSunkenFrame | kDoubleBorder | kOwnBackground);
969  fComboBox1542->Resize(80, 22);
970  //fill list of all available materials
971  KVMaterial bidon;
972  fMaterialsList.reset(bidon.GetRangeTable()->GetListOfMaterials());
973  TIter it_mat(fMaterialsList.get());
974  TObject* obj;
975  Int_t ind = 0;
976  while ((obj = it_mat())) {
977  fComboBox1542->AddEntry(obj->GetName(), ind++);
978  }
979  fComboBox1542->Select(0);
980  fGroupFrame1541->AddFrame(fComboBox1542, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
981  fComboBox1542->MoveResize(16, 24, 80, 22);
982  fTextButton1553 = new TGTextButton(fGroupFrame1541, "Add");
983  fTextButton1553->SetTextJustify(36);
984  fTextButton1553->Resize(56, 24);
985  fGroupFrame1541->AddFrame(fTextButton1553, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
986  fTextButton1553->MoveResize(24, 56, 56, 24);
987  fTextButton1553->Connect("Clicked()",
988  "KVDBSystemDialog", this, "AddNewTargetLayer()");
989 
990  fGroupFrame1541->SetLayoutManager(new TGVerticalLayout(fGroupFrame1541));
991  fGroupFrame1541->Resize(112, 104);
992  fGroupFrame1514->AddFrame(fGroupFrame1541, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
993  fGroupFrame1541->MoveResize(232, 40, 112, 104);
994  fTextButton1554 = new TGTextButton(fGroupFrame1514, "Remove");
995  fTextButton1554->SetTextJustify(36);
996  fTextButton1554->Resize(56, 24);
997  fGroupFrame1514->AddFrame(fTextButton1554, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
998  fTextButton1554->MoveResize(80, 112, 56, 24);
999  fTextButton1554->SetEnabled(kFALSE);
1000  fTextButton1554->Connect("Clicked()",
1001  "KVDBSystemDialog", this, "RemoveTargetLayer()");
1002 
1003  TGLabel* fLabel1555 = new TGLabel(fGroupFrame1514, "Layer:");
1004  fLabel1555->SetTextJustify(36);
1005  fGroupFrame1514->AddFrame(fLabel1555, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
1006  fLabel1555->MoveResize(24, 48, 40, 18);
1007 
1008  fGroupFrame1514->SetLayoutManager(new TGVerticalLayout(fGroupFrame1514));
1009  fGroupFrame1514->Resize(360, 168);
1010  fGroupFrame1488->AddFrame(fGroupFrame1514, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
1011  fGroupFrame1514->MoveResize(8, 80, 360, 168);
1012 
1013  //___________________________________________________________//
1014  // Bottom row buttons
1015  //___________________________________________________________//
1016 
1017  fCreateSystem = new TGTextButton(fGroupFrame1488, "Create");
1018  fCreateSystem->SetTextJustify(36);
1019  fCreateSystem->Resize(48, 24);
1020  fCreateSystem->ChangeBackground(green);
1021  fCreateSystem->SetToolTipText("Create new system with current properties");
1022  fGroupFrame1488->AddFrame(fCreateSystem, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
1023  fCreateSystem->MoveResize(36, 280, 60, 24);
1024  fCreateSystem->Connect("Clicked()",
1025  "KVDBSystemDialog", this, "CreateNewSystem()");
1026  fCreateSystem->SetEnabled(kFALSE);
1027 
1028  TGTextButton* fTextButton1573 = new TGTextButton(fGroupFrame1488, "Delete");
1029  fTextButton1573->SetTextJustify(36);
1030  fTextButton1573->Resize(48, 24);
1031  fTextButton1573->ChangeBackground(red);
1032  fGroupFrame1488->AddFrame(fTextButton1573, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
1033  fTextButton1573->MoveResize(100, 280, 60, 24);
1034  fTextButton1573->SetToolTipText("Delete the currently selected system");
1035  fTextButton1573->Connect("Clicked()",
1036  "KVDBSystemDialog", this, "DeleteSystem()");
1037 
1038  fSetRuns = new TGTextButton(fGroupFrame1488, "Set Runs");
1039  fSetRuns->SetTextJustify(36);
1040  fSetRuns->Resize(48, 24);
1041  fSetRuns->ChangeBackground(yellow);
1042  fGroupFrame1488->AddFrame(fSetRuns, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
1043  fSetRuns->MoveResize(164, 280, 60, 24);
1044  fSetRuns->SetToolTipText("Set runs for selected system");
1045  fSetRuns->Connect("Clicked()",
1046  "KVDBSystemDialog", this, "SetRuns()");
1047 
1048  fSaveButton = new TGTextButton(fGroupFrame1488, "Save");
1049  fSaveButton->SetTextJustify(36);
1050  fSaveButton->Resize(48, 24);
1051  //fSaveButton->ChangeBackground(yellow);
1052  fGroupFrame1488->AddFrame(fSaveButton, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
1053  fSaveButton->MoveResize(228, 280, 60, 24);
1054  fSaveButton->SetToolTipText("Save changes to systems");
1055  fSaveButton->Connect("Clicked()",
1056  "KVDBSystemDialog", this, "SaveSystems()");
1057 
1058  TGTextButton* fcloseButton = new TGTextButton(fGroupFrame1488, "Close");
1059  fcloseButton->SetTextJustify(36);
1060  fcloseButton->Resize(48, 24);
1061 // fcloseButton->ChangeBackground(cyan);
1062  fGroupFrame1488->AddFrame(fcloseButton, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
1063  fcloseButton->MoveResize(292, 280, 60, 24);
1064  fcloseButton->SetToolTipText("Return to main window");
1065  fcloseButton->Connect("Clicked()",
1066  "KVDBSystemDialog", this, "DoClose()");
1067 
1068  fGroupFrame1488->SetLayoutManager(new TGVerticalLayout(fGroupFrame1488));
1069  fGroupFrame1488->Resize(376, 320);
1070  fMainFrame1475->AddFrame(fGroupFrame1488, new TGLayoutHints(kLHintsLeft | kLHintsTop, 2, 2, 2, 2));
1071  fGroupFrame1488->MoveResize(8, 32, 376, 320);
1072 
1073  fMainFrame1475->MapSubwindows();
1074  fMainFrame1475->Resize(fMainFrame1475->GetDefaultSize());
1075  fMainFrame1475->CenterOnParent();
1076  fMainFrame1475->SetWindowName("Set system properties for runs");
1077  fMainFrame1475->MapWindow();
1078  fMainFrame1475->Resize(394, 358);
1079 }
1080 
1081 
1082 
int Int_t
unsigned int UInt_t
unsigned long ULong_t
long Long_t
const Mask_t kGCBackground
const Mask_t kGCForeground
const Mask_t kGCFillStyle
const Mask_t kGCFont
kSunkenFrame
kDoubleBorder
kHorizontalFrame
kOwnBackground
kFillSolid
const Mask_t kGCGraphicsExposures
KVDataSet * gDataSet
Definition: KVDataSet.cpp:29
KVExpDB * gExpDB
Definition: KVExpDB.cpp:13
ClassImp(KVPartitionList) void KVPartitionList
Initialisation.
ROOT::R::TRInterface & r
const Bool_t kFALSE
bool Bool_t
double Double_t
const Bool_t kTRUE
kButtonDown
kButtonUp
#define gClient
kDeepCleanup
kLHintsLeft
kLHintsTop
kMBIconExclamation
kTextLeft
double pow(double, double)
R__EXTERN TSystem * gSystem
virtual const Char_t * GetType() const
Definition: KVBase.h:176
static void BackupFileWithDate(const Char_t *path)
Definition: KVBase.cpp:753
static Bool_t SearchKVFile(const Char_t *name, TString &fullpath, const Char_t *kvsubdir="")
Definition: KVBase.cpp:538
Dialog box for setting system parameters associated to runs.
void DeleteSystem()
Delete the currently selected system.
void TargetAngleChanged(Long_t)
Called when target angle is changed.
void ProjectileZChanged(Long_t)
void RemoveAll(TGComboBox *)
void ProjectileEChanged(Long_t)
void UpdateSystemProperties()
Update displayed system properties, e.g. when a new system is selected in fComboBox1476.
void UpdateTargetLayerProperties(Int_t)
void CreateMainWindow(const TGWindow *p, const TGWindow *main, UInt_t w, UInt_t h)
Creates main window and displays it.
void TargetLayerAChanged(Long_t)
Called when target layer A is changed.
virtual ~KVDBSystemDialog()
Destructor.
void TargetLayerThicknessChanged(Long_t)
void SelectSystem(Int_t)
Called when a new system is selected in fComboBox1476.
void ProjectileAChanged(Long_t)
void EnableProjectileProperties(Bool_t)
Called when "Projectile" check box is checked (on=kTRUE) or unchecked (on=kFALSE)
Database class used to store information on different colliding systems studied during an experiment.
Definition: KVDBSystem.h:51
const Char_t * GetDataSetDir() const
Definition: KVDataSet.cpp:720
const Char_t * GetDataSetEnv(const Char_t *type, const Char_t *defval="") const
Definition: KVDataSet.cpp:758
KVExpDB * GetDataBase(Option_t *opt="") const
Definition: KVDataSet.cpp:285
Handles a set of different versions of files with the same base name and a timestamp.
void AddSystem(KVDBSystem *r)
Definition: KVExpDB.h:93
virtual void cd()
Definition: KVExpDB.cpp:548
void RemoveSystem(KVDBSystem *s)
Definition: KVExpDB.h:97
virtual KVSeqCollection * GetSystems() const
Definition: KVExpDB.h:88
virtual void Save(const Char_t *)
Definition: KVExpDB.cpp:362
General purpose dialog box asking for some input in the form of a string.
Definition: KVInputDialog.h:23
Abstract base class for calculation of range & energy loss of charged particles in matter.
virtual Double_t GetAtomicMass(const Char_t *)
Returns atomic mass of a material in the range tables.
virtual TObjArray * GetListOfMaterials()=0
virtual Double_t GetZ(const Char_t *)
Returns atomic number of a material in the range tables.
Description of physical materials used to construct detectors & targets; interface to range tables.
Definition: KVMaterial.h:93
static KVIonRangeTable * GetRangeTable()
Definition: KVMaterial.cpp:166
Double_t GetAreaDensity() const
Definition: KVMaterial.cpp:556
Description of properties and kinematics of atomic nuclei.
Definition: KVNucleus.h:125
const Char_t * GetSymbol(Option_t *opt="") const
Definition: KVNucleus.cpp:81
Int_t GetA() const
Definition: KVNucleus.cpp:799
Int_t GetZ() const
Return the number of proton / atomic number.
Definition: KVNucleus.cpp:770
Strings used to represent a set of ranges of values.
Definition: KVNumberList.h:83
KaliVeda extensions to ROOT collection classes.
virtual TObject * At(Int_t idx) const
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:72
Calculation/correction of energy losses of particles through an experimental target.
Definition: KVTarget.h:126
void SetAngleToBeam(Double_t a)
Definition: KVTarget.cpp:178
void AddLayer(const Char_t *material, Double_t thick)
Definition: KVTarget.cpp:111
virtual void ls(Option_t *option="") const
virtual void SetToolTipText(const char *text, Long_t delayms=400)
virtual void SetLayoutBroken(Bool_t on=kTRUE)
virtual void SetLayoutManager(TGLayoutManager *l)
virtual void AddFrame(TGFrame *f, TGLayoutHints *l=0)
FontStruct_t GetFontStruct() const
FontH_t GetFontHandle() const
virtual void Resize(TGDimension size)
virtual void ChangeBackground(Pixel_t back)
virtual void MoveResize(Int_t x, Int_t y, UInt_t w=0, UInt_t h=0)
GContext_t GetGC() const
void SetTextJustify(Int_t tmode)
virtual void Disable(Bool_t on=kTRUE)
virtual void SetState(Bool_t enable=kTRUE)
virtual void SetTextJustify(Int_t tmode)
virtual const char * GetName() const
virtual const char * GetTitle() const
virtual const char * GetName() const
Bool_t Connect(const char *signal, const char *receiver_class, void *receiver, const char *slot)
Int_t Atoi() const
const char * Data() const
void Form(const char *fmt,...)
virtual int CopyFile(const char *from, const char *to, Bool_t overwrite=kFALSE)
static void SingleShot(Int_t milliSec, const char *receiver_class, void *receiver, const char *method)
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
int main(int argc, char **argv)
const Int_t n
TH1 * h
const long double mg
Definition: KVUnits.h:74
const long double cm
Definition: KVUnits.h:66
constexpr Double_t E()
ULong_t fBackground
Mask_t fMask
Bool_t fGraphicsExposures
ULong_t fForeground
Int_t fFillStyle
FontH_t fFont