source: trunk/environments/g4py/examples/education/lesson2/ExN03.py @ 1337

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

tag geant4.9.4 beta 1 + modifs locales

  • Property svn:executable set to *
File size: 15.0 KB
Line 
1#!/usr/bin/python
2# ==================================================================
3# python script for Geant4Py
4#
5#   ExN03 : geant4/examples/novice/N03
6#        using site-module packages
7# ==================================================================
8from Geant4 import *
9import g4py.Qmaterials, g4py.NISTmaterials
10import g4py.ExN03geom
11import g4py.ExN03pl
12import g4py.ParticleGun, g4py.MedicalBeam
13import sys
14from time import *
15from subprocess import *
16import os
17
18# ==================================================================
19# main
20# ==================================================================
21# ------------------------------------------------------------------
22# randum number
23# ------------------------------------------------------------------
24rand_engine= Ranlux64Engine()
25HepRandom.setTheEngine(rand_engine)
26HepRandom.setTheSeed(20050830L)
27
28# ------------------------------------------------------------------
29# setup for materials
30# ------------------------------------------------------------------
31
32# NIST materials
33#g4py.NISTmaterials.Construct()
34
35# ------------------------------------------------------------------
36# setup for geometry
37# ------------------------------------------------------------------
38# normal way for constructing user geometry
39
40
41exN03geom= g4py.ExN03geom.ExN03DetectorConstruction()
42gRunManager.SetUserInitialization(exN03geom)
43
44# 2nd way, short-cut way
45
46#g4py.ExN01geom.Construct()
47#g4py.ExN03geom.Construct()
48
49# magnetic field
50#exN03geom.SetMagField(0.1 * tesla)
51
52# ------------------------------------------------------------------
53# setup for physics list
54# ------------------------------------------------------------------
55# normal way for constructing user physics list
56exN03PL= g4py.ExN03pl.ExN03PhysicsList()
57gRunManager.SetUserInitialization(exN03PL)
58
59# 2nd way, short-cut way
60#g4py.ExN01pl.Construct()
61#g4py.EMSTDpl.Construct()
62
63# ------------------------------------------------------------------
64# setup for primary generator action
65# ------------------------------------------------------------------
66# normal way for constructing user physics list
67#pgPGA= g4py.ParticleGun.ParticleGunAction()
68#gRunManager.SetUserAction(pgPGA)
69#pg= pgPGA.GetParticleGun()
70
71# 2nd way, short-cut way
72pg= g4py.ParticleGun.Construct()
73
74# set parameters of particle gun
75pg.SetParticleByName("e-")
76pg.SetParticleEnergy(50.*MeV)
77pg.SetParticlePosition(G4ThreeVector(-40.,0.,0.)*cm)
78pg.SetParticleMomentumDirection(G4ThreeVector(1.,0.,0.))
79
80# medical beam
81#beam= MedicalBeam.Construct()
82
83# ------------------------------------------------------------------
84# go...
85# ------------------------------------------------------------------
86gRunManager.Initialize()
87
88# beamOn
89#gRunManager.BeamOn(3)
90
91
92#TEST
93#gProcessTable.SetProcessActivation("msc", 0)
94#gProcessTable.SetProcessActivation("conv", 0)
95#gProcessTable.SetProcessActivation("eBrem", 0)
96#gProcessTable.SetProcessActivation("eIoni", 0)
97#gProcessTable.SetProcessActivation("annihil", 0)
98
99
100# visualization
101# OGLSX, VRML and HEPREP sceneHandlers are all created with names
102gApplyUICommand("/vis/sceneHandler/create OGLSX OGLSX")
103gApplyUICommand("/vis/sceneHandler/create VRML2FILE VRML")
104gApplyUICommand("/vis/sceneHandler/create HepRepFile HEPREP")
105
106#  OGLSX is the default so, viewer is created and volume is drawn
107gApplyUICommand("/vis/viewer/create OGLSX oglsxviewer")
108gApplyUICommand("/vis/drawVolume")
109gApplyUICommand("/vis/scene/add/trajectories")
110
111gApplyUICommand("/tracking/storeTrajectory 1")
112gApplyUICommand("/vis/scene/endOfEventAction accumulate")
113gApplyUICommand("/vis/scene/endOfRunAction accumulate")
114gApplyUICommand("/vis/viewer/select  oglsxviewer")
115
116# viewers VRML and Wired are tested by their envs vars
117# if their envs var are set, then viewers are created and drawVolume
118
119global heprepViewer, heprepDir, heprepName
120heprepViewer = os.environ.get("G4HEPREPFILE_VIEWER")
121heprepDir = os.environ.get("G4HEPREPFILE_DIR")
122heprepName = os.environ.get("G4HEPREPFILE_NAME")
123if heprepViewer is not None:
124  gApplyUICommand("/vis/viewer/create HEPREP wired")
125  gApplyUICommand("/vis/drawVolume")
126
127# VRML viewers name is user defined
128vrmlDir = os.environ.get("G4VRML_DEST_DIR")
129vrmlViewer = os.environ.get("G4VRMLFILE_VIEWER")
130
131if vrmlViewer is not None:
132  gApplyUICommand("/vis/viewer/create VRML vrmlviewer")
133  gApplyUICommand("/vis/drawVolume")
134
135
136
137# creating widgets using grid layout
138
139from Tkinter import *
140
141class App(Frame):
142
143  g4pipe = 0
144 
145  def init(self):
146
147#title and header    row=0, 1
148    title = Label(self, text="exampleN03")
149    title.grid(row=0, column=1, columnspan=3)
150    header = Label(self, text="empowered by \n Geant4Py")
151    header.grid(row=1, column=1, columnspan=3)
152# number of layers
153    layerLabel = Label(self, bg="green",  text="No of layers")
154    self.layerVar=IntVar()
155    self.layerVar.set(10)
156    layer = Scale(self,  orient=HORIZONTAL, length=400, from_=0, to=10, tickinterval=1, resolution=1, variable=self.layerVar )
157    layerLabel.grid(row=2, column=0, sticky=W)
158    layer.grid(row=2, column=1, columnspan=5, sticky=W)
159
160#absorber material selection row=3
161    absorbermaterialLabel = Label(self, bg="green", text="Absorber Material")
162    absorbermaterialLabel.grid(row=3, column=0, sticky=W)
163    self.absorbermaterialVar = StringVar()
164    self.absorbermaterialVar.set("Lead")
165    ra1 = { }
166    pos=1
167    for i in ("Aluminium", "Lead"):
168      ra1[i] = Radiobutton(self, text=i, variable=self.absorbermaterialVar, value=i)
169      ra1[i].grid(row=3, column=pos, sticky=W)
170      pos=pos+1
171
172#absorber thickness row=4
173    absorberthickLabel = Label(self, bg="green", text="Thickness (mm)")
174    self.absorberthickVar = DoubleVar()
175    self.absorberthickVar.set(10.0)
176    absorberthick = Scale(self, orient=HORIZONTAL, length=400, from_=0., to=100., resolution=0.05, tickinterval=10.0, digits=4, variable=self.absorberthickVar)
177    absorberthickLabel.grid(row=4, column=0, sticky=W)
178    absorberthick.grid(row=4, column=1, columnspan=5, sticky=W)
179
180
181#gap material selection row=5
182    gapmaterialLabel = Label(self, bg="green", text="Gap Material")
183    gapmaterialLabel.grid(row=5, column=0, sticky=W)
184    self.gapmaterialVar = StringVar()
185    self.gapmaterialVar.set("liquidArgon")
186    ra2 = { }
187    pos=1
188    for i in ("liquidArgon","Scintillator", "Air", "Aerogel",  "Galactic" ):
189      ra2[i] = Radiobutton(self, text=i, variable=self.gapmaterialVar, value=i)
190      ra2[i].grid(row=5, column=pos, sticky=W)
191      pos=pos+1
192
193#gap thickness row=6
194    gapthickLabel = Label(self, bg="green", text="Thickness (mm)")
195    self.gapthickVar = DoubleVar()
196    self.gapthickVar.set(5.0)
197    gapthick = Scale(self, orient=HORIZONTAL, length=400, from_=0., to=100., resolution=0.05, tickinterval=10.0, digits=4, variable=self.gapthickVar)
198    gapthickLabel.grid(row=6, column=0, sticky=W)
199    gapthick.grid(row=6, column=1, columnspan=5, sticky=W)
200
201#calorSizeYZ row=7
202    calorsizeYZLabel = Label(self, bg="green", text="SizeYZ (mm)")
203    self.calorsizeYZVar = DoubleVar()
204    self.calorsizeYZVar.set(100.0)
205    calorsizeYZ = Scale(self, orient=HORIZONTAL, length=400, from_=0., to=200., resolution=0.05, tickinterval=20.0, digits=4, variable=self.calorsizeYZVar)
206    calorsizeYZLabel.grid(row=7, column=0, sticky=W)
207    calorsizeYZ.grid(row=7, column=1, columnspan=5, sticky=W)
208
209
210#particle row=8
211    particleLabel = Label(self, bg="green",  text="Particle")
212    particleLabel.grid(row=8, column=0, sticky=W)
213    self.particleVar = StringVar()
214    self.particleVar.set("e-")
215    ra1 = { }
216    pos1=1
217    for i in ("proton", "gamma", "e-",  "e+", "mu-", "mu+"):
218      ra1[i] = Radiobutton(self, text=i, variable=self.particleVar, value=i)
219      ra1[i].grid(row=8, column=pos1, sticky=W)
220      pos1=pos1+1
221
222#energy row=9
223    energyLabel = Label(self, bg="green",  text="Energy (MeV)")
224
225    self.energyVar=StringVar()
226    self.energyVar.set(50)
227    energy = Scale(self, orient=HORIZONTAL, length=400, from_=0., to=1000., tickinterval=100.0, resolution=0.1, variable=self.energyVar, digits=5 )
228    energyLabel.grid(row=9, column=0, sticky=W)
229    energy.grid(row=9, column=1, columnspan=5, sticky=W)
230
231#number of event row=10
232    eventLabel = Label(self, bg="green",  text="Events")
233    self.eventVar=IntVar()
234    self.eventVar.set(3)
235    event = Scale(self,  orient=HORIZONTAL, length=400, from_=0, to=100, tickinterval=10, resolution=1, variable=self.eventVar )
236    eventLabel.grid(row=10, column=0, sticky=W)
237    event.grid(row=10, column=1, columnspan=5, sticky=W)
238
239#start a run button row=0
240    startBut = Button(self, bg="orange", text="Start a run", command=self.cmd_beamOn)
241    startBut.grid(row=0, column=0, sticky=W)
242
243#Zoom in/out Pan X Y row=13
244#    visLabel = Label(self, text="viewer", bg="orange")
245#    expandBut = Button(self, text="Zoom in", command=self.cmd_expand)
246#    shrinkBut = Button(self, text="Zoom out", command=self.cmd_shrink)
247#    visLabel.grid(row=13, column=0, sticky=W)
248#    expandBut.grid(row=13, column=1, sticky=W)
249#    shrinkBut.grid(row=13, column=2, sticky=W)
250#    panLabel = Label(self, text="Pan X Y(mm)")
251#    self.panXYVar = StringVar()
252#    panXYEnt = Entry(self, textvariable=self.panXYVar, width=6)
253#    panBut = Button(self, bg="orange", text="OK", command=self.cmd_pan)
254#    panLabel.grid(row=13, column=3, sticky=W)
255#    panXYEnt.grid(row=13, column=4)
256#    panBut.grid(row=13, column=5)
257
258# process activate row 11 - 13
259    processLabel=Label(self, text="Process on/off", bg="green")
260    processLabel.grid(row=11, column=0, sticky=W)
261    procTab = {}
262   
263    self.processList = ["phot", "compt", "conv", "msc", "eIoni", "eBrem", "annihil","muIoni", "muBrems", "hIoni"]
264    pos=1
265    self.processVar = {}
266    for i in self.processList:
267      self.processVar[i] = IntVar()
268      procTab[i] = Checkbutton(self, text=i, variable=self.processVar[i], command=self.cmd_setProcess)
269      if pos <= 3:
270        procTab[i].grid(row=11, column=pos, sticky=W)
271      if 4<= pos <= 7:
272        procTab[i].grid(row=12, column=pos-3, sticky=W)
273      if pos >= 8:
274        procTab[i].grid(row=13, column=pos-7, sticky=W)
275      pos=pos+1
276      procTab[i].select()
277# set cuts row 14
278    cutLabel = Label(self, bg="green",  text="Cut (mm)")
279
280    self.cutVar=DoubleVar()
281    self.cutVar.set(1.)
282    cut = Scale(self, orient=HORIZONTAL, length=400, from_=0., to=10., tickinterval=1., resolution=0.005, variable=self.cutVar, digits=5 )
283    cutLabel.grid(row=14, column=0, sticky=W)
284    cut.grid(row=14, column=1, columnspan=5, sticky=W)
285
286# set mag field row 15
287    magLabel = Label(self, bg="green",  text="Magnetic (T)")
288
289    self.magVar=DoubleVar()
290    self.magVar.set(0.)
291    mag = Scale(self, orient=HORIZONTAL, length=400, from_=0., to=5., tickinterval=1., resolution=0.1, variable=self.magVar, digits=3 )
292    magLabel.grid(row=15, column=0, sticky=W)
293    mag.grid(row=15, column=1, columnspan=5, sticky=W)
294
295
296# viewer selection row=16
297    viewerLabel = Label(self, bg="green", text="Viewer")
298    viewerLabel.grid(row=16, column=0, sticky=W)
299    self.viewerVar = StringVar()
300    self.viewerVar.set("")
301    stateOfViewer = {"OpenGL":"normal", "VRML":"normal", "Wired":"normal"}
302    if vrmlViewer is None: stateOfViewer["VRML"] = "disabled"
303    if heprepViewer is None: stateOfViewer["Wired"] = "disabled"
304    viewers = { }
305    pos=1
306    for i in ("OpenGL", "VRML", "Wired"):
307      viewers[i] = Radiobutton(self, text=i, variable=self.viewerVar, value=i, command=self.cmd_viewer, state=stateOfViewer[i])
308      viewers[i].grid(row=16, column=pos, sticky=W)
309      pos=pos+1
310
311
312#Geant4 command entry row = 17
313    g4comLabel = Label(self, text="Geant4 command", bg="orange")
314    self.g4commandVar = StringVar()
315    commandEntry = Entry(self, textvariable=self.g4commandVar, width=15)
316    self.g4commandVar.set("/vis/viewer/zoom 1.2")
317    comBut = Button(self, bg="orange", text="Execute", command=self.cmd_g4command)
318    g4comLabel.grid(row=17, column=0, sticky=W)
319    commandEntry.grid(row=17, column=1, columnspan=3, sticky=E+W)
320    comBut.grid(row=17, column=5)
321
322#exit row = 0   
323    exitBut = Button(self, bg="red", text="End all", command=sys.exit)
324    exitBut.grid(row=0, column=5, sticky=W)
325
326#on Run butto do...   
327  def cmd_beamOn(self):
328      exN03geom.SetNbOfLayers(self.layerVar.get())
329      exN03geom.SetAbsorberMaterial(self.absorbermaterialVar.get())
330      exN03geom.SetAbsorberThickness(self.absorberthickVar.get()  * mm/2.0)
331      exN03geom.SetGapMaterial(self.gapmaterialVar.get())
332      exN03geom.SetGapThickness(self.gapthickVar.get()  * mm/2.0)
333      exN03geom.SetCalorSizeYZ(self.calorsizeYZVar.get() * mm)
334      position = -self.layerVar.get()*(self.absorberthickVar.get() + self.gapthickVar.get())*1.2
335
336      exN03geom.UpdateGeometry()
337      exN03PL.SetDefaultCutValue(self.cutVar.get() * mm)
338      exN03PL.SetCutsWithDefault()
339      exN03geom.SetMagField(self.magVar.get() * tesla)
340
341      print "Now geometry updated"
342
343
344      self.cmd_particle(self.particleVar.get())
345      self.cmd_energy(self.energyVar.get())
346
347      print position
348
349      eventNum = self.eventVar.get()
350      for i in range(eventNum):
351
352        pg.SetParticlePosition(G4ThreeVector(position*mm, (i-eventNum/2)*5.*mm, 0.*cm))
353        gRunManager.BeamOn(1)
354        sleep(0.01)
355      gApplyUICommand("/vis/viewer/update")
356     
357  def cmd_setProcess(self):
358    for i in self.processList:
359      if self.processVar[i].get() == 0:
360         gProcessTable.SetProcessActivation(i, 0)
361         print "Process " + i + " inactivated"
362      else:
363         gProcessTable.SetProcessActivation(i, 1)
364         print "Process " + i + " activated"
365       
366  def cmd_g4command(self):
367    gApplyUICommand(self.g4commandVar.get())
368     
369  def cmd_particle(self, particle):
370    gApplyUICommand("/gun/particle " + particle)
371
372
373  def cmd_energy(self, penergy):
374    gApplyUICommand("/gun/energy " + penergy + " MeV")
375
376
377  def cmd_viewer(self):
378    if self.viewerVar.get() == "OpenGL":
379      gApplyUICommand("/vis/viewer/select oglsxviewer")
380      gApplyUICommand("/vis/scene/add/trajectories")
381
382      gApplyUICommand("/tracking/storeTrajectory 1")
383      gApplyUICommand("/vis/scene/endOfEventAction accumulate")
384      gApplyUICommand("/vis/scene/endOfRunAction accumulate")
385
386    if self.viewerVar.get() == "VRML":
387      gApplyUICommand("/vis/viewer/select vrmlviewer")
388      gApplyUICommand("/vis/scene/add/trajectories")
389
390      gApplyUICommand("/tracking/storeTrajectory 1")
391      gApplyUICommand("/vis/scene/endOfEventAction accumulate")
392      gApplyUICommand("/vis/scene/endOfRunAction accumulate")
393
394    if self.viewerVar.get() == "Wired":
395      gApplyUICommand("/vis/viewer/select wired")
396      gApplyUICommand("/vis/scene/add/trajectories")
397
398      gApplyUICommand("/tracking/storeTrajectory 1")
399      gApplyUICommand("/vis/scene/endOfEventAction accumulate")
400      gApplyUICommand("/vis/scene/endOfRunAction accumulate")
401
402      if self.g4pipe == 0:
403        Popen(heprepViewer +  " -file " + heprepDir + "/" + heprepName +".heprep", shell=True)
404        self.g4pipe = 1
405   
406
407  def cmd_expand(self):
408    gApplyUICommand("/vis/viewer/zoom 1.2")
409
410  def cmd_pan(self):
411    gApplyUICommand("/vis/viewer/pan " + self.panXYVar.get() + " "  + " mm")
412
413
414  def cmd_shrink(self):
415    gApplyUICommand("/vis/viewer/zoom 0.8")
416
417
418   
419  def __init__(self, master=None):
420    Frame.__init__(self, master)
421    self.init()
422    self.grid()
423
424   
425app = App()
426app.mainloop()
Note: See TracBrowser for help on using the repository browser.