Coverage for yaptide/converter/converter/shieldhit/detectors.py: 96%

48 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-07-01 12:55 +0000

1from dataclasses import dataclass 

2from abc import ABC 

3 

4 

5@dataclass(frozen=True) 

6class ScoringDetector(ABC): 

7 """Abstract geometry dataclass for DetectConfig.""" 

8 

9 uuid: str 

10 name: str 

11 

12 

13@dataclass(frozen=True) 

14class ScoringGlobal(ScoringDetector): 

15 r"""\"All\" detector. Scores on the whole defined space.""" 

16 

17 name: str 

18 

19 template: str = """Geometry All 

20 Name {name} 

21""" 

22 

23 def __str__(self) -> str: 

24 return self.template.format(name=self.name) 

25 

26 

27@dataclass(frozen=True) 

28class ScoringCylinder(ScoringDetector): 

29 """Cylinder detector dataclass used in DetectConfig.""" 

30 

31 name: str = "CylZ_Mesh" 

32 r_min: float = 0. 

33 r_max: float = 10. 

34 r_bins: int = 1 

35 h_min: float = 0. 

36 h_max: float = 20. 

37 h_bins: int = 400 

38 

39 template: str = """Geometry Cyl 

40 Name {name} 

41 R {r_min:g} {r_max:g} {r_bins:d} 

42 Z {h_min:g} {h_max:g} {h_bins:d} 

43""" 

44 

45 def __str__(self) -> str: 

46 return self.template.format( 

47 name=self.name, 

48 r_min=self.r_min, r_max=self.r_max, r_bins=self.r_bins, 

49 h_min=self.h_min, h_max=self.h_max, h_bins=self.h_bins, 

50 ) 

51 

52 

53@dataclass(frozen=True) 

54class ScoringMesh(ScoringDetector): 

55 """Mesh detector dataclass used in DetectConfig.""" 

56 

57 name: str = "YZ_Mesh" 

58 x_min: float = -0.5 

59 x_max: float = 0.5 

60 x_bins: int = 1 

61 y_min: float = -2. 

62 y_max: float = 2. 

63 y_bins: int = 80 

64 z_min: float = 0. 

65 z_max: float = 20. 

66 z_bins: int = 400 

67 

68 template: str = """Geometry Mesh 

69 Name {name} 

70 X {x_min:g} {x_max:g} {x_bins:d} 

71 Y {y_min:g} {y_max:g} {y_bins:d} 

72 Z {z_min:g} {z_max:g} {z_bins:d} 

73""" 

74 

75 def __str__(self) -> str: 

76 return self.template.format( 

77 name=self.name, 

78 x_min=self.x_min, x_max=self.x_max, x_bins=self.x_bins, 

79 y_min=self.y_min, y_max=self.y_max, y_bins=self.y_bins, 

80 z_min=self.z_min, z_max=self.z_max, z_bins=self.z_bins, 

81 ) 

82 

83 

84@dataclass(frozen=True) 

85class ScoringZone(ScoringDetector): 

86 """Scoring zone dataclass used un DetectConfig.""" 

87 

88 name: str 

89 first_zone_id: int 

90 last_zone_id: str = "" 

91 volume: float = 1. 

92 

93 template: str = """Geometry Zone 

94 Name {name} 

95 Zone {first_zone} {last_zone} 

96 Volume {volume:f} 

97""" 

98 

99 def __str__(self) -> str: 

100 return self.template.format( 

101 name=self.name, 

102 first_zone=self.first_zone_id, last_zone=self.last_zone_id, 

103 volume=self.volume, 

104 )