Skip to main content

gondola_core/events/
mc_hit.rs

1// The following file is part of gaps-online-software and published 
2// under the GPLv3 license
3
4use 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 size : usize = 24*4 + 2*16;
94    //*pos += size;
95    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 for version {}! Got {} instead!", version, tail);
139      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);