Skip to content

Commit 75c1e1e

Browse files
committed
Writing support.
1 parent 149ba57 commit 75c1e1e

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

storage/ctab/src/main/java/org/openscience/cdk/io/MDLV2000Writer.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,60 @@ private void writeSgroups(IAtomContainer container, BufferedWriter writer, Map<I
11191119
writer.write(formatMDLInt(compNumber, 3));
11201120
writer.write('\n');
11211121
break;
1122+
case Data:
1123+
String data = sgroup.getValue(SgroupKey.Data);
1124+
if (data == null)
1125+
break;
1126+
// replace CR/LF with space
1127+
data = data.replaceAll("[\r\n]", " ");
1128+
while (data.length() > 69) {
1129+
writer.write("M SCD ");
1130+
writer.write(formatMDLInt(id, 3));
1131+
writer.write(' ');
1132+
writer.write(data.substring(0, 69));
1133+
writer.write('\n');
1134+
data = data.substring(69);
1135+
}
1136+
writer.write("M SED ");
1137+
writer.write(formatMDLInt(id, 3));
1138+
writer.write(' ');
1139+
writer.write(data);
1140+
writer.write('\n');
1141+
break;
1142+
case DataFieldName:
1143+
char[] pad = new char[30];
1144+
Arrays.fill(pad, ' ');
1145+
String name = sgroup.getValue(SgroupKey.DataFieldName);
1146+
String fmt = sgroup.getValue(SgroupKey.DataFieldFormat);
1147+
String units = sgroup.getValue(SgroupKey.DataFieldUnits);
1148+
if (name == null)
1149+
break;
1150+
if (name.length() > 30)
1151+
name = name.substring(0, 30);
1152+
writer.write("M SDT ");
1153+
writer.write(formatMDLInt(id, 3));
1154+
writer.write(' ');
1155+
writer.write(name);
1156+
writer.write(pad, 0, 30-name.length());
1157+
if (fmt != null && fmt.length()>0 &&
1158+
(fmt.charAt(0) == 'N' ||
1159+
fmt.charAt(0) == 'F' ||
1160+
fmt.charAt(0) == 'T')) {
1161+
writer.write(fmt.charAt(0) + " ");
1162+
} else {
1163+
writer.write(" ");
1164+
}
1165+
if (units != null) {
1166+
if (units.length() > 20)
1167+
units = units.substring(0, 20);
1168+
writer.write(units);
1169+
}
1170+
writer.write('\n');
1171+
break;
1172+
case DataFieldFormat:
1173+
case DataFieldUnits:
1174+
// written as part of the field name
1175+
break;
11221176
}
11231177
}
11241178

storage/ctab/src/test/java/org/openscience/cdk/io/MDLV2000WriterTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424
package org.openscience.cdk.io;
2525

26+
import org.hamcrest.CoreMatchers;
2627
import org.junit.Assert;
2728
import org.junit.BeforeClass;
2829
import org.junit.Test;
@@ -1026,4 +1027,25 @@ public void roundTripWithAtomList() throws Exception {
10261027
assertThat(writtenMol, containsString("M ALS 1 3 F F N O"));
10271028
}
10281029
}
1030+
1031+
@Test
1032+
public void dataSgroupRoundTrip() {
1033+
String path = "/data/mdl/hbr_acoh_mix.mol";
1034+
try (InputStream in = getClass().getResourceAsStream(path)) {
1035+
MDLV2000Reader mdlr = new MDLV2000Reader(in);
1036+
IChemObjectBuilder builder = SilentChemObjectBuilder.getInstance();
1037+
IAtomContainer mol = mdlr.read(builder.newAtomContainer());
1038+
try (StringWriter sw = new StringWriter();
1039+
MDLV2000Writer writer = new MDLV2000Writer(sw)) {
1040+
writer.write(mol);
1041+
String output = sw.toString();
1042+
assertThat(output,
1043+
CoreMatchers.containsString("M SDT 3 WEIGHT_PERCENT N %"));
1044+
assertThat(output,
1045+
CoreMatchers.containsString("M SED 3 33%"));
1046+
}
1047+
} catch (IOException | CDKException e) {
1048+
Assert.fail(e.getMessage());
1049+
}
1050+
}
10291051
}

0 commit comments

Comments
 (0)