Source code for toor.Geometry.LinearPET.linear_parametric_points

import numpy as np


[docs] class SetParametricCoordinates: def __init__(self, listMode=None, geometry_file=None, header=None, sensivity_Matrix_calculation=False, point_location="crystal_center", crystal_thick=2, crystal_depth=10, shuffle=True, FoV=45, distance_between_motors=30, distance_crystals=60): initial_geometry_init_point = np.arange(1,33)*crystal_thick r_init_module = distance_between_motors r_end_module = -distance_between_motors bot = np.deg2rad(listMode[:, 1]) y_stepper = listMode[:, 0] # _____________INIT_POINT____________ A = np.array([[np.cos(bot), -np.sin(bot), r_init_module*np.cos(bot)], [np.sin(bot), np.cos(bot), r_init_module*np.sin(bot)], [0, 0, 1]]) B = np.array([0, y_stepper, 1]) dot_vector = self.dotA_B(A, B) self.xi = dot_vector[0] self.yi = dot_vector[1] self.zi = initial_geometry_init_point[(listMode[:, 2]).astype(int)] # _____________END_POINT____________ C = np.array([[np.cos(bot), -np.sin(bot), r_end_module*np.cos(bot)], [np.sin(bot), np.cos(bot), r_end_module*np.sin(bot)], [0, 0, 1]]) D = np.array([0, y_stepper, 1]) dot_vector = self.dotA_B(C, D) self.xf = dot_vector[0] self.yf = dot_vector[1] self.zf = initial_geometry_init_point[(listMode[:, 3]).astype(int)] # _____________MID_POINT____________ E = np.array([[np.cos(bot), -np.sin(bot), r_init_module*np.cos(bot)], [np.sin(bot), np.cos(bot), r_init_module*np.sin(bot)], [0, 0, 1]]) F = np.array([0, y_stepper+crystal_thick/2, 1]) dot_vector = self.dotA_B(E, F) self.midpoint = np.array([np.zeros(bot.shape[0]), np.zeros(bot.shape[0]), np.zeros(bot.shape[0])], dtype=np.float32) self.midpoint[0] = dot_vector[0] self.midpoint[1] = dot_vector[1] self.midpoint[2] = initial_geometry_init_point[(listMode[:, 2]).astype(int)] # _____________FAREST_POINT____________ G = np.array([[np.cos(bot), -np.sin(bot), 0], [np.sin(bot), np.cos(bot), 0], [0, 0, 1]]) H = np.array([crystal_depth/2+r_init_module, y_stepper, 1]) dot_vector = self.dotA_B(G, H) self.farest_vertex = np.array([np.zeros(bot.shape[0]), np.zeros(bot.shape[0]), np.zeros(bot.shape[0])], dtype=np.float32) self.farest_vertex[0] = dot_vector[0] self.farest_vertex[1] = dot_vector[1] self.farest_vertex[2] = initial_geometry_init_point[(listMode[:, 2]).astype(int)] # _____________CLOSEST_POINT____________ self.closest_vertex = self.farest_vertex self._transform_into_positive_values(crystal_thick=crystal_thick) # I = np.array([[np.cos(bot), -np.sin(bot), r_init_module * np.cos(bot)], # [np.sin(bot), np.cos(bot), r_init_module * np.sin(bot)], # [0, 0, 1]]) # # J = np.array([-crystal_depth / 2, # y_stepper, # 1]) # # dot_vector = self.dotA_B(I, J) # # self.farest_vertex = np.array([np.zeros(bot.shape[0]), np.zeros(bot.shape[0]), np.zeros(bot.shape[0])], # dtype=np.float32) # self.farest_vertex = dot_vector[0] # self.farest_vertex = dot_vector[1] # self.farest_vertex = initial_geometry_init_point[(listMode[:, 2] - 1).astype(int)]
[docs] def dotA_B(self, A, B): dotA1_B2 = np.array([A[0, 0] * B[0] + A[0, 1] * B[1] + A[0, 2] * B[2], A[1, 0] * B[0] + A[1, 1] * B[1] + A[1, 2] * B[2], A[2, 0] * B[0] + A[2, 1] * B[1] + A[2, 2] * B[2]], dtype=np.float32) return dotA1_B2
def _transform_into_positive_values(self, FoV=None, crystal_thick=None): # self.midpoint[0] = self.midpoint[0] + FoV # np.abs(np.min(self.xf)) # self.midpoint[1] = self.midpoint[1] + FoV # np.abs(np.min(self.yf)) # self.xi = self.xi + FoV # np.abs(np.min(self.xf)) # self.xf = self.xf + FoV # np.abs(np.min(self.xf)) # self.yi = self.yi + FoV #np.abs(np.min(self.yf)) # self.yf = self.yf + FoV #np.abs(np.min(self.yf)) x = np.zeros((len(self.xi), 2)) x[:, 0] = self.xi x[:, 1] = self.xf y = np.zeros((len(self.xi), 2)) y[:, 0] = self.yi y[:, 1] = self.yf z = np.zeros((len(self.zi), 2)) z[:, 0] = self.zi z[:, 1] = self.zf self.midpoint[0] = self.midpoint[0] + np.abs(np.min(x)) self.midpoint[1] = self.midpoint[1] + np.abs(np.min(y)) self.farest_vertex[0] = self.farest_vertex[0] + np.abs(np.min(x)) self.farest_vertex[1] = self.farest_vertex[1] + np.abs(np.min(y)) self.closest_vertex[0] += np.abs(np.min(x)) self.closest_vertex[1] += np.abs(np.min(y)) self.xi = self.xi + np.abs(np.min(x)) self.xf = self.xf + np.abs(np.min(x)) self.yi = self.yi + np.abs(np.min(y)) self.yf = self.yf + np.abs(np.min(y)) if np.min(z) < 0: self.zi = self.zi + np.abs(np.min(z)-crystal_thick/2) #+ crystal_thick/2*(np.random.rand()-0.5) # to be able to project the last half of the last crystal self.zf = self.zf + np.abs(np.min(z)-crystal_thick/2) #+ crystal_thick/2*(np.random.rand()-0.5)