pub struct TofHit {Show 23 fields
pub paddle_id: u8,
pub time_a: f16,
pub time_b: f16,
pub peak_a: f16,
pub peak_b: f16,
pub charge_a: f16,
pub charge_b: f16,
pub reserved: u8,
pub version: ProtocolVersion,
pub baseline_a: f16,
pub baseline_a_rms: f16,
pub baseline_b: f16,
pub baseline_b_rms: f16,
pub phase: f16,
pub paddle_len: f32,
pub timing_offset: f32,
pub coax_cable_time: f32,
pub hart_cable_time: f32,
pub event_t0: f32,
pub x: f32,
pub y: f32,
pub z: f32,
pub valid: bool,
}
Expand description
An extracted hit from a TofPaddle, as extracted by the online software and provided algorithm (in v0.11 algorithm is provided by J.Zweerink)
A TofHit holds the information for an extracted single hit on a peak, which is defined by a peak in at least one of the two waveforms. The TofHit holds extracted information for both of the waveforms, only if both are available a position reconstruction on the paddle can be attempted.
A and B are the different ends of the paddle
Fields§
§paddle_id: u8
The ID of the paddle in TOF notation (1-160)
time_a: f16
§time_b: f16
§peak_a: f16
§peak_b: f16
§charge_a: f16
§charge_b: f16
§reserved: u8
§version: ProtocolVersion
§baseline_a: f16
§baseline_a_rms: f16
§baseline_b: f16
§baseline_b_rms: f16
§phase: f16
§paddle_len: f32
Length of the paddle the hit is on, will get populated from db
timing_offset: f32
(In)famous constant timing offset per paddle
coax_cable_time: f32
§hart_cable_time: f32
§event_t0: f32
normalized t0, where we have the phase difference limited to -pi/2 -> pi/2
x: f32
§y: f32
§z: f32
§valid: bool
Implementations§
Source§impl TofHit
impl TofHit
pub fn new() -> Self
Sourcepub fn add_peak(&mut self, peak: &Peak)
pub fn add_peak(&mut self, peak: &Peak)
Adds an extracted peak to this TofHit. A peak will be for only a single waveform only, so we have to take care of the A/B sorting by means of PaddleEndId
pub fn set_time_b(&mut self, t: f32)
pub fn set_time_a(&mut self, t: f32)
pub fn set_peak_a(&mut self, p: f32)
pub fn set_peak_b(&mut self, p: f32)
pub fn set_charge_a(&mut self, c: f32)
pub fn set_charge_b(&mut self, c: f32)
Source§impl TofHit
impl TofHit
Sourcepub fn distance(&self, other: &TofHit) -> f32
pub fn distance(&self, other: &TofHit) -> f32
Calculate the distance to another hit. For this to work, the hit coordinates have had to be determined, so this will only return a propper result after the paddle information is added
Sourcepub fn obeys_causality(&self) -> bool
pub fn obeys_causality(&self) -> bool
If the two reconstructed pulse times are not related to each other by the paddle length, meaning that they can’t be caused by the same event, we dub this hit as “not following causality”
Source§impl TofHit
impl TofHit
Sourcepub fn get_pos(&self) -> f32
pub fn get_pos(&self) -> f32
Calculate the position across the paddle from the two times at the paddle ends
This will be measured from the A side
Just to be extra clear, this assumes the two sets of cables for each paddle end have the same length
Sourcepub fn get_cable_delay(&self) -> f32
pub fn get_cable_delay(&self) -> f32
Get the cable correction time
Sourcepub fn get_phase_delay(&self) -> f32
pub fn get_phase_delay(&self) -> f32
Get the delay relative to other readoutboards based on the channel9 sine wave
Sourcepub fn get_t0(&self) -> f32
pub fn get_t0(&self) -> f32
That this works, the length of the paddle has to be set before (in mm). This assumes that the cable on both sides of the paddle are the same length
Sourcepub fn get_t0_uncorrected(&self) -> f32
pub fn get_t0_uncorrected(&self) -> f32
Calculate the interaction time based on the peak timings measured at the paddle ends A and B
This does not correct for any cable length or ch9 phase shift
Sourcepub fn get_edep_att(&self) -> f32
pub fn get_edep_att(&self) -> f32
Elena’s energy deposition including attenuation
Sourcepub fn get_time_a(&self) -> f32
pub fn get_time_a(&self) -> f32
Arrival time of the photons at side A
Sourcepub fn get_time_b(&self) -> f32
pub fn get_time_b(&self) -> f32
Arrival time of the photons at side B
pub fn get_peak_a(&self) -> f32
pub fn get_peak_b(&self) -> f32
pub fn get_charge_a(&self) -> f32
pub fn get_charge_b(&self) -> f32
pub fn get_bl_a(&self) -> f32
pub fn get_bl_b(&self) -> f32
pub fn get_bl_a_rms(&self) -> f32
pub fn get_bl_b_rms(&self) -> f32
Sourcepub fn get_pid(paddle_end_id: u16) -> u8
pub fn get_pid(paddle_end_id: u16) -> u8
Get the (official) paddle id
Convert the paddle end id following the convention
A-side : paddle id + 1000 B-side : paddle id + 2000
FIXME - maybe return Result?
pub fn get_phase_rollovers(&self) -> i16
Trait Implementations§
Source§impl Serialization for TofHit
impl Serialization for TofHit
Source§fn to_bytestream(&self) -> Vec<u8> ⓘ
fn to_bytestream(&self) -> Vec<u8> ⓘ
Serialize the packet
Not all fields will get serialized, only the relevant data for the flight computer **A note about protocol versions ** When we serialize (to_bytestream) we will always write the latest version. Deserialization can also read previous versions
Source§fn from_bytestream(
stream: &Vec<u8>,
pos: &mut usize,
) -> Result<Self, SerializationError>
fn from_bytestream( stream: &Vec<u8>, pos: &mut usize, ) -> Result<Self, SerializationError>
Source§const SIZE: usize = 30usize
const SIZE: usize = 30usize
Source§fn verify_fixed(
stream: &Vec<u8>,
pos: &mut usize,
) -> Result<(), SerializationError>
fn verify_fixed( stream: &Vec<u8>, pos: &mut usize, ) -> Result<(), SerializationError>
Source§fn from_bytestream_alt(
bytestream: &Vec<u8>,
pos: &mut usize,
) -> Result<Self, SerializationError>where
Self: Sized,
fn from_bytestream_alt(
bytestream: &Vec<u8>,
pos: &mut usize,
) -> Result<Self, SerializationError>where
Self: Sized,
impl Copy for TofHit
impl StructuralPartialEq for TofHit
Auto Trait Implementations§
impl Freeze for TofHit
impl RefUnwindSafe for TofHit
impl Send for TofHit
impl Sync for TofHit
impl Unpin for TofHit
impl UnwindSafe for TofHit
Blanket Implementations§
Source§impl<T> AggregateExpressionMethods for T
impl<T> AggregateExpressionMethods for T
Source§fn aggregate_distinct(self) -> Self::Outputwhere
Self: DistinctDsl,
fn aggregate_distinct(self) -> Self::Outputwhere
Self: DistinctDsl,
DISTINCT
modifier for aggregate functions Read moreSource§fn aggregate_all(self) -> Self::Outputwhere
Self: AllDsl,
fn aggregate_all(self) -> Self::Outputwhere
Self: AllDsl,
ALL
modifier for aggregate functions Read moreSource§fn aggregate_filter<P>(self, f: P) -> Self::Output
fn aggregate_filter<P>(self, f: P) -> Self::Output
Source§fn aggregate_order<O>(self, o: O) -> Self::Outputwhere
Self: OrderAggregateDsl<O>,
fn aggregate_order<O>(self, o: O) -> Self::Outputwhere
Self: OrderAggregateDsl<O>,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which can then be further
downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoSql for T
impl<T> IntoSql for T
Source§fn into_sql<T>(self) -> Self::Expression
fn into_sql<T>(self) -> Self::Expression
self
to an expression for Diesel’s query builder. Read moreSource§fn as_sql<'a, T>(&'a self) -> <&'a Self as AsExpression<T>>::Expression
fn as_sql<'a, T>(&'a self) -> <&'a Self as AsExpression<T>>::Expression
&self
to an expression for Diesel’s query builder. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.