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); }
private static List <IReadOnlyList <PharmacophoreAtom> > GetPCoreAtoms(Mappings mappings) { var atoms = new List <IReadOnlyList <PharmacophoreAtom> >(); // XXX: re-subsearching the query foreach (var map in mappings.ToAtomMap()) { var pcoreatoms = new List <PharmacophoreAtom>(); foreach (var atom in map.Values) { pcoreatoms.Add((PharmacophoreAtom)AtomRef.Deref(atom)); } atoms.Add(pcoreatoms); } return(atoms); }
private static Expr GetAtomExpr(IAtom atom) { return(((QueryAtom)AtomRef.Deref(atom)).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); }