# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
class Electron():
def __init__(self, source, **kwargs):
self.mass = 9.109383E-31 # the electron mass in kg
self.J_eV = 1.602176E-19 # conversion of eV to Joules. has units J/eV
self.vector = np.zeros((9))
self.pathlength = 0 # This stores to total length the electron has
# travelled
self.source = source
#self.kinetic_energy = self.source.getKE()
self.theta = self.source.theta
self.phi = self.source.phi
self.initCoords()
self.initVelocity()
def _convertKinEnToSpeed(self, kinetic_energy: float) -> float:
speed = 1E+9 * np.sqrt(2 * kinetic_energy *
self.J_eV / self.mass)
return speed
def initCoords(self, *args):
self.vector[0:3] = self.source.getRandPosition()
#self.vector[0:3] = self.source.getSlicePosition(*args)
def initVelocity(self):
KE = self.source.getKE()
self.kinetic_energy = KE
initial_speed = self._convertKinEnToSpeed(KE)
theta = self.theta.getAngle()
phi = self.phi.getAngle()
vx = initial_speed * np.sin(theta) * np.cos(phi)
vy = initial_speed * np.sin(theta) * np.sin(phi)
vz = initial_speed * np.cos(theta)
self.vector[3:6] = np.array([vx,vy,vz])
def updateKineticEnergy(self, delta_KE):
new_KE = self.kineticEnergy() - delta_KE
if new_KE < 0:
self.kinetic_energy = 0
else:
self.kinetic_energy = new_KE
self.changeSpeed()
def changeSpeed(self):
old_v = self.vector[3:6]
speed = 1E+9 * np.sqrt(2 * self.kinetic_energy *
self.J_eV / self.mass)
new_v = (old_v / np.sqrt(old_v[0]**2 + old_v[1]**2 + old_v[2]**2)
* speed)
self.vector[3:6] = new_v
def kineticEnergy(self) -> float:
speed = np.linalg.norm(self.vector[3:6]) / 1E+9
KE = (1/2 * self.mass * speed**2) / self.J_eV
return KE
if __name__ == '__main__':
source = Disc(100,1)
vals = []
e = Electron(source)
for i in range(2000):
e.initVelocity()
vals+=[list(e.vector)]
vals = np.array(vals)
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(111, projection='3d')
xs = vals[:,3]
ys = vals[:,4]
zs = vals[:,5]
ax.scatter(xs, ys, zs, s=20, marker = '.')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')
ax.view_init(10, 45)
plt.show()
if __name__ == '__main__':
source = Disc(100,1)
e = Electron(source)
e.initVelocity()
v1 = e.kineticEnergy()
e.changeSpeed(10)
v2 = e.kineticEnergy()