"""
Classes pertaining to the description of a Cherenkov Telescope
Todo:
-----
- add more info in OpticsDescription (mirror area, facets, etc). How to guess
this?
- add ability to write to/from tables (like that written by
ctapipe-dump-instrument)
- add ability to construct by names TelescopeDescription.from_name(
camera='LSTCam', optics=('SST','1M')) (which would create a very unbalanced
telescope :-))
"""
from ..coordinates import CameraFrame
from .camera import CameraDescription
from .guess import guess_telescope, unknown_telescope
from .optics import OpticsDescription
__all__ = ["TelescopeDescription"]
[docs]class TelescopeDescription:
"""
Describes a Cherenkov Telescope and its associated
`~ctapipe.instrument.OpticsDescription` and `~ctapipe.instrument.CameraDescription`
Attributes
----------
name: str
Telescope name
tel_type: str
Telescope type
optics: OpticsDescription
the optics associated with this telescope
camera: CameraDescription
the camera associated with this telescope
"""
__slots__ = (
"name",
"optics",
"camera",
)
def __init__(
self,
name: str,
optics: OpticsDescription,
camera: CameraDescription,
):
if not isinstance(name, str):
raise TypeError("`name` must be a str")
if not isinstance(optics, OpticsDescription):
raise TypeError("`optics` must be an instance of `OpticsDescription`")
if not isinstance(camera, CameraDescription):
raise TypeError("`camera` must be an instance of `CameraDescription`")
self.name = name
self.optics = optics
self.camera = camera
def __hash__(self):
"""Make this hashable, so it can be used as dict keys or in sets"""
return hash((self.optics, self.camera))
def __eq__(self, other):
return self.optics == other.optics and self.camera == other.camera
@classmethod
def from_name(cls, optics_name, camera_name):
"""
construct a TelescopeDescription from a name (telescope description
string)
Parameters
----------
camera_name : str
camera name
optics_name : str
optics name (e.g. LST, or SST-ASTRI), also called
telescope_description
Returns
-------
TelescopeDescription
"""
camera = CameraDescription.from_name(camera_name)
optics = OpticsDescription.from_name(optics_name)
camera.geometry.frame = CameraFrame(focal_length=optics.equivalent_focal_length)
try:
result = guess_telescope(
camera.geometry.n_pixels, optics.equivalent_focal_length
)
except ValueError:
result = unknown_telescope(optics.mirror_area, camera.geometry.n_pixels)
return cls(name=result.name, optics=optics, camera=camera)
@property
def camera_name(self):
"""Name of the camera"""
return self.camera.name
@property
def optics_name(self):
"""Name of the optics"""
return self.optics.name
@property
def type(self):
"""Size classification"""
return self.optics.size_type
def __str__(self):
return f"{self.type}_{self.optics_name}_{self.camera_name}"
def __repr__(self):
return (
f"{self.__class__.__name__}("
f"type={self.type.value!r}"
f", optics_name={self.optics_name!r}"
f", camera_name={self.camera_name!r}"
")"
)