source: trunk/environments/g4py/examples/education/lesson2/Lesson2Wx.py

Last change on this file was 1337, checked in by garnier, 14 years ago

tag geant4.9.4 beta 1 + modifs locales

File size: 23.2 KB
Line 
1#!/usr/bin/python
2
3#### 2006 Sep 26, the first draft version
4## Wired not yet. g4pipe control and Popen
5
6from Geant4 import *
7import g4py.Qmaterials, g4py.NISTmaterials
8import g4py.ExN03geom
9import g4py.ExN03pl
10import g4py.ParticleGun, g4py.MedicalBeam
11import sys
12from time import *
13from subprocess import *
14import os
15
16# ==================================================================
17# main
18# ==================================================================
19# ------------------------------------------------------------------
20# randum number
21# ------------------------------------------------------------------
22rand_engine= Ranlux64Engine()
23HepRandom.setTheEngine(rand_engine)
24HepRandom.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
39exN03geom= g4py.ExN03geom.ExN03DetectorConstruction()
40gRunManager.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
54exN03PL= g4py.ExN03pl.ExN03PhysicsList()
55gRunManager.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
70pg= g4py.ParticleGun.Construct()
71
72# set parameters of particle gun
73pg.SetParticleByName("e-")
74pg.SetParticleEnergy(50.*MeV)
75pg.SetParticlePosition(G4ThreeVector(-40.,0.,0.)*cm)
76pg.SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.))
77
78# medical beam
79#beam= MedicalBeam.Construct()
80
81# ------------------------------------------------------------------
82# go...
83# ------------------------------------------------------------------
84gRunManager.Initialize()
85
86
87# visualization
88# OGLSX, VRML and HEPREP sceneHandlers are all created with names
89gApplyUICommand("/vis/sceneHandler/create OGLSX OGLSX")
90gApplyUICommand("/vis/sceneHandler/create VRML2FILE VRML")
91gApplyUICommand("/vis/sceneHandler/create HepRepFile HEPREP")
92
93#  OGLSX is the default so, viewer is created and volume is drawn
94gApplyUICommand("/vis/viewer/create OGLSX oglsxviewer")
95gApplyUICommand("/vis/drawVolume")
96gApplyUICommand("/vis/scene/add/trajectories")
97
98gApplyUICommand("/tracking/storeTrajectory 1")
99gApplyUICommand("/vis/scene/endOfEventAction accumulate")
100gApplyUICommand("/vis/scene/endOfRunAction accumulate")
101gApplyUICommand("/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
106global heprepViewer, heprepDir, heprepName, vrmlViewer
107heprepViewer = os.environ.get("G4HEPREPFILE_VIEWER")
108heprepDir = os.environ.get("G4HEPREPFILE_DIR")
109heprepName = os.environ.get("G4HEPREPFILE_NAME")
110if heprepViewer is not None:
111  gApplyUICommand("/vis/viewer/create HEPREP wired")
112  gApplyUICommand("/vis/drawVolume")
113
114# VRML viewers name is user defined
115vrmlDir = os.environ.get("G4VRML_DEST_DIR")
116vrmlViewer = os.environ.get("G4VRMLFILE_VIEWER")
117
118if vrmlViewer is not None:
119  gApplyUICommand("/vis/viewer/create VRML vrmlviewer")
120  gApplyUICommand("/vis/drawVolume")
121
122
123# test############################################################################TESSSSSSST
124gApplyUICommand("/vis/viewer/select oglsxviewer")
125gApplyUICommand("/vis/scene/add/trajectories")
126
127gApplyUICommand("/tracking/storeTrajectory 1")
128gApplyUICommand("/vis/scene/endOfEventAction accumulate")
129gApplyUICommand("/vis/scene/endOfRunAction accumulate")
130#test########################################################################################
131
132global commandDic, commandList
133commandDic = {}
134commandList = []
135
136def 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
157root_tree= gUImanager.GetTree()
158DumpTree(root_tree)
159
160
161
162
163######  wxPython GUI ##########
164
165
166import wx
167
168
169
170class 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
205class 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
299class 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
316class 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
332class 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
377class 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
402class 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
423class 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
435g4pipe=0
436
437class 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       
598app = wx.PySimpleApp(False)
599MyApp().Show()
600app.MainLoop()
Note: See TracBrowser for help on using the repository browser.