public String generate(IAtom end, QueryBond bond) { String bexpr = generateBond(bond.getExpression()); if (bdirs.containsKey(bond)) { String bdir = bdirs.get(bond); if (bond.getBegin().equals(end)) { switch (bdir) { case BSTEREO_DN: bdir = BSTEREO_UP; break; case BSTEREO_UP: bdir = BSTEREO_DN; break; case BSTEREO_DNU: bdir = BSTEREO_UPU; break; case BSTEREO_UPU: bdir = BSTEREO_DNU; break; } } if (bexpr.isEmpty()) bexpr = bdir; else bexpr += ';' + bdir; } return bexpr; }
private static Expr getBondExpr(IBond bond) { return ((QueryBond) BondRef.deref(bond)).getExpression(); }
private void setBondDirs(IAtomContainer mol) { adjToDb = new HashSet<>(); ses = new HashMap<>(); bvisit = new HashSet<>(); for (IStereoElement se : mol.stereoElements()) { if (se.getConfigClass() == IStereoElement.CisTrans) { ses.put(se.getFocus(), se); } } for (IBond bond : mol.bonds()) { Expr expr = ((QueryBond) BondRef.deref(bond)).getExpression(); int flags = getBondStereoFlag(expr); if (flags != BSTEREO_ANY) { adjToDb.add(bond.getBegin()); adjToDb.add(bond.getEnd()); } } // first we set and propagate for (IBond bond : mol.bonds()) { if (!bvisit.contains(bond)) propagateBondStereo(bond, false); } // now set the complex ones for (IBond bond : mol.bonds()) { if (!bvisit.contains(bond)) propagateBondStereo(bond, true); } }
boolean parseBondExpr() { bond = new QueryBond(mol.getBuilder()); bond.setExpression(new Expr(Expr.Type.NONE)); if (!parseBondExpr(bond.getExpression(), bond, '\0')) { error = "Invalid bond expression"; return false; } return true; }
switch (order) { case 5: ((QueryBond) newBond).getExpression() .setPrimitive(Expr.Type.SINGLE_OR_DOUBLE); break; case 6: ((QueryBond) newBond).getExpression() .setPrimitive(Expr.Type.SINGLE_OR_AROMATIC); break; case 7: ((QueryBond) newBond).getExpression() .setPrimitive(Expr.Type.DOUBLE_OR_AROMATIC); break; case 8: ((QueryBond) newBond).getExpression() .setPrimitive(Expr.Type.TRUE); break;
@Test public void singleOrDoubleBond() throws Exception { String input = " 1 3 5 0 0 0 0"; IBond bond = reader.readBondFast(input, builder, atoms, new int[atoms.length], 1); assertThat(bond.getStereo(), is(IBond.Stereo.NONE)); assertFalse(bond.getFlag(CDKConstants.ISAROMATIC)); assertFalse(bond.getFlag(CDKConstants.SINGLE_OR_DOUBLE)); assertThat(bond, is(instanceOf(QueryBond.class))); assertThat(((QueryBond) bond).getExpression().type(), is(Expr.Type.SINGLE_OR_DOUBLE)); }
switch (order) { case 5: ((QueryBond) newBond).getExpression() .setPrimitive(Expr.Type.SINGLE_OR_DOUBLE); break; case 6: ((QueryBond) newBond).getExpression() .setPrimitive(Expr.Type.SINGLE_OR_AROMATIC); break; case 7: ((QueryBond) newBond).getExpression() .setPrimitive(Expr.Type.DOUBLE_OR_AROMATIC); break; case 8: ((QueryBond) newBond).getExpression() .setPrimitive(Expr.Type.TRUE); break;
@Test public void singleOrAromaticBond() throws Exception { String input = " 1 3 6 0 0 0 0"; IBond bond = reader.readBondFast(input, builder, atoms, new int[atoms.length], 1); assertThat(bond.getStereo(), is(IBond.Stereo.NONE)); assertFalse(bond.getFlag(CDKConstants.ISAROMATIC)); assertFalse(bond.getFlag(CDKConstants.SINGLE_OR_DOUBLE)); assertThat(bond, is(instanceOf(QueryBond.class))); assertThat(((QueryBond) bond).getExpression().type(), is(Expr.Type.SINGLE_OR_AROMATIC)); }
@Test public void doubleOrAromaticBond() throws Exception { String input = " 1 3 7 0 0 0 0"; IBond bond = reader.readBondFast(input, builder, atoms, new int[atoms.length], 1); assertThat(bond.getStereo(), is(IBond.Stereo.NONE)); assertFalse(bond.getFlag(CDKConstants.ISAROMATIC)); assertFalse(bond.getFlag(CDKConstants.SINGLE_OR_DOUBLE)); assertThat(bond, is(instanceOf(QueryBond.class))); assertThat(((QueryBond) bond).getExpression().type(), is(Expr.Type.DOUBLE_OR_AROMATIC)); }
@Test public void anyBond() throws Exception { String input = " 1 3 8 0 0 0 0"; IBond bond = reader.readBondFast(input, builder, atoms, new int[atoms.length], 1); assertThat(bond.getStereo(), is(IBond.Stereo.NONE)); assertFalse(bond.getFlag(CDKConstants.ISAROMATIC)); assertFalse(bond.getFlag(CDKConstants.SINGLE_OR_DOUBLE)); assertThat(bond, is(instanceOf(QueryBond.class))); assertThat(((QueryBond) bond).getExpression().type(), is(Expr.Type.TRUE)); }
boolean closeRing(int rnum) { IBond bond = rings[rnum]; rings[rnum] = null; numRingOpens--; Expr openExpr = ((QueryBond) BondRef.deref(bond)).getExpression(); if (this.bond != null) { Expr closeExpr = ((QueryBond) BondRef.deref(this.bond)).getExpression(); if (openExpr == null) ((QueryBond) BondRef.deref(bond)).setExpression(closeExpr); else if (!openExpr.equals(closeExpr)) { error = "Open/close expressions are not equivalent"; return false; } this.bond = null; } else if (openExpr == null) { ((QueryBond) BondRef.deref(bond)).setExpression(new Expr(SINGLE_OR_AROMATIC)); } bond.setAtom(prev, 1); addBond(prev, bond); return true; }
Expr e = qbond.getExpression(); switch (e.type()) { case ALIPHATIC_ORDER:
Expr expr = ((QueryBond) BondRef.deref(bond)).getExpression(); if (hasAliphaticDoubleBond(expr)) { IBond left = null, right = null; if (left == null || right == null) continue; Expr leftExpr = ((QueryBond) BondRef.deref(left)).getExpression(); Expr rightExpr = ((QueryBond) BondRef.deref(right)).getExpression(); Expr bexpr = determineBondStereo(leftExpr, rightExpr); if (bexpr != null) { Expr expr = ((QueryBond) BondRef.deref(bond)).getExpression(); expr = strip(expr, Expr.Type.STEREOCHEMISTRY); if (expr == null)
Expr e = qbond.getExpression(); switch (e.type()) { case ALIPHATIC_ORDER:
private void propagateBondStereo(IBond bond, boolean all) { Expr expr = ((QueryBond) BondRef.deref(bond)).getExpression(); int flags = getBondStereoFlag(expr); if (flags != BSTEREO_ANY) {
/** * Tests a molfile with 'query' bond types (in this case bond type == 6). */ @Test public void testQueryBondType6() throws Exception { String filename = "data/mdl/chebi.querybond.51736.mol"; InputStream ins = this.getClass().getClassLoader().getResourceAsStream(filename); MDLV2000Reader reader = new MDLV2000Reader(ins); IAtomContainer atc = reader.read(new AtomContainer()); reader.close(); int queryBondCount = 0; for (IBond bond : atc.bonds()) { if (bond instanceof QueryBond) { queryBondCount++; assertSame(((QueryBond) bond).getExpression().type(), Expr.Type.SINGLE_OR_AROMATIC); } } Assert.assertEquals("Expecting six 'query' bond types", 6, queryBondCount); }
/** * Tests a molfile with 'query' bond types (in this case bond type == 8 (any)). */ @Test public void testQueryBondType8() throws Exception { String filename = "data/mdl/iridiumCoordination.chebi52748.mol"; InputStream ins = this.getClass().getClassLoader().getResourceAsStream(filename); MDLV2000Reader reader = new MDLV2000Reader(ins); IAtomContainer atc = reader.read(new AtomContainer()); reader.close(); int queryBondCount = 0; for (IAtom atom : atc.atoms()) { if (atom.getSymbol().equals("Ir")) { for (IBond bond : atc.getConnectedBondsList(atom)) { if (bond instanceof QueryBond) { queryBondCount++; assertSame(((QueryBond) bond).getExpression().type(), Expr.Type.TRUE); } } } } Assert.assertEquals("Expecting three 'query' bond types to 'Ir'", 3, queryBondCount); }
Expr expr = ((QueryBond)qbond).getExpression(); return expr.matches(tbond, config);