166 G4Material* oldmat =
getMaterial(parameters.getName(),
false);
169 B2ERROR(
"Material with name " << parameters.getName() <<
" already existing");
172 B2DEBUG(10,
"Creating Material " << parameters.getName());
175 double density = parameters.getDensity() * CLHEP::g / CLHEP::cm3;
176 if (density < 1e-25) {
181 if (component.getIselement()) {
182 B2ERROR(
"createMaterial " << parameters.getName()
183 <<
": Cannot calculate density when adding elements, please provide a density");
186 G4Material* mat =
getMaterial(component.getName());
188 B2ERROR(
"createMaterial " << parameters.getName() <<
": Material '" << component.getName() <<
"' not found");
191 density += mat->GetDensity() * component.getFraction();
196 G4Material* mat =
new G4Material(parameters.getName(), density, parameters.getComponents().size(),
197 (G4State)parameters.getState(), parameters.getTemperature(), parameters.getPressure() * CLHEP::pascal);
200 if (component.getIselement()) {
201 G4Element* cmp =
getElement(component.getName());
203 B2ERROR(
"Cannot create material " << parameters.getName() <<
": element " << component.getName() <<
" not found");
204#ifdef __clang_analyzer__
210 mat->AddElement(cmp, component.getFraction());
212 G4Material* cmp =
getMaterial(component.getName());
214 B2ERROR(
"Cannot create material " << parameters.getName() <<
": material " << component.getName() <<
" not found");
215#ifdef __clang_analyzer__
221 mat->AddMaterial(cmp, component.getFraction());
226 mat->SetMaterialPropertiesTable(
createProperties(parameters.getProperties()));
236 string name = parameters.getString(
"@name");
237 B2DEBUG(10,
"Creating Material Config " << name);
238 string stateStr = parameters.getString(
"state",
"undefined");
239 double density = parameters.getDensity(
"density", 0);
240 double temperature = parameters.getDouble(
"temperature", CLHEP::STP_Temperature);
241 double pressure = parameters.getDouble(
"pressure", CLHEP::STP_Pressure / CLHEP::pascal);
251 double sumFractions(0);
254 for (
const GearDir& component : parameters.getNodes(
"Components/Material")) {
255 const string componentName = component.getString();
256 double fraction = component.getDouble(
"@fraction", 1.0);
257 material.
addComponent({componentName,
false, fraction});
258 sumFractions += fraction;
261 for (
const GearDir& element : parameters.getNodes(
"Components/Element")) {
262 const std::string elementName = element.getString();
263 double fraction = element.getDouble(
"@fraction", 1.0);
265 sumFractions += fraction;
269 if (abs(sumFractions - 1) > numeric_limits<double>::epsilon()) {
270 B2WARNING(
"createMaterial " << name <<
": Fractions not normalized, scaling by 1/" << sumFractions);
272 cmp.setFraction(cmp.getFraction() / sumFractions);
277 boost::to_lower(stateStr);
278 G4State state = kStateUndefined;
279 if (stateStr ==
"solid") {
281 }
else if (stateStr ==
"liquid") {
282 state = kStateLiquid;
283 }
else if (stateStr ==
"gas") {
285 }
else if (stateStr !=
"undefined") {
286 B2WARNING(
"createMaterial " << name <<
": Unknown state '" << stateStr <<
"', using undefined");
290 addProperties(material, parameters);
315 string name = parameters.getString(
"@name",
"OpticalSurface");
316 string modelString = parameters.getString(
"Model",
"glisur");
317 string finishString = parameters.getString(
"Finish",
"polished");
318 string typeString = parameters.getString(
"Type",
"dielectric_dielectric");
319 double value = parameters.getDouble(
"Value", 1.0);
321#define CHECK_ENUM_VALUE(name,value) if (name##String == #value) { name = value; }
322 G4OpticalSurfaceModel model;
323 boost::to_lower(modelString);
324 CHECK_ENUM_VALUE(model, glisur)
325 else CHECK_ENUM_VALUE(model, unified)
326 else CHECK_ENUM_VALUE(model, LUT)
328 B2FATAL(
"Unknown Optical Surface Model: " << modelString);
331 G4OpticalSurfaceFinish finish;
332 boost::to_lower(finishString);
333 CHECK_ENUM_VALUE(finish, polished)
334 else CHECK_ENUM_VALUE(finish, polishedfrontpainted)
335 else CHECK_ENUM_VALUE(finish, polishedbackpainted)
336 else CHECK_ENUM_VALUE(finish, ground)
337 else CHECK_ENUM_VALUE(finish, groundfrontpainted)
338 else CHECK_ENUM_VALUE(finish, groundbackpainted)
339 else CHECK_ENUM_VALUE(finish, polishedlumirrorair)
340 else CHECK_ENUM_VALUE(finish, polishedlumirrorglue)
341 else CHECK_ENUM_VALUE(finish, polishedair)
342 else CHECK_ENUM_VALUE(finish, polishedteflonair)
343 else CHECK_ENUM_VALUE(finish, polishedtioair)
344 else CHECK_ENUM_VALUE(finish, polishedtyvekair)
345 else CHECK_ENUM_VALUE(finish, polishedvm2000air)
346 else CHECK_ENUM_VALUE(finish, polishedvm2000glue)
347 else CHECK_ENUM_VALUE(finish, etchedlumirrorair)
348 else CHECK_ENUM_VALUE(finish, etchedlumirrorglue)
349 else CHECK_ENUM_VALUE(finish, etchedair)
350 else CHECK_ENUM_VALUE(finish, etchedteflonair)
351 else CHECK_ENUM_VALUE(finish, etchedtioair)
352 else CHECK_ENUM_VALUE(finish, etchedtyvekair)
353 else CHECK_ENUM_VALUE(finish, etchedvm2000air)
354 else CHECK_ENUM_VALUE(finish, etchedvm2000glue)
355 else CHECK_ENUM_VALUE(finish, groundlumirrorair)
356 else CHECK_ENUM_VALUE(finish, groundlumirrorglue)
357 else CHECK_ENUM_VALUE(finish, groundair)
358 else CHECK_ENUM_VALUE(finish, groundteflonair)
359 else CHECK_ENUM_VALUE(finish, groundtioair)
360 else CHECK_ENUM_VALUE(finish, groundtyvekair)
361 else CHECK_ENUM_VALUE(finish, groundvm2000air)
362 else CHECK_ENUM_VALUE(finish, groundvm2000glue)
364 B2FATAL(
"Unknown Optical Surface Finish: " << finishString);
368 boost::to_lower(typeString);
369 CHECK_ENUM_VALUE(type, dielectric_metal)
370 else CHECK_ENUM_VALUE(type, dielectric_dielectric)
371 else CHECK_ENUM_VALUE(type, dielectric_LUT)
372 else CHECK_ENUM_VALUE(type, firsov)
373 else CHECK_ENUM_VALUE(type, x_ray)
375 B2FATAL(
"Unknown Optical Surface Type: " << typeString);
377#undef CHECK_ENUM_VALUE
380 addProperties(surface,
GearDir(parameters,
"Properties"));