src/BDSMaterials.cc

00001 /* BDSIM code.    Version 1.0
00002    Author: Grahame A. Blair, Royal Holloway, Univ. of London.
00003    Last modified 24.7.2002
00004    Copyright (c) 2002 by G.A.Blair.  ALL RIGHTS RESERVED. 
00005 
00006    Modified 22.03.05 by J.C.Carter, Royal Holloway, Univ. of London.
00007    Added GABs LCBeamGasPlugMat Material
00008    Added LCLead
00009 
00010    Modified 13.09.07 by S.P.Malton, Royal Holloway, Univ. of London.
00011    Created maps of materials and elements
00012    Added Initialise function
00013    Added Add/GetElement/Material functions
00014    Cleanup in destructor
00015    Added ListMaterials function
00016 */
00017 
00018 #include "BDSGlobalConstants.hh" 
00019 
00020 #include "BDSMaterials.hh"
00021 #include "G4NistManager.hh"
00022 
00023 
00024 using namespace std;
00025 
00026 BDSMaterials* BDSMaterials::_instance = 0;
00027 
00028 BDSMaterials* BDSMaterials::Instance(){
00029   if(_instance==0) {
00030     _instance = new BDSMaterials();
00031   }
00032   return _instance;
00033 }
00034 
00035 BDSMaterials::BDSMaterials(){
00036   Initialise();
00037 }
00038 
00039 void BDSMaterials::Initialise()
00040 {
00041   G4String name, symbol;             //a=mass of a mole;
00042   G4double a, z, density;            //z=mean number of protons;
00043   //G4int iz, n;                       //iz=number of protons  in an isotope;
00044                                    // n=number of nucleons in an isotope;
00045 
00046 
00047   //G4double abundance;
00048   G4double fractionmass;
00049   //G4int ncomponents;
00050   G4double temperature, pressure;
00051 
00052   //
00053   // Define elements
00054   //
00055 #ifdef DEBUG
00056   G4cout << "BDSMaterials: G4 predefined units: " << G4endl;
00057   G4cout << "g= " << g << G4endl;
00058   G4cout << "kg= " << kg << G4endl;
00059   G4cout << "cm= " << cm << G4endl;
00060   G4cout << "m= " << m << G4endl;
00061   G4cout << "mm= " << mm << G4endl;
00062   G4cout << "um= " << um << G4endl;
00063   G4cout << "nm= " << nm << G4endl;
00064   G4cout << "mole= " << mole << G4endl;
00065   G4cout << "kelvin= " << kelvin << G4endl;
00066   G4cout << "tesla= " << tesla << G4endl;
00067 #endif
00068   
00069   tmpElement = new G4Element
00070     (name="Hydrogen"   , symbol="H" , z=  1., a=   1.00*g/mole); elements[symbol] = tmpElement;
00071 
00072   tmpElement = new G4Element
00073     (name="Helium"     , symbol="He", z=  2., a=   4.0026*g/mole); elements[symbol] = tmpElement;
00074 
00075   tmpElement = new G4Element
00076     (name="Beryllium"  , symbol="Be", z=  4., a=   9.0122*g/mole); elements[symbol] = tmpElement;
00077 
00078   tmpElement = new G4Element
00079     (name="Boron"  , symbol="B", z=  5., a=   10.811*g/mole); elements[symbol] = tmpElement;
00080 
00081   tmpElement = new G4Element
00082     (name="Carbon"     , symbol="C" , z=  6., a=  12.00*g/mole); elements[symbol] = tmpElement;
00083 
00084   tmpElement = new G4Element
00085     (name="Nitrogen"   , symbol="N" , z=  7., a=  14.01*g/mole); elements[symbol] = tmpElement;
00086 
00087   tmpElement = new G4Element
00088     (name="Oxygen"     , symbol="O" , z=  8., a=  16.00*g/mole); elements[symbol] = tmpElement;
00089 
00090   tmpElement = new G4Element
00091     (name="Aluminium"  , symbol="Al", z= 13., a=  26.98*g/mole); elements[symbol] = tmpElement;
00092 
00093   tmpElement =  new G4Element
00094     (name="Silicon"    , symbol="Si", z= 14., a=  28.09*g/mole); elements[symbol] = tmpElement;
00095 
00096   tmpElement = new G4Element
00097     (name="Phosphorous", symbol="P" , z= 15., a=  30.973762*g/mole); elements[symbol] = tmpElement;
00098 
00099   tmpElement = new G4Element
00100     (name="Sulphur"    , symbol="S" , z= 16., a=  32.066*g/mole); elements[symbol] = tmpElement;
00101 
00102   tmpElement = new G4Element
00103     (name="Calcium"    , symbol="Ca", z= 20., a=  40.078*g/mole); elements[symbol] = tmpElement;
00104 
00105   tmpElement = new G4Element
00106     (name="Titanium"   , symbol="Ti", z= 22., a=  47.867*g/mole); elements[symbol] = tmpElement;
00107 
00108   tmpElement = new G4Element
00109     (name="Zirkonium"   , symbol="Zr", z= 40., a=  91.224*g/mole); elements[symbol] = tmpElement;
00110 
00111   tmpElement = new G4Element
00112     (name="Strontium"   , symbol="Sr", z= 38., a=  87.62*g/mole); elements[symbol] = tmpElement;
00113 
00114   tmpElement = new G4Element
00115     (name="Magnesium"   , symbol="Mg", z= 12., a=  24.3050*g/mole); elements[symbol] = tmpElement;
00116 
00117   tmpElement = new G4Element
00118     (name="Potassium"   , symbol="K", z= 19., a=  39.0983*g/mole); elements[symbol] = tmpElement;
00119 
00120   tmpElement = new G4Element
00121     (name="Vanadium"   , symbol="V" , z= 23., a=  50.9415*g/mole); elements[symbol] = tmpElement;
00122 
00123   tmpElement = new G4Element
00124     (name="Manganese"  , symbol="Mn", z= 25., a=  54.93805*g/mole); elements[symbol] = tmpElement;
00125 
00126   tmpElement = new G4Element
00127     (name="Iron"       , symbol="Fe", z= 26., a=  55.847*g/mole); elements[symbol] = tmpElement;
00128 
00129   tmpElement = new G4Element
00130     (name="Cobalt"     , symbol="Co", z= 27., a=  58.93*g/mole); elements[symbol] = tmpElement;
00131 
00132   tmpElement = new G4Element
00133     (name="Nickel"     , symbol="Ni", z= 28., a=  58.693*g/mole); elements[symbol] = tmpElement;
00134 
00135   tmpElement = new G4Element
00136     (name="Copper"     , symbol="Cu", z= 29., a=  63.546*g/mole); elements[symbol] = tmpElement;
00137 
00138   tmpElement = new G4Element
00139     (name="Niobium"    , symbol="Nb", z= 41., a=  92.906*g/mole); elements[symbol] = tmpElement;
00140 
00141   tmpElement = new G4Element
00142     (name="Samarium"   , symbol="Sm", z= 62., a= 150.4*g/mole); elements[symbol] = tmpElement;
00143 
00144   tmpElement = new G4Element
00145     (name="Tungsten"   , symbol="W" , z= 74., a= 183.84*g/mole); elements[symbol] = tmpElement;
00146 
00147   tmpElement = new G4Element
00148     (name="Lead"       , symbol="Pb", z= 82., a= 207.2*g/mole); elements[symbol] = tmpElement;
00149 
00150   tmpElement = new G4Element
00151     (name="Molybdenum"       , symbol="Mo", z= 42., a= 95.94*g/mole); elements[symbol] = tmpElement;
00152 
00153   tmpElement = new G4Element
00154     (name="Chromium"       , symbol="Cr", z= 24., a= 51.9961*g/mole); elements[symbol] = tmpElement;
00155 
00156   tmpElement = new G4Element
00157     (name="Sodium"       , symbol="Na", z= 11., a= 22.98976928*g/mole); elements[symbol] = tmpElement;
00158 
00159   tmpElement = new G4Element
00160     (name="Zinc"       , symbol="Zn", z= 30., a= 65.38*g/mole); elements[symbol] = tmpElement;
00161 
00162   tmpElement = new G4Element
00163     (name="Barium"       , symbol="Ba", z= 56., a= 137.327*g/mole); elements[symbol] = tmpElement;
00164 
00165   tmpElement = new G4Element
00166     (name="Europium"       , symbol="Eu", z= 63., a= 151.964*g/mole); elements[symbol] = tmpElement;
00167 
00168   tmpElement = new G4Element
00169     (name="Uranium"       , symbol="U", z= 92., a=  238.0289*g/mole); elements[symbol] = tmpElement;
00170 
00171   //
00172   // Define materials
00173   //
00174 
00175   //default Geant4 temperature = 273.15 K
00176   //default Geant4 pressure = 1atm
00177 
00178   // solid materials
00179 
00180   tmpMaterial = new G4Material
00181     (name="aluminium"     , density=  2.700*g/cm3, 1, kStateSolid);
00182   tmpMaterial->AddElement(elements["Al"],1);
00183   materials[name] = tmpMaterial; 
00184 
00185   tmpMaterial = new G4Material
00186     (name="vanadium"      , density=  5.800*g/cm3, 1, kStateSolid);
00187   tmpMaterial->AddElement(elements["V"],1);
00188   materials[name] = tmpMaterial; 
00189 
00190   tmpMaterial = new G4Material
00191     (name="tungsten"      , density= 19.3  *g/cm3, 1, kStateSolid);
00192   tmpMaterial->AddElement(elements["W"],1);
00193   materials[name] = tmpMaterial; 
00194 
00195   tmpMaterial = new G4Material
00196     (name="iron"          , density=  7.874 *g/cm3, 1, kStateSolid);
00197   tmpMaterial->AddElement(elements["Fe"],1);
00198   materials[name] = tmpMaterial; 
00199 
00200   tmpMaterial = new G4Material
00201     (name="uranium"          , density=  18.9 *g/cm3, 1, kStateSolid);
00202   tmpMaterial->AddElement(elements["U"],1);
00203   materials[name] = tmpMaterial; 
00204 
00205   tmpMaterial = new G4Material
00206     (name="copper"        , density=  8.96 *g/cm3, 1, kStateSolid);
00207   tmpMaterial->AddElement(elements["Cu"],1);
00208   materials[name] = tmpMaterial; 
00209 
00210   tmpMaterial = new G4Material
00211     (name="weightiron"    , density=  7.87 *g/cm3, 1, kStateSolid);
00212   tmpMaterial->AddElement(elements["Fe"],1);
00213   materials[name] = tmpMaterial; 
00214 
00215   tmpMaterial = new G4Material
00216     (name="titanium"      , density=  4.54 *g/cm3, 1, kStateSolid);
00217   tmpMaterial->AddElement(elements["Ti"],1);
00218   materials[name] = tmpMaterial; 
00219 
00220   tmpMaterial = new G4Material
00221     (name="graphite"      , density=  2.265*g/cm3, 1, kStateSolid);
00222   tmpMaterial->AddElement(elements["C"],1);
00223   materials[name] = tmpMaterial; 
00224 
00225   tmpMaterial = new G4Material
00226     (name="graphitefoam"      , density=  0.61*g/cm3, 1, kStateSolid);
00227   tmpMaterial->AddElement(elements["C"],1);
00228   materials[name] = tmpMaterial; 
00229 
00230   tmpMaterial = new G4Material
00231     (name="lead"          , density= 11.35 *g/cm3, 1, kStateSolid);
00232   tmpMaterial->AddElement(elements["Pb"],1);
00233   materials[name] = tmpMaterial; 
00234 
00235   tmpMaterial = new G4Material
00236     (name="silicon"       , density=  2.33 *g/cm3, 1, kStateSolid);
00237   tmpMaterial->AddElement(elements["Si"],1);
00238   materials[name] = tmpMaterial; 
00239 
00240   tmpMaterial = new G4Material
00241     (name="beryllium"     , density=  1.848*g/cm3, 1, kStateSolid);
00242   tmpMaterial->AddElement(elements["Be"],1);
00243   materials[name] = tmpMaterial; 
00244 
00245   tmpMaterial = new G4Material
00246     (name="smco"          , density=  8.4  *g/cm3, 2, kStateSolid, 300*kelvin);
00247   tmpMaterial->AddElement(elements["Sm"],fractionmass=0.338);
00248   tmpMaterial->AddElement(elements["Co"],fractionmass=0.662);
00249   materials[name] = tmpMaterial; 
00250 
00251   tmpMaterial = new G4Material
00252     (name="niobium"       , density=  8.57 *g/cm3, 1, kStateSolid, 2*kelvin);
00253   tmpMaterial->AddElement(elements["Nb"],1);
00254   materials[name] = tmpMaterial; 
00255 
00256   //Titanium alloy (BDS collimator material SLAC-TN-03-069 p25) deacon 15 Jun 2007
00257   tmpMaterial = new G4Material
00258     (name="titaniumalloy" , density=  4.48 *g/cm3, 3, kStateSolid, 300*kelvin);
00259   tmpMaterial->AddElement(elements["V"],  fractionmass=0.025);
00260   tmpMaterial->AddElement(elements["Al"], fractionmass=0.03 );
00261   tmpMaterial->AddElement(elements["Ti"], fractionmass=0.945);
00262   materials[name] = tmpMaterial; 
00263 
00264   //Carbon Steel (shell of cryomodule). LDeacon 21 Feb 2006
00265   tmpMaterial = new G4Material
00266     (name="carbonsteel"   , density=  7.87 *g/cm3, 5, kStateSolid, 100*kelvin);
00267   tmpMaterial->AddElement(elements["C"], fractionmass=0.0017);
00268   tmpMaterial->AddElement(elements["Mn"], fractionmass=0.0045);
00269   tmpMaterial->AddElement(elements["P"], fractionmass=0.0004);
00270   tmpMaterial->AddElement(elements["S"], fractionmass=0.0005);
00271   tmpMaterial->AddElement(elements["Fe"], fractionmass=0.9929);
00272   materials[name] = tmpMaterial; 
00273 
00274   //Stainless Steel 316L
00275   tmpMaterial = new G4Material
00276     (name="stainlesssteel"   , density=  8000 *kg/m3, 10, kStateSolid, 295*kelvin);
00277   tmpMaterial->AddElement(elements["C"], fractionmass=0.0003);
00278   tmpMaterial->AddElement(elements["Mn"], fractionmass=0.02);
00279   tmpMaterial->AddElement(elements["Si"], fractionmass=0.0075);
00280   tmpMaterial->AddElement(elements["P"], fractionmass=0.00045);
00281   tmpMaterial->AddElement(elements["S"], fractionmass=0.0003);
00282   tmpMaterial->AddElement(elements["Cr"], fractionmass=0.17);
00283   tmpMaterial->AddElement(elements["Mo"], fractionmass=0.025);
00284   tmpMaterial->AddElement(elements["Ni"], fractionmass=0.12);
00285   tmpMaterial->AddElement(elements["N"], fractionmass=0.001);
00286   tmpMaterial->AddElement(elements["Fe"], fractionmass=0.65545);
00287   materials[name] = tmpMaterial; 
00288 
00289   //Kapton polyimide film
00290   tmpMaterial = new G4Material
00291     (name="kapton", density=  1.42 *g/cm3, 4, kStateSolid, 295*kelvin);
00292   tmpMaterial->AddElement(elements["H"], fractionmass=0.026362);
00293   tmpMaterial->AddElement(elements["C"], fractionmass=0.691133);
00294   tmpMaterial->AddElement(elements["N"], fractionmass=0.073270);
00295   tmpMaterial->AddElement(elements["O"], fractionmass=0.209235);
00296   materials[name] = tmpMaterial; 
00297 
00298 
00299   tmpMaterial = new G4Material
00300     (name="nbti"          , density=  5.6  *g/cm3, 2, kStateSolid, 4*kelvin);
00301   tmpMaterial->AddElement(elements["Nb"], 1);
00302   tmpMaterial->AddElement(elements["Ti"], 1);
00303   materials[name] = tmpMaterial; 
00304 
00305   tmpMaterial = new G4Material
00306     (name="concrete"      , density=  2.3  *g/cm3, 6, kStateSolid, 300*kelvin);
00307   tmpMaterial->AddElement(elements["Si"], 0.227915);
00308   tmpMaterial->AddElement(elements["O"], 0.60541);
00309   tmpMaterial->AddElement(elements["H"], 0.09972);
00310   tmpMaterial->AddElement(elements["Ca"], 0.04986);
00311   tmpMaterial->AddElement(elements["Al"], 0.014245);
00312   tmpMaterial->AddElement(elements["Fe"], 0.00285);
00313   materials[name] = tmpMaterial; 
00314 
00315   
00316   tmpMaterial = new G4Material(name="lhcconcrete", density= 2.42*g/cm3,
00317                                20, kStateSolid, 300*kelvin);
00318   tmpMaterial->AddElement(elements["H"], 0.59785345499811  *perCent);
00319   tmpMaterial->AddElement(elements["C"], 5.59989402848226  *perCent);
00320   tmpMaterial->AddElement(elements["O"], 49.1111702720319  *perCent);
00321   tmpMaterial->AddElement(elements["Na"], 0.45137935852357 *perCent);
00322   tmpMaterial->AddElement(elements["Mg"], 0.66062806777291 *perCent);
00323   tmpMaterial->AddElement(elements["Al"], 2.05561946276849 *perCent);
00324   tmpMaterial->AddElement(elements["Si"], 18.7995018924154 *perCent);
00325   tmpMaterial->AddElement(elements["K"], 0.65365311079793  *perCent);
00326   tmpMaterial->AddElement(elements["Ca"], 20.0191229406116 *perCent);
00327   tmpMaterial->AddElement(elements["Fe"], 1.11400027114647 *perCent);
00328   tmpMaterial->AddElement(elements["P"], 0.04782827639985  *perCent);
00329   tmpMaterial->AddElement(elements["S"], 0.01195706909996  *perCent);
00330   tmpMaterial->AddElement(elements["Ti"], 0.3457585814739  *perCent);
00331   tmpMaterial->AddElement(elements["Mn"], 0.03856154784738 *perCent);
00332   tmpMaterial->AddElement(elements["Zn"], 0.02401378044242 *perCent);
00333   tmpMaterial->AddElement(elements["Zr"], 0.00737352594498 *perCent);
00334   tmpMaterial->AddElement(elements["Ba"], 0.01783596140744 *perCent);
00335   tmpMaterial->AddElement(elements["Pb"], 0.04623400051985 *perCent);
00336   tmpMaterial->AddElement(elements["Sr"], 0.39757254757374 *perCent);
00337   tmpMaterial->AddElement(elements["Eu"], 4.184974185E-05  *perCent);
00338   materials[name] = tmpMaterial; 
00339 
00340   
00341   tmpMaterial = new G4Material
00342     (name="bn5000"      , density=  1.925  *g/cm3, 5, kStateSolid, 300*kelvin);
00343   tmpMaterial->AddElement(elements["B"], 0.383249242);//0.418535);
00344   tmpMaterial->AddElement(elements["Ni"], 0.472071387);//0.515535);
00345   tmpMaterial->AddElement(elements["O"], 0.0366276887);//0.04);
00346   tmpMaterial->AddElement(elements["Ca"], 0.0228923054);//0.025);
00347   tmpMaterial->AddElement(elements["Si"], 0.0851593762);//0.093);
00348   materials[name] = tmpMaterial; 
00349   G4int natoms;
00350   //The main component of epoxy resin commonly used to insulate magnet coils.
00351   tmpMaterial = new G4Material
00352     (name="aralditef", density = 1.175*g/cm3, 3, kStateSolid, 300*kelvin);
00353   tmpMaterial->AddElement(elements["C"], natoms=12);
00354   tmpMaterial->AddElement(elements["H"], natoms=18);
00355   tmpMaterial->AddElement(elements["O"], natoms=4);
00356   materials[name] = tmpMaterial;
00357 
00358   //A hardener for the epoxy resin
00359   tmpMaterial = new G4Material
00360     (name="hy906", density = 1.225*g/cm3, 3, kStateSolid, 300*kelvin);
00361   tmpMaterial->AddElement(elements["C"], natoms=10);
00362   tmpMaterial->AddElement(elements["H"], natoms=5);
00363   tmpMaterial->AddElement(elements["O"], natoms=3);
00364   materials[name] = tmpMaterial;
00365 
00366   //An accelerator for epoxy resin
00367   tmpMaterial = new G4Material
00368     (name="dy061", density = 1.025*g/cm3, 4, kStateSolid, 300*kelvin);
00369   tmpMaterial->AddElement(elements["C"], natoms=15);
00370   tmpMaterial->AddElement(elements["H"], natoms=25 );
00371   tmpMaterial->AddElement(elements["O"], natoms=1 );
00372   tmpMaterial->AddElement(elements["N"], natoms=3 );
00373   materials[name] = tmpMaterial;
00374 
00375   //Material type 3 from CERN 81-05, "The Selection and Properties of Epoxide Resins Used for the Insulation of Magnet Systems in Radiation Environments".
00376   tmpMaterial = new G4Material
00377     (name="epoxyresin3", density = 1.20*g/cm3, 3, kStateSolid, 300*kelvin);
00378   tmpMaterial->AddMaterial(materials["aralditef"],fractionmass=0.497512);
00379   tmpMaterial->AddMaterial(materials["hy906"],fractionmass=0.497512);
00380   tmpMaterial->AddMaterial(materials["dy061"],fractionmass=0.004976);
00381   materials[name] = tmpMaterial;
00382 
00383   //Invar.Temperature 2 kelvin. LDeacon 6th Feburary 2006
00384   tmpMaterial = new G4Material
00385     (name="invar"         , density=  8.1  *kg/m3, 2, kStateSolid, 2*kelvin);
00386   tmpMaterial->AddElement(elements["Ni"], fractionmass=0.35);
00387   tmpMaterial->AddElement(elements["Fe"], fractionmass=0.65);
00388   materials[name] = tmpMaterial; 
00389 
00390   // "standard" soil (dry)
00391   tmpMaterial = new G4Material
00392     (name="soil"          , density=  1.9  *g/cm3, 4, kStateSolid, 300*kelvin);
00393   tmpMaterial->AddElement(elements["Si"],0.33377483443708611 );
00394   tmpMaterial->AddElement(elements["O"], 0.57218543046357617);
00395   tmpMaterial->AddElement(elements["H"], 0.022516556291390728);
00396   tmpMaterial->AddElement(elements["Al"], 0.071523178807947022);
00397   materials[name] = tmpMaterial; 
00398 
00399   //quartz
00400   tmpMaterial = new G4Material
00401     (name="quartz", density=  2.655  *g/cm3, 2, kStateSolid, 300*kelvin);
00402   tmpMaterial->AddElement(elements["Si"],1);
00403   tmpMaterial->AddElement(elements["O"], 2);
00404   materials[name] = tmpMaterial; 
00405 
00406   //Clay
00407   tmpMaterial = new G4Material
00408     (name="clay", density=  1746  *kg/m3, 4, kStateSolid, 300*kelvin);
00409   tmpMaterial->AddElement(elements["Al"],1);
00410   tmpMaterial->AddElement(elements["O"], 9);
00411   tmpMaterial->AddElement(elements["Si"], 2);
00412   tmpMaterial->AddElement(elements["H"], 4);
00413   materials[name] = tmpMaterial; 
00414 
00415   //Calcium carbonate
00416   tmpMaterial = new G4Material
00417     (name="calciumCarbonate", density=  1201  *kg/m3, 3, kStateSolid, 300*kelvin);
00418   tmpMaterial->AddElement(elements["Ca"],1);
00419   tmpMaterial->AddElement(elements["O"], 3);
00420   tmpMaterial->AddElement(elements["C"], 1);
00421   materials[name] = tmpMaterial; 
00422 
00423   // marl
00424   tmpMaterial = new G4Material
00425     (name="marl"          , density=1474*kg/m3, 2, kStateSolid, 300*kelvin);
00426   tmpMaterial->AddMaterial(materials["clay"], 0.5 );
00427   tmpMaterial->AddMaterial(materials["calciumCarbonate"],0.5);
00428   materials[name] = tmpMaterial; 
00429 
00430   //clayousMarl
00431   tmpMaterial = new G4Material
00432     (name="clayousMarl"          , density=1555*kg/m3, 2, kStateSolid, 300*kelvin);
00433   tmpMaterial->AddMaterial(materials["clay"], 0.65 );
00434   tmpMaterial->AddMaterial(materials["calciumCarbonate"],0.35);
00435   materials[name] = tmpMaterial; 
00436 
00437   //limousMarl
00438   tmpMaterial = new G4Material
00439     (name="limousMarl"          , density=1392*kg/m3, 2, kStateSolid, 300*kelvin);
00440   tmpMaterial->AddMaterial(materials["clay"], 0.35 );
00441   tmpMaterial->AddMaterial(materials["calciumCarbonate"],0.65);
00442   materials[name] = tmpMaterial; 
00443 
00444   tmpMaterial = new G4Material
00445     (name="leadtungstate" , density=  8.27 *g/cm3, 3, kStateSolid);
00446   tmpMaterial->AddElement(elements["Pb"], 1);
00447   tmpMaterial->AddElement(elements["W"], 1);
00448   tmpMaterial->AddElement(elements["O"], 4);
00449   materials[name] = tmpMaterial; 
00450 
00451         tmpMaterial = new G4Material 
00452                 (name="FusedSilica", density=1.032*g/cm3, 2, kStateSolid);
00453         tmpMaterial->AddElement(elements["O"],2);
00454         tmpMaterial->AddElement(elements["Si"],1);
00455         const G4int FusedSilica_NUMENTRIES = 3; //Number of entries in the material properties table
00456   G4double FusedSilica_RIND[FusedSilica_NUMENTRIES]={1.49,1.49,1.49};
00457   G4double FusedSilica_AbsLength[FusedSilica_NUMENTRIES]={420.*cm,420.*cm,420.*cm};
00458   G4double FusedSilica_Energy[FusedSilica_NUMENTRIES] = {2.0*eV,7.0*eV,7.14*eV};
00459   fsMaterialPropertiesTable= new G4MaterialPropertiesTable();
00460   fsMaterialPropertiesTable->AddProperty("ABSLENGTH",FusedSilica_Energy,FusedSilica_AbsLength,FusedSilica_NUMENTRIES);
00461   fsMaterialPropertiesTable->AddProperty("RINDEX",FusedSilica_Energy,FusedSilica_RIND,FusedSilica_NUMENTRIES);
00462   tmpMaterial->SetMaterialPropertiesTable(fsMaterialPropertiesTable);
00463   materials[name] = tmpMaterial; 
00464 
00465   // liquid materials
00466 
00467   tmpMaterial = new G4Material
00468     (name="liquidhelium"  , density=  0.12498*g/cm3, 1, kStateLiquid, 4.15*kelvin);
00469   tmpMaterial->AddElement(elements["He"],1);
00470   materials[name] = tmpMaterial; 
00471 
00472   tmpMaterial=new G4Material
00473     (name="water"         , density=  1.00 *g/cm3, 2, kStateLiquid, 300*kelvin);
00474   tmpMaterial->AddElement(elements["O"], 1);
00475   tmpMaterial->AddElement(elements["H"], 2);
00476   materials[name] = tmpMaterial; 
00477 
00478   // gaseous materials
00479   // For air: do we want it at p=1atm or at p inside beampipe?
00480   // 1st case:
00481   // tmpMaterial = new G4Material
00482   //    (name="Air"           , density=  1.205*g/dm3, 2, kStateGas, 300*kelvin);
00483   // 2nd case:
00484   // ideal gas: 
00485   //   1) density * temperature / pressure = constant
00486   //   2) at T=STP_Temperature, p=1*atmosphere, n=1mole occupies a volume
00487   //      V=22.4l=22.4e-3*m3 and therefore has density=molar weight/(22.4e-3*m3)
00488   
00489   //Room temperature temperature and standard pressure
00490   temperature = 300*kelvin;
00491   pressure = 1.0*atmosphere;
00492   //Air
00493   density = (STP_Temperature/temperature) * (pressure/(1.*atmosphere))* 30*g/(22.4e-3*m3) ;
00494   tmpMaterial = new G4Material
00495     (name="air", density, 2, kStateGas, temperature, pressure);
00496   tmpMaterial->AddElement(elements["O"], fractionmass=0.2);
00497   tmpMaterial->AddElement(elements["N"], fractionmass=0.8);
00498   const G4int Air_NUMENTRIES = 3; //Number of entries in the material properties table
00499   G4double Air_RIND[Air_NUMENTRIES] = {1.000292,1.000292,1.000292};//Source: NPL Tables of Physical & Chemical Constants. Refractive indices at different energies.
00500   G4double Air_Energy[Air_NUMENTRIES] = {2.0*eV,7.0*eV,7.14*eV}; //The energies.
00501   airMaterialPropertiesTable=new G4MaterialPropertiesTable();
00502   airMaterialPropertiesTable->AddProperty("RINDEX",Air_Energy, Air_RIND, Air_NUMENTRIES);
00503   tmpMaterial->SetMaterialPropertiesTable(airMaterialPropertiesTable);
00504   materials[name] = tmpMaterial; 
00505 
00506   //Carbon monoxide
00507   density = (STP_Temperature/temperature) * (pressure/(1.*atmosphere))
00508     * (12.+16.)*g/(22.4*1.e-3*m3) ;
00509   tmpMaterial =  new G4Material
00510     (name="carbonmonoxide", density, 2, kStateGas, temperature, pressure);
00511   tmpMaterial->AddElement(elements["C"], 1);
00512   tmpMaterial->AddElement(elements["O"], 1);
00513   materials[name] = tmpMaterial; 
00514 
00515   //Carbon monoxide beam pipe gas
00516   double bp_pressure=0.0133e-9*bar; //10 nTorr pressure
00517   density = (STP_Temperature/temperature) * (bp_pressure/(1.*atmosphere))
00518     * (12.+16.)*g/(22.4*1.e-3*m3) ;
00519   tmpMaterial =  new G4Material
00520     (name="bp_carbonmonoxide", density, 2, kStateGas, temperature, bp_pressure);
00521   tmpMaterial->AddElement(elements["C"], 1);
00522   tmpMaterial->AddElement(elements["O"], 1);
00523   materials[name] = tmpMaterial; 
00524 
00525   //Nitrogen
00526   density = (STP_Temperature/temperature) * (pressure/(1.*atmosphere))
00527     * (14.)*g/(22.4*1.e-3*m3) ;
00528   tmpMaterial =  new G4Material
00529     (name="nitrogen", density, 1, kStateGas, temperature, pressure);
00530   tmpMaterial->AddElement(elements["N"], fractionmass=1.0);
00531   materials[name] = tmpMaterial; 
00532 
00533   //Vacuum (same composition as residual vacuum in warm sections of LHC).
00534   pressure=BDSGlobalConstants::Instance()->GetVacuumPressure();
00535   density = (STP_Temperature/temperature) * (pressure/(1.*atmosphere))  * 29*g/(22.4*1.e-3*m3) ;
00536 #ifdef DEBUG 
00537   G4cout<< " ***************** defining Vacuum"<<G4endl;
00538   G4cout<< "pressure="<<pressure/bar<<" bar"<<G4endl;
00539   G4cout<< "temp="<<temperature/kelvin<<" K"<<G4endl;
00540   G4cout<< "density="<<density/(g/m3)<<"g/m^3"<<G4endl;
00541 #endif
00542   tmpMaterial = new G4Material
00543     (name="vacuum", density, 3, kStateGas, temperature, pressure);
00544   tmpMaterial->AddElement(elements["H"], fractionmass=0.482);
00545   tmpMaterial->AddElement(elements["C"], fractionmass=0.221);
00546   tmpMaterial->AddElement(elements["O"], fractionmass=0.297);
00547   materials[name] = tmpMaterial; 
00548 
00549   tmpMaterial = new G4Material
00550     (name="laservac"      , density, 1, kStateGas, temperature, pressure);
00551   tmpMaterial->AddMaterial(materials["vacuum"], fractionmass=1.);
00552   materials[name] = tmpMaterial; 
00553 
00554   //High density carbon monoxide, density chosen such that 1mm length gives ~ one interaction
00555   density=37.403/10.*g/cm3;  
00556   tmpMaterial = new G4Material
00557     (name="beamgasplugmat", density, 2, kStateGas);
00558    tmpMaterial->AddElement(elements["C"], 1);
00559   tmpMaterial->AddElement(elements["O"], 1);
00560   materials[name] = tmpMaterial; 
00561 }
00562 
00563 void BDSMaterials::AddMaterial(G4Material* aMaterial, G4String aName)
00564 {
00565   aName.toLower();
00566   if(materials.insert(make_pair(aName,aMaterial)).second){
00567 #ifdef DEBUG
00568     G4cout << "New material : " << aName << " added to material table" << G4endl;
00569 #endif
00570 
00571   }else{
00572     G4String exceptionString = "Material "+aName+" already exists\n";
00573     G4Exception(exceptionString.c_str(), "-1", FatalException, "");
00574   }
00575 }
00576 
00577 // add material with default state (kSolidState), temperature (273.15K)
00578 // and pressure (1atm)
00579 void BDSMaterials::AddMaterial(G4String aName, G4double itsZ, G4double itsA, G4double itsDensity)
00580 {
00581   aName.toLower();
00582   G4Material* tmpMaterial = new G4Material(aName, itsZ, itsA*g/mole, itsDensity*g/cm3);
00583   if(materials.insert(make_pair(aName,tmpMaterial)).second){
00584 #ifdef DEBUG
00585     G4cout << "New material : " << aName << " added to material table" << G4endl;
00586 #endif
00587   }else{
00588     G4String exceptionString = "Material "+aName+" already exists\n";
00589     G4Exception(exceptionString.c_str(), "-1", FatalException, "");
00590   }
00591 }
00592 
00593 void BDSMaterials::AddMaterial(G4String aName, G4double itsDensity, G4State itsState,
00594 G4double itsTemp, G4double itsPressure,
00595 list<const char*> itsComponents, list<G4double> itsComponentsFractions)
00596 {
00597   aName.toLower();
00598   G4Material* tmpMaterial = new G4Material(aName, itsDensity*g/cm3, 
00599                 (G4int)itsComponents.size(),itsState, itsTemp*kelvin, itsPressure*atmosphere);
00600   list<const char*>::iterator sIter;
00601   list<G4double>::iterator dIter;
00602   for(sIter = itsComponents.begin(), dIter = itsComponentsFractions.begin();
00603       sIter != itsComponents.end();
00604       sIter++, dIter++)
00605   {
00606 #ifdef DEBUG
00607     G4cout << "BDSMaterials::AddMaterial - Adding element: " << (G4String)*sIter << G4endl;
00608 #endif
00609     if(CheckElement((G4String)*sIter)){
00610       tmpMaterial->AddElement(GetElement((G4String)*sIter),(*dIter));
00611     } else tmpMaterial->AddMaterial(GetMaterial((G4String)*sIter),(*dIter));
00612   }
00613   if(materials.insert(make_pair(aName,tmpMaterial)).second){
00614 #ifdef DEBUG
00615     G4cout << "New material : " << aName << " added to material table" << G4endl;
00616 #endif
00617   }else{
00618     G4String exceptionString = "Material "+aName+" already exists\n";
00619     G4Exception(exceptionString.c_str(), "-1", FatalException, "");  
00620   }
00621 }
00622 
00623 void BDSMaterials::AddMaterial(G4String aName, G4double itsDensity, G4State itsState,
00624 G4double itsTemp, G4double itsPressure,      
00625 list<const char*> itsComponents, list<G4int> itsComponentsWeights)       
00626 {
00627   aName.toLower();
00628   G4Material*  tmpMaterial = new G4Material(aName, itsDensity*g/cm3, 
00629      (G4int)itsComponents.size(),itsState, itsTemp*kelvin, itsPressure*atmosphere);
00630   list<const char*>::iterator sIter;
00631   list<G4int>::iterator iIter;
00632   for(sIter = itsComponents.begin(), iIter = itsComponentsWeights.begin(); 
00633         sIter != itsComponents.end();
00634         sIter++, iIter++)
00635   {
00636 #ifdef DEBUG
00637     G4cout << "BDSMaterials::AddMaterial - Adding element: " << (G4String)*sIter << G4endl;
00638 #endif
00639     if(CheckElement((G4String)*sIter)){
00640       tmpMaterial->AddElement(GetElement((G4String)*sIter),(*iIter));
00641     } else tmpMaterial->AddMaterial(GetMaterial((G4String)*sIter),(*iIter));
00642   }     
00643   if(materials.insert(make_pair(aName,tmpMaterial)).second){
00644 #ifdef DEBUG
00645     G4cout << "New material : " << aName << " added to material table" << G4endl;
00646 #endif
00647   }else{
00648     G4String exceptionString = "Material "+aName+" already exists\n";
00649     G4Exception(exceptionString.c_str(), "-1", FatalException, "");
00650   }
00651 }
00652 
00653 void BDSMaterials::AddElement(G4Element* aElement, G4String aSymbol)
00654 {
00655   if(elements.insert(make_pair(aSymbol,aElement)).second){
00656 #ifdef DEBUG
00657     G4cout << "New atom : " << aSymbol << G4endl;
00658 #endif
00659   }else{
00660     G4String exceptionString = "Atom "+aSymbol+" already exists\n";
00661     G4Exception(exceptionString.c_str(), "-1", FatalException, "");
00662   }
00663 }
00664 
00665 void BDSMaterials::AddElement(G4String aName, G4String aSymbol, G4double itsZ, G4double itsA)
00666 {
00667   G4Element* tmpElement = new G4Element(aName, aSymbol, itsZ, itsA*g/mole);
00668   if(elements.insert(make_pair(aSymbol,tmpElement)).second){
00669 #ifdef DEBUG
00670     G4cout << "New atom : " << aSymbol << G4endl;
00671 #endif
00672   }else{
00673     G4String exceptionString = "Atom "+aSymbol+" already exists\n";
00674     G4Exception(exceptionString.c_str(), "-1", FatalException, "");
00675   }
00676 }
00677 
00678 G4Material* BDSMaterials::GetMaterial(G4String aMaterial)
00679 {
00680   G4String cmpStr1 ("G4_");
00681   G4String cmpStr2 (aMaterial, 3);
00682 #ifdef DEBUG
00683   G4cout << "BDSMaterials::GetMaterial() - " << cmpStr1 << " " << cmpStr2 << " " << cmpStr1.compareTo(cmpStr2) << G4endl;
00684 #endif
00685   if (!cmpStr1.compareTo(cmpStr2)){
00686 #ifdef DEBUG
00687     G4cout << "Using NIST material " << aMaterial << G4endl;
00688 #endif
00689     G4NistManager* nistManager = G4NistManager::Instance();
00690     return nistManager->FindOrBuildMaterial(aMaterial, true, true);
00691   } else {
00692     aMaterial.toLower();
00693     map<G4String,G4Material*>::iterator iter = materials.find(aMaterial);
00694     if(iter != materials.end()) return (*iter).second;
00695     else{
00696       G4String exceptionString = "BDSMaterials::GetMaterial - Material "+aMaterial+" not known. Aborting.";
00697       G4Exception(exceptionString.c_str(), "-1", FatalException, "");
00698       exit(1);
00699     }
00700   }
00701 }
00702 
00703 G4Element* BDSMaterials::GetElement(G4String aSymbol)
00704 {
00705   G4String cmpStr1 ("G4_");
00706   G4String cmpStr2 (aSymbol, 3);
00707 #ifdef DEBUG
00708   G4cout << cmpStr1 << " " << cmpStr2 << " " << cmpStr1.compareTo(cmpStr2) << G4endl;
00709 #endif
00710   if (!cmpStr1.compareTo(cmpStr2)){
00711 #ifdef DEBUG
00712     G4cout << "Using NIST material " << aSymbol << G4endl;
00713 #endif
00714     G4NistManager* nistManager = G4NistManager::Instance();
00715     return nistManager->FindOrBuildElement(aSymbol, true);
00716   } else {
00717     map<G4String,G4Element*>::iterator iter = elements.find(aSymbol);
00718     if(iter != elements.end()) return (*iter).second;
00719     else{
00720       G4String exceptionString="BDSMaterials::GetElement - Element "+aSymbol+" not known. Aborting.";
00721       G4Exception(exceptionString.c_str(), "-1", FatalException, "");
00722       exit(1);
00723     }
00724   }
00725 }
00726 
00727 G4Element* BDSMaterials::GetElement(const char* aSymbol)
00728 {
00729   return GetElement((G4String)aSymbol);
00730 }
00731 
00732 G4bool BDSMaterials::CheckMaterial(G4String aMaterial)
00733 {
00734   aMaterial.toLower();
00735   map<G4String,G4Material*>::iterator iter = materials.find(aMaterial);
00736   if(iter != materials.end()) return true;
00737   else return false;
00738 }
00739 
00740 G4bool BDSMaterials::CheckElement(G4String aSymbol)
00741 {
00742   map<G4String,G4Element*>::iterator iter = elements.find(aSymbol);
00743   if(iter != elements.end()) return true;
00744   else return false;
00745 }
00746 
00747 void BDSMaterials::ListMaterials(){
00748   G4cout << "Available elements are:" << G4endl;
00749   G4cout << "Boron  - B" << G4endl;
00750   G4cout << "Aluminium  - Al" << G4endl;
00751   G4cout << "Calcium    - Ca" << G4endl;
00752   G4cout << "Carbon     - C" << G4endl;
00753   G4cout << "Cobalt     - Co" << G4endl;
00754   G4cout << "Helium     - He" << G4endl;
00755   G4cout << "Hydrogen   - H" << G4endl;
00756   G4cout << "Iron       - Fe" << G4endl;
00757   G4cout << "Lead       - Pb" << G4endl;
00758   G4cout << "Manganese  - Mn" << G4endl;
00759   G4cout << "Niobium    - Nb" << G4endl;
00760   G4cout << "Nitrogen   - N" << G4endl;
00761   G4cout << "Oxygen     - O" << G4endl;
00762   G4cout << "Phosphorus - P" << G4endl;
00763   G4cout << "Samarium   - Sm" << G4endl;
00764   G4cout << "Silicon    - Si" << G4endl;
00765   G4cout << "Sulphur    - S" << G4endl;
00766   G4cout << "Titanium   - Ti" << G4endl;
00767   G4cout << "Zirkonium   - Zr" << G4endl;
00768   G4cout << "Tungsten   - W" << G4endl;
00769   G4cout << "Vanadium   - V" << G4endl;
00770   G4cout << "Molybdenum   - Mo" << G4endl;
00771   G4cout << "Chromium   - Cr" << G4endl;
00772   G4cout << "Sodium   - Na" << G4endl;
00773   G4cout << "Barium   - Ba" << G4endl;
00774   G4cout << "Zinc   - Zn" << G4endl;
00775   G4cout << "Europium   - Eu" << G4endl;
00776   G4cout << "***************" << G4endl;
00777   G4cout << "Available materials are:" << G4endl;
00778   G4cout << "Air" << G4endl;
00779   G4cout << "Aluminium" << G4endl;
00780   G4cout << "AralditeF" << G4endl;
00781   G4cout << "Beryllium" << G4endl;
00782   G4cout << "CarbonMonoxide" << G4endl;
00783   G4cout << "CarbonSteel" << G4endl;
00784   G4cout << "Concrete" << G4endl;
00785   G4cout << "LHCConcrete" << G4endl;
00786   G4cout << "Copper" << G4endl;
00787   G4cout << "Graphite" << G4endl;
00788   G4cout << "GraphiteFoam" << G4endl;
00789   G4cout << "BN5000" << G4endl;
00790   G4cout << "Invar" << G4endl;
00791   G4cout << "Iron" << G4endl;
00792   G4cout << "LaserVac" << G4endl;
00793   G4cout << "Lead" << G4endl;
00794   G4cout << "LeadTungstate" << G4endl;
00795   G4cout << "LiquidHelium" << G4endl;
00796   G4cout << "NbTi" << G4endl;
00797   G4cout << "Niobium" << G4endl;
00798   G4cout << "Silicon" << G4endl;
00799   G4cout << "SmCo" << G4endl;
00800   G4cout << "Soil" << G4endl;
00801   G4cout << "StainlessSteel" << G4endl;
00802   G4cout << "Titanium" << G4endl;
00803   G4cout << "TitaniumAlloy" << G4endl;
00804   G4cout << "Tungsten" << G4endl;
00805   G4cout << "Vacuum" << G4endl;
00806   G4cout << "Vanadium" << G4endl;
00807   G4cout << "Water" << G4endl;
00808   G4cout << "WeightIron" << G4endl;
00809   G4cout << "****************************" << G4endl;
00810   G4cout << "Available nist materials are:" << G4endl;
00811   G4NistManager* nistManager = G4NistManager::Instance();
00812   G4String list="all";
00813   nistManager->ListMaterials(list);
00814 }
00815 
00816 BDSMaterials::~BDSMaterials(){
00817   map<G4String,G4Material*>::iterator mIter;
00818   for(mIter = materials.begin(); mIter!=materials.end(); mIter++)
00819     delete (*mIter).second;
00820   materials.clear();
00821 
00822   map<G4String,G4Element*>::iterator eIter;
00823   for(eIter = elements.begin(); eIter!=elements.end(); eIter++)
00824     delete (*eIter).second;
00825   elements.clear();
00826 
00827   delete tmpMaterial;
00828   delete tmpElement;
00829   delete airMaterialPropertiesTable;
00830   delete fsMaterialPropertiesTable;
00831 }

Generated on 27 Aug 2013 for BDSIM by  doxygen 1.4.7