// $Id$ // // Copyright (C) 2003-2006 Greg Landrum and Rational Discovery LLC // // @@ All Rights Reserved @@ // #include "QueryOps.h" #include #include namespace RDKit{ // common general queries //! returns a Query for matching atoms with a particular number of ring bonds ATOM_EQUALS_QUERY *makeAtomRingBondCountQuery(int what) { ATOM_EQUALS_QUERY *res=new AtomRingQuery(what); res->setDescription("AtomRingBondCount"); res->setDataFunc(queryAtomRingBondCount); return res; }; template int queryIsInRingOfSize(T const *obj) { return obj->getOwningMol().getRingInfo()->isAtomInRingOfSize(obj->getIdx(),sz); }; ATOM_EQUALS_QUERY *makeAtomInRingOfSizeQuery(int tgt){ RANGE_CHECK(3,tgt,20); ATOM_EQUALS_QUERY *res = new ATOM_EQUALS_QUERY; res->setVal(true); switch(tgt){ case 3: res->setDataFunc(queryIsInRingOfSize);break; case 4: res->setDataFunc(queryIsInRingOfSize);break; case 5: res->setDataFunc(queryIsInRingOfSize);break; case 6: res->setDataFunc(queryIsInRingOfSize);break; case 7: res->setDataFunc(queryIsInRingOfSize);break; case 8: res->setDataFunc(queryIsInRingOfSize);break; case 9: res->setDataFunc(queryIsInRingOfSize);break; case 10: res->setDataFunc(queryIsInRingOfSize);break; case 11: res->setDataFunc(queryIsInRingOfSize);break; case 12: res->setDataFunc(queryIsInRingOfSize);break; case 13: res->setDataFunc(queryIsInRingOfSize);break; case 14: res->setDataFunc(queryIsInRingOfSize);break; case 15: res->setDataFunc(queryIsInRingOfSize);break; case 16: res->setDataFunc(queryIsInRingOfSize);break; case 17: res->setDataFunc(queryIsInRingOfSize);break; case 18: res->setDataFunc(queryIsInRingOfSize);break; case 19: res->setDataFunc(queryIsInRingOfSize);break; case 20: res->setDataFunc(queryIsInRingOfSize);break; } res->setDescription("AtomRingSize"); return res; } BOND_EQUALS_QUERY *makeBondInRingOfSizeQuery(int tgt){ RANGE_CHECK(3,tgt,15); BOND_EQUALS_QUERY *res = new BOND_EQUALS_QUERY; res->setVal(true); switch(tgt){ case 3: res->setDataFunc(queryIsInRingOfSize);break; case 4: res->setDataFunc(queryIsInRingOfSize);break; case 5: res->setDataFunc(queryIsInRingOfSize);break; case 6: res->setDataFunc(queryIsInRingOfSize);break; case 7: res->setDataFunc(queryIsInRingOfSize);break; case 8: res->setDataFunc(queryIsInRingOfSize);break; case 9: res->setDataFunc(queryIsInRingOfSize);break; case 10: res->setDataFunc(queryIsInRingOfSize);break; case 11: res->setDataFunc(queryIsInRingOfSize);break; case 12: res->setDataFunc(queryIsInRingOfSize);break; case 13: res->setDataFunc(queryIsInRingOfSize);break; case 14: res->setDataFunc(queryIsInRingOfSize);break; case 15: res->setDataFunc(queryIsInRingOfSize);break; case 16: res->setDataFunc(queryIsInRingOfSize);break; case 17: res->setDataFunc(queryIsInRingOfSize);break; case 18: res->setDataFunc(queryIsInRingOfSize);break; case 19: res->setDataFunc(queryIsInRingOfSize);break; case 20: res->setDataFunc(queryIsInRingOfSize);break; } res->setDescription("BondRingSize"); return res; } template int queryMinRingSize(T const *obj) { return obj->getOwningMol().getRingInfo()->minAtomRingSize(obj->getIdx()); }; ATOM_EQUALS_QUERY *makeAtomMinRingSizeQuery(int tgt){ RANGE_CHECK(3,tgt,20); ATOM_EQUALS_QUERY *res = new ATOM_EQUALS_QUERY; res->setVal(tgt); res->setDataFunc(queryMinRingSize); res->setDescription("AtomMinRingSize"); return res; } BOND_EQUALS_QUERY *makeBondMinRingSizeQuery(int tgt){ RANGE_CHECK(3,tgt,20); BOND_EQUALS_QUERY *res = new BOND_EQUALS_QUERY; res->setVal(tgt); res->setDataFunc(queryMinRingSize); res->setDescription("BondMinRingSize"); return res; } ATOM_EQUALS_QUERY *makeAtomSimpleQuery(int what,int func(Atom const *)){ ATOM_EQUALS_QUERY *res = new ATOM_EQUALS_QUERY; res->setVal(what); res->setDataFunc(func); res->setDescription("AtomSimple"); return res; } ATOM_EQUALS_QUERY *makeAtomImplicitValenceQuery(int what){ ATOM_EQUALS_QUERY *res = makeAtomSimpleQuery(what,queryAtomImplicitValence); res->setDescription("AtomImplicitValence"); return res; } ATOM_EQUALS_QUERY *makeAtomTotalValenceQuery(int what){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(what,queryAtomTotalValence); res->setDescription("AtomTotalValence"); return res; } ATOM_EQUALS_QUERY *makeAtomNumEqualsQuery(int what){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(what,queryAtomNum); res->setDescription("AtomAtomicNum"); return res; } ATOM_EQUALS_QUERY *makeAtomExplicitDegreeQuery(int what){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(what,queryAtomExplicitDegree); res->setDescription("AtomExplicitDegree"); return res; } ATOM_EQUALS_QUERY *makeAtomTotalDegreeQuery(int what){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(what,queryAtomTotalDegree); res->setDescription("AtomTotalDegree"); return res; } ATOM_EQUALS_QUERY *makeAtomHCountQuery(int what){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(what,queryAtomHCount); res->setDescription("AtomHCount"); return res; } ATOM_EQUALS_QUERY *makeAtomAromaticQuery(){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(true,queryAtomAromatic); res->setDescription("AtomIsAromatic"); return res; } ATOM_EQUALS_QUERY *makeAtomAliphaticQuery(){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(true,queryAtomAliphatic); res->setDescription("AtomIsAliphatic"); return res; } ATOM_EQUALS_QUERY *makeAtomMassQuery(int what){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(what,queryAtomMass); res->setDescription("AtomMass"); return res; } ATOM_EQUALS_QUERY *makeAtomFormalChargeQuery(int what){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(what,queryAtomFormalCharge); res->setDescription("AtomFormalCharge"); return res; } ATOM_EQUALS_QUERY *makeAtomHybridizationQuery(int what){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(what,queryAtomHybridization); res->setDescription("AtomHybridization"); return res; } ATOM_EQUALS_QUERY *makeAtomInRingQuery(){ ATOM_EQUALS_QUERY *res=makeAtomSimpleQuery(true,queryIsAtomInRing); res->setDescription("AtomInRing"); return res; } ATOM_EQUALS_QUERY *makeAtomInNRingsQuery(int what){ ATOM_EQUALS_QUERY *res; res = makeAtomSimpleQuery(what,queryIsAtomInNRings); res->setDescription("AtomInNRings"); return res; } BOND_EQUALS_QUERY *makeBondOrderEqualsQuery(Bond::BondType what){ BOND_EQUALS_QUERY *res = new BOND_EQUALS_QUERY; res->setVal(what); res->setDataFunc(queryBondOrder); res->setDescription("BondOrder"); return res; } BOND_EQUALS_QUERY *makeBondDirEqualsQuery(Bond::BondDir what){ BOND_EQUALS_QUERY *res = new BOND_EQUALS_QUERY; res->setVal(what); res->setDataFunc(queryBondDir); res->setDescription("BondDir"); return res; } BOND_EQUALS_QUERY *makeBondIsInRingQuery(){ BOND_EQUALS_QUERY *res = new BOND_EQUALS_QUERY; res->setVal(true); res->setDataFunc(queryIsBondInRing); res->setDescription("BondInRing"); return res; } BOND_EQUALS_QUERY *makeBondInNRingsQuery(int what){ BOND_EQUALS_QUERY *res = new BOND_EQUALS_QUERY; res->setVal(what); res->setDataFunc(queryIsBondInNRings); res->setDescription("BondInNRings"); return res; } template int nullDataFun(T arg) { return 1; } bool nullQueryFun(int arg) { return true; } BOND_NULL_QUERY *makeBondNullQuery(){ BOND_NULL_QUERY *res = new BOND_NULL_QUERY; res->setDataFunc(nullDataFun); res->setMatchFunc(nullQueryFun); res->setDescription("BondNull"); return res; } ATOM_NULL_QUERY *makeAtomNullQuery(){ ATOM_NULL_QUERY *res = new ATOM_NULL_QUERY; res->setDataFunc(nullDataFun); res->setMatchFunc(nullQueryFun); res->setDescription("AtomNull"); return res; } };