import numpy as np
[docs]
class GenericCrystal:
"""
Class that represents a LYSO crystal. It contains the information about the crystal geometry and the detectors that compose it.
Methods:
"""
def __init__(self, crystal_id=1):
self._density = 7.4
self._crystalID = crystal_id
self._crystalSizeX = 20 # mm
self._crystalSizeY = 1.6 # mm
self._crystalSizeZ = 1.6
self._centroid = [0, 0, 0]
self._vertices = np.array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
self._originalVertices = np.array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
self._alphaRotation = 0
self._betaRotation = 0
self._sigmaRotation = 0
self._xTranslation = 0
self._yTranslation = 0
self._zTranslation = 0
self._volume = self._crystalSizeX * self._crystalSizeY * self._crystalSizeZ * 1e-3
self._mass = self._density * self._volume
[docs]
def setCrystalID(self, value):
"""
Sets the crystal ID.
"""
if value != self._crystalID:
self._crystalID = value
@property
def crystalID(self):
"""
Returns the crystal ID.
"""
return self._crystalID
[docs]
def setVerticesCrystalCoordinateSystem(self):
"""
Sets the crystal vertices.
"""
self._vertices = np.array([[self._centroid[0] - self._crystalSizeX / 2,
self._centroid[1] - self._crystalSizeY / 2,
self._centroid[2] - self._crystalSizeZ / 2],
[self._centroid[0] + self._crystalSizeX / 2,
self._centroid[1] - self._crystalSizeY / 2,
self._centroid[2] - self._crystalSizeZ / 2],
[self._centroid[0] + self._crystalSizeX / 2,
self._centroid[1] + self._crystalSizeY / 2,
self._centroid[2] - self._crystalSizeZ / 2],
[self._centroid[0] - self._crystalSizeX / 2,
self._centroid[1] + self._crystalSizeY / 2,
self._centroid[2] - self._crystalSizeZ / 2],
[self._centroid[0] - self._crystalSizeX / 2,
self._centroid[1] - self._crystalSizeY / 2,
self._centroid[2] + self._crystalSizeZ / 2],
[self._centroid[0] + self._crystalSizeX / 2,
self._centroid[1] - self._crystalSizeY / 2,
self._centroid[2] + self._crystalSizeZ / 2],
[self._centroid[0] + self._crystalSizeX / 2,
self._centroid[1] + self._crystalSizeY / 2,
self._centroid[2] + self._crystalSizeZ / 2],
[self._centroid[0] - self._crystalSizeX / 2,
self._centroid[1] + self._crystalSizeY / 2,
self._centroid[2] + self._crystalSizeZ / 2]])
@property
def vertices(self):
"""
Returns the crystal vertices.
"""
return self._vertices
[docs]
def setVertices(self, value):
"""
Sets the crystal vertices.
"""
self._vertices = value
@property
def centroid(self):
"""
Returns the crystal centroid.
"""
return self._centroid
[docs]
def setCentroid(self, value):
"""
Sets the crystal centroid.
"""
self._centroid = value
[docs]
def setCristalSize(self, sizex, sizey, sizez):
self._crystalSizeX = sizex
self._crystalSizeY = sizey
self._crystalSizeZ = sizez
self._volume = self._crystalSizeX * self._crystalSizeY * self._crystalSizeZ * 1e-3
self._mass = self._density * self._volume
self.setVerticesCrystalCoordinateSystem()
# self.setVertices()
[docs]
def getCrystalShape(self):
return [self._crystalSizeX, self._crystalSizeY, self._crystalSizeZ]
@property
def crystalSizeX(self):
return self._crystalSizeX
@property
def crystalSizeY(self):
return self._crystalSizeY
@property
def crystalSizeZ(self):
return self._crystalSizeZ
@property
def mass(self):
return self._mass
@property
def density(self):
return self._density
[docs]
def setDensity(self, value):
if self._density != value:
self._density = value
self._mass = self._density * self._volume
@property
def volume(self):
return self._volume
@property
def alphaRotation(self):
return self._alphaRotation
[docs]
def setAlphaRotation(self, value):
self._alphaRotation = value
@property
def betaRotation(self):
return self._betaRotation
[docs]
def setBetaRotation(self, value):
self._betaRotation = value
@property
def sigmaRotation(self):
return self._sigmaRotation
[docs]
def setSigmaRotation(self, value):
self._sigmaRotation = value
@property
def xTranslation(self):
return self._xTranslation
[docs]
def setXTranslation(self, value):
self._xTranslation = value
@property
def yTranslation(self):
return self._yTranslation
[docs]
def setYTranslation(self, value):
self._yTranslation = value
@property
def zTranslation(self):
return self._zTranslation
[docs]
def setZTranslation(self, value):
self._zTranslation = value