14#ifndef RestCore_TRestSystemOfUnits
15#define RestCore_TRestSystemOfUnits
26#ifdef REST_UnitsAdd_Caller
27#define AddUnit(name, type, scale) double name = _AddUnit(#name, type, scale)
29#define AddUnit(name, type, scale) constexpr double name = scale
36enum Physical_Unit { Energy, Time, Length, Mass, Voltage, MagneticField, Pressure, Angle, NOT_A_UNIT = -1 };
41 std::vector<int> fComponents;
43 std::vector<double> fComponentOrder;
47 double fScaleCombined;
59 std::string ToStandardDefinition();
62 if (
units.fZombie)
return val;
63 return val *
units.fScaleCombined;
67 if (
units.fZombie)
return val;
68 return val /
units.fScaleCombined;
73bool IsUnit(std::string in);
91double _AddUnit(std::string name,
int type,
double scale);
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);
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);
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);
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);
129AddUnit(mV, REST_Units::Voltage, 1.e3);
130AddUnit(V, REST_Units::Voltage, 1.);
131AddUnit(kV, REST_Units::Voltage, 1.e-3);
134AddUnit(mT, REST_Units::MagneticField, 1.e3);
135AddUnit(T, REST_Units::MagneticField, 1.);
136AddUnit(G, REST_Units::MagneticField, 1.e4);
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);
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.);
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.