diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h index 8a0a28ab8e5bfab53ba4bd6e730a137314053083..2b3277554767d4fb315d63980d4b05c778aeb642 100644 --- a/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h +++ b/GeoModelTools/GeoModelXML/GeoModelXml/GeoModelXml/LogvolProcessor.h @@ -12,24 +12,21 @@ #include <map> #include "GeoModelXml/ElementProcessor.h" +#include "GeoModelKernel/GeoNameTag.h" class GmxUtil; -class GeoNameTag; -class GeoLogVol; -class GeoPhysVol; class LogvolProcessor: public ElementProcessor { public: - typedef struct { - GeoNameTag *name; - int id; - GeoLogVol *logVol; - bool alignable; - } LogVolStore; + struct LogVolStore { + GeoIntrusivePtr<GeoNameTag> name{}; + int id{0}; + GeoLogVolPtr logVol{}; + bool alignable{false}; + } ; void process(const xercesc::DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd); void zeroId(const xercesc::DOMElement *element); private: std::map<std::string, LogVolStore> m_map; - std::map<std::string, GeoPhysVol*> m_mapPV; }; #endif // LOGVOL_PROCESSOR_H diff --git a/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx index d6871f3a7f704082b642a0bc77042bce1c603207..baa1f73949696e42abae2e79d969edfadf3d6057 100644 --- a/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx +++ b/GeoModelTools/GeoModelXML/GeoModelXml/src/LogvolProcessor.cxx @@ -35,15 +35,12 @@ #include "GeoModelXml/GeoNodeList.h" #include "xercesc/util/XMLString.hpp" +#include "GeoModelHelpers/throwExcept.h" // using namespace CLHEP; using namespace std; using namespace xercesc; -//class GeoSerialDenominator; -//class GeoSerialTransformer; -//class GeoSerialIdentifier; - std::string getNodeType(const GeoGraphNode* node) { if ( dynamic_cast<const GeoPhysVol*>(node) ) return "GeoPhysVol"; @@ -59,19 +56,13 @@ std::string getNodeType(const GeoGraphNode* node) { return "GeoShape"; if ( dynamic_cast<const GeoMaterial*>(node) ) 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) ) return "GeoTransform"; return "UnidentifiedNode"; } void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNodeList &toAdd) { - GeoLogVol *lv; + GeoLogVolPtr lv{}; 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) @@ -167,30 +158,30 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo XMLCh * materials_tmp = XMLString::transcode("materials"); if (XMLString::compareIString(parent->getNodeName(), materials_tmp) != 0) { char* material_s = XMLString::transcode (material); - msglog << MSG::FATAL << "Processing logvol " << name << - ". Error in gmx file. An IDREF for a logvol material did not refer to a material.\n" << - "Material ref was " << material_s << "; exiting" << endmsg; + std::string materialName{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; - if (gmxUtil.matManager) - { - if (!gmxUtil.matManager->isMaterialDefined(nam_mat)) - { - GeoMaterial* tempMat=static_cast<GeoMaterial *>(gmxUtil.tagHandler.material.process(refMaterial, gmxUtil)); + if (gmxUtil.matManager) { + if (!gmxUtil.matManager->isMaterialDefined(nam_mat)) { + GeoMaterial* tempMat=dynamic_cast<GeoMaterial *>(gmxUtil.tagHandler.material.process(refMaterial, gmxUtil)); // we let GMX create the material and store it in the MM - gmxUtil.matManager->addMaterial(tempMat); } 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 // @@ -271,10 +262,10 @@ void LogvolProcessor::process(const DOMElement *element, GmxUtil &gmxUtil, GeoNo if (sensitive || (alignable.compare(string("true")) == 0)) { //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); - for (GeoNodeList::iterator node = childrenAdd.begin(); node != childrenAdd.end(); ++node) { - pv->add(*node); + for (const auto& node : childrenAdd) { + pv->add(node); } 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 } else { //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); //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) { - pv->add(*node); + for (const auto & node : childrenAdd) { + pv->add(node); //msglog << MSG::DEBUG << "LVProc, PV child: " << *node << " -- " << getNodeType(*node) << endmsg; } //msglog << MSG::DEBUG << "End of loop over children." << endmsg; - toAdd.push_back(pv); + toAdd.push_back(cacheVolume(pv).get()); } gmxUtil.positionIndex.decrementLevel();