33 #ifndef __RD_FILTER_MATCHER_H__
34 #define __RD_FILTER_MATCHER_H__
43 std::string getArgName(
const boost::shared_ptr<FilterMatcherBase> &arg) {
44 if (arg.get())
return arg->getName();
45 return "<nullmatcher>";
49 namespace FilterMatchOps {
51 boost::shared_ptr<FilterMatcherBase> arg1;
52 boost::shared_ptr<FilterMatcherBase> arg2;
64 And(
const boost::shared_ptr<FilterMatcherBase> &arg1,
65 const boost::shared_ptr<FilterMatcherBase> &arg2)
73 getArgName(arg2) +
")";
77 return arg1.get() && arg2.get() && arg1->isValid() && arg2->isValid();
82 "FilterMatchOps::And is not valid, null arg1 or arg2");
83 return arg1->hasMatch(mol) && arg2->hasMatch(mol);
88 "FilterMatchOps::And is not valid, null arg1 or arg2");
89 std::vector<FilterMatch> matches;
90 if (arg1->getMatches(mol, matches) && arg2->getMatches(mol, matches)) {
97 boost::shared_ptr<FilterMatcherBase>
copy()
const {
98 return boost::shared_ptr<FilterMatcherBase>(
new And(*
this));
102 #ifdef RDK_USE_BOOST_SERIALIZATION
103 friend class boost::serialization::access;
104 template <
class Archive>
105 void serialize(Archive &ar,
const unsigned int version) {
107 ar &boost::serialization::base_object<FilterMatcherBase>(*
this);
116 boost::shared_ptr<FilterMatcherBase> arg1;
117 boost::shared_ptr<FilterMatcherBase> arg2;
128 Or(
const boost::shared_ptr<FilterMatcherBase> &arg1,
129 const boost::shared_ptr<FilterMatcherBase> &arg2)
136 getArgName(arg2) +
")";
140 return arg1.get() && arg2.get() && arg1->isValid() && arg2->isValid();
144 PRECONDITION(isValid(),
"Or is not valid, null arg1 or arg2");
145 return arg1->hasMatch(mol) || arg2->hasMatch(mol);
150 "FilterMatchOps::Or is not valid, null arg1 or arg2");
153 bool res1 = arg1->getMatches(mol, matchVect);
154 bool res2 = arg2->getMatches(mol, matchVect);
158 boost::shared_ptr<FilterMatcherBase>
copy()
const {
159 return boost::shared_ptr<FilterMatcherBase>(
new Or(*
this));
162 #ifdef RDK_USE_BOOST_SERIALIZATION
163 friend class boost::serialization::access;
164 template <
class Archive>
165 void serialize(Archive &ar,
const unsigned int version) {
167 ar &boost::serialization::base_object<FilterMatcherBase>(*
this);
175 boost::shared_ptr<FilterMatcherBase> arg1;
188 Not(
const boost::shared_ptr<FilterMatcherBase> &arg1)
197 bool isValid()
const {
return arg1.get() && arg1->isValid(); }
200 PRECONDITION(isValid(),
"FilterMatchOps::Not: arg1 is null");
201 return !arg1->hasMatch(mol);
205 PRECONDITION(isValid(),
"FilterMatchOps::Not: arg1 is null");
208 std::vector<FilterMatch> matchVect;
209 return !arg1->getMatches(mol, matchVect);
212 boost::shared_ptr<FilterMatcherBase>
copy()
const {
213 return boost::shared_ptr<FilterMatcherBase>(
new Not(*
this));
217 #ifdef RDK_USE_BOOST_SERIALIZATION
218 friend class boost::serialization::access;
219 template <
class Archive>
220 void serialize(Archive &ar,
const unsigned int version) {
222 ar &boost::serialization::base_object<FilterMatcherBase>(*
this);
232 unsigned int d_min_count;
233 unsigned int d_max_count;
241 d_max_count(UINT_MAX) {}
254 unsigned int maxCount = UINT_MAX);
269 unsigned int minCount = 1,
unsigned int maxCount = UINT_MAX);
282 SmartsMatcher(
const std::string &name,
const std::string &smarts,
283 unsigned int minCount = 1,
unsigned int maxCount = UINT_MAX);
297 unsigned int minCount = 1,
unsigned int maxCount = UINT_MAX);
302 bool isValid()
const {
return d_pattern.get(); }
307 void setPattern(
const std::string &smarts);
309 void setPattern(
const ROMol &mol);
322 virtual bool getMatches(
const ROMol &mol,
323 std::vector<FilterMatch> &matchVect)
const;
324 virtual bool hasMatch(
const ROMol &mol)
const;
325 virtual boost::shared_ptr<FilterMatcherBase>
copy()
const {
326 return boost::shared_ptr<FilterMatcherBase>(
new SmartsMatcher(*
this));
330 #ifdef RDK_USE_BOOST_SERIALIZATION
331 friend class boost::serialization::access;
332 template <
class Archive>
333 void save(Archive &ar,
const unsigned int version)
const {
335 ar &boost::serialization::base_object<FilterMatcherBase>(*
this);
342 template <
class Archive>
343 void load(Archive &ar,
const unsigned int version) {
344 ar &boost::serialization::base_object<FilterMatcherBase>(*
this);
349 d_pattern = boost::shared_ptr<ROMol>(
new ROMol(res));
354 BOOST_SERIALIZATION_SPLIT_MEMBER();
372 std::vector<boost::shared_ptr<FilterMatcherBase>> d_offPatterns;
386 const std::vector<boost::shared_ptr<FilterMatcherBase>> &offPatterns)
392 for (
size_t i = 0; i < d_offPatterns.size(); ++i) {
393 res +=
" " + d_offPatterns[i]->getName();
400 for (
size_t i = 0; i < d_offPatterns.size(); ++i)
401 if (!d_offPatterns[i]->isValid())
return false;
407 d_offPatterns.push_back(base.
copy());
411 const std::vector<boost::shared_ptr<FilterMatcherBase>> &offPatterns) {
412 d_offPatterns = offPatterns;
417 "ExclusionList: one of the exclusion pattens is invalid");
419 for (
size_t i = 0; i < d_offPatterns.size() && result; ++i) {
420 result &= !d_offPatterns[i]->hasMatch(mol);
428 "ExclusionList: one of the exclusion pattens is invalid");
430 for (
size_t i = 0; i < d_offPatterns.size() && result; ++i) {
431 result &= !d_offPatterns[i]->hasMatch(mol);
437 virtual boost::shared_ptr<FilterMatcherBase>
copy()
const {
438 return boost::shared_ptr<FilterMatcherBase>(
new ExclusionList(*
this));
442 #ifdef RDK_USE_BOOST_SERIALIZATION
443 friend class boost::serialization::access;
444 template <
class Archive>
445 void serialize(Archive &ar,
const unsigned int version) {
447 ar &boost::serialization::base_object<FilterMatcherBase>(*
this);
455 std::vector<boost::shared_ptr<FilterHierarchyMatcher>> d_children;
456 boost::shared_ptr<FilterMatcherBase> d_matcher;
474 if (d_matcher.get()) {
475 return d_matcher->getName();
477 return "FilterMatcherHierarchy root";
481 bool isValid()
const {
return d_matcher->isValid(); }
489 d_matcher = matcher.
copy();
490 PRECONDITION(getName() == d_matcher->getName(),
"Opps");
499 boost::shared_ptr<FilterHierarchyMatcher>
addChild(
501 PRECONDITION(hierarchy.d_matcher.get() && hierarchy.d_matcher->isValid(),
502 "Only one root node is allowed in a FilterHierarchyMatcher");
504 d_children.push_back(boost::shared_ptr<FilterHierarchyMatcher>(
506 return d_children.back();
514 virtual bool getMatches(
const ROMol &mol,
515 std::vector<FilterMatch> &matches)
const;
522 std::vector<FilterMatch> temp;
523 return getMatches(mol, temp);
527 virtual boost::shared_ptr<FilterMatcherBase>
copy()
const {
528 return boost::shared_ptr<FilterMatcherBase>(
533 #ifdef RDK_USE_BOOST_SERIALIZATION
534 friend class boost::serialization::access;
535 template <
class Archive>
536 void serialize(Archive &ar,
const unsigned int version) {
538 ar &boost::serialization::base_object<FilterMatcherBase>(*
this);
545 #ifdef RDK_USE_BOOST_SERIALIZATION
547 template <
class Archive>
548 void registerFilterMatcherTypes(Archive &ar) {
549 ar.register_type(
static_cast<FilterMatchOps::And *
>(NULL));
550 ar.register_type(
static_cast<FilterMatchOps::Or *
>(NULL));
551 ar.register_type(
static_cast<FilterMatchOps::Not *
>(NULL));
552 ar.register_type(
static_cast<SmartsMatcher *
>(NULL));
553 ar.register_type(
static_cast<ExclusionList *
>(NULL));
554 ar.register_type(
static_cast<FilterHierarchyMatcher *
>(NULL));
559 #ifdef RDK_USE_BOOST_SERIALIZATION
561 BOOST_CLASS_VERSION(
RDKit::ExclusionList, 1)
562 BOOST_CLASS_VERSION(
RDKit::FilterHierarchyMatcher, 1)