Skip to main content

gondola_core/events/
tracker_daq_event.rs

1// This file is part of gaps-online-software and published 
2// under the GPLv3 license
3
4use crate::prelude::*;
5
6/// Each individual DAQ box of the tracker records its hit individually 
7/// and then the event needs to be assemlbed. 
8///
9/// During flight, this will be part of the "TrackerPacket" type 80
10#[derive(Debug, Clone, PartialEq)]
11#[cfg_attr(feature="pybindings", pyclass)]
12pub struct TrackerDAQEvent {
13  pub layer        : u8,
14  pub flags1       : u8,
15  pub event_id     : u32, 
16  pub event_time16 : u16,
17  pub event_time32 : u32,
18  pub hits         : Vec<TrackerHit>
19}
20
21impl TrackerDAQEvent {
22  pub fn new() -> Self {
23    Self {
24      layer        : u8::MAX,
25      flags1       : u8::MAX,
26      event_id     : u32::MAX, 
27      event_time16 : u16::MAX,
28      event_time32 : u32::MAX,
29      hits         : Vec::<TrackerHit>::new()
30    }
31  }
32  
33  pub fn get_event_time(&self) -> u64 {
34    //0x273000000000000 | (((self.event_time16 as u64) << 32) | self.event_time32 as u64)
35    ((self.event_time16 as u64) << 32) | self.event_time32 as u64
36  }
37}
38
39impl fmt::Display for TrackerDAQEvent {
40  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
41    let mut repr = String::from("<TrackerDAQEvent:");
42    repr += &(format!("\n  Layer      : {}" ,self.layer));
43    repr += &(format!("\n  Flags1     : {}" ,self.flags1));
44    repr += &(format!("\n  Event ID   : {}" ,self.event_id)); 
45    repr += &(format!("\n  Event Time : {}" ,self.get_event_time())); 
46    if self.hits.len() > 0 {
47      repr += "\n -- hits:"; 
48      for h in &self.hits {
49        repr += &(format!("\n {}", h));
50      }
51    } else {
52      repr += "\n -- no hits!"; 
53    }
54    write!(f, "{}", repr)
55  }
56}
57
58
59//impl Serialization for TrackerDAQEvent { 
60//  fn from_bytestream(stream: &Vec<u8>,
61//                     pos: &mut usize)
62//    -> Result<Self, SerializationError> {
63//    let mut ev  = Self::new();
64//    ev.event_time32 = parse_u32(stream, pos);
65//    ev.event_time16 = parse_u16(stream, pos);
66//    ev.layer        = parse_u8(stream, pos);
67//    let n_hits      = parse_u8(stream, pos);
68//    for _ in 0..n_hits {
69//      // in this version of the TrackerHit, it has 
70//      // 6 bytes
71//      if stream.len() < *pos + 6 {
72//        error!("Expected to get 6 more bytes for the hit, but the input stream is too short!");
73//        return Err(SerializationError::StreamTooShort);
74//      }
75//      let mut h = TrackerHit::new();
76//      h.row             = parse_u8(stream, pos) as u16;
77//      h.module          = parse_u8(stream, pos) as u16;
78//      h.channel         = parse_u8(stream, pos) as u16;
79//      h.adc             = parse_u16(stream, pos);
80//      h.asic_event_code = parse_u8(stream, pos);
81//      ev.hits.push(h);
82//    }
83//    Ok(ev)
84//  }
85//}
86
87#[cfg(feature="random")]
88impl FromRandom for TrackerDAQEvent {
89
90  fn from_random() -> Self {
91    let mut ev      = Self::new();
92    let mut rng     = rand::rng();
93    ev.layer        = rng.random_range(0..10) + 128;
94    ev.flags1       = rng.random::<u8>();
95    ev.event_id     = rng.random::<u32>(); 
96    ev.event_time16 = rng.random::<u16>();
97    ev.event_time32 = rng.random::<u32>();
98    ev.hits         = Vec::<TrackerHit>::new();
99    let n_hits : u8 = rng.random_range(0..25);
100    //let n_hits = 1u8;
101    for _ in 0..n_hits {
102      let mut h = TrackerHit::from_random();
103      // the layer is not set here 
104      h.layer = ev.layer - 128;
105      ev.hits.push(h);   
106    }
107    ev
108  }
109}
110
111
112#[cfg(feature="pybindings")]
113#[pymethods]
114impl TrackerDAQEvent {
115
116  #[getter]
117  fn get_layer(&self) -> u8 {
118    self.layer 
119  }
120
121  #[getter] 
122  fn get_flags1(&self) -> u8 {
123    self.flags1 
124  }
125
126  #[getter]
127  fn get_event_id(&self) -> u32 {
128    self.event_id
129  }
130
131  #[getter] 
132  fn get_hits(&self) -> Vec<TrackerHit> {
133    self.hits.clone()
134  }
135 
136  #[getter]
137  #[pyo3(name="event_time")]
138  fn get_event_time_py(&self) -> u64 {
139    self.get_event_time()
140  }
141}
142
143#[cfg(feature="pybindings")]
144pythonize!(TrackerDAQEvent);
145