Skip to content

Commit 9cad0c5

Browse files
committed
Critical patch: SMARTS ring closures must use '%' for rnum >= 10.
1 parent f3054ed commit 9cad0c5

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

tool/smarts/src/main/java/org/openscience/cdk/smarts/Smarts.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3116,6 +3116,8 @@ private void writePart(StringBuilder sb, IAtom atom, IBond prev) {
31163116
if (isRingClose(bond)) {
31173117
Integer rnum = rnums.get(bond);
31183118
sb.append(generate(bond.getOther(atom), ((QueryBond) BondRef.deref(bond))));
3119+
if (rnum >= 10)
3120+
sb.append('%');
31193121
sb.append(rnum);
31203122
rvisit[rnum] = false;
31213123
rnums.remove(bond);
@@ -3124,6 +3126,8 @@ private void writePart(StringBuilder sb, IAtom atom, IBond prev) {
31243126
// ring open
31253127
else if (isRingOpen(bond)) {
31263128
int rnum = nextRingNum();
3129+
if (rnum >= 10)
3130+
sb.append('%');
31273131
sb.append(rnum);
31283132
rnums.put(bond, rnum);
31293133
rbonds.remove(bond);

tool/smarts/src/test/java/org/openscience/cdk/smarts/SmartsExprWriteTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,4 +487,11 @@ private static void swap(Object[] a, int i, int j) {
487487
Smarts.parse(mol, "O1.[S@]=1(C)CC");
488488
assertThat(Smarts.generate(mol), is("O=[S@@](C)CC"));
489489
}
490+
491+
@Test public void ringClosures() {
492+
String sma = "C12=C3C4=C5C1=C1C6=C7C2=C2C8=C3C3=C9C4=C4C%10=C5C5=C1C1=C6C6=C%11C7=C2C2=C7C8=C3C3=C8C9=C4C4=C9C%10=C5C5=C1C1=C6C6=C%11C2=C2C7=C3C3=C8C4=C4C9=C5C1=C1C6=C2C3=C41";
493+
QueryAtomContainer mol = new QueryAtomContainer(null);
494+
Smarts.parse(mol, sma);
495+
assertThat(Smarts.generate(mol), is("C12C3C4=C5C=2C2=C6C7=C1C1=C8C=3C3=C9C4=C4C%10=C5C5=C2C2=C6C6=C%11C7=C1C1=C7C8=C3C3=C8C9=C4C4=C9C%10=C5C5=C2C2=C6C6=C%11C1=C1C7=C3C3C8=C4C4=C9C5=C2C2C6=C1C=3C4=2"));
496+
}
490497
}

0 commit comments

Comments
 (0)