Source code for toor.Corrections.PET.EnergyCorrection.KleinNishina

# import matplotlib.pyplot as plt
# import numpy as np
#
#
# class KleinNishina:
#     def __init__(self, incident_energy):
#         self.incident_energy = incident_energy
#         self.r0 = 2.8179e-15  # classical electron radius in meters
#
#     def cross_section(self, scattered_energy, theta):
#         e1 = self.incident_energy
#         e2 = scattered_energy
#         term1 = (self.r0**2) / (4 * np.pi)
#         term2 = (e2**2 / e1**2) * (1 + np.cos(theta)**2)
#         term3 = (2 * e1 * e2) / (e1**2) + np.sin(theta)**2
#         return term1 * (term2 - term3)
#
# incident_energy = 511*1.60218e-16 # incident photon energy = 6.4e-14 J
# scattered_energies = [3.2e-14, 4.0e-14, 4.8e-14] # scattered photon energies in Joules
#
# kn = KleinNishina(incident_energy)
# theta = np.linspace(0, 2*np.pi, 360)
# colors = ['red','green','blue']
#
# ax = plt.subplot(111, polar=True)
# for i in range(len(scattered_energies)):
#     cross_section = kn.cross_section(scattered_energies[i], theta)
#     ax.plot(theta, cross_section, label=f'Scattered energy = {scattered_energies[i]:.2e} J', color=colors[i])
#
# ax.legend()
# plt.title('Klein-Nishina Differential Cross Section')
# plt.show()

import math
[docs] class KleinNishina: def __init__(self, incident_energy_keV): self.incident_energy = incident_energy_keV * 1e3 # convert keV to J
[docs] def scattering_angle(self, scattered_energy_keV): e1 = self.incident_energy e2 = scattered_energy_keV * 1e3 # convert keV to J return math.acos(1 - (e1/e2))
incident_energy = 6.4 # incident photon energy = 6.4 keV scattered_energies = [3.2, 4.0, 4.8] # scattered photon energies in keV kn = KleinNishina(incident_energy) for i in range(len(scattered_energies)): angle = kn.scattering_angle(scattered_energies[i]) print(f'Scattering angle for scattered energy of {scattered_energies[i]} keV {angle}') # kn = KleinNishina(incident_energy) # theta = np.linspace(0, 2*np.pi, 360) # colors = ['red','green','blue'] # # ax = plt.subplot(111, polar=True) # for i in range(len(scattered_energies)): # cross_section = kn.cross_section(scattered_energies[i], theta) # ax.plot(theta, cross_section, label=f'Scattered energy = {scattered_energies[i]:.2e} J', color=colors[i])