/// <summary> /// Checks whether the query angle constraint matches a target distance. /// <para> /// This method checks whether a query constraint is satisfied by an observed /// angle (represented by a <see cref="PharmacophoreAngleBond"/> in the target molecule. /// </para> /// </summary> /// <remarks> /// Note that angles are compared upto 2 decimal places. /// </remarks> /// <param name="bond">The angle relationship in a target molecule</param> /// <returns>true if the target angle lies within the range of the query constraint</returns> public bool Matches(IBond bond) { bond = BondRef.Deref(bond); if (bond is PharmacophoreAngleBond pbond) { double bondLength = Round(pbond.BondLength, 2); return(bondLength >= lower && bondLength <= upper); } else { return(false); } }
public void TestMatchedBonds() { Assert.IsNotNull(conformers); // make a query var query = new PharmacophoreQuery(); var o = new PharmacophoreQueryAtom("D", "[OX1]"); var n1 = new PharmacophoreQueryAtom("A", "[N]"); var n2 = new PharmacophoreQueryAtom("A", "[N]"); query.Atoms.Add(o); query.Atoms.Add(n1); query.Atoms.Add(n2); var b1 = new PharmacophoreQueryBond(o, n1, 4.0, 4.5); var b2 = new PharmacophoreQueryBond(o, n2, 4.0, 5.0); var b3 = new PharmacophoreQueryBond(n1, n2, 5.4, 5.8); query.Bonds.Add(b1); query.Bonds.Add(b2); query.Bonds.Add(b3); var conf1 = conformers[0]; var matcher = new PharmacophoreMatcher(query); bool status = matcher.Matches(conf1); Assert.IsTrue(status); var bMatches = matcher.GetMatchingPharmacophoreBonds(); Assert.AreEqual(2, bMatches.Count); // 2 since we haven't gotten a unique set Assert.AreEqual(3, bMatches[0].Count); var pbond = (PharmacophoreBond)BondRef.Deref(bMatches[0][0]); var patom1 = (PharmacophoreAtom)AtomRef.Deref(pbond.Begin); var patom2 = (PharmacophoreAtom)AtomRef.Deref(pbond.End); Assert.AreEqual("D", patom1.Symbol); Assert.AreEqual("A", patom2.Symbol); var bondMap = matcher.GetTargetQueryBondMappings(); Assert.AreEqual(2, bondMap.Count); var mapping = bondMap[0]; // get the 'BondRef' for lookup var value = mapping[bMatches[0][0]]; Assert.AreEqual(b1, value); }
public void TestMatchingBonds() { var filename = "NCDK.Data.MDL.cnssmarts.sdf"; var ins = ResourceLoader.GetAsStream(filename); var reader = new EnumerableSDFReader(ins, CDK.Builder); var query = new PharmacophoreQuery(); var arom = new PharmacophoreQueryAtom("A", "c1ccccc1"); var n1 = new PharmacophoreQueryAtom("BasicAmine", "[NX3;h2,h1,H1,H2;!$(NC=O)]"); var b1 = new PharmacophoreQueryBond(arom, n1, 5.0, 7.0); query.Atoms.Add(arom); query.Atoms.Add(n1); query.Bonds.Add(b1); var mol = reader.First(); reader.Close(); var matcher = new PharmacophoreMatcher(query); bool status = matcher.Matches(mol); Assert.IsTrue(status); var pmatches = matcher.GetMatchingPharmacophoreAtoms(); Assert.AreEqual(1, pmatches.Count); var upmatches = matcher.GetUniqueMatchingPharmacophoreAtoms(); Assert.AreEqual(1, upmatches.Count); var bmatches = matcher.GetMatchingPharmacophoreBonds(); Assert.AreEqual(1, bmatches.Count); var bmatch = bmatches[0]; Assert.AreEqual(1, bmatch.Count); var pbond = (PharmacophoreBond)BondRef.Deref(bmatch[0]); Assert.AreEqual(5.63, pbond.BondLength, 0.01); }
private static Expr GetBondExpr(IBond bond) { return(((QueryBond)BondRef.Deref(bond)).Expression); }
public static IAtomContainer SuppressQueryHydrogens(IAtomContainer mol) { // pre-checks foreach (var atom in mol.Atoms) { if (!(AtomRef.Deref(atom) is QueryAtom)) { throw new ArgumentException("Non-query atoms found!", nameof(mol)); } } foreach (var bond in mol.Bonds) { if (!(BondRef.Deref(bond) is QueryBond)) { throw new ArgumentException("Non-query bonds found!", nameof(mol)); } } var plainHydrogens = new CDKObjectMap(); foreach (var atom in mol.Atoms) { int hcnt = 0; foreach (var nbor in mol.GetConnectedAtoms(atom)) { var qnbor = (QueryAtom)AtomRef.Deref(nbor); if (mol.GetConnectedBonds(nbor).Count() == 1 && IsSimpleHydrogen(qnbor.Expression)) { hcnt++; plainHydrogens.Set(nbor, atom); } } if (hcnt > 0) { var qatom = (QueryAtom)AtomRef.Deref(atom); var e = qatom.Expression; var hexpr = new Expr(); for (int i = 0; i < hcnt; i++) { hexpr.And(new Expr(ExprType.TotalHCount, i).Negate()); } e.And(hexpr); } } // nothing to do if (!plainHydrogens.Any()) { return(mol); } var res = new QueryAtomContainer(); foreach (var atom in mol.Atoms) { if (!plainHydrogens.ContainsKey(atom)) { res.Atoms.Add(atom); } } foreach (var bond in mol.Bonds) { if (!plainHydrogens.ContainsKey(bond.Begin) && !plainHydrogens.ContainsKey(bond.End)) { res.Bonds.Add(bond); } } foreach (var se in mol.StereoElements) { res.StereoElements.Add((IStereoElement <IChemObject, IChemObject>)se.Clone(plainHydrogens)); } return(res); }