REST-for-Physics  v2.3
Rare Event Searches ToolKit for Physics
TRestSystemOfUnits.h
1
13
14#ifndef RestCore_TRestSystemOfUnits
15#define RestCore_TRestSystemOfUnits
16
17#include <TMath.h>
18#include <TString.h>
19#include <TVector2.h>
20#include <TVector3.h>
21
22#include <iostream>
23#include <map>
24#include <string>
25
26#ifdef REST_UnitsAdd_Caller
27#define AddUnit(name, type, scale) double name = _AddUnit(#name, type, scale)
28#else
29#define AddUnit(name, type, scale) constexpr double name = scale
30#endif
31
33namespace REST_Units {
34
35// We use more common physics units instead of SI unit
36enum Physical_Unit { Energy, Time, Length, Mass, Voltage, MagneticField, Pressure, Angle, NOT_A_UNIT = -1 };
37
39 private:
40 // stores a list of base units for composite units
41 std::vector<int> fComponents;
42 // stores a list of units order for composite units
43 std::vector<double> fComponentOrder;
44
45 Bool_t fZombie;
46
47 double fScaleCombined;
48
50 int GetUnitType(std::string singleUnit);
52 double GetUnitScale(std::string singleUnit);
53
54 public:
56 TRestSystemOfUnits(std::string unitsStr);
58 bool IsZombie() const { return fZombie; }
59 std::string ToStandardDefinition();
60
61 friend Double_t operator*(const Double_t& val, const TRestSystemOfUnits& units) {
62 if (units.fZombie) return val;
63 return val * units.fScaleCombined;
64 }
65
66 friend Double_t operator/(const Double_t& val, const TRestSystemOfUnits& units) {
67 if (units.fZombie) return val;
68 return val / units.fScaleCombined;
69 }
70};
71
72bool IsBasicUnit(std::string in);
73bool IsUnit(std::string in);
74
75double GetScaleToStandardUnit(std::string unitsdef);
76std::string GetStandardUnitDefinition(std::string unitsdef);
77std::string FindRESTUnitsInString(std::string InString);
78std::string RemoveUnitsFromString(std::string s);
79Double_t ConvertValueToRESTUnits(Double_t value, std::string unitsStr);
80Double_t ConvertRESTUnitsValueToCustomUnits(Double_t value, std::string unitsStr);
81
82Double_t GetDblValueInString(std::string in);
83TVector2 Get2DVectorValueInString(std::string in);
84TVector3 Get3DVectorValueInString(std::string in);
85
86Double_t GetValueInRESTUnits(std::string in);
87Double_t GetDblValueInRESTUnits(std::string in);
88TVector2 Get2DVectorInRESTUnits(std::string in);
89TVector3 Get3DVectorInRESTUnits(std::string in);
90
91double _AddUnit(std::string name, int type, double scale);
92
93// energy unit multiplier
94AddUnit(meV, REST_Units::Energy, 1e6);
95AddUnit(eV, REST_Units::Energy, 1e3);
96AddUnit(keV, REST_Units::Energy, 1);
97AddUnit(MeV, REST_Units::Energy, 1e-3);
98AddUnit(GeV, REST_Units::Energy, 1e-6);
99AddUnit(J, REST_Units::Energy, 1.60e-19);
100AddUnit(kJ, REST_Units::Energy, 1.60e-22);
101
102// time unit multiplier
103AddUnit(ns, REST_Units::Time, 1.e3);
104AddUnit(us, REST_Units::Time, 1.);
105AddUnit(ms, REST_Units::Time, 1.e-3);
106AddUnit(s, REST_Units::Time, 1.e-6);
107AddUnit(Hz, REST_Units::Time, 1.e6);
108AddUnit(minu, REST_Units::Time, 1.67e-8);
109AddUnit(hr, REST_Units::Time, 2.78e-10);
110AddUnit(day, REST_Units::Time, 1.16e-11);
111AddUnit(mon, REST_Units::Time, 3.85e-13);
112AddUnit(yr, REST_Units::Time, 3.17e-14);
113
114// length unit multiplier
115AddUnit(nm, REST_Units::Length, 1e6);
116AddUnit(um, REST_Units::Length, 1e3);
117AddUnit(mm, REST_Units::Length, 1.);
118AddUnit(cm, REST_Units::Length, 1e-1);
119AddUnit(m, REST_Units::Length, 1e-3);
120
121// mass unit multiplier
122AddUnit(mg, REST_Units::Mass, 1e6);
123AddUnit(gram, REST_Units::Mass, 1e3);
124AddUnit(g, REST_Units::Mass, 1e3);
125AddUnit(kg, REST_Units::Mass, 1.);
126AddUnit(ton, REST_Units::Mass, 1e-3);
127
128// voltage unit multiplier
129AddUnit(mV, REST_Units::Voltage, 1.e3);
130AddUnit(V, REST_Units::Voltage, 1.);
131AddUnit(kV, REST_Units::Voltage, 1.e-3);
132
133// magnetic field unit multiplier
134AddUnit(mT, REST_Units::MagneticField, 1.e3);
135AddUnit(T, REST_Units::MagneticField, 1.);
136AddUnit(G, REST_Units::MagneticField, 1.e4);
137
138// pressure field unit multiplier
139AddUnit(bar, REST_Units::Pressure, 1.);
140AddUnit(mbar, REST_Units::Pressure, 1.e3);
141AddUnit(atm, REST_Units::Pressure, 1.013);
142AddUnit(torr, REST_Units::Pressure, 760);
143AddUnit(MPa, REST_Units::Pressure, 0.101325);
144AddUnit(kPa, REST_Units::Pressure, 101.325);
145AddUnit(Pa, REST_Units::Pressure, 101325);
146AddUnit(mPa, REST_Units::Pressure, 10132500);
147
148// angle unit multiplier
149AddUnit(rad, REST_Units::Angle, 1.);
150AddUnit(radian, REST_Units::Angle, 1.);
151AddUnit(radians, REST_Units::Angle, 1.);
152AddUnit(deg, REST_Units::Angle, TMath::RadToDeg());
153AddUnit(degree, REST_Units::Angle, TMath::RadToDeg());
154AddUnit(degrees, REST_Units::Angle, TMath::RadToDeg());
155AddUnit(arcmin, REST_Units::Angle, TMath::RadToDeg() * 60.);
156AddUnit(arcsec, REST_Units::Angle, TMath::RadToDeg() * 3600.);
157} // namespace REST_Units
158
160
161#endif
double GetUnitScale(std::string singleUnit)
Get the scale of the unit to convert to the REST standard units.
TRestSystemOfUnits(std::string unitsStr)
Constructor from a unit std::string.
int GetUnitType(std::string singleUnit)
Get the type of the units.
bool IsZombie() const
Whether this unit is zombie(invalid)
This namespace defines the unit conversion for different units which are understood by REST.
bool IsBasicUnit(std::string in)
Checks if the string is a REST basic unit.
Double_t GetValueInRESTUnits(std::string in)
It scales a physics measurement with its units into a REST default units value.
TVector3 Get3DVectorInRESTUnits(std::string in)
It scales a physics measurement with its units into a REST default units value.
Double_t GetDblValueInString(std::string in)
It scales a physics measurement with its units into a REST default units value.
double GetScaleToStandardUnit(std::string unitsdef)
Get the scale to REST standard unit. scale (unitsdef) = 1 (standard unit)
Double_t ConvertRESTUnitsValueToCustomUnits(Double_t value, std::string unitsStr)
Convert value with REST units into the given custom units.
std::string FindRESTUnitsInString(std::string InString)
Find and return the units definition in a string.
Double_t GetDblValueInRESTUnits(std::string in)
It scales a physics measurement with its units into a REST default units value.
std::string GetStandardUnitDefinition(std::string unitsdef)
Get standard form of this unit definition.
bool IsUnit(std::string in)
Checks if the string is a REST supported unit.
TVector2 Get2DVectorInRESTUnits(std::string in)
It scales a physics measurement with its units into a REST default units value.
Double_t ConvertValueToRESTUnits(Double_t value, std::string unitsStr)
Convert value into REST units.
TVector3 Get3DVectorValueInString(std::string in)
It scales a physics measurement with its units into a REST default units value.
TVector2 Get2DVectorValueInString(std::string in)
It scales a physics measurement with its units into a REST default units value.
std::string RemoveUnitsFromString(std::string s)
It should remove all units found inside the input string.
double _AddUnit(std::string name, int type, double scale)
Add a unit with given name, type and scale.