isolated.length); Point2d[] points = coordinatesOfCycle(cycle, container); Turn[] turns = turns(points); WoundProjection projection = WoundProjection.ofTurns(turns); if (projection.projection == Projection.Haworth && !checkHaworthAlignment(points)) continue; final Point2d horizontalXy = horizontalOffset(points, turns, projection.projection); int[] below = cycle.clone(); if (!assignSubstituents(cycle, above, below, projection, horizontalXy)) continue; elements.addAll(newTetrahedralCenters(cycle, above, below, projection));
int offset = chairCenterOffset(turns); int prev = (offset + 5) % 6; int next = (offset + 7) % 6;
/** * Determine the turns in the polygon formed of the provided coordinates. * * @param points polygon points * @return array of turns (left, right) or null if a parallel line was found */ static Turn[] turns(Point2d[] points) { final Turn[] turns = new Turn[points.length]; // cycle of size 6 is [1,2,3,4,5,6] not closed for (int i = 1; i <= points.length; i++) { Point2d prevXy = points[i - 1]; Point2d currXy = points[i % points.length]; Point2d nextXy = points[(i + 1) % points.length]; int parity = (int) Math.signum(det(prevXy.x, prevXy.y, currXy.x, currXy.y, nextXy.x, nextXy.y)); if (parity == 0) return null; turns[i % points.length] = parity < 0 ? Right : Turn.Left; } return turns; }
CyclicCarbohydrateRecognition cycleRecon = new CyclicCarbohydrateRecognition(container, graph, bondMap, centers); elements.addAll(cycleRecon.recognise(projections));
@Test public void boatClockwise() throws Exception { Assert.assertThat(CyclicCarbohydrateRecognition.turns(new Point2d[]{ new Point2d(3.8, 4.8), new Point2d(3.1, 4.2), new Point2d(2.3, 4.2), new Point2d(1.6, 4.9), new Point2d(2.1, 3.8), new Point2d(3.3, 3.8) }), is(new Turn[]{Left, Right, Right, Left, Left, Left})); }
Stereocenters stereocenters = new Stereocenters(m, graph, bondMap); stereocenters.checkSymmetry(); CyclicCarbohydrateRecognition recon = new CyclicCarbohydrateRecognition(m, graph, bondMap, stereocenters); List<IStereoElement> elements = recon.recognise(Collections.singleton(Projection.Haworth)); assertTrue(elements.isEmpty());
@Test public void haworthClockwise() throws Exception { Assert.assertThat(CyclicCarbohydrateRecognition.turns(new Point2d[]{ new Point2d(4.1, 3.0), new Point2d(4.8, 2.6), new Point2d(4.8, 1.8), new Point2d(4.1, 1.4), new Point2d(3.3, 1.8), new Point2d(3.3, 2.6) }), is(new Turn[]{Right, Right, Right, Right, Right, Right})); }
Stereocenters stereocenters = new Stereocenters(m, graph, bondMap); stereocenters.checkSymmetry(); CyclicCarbohydrateRecognition recon = new CyclicCarbohydrateRecognition(m, graph, bondMap, stereocenters); List<IStereoElement> elements = recon.recognise(Collections.singleton(Projection.Haworth)); assertTrue(elements.isEmpty());
@Test public void chairClockwise() throws Exception { Assert.assertThat(CyclicCarbohydrateRecognition.turns(new Point2d[]{ new Point2d(1.7, 2.4), new Point2d(1.3, 3.1), new Point2d(0.5, 2.9), new Point2d(0.2, 3.1), new Point2d(0.1, 2.4), new Point2d(0.9, 2.6) }), is(new Turn[]{Left, Left, Right, Left, Left, Right})); }
Stereocenters stereocenters = new Stereocenters(m, graph, bondMap); stereocenters.checkSymmetry(); CyclicCarbohydrateRecognition recon = new CyclicCarbohydrateRecognition(m, graph, bondMap, stereocenters); List<IStereoElement> elements = recon.recognise(Collections.singleton(Projection.Chair)); m.setStereoElements(elements);
@Test public void haworthAnticlockwise() throws Exception { Assert.assertThat(CyclicCarbohydrateRecognition.turns(new Point2d[]{ new Point2d(4.1, 3.0), new Point2d(3.3, 2.6), new Point2d(3.3, 1.8), new Point2d(4.1, 1.4), new Point2d(4.8, 1.8), new Point2d(4.8, 2.6), }), is(new Turn[]{Left, Left, Left, Left, Left, Left})); }
CyclicCarbohydrateRecognition recon = new CyclicCarbohydrateRecognition(m, graph, bondMap, stereocenters); assertTrue(recon.recognise(Collections.singleton(Projection.Haworth)).isEmpty());
@Test public void chairAnticlockwise() throws Exception { Assert.assertThat(CyclicCarbohydrateRecognition.turns(new Point2d[]{ new Point2d(0.9, 2.6), new Point2d(0.1, 2.4), new Point2d(0.2, 3.1), new Point2d(0.5, 2.9), new Point2d(1.3, 3.1), new Point2d(1.7, 2.4) }), is(new Turn[]{Left, Right, Right, Left, Right, Right})); }
Stereocenters stereocenters = new Stereocenters(m, graph, bondMap); stereocenters.checkSymmetry(); CyclicCarbohydrateRecognition recon = new CyclicCarbohydrateRecognition(m, graph, bondMap, stereocenters); List<IStereoElement> elements = recon.recognise(Collections.singleton(Projection.Chair)); assertTetrahedralCenter(elements.get(0), m.getAtom(1),
@Test public void boatAnticlockwise() throws Exception { Assert.assertThat(CyclicCarbohydrateRecognition.turns(new Point2d[]{ new Point2d(3.3, 3.8), new Point2d(2.1, 3.8), new Point2d(1.6, 4.9), new Point2d(2.3, 4.2), new Point2d(3.1, 4.2), new Point2d(3.8, 4.8) }), is(new Turn[]{Right, Right, Right, Left, Left, Right})); }
Stereocenters stereocenters = new Stereocenters(m, graph, bondMap); stereocenters.checkSymmetry(); CyclicCarbohydrateRecognition recon = new CyclicCarbohydrateRecognition(m, graph, bondMap, stereocenters); List<IStereoElement> elements = recon.recognise(Collections.singleton(Projection.Haworth)); assertTetrahedralCenter(elements.get(0), m.getAtom(1),
CyclicCarbohydrateRecognition recon = new CyclicCarbohydrateRecognition(m, graph, bondMap, stereocenters); List<IStereoElement> elements = recon.recognise(Collections.singleton(Projection.Haworth)); assertTetrahedralCenter(elements.get(0), m.getAtom(1),
CyclicCarbohydrateRecognition recon = new CyclicCarbohydrateRecognition(m, graph, bondMap, stereocenters); List<IStereoElement> elements = recon.recognise(Collections.singleton(Projection.Haworth)); assertTetrahedralCenter(elements.get(0), m.getAtom(2),
CyclicCarbohydrateRecognition recon = new CyclicCarbohydrateRecognition(m, graph, bondMap, stereocenters); List<IStereoElement> elements = recon.recognise(Collections.singleton(Projection.Haworth)); assertTetrahedralCenter(elements.get(0), m.getAtom(1),