Go to the documentation of this file.00001 #include "DetectorDescription/Core/interface/DDFilter.h"
00002 #include "DetectorDescription/Core/interface/DDExpandedView.h"
00003
00004
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006
00007 DDFilter::DDFilter()
00008 { }
00009
00010
00011 DDFilter::~DDFilter()
00012 { }
00013
00014
00015
00016
00017
00029 namespace {
00030
00031
00032
00033 inline bool sfs_compare(const DDSpecificsFilter::SpecificCriterion & crit,
00034 const DDsvalues_type & sv) {
00035 DDsvalues_type::const_iterator it = find(sv,crit.nameVal_.id());
00036 if (it == sv.end()) return false;
00037 switch (crit.comp_) {
00038 case DDSpecificsFilter::equals: case DDSpecificsFilter::matches:
00039 return ( crit.nameVal_.strings() == it->second.strings() );
00040 case DDSpecificsFilter::not_equals: case DDSpecificsFilter::not_matches:
00041 return ( crit.nameVal_.strings() != it->second.strings() );
00042 case DDSpecificsFilter::smaller_equals:
00043 return ( it->second.strings() <= crit.nameVal_.strings() );
00044 case DDSpecificsFilter::smaller:
00045 return ( it->second.strings() < crit.nameVal_.strings() );
00046 case DDSpecificsFilter::bigger_equals:
00047 return ( it->second.strings() >= crit.nameVal_.strings() );
00048 case DDSpecificsFilter::bigger:
00049 return ( it->second.strings() > crit.nameVal_.strings() );
00050 default:
00051 return false;
00052 }
00053 return false;
00054 }
00055
00056 inline bool sfd_compare(const DDSpecificsFilter::SpecificCriterion & crit,
00057 const DDsvalues_type & sv)
00058 {
00059 DDsvalues_type::const_iterator it = find(sv,crit.nameVal_.id());
00060 if (it == sv.end()) return false;
00061 if (it->second.isEvaluated() ) {
00062 switch (crit.comp_) {
00063 case DDSpecificsFilter::equals: case DDSpecificsFilter::matches:
00064 return (crit.nameVal_.doubles() == it->second.doubles() );
00065 case DDSpecificsFilter::not_equals: case DDSpecificsFilter::not_matches:
00066 return (crit.nameVal_.doubles() != it->second.doubles() );
00067 case DDSpecificsFilter::smaller_equals:
00068 return ( it->second.doubles() <= crit.nameVal_.doubles() );
00069 case DDSpecificsFilter::smaller:
00070 return ( it->second.doubles() < crit.nameVal_.doubles() );
00071 case DDSpecificsFilter::bigger_equals:
00072 return ( it->second.doubles() >= crit.nameVal_.doubles() );
00073 case DDSpecificsFilter::bigger:
00074 return ( it->second.doubles() > crit.nameVal_.doubles() );
00075 default:
00076 return false;
00077 }
00078 } else {
00079 edm::LogWarning("DD:Filter") << "Attempt to access a DDValue as doubles but DDValue is NOT Evaluated!"
00080 << crit.nameVal_.name();
00081 }
00082 return false;
00083 }
00084
00085 inline bool sfs_compare_nm (const DDSpecificsFilter::SpecificCriterion & crit,
00086 const std::vector<const DDsvalues_type *> & specs)
00087 {
00088
00089 bool result = false;
00090
00091 std::vector<const DDsvalues_type *>::const_iterator spit = specs.begin();
00092
00093
00094
00095 for (; spit != specs.end(); ++spit) {
00096 DDsvalues_type::const_iterator it = (**spit).begin();
00097
00098
00099 for (; it != (**spit).end(); ++it) {
00100
00101 size_t ci = 0;
00102 size_t si = 0;
00103
00104
00105 while ( !result && ci < crit.nameVal_.strings().size()) {
00106 if (it->second.id() == crit.nameVal_.id()) {
00107
00108 while ( !result && si < it->second.strings().size()) {
00109
00110
00111 switch (crit.comp_) {
00112
00113
00114
00115
00116
00117
00118
00119
00120 case DDSpecificsFilter::equals:
00121 case DDSpecificsFilter::matches:
00122 case DDSpecificsFilter::not_equals:
00123 case DDSpecificsFilter::not_matches:
00124 result = ( crit.nameVal_.strings()[ci] == it->second.strings()[si] );
00125 break;
00126
00127
00128
00129
00130 case DDSpecificsFilter::smaller_equals:
00131 result = ( it->second.strings()[si] > crit.nameVal_.strings()[ci] );
00132 break;
00133
00134
00135
00136 case DDSpecificsFilter::smaller:
00137 result = ( it->second.strings()[si] >= crit.nameVal_.strings()[ci] );
00138 break;
00139
00140
00141
00142
00143 case DDSpecificsFilter::bigger_equals:
00144 result = ( it->second.strings()[si] < crit.nameVal_.strings()[ci] );
00145 break;
00146
00147
00148
00149
00150 case DDSpecificsFilter::bigger:
00151 result = ( it->second.strings() <= crit.nameVal_.strings() );
00152 }
00153
00154 si ++;
00155 }
00156
00157
00158 if ( crit.comp_ == DDSpecificsFilter::not_equals
00159 || crit.comp_ == DDSpecificsFilter::not_matches
00160 || crit.comp_ == DDSpecificsFilter::smaller_equals
00161 || crit.comp_ == DDSpecificsFilter::smaller
00162 || crit.comp_ == DDSpecificsFilter::bigger)
00163 result = !result;
00164
00165
00166 }
00167 ++ci;
00168 }
00169 }
00170 }
00171
00172 return result;
00173 }
00174
00175 inline bool sfd_compare_nm(const DDSpecificsFilter::SpecificCriterion & crit,
00176 const std::vector<const DDsvalues_type *> & specs)
00177 {
00178
00179 bool result = false;
00180
00181
00182
00183 std::vector<const DDsvalues_type *>::const_iterator spit = specs.begin();
00184
00185
00186 for (; spit != specs.end(); ++spit) {
00187
00188 DDsvalues_type::const_iterator it = (**spit).begin();
00189
00190
00191 for (; it != (**spit).end(); ++it) {
00192 if ( !it->second.isEvaluated() ) {
00193 edm::LogWarning("DD:Filter") << "(nm) Attempt to access a DDValue as doubles but DDValue is NOT Evaluated!"
00194 << crit.nameVal_.name();
00195 continue;
00196 }
00197 size_t ci = 0;
00198 size_t si = 0;
00199
00200
00201 while ( !result && ci < crit.nameVal_.doubles().size()) {
00202
00203 if (it->second.id() == crit.nameVal_.id()) {
00204
00205 while ( !result && si < it->second.doubles().size()) {
00206
00207 switch (crit.comp_) {
00208
00209
00210
00211
00212
00213
00214 case DDSpecificsFilter::equals:
00215 case DDSpecificsFilter::matches:
00216 case DDSpecificsFilter::not_equals:
00217 case DDSpecificsFilter::not_matches:
00218 result = ( crit.nameVal_.doubles()[ci] == it->second.doubles()[si] );
00219 break;
00220
00221
00222
00223
00224 case DDSpecificsFilter::smaller_equals:
00225 result = ( it->second.doubles()[si] > crit.nameVal_.doubles()[ci] );
00226 break;
00227
00228
00229
00230 case DDSpecificsFilter::smaller:
00231 result = ( it->second.doubles()[si] >= crit.nameVal_.doubles()[ci] );
00232 break;
00233
00234
00235
00236
00237 case DDSpecificsFilter::bigger_equals:
00238 result = ( it->second.doubles()[si] < crit.nameVal_.doubles()[ci] );
00239 break;
00240
00241
00242
00243
00244 case DDSpecificsFilter::bigger:
00245 result = ( it->second.doubles() <= crit.nameVal_.doubles() );
00246 }
00247
00248 si ++;
00249
00250 }
00251
00252
00253 if ( crit.comp_ == DDSpecificsFilter::not_equals
00254 || crit.comp_ == DDSpecificsFilter::not_matches
00255 || crit.comp_ == DDSpecificsFilter::smaller_equals
00256 || crit.comp_ == DDSpecificsFilter::smaller
00257 || crit.comp_ == DDSpecificsFilter::bigger)
00258 result = !result;
00259
00260
00261
00262 }
00263
00264 ++ci;
00265 }
00266 }
00267 }
00268
00269 return result;
00270 }
00271
00272
00273
00274 }
00275
00276
00277
00278 DDSpecificsFilter::DDSpecificsFilter()
00279 : DDFilter()
00280 { }
00281
00282 DDSpecificsFilter::~DDSpecificsFilter() {}
00283
00284
00285 void DDSpecificsFilter::setCriteria(const DDValue & nameVal,
00286 comp_op op,
00287 log_op l,
00288 bool asStrin,
00289 bool merged
00290 )
00291 {
00292 criteria_.push_back(SpecificCriterion(nameVal,op,asStrin,merged));
00293 logOps_.push_back(l);
00294 }
00295
00296 bool DDSpecificsFilter::accept(const DDExpandedView & node) const
00297 {
00298 return accept_impl(node);
00299 }
00300
00301
00302 bool DDSpecificsFilter::accept_impl(const DDExpandedView & node) const
00303 {
00304 bool result = true;
00305 criteria_type::const_iterator it = criteria_.begin();
00306 criteria_type::const_iterator crEnd = criteria_.end();
00307 logops_type::const_iterator logOpIt = logOps_.begin();
00308
00309 const DDLogicalPart & logp = node.logicalPart();
00310 DDsvalues_type sv;
00311 std::vector<const DDsvalues_type *> specs;
00312 for (; it != crEnd; ++it, ++logOpIt) {
00313
00314 if ( ( result &&(*logOpIt)==OR ) ||
00315 ( (!result)&&(*logOpIt)==AND) ) continue;
00316
00317 bool locres=false;
00318 if (logp.hasDDValue(it->nameVal_)) {
00319
00320 if (it->merged_) {
00321
00322 if (sv.empty()) node.mergedSpecificsV(sv);
00323
00324 if (it->asString_) {
00325 locres = sfs_compare(*it,sv);
00326 }
00327 else {
00328 locres = sfd_compare(*it,sv);
00329 }
00330 }
00331 else {
00332
00333 if (specs.empty()) node.specificsV(specs);
00334
00335 if (it->asString_) {
00336 locres = sfs_compare_nm(*it, specs);
00337 }
00338 else {
00339 locres = sfd_compare_nm(*it, specs);
00340 }
00341 }
00342 }
00343 if (*logOpIt==AND) {
00344 result &= locres;
00345 }
00346 else {
00347 result |= locres;
00348 }
00349 }
00350 return result;
00351 }