-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsettings.py
101 lines (79 loc) · 2.59 KB
/
settings.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from dataclasses import dataclass, field
from functools import lru_cache
from typing import Tuple
import numpy as np
import pyamtrack.libAT as libam
def pure_attr_hash(obj):
'''
Calculate hash function from values of all attributes which are not properties
This is needed for @lru_cache function to speedup calculations
'''
return hash((getattr(obj, attr_name) for attr_name in vars(obj).keys()))
@dataclass
class BeamSetup:
particle_name: str = "1H"
start_E_MeV_u: float = 1.5
stop_E_MeV_u: float = 60.
num_E_MeV_u: int = 400
dose_gy: float = 0.3
@property
@lru_cache
def particle_code(self) -> int:
return libam.AT_particle_no_from_particle_name_single(self.particle_name)
def __hash__(self):
return pure_attr_hash(self)
@dataclass
class DetectorPropertySetup:
material_name: str = "Aluminum Oxide"
slab_thickness_um: float = 100.
@property
@lru_cache
def code(self) -> int:
return libam.AT_material_number_from_name(self.material_name)
def __hash__(self):
return pure_attr_hash(self)
@dataclass
class TrackStructureModel:
er_model_name: str = "ER_Edmund"
rdd_model_name: str = "RDD_Geiss"
a0_nm: Tuple[float, ...] = (95., 50., 150.)
@property
def er_model_code(self) -> int:
return libam.AT_ERModels[self.er_model_name].value
@property
def rdd_model_code(self) -> int:
return libam.RDDModels[self.rdd_model_name].value
@dataclass
class GammaResponseModel:
name: str = "GR_GeneralTarget"
r: float = 44.
smax: float = 27.6
d01: float = 2.9
c1: float = 1.
m1: float = 1.
d02: float = 4.66
c2: float = 2.
m2: float = 1.
@property
def code(self) -> int:
return libam.AT_GammaResponseModels[self.name].value
@property
def parameters_vector(self) -> tuple:
k1 = self.smax * (self.r / 100)
k2 = self.smax * np.abs(1. - self.r / 100)
result = (k1, self.d01, self.c1, self.m1, k2, self.d02, self.c2, self.m2, 0)
return result
@dataclass
class SimulationSetup:
'''
TODO add list of available materials
'''
beam: BeamSetup = BeamSetup()
material: DetectorPropertySetup = DetectorPropertySetup()
gamma_response_model: GammaResponseModel = GammaResponseModel()
tst_model: TrackStructureModel = TrackStructureModel()
stopping_power_source_name: str = "PSTAR"
saturation_cross_section_factor: float = 1.4
@property
def stopping_power_source_code(self) -> int:
return libam.stoppingPowerSource_no[self.stopping_power_source_name].value