Source code for toor.Corrections.PET.DOI.crystal_planes

import numpy as np


[docs] class CrystalPlanes: def __init__(self, parametric_coordinates_object=None, pixelSizeXY=None, pixelSizeXYZ=None): self.cent_p1 = parametric_coordinates_object.crystal_centerA self.arestA1 = parametric_coordinates_object.center_frontal_face_sideA self.arestA2 = parametric_coordinates_object.center_left_face_sideA self.arestA3 = parametric_coordinates_object.center_bottom_face_sideA self.cent_p2 = None self.arestB1 = None self.arestB2 = None self.arestB3 = None self.plane_centerA1 = None self.plane_centerB1 = None self.plane_centerC1 = None self.plane_centerA2 = None self.plane_centerB2 = None self.plane_centerC2 = None self.pixelXY = pixelSizeXY self.pixelXYZ = pixelSizeXYZ self.pixel_array = np.array([[pixelSizeXY], [pixelSizeXY], [pixelSizeXYZ]], dtype=np.float32) self.distance_planeA1crystral = None self.distance_planeB1crystral = None self.distance_planeC1crystral = None self.distance_planeA2crystral = None self.distance_planeB2crystral = None self.distance_planeC2crystral = None
[docs] def multiply_by_pixel_size(self): # for i in range(self.pixel_array): self.arestA1 = self.arestA1/self.pixel_array self.arestA2 = self.arestA2/self.pixel_array self.arestA3 = self.arestA3/self.pixel_array
# self.arestB1 = self.arestB1/self.pixel_array # self.arestB2 = self.arestB2/self.pixel_array # self.arestB3 = self.arestB3/self.pixel_array
[docs] def crystals_central_planes(self): [self.plane_centerA1,self.plane_centerB1, self.plane_centerC1] = \ self._calculation_central_crystal_planes(self.cent_p1, self.arestA1, self.arestA2, self.arestA3)
# [self.plane_centerA2,self.plane_centerB2, self.plane_centerC2] = \ # self._calculation_central_crystal_planes(self.cent_p2, self.arestA2, self.arestB2, self.arestC2) def _calculation_central_crystal_planes(self, cent_p1, point_1, point_2, point_3): cent_p1 = cent_p1.T point_1 = point_1.T point_2 = point_2.T point_3 = point_3.T v_c_1 = cent_p1 - point_1 v_c_2 = cent_p1 - point_2 v_c_3 = cent_p1 - point_3 v_c_1 = self.norm_vector(v_c_1) v_c_2 = self.norm_vector(v_c_2) v_c_3 = self.norm_vector(v_c_3) plane_centerA = self.plane_values(v_c_1, v_c_2, cent_p1) plane_centerB = self.plane_values(v_c_1, v_c_3, cent_p1) plane_centerC = self.plane_values(v_c_2, v_c_3, cent_p1) return plane_centerA, plane_centerB, plane_centerC
[docs] @staticmethod def norm_vector(v): nf = np.sqrt(v[:, 0] ** 2 + v[:, 1] ** 2 + v[:, 2] ** 2) for coor in range(3): v[:, coor] = v[:, coor] / nf return v
[docs] @staticmethod def plane_values(vector_a, vector_b, p1): cp = np.cross(vector_a, vector_b).astype(np.float32) d = cp[:, 0] * p1[:, 0] \ + cp[:, 1] * p1[:, 1] \ + cp[:, 2] * p1[:, 2] return np.array([cp[:, 0], cp[:, 1], cp[:, 2], d])