SHiP Data Model
Event data model for the SHiP experiment: C++ data classes with ROOT dictionary support.
Loading...
Searching...
No Matches
Units.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <mp-units/systems/hep.h> // exports framework.h; includes systems/si.h
4
5#include <array>
6
18namespace ship {
19
20namespace units {
21
22// Length
23inline constexpr auto mm = mp_units::si::milli<mp_units::si::metre>;
24inline constexpr auto cm = mp_units::si::centi<mp_units::si::metre>;
25inline constexpr auto m = mp_units::si::metre;
26
27// Time
28inline constexpr auto ns = mp_units::si::nano<mp_units::si::second>;
29inline constexpr auto s = mp_units::si::second;
30
31// Angle
32inline constexpr auto rad = mp_units::si::radian;
33
34// Energy
35inline constexpr auto MeV = mp_units::hep::unit_symbols::MeV;
36inline constexpr auto GeV = mp_units::hep::unit_symbols::GeV;
37
38// Speed of light as a named unit ("c", exact by SI definition). Building
39// momentum, mass and time-of-flight units from it keeps every conversion
40// factor derived rather than hand-typed.
41inline constexpr auto c = mp_units::hep::speed_of_light;
42
43// Momentum and mass
44inline constexpr auto GeV_per_c = GeV / c;
45inline constexpr auto GeV_per_c2 = GeV / mp_units::square(c);
46
47// Time of flight per unit length (Pythia8 production time, lifetime cuts)
48inline constexpr auto mm_per_c = mm / c;
49
50// Magnetic flux density
51inline constexpr auto tesla = mp_units::si::tesla;
52
53} // namespace units
54
56using Length = mp_units::quantity<units::mm, double>;
57using Time = mp_units::quantity<units::ns, double>;
58using Energy = mp_units::quantity<units::GeV, double>;
59using Momentum = mp_units::quantity<units::GeV_per_c, double>;
60using Mass = mp_units::quantity<units::GeV_per_c2, double>;
61using Angle = mp_units::quantity<units::rad, double>;
62using MagneticField = mp_units::quantity<units::tesla, double>;
63
64template <typename Q>
65using Vec3 = std::array<Q, 3>;
66
68template <typename Q>
69[[nodiscard]] constexpr Q quantityOf(double v) {
70 return v * Q::reference;
71}
72
74template <typename Q>
75[[nodiscard]] constexpr double raw(Q q) {
76 return q.numerical_value_in(Q::unit);
77}
78
80template <typename Q>
81[[nodiscard]] constexpr Vec3<Q> vecOf(std::array<double, 3> const& v) {
82 return {v[0] * Q::reference, v[1] * Q::reference, v[2] * Q::reference};
83}
84
86template <typename Q>
87[[nodiscard]] constexpr std::array<double, 3> raw(Vec3<Q> const& v) {
88 return {v[0].numerical_value_in(Q::unit), v[1].numerical_value_in(Q::unit),
89 v[2].numerical_value_in(Q::unit)};
90}
91
92} // namespace ship
constexpr auto MeV
Definition Units.hpp:35
constexpr auto s
Definition Units.hpp:29
constexpr auto cm
Definition Units.hpp:24
constexpr auto GeV_per_c2
Definition Units.hpp:45
constexpr auto GeV
Definition Units.hpp:36
constexpr auto ns
Definition Units.hpp:28
constexpr auto mm
Definition Units.hpp:23
constexpr auto GeV_per_c
Definition Units.hpp:44
constexpr auto m
Definition Units.hpp:25
constexpr auto c
Definition Units.hpp:41
constexpr auto mm_per_c
Definition Units.hpp:48
constexpr auto tesla
Definition Units.hpp:51
constexpr auto rad
Definition Units.hpp:32
Canonical ShipSoft unit vocabulary.
Definition QuantityView.hpp:15
mp_units::quantity< units::rad, double > Angle
Definition Units.hpp:61
mp_units::quantity< units::mm, double > Length
Canonical quantity types: double representation, storage unit baked in.
Definition Units.hpp:56
mp_units::quantity< units::GeV, double > Energy
Definition Units.hpp:58
mp_units::quantity< units::tesla, double > MagneticField
Definition Units.hpp:62
mp_units::quantity< units::GeV_per_c, double > Momentum
Definition Units.hpp:59
std::array< Q, 3 > Vec3
Definition Units.hpp:65
constexpr Q quantityOf(double v)
Wrap a raw scalar, interpreting it in Q's canonical unit (bitwise).
Definition Units.hpp:69
constexpr Vec3< Q > vecOf(std::array< double, 3 > const &v)
Wrap a raw 3-vector, interpreting it in Q's canonical unit (bitwise).
Definition Units.hpp:81
constexpr double raw(Q q)
Unwrap a scalar quantity to a raw double in Q's canonical unit (bitwise).
Definition Units.hpp:75
mp_units::quantity< units::ns, double > Time
Definition Units.hpp:57
mp_units::quantity< units::GeV_per_c2, double > Mass
Definition Units.hpp:60