297 lines
10 KiB
Python
297 lines
10 KiB
Python
#!/usr/bin/python
|
|
# ==================================================================
|
|
# python script for "measurement" of mass attenuation coefficient
|
|
#
|
|
#
|
|
# - using site-module packages
|
|
# ==================================================================
|
|
from Geant4 import *
|
|
import NISTmaterials
|
|
from EZsim import EZgeom
|
|
from EZsim.EZgeom import G4EzVolume
|
|
import EMSTDpl
|
|
import ParticleGun
|
|
from time import *
|
|
import sys
|
|
|
|
# ==================================================================
|
|
# intialize
|
|
# ==================================================================
|
|
def Configure():
|
|
# ------------------------------------------------------------------
|
|
# setup for materials
|
|
# ------------------------------------------------------------------
|
|
# simple materials for Qgeom
|
|
NISTmaterials.Construct()
|
|
|
|
# ------------------------------------------------------------------
|
|
# setup for geometry
|
|
# ------------------------------------------------------------------
|
|
#Qgeom.Construct()
|
|
EZgeom.Construct() # initialize
|
|
|
|
# ------------------------------------------------------------------
|
|
# setup for physics list
|
|
# ------------------------------------------------------------------
|
|
EMSTDpl.Construct()
|
|
|
|
# ------------------------------------------------------------------
|
|
# setup for primary generator action
|
|
# ------------------------------------------------------------------
|
|
ParticleGun.Construct()
|
|
gControlExecute("gun.mac")
|
|
|
|
# ==================================================================
|
|
# constructing geometry
|
|
# ==================================================================
|
|
def ConstructGeom():
|
|
print "* Constructing geometry..."
|
|
# reset world material
|
|
global absorber
|
|
air= G4Material.GetMaterial("G4_AIR", 1)
|
|
galactic = G4Material.GetMaterial("G4_Galactic", 1)
|
|
absorber = {} # material's dictionary to be used by a radiobutton
|
|
aluminum = G4Material.GetMaterial("G4_Al", 1)
|
|
iron = G4Material.GetMaterial("G4_Fe", 1)
|
|
silver = G4Material.GetMaterial("G4_Ag", 1)
|
|
gold = G4Material.GetMaterial("G4_Au", 1)
|
|
lead = G4Material.GetMaterial("G4_Pb", 1)
|
|
water = G4Material.GetMaterial("G4_WATER", 1)
|
|
absorber = {"air":air, "aluminum":aluminum, "iron":iron, "lead":lead, "water":water, "gold":gold}
|
|
EZgeom.SetWorldMaterial(galactic)
|
|
EZgeom.ResizeWorld(120.*cm, 120.*cm, 100.*cm)
|
|
# water phantom
|
|
global water_phantom, water_phantom_pv
|
|
|
|
water_phantom= G4EzVolume("WaterPhantom")
|
|
water_phantom.CreateBoxVolume(water, 110.*cm, 110.*cm, 10.*cm)
|
|
|
|
water_phantom_pv = water_phantom.PlaceIt(G4ThreeVector(0.,0.,0.*cm))
|
|
|
|
# ==================================================================
|
|
# main
|
|
# ==================================================================
|
|
# ------------------------------------------------------------------
|
|
# randum number
|
|
# ------------------------------------------------------------------
|
|
print "Random numbers..."
|
|
rand_engine= Ranlux64Engine()
|
|
HepRandom.setTheEngine(rand_engine)
|
|
HepRandom.setTheSeed(20050830L)
|
|
|
|
# setup...
|
|
|
|
Configure()
|
|
ConstructGeom()
|
|
|
|
|
|
# ------------------------------------------------------------------
|
|
# go...
|
|
# ------------------------------------------------------------------
|
|
gRunManager.Initialize()
|
|
|
|
# visualization not here but after "Start a run" button
|
|
gControlExecute("oglx.mac")
|
|
#gControlExecute("vrml.mac")
|
|
|
|
# creating widgets using grid layout
|
|
|
|
from Tkinter import *
|
|
|
|
class App(Frame):
|
|
|
|
|
|
|
|
def init(self):
|
|
|
|
#title and header row=0, 1
|
|
title = Label(self, text="Geant4Py for Education @ H. Yoshida Naruto Univ. of Education")
|
|
title.grid(row=0, column=1, columnspan=5)
|
|
header = Label(self, text="Measurement of Mass Attenuation Coefficient")
|
|
header.grid(row=1, column=1, columnspan=5)
|
|
|
|
#material selection row=2
|
|
materialLabel = Label(self, bg="green", text="Material")
|
|
materialLabel.grid(row=2, column=0, sticky=W)
|
|
self.materialVar = StringVar()
|
|
self.materialVar.set("water")
|
|
ra1 = { }
|
|
pos=1
|
|
for i in absorber.keys():
|
|
ra1[i] = Radiobutton(self, text=i, variable=self.materialVar, value=i)
|
|
ra1[i].grid(row=2, column=pos, sticky=W)
|
|
pos=pos+1
|
|
|
|
#absorber thickness row=3
|
|
thickLabel = Label(self, bg="green", text="Thickness (mm)")
|
|
self.thickVar = DoubleVar()
|
|
self.thickVar.set(100.0)
|
|
thick = Scale(self, orient=HORIZONTAL, length=400, from_=0., to=100., resolution=0.05, tickinterval=10.0, digits=4, variable=self.thickVar)
|
|
thickLabel.grid(row=3, column=0, sticky=W)
|
|
thick.grid(row=3, column=1, columnspan=5, sticky=W)
|
|
|
|
#get logical volume and set its half length
|
|
self.solid = EZgeom.G4EzVolume.GetSold(water_phantom)
|
|
|
|
#particle row=4
|
|
particleLabel = Label(self, bg="green", text="Particle")
|
|
particleLabel.grid(row=4, column=0, sticky=W)
|
|
self.particleVar = StringVar()
|
|
self.particleVar.set("gamma")
|
|
ra1 = { }
|
|
pos1=1
|
|
for i in ("gamma", "e-"):
|
|
ra1[i] = Radiobutton(self, text=i, variable=self.particleVar, value=i)
|
|
ra1[i].grid(row=4, column=pos1, sticky=W)
|
|
pos1=pos1+1
|
|
|
|
#energy row=5
|
|
energyLabel = Label(self, bg="green", text="Energy (MeV)")
|
|
|
|
self.energyVar=StringVar()
|
|
self.energyVar.set(1)
|
|
energy = Scale(self, orient=HORIZONTAL, length=400, from_=0., to=100., tickinterval=10.0, resolution=0.1, variable=self.energyVar, digits=4 )
|
|
energyLabel.grid(row=5, column=0, sticky=W)
|
|
energy.grid(row=5, column=1, columnspan=5, sticky=W)
|
|
|
|
#number of event row=6
|
|
eventLabel = Label(self, bg="green", text="Events")
|
|
self.eventVar=IntVar()
|
|
event = Scale(self, orient=HORIZONTAL, length=400, from_=1, to=100, tickinterval=10, resolution=1, variable=self.eventVar )
|
|
eventLabel.grid(row=6, column=0, sticky=W)
|
|
event.grid(row=6, column=1, columnspan=5, sticky=W)
|
|
|
|
#start a run button row=7
|
|
startBut = Button(self, bg="orange", text="Start a run", command=self.cmd_beamOn)
|
|
startBut.grid(row=0, column=0, sticky=W)
|
|
|
|
#Zoom in/out Pan X Y row=8
|
|
visLabel = Label(self, text="viewer", bg="orange")
|
|
expandBut = Button(self, text="Zoom in", command=self.cmd_expand)
|
|
shrinkBut = Button(self, text="Zoom out", command=self.cmd_shrink)
|
|
visLabel.grid(row=8, column=0, sticky=W)
|
|
expandBut.grid(row=8, column=1, sticky=W)
|
|
shrinkBut.grid(row=8, column=2, sticky=W)
|
|
|
|
upBut = Button(self, text="Up", command=self.cmd_up)
|
|
downBut = Button(self, text="Down", command=self.cmd_down)
|
|
upBut.grid(row=8, column=3, sticky=W)
|
|
downBut.grid(row=8, column=4, sticky=W)
|
|
|
|
leftBut = Button(self, text="Left", command=self.cmd_left)
|
|
rightBut = Button(self, text="Right", command=self.cmd_right)
|
|
leftBut.grid(row=8, column=5, sticky=W)
|
|
rightBut.grid(row=8, column=6, sticky=W)
|
|
# later
|
|
# resetBut = Button(self, text="Reset", command=self.cmd_reset)
|
|
# resetBut.grid(row=8, column=7, sticky=W)
|
|
|
|
|
|
# panLabel = Label(self, text="Pan X Y (mm)")
|
|
# self.panXYVar = StringVar()
|
|
# panXYEnt = Entry(self, textvariable=self.panXYVar)
|
|
# panBut = Button(self, bg="orange", text="OK", command=self.cmd_pan)
|
|
# panLabel.grid(row=8, column=3, sticky=W)
|
|
# panXYEnt.grid(row=8, column=4)
|
|
# panBut.grid(row=8, column=5)
|
|
#Geant4 command entry row = 9
|
|
# g4comLabel = Label(self, text="Geant4 command")
|
|
# self.g4commandVar = StringVar()
|
|
# commandEntry = Entry(self, textvariable=self.g4commandVar)
|
|
# comBut = Button(self, bg="orange", text="Execute", command=self.cmd_g4command)
|
|
# g4comLabel.grid(row=9, column=0, sticky=W)
|
|
# commandEntry.grid(row=9, column=1, columnspan=4, sticky=E+W)
|
|
# comBut.grid(row=9, column=5)
|
|
|
|
#exit row = 10
|
|
exitBut = Button(self, bg="red", text="End all", command=sys.exit)
|
|
exitBut.grid(row=0, column=6, sticky=W)
|
|
|
|
#on Run butto do...
|
|
def cmd_beamOn(self):
|
|
materialChosen = self.materialVar.get()
|
|
water_phantom.SetMaterial(absorber[materialChosen])
|
|
|
|
if materialChosen == "water":
|
|
water_phantom.SetColor(0., 0.9, 1.0)
|
|
|
|
if materialChosen == "air":
|
|
water_phantom.SetColor(0.9, 0.9, 1.0)
|
|
|
|
if materialChosen == "lead":
|
|
water_phantom.SetColor(0.2, 0.2, 0.2)
|
|
|
|
if materialChosen == "iron":
|
|
water_phantom.SetColor(0.7, 0.5, 0.7)
|
|
|
|
if materialChosen == "aluminum":
|
|
water_phantom.SetColor(.7, 0.9, 1.0)
|
|
|
|
if materialChosen == "gold":
|
|
water_phantom.SetColor(1., 0.9, .0)
|
|
|
|
self.solid.SetZHalfLength(self.thickVar.get() * mm/2.0)
|
|
# gControlExecute("oglx.mac") #draw for each run
|
|
gApplyUICommand("/vis/viewer/flush")
|
|
|
|
self.cmd_particle(self.particleVar.get())
|
|
self.cmd_energy(self.energyVar.get())
|
|
# TODO later to reflesh text
|
|
gApplyUICommand("/vis/scene/add/text 0 610 610 mm 20 0 0 " + " ")
|
|
gApplyUICommand("/vis/scene/add/text 0 610 610 mm 20 0 0 " + self.materialVar.get() + " = " + str(self.thickVar.get()) + "mm " + self.particleVar.get() + " = "+self.energyVar.get() + "MeV")
|
|
|
|
eventNum = self.eventVar.get()
|
|
for i in range(eventNum):
|
|
gunYZpos = str(i-eventNum/2) + ". -20. cm"
|
|
gApplyUICommand("/gun/position 0. " + gunYZpos)
|
|
gRunManager.BeamOn(1)
|
|
sleep(0.01)
|
|
# self.cmd_expand() #Zoom in to the last diaplayed OGLSX
|
|
# self.cmd_shrink()
|
|
|
|
|
|
|
|
def cmd_g4command(self):
|
|
gApplyUICommand(self.g4commandVar.get())
|
|
|
|
def cmd_particle(self, particle):
|
|
gApplyUICommand("/gun/particle " + particle)
|
|
|
|
|
|
def cmd_energy(self, penergy):
|
|
gApplyUICommand("/gun/energy " + penergy + " MeV")
|
|
|
|
|
|
def cmd_expand(self):
|
|
gApplyUICommand("/vis/viewer/zoom 1.2")
|
|
|
|
def cmd_up(self):
|
|
gApplyUICommand("/vis/viewer/pan " + " 0. 10. mm")
|
|
|
|
def cmd_down(self):
|
|
gApplyUICommand("/vis/viewer/pan " + " 0. -10. mm")
|
|
|
|
def cmd_right(self):
|
|
gApplyUICommand("/vis/viewer/pan " + " -1. 0. mm")
|
|
|
|
def cmd_left(self):
|
|
gApplyUICommand("/vis/viewer/pan " + " 1. 0. mm")
|
|
|
|
|
|
def cmd_shrink(self):
|
|
gApplyUICommand("/vis/viewer/zoom 0.8")
|
|
|
|
|
|
# def cmd_reset(self):
|
|
# gApplyUICommand("/vis/viewer/pan " + " 0. 0. mm")
|
|
|
|
|
|
def __init__(self, master=None):
|
|
Frame.__init__(self, master)
|
|
self.init()
|
|
self.grid()
|
|
|
|
|
|
app = App()
|
|
app.mainloop()
|