File indexing completed on 2024-04-06 12:05:34
0001 #include <ostream>
0002 #include <string>
0003 #include <utility>
0004 #include <vector>
0005
0006 #include "DetectorDescription/Core/interface/Store.h"
0007 #include "DetectorDescription/Core/interface/DDBase.h"
0008 #include "DetectorDescription/Core/interface/DDMaterial.h"
0009 #include "DetectorDescription/Core/interface/DDName.h"
0010
0011 namespace DDI {
0012 class Material;
0013 }
0014
0015
0016 bool DDCheckMaterial(DDMaterial& mip, std::pair<std::string, std::string>& result, int rlevel = 0) {
0017 std::string no_composites = " NO-COMPOSITES ";
0018 std::string no_density = " NO-DENSITY ";
0019 std::string costit_nok = " CONSTITUENT NOK ";
0020 std::string no_z = " NO-Z ";
0021 std::string no_a = " NO-A ";
0022
0023 std::string curr_err = "";
0024 bool err = false;
0025
0026 if (mip.isDefined().first == nullptr) {
0027 err = true;
0028 curr_err += "material not declared; unknown material!";
0029 result.first = curr_err;
0030 return err;
0031 }
0032
0033 if (mip.isDefined().second == 0) {
0034 err = true;
0035 curr_err += "material name=" + mip.name().ns() + ":" + mip.name().name() + " is declared but not defined";
0036 result.first = curr_err;
0037 return err;
0038 }
0039
0040 DDMaterial& mp = mip;
0041 result.second = mp.ddname().fullname();
0042
0043 if (!mp.density()) {
0044 err = true;
0045 curr_err += no_density;
0046 }
0047
0048 if ((!mp.z() || !mp.a()) && !mp.noOfConstituents()) {
0049 err = true;
0050 curr_err += no_z;
0051 curr_err += "or";
0052 curr_err += no_a;
0053 }
0054
0055 if ((!mp.z() && !mp.a()) && !mp.noOfConstituents()) {
0056 err = true;
0057 curr_err += no_composites;
0058 }
0059
0060 if (!mp.z() && !mp.a() && !mp.density() && !mp.noOfConstituents()) {
0061 err = true;
0062 curr_err = " NOT-DEFINED ";
0063 }
0064
0065 if (err) {
0066 result.first = curr_err;
0067 }
0068
0069
0070
0071 for (int loop = mp.noOfConstituents() - 1; loop >= 0; --loop) {
0072 std::pair<std::string, std::string> res("", "");
0073 DDMaterial mat(mp.ddname());
0074 DDMaterial mimpl = mat.constituent(loop).first;
0075 ++rlevel;
0076 bool c_err = DDCheckMaterial(mimpl, res, rlevel);
0077 if (c_err) {
0078 err = err | c_err;
0079 curr_err = curr_err + std::string(" constituents have errors:\n") + std::string(4 * rlevel, ' ') +
0080 std::string(" ") + res.first;
0081 result.first = curr_err;
0082 }
0083 --rlevel;
0084 }
0085
0086 return err;
0087 }
0088
0089
0090 bool DDCheckMaterials(std::ostream& os, std::vector<std::pair<std::string, std::string>>* res) {
0091 bool result = false;
0092 std::vector<std::pair<std::string, std::string>> errors;
0093
0094 auto& mr = DDBase<DDName, std::unique_ptr<DDI::Material>>::StoreT::instance();
0095
0096 for (const auto& i : mr) {
0097 std::pair<std::string, std::string> error("", "");
0098 DDMaterial tmat(i.first);
0099
0100 if (DDCheckMaterial(tmat, error)) {
0101 errors.emplace_back(error);
0102 }
0103 }
0104
0105 std::string s(" ");
0106 os << "[DDCore:Report] Materials " << std::endl;
0107 os << s << mr.size() << " Materials declared" << std::endl;
0108 os << s << "detected errors:" << errors.size() << std::endl;
0109 for (const auto& j : errors) {
0110 os << std::endl << s << j.second << " " << j.first << std::endl;
0111 result = true;
0112 }
0113 if (res)
0114 *res = errors;
0115 return result;
0116 }