/** * Filter the mappings for those which preserve stereochemistry specified in * the query. * * @return fluent-api instance * @deprecated Results now automatically consider stereo if it's present, to * match without stereochemistry remove the stereo features. */ @Deprecated public Mappings stereochemistry() { // query structures currently have special requirements (i.e. SMARTS) if (query instanceof IQueryAtomContainer) return this; return filter(new StereoMatch(query, target)); }
Mappings filter(Mappings mappings, IAtomContainer query, IAtomContainer target) { // apply required post-match filters if (hasStereo) { mappings = hasQueryStereo ? mappings.filter(new QueryStereoFilter(query, target)) : mappings.filter(new StereoMatch(query, target)); } if (hasCompGrp) mappings = mappings.filter(new ComponentFilter(query, target)); if (hasRxnMap) mappings = mappings.filter(new AtomMapFilter(query, target)); return mappings; }
@Test public void geometric_missingInTarget() { IAtomContainer query = but2ene(); IAtomContainer target = but2ene(); query.addStereoElement(new DoubleBondStereochemistry(query.getBond(0), new IBond[]{query.getBond(1), query.getBond(2)}, IDoubleBondStereochemistry.Conformation.OPPOSITE)); assertFalse(new StereoMatch(query, target).apply(new int[]{0, 1, 2, 3})); }
@Test public void geometric_missingInQuery() { IAtomContainer query = but2ene(); IAtomContainer target = but2ene(); target.addStereoElement(new DoubleBondStereochemistry(target.getBond(0), new IBond[]{target.getBond(1), target.getBond(2)}, IDoubleBondStereochemistry.Conformation.TOGETHER)); assertTrue(new StereoMatch(query, target).apply(new int[]{0, 1, 2, 3})); }
@Test public void tetrahedral_missingInTarget() { IAtomContainer query = dimethylpropane(); IAtomContainer target = dimethylpropane(); query.addStereoElement(new TetrahedralChirality(query.getAtom(0), new IAtom[]{query.getAtom(1), query.getAtom(2), query.getAtom(3), query.getAtom(4)}, ITetrahedralChirality.Stereo.CLOCKWISE)); assertFalse(new StereoMatch(query, target).apply(new int[]{0, 1, 2, 3, 4})); }
@Test public void tetrahedral_missingInQuery() { IAtomContainer query = dimethylpropane(); IAtomContainer target = dimethylpropane(); target.addStereoElement(new TetrahedralChirality(target.getAtom(0), new IAtom[]{target.getAtom(1), target.getAtom(2), target.getAtom(3), target.getAtom(4)}, ITetrahedralChirality.Stereo.CLOCKWISE)); assertTrue(new StereoMatch(query, target).apply(new int[]{0, 1, 2, 3, 4})); }
@Test public void geometric_mismatch_together() { IAtomContainer query = but2ene(); IAtomContainer target = but2ene(); query.addStereoElement(new DoubleBondStereochemistry(query.getBond(0), new IBond[]{query.getBond(1), query.getBond(2)}, IDoubleBondStereochemistry.Conformation.TOGETHER)); target.addStereoElement(new DoubleBondStereochemistry(target.getBond(0), new IBond[]{target.getBond(1), target.getBond(2)}, IDoubleBondStereochemistry.Conformation.OPPOSITE)); assertFalse(new StereoMatch(query, target).apply(new int[]{0, 1, 2, 3})); }
@Test public void geometric_mismatch_opposite() { IAtomContainer query = but2ene(); IAtomContainer target = but2ene(); query.addStereoElement(new DoubleBondStereochemistry(query.getBond(0), new IBond[]{query.getBond(1), query.getBond(2)}, IDoubleBondStereochemistry.Conformation.OPPOSITE)); target.addStereoElement(new DoubleBondStereochemistry(target.getBond(0), new IBond[]{target.getBond(1), target.getBond(2)}, IDoubleBondStereochemistry.Conformation.TOGETHER)); assertFalse(new StereoMatch(query, target).apply(new int[]{0, 1, 2, 3})); }
@Test public void geometric_match_together() { IAtomContainer query = but2ene(); IAtomContainer target = but2ene(); query.addStereoElement(new DoubleBondStereochemistry(query.getBond(0), new IBond[]{query.getBond(1), query.getBond(2)}, IDoubleBondStereochemistry.Conformation.TOGETHER)); target.addStereoElement(new DoubleBondStereochemistry(target.getBond(0), new IBond[]{target.getBond(1), target.getBond(2)}, IDoubleBondStereochemistry.Conformation.TOGETHER)); assertTrue(new StereoMatch(query, target).apply(new int[]{0, 1, 2, 3})); }
@Test public void geometric_match_opposite() { IAtomContainer query = but2ene(); IAtomContainer target = but2ene(); query.addStereoElement(new DoubleBondStereochemistry(query.getBond(0), new IBond[]{query.getBond(1), query.getBond(2)}, IDoubleBondStereochemistry.Conformation.OPPOSITE)); target.addStereoElement(new DoubleBondStereochemistry(target.getBond(0), new IBond[]{target.getBond(1), target.getBond(2)}, IDoubleBondStereochemistry.Conformation.OPPOSITE)); assertTrue(new StereoMatch(query, target).apply(new int[]{0, 1, 2, 3})); }
@Test public void tetrahedral_match_swap() { IAtomContainer query = dimethylpropane(); IAtomContainer target = dimethylpropane(); query.addStereoElement(new TetrahedralChirality(query.getAtom(0), new IAtom[]{query.getAtom(1), query.getAtom(2), query.getAtom(3), query.getAtom(4)}, ITetrahedralChirality.Stereo.CLOCKWISE)); target.addStereoElement(new TetrahedralChirality(target.getAtom(0), new IAtom[]{target.getAtom(1), target.getAtom(2), target.getAtom(3), target.getAtom(4)}, ITetrahedralChirality.Stereo.ANTI_CLOCKWISE)); assertTrue(new StereoMatch(query, target).apply(new int[]{0, 1, 3, 2, 4})); }
@Test public void tetrahedral_match() { IAtomContainer query = dimethylpropane(); IAtomContainer target = dimethylpropane(); query.addStereoElement(new TetrahedralChirality(query.getAtom(0), new IAtom[]{query.getAtom(1), query.getAtom(2), query.getAtom(3), query.getAtom(4)}, ITetrahedralChirality.Stereo.CLOCKWISE)); target.addStereoElement(new TetrahedralChirality(target.getAtom(0), new IAtom[]{target.getAtom(1), target.getAtom(2), target.getAtom(3), target.getAtom(4)}, ITetrahedralChirality.Stereo.CLOCKWISE)); assertTrue(new StereoMatch(query, target).apply(new int[]{0, 1, 2, 3, 4})); }
@Test public void tetrahedral_mismatch() { IAtomContainer query = dimethylpropane(); IAtomContainer target = dimethylpropane(); query.addStereoElement(new TetrahedralChirality(query.getAtom(0), new IAtom[]{query.getAtom(1), query.getAtom(2), query.getAtom(3), query.getAtom(4)}, ITetrahedralChirality.Stereo.CLOCKWISE)); target.addStereoElement(new TetrahedralChirality(target.getAtom(0), new IAtom[]{target.getAtom(1), target.getAtom(2), target.getAtom(3), target.getAtom(4)}, ITetrahedralChirality.Stereo.ANTI_CLOCKWISE)); assertFalse(new StereoMatch(query, target).apply(new int[]{0, 1, 2, 3, 4})); }
@Test public void tetrahedral_mismatch_swap() { IAtomContainer query = dimethylpropane(); IAtomContainer target = dimethylpropane(); query.addStereoElement(new TetrahedralChirality(query.getAtom(0), new IAtom[]{query.getAtom(1), query.getAtom(2), query.getAtom(3), query.getAtom(4)}, ITetrahedralChirality.Stereo.CLOCKWISE)); target.addStereoElement(new TetrahedralChirality(target.getAtom(0), new IAtom[]{target.getAtom(1), target.getAtom(2), target.getAtom(3), target.getAtom(4)}, ITetrahedralChirality.Stereo.CLOCKWISE)); assertFalse(new StereoMatch(query, target).apply(new int[]{0, 1, 3, 2, 4})); }