G4AttCheck Class Reference

#include <G4AttCheck.hh>


Public Member Functions

 G4AttCheck (const std::vector< G4AttValue > *values, const std::map< G4String, G4AttDef > *definitions)
 ~G4AttCheck ()
const std::vector< G4AttValue > * GetAttValues () const
const std::map< G4String,
G4AttDef > * 
GetAttDefs () const
G4bool Check (const G4String &leader="") const
G4bool Standard (std::vector< G4AttValue > *standardValues, std::map< G4String, G4AttDef > *standardDefinitions) const

Friends

std::ostream & operator<< (std::ostream &, const G4AttCheck &)


Detailed Description

Definition at line 57 of file G4AttCheck.hh.


Constructor & Destructor Documentation

G4AttCheck::G4AttCheck ( const std::vector< G4AttValue > *  values,
const std::map< G4String, G4AttDef > *  definitions 
)

Definition at line 40 of file G4AttCheck.cc.

References G4UnitDefinition::GetUnitsTable().

00041                                               :
00042   fpValues(values),
00043   fpDefinitions(definitions)
00044 {
00045   if (fFirst) {  // Initialise static containers.
00046     fFirst = false;
00047 
00048     // Legal Unit Category Types...
00049     fUnitCategories.insert("Length");
00050     fUnitCategories.insert("Energy");
00051     fUnitCategories.insert("Time");
00052     fUnitCategories.insert("Electric charge");
00053     fUnitCategories.insert("Volumic Mass");  // (Density)
00054 
00055     // Corresponding Standard Units...
00056     fStandardUnits["Length"] = "m";
00057     fStandardUnits["Energy"] = "MeV";
00058     fStandardUnits["Time"] = "ns";
00059     fStandardUnits["Electric charge"] = "e+";
00060     fStandardUnits["Volumic Mass"] = "kg/m3";
00061 
00062     // Legal Categories...
00063     fCategories.insert("Bookkeeping");
00064     fCategories.insert("Draw");
00065     fCategories.insert("Physics");
00066     fCategories.insert("PickAction");
00067     fCategories.insert("Association");
00068 
00069     // Legal units...
00070     fUnits.insert("");
00071     fUnits.insert("G4BestUnit");
00072     // ...plus any legal unit symbol ("MeV", "km", etc.)...
00073     G4UnitsTable& units = G4UnitDefinition::GetUnitsTable();
00074     for (size_t i = 0; i < units.size(); ++i) {
00075       if (fUnitCategories.find(units[i]->GetName()) !=
00076           fUnitCategories.end()) {
00077         //G4cout << units[i]->GetName() << G4endl;
00078         G4UnitsContainer& container = units[i]->GetUnitsList();
00079         for (size_t j = 0; j < container.size(); ++j) {
00080           //G4cout << container[j]->GetName() << ' '
00081           //       << container[j]->GetSymbol() << G4endl;
00082           fUnits.insert(container[j]->GetSymbol());
00083         }
00084       }
00085     }
00086 
00087     // Legal Value Types...
00088     fValueTypes.insert("G4String");
00089     fValueTypes.insert("G4int");
00090     fValueTypes.insert("G4double");
00091     fValueTypes.insert("G4ThreeVector");
00092     fValueTypes.insert("G4bool");
00093   }
00094 }

G4AttCheck::~G4AttCheck (  ) 

Definition at line 96 of file G4AttCheck.cc.

00096 {}


Member Function Documentation

G4bool G4AttCheck::Check ( const G4String leader = ""  )  const

Definition at line 110 of file G4AttCheck.cc.

References G4cerr, G4endl, and print().

Referenced by G4XXXStoredSceneHandler::PreAddSolid().

00110                                                      {
00111   // Check only.  Silent unless error - then G4cerr.  Returns error.
00112   G4bool error = false;
00113   static G4int iError = 0;
00114   G4bool print = false;
00115   if (iError < 10 || iError%100 == 0) {
00116     print = true;
00117   }
00118   using namespace std;
00119   if (!fpValues) return error;  // A null values vector is a valid situation.
00120   if (!fpDefinitions) {
00121     ++iError;
00122     error = true;
00123     if (print) {
00124       G4cerr <<
00125         "\n*******************************************************";
00126       if (leader != "") {
00127         G4cerr << '\n' << leader;
00128       }
00129       G4cerr <<
00130         "\nG4AttCheck: ERROR " << iError << ": Null definitions pointer"
00131         "\n*******************************************************"
00132              << G4endl;
00133     }
00134     return error;
00135   }
00136   vector<G4AttValue>::const_iterator iValue;
00137   for (iValue = fpValues->begin(); iValue != fpValues->end(); ++iValue) {
00138     const G4String& valueName = iValue->GetName();
00139     const G4String& value = iValue->GetValue();
00140     map<G4String,G4AttDef>::const_iterator iDef =
00141       fpDefinitions->find(valueName);
00142     if (iDef == fpDefinitions->end()) {
00143       ++iError;
00144       error = true;
00145       if (print) {
00146         G4cerr <<
00147           "\n*******************************************************";
00148         if (leader != "") {
00149           G4cerr << '\n' << leader;
00150         }
00151         G4cerr <<
00152           "\nG4AttCheck: ERROR " << iError << ": No G4AttDef for G4AttValue \""
00153                <<  valueName << "\": " << value <<
00154           "\n*******************************************************"
00155                << G4endl;
00156       }
00157     } else {
00158       const G4String& category = iDef->second.GetCategory();
00159       const G4String& extra = iDef->second.GetExtra();
00160       const G4String& valueType = iDef->second.GetValueType();
00161       if (fCategories.find(category) == fCategories.end()) {
00162         ++iError;
00163         error = true;
00164         if (print) {
00165           G4cerr <<
00166             "\n*******************************************************";
00167           if (leader != "") {
00168             G4cerr << '\n' << leader;
00169           }
00170           G4cerr <<
00171             "\nG4AttCheck: ERROR " << iError << ": Illegal Category Field \""
00172                  << category << "\" for G4AttValue \""
00173                  << valueName << "\": " << value <<
00174             "\n  Possible Categories:";
00175           set<G4String>::iterator i;
00176           for (i = fCategories.begin(); i != fCategories.end(); ++i) {
00177             G4cerr << ' ' << *i;
00178           }
00179           G4cerr <<
00180             "\n*******************************************************"
00181                  << G4endl;
00182         }
00183       }
00184       if(category == "Physics" && fUnits.find(extra) == fUnits.end()) {
00185         ++iError;
00186         error = true;
00187         if (print) {
00188           G4cerr <<
00189             "\n*******************************************************";
00190           if (leader != "") {
00191             G4cerr << '\n' << leader;
00192           }
00193           G4cerr <<
00194             "\nG4AttCheck: ERROR " << iError << ": Illegal Extra field \""
00195                  << extra << "\" for G4AttValue \""
00196                  << valueName << "\": " << value <<
00197             "\n  Possible Extra fields if Category==\"Physics\":\n    ";
00198           set<G4String>::iterator i;
00199           for (i = fUnits.begin(); i != fUnits.end(); ++i) {
00200             G4cerr << ' ' << *i;
00201           }
00202           G4cerr <<
00203             "\n*******************************************************"
00204                  << G4endl;
00205         }
00206       }
00207       if (fValueTypes.find(valueType) == fValueTypes.end()) {
00208         ++iError;
00209         error = true;
00210         if (print) {
00211           G4cerr <<
00212             "\n*******************************************************";
00213           if (leader != "") {
00214             G4cerr << '\n' << leader;
00215           }
00216           G4cerr <<
00217             "\nG4AttCheck: ERROR " << iError << ": Illegal Value Type field \""
00218                  << valueType << "\" for G4AttValue \""
00219                  << valueName << "\": " << value <<
00220             "\n  Possible Value Types:";
00221           set<G4String>::iterator i;
00222           for (i = fValueTypes.begin(); i != fValueTypes.end(); ++i) {
00223             G4cerr << ' ' << *i;
00224           }
00225           G4cerr <<
00226             "\n*******************************************************"
00227                << G4endl;
00228         }
00229       }
00230     }
00231   }
00232   return error;
00233 }

const std::map<G4String,G4AttDef>* G4AttCheck::GetAttDefs (  )  const [inline]

Definition at line 71 of file G4AttCheck.hh.

00071                                                       {
00072     return fpDefinitions;
00073   }

const std::vector<G4AttValue>* G4AttCheck::GetAttValues (  )  const [inline]

Definition at line 67 of file G4AttCheck.hh.

00067                                                     {
00068     return fpValues;
00069   }

G4bool G4AttCheck::Standard ( std::vector< G4AttValue > *  standardValues,
std::map< G4String, G4AttDef > *  standardDefinitions 
) const

Definition at line 336 of file G4AttCheck.cc.

References G4UIcommand::ConvertTo3Vector(), G4UIcommand::ConvertToDimensioned3Vector(), G4UIcommand::ConvertToDimensionedDouble(), G4UIcommand::ConvertToString(), G4cerr, G4endl, G4UnitDefinition::GetCategory(), G4UnitDefinition::GetValueOf(), and G4String::strip().

Referenced by G4XXXStoredSceneHandler::PreAddSolid().

00337                                                        {
00338   // Places standard versions in provided vector and map and returns error.
00339   // Assumes valid input.  Use Check to check.
00340   using namespace std;
00341   G4bool error = false;
00342   vector<G4AttValue>::const_iterator iValue;
00343   for (iValue = fpValues->begin(); iValue != fpValues->end(); ++iValue) {
00344     const G4String& valueName = iValue->GetName();
00345     const G4String& value = iValue->GetValue();
00346     map<G4String,G4AttDef>::const_iterator iDef =
00347       fpDefinitions->find(valueName);
00348     if (iDef == fpDefinitions->end()) {
00349       error = true;
00350     } else {
00351       const G4String& category = iDef->second.GetCategory();
00352       const G4String& extra = iDef->second.GetExtra();
00353       const G4String& valueType = iDef->second.GetValueType();
00354       if (fCategories.find(category) == fCategories.end() ||
00355           (category == "Physics" && fUnits.find(extra) == fUnits.end()) ||
00356           fValueTypes.find(valueType) == fValueTypes.end()) {
00357         error = true;
00358       } else {
00359         if (category != "Physics") {  // Simply copy...
00360           standardValues->push_back(*iValue);
00361           (*standardDefinitions)[valueName] =
00362             fpDefinitions->find(valueName)->second;
00363         } else {  // "Physics"...
00364           if (extra.empty()) {  // Dimensionless...
00365             if (valueType == "G4ThreeVector") {  // Split vector into 3...
00366               G4ThreeVector internalValue =
00367                 G4UIcommand::ConvertTo3Vector(value);
00368               AddValuesAndDefs
00369                 (standardValues,standardDefinitions,
00370                  valueName,valueName+"-X",
00371                  G4UIcommand::ConvertToString(internalValue.x()),"",
00372                  fpDefinitions->find(valueName)->second.GetDesc()+"-X");
00373               AddValuesAndDefs
00374                 (standardValues,standardDefinitions,
00375                  valueName,valueName+"-Y",
00376                  G4UIcommand::ConvertToString(internalValue.y()),"",
00377                  fpDefinitions->find(valueName)->second.GetDesc()+"-Y");
00378               AddValuesAndDefs
00379                 (standardValues,standardDefinitions,
00380                  valueName,valueName+"-Z",
00381                  G4UIcommand::ConvertToString(internalValue.z()),"",
00382                  fpDefinitions->find(valueName)->second.GetDesc()+"-Z");
00383             } else {  // Simply copy...
00384               standardValues->push_back(*iValue);
00385               (*standardDefinitions)[valueName] =
00386                 fpDefinitions->find(valueName)->second;
00387             }
00388           } else {  // Dimensioned...
00389             G4String valueAndUnit;
00390             G4String unit;
00391             if (extra == "G4BestUnit") {
00392               valueAndUnit = value;
00393               valueAndUnit = valueAndUnit.strip();
00394               unit = valueAndUnit.substr(valueAndUnit.rfind(' ')+1);
00395             } else {
00396               valueAndUnit = value + ' ' + extra;
00397               valueAndUnit = valueAndUnit.strip();
00398               unit = extra;
00399             }
00400             G4String unitCategory = G4UnitDefinition::GetCategory(unit);
00401             if (fUnitCategories.find(unitCategory) != fUnitCategories.end()) {
00402               G4String standardUnit = fStandardUnits[unitCategory];
00403               G4double valueOfStandardUnit =
00404                 G4UnitDefinition::GetValueOf(standardUnit);
00405 //            G4String exstr = iDef->second.GetExtra();
00406               if (valueType == "G4ThreeVector") {  // Split vector into 3...
00407                 G4ThreeVector internalValue =
00408                   G4UIcommand::ConvertToDimensioned3Vector(valueAndUnit);
00409                 AddValuesAndDefs
00410                   (standardValues,standardDefinitions,
00411                    valueName,valueName+"-X",
00412                    G4UIcommand::ConvertToString
00413                    (internalValue.x()/valueOfStandardUnit),
00414                    standardUnit,
00415                    fpDefinitions->find(valueName)->second.GetDesc()+"-X");
00416                 AddValuesAndDefs
00417                   (standardValues,standardDefinitions,
00418                    valueName,valueName+"-Y",
00419                    G4UIcommand::ConvertToString
00420                    (internalValue.y()/valueOfStandardUnit),
00421                    standardUnit,
00422                    fpDefinitions->find(valueName)->second.GetDesc()+"-Y");
00423                 AddValuesAndDefs
00424                   (standardValues,standardDefinitions,
00425                    valueName,valueName+"-Z",
00426                    G4UIcommand::ConvertToString
00427                    (internalValue.z()/valueOfStandardUnit),
00428                    standardUnit,
00429                    fpDefinitions->find(valueName)->second.GetDesc()+"-Z");
00430               } else {
00431                 G4double internalValue =
00432                   G4UIcommand::ConvertToDimensionedDouble(valueAndUnit);
00433                 AddValuesAndDefs
00434                   (standardValues,standardDefinitions,
00435                    valueName,valueName,
00436                    G4UIcommand::ConvertToString
00437                    (internalValue/valueOfStandardUnit),
00438                    standardUnit);
00439               }
00440             }
00441           }
00442         }
00443       }
00444     }
00445   }
00446   if (error) {
00447     G4cerr << "G4AttCheck::Standard: Conversion error." << G4endl;
00448   }
00449   return error;
00450 }


Friends And Related Function Documentation

std::ostream& operator<< ( std::ostream &  os,
const G4AttCheck ac 
) [friend]

Definition at line 235 of file G4AttCheck.cc.

00236 {
00237   using namespace std;
00238   if (!ac.fpDefinitions) {
00239     os << "G4AttCheck: ERROR: zero definitions pointer." << endl;
00240     return os;
00241   }
00242   G4String storeKey;
00243   if (G4AttDefStore::GetStoreKey(ac.fpDefinitions, storeKey)) {
00244     os << storeKey << ':' << endl;
00245   }
00246   if (!ac.fpValues) {
00247     // A null values vector is a valid situation.
00248     os << "G4AttCheck: zero values pointer." << endl;
00249     return os;
00250   }
00251   vector<G4AttValue>::const_iterator iValue;
00252   for (iValue = ac.fpValues->begin(); iValue != ac.fpValues->end(); ++iValue) {
00253     const G4String& valueName = iValue->GetName();
00254     const G4String& value = iValue->GetValue();
00255     map<G4String,G4AttDef>::const_iterator iDef =
00256       ac.fpDefinitions->find(valueName);
00257     G4bool error = false;
00258     if (iDef == ac.fpDefinitions->end()) {
00259       error = true;
00260       os << "G4AttCheck: ERROR: No G4AttDef for G4AttValue \""
00261          << valueName << "\": " << value << endl;
00262     } else {
00263       const G4String& category = iDef->second.GetCategory();
00264       const G4String& extra = iDef->second.GetExtra();
00265       const G4String& valueType = iDef->second.GetValueType();
00266       if (ac.fCategories.find(category) == ac.fCategories.end()) {
00267         error = true;
00268         os <<
00269           "G4AttCheck: ERROR: Illegal Category Field \"" << category
00270            << "\" for G4AttValue \"" << valueName << "\": " << value <<
00271           "\n  Possible Categories:";
00272         set<G4String>::iterator i;
00273         for (i = ac.fCategories.begin(); i != ac.fCategories.end(); ++i) {
00274           os << ' ' << *i;
00275         }
00276         os << endl;
00277       }
00278       if(category == "Physics" && ac.fUnits.find(extra) == ac.fUnits.end()) {
00279         error = true;
00280         os <<
00281           "G4AttCheck: ERROR: Illegal Extra field \""<< extra
00282            << "\" for G4AttValue \"" << valueName << "\": " << value <<
00283           "\n  Possible Extra fields if Category==\"Physics\":\n    ";
00284         set<G4String>::iterator i;
00285         for (i = ac.fUnits.begin(); i != ac.fUnits.end(); ++i) {
00286           os << ' ' << *i;
00287         }
00288         os << endl;
00289       }
00290       if (ac.fValueTypes.find(valueType) == ac.fValueTypes.end()) {
00291         error = true;
00292         os <<
00293           "G4AttCheck: ERROR: Illegal Value Type field \"" << valueType
00294            << "\" for G4AttValue \"" << valueName << "\": " << value <<
00295           "\n  Possible Value Types:";
00296         set<G4String>::iterator i;
00297         for (i = ac.fValueTypes.begin(); i != ac.fValueTypes.end(); ++i) {
00298           os << ' ' << *i;
00299         }
00300         os << endl;
00301       }
00302     }
00303     if (!error) {
00304       os << iDef->second.GetDesc()
00305          << " (" << valueName
00306          << "): " << value;
00307       if (iDef->second.GetCategory() == "Physics" &&
00308           !iDef->second.GetExtra().empty()) {
00309         os << " (" << iDef->second.GetExtra() << ")";
00310       }
00311       os << endl;
00312     }
00313   }
00314   return os;
00315 }


The documentation for this class was generated from the following files:
Generated on Mon May 27 17:51:28 2013 for Geant4 by  doxygen 1.4.7