diff --git a/storage/smiles/src/main/java/org/openscience/cdk/smiles/CxSmilesGenerator.java b/storage/smiles/src/main/java/org/openscience/cdk/smiles/CxSmilesGenerator.java index e1893d6705c..775025f0313 100644 --- a/storage/smiles/src/main/java/org/openscience/cdk/smiles/CxSmilesGenerator.java +++ b/storage/smiles/src/main/java/org/openscience/cdk/smiles/CxSmilesGenerator.java @@ -161,6 +161,27 @@ public int compare(List a, List b) { sb.append('$'); } + // Atom Values + if (SmiFlavour.isSet(opts, SmiFlavour.CxAtomValue) && + state.atomValues != null && !state.atomValues.isEmpty()) { + + if (sb.length() > 2) + sb.append(','); + sb.append("$_AV:"); + int nonempty_cnt = 0; + for (int idx : invorder) { + String label = state.atomValues.get(idx); + if (label == null || label.isEmpty()) label = ""; + else nonempty_cnt++; + sb.append(encode_alias(label)); + // don't need to write anymore more ';' + if (nonempty_cnt == state.atomValues.size()) + break; + sb.append(";"); + } + sb.append('$'); + } + // 2D/3D Coordinates if (SmiFlavour.isSet(opts, SmiFlavour.CxCoordinates) && state.atomCoords != null && !state.atomCoords.isEmpty()) { diff --git a/storage/smiles/src/test/java/org/openscience/cdk/smiles/CxSmilesTest.java b/storage/smiles/src/test/java/org/openscience/cdk/smiles/CxSmilesTest.java index 9647ed3b7f7..fe04ecdd9de 100644 --- a/storage/smiles/src/test/java/org/openscience/cdk/smiles/CxSmilesTest.java +++ b/storage/smiles/src/test/java/org/openscience/cdk/smiles/CxSmilesTest.java @@ -370,4 +370,12 @@ public void atomValues() throws InvalidSmilesException { is(smigen.create(rxn2))); } + @Test public void canonAtomLabels() throws CDKException { + IChemObjectBuilder bldr = SilentChemObjectBuilder.getInstance(); + SmilesParser smipar = new SmilesParser(bldr); + IAtomContainer mol = smipar.parseSmiles("c1ccccc1O |$_AV:0;1;2;3;4;5;6$|"); + SmilesGenerator smigen = new SmilesGenerator(SmiFlavour.Canonical | SmiFlavour.CxAtomValue); + assertThat(smigen.create(mol), is("OC=1C=CC=CC1 |$_AV:6;5;0;1;2;3;4$|")); + } + }