mirror of
https://github.com/pim-n/pg-rad
synced 2026-05-14 07:18:11 +02:00
simplify detector object. Add efficiency libraries and lookup interpolators
This commit is contained in:
@ -1,20 +0,0 @@
|
||||
from pg_rad.inputparser.specs import DetectorSpec
|
||||
|
||||
from .detectors import IsotropicDetector, AngularDetector
|
||||
|
||||
|
||||
class DetectorBuilder:
|
||||
def __init__(
|
||||
self,
|
||||
detector_spec: DetectorSpec,
|
||||
):
|
||||
self.detector_spec = detector_spec
|
||||
|
||||
def build(self) -> IsotropicDetector | AngularDetector:
|
||||
if self.detector_spec.is_isotropic:
|
||||
return IsotropicDetector(
|
||||
self.detector_spec.name,
|
||||
self.detector_spec.efficiency
|
||||
)
|
||||
else:
|
||||
raise NotImplementedError("Angular detector not supported yet.")
|
||||
43
src/pg_rad/detector/detector.py
Normal file
43
src/pg_rad/detector/detector.py
Normal file
@ -0,0 +1,43 @@
|
||||
from importlib.resources import files
|
||||
|
||||
from pandas import read_csv
|
||||
|
||||
from pg_rad.utils.interpolators import (
|
||||
get_field_efficiency, get_angular_efficiency
|
||||
)
|
||||
|
||||
|
||||
class Detector:
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
type: str,
|
||||
is_isotropic: bool
|
||||
):
|
||||
self.name = name
|
||||
self.type = type
|
||||
self.is_isotropic = is_isotropic
|
||||
|
||||
def get_efficiency(self, energy_keV, angle=None):
|
||||
f_eff = get_field_efficiency(self.name, energy_keV)
|
||||
|
||||
if self.is_isotropic or angle is None:
|
||||
return f_eff
|
||||
else:
|
||||
f_eff = get_field_efficiency(self.name, energy_keV)
|
||||
a_eff = get_angular_efficiency(self.name, energy_keV, *angle)
|
||||
return f_eff * a_eff
|
||||
|
||||
|
||||
def load_detector(name) -> Detector:
|
||||
csv = files('pg_rad.data').joinpath('detectors.csv')
|
||||
data = read_csv(csv)
|
||||
dets = data['name'].values
|
||||
if name in dets:
|
||||
row = data[data['name'] == name].iloc[0]
|
||||
return Detector(row['name'], row['type'], row['is_isotropic'])
|
||||
else:
|
||||
raise NotImplementedError(
|
||||
f"Detector with name '{name}' not in detector library. Available:"
|
||||
f"{', '.join(dets)}"
|
||||
)
|
||||
@ -1,38 +0,0 @@
|
||||
from abc import ABC
|
||||
|
||||
|
||||
class BaseDetector(ABC):
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
efficiency: float
|
||||
):
|
||||
self.name = name
|
||||
self.efficiency = efficiency
|
||||
|
||||
def get_efficiency(self):
|
||||
pass
|
||||
|
||||
|
||||
class IsotropicDetector(BaseDetector):
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
efficiency: float,
|
||||
):
|
||||
super().__init__(name, efficiency)
|
||||
|
||||
def get_efficiency(self, energy):
|
||||
return self.efficiency
|
||||
|
||||
|
||||
class AngularDetector(BaseDetector):
|
||||
def __init__(
|
||||
self,
|
||||
name: str,
|
||||
efficiency: float
|
||||
):
|
||||
super().__init__(name, efficiency)
|
||||
|
||||
def get_efficiency(self, angle, energy):
|
||||
pass
|
||||
Reference in New Issue
Block a user