Go to the documentation of this file.00001 #include "DetectorDescription/Base/interface/DDdebug.h"
00002 #include "DetectorDescription/ExprAlgo/interface/AlgoCheck.h"
00003 #include <cstdio>
00004
00005 bool AlgoCheck::check(parS_type & ps, parE_type & pe, std::string & err)
00006 {
00007 bool nok = false;
00008
00009
00010 constraintsE_type::iterator e_it = constraintsE_.begin();
00011 for (; e_it != constraintsE_.end(); ++e_it) {
00012
00013 parE_type::iterator pit = pe.find(e_it->first);
00014 if (e_it->second.use_) {
00015
00016 if (pit != pe.end()) {
00017 nok |= checkBounds(pit,e_it,err);
00018 }
00019 else {
00020 err += std::string("\tmissing required parameter: ") + e_it->first + std::string("\n");
00021 nok |= true;
00022 }
00023
00024 }
00025
00026 else {
00027
00028
00029 DCOUT('e', "AlgoCheck::check(): optional param=" << e_it->first);
00030
00031
00032 if (pit != pe.end()) {
00033
00034 nok |= checkBounds(pit,e_it,err);
00035 }
00036 else {
00037
00038 if (e_it->second.default_) {
00039 for(int j=0; j<e_it->second.minOccurs_; ++j)
00040 pe[e_it->first].push_back(e_it->second.defaultVal_);
00041 }
00042 }
00043 }
00044
00045 }
00046
00047
00048
00049
00050 constraintsS_type::iterator s_it = constraintsS_.begin();
00051 for (; s_it != constraintsS_.end(); ++s_it) {
00052
00053 parS_type::iterator sit = ps.find(s_it->first);
00054 if (s_it->second.use_) {
00055
00056 if (sit != ps.end()) {
00057 nok |= checkStrings(sit, s_it, err);
00058 }
00059 else {
00060 err += std::string("\tmissing required parameter: ") + s_it->first + std::string("\n");
00061 nok |= true;
00062 }
00063 }
00064 else {
00065
00066
00067 if (s_it->second.default_) {
00068 for (int j = 0; j < s_it->second.minOccurs_; ++j)
00069 ps[s_it->first].push_back(s_it->second.defaultVal_);
00070 }
00071 }
00072 }
00073 return !nok;
00074 }
00075
00076
00077
00078 bool AlgoCheck::checkBounds(parE_type::iterator pit,
00079 constraintsE_type::iterator cit,
00080 std::string & err
00081 )
00082 {
00083 bool nok = false;
00084
00085 DCOUT('e', "AlgoCheck::checkBounds(), par-name=" << pit->first );
00086 DCOUT('e', " minOccurs = " << cit->second.minOccurs_ );
00087 DCOUT('e', " maxOccurs = " << cit->second.maxOccurs_ );
00088 DCOUT('e', " par-occurs = " << pit->second.size() );
00089
00090 if (cit->second.minOccurs_ > int(pit->second.size()) ) {
00091 err += "\tpar. " + cit->first
00092 + " occurs=" + d2s(pit->second.size()) + std::string(" < minOccurs; minOccurs=")
00093 + d2s(cit->second.minOccurs_) + std::string(" maxOccurs=")
00094 + d2s(cit->second.maxOccurs_)
00095 + "\n";
00096 nok |= true;
00097 DCOUT('e', " VIOLATION of minOccurs");
00098 }
00099
00100 if (cit->second.maxOccurs_ < int(pit->second.size()) ) {
00101 err += "\tpar. " + cit->first
00102 + " occurs=" + d2s(pit->second.size()) + std::string(" > maxOccurs; minOccurs=")
00103 + d2s(cit->second.minOccurs_) + std::string(" maxOccurs=")
00104 + d2s(cit->second.maxOccurs_)
00105 + "\n";
00106 nok |= true;
00107 DCOUT('e', " VIOLATION of maxOccurs");
00108 }
00109
00110
00111
00112
00113 int c=0;
00114 int i=0;
00115 int m=int(pit->second.size());
00116 for (;i<m;++i) {
00117 if (pit->second[i] < cit->second.min_) {
00118 err += "\tpar. " + cit->first + std::string("[") + d2s(i) + std::string("]=")
00119 + d2s(pit->second[i]) + std::string(" < min; min=")
00120 + d2s(cit->second.min_) + std::string(" max=") + d2s(cit->second.max_)
00121 + "\n";
00122 ++c;
00123 }
00124 if (pit->second[i] > cit->second.max_) {
00125 err += "\tpar. " + cit->first + std::string("[") + d2s(i) + std::string("]=")
00126 + d2s(pit->second[i]) + std::string(" > max; min=")
00127 + d2s(cit->second.min_) + std::string(" max=") + d2s(cit->second.max_)
00128 + "\n";
00129 ++c;
00130 }
00131 }
00132 if (c)
00133 nok |= true;
00134
00135 return nok;
00136 }
00137
00138 std::string
00139 AlgoCheck::d2s( double x )
00140 {
00141 char buffer [25];
00142 int len = snprintf( buffer, 25, "%g", x );
00143 if( len >= 25 )
00144 edm::LogError( "DoubleToString" ) << "Length truncated (from " << len << ")";
00145 return std::string( buffer );
00146 }
00147
00148 bool
00149 AlgoCheck::checkStrings( parS_type::iterator sit,
00150 constraintsS_type::iterator cit,
00151 std::string & err )
00152 {
00153
00154 bool nok = false;
00155 if (cit->second.minOccurs_ > int(sit->second.size()) ) {
00156 err += "\tpar. " + cit->first
00157 + " occurs=" + d2s(sit->second.size()) + std::string(" < minOccurs; minOccurs=")
00158 + d2s(cit->second.minOccurs_) + std::string(" maxOccurs=")
00159 + d2s(cit->second.maxOccurs_)
00160 + "\n";
00161 nok |= true;
00162 DCOUT('e', " VIOLATION of minOccurs");
00163 }
00164
00165 if (cit->second.maxOccurs_ < int(sit->second.size()) ) {
00166 err += "\tpar. " + cit->first
00167 + " occurs=" + d2s(sit->second.size()) + std::string(" > maxOccurs; minOccurs=")
00168 + d2s(cit->second.minOccurs_) + std::string(" maxOccurs=")
00169 + d2s(cit->second.maxOccurs_)
00170 + "\n";
00171 nok |= true;
00172 DCOUT('e', " VIOLATION of maxOccurs");
00173 }
00174
00175
00176 int i = 0;
00177 int m = int(sit->second.size());
00178 for (; i<m;++i){
00179
00180 std::string s = sit->second[i];
00181 int ss = int(s.size());
00182
00183 int j = 0;
00184 for (; j < ss; ++j) {
00185 if (s[j] != ' '){
00186 break;
00187 }
00188 if (j == ss && s[j] == ' ') {
00189 err += "\tpar. " + cit->first + std::string("[") + d2s(i) + std::string("] is blank");
00190 nok |= true;
00191 DCOUT('e', " VIOLATION of requiring non-blank std::strings");
00192 }
00193 }
00194 }
00195
00196 return nok;
00197
00198 }
00199
00200