20#include "BDSAcceleratorModel.hh"
21#include "BDSColourFromMaterial.hh"
22#include "BDSColours.hh"
24#include "BDSException.hh"
25#include "BDSGeometryExternal.hh"
26#include "BDSGeometryFactoryGDML.hh"
27#include "BDSGeometryInspector.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"
53BDSGeometryFactoryGDML::BDSGeometryFactoryGDML()
58 std::map<G4String, G4Colour*>* mapping,
62 std::vector<G4String>* namedVacuumVolumes,
63 G4UserLimits* userLimitsToAttachToAllLVs)
69 G4String processedFile;
73 {processedFile = BDS::PreprocessGDML(fileName, componentName, preprocessGDMLSchema);}
74 else if (preprocessGDMLSchema)
75 {processedFile = BDS::PreprocessGDMLSchemaOnly(fileName);}
77 {processedFile = fileName;}
78 G4String preprocessNameToStrip = preprocessGDML ? componentName+
"_" :
"";
80 G4GDMLParser* parser =
new G4GDMLParser();
82 parser->Read(processedFile,
true);
84 G4VPhysicalVolume* containerPV = parser->GetWorldVolume();
85 G4LogicalVolume* containerLV = containerPV->GetLogicalVolume();
86 G4VSolid* containerSolid = containerLV->GetSolid();
87 G4ThreeVector gdmlWorldOrigin = G4ThreeVector();
88 if (containerPV->GetName() ==
"world_volume_lv_PV")
90 gdmlWorldOrigin = parser->GetPosition(
"PygdmlOrigin");
91 gdmlWorldOrigin[2] = 0.0;
95 std::set<G4VPhysicalVolume*> pvsGDML;
96 std::set<G4LogicalVolume*> lvsGDML;
97 std::map<G4String, G4Material*> materialsGDML;
102 std::map<G4String, G4Colour*> gdmlColours;
104 for (
auto lv : lvsGDML)
106 auto auxInfo = parser->GetVolumeAuxiliaryInformation(lv);
107 for (
const auto& af : auxInfo)
109 if (af.type ==
"colour")
111 std::stringstream ss(af.value);
112 std::vector<G4String> colVals((std::istream_iterator<G4String>(ss)), std::istream_iterator<G4String>());
113 if (colVals.size() != 4)
114 {BDS::Warning(__METHOD_NAME__,
"invalid number of colour values for logical volume " + lv->GetName());}
115 G4String colourName = componentName +
"_colour_"+std::to_string(iColour);
117 G4String colourString = colourName +
":";
118 for (
const auto& c : colVals)
119 {colourString +=
" " + c;}
122 gdmlColours[lv->GetName()] = colour;
127 G4cout <<
"Loaded GDML file \"" << fileName <<
"\" containing:" << G4endl;
128 G4cout << pvsGDML.size() <<
" physical volumes, and " << lvsGDML.size() <<
" logical volumes" << G4endl;
131 std::map<G4String, G4Colour*>* mappingToUse =
nullptr;
132 G4bool deleteMap =
false;
133 if (!gdmlColours.empty())
137 mappingToUse =
new std::map<G4String, G4Colour*>(*mapping);
138 mappingToUse->insert(gdmlColours.begin(), gdmlColours.end());
142 {mappingToUse = &gdmlColours;}
145 {mappingToUse = mapping;}
147 auto visesGDML =
ApplyColourMapping(lvsGDML, mappingToUse, autoColour, preprocessNameToStrip);
149 {
delete mappingToUse;}
156 G4VisAttributes* vis =
new G4VisAttributes(*c);
157 vis->SetVisibility(
true);
158 visesGDML.insert(vis);
159 containerLV->SetVisAttributes(vis);
177 const G4String& acceleratorComponentName)
const
181 std::set<G4VPhysicalVolume*>& pvsIn,
182 std::set<G4LogicalVolume*>& lvsIn,
183 std::map<G4String, G4Material*>& materialsGDML)
185 const auto& lv = volume->GetLogicalVolume();
187 G4Material* mat = lv->GetMaterial();
188 materialsGDML[mat->GetName()] = mat;
189 for (G4int i = 0; i < (G4int)lv->GetNoDaughters(); i++)
191 const auto& pv = lv->GetDaughter(i);
198 const G4String& outputFileName,
200 const G4String& replacement)
203 std::ifstream ifs(fileName);
207 {
throw BDSException(__METHOD_NAME__,
"Cannot open file \"" + fileName +
"\"");}
209 std::ofstream fout(outputFileName);
211 G4cout << __METHOD_NAME__ <<
"Original file: " << fileName << G4endl;
212 G4cout << __METHOD_NAME__ <<
"Temporary file: " << outputFileName << G4endl;
215 int lenOfKey = key.size();
219 while (std::getline(ifs, buffer))
221 int f = buffer.find(key);
224 std::string outputString = std::string(buffer);
225 outputString.replace(f, lenOfKey, replacement);
226 fout << outputString <<
"\n";
229 {fout << buffer <<
"\n";}
239void _SymbolToPreventWarningGeomFacGDML(){;}
static BDSColourFromMaterial * Instance()
Singleton pattern.
G4Colour * GetColour(const G4Material *material, const G4String &prefixToStripFromName="")
Get colour from name.
static BDSColours * Instance()
singleton pattern
G4Colour * GetColour(const G4String &type, G4bool normaliseTo255=true)
Get colour from name.
General exception with possible name of object and message.
static G4String ProcessedNodeName(const G4String &nodeName, const G4String &prefix)
void RegisterLogicalVolume(G4LogicalVolume *logicalVolume)
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.
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(std::set< G4LogicalVolume * > &lvs, 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)
virtual G4String PreprocessedName(const G4String &objectName, const G4String &acceleratorComponentName) const
Use the GDML preprocessing scheme to prepare the preprocesseed volume names.
void ReplaceStringInFile(const G4String &filename, const G4String &outputFileName, const G4String &key, const G4String &replacement)
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, G4UserLimits *userLimitsToAttachToAllLVs=nullptr)
static BDSGlobalConstants * Instance()
Access method.
static BDSMaterials * Instance()
Singleton pattern access.
void CacheMaterialsFromGDML(const std::map< G4String, G4Material * > &materialsGDML, const G4String &prepend, G4bool prependWasUsed)
std::pair< BDSExtent, BDSExtent > DetermineExtents(const G4VSolid *solid)