19#include "BDSAcceleratorModel.hh"
20#include "BDSColourFromMaterial.hh"
21#include "BDSColours.hh"
23#include "BDSException.hh"
24#include "BDSGeometryExternal.hh"
25#include "BDSGeometryFactoryGDML.hh"
26#include "BDSGeometryInspector.hh"
27#include "BDSGeometryWriter.hh"
28#include "BDSGDMLPreprocessor.hh"
29#include "BDSGlobalConstants.hh"
30#include "BDSMaterials.hh"
31#include "BDSWarning.hh"
35#include "G4GDMLParser.hh"
36#include "G4LogicalVolume.hh"
37#include "G4UserLimits.hh"
38#include "G4VisAttributes.hh"
39#include "G4VPhysicalVolume.hh"
56BDSGeometryFactoryGDML::BDSGeometryFactoryGDML()
61 std::map<G4String, G4Colour*>* mapping,
65 std::vector<G4String>* namedVacuumVolumes,
69 G4UserLimits* userLimitsToAttachToAllLVs)
75 G4String processedFile;
79 {processedFile = BDS::PreprocessGDML(fileName, componentName, preprocessGDMLSchema);}
80 else if (preprocessGDMLSchema)
81 {processedFile = BDS::PreprocessGDMLSchemaOnly(fileName);}
83 {processedFile = fileName;}
84 G4String preprocessNameToStrip = preprocessGDML ? componentName+
"_" :
"";
86 G4GDMLParser* parser =
new G4GDMLParser();
88 parser->Read(processedFile,
true);
90 G4VPhysicalVolume* containerPV = parser->GetWorldVolume();
91 G4LogicalVolume* containerLV = containerPV->GetLogicalVolume();
92 G4VSolid* containerSolid = containerLV->GetSolid();
93 G4ThreeVector gdmlWorldOrigin = G4ThreeVector();
94 if (containerPV->GetName() ==
"world_volume_lv_PV")
96 gdmlWorldOrigin = parser->GetPosition(
"PygdmlOrigin");
97 gdmlWorldOrigin[2] = 0.0;
101 std::set<G4VPhysicalVolume*> pvsGDML;
102 std::set<G4LogicalVolume*> lvsGDML;
103 std::map<G4String, G4Material*> materialsGDML;
108 std::map<G4String, G4Colour*> gdmlColours = BuildColourMap(lvsGDML, parser, componentName);
110 {gdmlColours.insert(mapping->begin(), mapping->end());}
112 G4cout <<
"Loaded GDML file \"" << processedFile <<
"\" containing:" << G4endl;
113 G4cout << pvsGDML.size() <<
" physical volumes, and " << lvsGDML.size() <<
" logical volumes" << G4endl;
115 auto visesGDML =
ApplyColourMapping(lvsGDML, gdmlColours, autoColour, preprocessNameToStrip);
122 G4VisAttributes* vis =
new G4VisAttributes(*c);
123 vis->SetVisibility(
true);
124 visesGDML.insert(vis);
125 containerLV->SetVisAttributes(vis);
145 vacuumSensitivityType);
152std::map<G4String, G4Colour*> BDSGeometryFactoryGDML::BuildColourMap(
const std::set<G4LogicalVolume*>& lvsGDML,
153 G4GDMLParser* parser,
154 const G4String& componentName)
156 std::map<G4String, G4Colour*> result;
158 for (
auto lv : lvsGDML)
160 auto auxInfo = parser->GetVolumeAuxiliaryInformation(lv);
161 for (
const auto& af : auxInfo)
163 if (af.type ==
"colour")
165 std::stringstream ss(af.value);
166 std::vector<G4String> colVals((std::istream_iterator<G4String>(ss)), std::istream_iterator<G4String>());
167 if (colVals.size() != 4)
168 {BDS::Warning(__METHOD_NAME__,
"invalid number of colour values for logical volume " + lv->GetName());}
169 G4String colourName = componentName +
"_colour_"+std::to_string(iColour);
171 G4String colourString = colourName +
":";
172 for (
const auto& c : colVals)
173 {colourString +=
" " + c;}
176 result[lv->GetName()] = colour;
180 G4bool visible =
false;
185 result[lv->GetName()] = colour;
196 std::array<G4double, 4> result{0,0,0,0};
197 std::stringstream ss(value);
211 catch (std::exception& e)
212 {
throw BDSException(__METHOD_NAME__,
"error in colour definition " + value);}
217 const G4String& acceleratorComponentName)
const
221 std::set<G4VPhysicalVolume*>& pvsIn,
222 std::set<G4LogicalVolume*>& lvsIn,
223 std::map<G4String, G4Material*>& materialsGDML)
225 const auto& lv = volume->GetLogicalVolume();
227 G4Material* mat = lv->GetMaterial();
228 materialsGDML[mat->GetName()] = mat;
229 for (G4int i = 0; i < (G4int)lv->GetNoDaughters(); i++)
231 const auto& pv = lv->GetDaughter(i);
238 const G4String& outputFileName,
240 const G4String& replacement)
243 std::ifstream ifs(fileName);
247 {
throw BDSException(__METHOD_NAME__,
"Cannot open file \"" + fileName +
"\"");}
249 std::ofstream fout(outputFileName);
251 G4cout << __METHOD_NAME__ <<
"Original file: " << fileName << G4endl;
252 G4cout << __METHOD_NAME__ <<
"Temporary file: " << outputFileName << G4endl;
255 int lenOfKey = (int)key.size();
259 while (std::getline(ifs, buffer))
261 int f = (int)buffer.find(key);
264 std::string outputString = std::string(buffer);
265 outputString.replace(f, lenOfKey, replacement);
266 fout << outputString <<
"\n";
269 {fout << buffer <<
"\n";}
279void _SymbolToPreventWarningGeomFacGDML(){;}
static BDSColourFromMaterial * Instance()
Singleton pattern.
G4Colour * GetColour(const G4Material *material, const G4String &prefixToStripFromName="")
Get colour from name.
G4Colour * GetColour(G4double red, G4double green, G4double blue, G4double alpha=1)
Get a cached anonymous colour by values.
static BDSColours * Instance()
singleton pattern
General exception with possible name of object and message.
static G4String ProcessedNodeName(const G4String &nodeName, const G4String &prefix)
void RegisterLogicalVolume(G4LogicalVolume *logicalVolume)
virtual std::set< G4LogicalVolume * > GetAllLogicalVolumes() const
Access all logical volumes belonging to this component.
void RegisterPhysicalVolume(G4VPhysicalVolume *physicalVolume)
void RegisterVisAttributes(G4VisAttributes *visAttribute)
A loaded piece of externally provided geometry.
void RegisterVacuumVolumes(const std::set< G4LogicalVolume * > &vacuumVolumesIn)
Register a set of volumes to be identified as vacuum volumes for the BDSAcceleratorComponent.
const std::set< G4LogicalVolume * > & VacuumVolumes() const
Access the vacuum volumes.
virtual void ApplySensitivity(BDSGeometryExternal *result, const std::set< G4LogicalVolume * > &allLogicalVolumesIn, BDSSDType generalSensitivity, const std::set< G4LogicalVolume * > &vacuumLogicalVolumes, BDSSDType vacuumSensitivity)
Attach the relevant general and vacuum sensitivity to each volume.
std::set< G4LogicalVolume * > GetVolumes(const std::set< G4LogicalVolume * > &allLVs, std::vector< G4String > *volumeNames, G4bool preprocessGDML, const G4String &componentName) const
Get the volumes that match the name. Volume names are matched exactly and are case sensitive.
virtual void CleanUp()
Virtual clean up that derived classes can override that calls CleanUpBase().
virtual void ApplyUserLimits(const std::set< G4LogicalVolume * > &lvsIn, G4UserLimits *userLimits)
Attach a set of user limits to every logical volume supplied.
virtual std::set< G4VisAttributes * > ApplyColourMapping(const std::set< G4LogicalVolume * > &lvs, const std::map< G4String, G4Colour * > &mapping, G4bool autoColour, const G4String &preprocessPrefix="")
void GetAllLogicalPhysicalAndMaterials(const G4VPhysicalVolume *volume, std::set< G4VPhysicalVolume * > &pvs, std::set< G4LogicalVolume * > &lvs, std::map< G4String, G4Material * > &materialsGDML)
static std::array< G4double, 4 > VRGBAStringAndUnitToColourAndStyle(const G4String &value, G4bool &visible)
virtual BDSGeometryExternal * Build(G4String componentName, G4String fileName, std::map< G4String, G4Colour * > *colourMapping=nullptr, G4bool autoColour=true, G4double suggestedLength=0, G4double suggestedHorizontalWidth=0, std::vector< G4String > *namedVacuumVolumes=nullptr, G4bool makeSensitive=true, BDSSDType sensitivityType=BDSSDType::energydep, BDSSDType vacuumSensitivityType=BDSSDType::energydepvacuum, G4UserLimits *userLimitsToAttachToAllLVs=nullptr)
virtual G4String PreprocessedName(const G4String &objectName, const G4String &acceleratorComponentName) const
Use the GDML preprocessing scheme to prepare the preprocessed volume names.
void ReplaceStringInFile(const G4String &filename, const G4String &outputFileName, const G4String &key, const G4String &replacement)
static const G4String auxType
"bds_vrgba" - short to minimise output file size: "bdsim visibility rgba"
static BDSGlobalConstants * Instance()
Access method.
static BDSMaterials * Instance()
Singleton pattern access.
void CacheMaterialsFromGDML(const std::map< G4String, G4Material * > &materialsGDML)
Introduce materials loaded from GDML into this instance.
void CheckForConflictingMaterialsAfterLoad(const G4String &geometryFileName, const G4String &componentName) const
Improve type-safety of native enum data type in C++.
std::pair< BDSExtent, BDSExtent > DetermineExtents(const G4VSolid *solid)