CMS 3D CMS Logo

ALIUnitsTable.cc
Go to the documentation of this file.
1 
3 #include "CLHEP/Units/GlobalSystemOfUnits.h"
4 
5 #include <iomanip>
6 #include <cstdlib>
7 #include <cmath> // include floating-point std::abs functions
8 
10 
11 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
12 
14  : Name(name), SymbolName(symbol), Value(value) {
15  //
16  //does the Category objet already exist ?
17  size_t nbCat = theUnitsTable.size();
18  size_t i = 0;
19  while ((i < nbCat) && (theUnitsTable[i]->GetName() != category))
20  i++;
21  if (i == nbCat)
22  theUnitsTable.push_back(new ALIUnitsCategory(category));
23  CategoryIndex = i;
24  //
25  //insert this Unit in the Unitstable
26  (theUnitsTable[CategoryIndex]->GetUnitsList()).emplace_back(shared_from_this());
27 
28  //update ALIstring max length for name and symbol
29  theUnitsTable[i]->UpdateNameMxLen((ALIint)name.length());
30  theUnitsTable[i]->UpdateSymbMxLen((ALIint)symbol.length());
31 }
32 
33 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
34 
36 
37 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
38 
40  : std::enable_shared_from_this<ALIUnitDefinition>(right) {
41  *this = right;
42 }
43 
44 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
45 
47  if (this != &right) {
48  Name = right.Name;
49  SymbolName = right.SymbolName;
50  Value = right.Value;
52  }
53  return *this;
54 }
55 
56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
57 
58 ALIint ALIUnitDefinition::operator==(const ALIUnitDefinition& right) const { return (this == &right); }
59 
60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
61 
62 ALIint ALIUnitDefinition::operator!=(const ALIUnitDefinition& right) const { return (this != &right); }
63 
64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
66  if (theUnitsTable.empty())
68  ALIstring name, symbol;
69  for (size_t i = 0; i < theUnitsTable.size(); i++) {
70  ALIUnitsContainer& units = theUnitsTable[i]->GetUnitsList();
71  for (size_t j = 0; j < units.size(); j++) {
72  name = units[j]->GetName();
73  symbol = units[j]->GetSymbol();
74  if (stri == name || stri == symbol)
75  return units[j]->GetValue();
76  }
77  }
78  std::cout << "Warning from ALIUnitDefinition::GetValueOf(" << stri << ")."
79  << " The unit " << stri << " does not exist in UnitsTable."
80  << " Return Value = 0." << std::endl;
81  return 0.;
82 }
83 
84 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
85 
87  if (theUnitsTable.empty())
89  ALIstring name, symbol;
90  for (size_t i = 0; i < theUnitsTable.size(); i++) {
91  ALIUnitsContainer& units = theUnitsTable[i]->GetUnitsList();
92  for (size_t j = 0; j < units.size(); j++) {
93  name = units[j]->GetName();
94  symbol = units[j]->GetSymbol();
95  if (stri == name || stri == symbol)
96  return theUnitsTable[i]->GetName();
97  }
98  }
99  std::cout << "Warning from ALIUnitDefinition::GetCategory(" << stri << ")."
100  << " The unit " << stri << " does not exist in UnitsTable."
101  << " Return category = None" << std::endl;
102  name = "None";
103  return name;
104 }
105 
106 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
107 
109  ALIint nameL = theUnitsTable[CategoryIndex]->GetNameMxLen();
110  ALIint symbL = theUnitsTable[CategoryIndex]->GetSymbMxLen();
111  std::cout << std::setw(nameL) << Name << " (" << std::setw(symbL) << SymbolName << ") = " << Value << std::endl;
112 }
113 
114 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
115 
117  //Length
118  std::make_shared<ALIUnitDefinition>("kilometer", "km", "Length", kilometer);
119  std::make_shared<ALIUnitDefinition>("meter", "m", "Length", meter);
120  std::make_shared<ALIUnitDefinition>("centimeter", "cm", "Length", centimeter);
121  std::make_shared<ALIUnitDefinition>("millimeter", "mm", "Length", millimeter);
122  std::make_shared<ALIUnitDefinition>("micrometer", "mum", "Length", micrometer);
123  std::make_shared<ALIUnitDefinition>("nanometer", "nm", "Length", nanometer);
124  std::make_shared<ALIUnitDefinition>("angstrom", "Ang", "Length", angstrom);
125  std::make_shared<ALIUnitDefinition>("fermi", "fm", "Length", fermi);
126 
127  //Surface
128  std::make_shared<ALIUnitDefinition>("kilometer2", "km2", "Surface", kilometer2);
129  std::make_shared<ALIUnitDefinition>("meter2", "m2", "Surface", meter2);
130  std::make_shared<ALIUnitDefinition>("centimeter2", "cm2", "Surface", centimeter2);
131  std::make_shared<ALIUnitDefinition>("millimeter2", "mm2", "Surface", millimeter2);
132  std::make_shared<ALIUnitDefinition>("barn", "barn", "Surface", barn);
133  std::make_shared<ALIUnitDefinition>("millibarn", "mbarn", "Surface", millibarn);
134  std::make_shared<ALIUnitDefinition>("microbarn", "mubarn", "Surface", microbarn);
135  std::make_shared<ALIUnitDefinition>("nanobarn", "nbarn", "Surface", nanobarn);
136  std::make_shared<ALIUnitDefinition>("picobarn", "pbarn", "Surface", picobarn);
137 
138  //Volume
139  std::make_shared<ALIUnitDefinition>("kilometer3", "km3", "Volume", kilometer3);
140  std::make_shared<ALIUnitDefinition>("meter3", "m3", "Volume", meter3);
141  std::make_shared<ALIUnitDefinition>("centimeter3", "cm3", "Volume", centimeter3);
142  std::make_shared<ALIUnitDefinition>("millimeter3", "mm3", "Volume", millimeter3);
143 
144  //Angle
145  std::make_shared<ALIUnitDefinition>("radian", "rad", "Angle", radian);
146  std::make_shared<ALIUnitDefinition>("milliradian", "mrad", "Angle", milliradian);
147  std::make_shared<ALIUnitDefinition>("milliradian", "murad", "Angle", 0.001 * milliradian);
148  std::make_shared<ALIUnitDefinition>("steradian", "sr", "Angle", steradian);
149  std::make_shared<ALIUnitDefinition>("degree", "deg", "Angle", degree);
150 
151  //Time
152  std::make_shared<ALIUnitDefinition>("second", "s", "Time", second);
153  std::make_shared<ALIUnitDefinition>("millisecond", "ms", "Time", millisecond);
154  std::make_shared<ALIUnitDefinition>("microsecond", "mus", "Time", microsecond);
155  std::make_shared<ALIUnitDefinition>("nanosecond", "ns", "Time", nanosecond);
156  std::make_shared<ALIUnitDefinition>("picosecond", "ps", "Time", picosecond);
157 
158  //Frequency
159  std::make_shared<ALIUnitDefinition>("hertz", "Hz", "Frequency", hertz);
160  std::make_shared<ALIUnitDefinition>("kilohertz", "kHz", "Frequency", kilohertz);
161  std::make_shared<ALIUnitDefinition>("megahertz", "MHz", "Frequency", megahertz);
162 
163  //Electric charge
164  std::make_shared<ALIUnitDefinition>("eplus", "e+", "Electric charge", eplus);
165  std::make_shared<ALIUnitDefinition>("coulomb", "C", "Electric charge", coulomb);
166 
167  //Energy
168  std::make_shared<ALIUnitDefinition>("electronvolt", "eV", "Energy", electronvolt);
169  std::make_shared<ALIUnitDefinition>("kiloelectronvolt", "keV", "Energy", kiloelectronvolt);
170  std::make_shared<ALIUnitDefinition>("megaelectronvolt", "MeV", "Energy", megaelectronvolt);
171  std::make_shared<ALIUnitDefinition>("gigaelectronvolt", "GeV", "Energy", gigaelectronvolt);
172  std::make_shared<ALIUnitDefinition>("teraelectronvolt", "TeV", "Energy", teraelectronvolt);
173  std::make_shared<ALIUnitDefinition>("petaelectronvolt", "PeV", "Energy", petaelectronvolt);
174  std::make_shared<ALIUnitDefinition>("joule", "J", "Energy", joule);
175 
176  //Mass
177  std::make_shared<ALIUnitDefinition>("milligram", "mg", "Mass", milligram);
178  std::make_shared<ALIUnitDefinition>("gram", "g", "Mass", gram);
179  std::make_shared<ALIUnitDefinition>("kilogram", "kg", "Mass", kilogram);
180 
181  //Volumic Mass
182  std::make_shared<ALIUnitDefinition>("g/cm3", "g/cm3", "Volumic Mass", g / cm3);
183  std::make_shared<ALIUnitDefinition>("mg/cm3", "mg/cm3", "Volumic Mass", mg / cm3);
184  std::make_shared<ALIUnitDefinition>("kg/m3", "kg/m3", "Volumic Mass", kg / m3);
185 
186  //Power
187  std::make_shared<ALIUnitDefinition>("watt", "W", "Power", watt);
188 
189  //Force
190  std::make_shared<ALIUnitDefinition>("newton", "N", "Force", newton);
191 
192  //Pressure
193  std::make_shared<ALIUnitDefinition>("pascal", "Pa", "Pressure", pascal);
194  std::make_shared<ALIUnitDefinition>("bar", "bar", "Pressure", bar);
195  std::make_shared<ALIUnitDefinition>("atmosphere", "atm", "Pressure", atmosphere);
196 
197  //Electric current
198  std::make_shared<ALIUnitDefinition>("ampere", "A", "Electric current", ampere);
199  std::make_shared<ALIUnitDefinition>("milliampere", "mA", "Electric current", milliampere);
200  std::make_shared<ALIUnitDefinition>("microampere", "muA", "Electric current", microampere);
201  std::make_shared<ALIUnitDefinition>("nanoampere", "nA", "Electric current", nanoampere);
202 
203  //Electric potential
204  std::make_shared<ALIUnitDefinition>("volt", "V", "Electric potential", volt);
205  std::make_shared<ALIUnitDefinition>("kilovolt", "kV", "Electric potential", kilovolt);
206  std::make_shared<ALIUnitDefinition>("megavolt", "MV", "Electric potential", megavolt);
207 
208  //Magnetic flux
209  std::make_shared<ALIUnitDefinition>("weber", "Wb", "Magnetic flux", weber);
210 
211  //Magnetic flux density
212  std::make_shared<ALIUnitDefinition>("tesla", "T", "Magnetic flux density", tesla);
213  std::make_shared<ALIUnitDefinition>("kilogauss", "kG", "Magnetic flux density", kilogauss);
214  std::make_shared<ALIUnitDefinition>("gauss", "G", "Magnetic flux density", gauss);
215 
216  //Temperature
217  std::make_shared<ALIUnitDefinition>("kelvin", "K", "Temperature", kelvin);
218 
219  //Amount of substance
220  std::make_shared<ALIUnitDefinition>("mole", "mol", "Amount of substance", mole);
221 
222  //Activity
223  std::make_shared<ALIUnitDefinition>("becquerel", "Bq", "Activity", becquerel);
224  std::make_shared<ALIUnitDefinition>("curie", "Ci", "Activity", curie);
225 
226  //Dose
227  std::make_shared<ALIUnitDefinition>("gray", "Gy", "Dose", gray);
228 }
229 
230 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
231 
233  std::cout << "\n ----- The Table of Units ----- \n";
234  for (size_t i = 0; i < theUnitsTable.size(); i++)
235  theUnitsTable[i]->PrintCategory();
236 }
237 
238 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
239 
240 ALIUnitsCategory::ALIUnitsCategory(ALIstring name) : Name(name), NameMxLen(0), SymbMxLen(0) {
241  UnitsList = *(new ALIUnitsContainer);
242 }
243 
244 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
245 
247 
248 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
249 
251 
252 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
253 
255  if (this != &right) {
256  Name = right.Name;
257  UnitsList = right.UnitsList;
258  NameMxLen = right.NameMxLen;
259  SymbMxLen = right.SymbMxLen;
260  }
261  return *this;
262 }
263 
264 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
265 
266 ALIint ALIUnitsCategory::operator==(const ALIUnitsCategory& right) const { return (this == &right); }
267 
268 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
269 
270 ALIint ALIUnitsCategory::operator!=(const ALIUnitsCategory& right) const { return (this != &right); }
271 
272 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
273 
275  std::cout << "\n category: " << Name << std::endl;
276  for (size_t i = 0; i < UnitsList.size(); i++)
277  UnitsList[i]->PrintDefinition();
278 }
279 
280 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
281 
283  // find the category
285  size_t nbCat = theUnitsTable.size();
286  size_t i = 0;
287  while ((i < nbCat) && (theUnitsTable[i]->GetName() != category))
288  i++;
289  if (i == nbCat) {
290  std::cout << " ALIBestUnit: the category " << category << " does not exist !!" << std::endl;
291  std::cerr << "Missing unit category !" << std::endl;
292  abort();
293  }
294  //
295  IndexOfCategory = i;
296  nbOfVals = 1;
297  Value[0] = value;
298  Value[1] = 0.;
299  Value[2] = 0.;
300 }
301 
302 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
303 
304 ALIBestUnit::ALIBestUnit(const CLHEP::Hep3Vector& value, ALIstring category) {
305  // find the category
307  size_t nbCat = theUnitsTable.size();
308  size_t i = 0;
309  while ((i < nbCat) && (theUnitsTable[i]->GetName() != category))
310  i++;
311  if (i == nbCat) {
312  std::cerr << " ALIBestUnit: the category " << category << " does not exist." << std::endl;
313  std::cerr << "Unit category not existing !" << std::endl;
314  abort();
315  }
316  //
317  IndexOfCategory = i;
318  nbOfVals = 3;
319  Value[0] = value.x();
320  Value[1] = value.y();
321  Value[2] = value.z();
322 }
323 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
324 
326 
327 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
328 
329 std::ostream& operator<<(std::ostream& flux, ALIBestUnit a) {
331  ALIUnitsContainer& List = theUnitsTable[a.IndexOfCategory]->GetUnitsList();
332  ALIint len = theUnitsTable[a.IndexOfCategory]->GetSymbMxLen();
333 
334  ALIint ksup(-1), kinf(-1);
335  ALIdouble umax(0.), umin(1.E12);
336  ALIdouble rsup(1.E12), rinf(0.);
337 
338  //for a ThreeVector, choose the best unit for the biggest value
339  ALIdouble value = std::max(std::max(std::abs(a.Value[0]), std::abs(a.Value[1])), std::abs(a.Value[2]));
340 
341  for (size_t k = 0; k < List.size(); k++) {
342  ALIdouble unit = List[k]->GetValue();
343  if (value == 1.E12) {
344  if (unit > umax) {
345  umax = unit;
346  ksup = k;
347  }
348  } else if (value <= -1.E12) {
349  if (unit < umin) {
350  umin = unit;
351  kinf = k;
352  }
353  }
354 
355  else {
357  if ((ratio >= 1.) && (ratio < rsup)) {
358  rsup = ratio;
359  ksup = k;
360  }
361  if ((ratio < 1.) && (ratio > rinf)) {
362  rinf = ratio;
363  kinf = k;
364  }
365  }
366  }
367 
368  ALIint index = ksup;
369  if (index == -1)
370  index = kinf;
371  if (index == -1)
372  index = 0;
373 
374  for (ALIint j = 0; j < a.nbOfVals; j++) {
375  flux << a.Value[j] / (List[index]->GetValue()) << " ";
376  }
377 
378 #ifdef ALIUSE_STD_NAMESPACE
379  std::ios::fmtflags oldform = std::cout.flags();
380 #else
381  // ALIint oldform = std::cout.flags();
382 #endif
383 
384  flux.setf(std::ios::left, std::ios::adjustfield);
385  flux << std::setw(len) << List[index]->GetSymbol();
386  //?? flux.flags(oldform);
387 
388  return flux;
389 }
390 
391 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
long double ALIdouble
Definition: CocoaGlobals.h:11
ALIint operator!=(const ALIUnitsCategory &) const
ALIint operator!=(const ALIUnitDefinition &) const
std::ostream & operator<<(std::ostream &flux, ALIBestUnit a)
std::vector< ALIUnitsCategory * > ALIUnitsTable
Definition: ALIUnitsTable.h:47
ALIUnitDefinition & operator=(const ALIUnitDefinition &)
ALIstring SymbolName
Definition: ALIUnitsTable.h:82
constexpr double joule(6.24150e+12)
ALIBestUnit(ALIdouble internalValue, ALIstring category)
int ALIint
Definition: CocoaGlobals.h:15
ALIUnitDefinition(ALIstring name, ALIstring symbol, ALIstring category, ALIdouble value)
static ALIstring GetCategory(ALIstring)
ALIint nbOfVals
ALIUnitsContainer UnitsList
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
U second(std::pair< T, U > const &p)
ALIint operator==(const ALIUnitDefinition &) const
ALIUnitsCategory & operator=(const ALIUnitsCategory &)
static void PrintUnitsTable()
ALIstring GetName() const
Definition: ALIUnitsTable.h:66
size_t IndexOfCategory
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
ALIUnitsCategory(ALIstring name)
reco::JetExtendedAssociation::JetExtendedData Value
static void BuildUnitsTable()
ALIdouble Value[3]
Definition: value.py:1
Basic3DVector unit() const
std::vector< std::shared_ptr< ALIUnitDefinition > > ALIUnitsContainer
Definition: ALIUnitsTable.h:92
ALIint operator==(const ALIUnitsCategory &) const
static ALIdouble GetValueOf(ALIstring)
TString units(TString variable, Char_t axis)
double a
Definition: hdecay.h:119
std::string ALIstring
Definition: CocoaGlobals.h:9
static ALIUnitsTable theUnitsTable
Definition: ALIUnitsTable.h:85
static ALIUnitsTable & GetUnitsTable()
Definition: ALIUnitsTable.h:75