Geant4_10
mcscore.py
Go to the documentation of this file.
1 """
2 Python module
3 
4 This module provides classes and functions for scoring reactions
5 
6  [C] MCVertex:
7  [C] MCParticle:
8  [f] read_next_vertex(stream):
9 
10  Q, 2006
11 """
12 import string
13 from Geant4.hepunit import *
14 
15 # ==================================================================
16 # public symbols
17 # ==================================================================
18 __all__ = [ 'MCParticle', 'MCVertex', 'read_next_vertex' ]
19 
20 
21 # ==================================================================
22 # class definition
23 # ==================================================================
24 
25 # ------------------------------------------------------------------
26 # MCParticle
27 # ------------------------------------------------------------------
28 class MCParticle:
29  "MC particle"
30  def __init__(self, aname, aZ, aA, akE, apx, apy, apz):
31  self.name = aname
32  self.Z = aZ
33  self.A = aA
34  self.kineticE = akE
35  self.px = apx
36  self.py = apy
37  self.pz = apz
38 
39  def printout(self):
40  print "--- particle: %s, Z=%2d, A=%2d, kE=%g" % \
41  (self.name, self.Z, self.A, self.kineticE/MeV)
42 
43 # ------------------------------------------------------------------
44 # MCVertex
45 # ------------------------------------------------------------------
46 class MCVertex :
47  "MC vertex"
48  def __init__(self, ax, ay, az):
49  self.x = ax
50  self.y = ay
51  self.z = az
52  self.nparticle = 0
53  self.particle_list = []
54 
55  def append_particle(self, aparticle):
56  self.particle_list.append(aparticle)
57  self.nparticle= self.nparticle+1
58 
59  def printout(self):
60  print "@@@ vertex: x=(%g,%g,%g) Nsec=%3d" % \
61  (self.x/cm, self.y/cm, self.z/cm, self.nparticle)
62  for p in self.particle_list:
63  p.printout()
64 
65  def dump_vertex(self, stream):
66  aline = "%g %g %g %d\n" % \
67  (self.x/m, self.y/m, self.z/m, self.nparticle)
68  stream.write(aline)
69  for p in self.particle_list:
70  aline = " %s %d %d %g %g %g %g\n" % \
71  (p.name, p.Z, p.A, p.kineticE/MeV, p.px/MeV, p.py/MeV, p.pz/MeV)
72  stream.write(aline)
73 
74  def __del__(self):
75  np = len(self.particle_list)
76  del self.particle_list[0:np]
77 
78 
79 # ==================================================================
80 # I/O interface
81 # ==================================================================
82 def read_next_vertex(stream):
83  "read next vertex from a file stream"
84  line= stream.readline()
85  if line == "": # EOF
86  return 0
87 
88  # reading vertex
89  data = line.split()
90  x = string.atof(data[0]) * m
91  y = string.atof(data[1]) * m
92  z = string.atof(data[2]) * m
93  nsec = string.atoi(data[3])
94 
95  vertex = MCVertex(x,y,z)
96 
97  # reading particles
98  for p in range(0, nsec):
99  data = stream.readline().split()
100  pname = data[0]
101  Z = string.atoi(data[1])
102  A = string.atoi(data[2])
103  kE = string.atof(data[3]) * MeV
104  px = string.atof(data[4]) * MeV
105  py = string.atof(data[5]) * MeV
106  pz = string.atof(data[6]) * MeV
107 
108  particle = MCParticle(pname, Z, A, kE, px, py, pz)
109  vertex.append_particle(particle)
110 
111  return vertex
112 
113 
114 # ==================================================================
115 # test
116 # ==================================================================
117 def test():
118  f = open("reaction.dat")
119  f.seek(0)
120 
121  while(1):
122  vertex = read_next_vertex(f)
123  if vertex == 0:
124  break
125  vertex.printout()
126  del vertex
127  f.close()
128  print ">>> EOF"
129 
130 
131 # ==================================================================
132 # main
133 # ==================================================================
134 if __name__ == "__main__":
135  test()
136 
Definition: test.py:1
const G4ParticleDefinition const G4Material *G4double range
def append_particle
Definition: mcscore.py:55
while(in.good())
in open(doseFileSim)
def read_next_vertex
Definition: mcscore.py:82
def test
Definition: mcscore.py:117