2 // Category: interfaces
6 //========================================================
8 //------------TG4VolumesFrames.cxx--------------------------------//
9 //--------- Frames for the the display of volumes properties---//
11 //=========================================================
13 #include "TG4VolumesFrames.h"
14 #include "TG4MaterialsFrames.h"
15 #include "TG4MainFrame.h"
16 #include "TG4Editor.h"
17 #include "TG4Globals.h"
18 #include "TG4Limits.h"
19 #include "TG4G3CutVector.h"
20 #include "TG4G3ControlVector.h"
22 #include <TGTextBuffer.h>
23 #include <TGTextEntry.h>
24 #include <TGComboBox.h>
27 //#include <TGFrame.h>
28 //#include <TGButton.h>
30 #include <G4LogicalVolumeStore.hh>
31 #include <G4LogicalVolume.hh>
32 #include <G4Material.hh>
33 #include <G4VSolid.hh>
34 #include <G4UserLimits.hh>
38 ClassImp(TG4VolumesFrames)
40 TG4VolumesFrames::TG4VolumesFrames( TGTab* Tab, TG4MainFrame* ActionFrame)
43 //---> creates the volumes properties display frame
44 //---> and plunges it into the main frame
45 TGCompositeFrame* parent = Tab->AddTab("Volumes Properties");
46 fCapFrame = new TGCompositeFrame(parent, 60, 20, kHorizontalFrame);
47 ULong_t back= TGFrame::GetBlackPixel();
48 fCapFrame->ChangeBackground(back);
49 fVolSubframe1 = new TGCompositeFrame(fCapFrame, 60, 20, kVerticalFrame);
50 fVolFrameLayout = new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5);
52 // ComboBox for lvolumes
53 fVolumesCombo = new TGComboBox(fVolSubframe1, 100);
54 TGLayoutHints* lLayoutHints3 =
55 new TGLayoutHints(kLHintsTop | kLHintsLeft | kLHintsExpandX,
57 Text_t* lComboLabelText = " Pick up a volume here ";
58 fComboLabel = new TGLabel( fVolSubframe1, lComboLabelText);
59 fVolSubframe1->AddFrame(fComboLabel, lLayoutHints3);
60 fVolSubframe1->AddFrame(fVolumesCombo, fVolFrameLayout);
62 fVolumesCombo->Resize(200, 30);
63 fVolumesCombo->Associate(ActionFrame);
66 // text labels with lvolumes properties
68 Text_t* labelText[3] =
73 // Entries for lvolumes properties
74 TGLayoutHints* lLayoutHints4 =
75 new TGLayoutHints(kLHintsTop | kLHintsExpandY, 5, 5, 5, 5);
76 TGLayoutHints* lLayoutHints5 =
77 new TGLayoutHints(kLHintsLeft | kLHintsExpandX );
78 fVolSubframe2 = new TGCompositeFrame(fCapFrame, 60, 20, kVerticalFrame);
80 { // local scope for i
81 for (Int_t i=0; i<2; i++) {
83 fHframe[i] = new TGHorizontalFrame(fVolSubframe2, 500, 100, kFixedWidth);
84 fVolSubframe2->AddFrame(fHframe[i], lLayoutHints4);
85 fVolTextBuff[i] = new TGTextBuffer(200);
86 fVolTextEntry[i] = new TGTextEntry(fHframe[i], fVolTextBuff[i], 300);
87 fLabel[i] = new TGLabel(fHframe[i], labelText[i]);
88 fHframe[i]->AddFrame(fLabel[i], lLayoutHints5);
89 fHframe[i]->AddFrame(fVolTextEntry[i], lLayoutHints5);
90 fVolTextEntry[i]->Associate(ActionFrame);
94 // --->a group frame for displaying user's limits with a text entry added
97 new TGGroupFrame(fVolSubframe2, "----- User Limits Showcase -----", kVerticalFrame);
98 fHframe[2] = new TGHorizontalFrame( fGrFrame, 410, 100, kFixedWidth);
99 TGLayoutHints* lLayoutHints6 = new TGLayoutHints(kLHintsTop | kLHintsLeft ,
101 fLabel[2] = new TGLabel(fHframe[2], labelText[2]);
102 fHframe[2]->AddFrame(fLabel[2],lLayoutHints6);
103 fVolTextBuff[2] = new TGTextBuffer(200);
104 fVolTextEntry[2] = new TGTextEntry(fHframe[2], fVolTextBuff[2], 300);
105 fVolTextEntry[2]->Resize(1000, fVolTextEntry[2]->GetDefaultHeight());
106 fHframe[2]->AddFrame(fVolTextEntry[2], lLayoutHints6);
107 fVolTextEntry[2]->Associate(ActionFrame);
109 fGrFrame->AddFrame(fHframe[2], lLayoutHints4);
111 // ---> adding to the group frame another frame with text buttons
112 // for calling up a full display of user's limits properties
114 fGrHFrame= new TGHorizontalFrame( fGrFrame, 500, 100);
115 fbtsumm = new TGTextButton(fGrHFrame, "&User Limits", 301);
116 fbtcuts = new TGTextButton(fGrHFrame, "&Show Cuts", 302);
117 fbtcontrols = new TGTextButton(fGrHFrame, "&Show Controls", 303);
118 TGLayoutHints* lLayoutHints7 =
119 new TGLayoutHints(kLHintsTop | kLHintsLeft, 50, 0, 5, 5);
120 fGrHFrame->SetLayoutManager(new TGMatrixLayout(fGrHFrame, 0, 3, 15));
121 fGrHFrame->AddFrame( fbtsumm );
122 fbtsumm->Resize(90, fbtsumm->GetDefaultHeight());
123 fGrHFrame->AddFrame( fbtcuts );
124 fbtcuts->Resize(90, fbtcuts->GetDefaultHeight());
125 fGrHFrame->AddFrame( fbtcontrols );
126 fbtcontrols->Resize(90, fbtcontrols->GetDefaultHeight());
128 fbtsumm->Associate(ActionFrame);
129 fbtcuts->Associate(ActionFrame);
130 fbtcontrols->Associate(ActionFrame);
132 fGrFrame->AddFrame(fGrHFrame, lLayoutHints4);
134 //---> adding the group frame to the subrame 2
135 fVolSubframe2->AddFrame( fGrFrame, lLayoutHints7);
136 fGrFrame->Resize(fGrFrame->GetDefaultSize());
138 // ---> text for the user's limits display window when no volume specified yet
139 fDisplBuffLimits = new TGTextBuffer(1000);
140 fDisplBuffLimits->Clear();
141 fDisplBuffLimits->AddText(0, "\n\n*** No volume specified, "
142 "no limits displayed *** ");
144 // ---> text for the user's cuts display window when no volume specified yet
145 fDisplBuffCuts = new TGTextBuffer(1000);
146 fDisplBuffCuts->Clear();
147 fDisplBuffCuts->AddText(0, "\n\n*** No volume specified, "
148 "no cuts displayed *** ");
150 // ---> text for the user's controls display window when no volume specified yet
151 fDisplBuffControls = new TGTextBuffer(1000);
152 fDisplBuffControls->Clear();
153 fDisplBuffControls->AddText(0, "\n\n*** No volume specified, "
154 "no controls displayed *** ");
157 // ---> making up the Volumes frame
158 fCapFrame->AddFrame(fVolSubframe1,fVolFrameLayout);
159 fCapFrame->AddFrame(fVolSubframe2,fVolFrameLayout);
161 // ---> going to the main frame
162 parent->AddFrame(fCapFrame, fVolFrameLayout);
165 TG4VolumesFrames::TG4VolumesFrames(const TG4VolumesFrames& vf)
167 // Dummy copy constructor
168 TG4Globals::Exception(
169 "Attempt to use TG4VolumesFrames copy constructor.");
172 TG4VolumesFrames& TG4VolumesFrames::operator=(const TG4VolumesFrames& vf)
174 // check assignement to self
175 if (this == &vf) return *this;
177 TG4Globals::Exception(
178 "Attempt to assign singleton.");
183 TG4VolumesFrames::~TG4VolumesFrames()
187 G4cout << "\n Now in TG4VolumesFrames destructor \n" << G4endl;
188 delete fVolSubframe1;
189 delete fVolFrameLayout;
190 delete fVolumesCombo;
192 delete fVolSubframe2;
201 for (i=0; i<3; i++) {
203 delete fVolTextBuff[i];
204 delete fVolTextEntry[i];
207 delete fDisplBuffLimits;
208 delete fDisplBuffCuts;
209 delete fDisplBuffControls;
213 void TG4VolumesFrames::SetVolumesComboEntries()
215 //--->//---> puts names of lvolumes into the combo box entries
217 G4LogicalVolumeStore* lComboEntries = G4LogicalVolumeStore::GetInstance();
219 G4int ig = lComboEntries->size();
222 for (int ii=0; ii < ig; ii++)
223 { name = ((*lComboEntries )[ii])->GetName() ;
224 AddLogicalVolumeName( name, ii+1);
228 AddLogicalVolumeName( name, ig+1);
233 void TG4VolumesFrames::AddLogicalVolumeName( const char* name, Int_t index) const
235 //-----> adds an lvolume name to the combo box
237 fVolumesCombo->AddEntry( name, index);
238 fVolumesCombo->Select(index);
239 fVolumesCombo->Resize(200, 20);
242 void TG4VolumesFrames::DisplayVolumeCharacteristics()
244 //-----> shows informations about a logical volume
246 G4LogicalVolumeStore* lComboEntries = G4LogicalVolumeStore::GetInstance();
247 G4int ientr = lComboEntries->size();
248 G4int index = fVolumesCombo->GetSelected();
251 G4cout << "\nThe clicked-on volumes entry has the index: " << index << G4endl;
255 if( index < ientr+1 ) {
258 G4LogicalVolume* lVolume = (*lComboEntries )[ii];
259 G4Material* lvMaterial = ((*lComboEntries )[ii])->GetMaterial();
260 lLimits = (TG4Limits*)lVolume->GetUserLimits();
261 TString lDisplayLimits = GetLimitsDisplay(lLimits);
262 TString lDisplayCuts = GetCutsDisplay(lLimits);
263 TString lDisplayControls = GetControlsDisplay(lLimits);
265 //---> fills up the buffer for popup frame display
266 fDisplBuffLimits->Clear();
267 fDisplBuffLimits->AddText(0,lDisplayLimits);
269 fDisplBuffCuts->Clear();
270 fDisplBuffCuts->AddText(0,lDisplayCuts);
272 fDisplBuffControls->Clear();
273 fDisplBuffControls->AddText(0,lDisplayControls);
276 G4cout << lVolume->GetName() << " "
277 << lVolume->GetSolid()->GetEntityType() << " "
278 << lvMaterial->GetName() << " "
279 << lVolume->GetUserLimits()->GetType() << G4endl;
281 //---> putting text in the text entries
284 sprintf(buff, lVolume->GetSolid()->GetEntityType());
285 fVolTextBuff[0]->Clear();
286 fVolTextBuff[0]->AddText(0, buff);
287 gClient->NeedRedraw(fVolTextEntry[0]);
289 sprintf(buff, lvMaterial->GetName());
290 fVolTextBuff[1]->Clear();
291 fVolTextBuff[1]->AddText(0, buff);
292 gClient->NeedRedraw(fVolTextEntry[1]);
295 sprintf(buff, "User limits undefined" );
296 if (lVolume->GetUserLimits())
297 sprintf(buff, lLimits->GetName());
298 fVolTextBuff[2]->Clear();
299 fVolTextBuff[2]->AddText(0, buff);
300 gClient->NeedRedraw(fVolTextEntry[2]);
302 imat = lvMaterial->GetIndex();
306 if( index == ientr+1 ) {
308 for ( G4int ii=0; ii<3; ii++) {
309 fVolTextBuff[ii]->Clear();
310 gClient->NeedRedraw(fVolTextEntry[ii]);
312 fDisplBuffLimits->Clear();
313 fDisplBuffLimits->AddText(0, "\n\n*** No volume specified, "
314 "no limits displayed *** ");
316 fDisplBuffCuts->Clear();
317 fDisplBuffCuts->AddText(0, "\n\n*** No volume specified, "
318 "no cuts displayed *** ");
320 fDisplBuffControls->Clear();
321 fDisplBuffControls->AddText(0, "\n\n*** No volume specified, "
322 "no controls displayed *** ");
327 //---> setting appropriate display in the MaterialsFrames
328 TG4MaterialsFrames* mFrames = fPanel->GetMaterialsFrames();
329 mFrames->DisplayMaterialCharacteristics( imat + 1 );
333 void TG4VolumesFrames::DisplayUserLimits()
335 //-----> displays User Limits associated with the logical volume
337 const char* cdisplay = fDisplBuffLimits->GetString();
338 TG4Editor* ed = new TG4Editor( fCapFrame, 450, 300);
339 ed->LoadBuffer(cdisplay);
344 void TG4VolumesFrames::DisplayCuts()
346 //-----> displays Cuts associated with the logical volume
348 const char* cdisplay = fDisplBuffCuts->GetString();
349 TG4Editor* ed = new TG4Editor( fCapFrame, 450, 300);
350 ed->LoadBuffer(cdisplay);
355 void TG4VolumesFrames::DisplayControls()
357 //-----> displays Controls associated with the logical volume
359 const char* cdisplay = fDisplBuffControls->GetString();
360 TG4Editor* ed = new TG4Editor( fCapFrame, 450, 300);
361 ed->LoadBuffer(cdisplay);
366 //_______________________________________________________________________
367 TString TG4VolumesFrames::GetLimitsDisplay(G4UserLimits* limits) const
369 // Returns text for the user limits display in a separate frame
375 display = "\n\n**************************************";
376 display += "\n**************************************\n\n";
378 const char* lname = ((TG4Limits*)limits)->GetName();
379 sprintf( buff, "\" %s \" limits: \n\n Max step length (mm): %g ",
380 lname, limits->GetMaxAllowedStep(dummy)/mm );
383 sprintf( buff, "\n\n Max track length (mm): %g \n\n Max time (s) : %g ",
384 limits->GetUserMaxTrackLength(dummy)/mm, limits->GetUserMaxTime(dummy)/s);
387 sprintf( buff, "\n\n Min kin. energy (MeV): %g \n\n Min range (mm): %g ",
388 limits->GetUserMinEkine(dummy)/MeV, limits->GetUserMinRange(dummy)/mm );
391 display += "\n\n**************************************";
392 display += "\n**************************************\n\n";
394 const char* tmp = display;
399 //===================inserted================================================
400 //_______________________________________________________________________
401 TString TG4VolumesFrames::GetCutsDisplay(G4UserLimits* limits) const
403 // Returns text for the cuts display in a separate frame
407 const TG4G3CutVector* lCutVector = ((TG4Limits*)limits) -> GetCutVector();
409 if ( ((TG4Limits*)limits) -> IsCut() )
410 display = lCutVector -> Format();
412 display = "\n\n**** No special cuts. **** ";
414 const char* tmp = display;
419 //_________________________________________________________________________
420 TString TG4VolumesFrames::GetControlsDisplay(G4UserLimits* limits) const
422 // Returns text for the controls display in a separate frame
426 const TG4G3ControlVector* lControlVector = ((TG4Limits*)limits) -> GetControlVector();
428 if ( ((TG4Limits*)limits) -> IsControl() )
429 display = lControlVector -> Format();
431 display = "\n\n**** No special controls. **** ";
433 const char* tmp = display;
439 //================end of inserted==================================================