Skip to content
Snippets Groups Projects
Commit 76f80bd1 authored by Joseph Boudreau's avatar Joseph Boudreau
Browse files

Merge branch 'ShareLogVols' into 'main'

GeoModelXml - Implement sharing mechanism for LogVol & non FullPhysVols

See merge request !283
parents 6c46697e c4d0062e
No related branches found
No related tags found
1 merge request!283GeoModelXml - Implement sharing mechanism for LogVol & non FullPhysVols
Pipeline #6904527 passed with warnings
...@@ -12,24 +12,21 @@ ...@@ -12,24 +12,21 @@
#include <map> #include <map>
#include "GeoModelXml/ElementProcessor.h" #include "GeoModelXml/ElementProcessor.h"
#include "GeoModelKernel/GeoNameTag.h"
class GmxUtil; class GmxUtil;
class GeoNameTag;
class GeoLogVol;
class GeoPhysVol;
class LogvolProcessor: public ElementProcessor { class LogvolProcessor: public ElementProcessor {
public: public:
typedef struct { struct LogVolStore {
GeoNameTag *name; GeoIntrusivePtr<GeoNameTag> name{};
int id; int id{0};
GeoLogVol *logVol; GeoLogVolPtr logVol{};
bool alignable; bool alignable{false};
} LogVolStore; } ;
void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd); void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd);
void zeroId(const xercesc::DOMElement *element); void zeroId(const xercesc::DOMElement *element);
private: private:
std::map<std::string, LogVolStore> m_map; std::map<std::string, LogVolStore> m_map;
std::map<std::string, GeoPhysVol*> m_mapPV;
}; };
#endif // LOGVOL_PROCESSOR_H #endif // LOGVOL_PROCESSOR_H
...@@ -35,15 +35,12 @@ ...@@ -35,15 +35,12 @@
#include "GeoModelXml/GeoNodeList.h" #include "GeoModelXml/GeoNodeList.h"
#include "xercesc/util/XMLString.hpp" #include "xercesc/util/XMLString.hpp"
#include "GeoModelHelpers/throwExcept.h"
// using namespace CLHEP; // using namespace CLHEP;
using namespace std; using namespace std;
using namespace xercesc; using namespace xercesc;
//class GeoSerialDenominator;
//class GeoSerialTransformer;
//class GeoSerialIdentifier;
std::string getNodeType(const GeoGraphNode* node) { std::string getNodeType(const GeoGraphNode* node) {
if ( dynamic_cast<const GeoPhysVol*>(node) ) if ( dynamic_cast<const GeoPhysVol*>(node) )
return "GeoPhysVol"; return "GeoPhysVol";
...@@ -59,19 +56,13 @@ std::string getNodeType(const GeoGraphNode* node) { ...@@ -59,19 +56,13 @@ std::string getNodeType(const GeoGraphNode* node) {
return "GeoShape"; return "GeoShape";
if ( dynamic_cast<const GeoMaterial*>(node) ) if ( dynamic_cast<const GeoMaterial*>(node) )
return "GeoMaterial"; return "GeoMaterial";
//if ( dynamic_cast<const GeoSerialDenominator*>(node) )
//return "GeoSerialDenominator";
//if ( dynamic_cast<const GeoSerialIdentifier*>(node) )
//return "GeoSerialIdentifier";
//if ( dynamic_cast<const GeoSerialTransformer*>(node) )
//return "GeoSerialTransformer";
if ( dynamic_cast<const GeoTransform*>(node) ) if ( dynamic_cast<const GeoTransform*>(node) )
return "GeoTransform"; return "GeoTransform";
return "UnidentifiedNode"; return "UnidentifiedNode";
} }
void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) { void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) {
GeoLogVol *lv; GeoLogVolPtr lv{};
GeoNameTag *nameTag_physChildVolName;//USed for "sensitive" PhysVols GeoNameTag *nameTag_physChildVolName;//USed for "sensitive" PhysVols
GeoNameTag *nameTag_physVolName;//Actually the logVol name, which gets used for the PhysVols if they have "named" attribute (and aren't sensitive) GeoNameTag *nameTag_physVolName;//Actually the logVol name, which gets used for the PhysVols if they have "named" attribute (and aren't sensitive)
...@@ -167,30 +158,30 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo ...@@ -167,30 +158,30 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo
XMLCh * materials_tmp = XMLString::transcode("materials"); XMLCh * materials_tmp = XMLString::transcode("materials");
if (XMLString::compareIString(parent->getNodeName(), materials_tmp) != 0) { if (XMLString::compareIString(parent->getNodeName(), materials_tmp) != 0) {
char* material_s = XMLString::transcode (material); char* material_s = XMLString::transcode (material);
msglog << MSG::FATAL << "Processing logvol " << name << std::string materialName{material_s};
". Error in gmx file. An IDREF for a logvol material did not refer to a material.\n" <<
"Material ref was " << material_s << "; exiting" << endmsg;
XMLString::release (&material_s); XMLString::release (&material_s);
std::abort(); THROW_EXCEPTION("Processing logvol " << name <<
". Error in gmx file. An IDREF for a logvol material did not refer to a material.\n" <<
"Material ref was " << materialName << "; exiting");
} }
std::string nam_mat=XMLString::transcode(material); std::string nam_mat= XMLString::transcode(material);
const GeoMaterial* matGeo = nullptr; const GeoMaterial* matGeo = nullptr;
if (gmxUtil.matManager) if (gmxUtil.matManager) {
{ if (!gmxUtil.matManager->isMaterialDefined(nam_mat)) {
if (!gmxUtil.matManager->isMaterialDefined(nam_mat)) GeoMaterial* tempMat=dynamic_cast<GeoMaterial *>(gmxUtil.tagHandler.material.process(refMaterial, gmxUtil));
{
GeoMaterial* tempMat=static_cast<GeoMaterial *>(gmxUtil.tagHandler.material.process(refMaterial, gmxUtil));
// we let GMX create the material and store it in the MM // we let GMX create the material and store it in the MM
gmxUtil.matManager->addMaterial(tempMat); gmxUtil.matManager->addMaterial(tempMat);
} }
matGeo = gmxUtil.matManager->getMaterial(nam_mat); matGeo = gmxUtil.matManager->getMaterial(nam_mat);
} else {
matGeo = dynamic_cast<const GeoMaterial *>(gmxUtil.tagHandler.material.process(refMaterial, gmxUtil));
} }
else {
matGeo = static_cast<const GeoMaterial *>(gmxUtil.tagHandler.material.process(refMaterial, gmxUtil)); if (!matGeo) {
} THROW_EXCEPTION("Cannot process "<<nam_mat);
}
// //
// Make the LogVol and add it to the map ready for next time // Make the LogVol and add it to the map ready for next time
// //
...@@ -271,10 +262,10 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo ...@@ -271,10 +262,10 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo
if (sensitive || (alignable.compare(string("true")) == 0)) { if (sensitive || (alignable.compare(string("true")) == 0)) {
//msglog << MSG::DEBUG << "Handling a FullPhysVol (i.e., an 'alignable' or 'sensitive' volume) ..." << endmsg; //msglog << MSG::DEBUG << "Handling a FullPhysVol (i.e., an 'alignable' or 'sensitive' volume) ..." << endmsg;
GeoFullPhysVol *pv = new GeoFullPhysVol(lv); GeoFullPhysVol *pv = new GeoFullPhysVol(cacheVolume(lv));
if (is_envelope) GeoVolumeTagCatalog::VolumeTagCatalog()->addTaggedVolume("Envelope",name,pv); if (is_envelope) GeoVolumeTagCatalog::VolumeTagCatalog()->addTaggedVolume("Envelope",name,pv);
for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) { for (const auto& node : childrenAdd) {
pv->add(*node); pv->add(node);
} }
toAdd.push_back(pv); // NB: the *PV is third item added, so reference as toAdd[2]. toAdd.push_back(pv); // NB: the *PV is third item added, so reference as toAdd[2].
// //
...@@ -307,15 +298,15 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo ...@@ -307,15 +298,15 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo
} }
else { else {
//msglog << MSG::DEBUG << "Handling a standard PhysVol..." << endmsg; //msglog << MSG::DEBUG << "Handling a standard PhysVol..." << endmsg;
GeoPhysVol *pv = new GeoPhysVol(lv); GeoPhysVol *pv = new GeoPhysVol(cacheVolume(lv));
if (is_envelope) GeoVolumeTagCatalog::VolumeTagCatalog()->addTaggedVolume("Envelope",name,pv); if (is_envelope) GeoVolumeTagCatalog::VolumeTagCatalog()->addTaggedVolume("Envelope",name,pv);
//msglog << MSG::DEBUG << "Now, looping over all the children of the LogVol (in the GMX meaning)..." << endmsg; //msglog << MSG::DEBUG << "Now, looping over all the children of the LogVol (in the GMX meaning)..." << endmsg;
for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) { for (const auto & node : childrenAdd) {
pv->add(*node); pv->add(node);
//msglog << MSG::DEBUG << "LVProc, PV child: " << *node << " -- " << getNodeType(*node) << endmsg; //msglog << MSG::DEBUG << "LVProc, PV child: " << *node << " -- " << getNodeType(*node) << endmsg;
} }
//msglog << MSG::DEBUG << "End of loop over children." << endmsg; //msglog << MSG::DEBUG << "End of loop over children." << endmsg;
toAdd.push_back(pv); toAdd.push_back(cacheVolume(pv).get());
} }
gmxUtil.positionIndex.decrementLevel(); gmxUtil.positionIndex.decrementLevel();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment