13 #include "G4NistManager.hh" 16 #include "CLHEP/Units/PhysicalConstants.h" 17 using namespace CLHEP;
22 if(factory->find(materialsMethod) == factory->end())
24 cout << endl << endl <<
" >>> WARNING: " << materialsMethod <<
" NOT FOUND IN Material Factory Map." << endl;
28 return (*factory)[materialsMethod]();
34 map<string, materialFactory> materialMethodMap;
48 return materialMethodMap;
53 for(map<string, G4Material*>::iterator it = matMap.begin(); it != matMap.end(); it++)
55 cout <<
" - material: " << it->first <<
" " << it->second << endl;
56 if(it->second->GetMaterialPropertiesTable())
58 cout <<
" - Optical Properties for " << it->first <<
":" << endl;
59 it->second->GetMaterialPropertiesTable()->DumpTable();
67 stringstream comps(s);
69 for(
int e=0; e<ncomponents; e++)
73 comps >> thisComp >> thisFrac;
74 components.push_back(thisComp);
75 fracs.push_back(thisFrac);
83 if(checkProperty ==
"none")
return;
86 stringstream comps(property);
94 if(what ==
"photonEnergy")
97 if(what ==
"indexOfRefraction")
98 indexOfRefraction.push_back(
get_number(trimmedC));
100 if(what ==
"absorptionLength")
101 absorptionLength.push_back(
get_number(trimmedC));
103 if(what ==
"reflectivity")
106 if(what ==
"efficiency")
110 if(what ==
"fastcomponent")
111 fastcomponent.push_back(
get_number(trimmedC));
113 if(what ==
"slowcomponent")
114 slowcomponent.push_back(
get_number(trimmedC));
116 if(what ==
"scintillationyield")
119 if(what ==
"resolutionscale")
122 if(what ==
"fasttimeconstant")
125 if(what ==
"slowtimeconstant")
128 if(what ==
"yieldratio")
131 if(what ==
"rayleigh")
135 if(what ==
"rayleigh")
140 if(indexOfRefraction.size() != photonEnergy.size()) indexOfRefraction.clear();
141 if(absorptionLength.size() != photonEnergy.size()) absorptionLength.clear();
142 if(reflectivity.size() != photonEnergy.size()) reflectivity.clear();
143 if(efficiency.size() != photonEnergy.size()) efficiency.clear();
144 if(fastcomponent.size() != photonEnergy.size()) fastcomponent.clear();
145 if(slowcomponent.size() != photonEnergy.size()) slowcomponent.clear();
146 if(rayleigh.size() != photonEnergy.size()) rayleigh.clear();
163 map<string, G4Material*> mats = materialSelectedFactory->
initMaterials(rc, go);
167 map<string, G4Material*> gdmlMats = gdmlFactory->
initMaterials(rc, go);
168 for(map<string, G4Material*>::iterator it = gdmlMats.begin(); it != gdmlMats.end(); it++)
169 mats[it->first] = it->second;
173 map<string, G4Material*> mysqlMats = mysqlFactory->
initMaterials(rc, go);
174 for(map<string, G4Material*>::iterator it = mysqlMats.begin(); it != mysqlMats.end(); it++)
175 mats[it->first] = it->second;
179 map<string, G4Material*> textMats = textFactory->
initMaterials(rc, go);
180 for(map<string, G4Material*>::iterator it = textMats.begin(); it != textMats.end(); it++)
181 mats[it->first] = it->second;
188 G4NistManager* matman = G4NistManager::Instance();
193 vector<G4String> allMats = matman->GetNistMaterialNames();
194 for(
unsigned int j=0; j<allMats.size(); j++)
195 nistMap.insert(allMats[j]);
197 vector<G4String> allEls = matman->GetNistElementNames();
198 for(
unsigned int j=0; j<allEls.size(); j++)
200 nistMap.insert(allEls[j]);
206 vector<G4MaterialPropertiesTable*> optTable;
230 int maxMapSize = 10000;
236 vector<string> toDelete;
238 while (mmap.size() && maxMapIndex < maxMapSize)
244 for(
unsigned i=0; i<toDelete.size(); i++)
245 mmap.erase(toDelete[i]);
249 for(map<string, material>::iterator it = mmap.begin(); it != mmap.end() && mmap.size(); it++)
254 for(
unsigned int i=0; i<it->second.components.size(); i++)
256 string compName = it->second.components[i];
258 if(mats.find(compName) == mats.end())
261 if(nistMap.find(compName) == nistMap.end())
270 if(!allExist)
continue;
275 mats[it->first] =
new G4Material(it->first, it->second.density*g/cm3, it->second.ncomponents);
280 for(
unsigned int i=0; i<it->second.fracs.size(); i++)
281 totComps += it->second.fracs[i];
285 if(fabs(totComps-1) < 0.00001)
287 for(
unsigned int i=0; i<it->second.fracs.size(); i++)
289 string compName = it->second.components[i];
292 if(mats.find(compName) != mats.end())
293 mats[it->first]->AddMaterial(mats[compName], it->second.fracs[i]);
296 mats[it->first]->AddMaterial(matman->FindOrBuildMaterial(compName), it->second.fracs[i]);
300 else if(totComps > 1)
302 for(
unsigned int i=0; i<it->second.fracs.size(); i++)
305 string compName = it->second.components[i];
306 if(it->second.fracs[i] < 1)
308 cout <<
" The number of atoms of " << compName <<
" is " << it->second.fracs[i] <<
" but it should be an integer. Exiting" << endl;
311 mats[it->first]->AddElement(matman->FindOrBuildElement(compName), (int) it->second.fracs[i]);
316 cout <<
" Warning: the sum of all components for >" << it->first <<
"< does not add to one." << endl;
320 unsigned nopts = it->second.photonEnergy.size();
323 optTable.push_back(
new G4MaterialPropertiesTable());
325 double penergy[nopts];
326 for(
unsigned i=0; i<nopts; i++)
327 penergy[i] = it->second.photonEnergy[i];
330 if(it->second.indexOfRefraction.size() == nopts)
333 for(
unsigned i=0; i<nopts; i++)
335 ior[i] = it->second.indexOfRefraction[i];
337 optTable.back()->AddProperty(
"RINDEX", penergy, ior, nopts );
341 if(it->second.absorptionLength.size() == nopts)
344 for(
unsigned i=0; i<nopts; i++)
345 abs[i] = it->second.absorptionLength[i];
346 optTable.back()->AddProperty(
"ABSLENGTH", penergy, abs, nopts );
350 if(it->second.reflectivity.size() == nopts)
353 for(
unsigned i=0; i<nopts; i++)
354 ref[i] = it->second.reflectivity[i];
356 optTable.back()->AddProperty(
"REFLECTIVITY", penergy, ref, nopts );
360 if(it->second.efficiency.size() == nopts)
363 for(
unsigned i=0; i<nopts; i++)
364 eff[i] = it->second.efficiency[i];
366 optTable.back()->AddProperty(
"EFFICIENCY", penergy, eff, nopts );
370 if(it->second.fastcomponent.size() == nopts)
373 for(
unsigned i=0; i<nopts; i++)
374 fastc[i] = it->second.fastcomponent[i];
376 optTable.back()->AddProperty(
"FASTCOMPONENT", penergy, fastc, nopts );
380 if(it->second.slowcomponent.size() == nopts)
383 for(
unsigned i=0; i<nopts; i++)
384 slowc[i] = it->second.slowcomponent[i];
386 optTable.back()->AddProperty(
"SLOWCOMPONENT", penergy, slowc, nopts );
390 if(it->second.rayleigh.size() == nopts)
393 for(
unsigned i=0; i<nopts; i++)
394 ray[i] = it->second.rayleigh[i];
396 optTable.back()->AddProperty(
"RAYLEIGH", penergy, ray, nopts);
402 if(it->second.scintillationyield != -1)
403 optTable.back()->AddConstProperty(
"SCINTILLATIONYIELD", it->second.scintillationyield);
406 if(it->second.resolutionscale != -1)
407 optTable.back()->AddConstProperty(
"RESOLUTIONSCALE", it->second.resolutionscale);
410 if(it->second.fasttimeconstant != -1)
411 optTable.back()->AddConstProperty(
"FASTTIMECONSTANT", it->second.fasttimeconstant*ns);
414 if(it->second.slowtimeconstant != -1)
415 optTable.back()->AddConstProperty(
"SLOWTIMECONSTANT", it->second.slowtimeconstant*ns);
418 if(it->second.yieldratio != -1)
419 optTable.back()->AddConstProperty(
"YIELDRATIO", it->second.yieldratio);
421 mats[it->first]->SetMaterialPropertiesTable(optTable.back());
425 toDelete.push_back(it->first);
437 map<string, G4Material*> mats;
439 G4MaterialTable* matTable = (G4MaterialTable*) G4Material::GetMaterialTable();
441 bool already_defined = 0;
442 for(
unsigned i=0; i<matTable->size(); ++i)
444 G4Material* thisMat = (*(matTable))[i];
446 if(thisMat->GetName() ==
"LD2")
449 mats[
"LD2"] = thisMat;
452 if(thisMat->GetName() ==
"helium3Gas")
455 mats[
"helium3Gas"] = thisMat;
457 if(thisMat->GetName() ==
"deuteriumGas")
460 mats[
"deuteriumGas"] = thisMat;
462 if(thisMat->GetName() ==
"ND3")
465 mats[
"ND3"] = thisMat;
482 G4Isotope* deuteron =
new G4Isotope(
"deuteron", Z=1, N=2, a=2.0141018*g/mole);
485 G4Element* deuterium =
new G4Element(
"deuterium",
"deuterium", 1);
486 deuterium->AddIsotope(deuteron, 1);
489 mats[
"deuteriumGas"] =
new G4Material(
"deuteriumGas", 0.000452*g/cm3, 1, kStateGas, 294.25*kelvin);
490 mats[
"deuteriumGas"]->AddElement(deuterium, 1);
493 mats[
"LD2"] =
new G4Material(
"LD2", 0.169*g/cm3, 1, kStateLiquid, 22.0*kelvin);
494 mats[
"LD2"]->AddElement(deuterium, 2);
500 G4Isotope* helion =
new G4Isotope(
"helion", Z=2, N=3, a=3.0160293*g/mole);
503 G4Element* helium3 =
new G4Element(
"helium3",
"helium3", 1);
504 helium3->AddIsotope(helion, 1);
508 mats[
"helium3Gas"] =
new G4Material(
"helium3Gas", 0.1650*mg/cm3, 1, kStateGas, 294.25*kelvin);
509 mats[
"helium3Gas"]->AddElement(helium3, 1);
514 G4Element* Nitro =
new G4Element(
"Nitro",
"N", Z=7, a=14.01*g/mole);
515 mats[
"ND3"] =
new G4Material(
"ND3", 1.007*g/cm3, 2, kStateLiquid, 1.0*kelvin);
516 mats[
"ND3"]->AddElement(Nitro, 1);
517 mats[
"ND3"]->AddElement(deuterium, 3);
materials * getMaterialFactory(map< string, materialFactory > *factory, string materialsMethod)
static materials * createMaterials()
static materials * createMaterials()
map< string, G4Material * > materialsFromMap(map< string, material >)
map< string, materialFactory > registerMaterialFactories()
double get_number(string v, int warn_no_unit)
Returns number with dimension from string, i.e. 100*cm.
void printMaterials(map< string, G4Material * > matMap)
virtual map< string, G4Material * > initMaterials(runConditions, goptions)=0
map< string, G4Material * > materialsWithIsotopes()
void componentsFromString(string)
string TrimSpaces(string in)
Removes leading and trailing spaces.
static materials * createMaterials()
static materials * createMaterials()
void opticalsFromString(string, string)
map< string, G4Material * > buildMaterials(map< string, materialFactory > materialFactoryMap, goptions go, runConditions rc)