Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4UnitsTable.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// G4UnitsTable
27//
28// Class description:
29//
30// This class maintains a table of Units.
31// A Unit has a name, a symbol, a value and belong to a category (i.e. its
32// dimensional definition): Length, Time, Energy, etc...
33// The Units are grouped by category. The TableOfUnits is a list of categories.
34// The class G4BestUnit allows to convert automaticaly a physical quantity
35// from its internal value into the most appropriate Unit of the same category.
36
37// Author: M.Maire, 17.05.1998 - First version
38// Revisions: G.Cosmo, 06.03.2001 - Migrated to STL vectors
39// --------------------------------------------------------------------
40#ifndef G4UnitsTable_hh
41#define G4UnitsTable_hh 1
42
43#include <vector>
44
45#include "G4ThreeVector.hh"
46#include "globals.hh"
47
48class G4UnitsCategory;
50
51// --------------------------------------------------------------------
52
53#ifdef G4MULTITHREADED
54
55class G4UnitsTable : public std::vector<G4UnitsCategory*>
56{
57 public:
58 using std::vector<G4UnitsCategory*>::vector;
59 G4UnitsTable() = default;
61
62 public:
63 void Synchronize();
64 G4bool Contains(const G4UnitDefinition*, const G4String&);
65};
66#else
67
68using G4UnitsTable = std::vector<G4UnitsCategory*>;
69
70#endif
71
72// --------------------------------------------------------------------
73
75{
76 public:
77 G4UnitDefinition(const G4String& name, const G4String& symbol,
78 const G4String& category, G4double value);
79
80 ~G4UnitDefinition() = default;
83
84 inline const G4String& GetName() const;
85 inline const G4String& GetSymbol() const;
86 inline G4double GetValue() const;
87
88 void PrintDefinition();
89
90 static void BuildUnitsTable();
91 static void PrintUnitsTable();
92 static void ClearUnitsTable();
93
95
96 static G4bool IsUnitDefined(const G4String&);
97 static G4double GetValueOf(const G4String&);
98 static G4String GetCategory(const G4String&);
99
100 private:
102 G4UnitDefinition& operator=(const G4UnitDefinition&);
103
104 private:
105 G4String Name; // SI name
106 G4String SymbolName; // SI symbol
107 G4double Value = 0.0; // value in the internal system of units
108
109 static G4ThreadLocal G4UnitsTable* pUnitsTable; // table of Units
110 static G4ThreadLocal G4bool unitsTableDestroyed;
111
112 std::size_t CategoryIndex = 0; // category index of this unit
113
114#ifdef G4MULTITHREADED
115 static G4UnitsTable* pUnitsTableShadow; // shadow of table of Units
116
117 public:
118 inline static G4UnitsTable& GetUnitsTableShadow()
119 {
120 return *pUnitsTableShadow;
121 }
122#endif
123};
124
125// --------------------------------------------------------------------
126
127using G4UnitsContainer = std::vector<G4UnitDefinition*>;
128
130{
131 public:
132 explicit G4UnitsCategory(const G4String& name);
134 G4bool operator==(const G4UnitsCategory&) const;
135 G4bool operator!=(const G4UnitsCategory&) const;
136
137 inline const G4String& GetName() const;
139 inline G4int GetNameMxLen() const;
140 inline G4int GetSymbMxLen() const;
141 inline void UpdateNameMxLen(G4int len);
142 inline void UpdateSymbMxLen(G4int len);
143 void PrintCategory();
144
145 private:
147 G4UnitsCategory& operator=(const G4UnitsCategory&);
148
149 private:
150 G4String Name; // dimensional family: Length,Volume,Energy
151 G4UnitsContainer UnitsList; // List of units in this family
152 G4int NameMxLen = 0; // max length of the units name
153 G4int SymbMxLen = 0; // max length of the units symbol
154};
155
156// --------------------------------------------------------------------
157
159{
160 public:
161 G4BestUnit(G4double internalValue, const G4String& category);
162 G4BestUnit(const G4ThreeVector& internalValue, const G4String& category);
163 // These constructors convert a physical quantity from its internalValue
164 // into the most appropriate unit of the same category.
165 // In practice it builds an object VU = (newValue, newUnit)
166
167 ~G4BestUnit() = default;
168
170 inline const G4String& GetCategory() const;
171 inline std::size_t GetIndexOfCategory() const;
172 operator G4String() const; // Conversion to best string.
173
174 friend std::ostream& operator<<(std::ostream&, const G4BestUnit& VU);
175 // Default format to print the objet VU above.
176
177 private:
178 G4double Value[3]; // value in the internal system of units
179 G4int nbOfVals = 0; // G4double=1; G4ThreeVector=3
180 G4String Category; // dimensional family: Length,Volume,Energy ...
181 std::size_t IndexOfCategory = 0; // position of Category in UnitsTable
182};
183
184#include "G4UnitsTable.icc"
185
186#endif
std::ostream & operator<<(std::ostream &out, const G4CellScoreComposer &ps)
#define G4BestUnit(a, b)
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
std::vector< G4UnitDefinition * > G4UnitsContainer
std::vector< G4UnitsCategory * > G4UnitsTable
Definition: G4UnitsTable.hh:68
G4double * GetValue()
const G4String & GetCategory() const
~G4BestUnit()=default
std::size_t GetIndexOfCategory() const
static G4bool IsUnitDefined(const G4String &)
static void ClearUnitsTable()
~G4UnitDefinition()=default
G4bool operator!=(const G4UnitDefinition &) const
G4bool operator==(const G4UnitDefinition &) const
static void BuildUnitsTable()
G4double GetValue() const
static G4double GetValueOf(const G4String &)
static G4String GetCategory(const G4String &)
static void PrintUnitsTable()
const G4String & GetName() const
static G4UnitsTable & GetUnitsTable()
const G4String & GetSymbol() const
const G4String & GetName() const
void UpdateSymbMxLen(G4int len)
G4UnitsContainer & GetUnitsList()
G4bool operator!=(const G4UnitsCategory &) const
void UpdateNameMxLen(G4int len)
G4int GetNameMxLen() const
G4int GetSymbMxLen() const
G4bool operator==(const G4UnitsCategory &) const
#define G4ThreadLocal
Definition: tls.hh:77