40G4ThreadLocal std::set<G4String> *G4AttCheck::fUnitCategories = 0;
42G4ThreadLocal std::map<G4String,G4String> *G4AttCheck::fStandardUnits = 0;
51(
const std::vector<G4AttValue>* values,
52 const std::map<G4String,G4AttDef>* definitions):
54 fpDefinitions(definitions)
62 fUnitCategories->insert(
"Length");
63 fUnitCategories->insert(
"Energy");
64 fUnitCategories->insert(
"Time");
65 fUnitCategories->insert(
"Electric charge");
66 fUnitCategories->insert(
"Volumic Mass");
69 (*fStandardUnits)[
"Length"] =
"m";
70 (*fStandardUnits)[
"Energy"] =
"MeV";
71 (*fStandardUnits)[
"Time"] =
"ns";
72 (*fStandardUnits)[
"Electric charge"] =
"e+";
73 (*fStandardUnits)[
"Volumic Mass"] =
"kg/m3";
76 fCategories->insert(
"Bookkeeping");
77 fCategories->insert(
"Draw");
78 fCategories->insert(
"Physics");
79 fCategories->insert(
"PickAction");
80 fCategories->insert(
"Association");
84 fUnits->insert(
"G4BestUnit");
87 for (
size_t i = 0; i < units.size(); ++i) {
88 if (fUnitCategories->find(units[i]->GetName()) !=
89 fUnitCategories->end()) {
92 for (
size_t j = 0; j < container.size(); ++j) {
95 fUnits->insert(container[j]->GetSymbol());
101 fValueTypes->insert(
"G4String");
102 fValueTypes->insert(
"G4int");
103 fValueTypes->insert(
"G4double");
104 fValueTypes->insert(
"G4ThreeVector");
105 fValueTypes->insert(
"G4bool");
113void G4AttCheck::Init()
115 if (!fValueTypes) fValueTypes =
new std::set<G4String>;
116 if (!fUnits) fUnits =
new std::set<G4String>;
117 if (!fCategories) fCategories =
new std::set<G4String>;
118 if (!fStandardUnits) fStandardUnits =
new std::map<G4String,G4String>;
119 if (!fUnitCategories) fUnitCategories =
new std::set<G4String>;
128 if (iError < 10 || iError%100 == 0) {
132 if (!fpValues)
return error;
133 if (!fpDefinitions) {
138 "\n*******************************************************";
143 "\nG4AttCheck: ERROR " << iError <<
": Null definitions pointer"
144 "\n*******************************************************"
149 vector<G4AttValue>::const_iterator iValue;
150 for (iValue = fpValues->begin(); iValue != fpValues->end(); ++iValue) {
151 const G4String& valueName = iValue->GetName();
152 const G4String& value = iValue->GetValue();
153 map<G4String,G4AttDef>::const_iterator iDef =
154 fpDefinitions->find(valueName);
155 if (iDef == fpDefinitions->end()) {
160 "\n*******************************************************";
165 "\nG4AttCheck: ERROR " << iError <<
": No G4AttDef for G4AttValue \""
166 << valueName <<
"\": " << value <<
167 "\n*******************************************************"
171 const G4String& category = iDef->second.GetCategory();
172 const G4String& extra = iDef->second.GetExtra();
173 const G4String& valueType = iDef->second.GetValueType();
174 if (fCategories->find(category) == fCategories->end()) {
179 "\n*******************************************************";
184 "\nG4AttCheck: ERROR " << iError <<
": Illegal Category Field \""
185 << category <<
"\" for G4AttValue \""
186 << valueName <<
"\": " << value <<
187 "\n Possible Categories:";
188 set<G4String>::iterator i;
189 for (i = fCategories->begin(); i != fCategories->end(); ++i) {
193 "\n*******************************************************"
197 if(category ==
"Physics" && fUnits->find(extra) == fUnits->end()) {
202 "\n*******************************************************";
207 "\nG4AttCheck: ERROR " << iError <<
": Illegal Extra field \""
208 << extra <<
"\" for G4AttValue \""
209 << valueName <<
"\": " << value <<
210 "\n Possible Extra fields if Category==\"Physics\":\n ";
211 set<G4String>::iterator i;
212 for (i = fUnits->begin(); i != fUnits->end(); ++i) {
216 "\n*******************************************************"
220 if (fValueTypes->find(valueType) == fValueTypes->end()) {
225 "\n*******************************************************";
230 "\nG4AttCheck: ERROR " << iError <<
": Illegal Value Type field \""
231 << valueType <<
"\" for G4AttValue \""
232 << valueName <<
"\": " << value <<
233 "\n Possible Value Types:";
234 set<G4String>::iterator i;
235 for (i = fValueTypes->begin(); i != fValueTypes->end(); ++i) {
239 "\n*******************************************************"
251 if (!ac.fpDefinitions) {
252 os <<
"G4AttCheck: ERROR: zero definitions pointer." << endl;
257 os << storeKey <<
':' << endl;
261 os <<
"G4AttCheck: zero values pointer." << endl;
264 vector<G4AttValue>::const_iterator iValue;
265 for (iValue = ac.fpValues->begin(); iValue != ac.fpValues->end(); ++iValue) {
266 const G4String& valueName = iValue->GetName();
267 const G4String& value = iValue->GetValue();
268 map<G4String,G4AttDef>::const_iterator iDef =
269 ac.fpDefinitions->find(valueName);
271 if (iDef == ac.fpDefinitions->end()) {
273 os <<
"G4AttCheck: ERROR: No G4AttDef for G4AttValue \""
274 << valueName <<
"\": " << value << endl;
276 const G4String& category = iDef->second.GetCategory();
277 const G4String& extra = iDef->second.GetExtra();
278 const G4String& valueType = iDef->second.GetValueType();
279 if (ac.fCategories->find(category) == ac.fCategories->end()) {
282 "G4AttCheck: ERROR: Illegal Category Field \"" << category
283 <<
"\" for G4AttValue \"" << valueName <<
"\": " << value <<
284 "\n Possible Categories:";
285 set<G4String>::iterator i;
286 for (i = ac.fCategories->begin(); i != ac.fCategories->end(); ++i) {
291 if(category ==
"Physics" && ac.fUnits->find(extra) == ac.fUnits->end()) {
294 "G4AttCheck: ERROR: Illegal Extra field \""<< extra
295 <<
"\" for G4AttValue \"" << valueName <<
"\": " << value <<
296 "\n Possible Extra fields if Category==\"Physics\":\n ";
297 set<G4String>::iterator i;
298 for (i = ac.fUnits->begin(); i != ac.fUnits->end(); ++i) {
303 if (ac.fValueTypes->find(valueType) == ac.fValueTypes->end()) {
306 "G4AttCheck: ERROR: Illegal Value Type field \"" << valueType
307 <<
"\" for G4AttValue \"" << valueName <<
"\": " << value <<
308 "\n Possible Value Types:";
309 set<G4String>::iterator i;
310 for (i = ac.fValueTypes->begin(); i != ac.fValueTypes->end(); ++i) {
317 os << iDef->second.GetDesc()
320 if (iDef->second.GetCategory() ==
"Physics" &&
321 !iDef->second.GetExtra().empty()) {
322 os <<
" (" << iDef->second.GetExtra() <<
")";
330void G4AttCheck::AddValuesAndDefs
331(std::vector<G4AttValue>* standardValues,
332 std::map<G4String,G4AttDef>* standardDefinitions,
340 standardValues->push_back(
G4AttValue(name,value,
""));
342 (*standardDefinitions)[name] = fpDefinitions->find(oldName)->second;
344 (*standardDefinitions)[name].SetName(name);
345 (*standardDefinitions)[name].SetExtra(extra);
346 if (description !=
"") (*standardDefinitions)[name].SetDesc(description);
350(std::vector<G4AttValue>* standardValues,
351 std::map<G4String,G4AttDef>* standardDefinitions)
const
357 vector<G4AttValue>::const_iterator iValue;
358 for (iValue = fpValues->begin(); iValue != fpValues->end(); ++iValue) {
359 const G4String& valueName = iValue->GetName();
360 const G4String& value = iValue->GetValue();
361 map<G4String,G4AttDef>::const_iterator iDef =
362 fpDefinitions->find(valueName);
363 if (iDef == fpDefinitions->end()) {
366 const G4String& category = iDef->second.GetCategory();
367 const G4String& extra = iDef->second.GetExtra();
368 const G4String& valueType = iDef->second.GetValueType();
369 if (fCategories->find(category) == fCategories->end() ||
370 (category ==
"Physics" && fUnits->find(extra) == fUnits->end()) ||
371 fValueTypes->find(valueType) == fValueTypes->end()) {
374 if (category !=
"Physics") {
375 standardValues->push_back(*iValue);
376 (*standardDefinitions)[valueName] =
377 fpDefinitions->find(valueName)->second;
380 if (valueType ==
"G4ThreeVector") {
384 (standardValues,standardDefinitions,
385 valueName,valueName+
"-X",
387 fpDefinitions->find(valueName)->second.GetDesc()+
"-X");
389 (standardValues,standardDefinitions,
390 valueName,valueName+
"-Y",
392 fpDefinitions->find(valueName)->second.GetDesc()+
"-Y");
394 (standardValues,standardDefinitions,
395 valueName,valueName+
"-Z",
397 fpDefinitions->find(valueName)->second.GetDesc()+
"-Z");
399 standardValues->push_back(*iValue);
400 (*standardDefinitions)[valueName] =
401 fpDefinitions->find(valueName)->second;
406 if (extra ==
"G4BestUnit") {
407 valueAndUnit = value;
408 valueAndUnit = valueAndUnit.
strip();
409 unit = valueAndUnit.substr(valueAndUnit.rfind(
' ')+1);
411 valueAndUnit = value +
' ' + extra;
412 valueAndUnit = valueAndUnit.
strip();
416 if (fUnitCategories->find(unitCategory) != fUnitCategories->end()) {
417 G4String standardUnit = (*fStandardUnits)[unitCategory];
421 if (valueType ==
"G4ThreeVector") {
425 (standardValues,standardDefinitions,
426 valueName,valueName+
"-X",
428 (internalValue.
x()/valueOfStandardUnit),
430 fpDefinitions->find(valueName)->second.GetDesc()+
"-X");
432 (standardValues,standardDefinitions,
433 valueName,valueName+
"-Y",
435 (internalValue.
y()/valueOfStandardUnit),
437 fpDefinitions->find(valueName)->second.GetDesc()+
"-Y");
439 (standardValues,standardDefinitions,
440 valueName,valueName+
"-Z",
442 (internalValue.
z()/valueOfStandardUnit),
444 fpDefinitions->find(valueName)->second.GetDesc()+
"-Z");
449 (standardValues,standardDefinitions,
452 (internalValue/valueOfStandardUnit),
462 G4cerr <<
"G4AttCheck::Standard: Conversion error." <<
G4endl;
std::ostream & operator<<(std::ostream &os, const G4AttCheck &ac)
std::vector< G4UnitDefinition * > G4UnitsContainer
std::vector< G4UnitsCategory * > G4UnitsTable
void print(G4double elem)
G4GLOB_DLL std::ostream G4cerr
G4AttCheck(const std::vector< G4AttValue > *values, const std::map< G4String, G4AttDef > *definitions)
G4bool Check(const G4String &leader="") const
G4bool Standard(std::vector< G4AttValue > *standardValues, std::map< G4String, G4AttDef > *standardDefinitions) const
G4String strip(G4int strip_Type=trailing, char c=' ')
static G4ThreeVector ConvertTo3Vector(const char *st)
static G4String ConvertToString(G4bool boolVal)
static G4double ConvertToDimensionedDouble(const char *st)
static G4ThreeVector ConvertToDimensioned3Vector(const char *st)
static G4double GetValueOf(const G4String &)
static G4String GetCategory(const G4String &)
static G4UnitsTable & GetUnitsTable()
G4bool GetStoreKey(const std::map< G4String, G4AttDef > *definitions, G4String &key)