// // ******************************************************************** // * License and Disclaimer * // * * // * The Geant4 software is copyright of the Copyright Holders of * // * the Geant4 Collaboration. It is provided under the terms and * // * conditions of the Geant4 Software License, included in the file * // * LICENSE and available at http://cern.ch/geant4/license . These * // * include a list of copyright holders. * // * * // * Neither the authors of this software system, nor their employing * // * institutes,nor the agencies providing financial support for this * // * work make any representation or warranty, express or implied, * // * regarding this software system or assume any liability for its * // * use. Please see the license in the file LICENSE and URL above * // * for the full disclaimer and the limitation of liability. * // * * // * This code implementation is the result of the scientific and * // * technical work of the GEANT4 collaboration. * // * By using, copying, modifying or distributing the software (or * // * any work based on the software) you agree to acknowledge its * // * use in resulting scientific publications, and indicate your * // * acceptance of all terms of the Geant4 Software license. * // ******************************************************************** // // // $Id: G4UnitsTable.cc,v 1.37 2008/05/06 17:17:08 maire Exp $ // GEANT4 tag $Name: geant4-09-02-ref-02 $ // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // // 17-05-98: first version, M.Maire // 05-08-98: angstrom,microbarn,picobarn,petaelectronvolt, M.Maire // 13-10-98: units and symbols printed in fixed length, M.Maire // 01-03-01: parsec, M.Maire // 06-03-01: migration to STL vectors, G.Cosmo // 06-05-02: BestUnit operator<< flux instead of G4cout (mma) // 12-08-05: cm2/g ("Surface/Mass") (mma) // 30-06-05: um for micrometer (mma) // 07-02-06: GeV/cm MeV/cm keV/cm eV/cm ("Energy/Length") (mma) // 15-02-06: g/cm2 ("Mass/Surface") // MeV*cm2/g ..etc.. ("Energy*Surface/Mass") // 18-08-06: remove symbol mum (mma) // 06-05-08: V/m ("Electric field") (mma) // //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... #include "G4UnitsTable.hh" #include #include G4UnitsTable G4UnitDefinition::theUnitsTable; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4UnitDefinition::G4UnitDefinition(const G4String& name, const G4String& symbol, const G4String& category, G4double value) : Name(name),SymbolName(symbol),Value(value) { // //does the Category objet already exist ? size_t nbCat = theUnitsTable.size(); size_t i = 0; while ((iGetName()!=category)) { i++; } if (i == nbCat) { theUnitsTable.push_back( new G4UnitsCategory(category)); } CategoryIndex = i; // //insert this Unit in the Unitstable (theUnitsTable[CategoryIndex]->GetUnitsList()).push_back(this); //update string max length for name and symbol theUnitsTable[i]->UpdateNameMxLen((G4int)name.length()); theUnitsTable[i]->UpdateSymbMxLen((G4int)symbol.length()); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4UnitDefinition::~G4UnitDefinition() { } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4UnitDefinition::G4UnitDefinition(const G4UnitDefinition& right) { *this = right; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4UnitDefinition& G4UnitDefinition::operator=(const G4UnitDefinition& right) { if (this != &right) { Name = right.Name; SymbolName = right.SymbolName; Value = right.Value; CategoryIndex = right.CategoryIndex; } return *this; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4int G4UnitDefinition::operator==(const G4UnitDefinition& right) const { return (this == (G4UnitDefinition *) &right); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4int G4UnitDefinition::operator!=(const G4UnitDefinition &right) const { return (this != (G4UnitDefinition *) &right); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4UnitsTable& G4UnitDefinition::GetUnitsTable() { return theUnitsTable; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4double G4UnitDefinition::GetValueOf(const G4String& str) { if(theUnitsTable.size()==0) { BuildUnitsTable(); } G4String name,symbol; for (size_t i=0;iGetUnitsList(); for (size_t j=0;jGetName(); symbol=units[j]->GetSymbol(); if(str==name||str==symbol) { return units[j]->GetValue(); } } } G4cout << "Warning from G4UnitDefinition::GetValueOf(" << str << ")." << " The unit " << str << " does not exist in UnitsTable." << " Return Value = 0." << G4endl; return 0.; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4String G4UnitDefinition::GetCategory(const G4String& str) { if(theUnitsTable.size()==0) { BuildUnitsTable(); } G4String name,symbol; for (size_t i=0;iGetUnitsList(); for (size_t j=0;jGetName(); symbol=units[j]->GetSymbol(); if(str==name||str==symbol) { return theUnitsTable[i]->GetName(); } } } G4cout << "Warning from G4UnitDefinition::GetCategory(" << str << ")." << " The unit " << str << " does not exist in UnitsTable." << " Return category = None" << G4endl; name = "None"; return name; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4UnitDefinition::PrintDefinition() { G4int nameL = theUnitsTable[CategoryIndex]->GetNameMxLen(); G4int symbL = theUnitsTable[CategoryIndex]->GetSymbMxLen(); G4cout << std::setw(nameL) << Name << " (" << std::setw(symbL) << SymbolName << ") = " << Value << G4endl; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4UnitDefinition::BuildUnitsTable() { //Length new G4UnitDefinition( "parsec","pc" ,"Length",parsec); new G4UnitDefinition( "kilometer","km" ,"Length",kilometer); new G4UnitDefinition( "meter","m" ,"Length",meter); new G4UnitDefinition("centimeter","cm" ,"Length",centimeter); new G4UnitDefinition("millimeter","mm" ,"Length",millimeter); new G4UnitDefinition("micrometer","um" ,"Length",micrometer); new G4UnitDefinition( "nanometer","nm" ,"Length",nanometer); new G4UnitDefinition( "angstrom","Ang" ,"Length",angstrom); new G4UnitDefinition( "fermi","fm" ,"Length",fermi); //Surface new G4UnitDefinition( "kilometer2","km2" ,"Surface",kilometer2); new G4UnitDefinition( "meter2","m2" ,"Surface",meter2); new G4UnitDefinition("centimeter2","cm2" ,"Surface",centimeter2); new G4UnitDefinition("millimeter2","mm2" ,"Surface",millimeter2); new G4UnitDefinition( "barn","barn" ,"Surface",barn); new G4UnitDefinition( "millibarn","mbarn" ,"Surface",millibarn); new G4UnitDefinition( "microbarn","mubarn" ,"Surface",microbarn); new G4UnitDefinition( "nanobarn","nbarn" ,"Surface",nanobarn); new G4UnitDefinition( "picobarn","pbarn" ,"Surface",picobarn); //Volume new G4UnitDefinition( "kilometer3","km3" ,"Volume",kilometer3); new G4UnitDefinition( "meter3","m3" ,"Volume",meter3); new G4UnitDefinition("centimeter3","cm3" ,"Volume",centimeter3); new G4UnitDefinition("millimeter3","mm3" ,"Volume",millimeter3); //Angle new G4UnitDefinition( "radian","rad" ,"Angle",radian); new G4UnitDefinition("milliradian","mrad" ,"Angle",milliradian); new G4UnitDefinition( "steradian","sr" ,"Angle",steradian); new G4UnitDefinition( "degree","deg" ,"Angle",degree); //Time new G4UnitDefinition( "second","s" ,"Time",second); new G4UnitDefinition("millisecond","ms" ,"Time",millisecond); new G4UnitDefinition("microsecond","mus" ,"Time",microsecond); new G4UnitDefinition( "nanosecond","ns" ,"Time",nanosecond); new G4UnitDefinition( "picosecond","ps" ,"Time",picosecond); //Frequency new G4UnitDefinition( "hertz","Hz" ,"Frequency",hertz); new G4UnitDefinition("kilohertz","kHz" ,"Frequency",kilohertz); new G4UnitDefinition("megahertz","MHz" ,"Frequency",megahertz); //Electric charge new G4UnitDefinition( "eplus","e+" ,"Electric charge",eplus); new G4UnitDefinition("coulomb","C" ,"Electric charge",coulomb); //Energy new G4UnitDefinition( "electronvolt","eV" ,"Energy",electronvolt); new G4UnitDefinition("kiloelectronvolt","keV","Energy",kiloelectronvolt); new G4UnitDefinition("megaelectronvolt","MeV","Energy",megaelectronvolt); new G4UnitDefinition("gigaelectronvolt","GeV","Energy",gigaelectronvolt); new G4UnitDefinition("teraelectronvolt","TeV","Energy",teraelectronvolt); new G4UnitDefinition("petaelectronvolt","PeV","Energy",petaelectronvolt); new G4UnitDefinition( "joule","J" ,"Energy",joule); // Energy/Length new G4UnitDefinition( "GeV/cm", "GeV/cm","Energy/Length", GeV/cm); new G4UnitDefinition( "MeV/cm", "MeV/cm","Energy/Length", MeV/cm); new G4UnitDefinition( "keV/cm", "keV/cm","Energy/Length", keV/cm); new G4UnitDefinition( "eV/cm", "eV/cm","Energy/Length", eV/cm); //Mass new G4UnitDefinition("milligram","mg","Mass",milligram); new G4UnitDefinition( "gram","g" ,"Mass",gram); new G4UnitDefinition( "kilogram","kg","Mass",kilogram); //Volumic Mass new G4UnitDefinition( "g/cm3", "g/cm3","Volumic Mass", g/cm3); new G4UnitDefinition("mg/cm3","mg/cm3","Volumic Mass",mg/cm3); new G4UnitDefinition("kg/m3", "kg/m3", "Volumic Mass",kg/m3); // Mass/Surface new G4UnitDefinition( "g/cm2", "g/cm2","Mass/Surface", g/cm2); new G4UnitDefinition( "mg/cm2", "mg/cm2","Mass/Surface", mg/cm2); new G4UnitDefinition( "kg/cm2", "kg/cm2","Mass/Surface", kg/cm2); // Surface/Mass new G4UnitDefinition( "cm2/g", "cm2/g","Surface/Mass", cm2/g); // Energy.Surface/Mass new G4UnitDefinition( "eV*cm2/g", " eV*cm2/g","Energy*Surface/Mass", eV*cm2/g); new G4UnitDefinition("keV*cm2/g", "keV*cm2/g","Energy*Surface/Mass",keV*cm2/g); new G4UnitDefinition("MeV*cm2/g", "MeV*cm2/g","Energy*Surface/Mass",MeV*cm2/g); new G4UnitDefinition("GeV*cm2/g", "GeV*cm2/g","Energy*Surface/Mass",GeV*cm2/g); //Power new G4UnitDefinition("watt","W","Power",watt); //Force new G4UnitDefinition("newton","N","Force",newton); //Pressure new G4UnitDefinition( "pascal","Pa" ,"Pressure",pascal); new G4UnitDefinition( "bar","bar","Pressure",bar); new G4UnitDefinition("atmosphere","atm","Pressure",atmosphere); //Electric current new G4UnitDefinition( "ampere","A" ,"Electric current",ampere); new G4UnitDefinition("milliampere","mA" ,"Electric current",milliampere); new G4UnitDefinition("microampere","muA","Electric current",microampere); new G4UnitDefinition( "nanoampere","nA" ,"Electric current",nanoampere); //Electric potential new G4UnitDefinition( "volt","V" ,"Electric potential",volt); new G4UnitDefinition("kilovolt","kV","Electric potential",kilovolt); new G4UnitDefinition("megavolt","MV","Electric potential",megavolt); //Electric field new G4UnitDefinition( "volt/m","V/m","Electric field",volt/m); //Magnetic flux new G4UnitDefinition("weber","Wb","Magnetic flux",weber); //Magnetic flux density new G4UnitDefinition( "tesla","T" ,"Magnetic flux density",tesla); new G4UnitDefinition("kilogauss","kG","Magnetic flux density",kilogauss); new G4UnitDefinition( "gauss","G" ,"Magnetic flux density",gauss); //Temperature new G4UnitDefinition("kelvin","K","Temperature",kelvin); //Amount of substance new G4UnitDefinition("mole","mol","Amount of substance",mole); //Activity new G4UnitDefinition("becquerel","Bq","Activity",becquerel); new G4UnitDefinition( "curie","Ci","Activity",curie); //Dose new G4UnitDefinition("gray","Gy","Dose",gray); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4UnitDefinition::PrintUnitsTable() { G4cout << "\n ----- The Table of Units ----- \n"; for(size_t i=0;iPrintCategory(); } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void G4UnitDefinition::ClearUnitsTable() { for (size_t i=0;iPrintDefinition(); } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4BestUnit::G4BestUnit(G4double value, const G4String& category) : nbOfVals(1) { // find the category G4UnitsTable& theUnitsTable = G4UnitDefinition::GetUnitsTable(); size_t nbCat = theUnitsTable.size(); size_t i = 0; while ((iGetName()!=category)) { i++; } if (i == nbCat) { G4cout << " G4BestUnit: the category " << category << " does not exist !!" << G4endl; G4Exception("G4BestUnit::G4BestUnit()", "InvalidCall", FatalException, "Missing unit category !") ; } // Value[0] = value; Value[1] = 0.; Value[2] = 0.; IndexOfCategory = i; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4BestUnit::G4BestUnit(const G4ThreeVector& value, const G4String& category) : nbOfVals(3) { // find the category G4UnitsTable& theUnitsTable = G4UnitDefinition::GetUnitsTable(); size_t nbCat = theUnitsTable.size(); size_t i = 0; while ((iGetName()!=category)) { i++; } if (i == nbCat) { G4cerr << " G4BestUnit: the category " << category << " does not exist." << G4endl; G4Exception("G4BestUnit::G4BestUnit()", "InvalidCall", FatalException, "Missing unit category !") ; } // Value[0] = value.x(); Value[1] = value.y(); Value[2] = value.z(); IndexOfCategory = i; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4BestUnit::~G4BestUnit() {} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... G4BestUnit::operator G4String () const { std::ostringstream oss; oss << *this; return oss.str(); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... std::ostream& operator<<(std::ostream& flux, G4BestUnit a) { G4UnitsTable& theUnitsTable = G4UnitDefinition::GetUnitsTable(); G4UnitsContainer& List = theUnitsTable[a.IndexOfCategory] ->GetUnitsList(); G4int len = theUnitsTable[a.IndexOfCategory]->GetSymbMxLen(); G4int ksup(-1), kinf(-1); G4double umax(0.), umin(DBL_MAX); G4double rsup(DBL_MAX), rinf(0.); //for a ThreeVector, choose the best unit for the biggest value G4double value = std::max(std::max(std::fabs(a.Value[0]), std::fabs(a.Value[1])), std::fabs(a.Value[2])); for (size_t k=0; kGetValue(); if (!(value!=DBL_MAX)) {if(unit>umax) {umax=unit; ksup=k;}} else if (value<=DBL_MIN) {if(unit=1.)&&(ratiorinf)) {rinf=ratio; kinf=k;} } } G4int index=ksup; if(index==-1) { index=kinf; } if(index==-1) { index=0; } for (G4int j=0; jGetValue()) << " "; } std::ios::fmtflags oldform = flux.flags(); flux.setf(std::ios::left,std::ios::adjustfield); flux << std::setw(len) << List[index]->GetSymbol(); flux.flags(oldform); return flux; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......