Source code for toor.Geometry.Standard.polygonal
import numpy as np
from toor.Device import Device
[docs]
class RegularPolygonalGeometry(Device):
"""
This class is used to create a cylindrical geometry.
parameters:
detector_module: DetectorModule object
radius: radius of the cylinder
height: height of the cylinder
fill_circunference: if True, the circunference of the cylinder will be filled with modules
"""
def __init__(self, detector_module=None, radius=40, fill_circle=False):
super().__init__()
if detector_module is None:
Warning(
"Detector module cannot be None. Remember to set DetectorModule object. ")
self._detectorModuleObject = detector_module
self._radius = radius
self._numberOfModulesZ = 1
self._numberOfModulesPerSide = 1
self._numberOfModulesPhi = 2
self._startPhi = 0
self._endPhi = 360
self._anglePhi = (self._endPhi - self._startPhi) / self._numberOfModulesPhi
self._fillCircle = fill_circle
self._axialGapBetweenModules = 3
self._radialGapBetweenModules = 0
self._zTranslation = 0
self._structureType = "static"
self.setGeometryType("planar")
self._numberOfModules = self._numberOfModulesZ * self._numberOfModulesPhi * self._numberOfModulesPerSide
self._detectorModule = [self._detectorModuleObject(i) for i in range(self._numberOfModules)]
# self._detectorModule = None
if self._detectorModule is not None:
if fill_circle:
# self._radius = 12.8 + 2*12.8* (self._numberOfModulesPhi/4-1)*np.cos(np.deg2rad((self._numberOfModulesPhi/4 - 1)*(90-self._anglePhi)))+10
self._radius = 12.8*self._numberOfModulesPerSide +10 # half module width plus half crystal width
if self._numberOfModulesPhi % 4 == 0:
for inter_module in range(int(self._numberOfModulesPhi / 4 - 1)):
self._radius += 2 * 12.8*self._numberOfModulesPerSide * np.cos(np.deg2rad((90 - (inter_module + 1) * self._anglePhi)))
elif self._numberOfModulesPhi % 4 == 2:
self._radius = 10
for inter_module in range(int(np.ceil(self._numberOfModulesPhi / 4)- 1)):
self._radius += 2 * 12.8*self._numberOfModulesPerSide* np.cos(np.deg2rad((90 - (inter_module + 1) * self._anglePhi)))
print("radius: ", self._radius)
# for inter_module in range(int(np.floor(self._numberOfModulesPhi / 4)- 1)):
# self._radius += 2 * 12.8*self._numberOfModulesPerSide* np.cos(np.deg2rad((90 - (inter_module + 1) * self._anglePhi)))
# # self._detectorModule = [[self._detectorModuleObject(i+2*j) for i in range(self._numberOfModulesPhi)] for j in range(self._numberOfModulesZ)]
@property
def detectorModule(self):
return self._detectorModule
[docs]
def setDetectorModule(self, detector_module):
self._detectorModule = detector_module
@property
def radius(self):
return self._radius
[docs]
def setRadius(self, radius):
self._radius = radius
@property
def numberOfModulesZ(self):
return self._numberOfModulesZ
@property
def numberOfModulesPhi(self):
return self._numberOfModulesPhi
@property
def numberOfModulesPerSide(self):
return self._numberOfModulesPerSide
@property
def numberOfModules(self):
return self._numberOfModules
[docs]
def setNumberOfModulesZ(self, number_of_modules_z):
self._numberOfModulesZ = number_of_modules_z
self._numberOfModules = self._numberOfModulesZ * self._numberOfModulesPhi*self._numberOfModulesPerSide
# self._detectorModule = [self._detectorModuleObject for i in range(self._numberOfModules)]
[docs]
def setNumberOfModulesPhi(self, number_of_modules_phi):
self._numberOfModulesPhi = number_of_modules_phi
self._numberOfModules = self._numberOfModulesZ * self._numberOfModulesPhi * self._numberOfModulesPerSide
# self._detectorModule = [self._detectorModuleObject for i in range(self._numberOfModules)]
[docs]
def setNumberOfModulesPerSide(self, number_of_modules_per_side):
self._numberOfModulesPerSide = number_of_modules_per_side
self._numberOfModules = self._numberOfModulesZ * self._numberOfModulesPhi * self._numberOfModulesPerSide
# self._detectorModule = [self._detectorModuleObject for i in range(self._numberOfModules)]
[docs]
def setAnglePhi(self, angle_phi):
self._anglePhi = angle_phi
[docs]
def calculateInitialGeometry(self):
for i in range(self._numberOfModulesPhi):
for j in range(self._numberOfModulesZ):
for k in range(self._numberOfModulesPerSide):
# self._detectorModule[
# i + self._numberOfModulesPhi * j + self._numberOfModulesZ * self._numberOfModulesPhi * k].setXTranslation(self.radius*k-(self._numberOfModulesPerSide-1)*self.radius)
self._detectorModule[
i + self._numberOfModulesPhi * j + self._numberOfModulesZ * self._numberOfModulesPhi * k].setInitialGeometry()
# self._detectorModule[
# i + self._numberOfModulesPhi * j + self._numberOfModulesZ * self._numberOfModulesPhi * k].setXTranslation(25.8*k* np.sin(np.deg2rad(self._anglePhi * i)))
self._detectorModule[i + self._numberOfModulesPhi * j+self._numberOfModulesZ*self._numberOfModulesPhi*k].setXTranslation(
self.radius * np.cos(np.deg2rad(self._anglePhi * i)))
self._detectorModule[i + self._numberOfModulesPhi * j+self._numberOfModulesZ*self._numberOfModulesPhi*k].setYTranslation(
self.radius * np.sin(np.deg2rad(self._anglePhi * i)))
self._detectorModule[i + self._numberOfModulesPhi * j+self._numberOfModulesZ*self._numberOfModulesPhi*k].setZTranslation(
j * 30)
self._detectorModule[i + self._numberOfModulesPhi * j+self._numberOfModulesZ*self._numberOfModulesPhi*k].setAlphaRotation(0)
self._detectorModule[i + self._numberOfModulesPhi * j+self._numberOfModulesZ*self._numberOfModulesPhi*k].setBetaRotation(0)
# self._detectorModule[j][i].setSigmaRotation(90 + 45 * i)
self._detectorModule[i + self._numberOfModulesPhi * j+self._numberOfModulesZ*self._numberOfModulesPhi*k].setSigmaRotation(90 + self._anglePhi * i)
self._detectorModule[i + self._numberOfModulesPhi * j+self._numberOfModulesZ*self._numberOfModulesPhi*k].setInitialGeometry()
# petModule.setYTranslation(30)
# self._detectorModule[i + self._numberOfModulesPhi * j].setYTranslation(
# self.radius * np.sin(np.deg2rad(self._anglePhi * i)))
# self._detectorModule[i + self._numberOfModulesPhi * j].setZTranslation(j * 30)
# self._detectorModule[i + self._numberOfModulesPhi * j].setAlphaRotation(0)
# self._detectorModule[i + self._numberOfModulesPhi * j].setBetaRotation(0)a
# # self._detectorModule[j][i].setSigmaRotation(90 + 45 * i)
# self._detectorModule[i + self._numberOfModulesPhi * j].setSigmaRotation(90 + self._anglePhi * i)
# self._detectorModule[i + self._numberOfModulesPhi * j].setInitialGeometry()
# petModule.setYTranslation(30)
if __name__ == "__main__":
from DetectionLayout.Modules import PETModule
from Designer import DeviceDesignerStandalone
# newDevice = Device()
# newDevice.setDeviceName("Test Device")
# newDevice.setDeviceType("Test Device Type")
# newDevice.setDeviceUUID("Test Device UUID")
# newDevice.setDeviceStatus("Test Device Status")
# newDevice.setDeviceDirectory("Test Device Directory")
# print(newDevice.getDeviceName())
# print(newDevice.getDeviceType())
module_ = PETModule
#
newDevice = RegularPolygonalGeometry(detector_module=module_)
# newDevice.setDetectorModule(module_)
newDevice.setDeviceName("Test Device")
newDevice.calculateInitialGeometry()
designer = DeviceDesignerStandalone(device=newDevice)
designer.addDevice()
designer.startRender()
print(newDevice.getDeviceName())