1use crate::prelude::*;
5
6#[derive(Debug, Copy, Clone, PartialEq)]
7#[cfg_attr(feature="pybindings", pyclass)]
8#[allow(non_snake_case)]
9pub struct McHit {
10 pub volume_id : u32,
11 pub hw_id : u32,
12 pub parent_id : u32,
13 pub track_id : u32,
14 pub kin_E : f32,
15 pub glob_time : f32,
16 pub pos_x : f32,
17 pub pos_y : f32,
18 pub pos_z : f32,
19 pub vertex_pos_x : f32,
20 pub vertex_pos_y : f32,
21 pub vertex_pos_z : f32,
22 #[allow(non_snake_case)]
23 pub vertex_kin_E : f32,
24 pub mom_x : f32,
25 pub mom_y : f32,
26 pub mom_z : f32,
27 pub vertex_mom_x : f32,
28 pub vertex_mom_y : f32,
29 pub vertex_mom_z : f32,
30 pub step_len : f32,
31 pub step_edep : f32,
32 pub pre_mom_x : f32,
33 pub pre_mom_y : f32,
34 pub pre_mom_z : f32,
35 #[allow(non_snake_case)]
36 pub pre_kin_E : f32,
37
38 pub pdg : i32,
39 pub pre_step_status : i32,
40 pub post_step_status : i32,
41 pub vertex_vol_id : u32,
42 pub vertex_hw_id : u32,
43 pub is_first_step_in_vol : bool,
44 pub is_last_step_in_vol : bool,
45 pub process_type : u8,
46}
47
48impl McHit {
49 pub fn new() -> Self {
50 Self {
51 volume_id : 0,
52 hw_id : 0,
53 parent_id : 0,
54 track_id : 0,
55 kin_E : 0.0,
56 glob_time : 0.0,
57 pos_x : 0.0,
58 pos_y : 0.0,
59 pos_z : 0.0,
60 vertex_pos_x : 0.0,
61 vertex_pos_y : 0.0,
62 vertex_pos_z : 0.0,
63 vertex_kin_E : 0.0,
64 mom_x : 0.0,
65 mom_y : 0.0,
66 mom_z : 0.0,
67 vertex_mom_x : 0.0,
68 vertex_mom_y : 0.0,
69 vertex_mom_z : 0.0,
70 step_len : 0.0,
71 step_edep : 0.0,
72 pre_mom_x : 0.0,
73 pre_mom_y : 0.0,
74 pre_mom_z : 0.0,
75 pre_kin_E : 0.0,
76
77 pdg : 0,
78 pre_step_status : 0,
79 post_step_status : 0,
80 vertex_vol_id : 0,
81 vertex_hw_id : 0,
82 is_first_step_in_vol : false,
83 is_last_step_in_vol : false,
84 process_type : 0,
85 }
86 }
87}
88
89impl Serialization for McHit {
90 fn from_bytestream(stream : &Vec<u8>,
91 pos : &mut usize)
92 -> Result<Self, SerializationError> {
93 let mut hit = Self::new();
96 let head = parse_u16(stream, pos);
97 if head != Self::HEAD {
98 error!("Decoding of HEAD failed! Got {} instead!", head);
99 return Err(SerializationError::HeadInvalid);
100 }
101 hit.volume_id = parse_u32(stream, pos);
102 hit.hw_id = parse_u32(stream, pos);
103 hit.parent_id = parse_u32(stream, pos);
104 hit.track_id = parse_u32(stream, pos);
105 hit.kin_E = parse_f32(stream, pos);
106 hit.glob_time = parse_f32(stream, pos);
107 hit.pos_x = parse_f32(stream, pos);
108 hit.pos_y = parse_f32(stream, pos);
109 hit.pos_z = parse_f32(stream, pos);
110 hit.vertex_pos_x = parse_f32(stream, pos);
111 hit.vertex_pos_y = parse_f32(stream, pos);
112 hit.vertex_pos_z = parse_f32(stream, pos);
113 hit.vertex_kin_E = parse_f32(stream, pos);
114 hit.mom_x = parse_f32(stream, pos);
115 hit.mom_y = parse_f32(stream, pos);
116 hit.mom_z = parse_f32(stream, pos);
117 hit.vertex_mom_x = parse_f32(stream, pos);
118 hit.vertex_mom_y = parse_f32(stream, pos);
119 hit.vertex_mom_z = parse_f32(stream, pos);
120 hit.step_len = parse_f32(stream, pos);
121 hit.step_edep = parse_f32(stream, pos);
122 hit.pre_mom_x = parse_f32(stream, pos);
123 hit.pre_mom_y = parse_f32(stream, pos);
124 hit.pre_mom_z = parse_f32(stream, pos);
125 hit.pre_kin_E = parse_f32(stream, pos);
126 hit.pdg = parse_i32(stream, pos);
127 hit.pre_step_status = parse_i32(stream, pos);
128 hit.post_step_status = parse_i32(stream, pos);
129 hit.vertex_vol_id = parse_u32(stream, pos);
130 hit.vertex_hw_id = parse_u32(stream, pos);
131 hit.is_first_step_in_vol = parse_bool(stream, pos);
132 hit.is_last_step_in_vol = parse_bool(stream, pos);
133 hit.process_type = parse_u8(stream, pos);
134
135
136 let tail = parse_u16(stream, pos);
137 if tail != Self::TAIL {
138 error!("Decoding of TAIL failed! Got {} instead!", tail);
140 return Err(SerializationError::TailInvalid);
141 }
142
143 Ok(hit)
144 }
145}
146
147impl fmt::Display for McHit {
148 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
149 let mut repr = format!("<McHit ");
150 repr += &(format!("\n volume_id : {}",self.volume_id ));
151 repr += &(format!("\n hw_id : {}",self.hw_id ));
152 repr += &(format!("\n parent_id : {}",self.parent_id ));
153 repr += &(format!("\n track_id : {}",self.track_id ));
154 repr += &(format!("\n kin_E : {}",self.kin_E ));
155 repr += &(format!("\n glob_time : {}",self.glob_time ));
156 repr += &(format!("\n pos_x : {}",self.pos_x ));
157 repr += &(format!("\n pos_y : {}",self.pos_y ));
158 repr += &(format!("\n pos_z : {}",self.pos_z ));
159 repr += &(format!("\n vertex_pos_x : {}",self.vertex_pos_x));
160 repr += &(format!("\n vertex_pos_y : {}",self.vertex_pos_y));
161 repr += &(format!("\n vertex_pos_z : {}",self.vertex_pos_z));
162 repr += &(format!("\n vertex_kin_E : {}",self.vertex_kin_E));
163 repr += &(format!("\n mom_x : {}",self.mom_x ));
164 repr += &(format!("\n mom_y : {}",self.mom_y ));
165 repr += &(format!("\n mom_z : {}",self.mom_z ));
166 repr += &(format!("\n vertex_mom_x : {}",self.vertex_mom_x));
167 repr += &(format!("\n vertex_mom_y : {}",self.vertex_mom_y));
168 repr += &(format!("\n vertex_mom_z : {}",self.vertex_mom_z));
169 repr += &(format!("\n step_len : {}",self.step_len ));
170 repr += &(format!("\n pre_mom_x : {}",self.pre_mom_x ));
171 repr += &(format!("\n pre_mom_y : {}",self.pre_mom_y ));
172 repr += &(format!("\n pre_mom_z : {}",self.pre_mom_z ));
173 repr += &(format!("\n pre_kin_E : {}",self.pre_kin_E ));
174 repr += &(format!("\n pdg : {}", self.pdg ));
175 repr += &(format!("\n pre_step_status : {}", self.pre_step_status ));
176 repr += &(format!("\n post_step_status : {}", self.post_step_status ));
177 repr += &(format!("\n vertex_vol_id : {}", self.vertex_vol_id ));
178 repr += &(format!("\n vertex_hw_id : {}", self.vertex_hw_id ));
179 repr += &(format!("\n is_first_step_in_vol : {}", self.is_first_step_in_vol));
180 repr += &(format!("\n is_last_step_in_vol : {}", self.is_last_step_in_vol ));
181 repr += &(format!("\n process_type : {}", self.process_type ));
182 repr += ">";
183 write!(f, "{}", repr)
184 }
185}
186
187#[cfg(feature="pybindings")]
188pythonize!(McHit);