Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // >> 27 // $Id: G4AttCheck.cc,v 1.16 2010-12-07 09:36:59 allison Exp $ >> 28 // GEANT4 tag $Name: not supported by cvs2svn $ 27 29 28 #include "G4AttCheck.hh" 30 #include "G4AttCheck.hh" 29 31 30 #include "globals.hh" 32 #include "globals.hh" 31 33 32 #include "G4AttDef.hh" 34 #include "G4AttDef.hh" 33 #include "G4AttDefStore.hh" 35 #include "G4AttDefStore.hh" 34 #include "G4AttValue.hh" 36 #include "G4AttValue.hh" 35 #include "G4UnitsTable.hh" 37 #include "G4UnitsTable.hh" 36 #include "G4UIcommand.hh" 38 #include "G4UIcommand.hh" 37 39 38 G4ThreadLocal G4bool G4AttCheck::fFirst = true << 39 << 40 G4ThreadLocal std::set<G4String> *G4AttCheck:: << 41 << 42 G4ThreadLocal std::map<G4String,G4String> *G4A << 43 << 44 G4ThreadLocal std::set<G4String> *G4AttCheck:: << 45 << 46 G4ThreadLocal std::set<G4String> *G4AttCheck:: << 47 << 48 G4ThreadLocal std::set<G4String> *G4AttCheck:: << 49 << 50 G4AttCheck::G4AttCheck 40 G4AttCheck::G4AttCheck 51 (const std::vector<G4AttValue>* values, 41 (const std::vector<G4AttValue>* values, 52 const std::map<G4String,G4AttDef>* definition 42 const std::map<G4String,G4AttDef>* definitions): 53 fpValues(values), 43 fpValues(values), 54 fpDefinitions(definitions) 44 fpDefinitions(definitions) 55 { 45 { 56 Init(); << 57 << 58 if (fFirst) { // Initialise static containe 46 if (fFirst) { // Initialise static containers. 59 fFirst = false; 47 fFirst = false; 60 48 61 // Legal Unit Category Types... 49 // Legal Unit Category Types... 62 fUnitCategories->insert("Length"); << 50 fUnitCategories.insert("Length"); 63 fUnitCategories->insert("Energy"); << 51 fUnitCategories.insert("Energy"); 64 fUnitCategories->insert("Time"); << 52 fUnitCategories.insert("Time"); 65 fUnitCategories->insert("Electric charge") << 53 fUnitCategories.insert("Electric charge"); 66 fUnitCategories->insert("Volumic Mass"); << 54 fUnitCategories.insert("Volumic Mass"); // (Density) 67 55 68 // Corresponding Standard Units... 56 // Corresponding Standard Units... 69 (*fStandardUnits)["Length"] = "m"; << 57 fStandardUnits["Length"] = "m"; 70 (*fStandardUnits)["Energy"] = "MeV"; << 58 fStandardUnits["Energy"] = "MeV"; 71 (*fStandardUnits)["Time"] = "ns"; << 59 fStandardUnits["Time"] = "ns"; 72 (*fStandardUnits)["Electric charge"] = "e+ << 60 fStandardUnits["Electric charge"] = "e+"; 73 (*fStandardUnits)["Volumic Mass"] = "kg/m3 << 61 fStandardUnits["Volumic Mass"] = "kg/m3"; 74 62 75 // Legal Categories... 63 // Legal Categories... 76 fCategories->insert("Bookkeeping"); << 64 fCategories.insert("Bookkeeping"); 77 fCategories->insert("Draw"); << 65 fCategories.insert("Draw"); 78 fCategories->insert("Physics"); << 66 fCategories.insert("Physics"); 79 fCategories->insert("PickAction"); << 67 fCategories.insert("PickAction"); 80 fCategories->insert("Association"); << 68 fCategories.insert("Association"); 81 69 82 // Legal units... 70 // Legal units... 83 fUnits->insert(""); << 71 fUnits.insert(""); 84 fUnits->insert("G4BestUnit"); << 72 fUnits.insert("G4BestUnit"); 85 // ...plus any legal unit symbol ("MeV", " 73 // ...plus any legal unit symbol ("MeV", "km", etc.)... 86 G4UnitsTable& units = G4UnitDefinition::Ge 74 G4UnitsTable& units = G4UnitDefinition::GetUnitsTable(); 87 for (size_t i = 0; i < units.size(); ++i) 75 for (size_t i = 0; i < units.size(); ++i) { 88 if (fUnitCategories->find(units[i]->GetN << 76 if (fUnitCategories.find(units[i]->GetName()) != 89 fUnitCategories->end()) { << 77 fUnitCategories.end()) { 90 //G4cout << units[i]->GetName() << G4e << 78 //G4cout << units[i]->GetName() << G4endl; 91 G4UnitsContainer& container = units[i] << 79 G4UnitsContainer& container = units[i]->GetUnitsList(); 92 for (auto & j : container) { << 80 for (size_t j = 0; j < container.size(); ++j) { 93 //G4cout << container[j]->GetName() << 81 //G4cout << container[j]->GetName() << ' ' 94 // << container[j]->GetSymbol( << 82 // << container[j]->GetSymbol() << G4endl; 95 fUnits->insert(j->GetSymbol()); << 83 fUnits.insert(container[j]->GetSymbol()); 96 } << 84 } 97 } 85 } 98 } 86 } 99 87 100 // Legal Value Types... 88 // Legal Value Types... 101 fValueTypes->insert("G4String"); << 89 fValueTypes.insert("G4String"); 102 fValueTypes->insert("G4int"); << 90 fValueTypes.insert("G4int"); 103 fValueTypes->insert("G4double"); << 91 fValueTypes.insert("G4double"); 104 fValueTypes->insert("G4ThreeVector"); << 92 fValueTypes.insert("G4ThreeVector"); 105 fValueTypes->insert("G4bool"); << 93 fValueTypes.insert("G4bool"); 106 } 94 } 107 } 95 } 108 96 109 void G4AttCheck::Init() << 97 G4AttCheck::~G4AttCheck() {} 110 { << 111 if (fValueTypes == nullptr) fValueTypes = ne << 112 if (fUnits == nullptr) fUnits = new std::set << 113 if (fCategories == nullptr) fCategories = ne << 114 if (fStandardUnits == nullptr) fStandardUnit << 115 if (fUnitCategories == nullptr) fUnitCategor << 116 } << 117 98 118 G4bool G4AttCheck::Check(const G4String& leade << 99 G4bool G4AttCheck::fFirst = true; 119 { << 100 >> 101 std::set<G4String> G4AttCheck::fUnitCategories; >> 102 >> 103 std::map<G4String,G4String> G4AttCheck::fStandardUnits; >> 104 >> 105 std::set<G4String> G4AttCheck::fCategories; >> 106 >> 107 std::set<G4String> G4AttCheck::fUnits; >> 108 >> 109 std::set<G4String> G4AttCheck::fValueTypes; >> 110 >> 111 G4bool G4AttCheck::Check(const G4String& leader) const { 120 // Check only. Silent unless error - then G 112 // Check only. Silent unless error - then G4cerr. Returns error. 121 G4bool error = false; 113 G4bool error = false; 122 static G4ThreadLocal G4int iError = 0; << 114 static G4int iError = 0; 123 G4bool print = false; 115 G4bool print = false; 124 if (iError < 10 || iError%100 == 0) { 116 if (iError < 10 || iError%100 == 0) { 125 print = true; 117 print = true; 126 } 118 } 127 using namespace std; 119 using namespace std; 128 if (fpValues == nullptr) return error; // A << 120 if (!fpValues) return error; // A null values vector is a valid situation. 129 if (fpDefinitions == nullptr) { << 121 if (!fpDefinitions) { 130 ++iError; 122 ++iError; 131 error = true; 123 error = true; 132 if (print) { 124 if (print) { 133 G4cerr << 125 G4cerr << 134 "\n*********************************** << 126 "\n*******************************************************"; 135 if (!leader.empty()) { << 127 if (leader != "") { 136 G4cerr << '\n' << leader; << 128 G4cerr << '\n' << leader; 137 } 129 } 138 G4cerr << 130 G4cerr << 139 "\nG4AttCheck: ERROR " << iError << ": << 131 "\nG4AttCheck: ERROR " << iError << ": Null definitions pointer" 140 "\n*********************************** << 132 "\n*******************************************************" 141 << G4endl; << 133 << G4endl; 142 } 134 } 143 return error; 135 return error; 144 } 136 } 145 vector<G4AttValue>::const_iterator iValue; 137 vector<G4AttValue>::const_iterator iValue; 146 for (iValue = fpValues->begin(); iValue != f 138 for (iValue = fpValues->begin(); iValue != fpValues->end(); ++iValue) { 147 const G4String& valueName = iValue->GetNam 139 const G4String& valueName = iValue->GetName(); 148 const G4String& value = iValue->GetValue() 140 const G4String& value = iValue->GetValue(); 149 // NOLINTNEXTLINE(modernize-use-auto): Exp << 150 map<G4String,G4AttDef>::const_iterator iDe 141 map<G4String,G4AttDef>::const_iterator iDef = 151 fpDefinitions->find(valueName); 142 fpDefinitions->find(valueName); 152 if (iDef == fpDefinitions->end()) { 143 if (iDef == fpDefinitions->end()) { 153 ++iError; 144 ++iError; 154 error = true; 145 error = true; 155 if (print) { 146 if (print) { 156 G4cerr << << 147 G4cerr << 157 "\n********************************* << 148 "\n*******************************************************"; 158 if (!leader.empty()) { << 149 if (leader != "") { 159 G4cerr << '\n' << leader; << 150 G4cerr << '\n' << leader; 160 } << 151 } 161 G4cerr << << 152 G4cerr << 162 "\nG4AttCheck: ERROR " << iError << << 153 "\nG4AttCheck: ERROR " << iError << ": No G4AttDef for G4AttValue \"" 163 << valueName << "\": " << valu << 154 << valueName << "\": " << value << 164 "\n********************************* << 155 "\n*******************************************************" 165 << G4endl; << 156 << G4endl; 166 } 157 } 167 } else { 158 } else { 168 const G4String& category = iDef->second. 159 const G4String& category = iDef->second.GetCategory(); 169 const G4String& extra = iDef->second.Get 160 const G4String& extra = iDef->second.GetExtra(); 170 const G4String& valueType = iDef->second 161 const G4String& valueType = iDef->second.GetValueType(); 171 if (fCategories->find(category) == fCate << 162 if (fCategories.find(category) == fCategories.end()) { 172 ++iError; << 163 ++iError; 173 error = true; << 164 error = true; 174 if (print) { << 165 if (print) { 175 G4cerr << << 166 G4cerr << 176 "\n******************************* << 167 "\n*******************************************************"; 177 if (!leader.empty()) { << 168 if (leader != "") { 178 G4cerr << '\n' << leader; << 169 G4cerr << '\n' << leader; 179 } << 170 } 180 G4cerr << << 171 G4cerr << 181 "\nG4AttCheck: ERROR " << iError < << 172 "\nG4AttCheck: ERROR " << iError << ": Illegal Category Field \"" 182 << category << "\" for G4AttV << 173 << category << "\" for G4AttValue \"" 183 << valueName << "\": " << val << 174 << valueName << "\": " << value << 184 "\n Possible Categories:"; << 175 "\n Possible Categories:"; 185 set<G4String>::iterator i; << 176 set<G4String>::iterator i; 186 for (i = fCategories->begin(); i != << 177 for (i = fCategories.begin(); i != fCategories.end(); ++i) { 187 G4cerr << ' ' << *i; << 178 G4cerr << ' ' << *i; 188 } << 179 } 189 G4cerr << << 180 G4cerr << 190 "\n******************************* << 181 "\n*******************************************************" 191 << G4endl; << 182 << G4endl; 192 } << 183 } 193 } 184 } 194 if(category == "Physics" && fUnits->find << 185 if(category == "Physics" && fUnits.find(extra) == fUnits.end()) { 195 ++iError; << 186 ++iError; 196 error = true; << 187 error = true; 197 if (print) { << 188 if (print) { 198 G4cerr << << 189 G4cerr << 199 "\n******************************* << 190 "\n*******************************************************"; 200 if (!leader.empty()) { << 191 if (leader != "") { 201 G4cerr << '\n' << leader; << 192 G4cerr << '\n' << leader; 202 } << 193 } 203 G4cerr << << 194 G4cerr << 204 "\nG4AttCheck: ERROR " << iError < << 195 "\nG4AttCheck: ERROR " << iError << ": Illegal Extra field \"" 205 << extra << "\" for G4AttValu << 196 << extra << "\" for G4AttValue \"" 206 << valueName << "\": " << val << 197 << valueName << "\": " << value << 207 "\n Possible Extra fields if Cate << 198 "\n Possible Extra fields if Category==\"Physics\":\n "; 208 set<G4String>::iterator i; << 199 set<G4String>::iterator i; 209 for (i = fUnits->begin(); i != fUnit << 200 for (i = fUnits.begin(); i != fUnits.end(); ++i) { 210 G4cerr << ' ' << *i; << 201 G4cerr << ' ' << *i; 211 } << 202 } 212 G4cerr << << 203 G4cerr << 213 "\n******************************* << 204 "\n*******************************************************" 214 << G4endl; << 205 << G4endl; 215 } << 206 } 216 } 207 } 217 if (fValueTypes->find(valueType) == fVal << 208 if (fValueTypes.find(valueType) == fValueTypes.end()) { 218 ++iError; << 209 ++iError; 219 error = true; << 210 error = true; 220 if (print) { << 211 if (print) { 221 G4cerr << << 212 G4cerr << 222 "\n******************************* << 213 "\n*******************************************************"; 223 if (!leader.empty()) { << 214 if (leader != "") { 224 G4cerr << '\n' << leader; << 215 G4cerr << '\n' << leader; 225 } << 216 } 226 G4cerr << << 217 G4cerr << 227 "\nG4AttCheck: ERROR " << iError < << 218 "\nG4AttCheck: ERROR " << iError << ": Illegal Value Type field \"" 228 << valueType << "\" for G4Att << 219 << valueType << "\" for G4AttValue \"" 229 << valueName << "\": " << val << 220 << valueName << "\": " << value << 230 "\n Possible Value Types:"; << 221 "\n Possible Value Types:"; 231 set<G4String>::iterator i; << 222 set<G4String>::iterator i; 232 for (i = fValueTypes->begin(); i != << 223 for (i = fValueTypes.begin(); i != fValueTypes.end(); ++i) { 233 G4cerr << ' ' << *i; << 224 G4cerr << ' ' << *i; 234 } << 225 } 235 G4cerr << << 226 G4cerr << 236 "\n******************************* << 227 "\n*******************************************************" 237 << G4endl; << 228 << G4endl; 238 } << 229 } 239 } 230 } 240 } 231 } 241 } 232 } 242 return error; 233 return error; 243 } 234 } 244 235 245 std::ostream& operator<< (std::ostream& os, co 236 std::ostream& operator<< (std::ostream& os, const G4AttCheck& ac) 246 { 237 { 247 using namespace std; 238 using namespace std; 248 if (ac.fpDefinitions == nullptr) { << 239 if (!ac.fpDefinitions) { 249 os << "G4AttCheck: ERROR: zero definitions 240 os << "G4AttCheck: ERROR: zero definitions pointer." << endl; 250 return os; 241 return os; 251 } 242 } 252 G4String storeKey; 243 G4String storeKey; 253 if (G4AttDefStore::GetStoreKey(ac.fpDefiniti 244 if (G4AttDefStore::GetStoreKey(ac.fpDefinitions, storeKey)) { 254 os << storeKey << ':' << endl; 245 os << storeKey << ':' << endl; 255 } 246 } 256 if (ac.fpValues == nullptr) { << 247 if (!ac.fpValues) { 257 // A null values vector is a valid situati 248 // A null values vector is a valid situation. 258 os << "G4AttCheck: zero values pointer." < 249 os << "G4AttCheck: zero values pointer." << endl; 259 return os; 250 return os; 260 } 251 } 261 vector<G4AttValue>::const_iterator iValue; 252 vector<G4AttValue>::const_iterator iValue; 262 for (iValue = ac.fpValues->begin(); iValue ! 253 for (iValue = ac.fpValues->begin(); iValue != ac.fpValues->end(); ++iValue) { 263 const G4String& valueName = iValue->GetNam 254 const G4String& valueName = iValue->GetName(); 264 const G4String& value = iValue->GetValue() 255 const G4String& value = iValue->GetValue(); 265 // NOLINTNEXTLINE(modernize-use-auto): Exp << 256 map<G4String,G4AttDef>::const_iterator iDef = 266 map<G4String,G4AttDef>::const_iterator iDe << 267 ac.fpDefinitions->find(valueName); 257 ac.fpDefinitions->find(valueName); 268 G4bool error = false; 258 G4bool error = false; 269 if (iDef == ac.fpDefinitions->end()) { 259 if (iDef == ac.fpDefinitions->end()) { 270 error = true; 260 error = true; 271 os << "G4AttCheck: ERROR: No G4AttDef fo 261 os << "G4AttCheck: ERROR: No G4AttDef for G4AttValue \"" 272 << valueName << "\": " << value << en << 262 << valueName << "\": " << value << endl; 273 } else { 263 } else { 274 const G4String& category = iDef->second. 264 const G4String& category = iDef->second.GetCategory(); 275 const G4String& extra = iDef->second.Get 265 const G4String& extra = iDef->second.GetExtra(); 276 const G4String& valueType = iDef->second 266 const G4String& valueType = iDef->second.GetValueType(); 277 if (ac.fCategories->find(category) == ac << 267 if (ac.fCategories.find(category) == ac.fCategories.end()) { 278 error = true; << 268 error = true; 279 os << << 269 os << 280 "G4AttCheck: ERROR: Illegal Category << 270 "G4AttCheck: ERROR: Illegal Category Field \"" << category 281 << "\" for G4AttValue \"" << valueN << 271 << "\" for G4AttValue \"" << valueName << "\": " << value << 282 "\n Possible Categories:"; << 272 "\n Possible Categories:"; 283 set<G4String>::iterator i; << 273 set<G4String>::iterator i; 284 for (i = ac.fCategories->begin(); i != << 274 for (i = ac.fCategories.begin(); i != ac.fCategories.end(); ++i) { 285 os << ' ' << *i; << 275 os << ' ' << *i; 286 } << 276 } 287 os << endl; << 277 os << endl; 288 } 278 } 289 if(category == "Physics" && ac.fUnits->f << 279 if(category == "Physics" && ac.fUnits.find(extra) == ac.fUnits.end()) { 290 error = true; << 280 error = true; 291 os << << 281 os << 292 "G4AttCheck: ERROR: Illegal Extra fi << 282 "G4AttCheck: ERROR: Illegal Extra field \""<< extra 293 << "\" for G4AttValue \"" << valueN << 283 << "\" for G4AttValue \"" << valueName << "\": " << value << 294 "\n Possible Extra fields if Catego << 284 "\n Possible Extra fields if Category==\"Physics\":\n "; 295 set<G4String>::iterator i; << 285 set<G4String>::iterator i; 296 for (i = ac.fUnits->begin(); i != ac.f << 286 for (i = ac.fUnits.begin(); i != ac.fUnits.end(); ++i) { 297 os << ' ' << *i; << 287 os << ' ' << *i; 298 } << 288 } 299 os << endl; << 289 os << endl; 300 } 290 } 301 if (ac.fValueTypes->find(valueType) == a << 291 if (ac.fValueTypes.find(valueType) == ac.fValueTypes.end()) { 302 error = true; << 292 error = true; 303 os << << 293 os << 304 "G4AttCheck: ERROR: Illegal Value Ty << 294 "G4AttCheck: ERROR: Illegal Value Type field \"" << valueType 305 << "\" for G4AttValue \"" << valueN << 295 << "\" for G4AttValue \"" << valueName << "\": " << value << 306 "\n Possible Value Types:"; << 296 "\n Possible Value Types:"; 307 set<G4String>::iterator i; << 297 set<G4String>::iterator i; 308 for (i = ac.fValueTypes->begin(); i != << 298 for (i = ac.fValueTypes.begin(); i != ac.fValueTypes.end(); ++i) { 309 os << ' ' << *i; << 299 os << ' ' << *i; 310 } << 300 } 311 os << endl; << 301 os << endl; 312 } 302 } 313 } 303 } 314 if (!error) { 304 if (!error) { 315 os << iDef->second.GetDesc() 305 os << iDef->second.GetDesc() 316 << " (" << valueName << 306 << " (" << valueName 317 << "): " << value; << 307 << "): " << value; 318 if (iDef->second.GetCategory() == "Physi 308 if (iDef->second.GetCategory() == "Physics" && 319 !iDef->second.GetExtra().empty()) { << 309 !iDef->second.GetExtra().empty()) { 320 os << " (" << iDef->second.GetExtra() << 310 os << " (" << iDef->second.GetExtra() << ")"; 321 } 311 } 322 os << endl; 312 os << endl; 323 } 313 } 324 } 314 } 325 return os; 315 return os; 326 } 316 } 327 317 328 void G4AttCheck::AddValuesAndDefs 318 void G4AttCheck::AddValuesAndDefs 329 (std::vector<G4AttValue>* standardValues, 319 (std::vector<G4AttValue>* standardValues, 330 std::map<G4String,G4AttDef>* standardDefiniti 320 std::map<G4String,G4AttDef>* standardDefinitions, 331 const G4String& oldName, 321 const G4String& oldName, 332 const G4String& name, 322 const G4String& name, 333 const G4String& value, 323 const G4String& value, 334 const G4String& extra, 324 const G4String& extra, 335 const G4String& description) const << 325 const G4String& description) const { 336 { << 337 // Add new G4AttDeff... 326 // Add new G4AttDeff... 338 standardValues->push_back(G4AttValue(name,va 327 standardValues->push_back(G4AttValue(name,value,"")); 339 // Copy original G4AttDef... 328 // Copy original G4AttDef... 340 (*standardDefinitions)[name] = fpDefinitions 329 (*standardDefinitions)[name] = fpDefinitions->find(oldName)->second; 341 // ...and make appropriate changes... 330 // ...and make appropriate changes... 342 (*standardDefinitions)[name].SetName(name); 331 (*standardDefinitions)[name].SetName(name); 343 (*standardDefinitions)[name].SetExtra(extra) 332 (*standardDefinitions)[name].SetExtra(extra); 344 if (!description.empty()) (*standardDefiniti << 333 if (description != "") (*standardDefinitions)[name].SetDesc(description); 345 } 334 } 346 335 347 G4bool G4AttCheck::Standard 336 G4bool G4AttCheck::Standard 348 (std::vector<G4AttValue>* standardValues, 337 (std::vector<G4AttValue>* standardValues, 349 std::map<G4String,G4AttDef>* standardDefiniti << 338 std::map<G4String,G4AttDef>* standardDefinitions) const { 350 { << 351 // Places standard versions in provided vect 339 // Places standard versions in provided vector and map and returns error. 352 // Assumes valid input. Use Check to check. 340 // Assumes valid input. Use Check to check. 353 using namespace std; 341 using namespace std; 354 G4bool error = false; 342 G4bool error = false; 355 vector<G4AttValue>::const_iterator iValue; 343 vector<G4AttValue>::const_iterator iValue; 356 for (iValue = fpValues->begin(); iValue != f 344 for (iValue = fpValues->begin(); iValue != fpValues->end(); ++iValue) { 357 const G4String& valueName = iValue->GetNam 345 const G4String& valueName = iValue->GetName(); 358 const G4String& value = iValue->GetValue() 346 const G4String& value = iValue->GetValue(); 359 // NOLINTNEXTLINE(modernize-use-auto): Exp << 360 map<G4String,G4AttDef>::const_iterator iDe 347 map<G4String,G4AttDef>::const_iterator iDef = 361 fpDefinitions->find(valueName); 348 fpDefinitions->find(valueName); 362 if (iDef == fpDefinitions->end()) { 349 if (iDef == fpDefinitions->end()) { 363 error = true; 350 error = true; 364 } else { 351 } else { 365 const G4String& category = iDef->second. 352 const G4String& category = iDef->second.GetCategory(); 366 const G4String& extra = iDef->second.Get 353 const G4String& extra = iDef->second.GetExtra(); 367 const G4String& valueType = iDef->second 354 const G4String& valueType = iDef->second.GetValueType(); 368 if (fCategories->find(category) == fCate << 355 if (fCategories.find(category) == fCategories.end() || 369 (category == "Physics" && fUnits->fi << 356 (category == "Physics" && fUnits.find(extra) == fUnits.end()) || 370 fValueTypes->find(valueType) == fVal << 357 fValueTypes.find(valueType) == fValueTypes.end()) { 371 error = true; << 358 error = true; 372 } else { 359 } else { 373 if (category != "Physics") { // Simpl << 360 if (category != "Physics") { // Simply copy... 374 standardValues->push_back(*iValue); << 361 standardValues->push_back(*iValue); 375 (*standardDefinitions)[valueName] = << 362 (*standardDefinitions)[valueName] = 376 fpDefinitions->find(valueName)->se << 363 fpDefinitions->find(valueName)->second; 377 } else { // "Physics"... << 364 } else { // "Physics"... 378 if (extra.empty()) { // Dimensionle << 365 if (extra.empty()) { // Dimensionless... 379 if (valueType == "G4ThreeVector") << 366 if (valueType == "G4ThreeVector") { // Split vector into 3... 380 G4ThreeVector internalValue = << 367 G4ThreeVector internalValue = 381 G4UIcommand::ConvertTo3Vector( << 368 G4UIcommand::ConvertTo3Vector(value); 382 AddValuesAndDefs << 369 AddValuesAndDefs 383 (standardValues,standardDefini << 370 (standardValues,standardDefinitions, 384 valueName,valueName+"-X", << 371 valueName,valueName+"-X", 385 G4UIcommand::ConvertToString( << 372 G4UIcommand::ConvertToString(internalValue.x()),"", 386 fpDefinitions->find(valueName << 373 fpDefinitions->find(valueName)->second.GetDesc()+"-X"); 387 AddValuesAndDefs << 374 AddValuesAndDefs 388 (standardValues,standardDefini << 375 (standardValues,standardDefinitions, 389 valueName,valueName+"-Y", << 376 valueName,valueName+"-Y", 390 G4UIcommand::ConvertToString( << 377 G4UIcommand::ConvertToString(internalValue.y()),"", 391 fpDefinitions->find(valueName << 378 fpDefinitions->find(valueName)->second.GetDesc()+"-Y"); 392 AddValuesAndDefs << 379 AddValuesAndDefs 393 (standardValues,standardDefini << 380 (standardValues,standardDefinitions, 394 valueName,valueName+"-Z", << 381 valueName,valueName+"-Z", 395 G4UIcommand::ConvertToString( << 382 G4UIcommand::ConvertToString(internalValue.z()),"", 396 fpDefinitions->find(valueName << 383 fpDefinitions->find(valueName)->second.GetDesc()+"-Z"); 397 } else { // Simply copy... << 384 } else { // Simply copy... 398 standardValues->push_back(*iValu << 385 standardValues->push_back(*iValue); 399 (*standardDefinitions)[valueName << 386 (*standardDefinitions)[valueName] = 400 fpDefinitions->find(valueName) << 387 fpDefinitions->find(valueName)->second; 401 } << 388 } 402 } else { // Dimensioned... << 389 } else { // Dimensioned... 403 G4String valueAndUnit; << 390 G4String valueAndUnit; 404 G4String unit; << 391 G4String unit; 405 if (extra == "G4BestUnit") { << 392 if (extra == "G4BestUnit") { 406 valueAndUnit = G4StrUtil::strip_ << 393 valueAndUnit = value; 407 unit = valueAndUnit.substr(value << 394 valueAndUnit = valueAndUnit.strip(); 408 } else { << 395 unit = valueAndUnit.substr(valueAndUnit.rfind(' ')+1); 409 valueAndUnit = G4StrUtil::strip_ << 396 } else { 410 unit = extra; << 397 valueAndUnit = value + ' ' + extra; 411 } << 398 valueAndUnit = valueAndUnit.strip(); 412 G4String unitCategory = G4UnitDefi << 399 unit = extra; 413 if (fUnitCategories->find(unitCate << 400 } 414 G4String standardUnit = (*fStand << 401 G4String unitCategory = G4UnitDefinition::GetCategory(unit); 415 G4double valueOfStandardUnit = << 402 if (fUnitCategories.find(unitCategory) != fUnitCategories.end()) { 416 G4UnitDefinition::GetValueOf(s << 403 G4String standardUnit = fStandardUnits[unitCategory]; 417 // G4String exstr = iDef->second. << 404 G4double valueOfStandardUnit = 418 if (valueType == "G4ThreeVector" << 405 G4UnitDefinition::GetValueOf(standardUnit); 419 G4ThreeVector internalValue = << 406 G4String extra = iDef->second.GetExtra(); 420 G4UIcommand::ConvertToDimens << 407 if (valueType == "G4ThreeVector") { // Split vector into 3... 421 AddValuesAndDefs << 408 G4ThreeVector internalValue = 422 (standardValues,standardDefi << 409 G4UIcommand::ConvertToDimensioned3Vector(valueAndUnit); 423 valueName,valueName+"-X", << 410 AddValuesAndDefs 424 G4UIcommand::ConvertToStrin << 411 (standardValues,standardDefinitions, 425 (internalValue.x()/valueOfS << 412 valueName,valueName+"-X", 426 standardUnit, << 413 G4UIcommand::ConvertToString 427 fpDefinitions->find(valueNa << 414 (internalValue.x()/valueOfStandardUnit), 428 AddValuesAndDefs << 415 standardUnit, 429 (standardValues,standardDefi << 416 fpDefinitions->find(valueName)->second.GetDesc()+"-X"); 430 valueName,valueName+"-Y", << 417 AddValuesAndDefs 431 G4UIcommand::ConvertToStrin << 418 (standardValues,standardDefinitions, 432 (internalValue.y()/valueOfS << 419 valueName,valueName+"-Y", 433 standardUnit, << 420 G4UIcommand::ConvertToString 434 fpDefinitions->find(valueNa << 421 (internalValue.y()/valueOfStandardUnit), 435 AddValuesAndDefs << 422 standardUnit, 436 (standardValues,standardDefi << 423 fpDefinitions->find(valueName)->second.GetDesc()+"-Y"); 437 valueName,valueName+"-Z", << 424 AddValuesAndDefs 438 G4UIcommand::ConvertToStrin << 425 (standardValues,standardDefinitions, 439 (internalValue.z()/valueOfS << 426 valueName,valueName+"-Z", 440 standardUnit, << 427 G4UIcommand::ConvertToString 441 fpDefinitions->find(valueNa << 428 (internalValue.z()/valueOfStandardUnit), 442 } else { << 429 standardUnit, 443 G4double internalValue = << 430 fpDefinitions->find(valueName)->second.GetDesc()+"-Z"); 444 G4UIcommand::ConvertToDimens << 431 } else { 445 AddValuesAndDefs << 432 G4double internalValue = 446 (standardValues,standardDefi << 433 G4UIcommand::ConvertToDimensionedDouble(valueAndUnit); 447 valueName,valueName, << 434 AddValuesAndDefs 448 G4UIcommand::ConvertToStrin << 435 (standardValues,standardDefinitions, 449 (internalValue/valueOfStand << 436 valueName,valueName, 450 standardUnit); << 437 G4UIcommand::ConvertToString 451 } << 438 (internalValue/valueOfStandardUnit), 452 } << 439 standardUnit); 453 } << 440 } 454 } << 441 } >> 442 } >> 443 } 455 } 444 } 456 } 445 } 457 } 446 } 458 if (error) { 447 if (error) { 459 G4cerr << "G4AttCheck::Standard: Conversio 448 G4cerr << "G4AttCheck::Standard: Conversion error." << G4endl; 460 } 449 } 461 return error; 450 return error; 462 } 451 } 463 452