/** * Create a predicate to match components for the provided query and target. * The target is converted to an adjacency list ({@link * GraphUtil#toAdjList(IAtomContainer)}) and the query components extracted * from the property {@link #KEY} in the query. * * @param query query structure * @param target target structure */ public ComponentFilter(IAtomContainer query, IAtomContainer target) { this(query.getProperty(KEY) == null ? determineComponents(query, false) : query.getProperty(KEY, int[].class), determineComponents(target, true)); }
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 ungrouped() { assertTrue(create(null, oxidanone()).apply(new int[]{0, 1})); assertTrue(create(null, oxidanone()).apply(new int[]{1, 0})); assertTrue(create(null, ethyleneGlycol()).apply(new int[]{0, 3})); assertTrue(create(null, ethyleneGlycol()).apply(new int[]{3, 0})); assertTrue(create(null, ethylAlcoholHydrate()).apply(new int[]{0, 3})); assertTrue(create(null, ethylAlcoholHydrate()).apply(new int[]{3, 0})); }
static ComponentFilter create(int[] grouping, IAtomContainer container) { return new ComponentFilter(grouping, new ConnectedComponents(GraphUtil.toAdjList(container)).components()); }
@Test public void grouped() { int[] grouping = {1, 1, 1}; assertTrue(create(grouping, oxidanone()).apply(new int[]{0, 1})); assertTrue(create(grouping, oxidanone()).apply(new int[]{1, 0})); assertTrue(create(grouping, ethyleneGlycol()).apply(new int[]{0, 3})); assertTrue(create(grouping, ethyleneGlycol()).apply(new int[]{3, 0})); assertFalse(create(grouping, ethylAlcoholHydrate()).apply(new int[]{0, 3})); assertFalse(create(grouping, ethylAlcoholHydrate()).apply(new int[]{3, 0})); }
@Test public void multipleGroups() { int[] grouping = {1, 2, 2}; assertFalse(create(grouping, oxidanone()).apply(new int[]{0, 1})); assertFalse(create(grouping, oxidanone()).apply(new int[]{1, 0})); assertFalse(create(grouping, ethyleneGlycol()).apply(new int[]{0, 3})); assertFalse(create(grouping, ethyleneGlycol()).apply(new int[]{3, 0})); assertTrue(create(grouping, ethylAlcoholHydrate()).apply(new int[]{0, 3})); assertTrue(create(grouping, ethylAlcoholHydrate()).apply(new int[]{3, 0})); }