File indexing completed on 2023-03-17 10:51:49
0001 #include "DetectorDescription/Parser/src/DDLCompositeMaterial.h"
0002 #include "DetectorDescription/Core/interface/DDMaterial.h"
0003 #include "DetectorDescription/Core/interface/DDName.h"
0004 #include "DetectorDescription/Core/interface/ClhepEvaluator.h"
0005 #include "DetectorDescription/Parser/interface/DDLElementRegistry.h"
0006 #include "DetectorDescription/Parser/src/DDLMaterial.h"
0007 #include "DetectorDescription/Parser/src/DDXMLElement.h"
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009
0010 #include <cstddef>
0011 #include <map>
0012 #include <utility>
0013
0014 class DDCompactView;
0015
0016 DDLCompositeMaterial::DDLCompositeMaterial(DDLElementRegistry* myreg) : DDLMaterial(myreg) {}
0017
0018
0019
0020 void DDLCompositeMaterial::preProcessElement(const std::string& name, const std::string& nmspace, DDCompactView& cpv) {
0021
0022
0023 myRegistry_->getElement("rMaterial")->clear();
0024 }
0025
0026 void DDLCompositeMaterial::processElement(const std::string& name, const std::string& nmspace, DDCompactView& cpv) {
0027 ClhepEvaluator& ev = myRegistry_->evaluator();
0028 DDXMLAttribute atts = getAttributeSet();
0029
0030 DDName ddn = getDDName(nmspace);
0031 DDMaterial mat;
0032
0033 mat = DDMaterial(ddn, ev.eval(nmspace, atts.find("density")->second));
0034
0035
0036 auto myMF = myRegistry_->getElement("MaterialFraction");
0037 auto myrMaterial = myRegistry_->getElement("rMaterial");
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052 if (myMF->size() != myrMaterial->size()) {
0053 std::string msg = "/nDDLCompositeMaterial::processElement found that the ";
0054 msg += "number of MaterialFractions does not match the number ";
0055 msg += "of rMaterial names for ";
0056 msg += ddn.ns() + ":" + ddn.name() + ".";
0057 throwError(msg);
0058 }
0059 for (size_t i = 0; i < myrMaterial->size(); ++i) {
0060 atts = myMF->getAttributeSet(i);
0061 mat.addMaterial(myrMaterial->getDDName(nmspace, "name", i), ev.eval(nmspace, atts.find("fraction")->second));
0062 }
0063
0064 DDLMaterial::setReference(nmspace, cpv);
0065 myMF->clear();
0066 clear();
0067 }