Geant4  9.6.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Lesson2Wx.py
Go to the documentation of this file.
1 #!/usr/bin/python
2 
3 #### 2006 Sep 26, the first draft version
4 ## Wired not yet. g4pipe control and Popen
5 
6 from Geant4 import *
7 import g4py.Qmaterials, g4py.NISTmaterials
8 import g4py.ExN03geom
9 import g4py.ExN03pl
10 import g4py.ParticleGun, g4py.MedicalBeam
11 import sys
12 from time import *
13 from subprocess import *
14 import os
15 
16 # ==================================================================
17 # main
18 # ==================================================================
19 # ------------------------------------------------------------------
20 # randum number
21 # ------------------------------------------------------------------
22 rand_engine= Ranlux64Engine()
23 HepRandom.setTheEngine(rand_engine)
24 HepRandom.setTheSeed(20050830L)
25 
26 # ------------------------------------------------------------------
27 # setup for materials
28 # ------------------------------------------------------------------
29 
30 
31 # NIST materials
32 #g4py.NISTmaterials.Construct()
33 
34 # ------------------------------------------------------------------
35 # setup for geometry
36 # ------------------------------------------------------------------
37 # normal way for constructing user geometry
38 
39 exN03geom= g4py.ExN03geom.ExN03DetectorConstruction()
40 gRunManager.SetUserInitialization(exN03geom)
41 
42 # 2nd way, short-cut way
43 
44 #g4py.ExN01geom.Construct()
45 #g4py.ExN03geom.Construct()
46 
47 # magnetic field
48 #exN03geom.SetMagField(0.1 * tesla)
49 
50 # ------------------------------------------------------------------
51 # setup for physics list
52 # ------------------------------------------------------------------
53 # normal way for constructing user physics list
54 exN03PL= g4py.ExN03pl.PhysicsList()
55 gRunManager.SetUserInitialization(exN03PL)
56 
57 # 2nd way, short-cut way
58 #g4py.ExN01pl.Construct()
59 
60 
61 # ------------------------------------------------------------------
62 # setup for primary generator action
63 # ------------------------------------------------------------------
64 # normal way for constructing user physics list
65 #pgPGA= g4py.ParticleGun.ParticleGunAction()
66 #gRunManager.SetUserAction(pgPGA)
67 #pg= pgPGA.GetParticleGun()
68 
69 # 2nd way, short-cut way
70 pg= g4py.ParticleGun.Construct()
71 
72 # set parameters of particle gun
73 pg.SetParticleByName("e-")
74 pg.SetParticleEnergy(50.*MeV)
75 pg.SetParticlePosition(G4ThreeVector(-40.,0.,0.)*cm)
76 pg.SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.))
77 
78 # medical beam
79 #beam= MedicalBeam.Construct()
80 
81 # ------------------------------------------------------------------
82 # go...
83 # ------------------------------------------------------------------
84 gRunManager.Initialize()
85 
86 
87 # visualization
88 # OGLSX, VRML and HEPREP sceneHandlers are all created with names
89 gApplyUICommand("/vis/sceneHandler/create OGLSX OGLSX")
90 gApplyUICommand("/vis/sceneHandler/create VRML2FILE VRML")
91 gApplyUICommand("/vis/sceneHandler/create HepRepFile HEPREP")
92 
93 # OGLSX is the default so, viewer is created and volume is drawn
94 gApplyUICommand("/vis/viewer/create OGLSX oglsxviewer")
95 gApplyUICommand("/vis/drawVolume")
96 gApplyUICommand("/vis/scene/add/trajectories")
97 
98 gApplyUICommand("/tracking/storeTrajectory 1")
99 gApplyUICommand("/vis/scene/endOfEventAction accumulate")
100 gApplyUICommand("/vis/scene/endOfRunAction accumulate")
101 gApplyUICommand("/vis/viewer/select oglsxviewer")
102 
103 # viewers VRML and Wired are tested by their envs vars
104 # if their envs var are set, then viewers are created and drawVolume
105 
106 global heprepViewer, heprepDir, heprepName, vrmlViewer
107 heprepViewer = os.environ.get("G4HEPREPFILE_VIEWER")
108 heprepDir = os.environ.get("G4HEPREPFILE_DIR")
109 heprepName = os.environ.get("G4HEPREPFILE_NAME")
110 if heprepViewer is not None:
111  gApplyUICommand("/vis/viewer/create HEPREP wired")
112  gApplyUICommand("/vis/drawVolume")
113 
114 # VRML viewers name is user defined
115 vrmlDir = os.environ.get("G4VRML_DEST_DIR")
116 vrmlViewer = os.environ.get("G4VRMLFILE_VIEWER")
117 
118 if vrmlViewer is not None:
119  gApplyUICommand("/vis/viewer/create VRML vrmlviewer")
120  gApplyUICommand("/vis/drawVolume")
121 
122 
123 # test############################################################################TESSSSSSST
124 gApplyUICommand("/vis/viewer/select oglsxviewer")
125 gApplyUICommand("/vis/scene/add/trajectories")
126 
127 gApplyUICommand("/tracking/storeTrajectory 1")
128 gApplyUICommand("/vis/scene/endOfEventAction accumulate")
129 gApplyUICommand("/vis/scene/endOfRunAction accumulate")
130 #test########################################################################################
131 
132 global commandDic, commandList
133 commandDic = {}
134 commandList = []
135 
136 def DumpTree(atree):
137 
138  ntree= atree.GetTreeEntry()
139  ncommand= atree.GetCommandEntry()
140  for i in range(1, ncommand+1):
141  icommand= atree.GetCommand(i)
142  command = str( icommand.GetCommandPath())
143  commandList.append(command)
144  nparameter= icommand.GetParameterEntries()
145  pguide = ""
146  for j in range(0, nparameter):
147  iparam= icommand.GetParameter(j)
148  pguide = pguide + "Parameter: " + str(iparam.GetParameterName())+ " Type: " + str(iparam.GetParameterType()) + '\n'
149  guide = str(icommand.GetTitle()) + '\n' + pguide
150  commandDic[command] = guide
151 
152  for i in range(1, ntree+1):
153  itree= atree.GetTree(i)
154  DumpTree(itree)
155 
156 
157 root_tree= gUImanager.GetTree()
158 DumpTree(root_tree)
159 
160 
161 
162 
163 ###### wxPython GUI ##########
164 
165 
166 import wx
167 
168 
169 
170 class ComPanel(wx.Panel):
171  def __init__(self, parent):
172  wx.Panel.__init__(self, parent, -1)
173 
174  self.g4comText = wx.TextCtrl(parent, -1, "enter Command", pos=(10,10), size=(300, 30))
175  self.g4comExec = wx.Button(parent, -1, "Execute", pos=(320,10), size=(60,30))
176  self.g4comExec.Bind(wx.EVT_BUTTON, self.ExecuteCommand, self.g4comExec)
177 # self.sizerE = wx.BoxSizer(wx.HORIZONTAL)
178 # self.sizerE.Add(self.g4comText)
179 # self.sizerE.Add(self.g4comExec)
180 
181 # self.sizerL = wx.BoxSizer(wx.HORIZONTAL)
182  self.comListBox = wx.ListBox(parent, -1, pos=(10,50), size=(300,200), choices=commandList, style=wx.LB_SINGLE)
183  self.comListBox.SetSelection(1)
184  self.comListBox.Bind(wx.EVT_LISTBOX, self.ShowGuide, self.comListBox)
185 # self.sizerL.Add(self.comListBox)
186 
187  self.guide = wx.TextCtrl(parent, -1, "guidance", pos=(320,50), size=(300, 200), style =wx.TE_MULTILINE)
188  self.guide.Bind(wx.EVT_LISTBOX, self.ShowGuide, self.guide)
189 
190 # self.sizerL.Add(self.guide)
191 # self.sizer = wx.BoxSizer(wx.VERTICAL)
192 # self.sizer.Add(self.sizerE)
193 # self.sizer.Add(self.sizerL)
194 # self.SetSizer(self.sizer)
195 
196  def ShowGuide(self, event):
197  self.guide.Clear() # how to cleat the whole text before showing the next
198  g4com =str(self.comListBox.GetStringSelection())
199  self.guide.WriteText( commandDic[g4com])
200  self.g4comText.SetValue(g4com)
201 
202  def ExecuteCommand(self, event):
203  gApplyUICommand(str(self.g4comText.GetValue()))
204 
205 class VisPanel(wx.Panel):
206  def __init__(self, parent):
207  wx.Panel.__init__(self, parent, -1)
208 
209  self.visZoomIn = wx.Button(parent, -1, "Zoom In", pos=(10,100), size=(80,30))
210  self.visZoomOut = wx.Button(parent, -1, "Zoom out", pos=(100,100), size=(80,30))
211  self.visUp = wx.Button(parent, -1, "Up", pos=(190,100), size=(80,30))
212  self.visDown = wx.Button(parent, -1, "Down", pos=(270,100), size=(80,30))
213  self.visLeft = wx.Button(parent, -1, "Left", pos=(360,100), size=(80,30))
214  self.visRight = wx.Button(parent, -1, "Left", pos=(450,100), size=(80,30))
215 
216  viewerList = ["OpenGL", "VRML", "Wired"]
217  self.viewer = wx.RadioBox(self, -1, "Viewer", pos=(10,10),
218  size=(210,60), choices=viewerList, majorDimension=1, style=wx.RA_SPECIFY_ROWS)
219  self.viewer.Bind(wx.EVT_RADIOBOX, self.ViewerSelected, self.viewer)
220  self.viewer.SetToolTip(wx.ToolTip("Select one"))
221  self.viewer.SetSelection(0)
222  if vrmlViewer == None: self.viewer.EnableItem(1, False)
223  if heprepViewer == None: self.viewer.EnableItem(2, False)
224 # self.sizer = wx.BoxSizer(wx.HORIZONTAL)
225 # self.sizer.Add((20,30))
226 # self.sizer.Add(self.visZoomIn)
227 # self.sizer.Add(self.visZoomOut)
228 # self.sizer.Add(self.visUp)
229 # self.sizer.Add(self.visDown)
230 # self.sizer.Add(self.visRight)
231 # self.sizer.Add(self.visLeft)
232 # self.SetSizer(self.sizer)
233 
234 # self.visZoomIn = wx.Button(parent, -1, "Zoom In", pos=(10,70), size=(80,30))
235 # self.visZoomOut = wx.Button(parent, -1, "Zoom out", pos=(100,70), size=(80,30))
236 # self.visUp = wx.Button(parent, -1, "Up", pos=(10,50), size=(190,70))
237 # self.visDown = wx.Button(parent, -1, "Down", pos=(100,50), size=(270,70))
238 # self.visLeft = wx.Button(parent, -1, "Left", pos=(10,90), size=(360,70))
239 # self.visRight = wx.Button(parent, -1, "Left", pos=(100,90), size=(450,70))
240 
241 
242 
243  self.visZoomIn.Bind(wx.EVT_BUTTON, self.cmdExpand, self.visZoomIn)
244  self.visZoomOut.Bind(wx.EVT_BUTTON, self.cmdShrink, self.visZoomOut)
245  self.visUp.Bind(wx.EVT_BUTTON, self.cmdUp, self.visUp)
246  self.visDown.Bind(wx.EVT_BUTTON, self.cmdDown, self.visDown)
247  self.visRight.Bind(wx.EVT_BUTTON, self.cmdRight, self.visRight)
248  self.visLeft.Bind(wx.EVT_BUTTON, self.cmdLeft, self.visLeft)
249 
250  def cmdExpand(self, event):
251  gApplyUICommand("/vis/viewer/zoom 1.2")
252  def cmdShrink(self, event):
253  gApplyUICommand("/vis/viewer/zoom 0.8")
254  def cmdUp(self, event):
255  gApplyUICommand("/vis/viewer/pan " + " 0. 10. mm")
256  def cmdDown(self, event):
257  gApplyUICommand("/vis/viewer/pan " + " 0. -10. mm")
258  def cmdRight(self, event):
259  gApplyUICommand("/vis/viewer/pan " + " -10. 0. mm")
260  def cmdLeft(self, event):
261  gApplyUICommand("/vis/viewer/pan " + " 10. 0. mm")
262 
263  def ViewerSelected(self, event):
264  self.viewerName = event.GetString()
265 
266  if self.viewerName == "OpenGL":
267  gApplyUICommand("/vis/viewer/select oglsxviewer")
268  gApplyUICommand("/vis/scene/add/trajectories")
269 
270  gApplyUICommand("/tracking/storeTrajectory 1")
271  gApplyUICommand("/vis/scene/endOfEventAction accumulate")
272  gApplyUICommand("/vis/scene/endOfRunAction accumulate")
273 
274  if self.viewerName == "VRML":
275  gApplyUICommand("/vis/viewer/select vrmlviewer")
276  gApplyUICommand("/vis/scene/add/trajectories")
277 
278  gApplyUICommand("/tracking/storeTrajectory 1")
279  gApplyUICommand("/vis/scene/endOfEventAction accumulate")
280  gApplyUICommand("/vis/scene/endOfRunAction accumulate")
281 
282  if self.viewerName == "Wired":
283 
284  gApplyUICommand("/vis/viewer/select wired")
285  gApplyUICommand("/vis/scene/add/trajectories")
286 
287  gApplyUICommand("/tracking/storeTrajectory 1")
288  gApplyUICommand("/vis/scene/endOfEventAction accumulate")
289  gApplyUICommand("/vis/scene/endOfRunAction accumulate")
290 
291 # everytime wired is chosen, a new instance of wired is created
292 # to reuse single wired, g4pipe.poll() must be checked BEFORE the SECOND Popen
293 # if g4pipe.poll() == None:
294  g4pipe=Popen(heprepViewer+ " -file " + heprepDir+"/" +heprepName +".heprep", shell=True)
295 
296 
297 
298 # not used
299 class MyText(wx.StaticText):
300  def __init__(self, parent, Text):
301  wx.StaticText.__init__(self, parent, -1, Text, pos=(20,20))
302  self.Bind(wx.EVT_LEFT_UP, self.ChangeColor)
303 
304  def ChangeColor(self, event):
305  TheColour = self.GetForegroundColour()
306  if TheColour == (0,0,0):
307  self.SetLabel("Simulation is running!")
308  self.SetForegroundColour("red")
309  else:
310  self.SetLabel("Click me to start a run")
311  self.SetForegroundColour("black")
312 
313 # to be used to choose materials and particles
314 # myList is a list of keys() of a dictionary
315 # f.e., materials are Python objects with their names as their keys
316 class SelectOne(wx.RadioBox):
317  def __init__(self, parent, myTitle, myList):
318  wx.RadioBox.__init__(self, parent, -1, myTitle, wx.DefaultPosition,
319  wx.DefaultSize, myList, 5, wx.RA_SPECIFY_ROWS)
320 # self.Bind(wx.EVT_RADIOBOX, self.Selected)
321  self.SetToolTip(wx.ToolTip("Select one"))
322  self.SetSelection(0)
323 # used only to test Bind and getValue
324 # def Selected(self, event):
325 # self.selected = event.GetString()
326 
327 
328 # used to %3.3f floating point number
329 # energy and length unit is given by unitList which must be a dictionary
330 # with units of Python objects and their name as their keys
331 
332 class FloatCounter(wx.Panel):
333  def __init__(self, parent, myTitle, unitList):
334  wx.Panel.__init__(self, parent, -1)
335 
336  self.sizer = wx.BoxSizer(wx.HORIZONTAL)
337  self.sizer.Add((10, -1))
338  self.sizer.Add(wx.StaticText(parent, -1, myTitle, wx.DefaultPosition, (100, -1)))
339 
340  self.intPart = wx.SpinCtrl(parent, -1, "", wx.DefaultPosition, (60,-1))
341  self.intPart.SetRange(0,999)
342  self.intPart.SetValue(1)
343  self.intPart.Bind(wx.EVT_SPINCTRL, self.SetFloat)
344 
345  self.manPart = wx.SpinCtrl(parent, -1, "", wx.DefaultPosition, (50, -1))
346  self.manPart.SetRange(0,999)
347  self.manPart.SetValue(0)
348  self.manPart.Bind(wx.EVT_SPINCTRL, self.SetFloat)
349 
350  self.unitSel = wx.Choice(parent, -1, wx.DefaultPosition, (90, -1), unitList)
351  self.unitSel.Bind(wx.EVT_CHOICE, self.SetFloat, self.unitSel)
352  self.unitSel.SetSelection(2)
353 
354  self.valAndUnit = wx.TextCtrl(parent, -1, "value unset", wx.DefaultPosition, (150, -1))
355 
356  self.sizer.Add(self.valAndUnit)
357  self.sizer.Add((10, -1))
358  self.sizer.Add(wx.StaticText(parent, -1, " ", wx.DefaultPosition, (30, -1)))
359  self.sizer.Add(self.intPart)
360  self.sizer.Add(wx.StaticText(parent, -1, ".", wx.DefaultPosition, (10, -1)))
361  self.sizer.Add(self.manPart)
362  self.sizer.Add((5,-1))
363  self.sizer.Add(self.unitSel)
364  self.SetSizer(self.sizer)
365 
366  def SetFloat(self, event):
367  self.theValueStr = str(self.intPart.GetValue()) + "." + str(self.manPart.GetValue()) + " "
368  self.theValue = float (self.intPart.GetValue()) + float(self.manPart.GetValue())/ 1000.
369  self.theUnit = self.unitSel.GetStringSelection()
370  theText = "%.3f" % (self.theValue) + " " + self.theUnit
371  self.valAndUnit.SetValue(theText)
372 # user may edit the Entry, so finnaly this value must be got
373 # but it doesn't work for length but work for energy (gApplyUIcommnd)
374  theTextWithStar = "%.3f" % (self.theValue) + " * " + self.theUnit
375 
376 # special class for this example to set/unset processes
377 class Processes(wx.Panel):
378  def __init__(self, parent, myTitle, myList):
379  wx.Panel.__init__(self, parent, -1)
380  self.processCheck = {}
381  self.sizer = wx.FlexGridSizer(rows=5)
382  self.sizer.AddGrowableRow(1)
383  for item in myList:
384  self.processCheck[item] = wx.CheckBox(parent, -1, item)
385  self.processCheck[item].SetValue(True)
386 # self.processCheck[item].Bind(wx.EVT_CHECKBOX, self.CheckedProcess)
387  self.sizer.Add(self.processCheck[item],0,wx.EXPAND)
388 
389  self.SetSizer(self.sizer)
390  self.SetBackgroundColour('green')
391  self.processState = {}
392  self.myList = myList
393 
394 # test only
395 # def CheckedProcess(self, event):
396 # self.processName = event.GetEventObject().GetLabel()
397 # self.processState = event.GetEventObject().GetValue()
398 
399 
400 # slider to set an integer value
401 # title is shown
402 class Adjuster(wx.Panel):
403  def __init__(self, parent, myTitle, minVal, maxVal, initVal):
404  wx.Panel.__init__(self, parent, -1)
405  self.sizer = wx.BoxSizer(wx.HORIZONTAL)
406  self.sizer.Add((10, -1))
407  self.sizer.Add(wx.StaticText(parent, -1, myTitle, wx.DefaultPosition, (100, -1)))
408  self.slider = wx.Slider(parent, -1, initVal, minVal, maxVal,
409  wx.DefaultPosition, (300, -1),
410  wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | wx.SL_LABELS)
411  self.slider.SetPageSize(1)
412  self.sizer.Add(self.slider)
413  self.SetSizer(self.sizer)
414 
415 # test only
416 # self.Bind(wx.EVT_SLIDER, self.Adjusted)
417 
418 # def Adjusted(self, event):
419 # print self.GetValue()
420 
421 
422 ########################## no use now
423 class Counter(wx.SpinCtrl):
424  def __init__(self, parent, myTitle, minVal, maxVal, initVal):
425  wx.SpinCtrl.__init__(self, parent, -1, "", wx.DefaultPosition, wx.DefaultSize, wx.TE_RIGHT)
426  self.SetRange(minVal, maxVal)
427  self.SetValue(initVal)
428  self.Bind(wx.EVT_SPINCTRL, self.Adjusted)
429  def Adjusted(self, event):
430  print self.GetValue()
431 
432 ############################
433 
434 # main class to instantiate the above classes and pack them using nested sizers
435 g4pipe=0
436 
437 class MyApp(wx.Frame):
438  def __init__(self):
439  wx.Frame.__init__(self, None, -1, "Geant4Py")
440  self.nb = wx.Notebook(self, -1, wx.DefaultPosition, wx.DefaultSize,
441  style=
442  wx.NB_TOP # | wx.NB_MULTILINE
443  #wx.NB_BOTTOM
444  #wx.NB_LEFT
445  #wx.NB_RIGHT
446  )
447  self.nb.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
448  self.nb.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGING, self.OnPageChanging)
449 
450  panel = wx.Panel(self.nb)
451  self.nb.AddPage(panel, "ExampleN03")
452  commandPanel = wx.Panel(self.nb)
453  self.nb.AddPage(commandPanel, "Geant4 Commands")
454  comP = ComPanel(commandPanel)
455  gxsizer = wx.BoxSizer(wx.HORIZONTAL)
456  gxsizer.Add(comP)
457  commandPanel.SetSizer(gxsizer)
458 
459 
460  visualizationPanel = wx.Panel(self.nb)
461  self.nb.AddPage(visualizationPanel, "Vis Commands")
462  visP = VisPanel(visualizationPanel)
463  vxsizer = wx.BoxSizer(wx.HORIZONTAL)
464  vxsizer.Add(visP)
465  visualizationPanel.SetSizer(vxsizer)
466 
467 # outmost sizer in the vertical direction
468  bxsizer = wx.BoxSizer(wx.VERTICAL)
469 # nested sizer in the horizontal direction
470  bysizer = wx.BoxSizer(wx.HORIZONTAL)
471 
472 
473  self.runStart = wx.Button(panel, -1, " Run Start", wx.DefaultPosition, wx.DefaultSize)
474  self.Bind(wx.EVT_BUTTON, self.RunStart, self.runStart)
475  bxsizer.Add(self.runStart, 0, wx.ALL)
476 # widgets
477 
478  absorberMaterialList = ['Aluminium', 'Lead']
479  self.theAbsorberMaterial = SelectOne(panel, "Absorber Materials", absorberMaterialList)
480  gapMaterialList = ["liquidArgon","Scintillator", "Air", "Aerogel", "Galactic"]
481  self.theGapMaterial = SelectOne(panel, "Gap Materials", gapMaterialList)
482 
483  particleList = ["proton", "gamma", "e-", "e+", "mu-", "mu+"]
484  self.theParticle = SelectOne(panel, "Particles", particleList)
485 
486  self.processList = ["phot", "compt", "conv", "msc", "eIoni", "eBrem", "annihil","muIoni", "muBrems", "hIoni"]
487  self.theProcesses = Processes(panel, "Processes", self.processList)
488 
489  self.eventNo = Adjuster(panel, "Number of Events", 1 , 100 , 1)
490  self.layerNo = Adjuster(panel, "Number of Layers", 1, 10, 10)
491 
492  self.lengthUnit = {'micrometer':micrometer, 'mm':mm, 'cm':cm, 'm':m}
493  self.absorberThickSpin = FloatCounter(panel, "Absorber Thickness", self.lengthUnit.keys())
494  self.gapThickSpin = FloatCounter(panel, "Gap Thickness", self.lengthUnit.keys())
495  self.sizeYZSpin = FloatCounter(panel, "Section Size", self.lengthUnit.keys())
496  self.cutLengthSpin = FloatCounter(panel, "Cut Length", self.lengthUnit.keys())
497  self.magneticUnit = {'Tesla':tesla, 'gauss':gauss, 'kilogauss':kilogauss}
498  self.magneticFieldSpin = FloatCounter(panel, "Magnetic Field", self.magneticUnit.keys())
499 
500  self.energyUnit = { 'keV':keV, 'MeV':MeV, 'GeV':GeV, 'TeV':TeV, 'PeV':PeV}
501  self.energySpin = FloatCounter(panel, "incident beam energy", self.energyUnit.keys())
502 
503 
504 # now sizers
505 
506  bxsizer.Add(wx.StaticLine(panel), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)
507  bysizer.Add((10, -1))
508  bysizer.Add(self.theAbsorberMaterial, 0, wx.EXPAND, 10)
509  bysizer.Add((10, -1))
510  bysizer.Add(self.theGapMaterial, 0, wx.EXPAND, 10)
511  bysizer.Add((10, -1))
512  bysizer.Add(self.theParticle, 0, wx.EXPAND, 10)
513  bysizer.Add((10, -1))
514  bysizer.Add(self.theProcesses.sizer, 0, wx.EXPAND, 10)
515 
516  bxsizer.Add(bysizer, 0, wx.EXPAND)
517 
518  bxsizer.Add(wx.StaticLine(panel), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)
519  bxsizer.Add(self.layerNo.sizer, 0, wx.EXPAND)
520  bxsizer.Add(self.absorberThickSpin.sizer, 0, wx.EXPAND)
521  bxsizer.Add(self.gapThickSpin.sizer, 0, wx.EXPAND)
522  bxsizer.Add(self.sizeYZSpin.sizer, 0, wx.EXPAND)
523  bxsizer.Add(wx.StaticLine(panel), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)
524 
525  bxsizer.Add(self.energySpin.sizer, 0, wx.EXPAND)
526  bxsizer.Add(wx.StaticLine(panel), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)
527  bxsizer.Add(self.cutLengthSpin.sizer, 0, wx.EXPAND)
528  bxsizer.Add(wx.StaticLine(panel), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)
529  bxsizer.Add(self.magneticFieldSpin.sizer, 0, wx.EXPAND)
530 
531  bxsizer.Add(wx.StaticLine(panel), 0, wx.EXPAND|wx.TOP|wx.BOTTOM, 5)
532  bxsizer.Add(self.eventNo.sizer, 0, wx.EXPAND)
533 
534 # self.solid = EZgeom.G4EzVolume.GetSold(water_phantom)
535 # gControlExecute("oglx.mac")
536 
537  panel.SetSizer(bxsizer)
538  bxsizer.Fit(self)
539  bxsizer.SetSizeHints(self)
540  def OnPageChanged(self, event):
541  old = event.GetOldSelection()
542  new = event.GetSelection()
543  sel = self.nb.GetSelection()
544  event.Skip()
545 
546  def OnPageChanging(self, event):
547  old = event.GetOldSelection()
548  new = event.GetSelection()
549  sel = self.nb.GetSelection()
550  event.Skip()
551 
552  def RunStart(self, event):
553 
554  absorberTh = self.absorberThickSpin.theValue * self.lengthUnit[self.absorberThickSpin.theUnit]/2.0
555  gapTh = self.gapThickSpin.theValue * self.lengthUnit[self.gapThickSpin.theUnit]/2.0
556  yzSize = self.sizeYZSpin.theValue * self.lengthUnit[self.sizeYZSpin.theUnit]
557  print "BUG"
558  cutLen = self.cutLengthSpin.theValue * self.lengthUnit[self.cutLengthSpin.theUnit]
559  magF = self.magneticFieldSpin.theValue * self.magneticUnit[self.magneticFieldSpin.theUnit]
560 
561  exN03geom.SetNbOfLayers(self.layerNo.slider.GetValue())
562  exN03geom.SetAbsorberMaterial(str(self.theAbsorberMaterial.GetStringSelection()))
563  exN03geom.SetAbsorberThickness(absorberTh)
564  exN03geom.SetGapMaterial(str(self.theGapMaterial.GetStringSelection()))
565  exN03geom.SetGapThickness(gapTh)
566  exN03geom.SetCalorSizeYZ(yzSize)
567  position = -self.layerNo.slider.GetValue() * ( absorberTh + gapTh )*1.2
568 
569  exN03geom.UpdateGeometry()
570  exN03PL.SetDefaultCutValue(cutLen)
571  exN03PL.SetCutsWithDefault()
572  exN03geom.SetMagField(magF)
573 
574  print "Now geometry updated"
575 
576  print position
577 
578 # gApplyUICommand("/vis/viewer/flush")
579 # gApplyUICommand("/vis/scene/add/text 0 610 610 mm 20 0 0 " + "wxPython")
580 
581  gApplyUICommand("/gun/particle " + str ( self.theParticle.GetStringSelection() ) )
582  for i in self.processList:
583 # print i, self.theProcesses.processCheck[i].GetValue()
584  gProcessTable.SetProcessActivation(i, 1)
585  if self.theProcesses.processCheck[i].GetValue() != True:
586  gProcessTable.SetProcessActivation(i, 0)
587 
588  gApplyUICommand("/gun/energy " + str ( self.energySpin.valAndUnit.GetValue() ) )
589 
590  eventNum = self.eventNo.slider.GetValue()
591  for i in range(eventNum):
592  pg.SetParticlePosition(G4ThreeVector(position, (i-eventNum/2)*5.*mm, 0.*cm))
593  gRunManager.BeamOn(1)
594 # sleep(0.01)
595  gApplyUICommand("/vis/viewer/update")
596 
597 
598 app = wx.PySimpleApp(False)
599 MyApp().Show()
600 app.MainLoop()