File indexing completed on 2024-09-07 04:35:59
0001 #ifndef DETECTOR_DESCRIPTION_DD_ERROR_DETECTION_H
0002 #define DETECTOR_DESCRIPTION_DD_ERROR_DETECTION_H
0003
0004 #include "DetectorDescription/Core/interface/DDCompactView.h"
0005 #include <map>
0006 #include <ostream>
0007 #include <set>
0008 #include <string>
0009 #include <utility>
0010 #include <vector>
0011
0012 #include "DetectorDescription/Core/interface/Singleton.h"
0013 #include "DetectorDescription/Core/interface/DDLogicalPart.h"
0014 #include "DetectorDescription/Core/interface/DDMaterial.h"
0015 #include "DetectorDescription/Core/interface/DDSolid.h"
0016 #include "DetectorDescription/Core/interface/DDSpecifics.h"
0017 #include "DetectorDescription/Core/interface/DDTransform.h"
0018
0019 class DDCompactView;
0020 class DDLogicalPart;
0021 class DDMaterial;
0022 class DDName;
0023 class DDRotation;
0024 class DDSolid;
0025 class DDSpecifics;
0026
0027 using lp_err = DDI::Singleton<std::map<std::string, std::set<DDLogicalPart>>>;
0028 using ma_err = DDI::Singleton<std::map<std::string, std::set<DDMaterial>>>;
0029 using so_err = DDI::Singleton<std::map<std::string, std::set<DDSolid>>>;
0030 using ro_err = DDI::Singleton<std::map<std::string, std::set<DDRotation>>>;
0031 using sp_err = DDI::Singleton<std::map<std::string, std::set<DDSpecifics>>>;
0032
0033 using ns_type = std::map<std::string, std::set<std::string>>;
0034 using ns_nm_type = std::map<std::string, std::set<DDName>>;
0035
0036 template <class T>
0037 std::ostream& operator<<(std::ostream& o, const std::set<T>& v) {
0038 typename std::set<T>::const_iterator it(v.begin()), ed(v.end());
0039 for (; it != ed; ++it) {
0040 o << it->ddname() << ' ';
0041 }
0042 return o;
0043 }
0044
0045 template <class T>
0046 std::ostream& operator<<(std::ostream& o, const std::map<std::string, std::set<T>>& m) {
0047 typedef typename std::map<std::string, std::set<T>>::const_iterator c_it;
0048 c_it it(m.begin()), ed(m.end());
0049 for (; it != ed; ++it) {
0050 o << it->first << ": " << it->second;
0051 o << std::endl;
0052 }
0053 return o;
0054 }
0055
0056 template <class T, class N>
0057 std::ostream& operator<<(std::ostream& o, const std::map<N, std::set<T>>& m) {
0058 typedef typename std::map<N, std::set<T>>::const_iterator c_it;
0059 c_it it(m.begin()), ed(m.end());
0060 for (; it != ed; ++it) {
0061 o << it->first.ddname() << ": " << it->second;
0062 o << std::endl;
0063 }
0064 return o;
0065 }
0066
0067 template <typename T>
0068 bool findNameSpaces(T dummy, ns_type& m) {
0069 bool result = true;
0070 typename T::template iterator<T> it, ed;
0071 ed.end();
0072 for (; it != ed; ++it) {
0073 result = it->isDefined().second;
0074 if (!result)
0075 DDI::Singleton<std::map<std::string, std::set<T>>>::instance()[it->name().ns()].insert(*it);
0076 m[it->name().ns()].insert(it->name().name());
0077 }
0078 return result;
0079 }
0080
0081 template <typename T>
0082 bool findNameSpaces(T dummy, ns_nm_type& m) {
0083 bool result = true;
0084 typename T::template iterator<T> it, ed;
0085 ed.end();
0086 for (; it != ed; ++it) {
0087 result = it->isDefined().second;
0088 if (!result)
0089 DDI::Singleton<std::map<std::string, std::set<T>>>::instance()[it->name().ns()].insert(*it);
0090 m[it->name().ns()].insert(it->name().name());
0091 }
0092 return result;
0093 }
0094
0095 template <class C>
0096 const std::map<std::string, std::set<C>>& dd_error_scan(const C&) {
0097 typedef std::map<std::string, std::set<C>> error_type;
0098 static error_type result_;
0099 typename C::template iterator<C> it;
0100 typename C::template iterator<C> ed(C::end());
0101 for (; it != ed; ++it) {
0102 if (!it->isDefined().second) {
0103 result_[it->name().ns()].insert(*it);
0104 }
0105 }
0106 return result_;
0107 }
0108
0109 class DDErrorDetection {
0110 public:
0111 DDErrorDetection(const DDCompactView& cpv);
0112 ~DDErrorDetection();
0113
0114 void scan(const DDCompactView& cpv);
0115
0116 void errors();
0117
0118 void warnings();
0119
0120 const std::map<std::string, std::set<DDLogicalPart>>& lp_cpv(const DDCompactView& cpv);
0121 const std::map<DDMaterial, std::set<DDLogicalPart>>& ma_lp();
0122 const std::map<DDSolid, std::set<DDLogicalPart>>& so_lp();
0123 const std::map<DDSolid, std::set<DDSolid>>& so();
0124
0125 void nix();
0126
0127 const std::vector<std::pair<std::string, std::string>>& ma();
0128
0129 void report(const DDCompactView& cpv, std::ostream& o);
0130
0131 bool noErrorsInTheReport(const DDCompactView& cpv);
0132
0133 private:
0134 DDErrorDetection() {}
0135 };
0136
0137 #endif