Commit be9a258d authored by BO ZHANG's avatar BO ZHANG 🏀
Browse files

add csst module

parent be77bd7d
class CaseInsensitiveDict(dict):
def __init__(self, *args, **kwargs):
self._key_map = {}
super().__init__(*args, **kwargs)
# 初始化时处理传入的键
for key in list(self.keys()):
self._key_map[key.lower()] = key
def __setitem__(self, key, value):
key_lower = key.lower() if isinstance(key, str) else key
self._key_map[key_lower] = key # 记录原始键
super().__setitem__(key_lower, value)
def __getitem__(self, key):
key_lower = key.lower() if isinstance(key, str) else key
return super().__getitem__(key_lower)
def __delitem__(self, key):
key_lower = key.lower() if isinstance(key, str) else key
del self._key_map[key_lower]
super().__delitem__(key_lower)
def __contains__(self, key):
key_lower = key.lower() if isinstance(key, str) else key
return super().__contains__(key_lower)
def get(self, key, default=None):
key_lower = key.lower() if isinstance(key, str) else key
return super().get(key_lower, default)
def keys(self):
return self._key_map.values() # 返回原始键
def items(self):
for key_lower, value in super().items():
yield (self._key_map.get(key_lower, key_lower), value)
class Detector:
def __init__(self, name: str = "01", is_effective: bool = True):
self.name = name
self.is_effective: bool = is_effective
def __repr__(self):
return f"<Detector: {self.name}, is_effective: {self.is_effective}>"
class SimpleInstrument(CaseInsensitiveDict):
def __init__(
self,
name: str,
detectors: list[Detector],
):
self.name = name
self._detectors = detectors
super().__init__()
for d in detectors:
self[d.name] = d
@property
def detectors(self):
return self._detectors
@property
def detector_names(self):
return [d.name for d in self._detectors]
@property
def effective_detectors(self):
return [d for d in self._detectors if d.is_effective]
@property
def effective_detector_names(self):
return [d.name for d in self._detectors if d.is_effective]
@property
def n_detector(self):
return len(self.detectors)
@property
def n_effective_detector(self):
return len(self.effective_detectors)
def __repr__(self):
return f"<SimpleInstrument: {self.name}, {self.n_detector} detectors, {self.n_effective_detector} effective>"
def __getitem__(self, item):
return self[item.upper()]
class ComplexInstrument(CaseInsensitiveDict):
def __init__(
self,
name: str,
instruments: list[SimpleInstrument],
):
self.name = name
self.instruments = instruments
super().__init__()
for i in self.instruments:
self[i.name] = i
@property
def n_instrument(self):
return len(self.instruments)
@property
def n_detector(self):
return sum([i.n_detector for i in self.instruments])
@property
def n_effective_detector(self):
return sum([i.n_effective_detector for i in self.instruments])
@property
def detectors(self):
return [d for i in self.instruments for d in i.detectors]
@property
def detector_names(self):
return [d.name for i in self.instruments for d in i.detectors]
@property
def effective_detectors(self):
return [d for i in self.instruments for d in i.effective_detectors]
@property
def effective_detector_names(self):
return [d.name for i in self.instruments for d in i.effective_detectors]
def __repr__(self):
str_instruments = ",".join([_.__repr__() for _ in self.instruments])
return f"[ComplexInstrument: {self.name}, {str_instruments}]"
class Telescope(CaseInsensitiveDict):
def __init__(
self,
name: str,
instruments: list[SimpleInstrument | ComplexInstrument],
):
self.name = name
self.instruments = instruments
super().__init__()
for i in self.instruments:
self[i.name] = i
@property
def n_instrument(self):
return len(self.instruments)
mbi = SimpleInstrument(
name="MBI",
detectors=[
Detector(name=_)
for _ in [
"06",
"07",
"08",
"09",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"22",
"23",
"24",
"25",
]
],
)
sls = SimpleInstrument(
name="SLS",
detectors=[
Detector(name=_)
for _ in [
"01",
"02",
"03",
"04",
"05",
"10",
"21",
"26",
"27",
"28",
"29",
"30",
]
],
)
ir = SimpleInstrument(
name="IR",
detectors=[Detector(name=f"IR{_}{_}", is_effective=False) for _ in range(1, 9)],
)
mci = SimpleInstrument(
name="MCI",
detectors=[Detector(name=_) for _ in ["C1", "C2", "C3"]],
)
ifs = SimpleInstrument(
name="IFS",
detectors=[Detector(name=_) for _ in ["B", "R"]],
)
cpic = SimpleInstrument(
name="CPIC",
detectors=[Detector(name=_) for _ in ["VIS", "NIR"]],
)
hstdm = SimpleInstrument(
name="HSTDM",
detectors=[Detector(name=_) for _ in ["sis01", "sis02"]],
)
msc = ComplexInstrument(
name="MSC",
instruments=[mbi, sls, ir],
)
csst = Telescope(
name="CSST",
instruments=[msc, mci, ifs, cpic, hstdm],
)
# csst.instruments
# csst["msc"].detectors[0]
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment