Skip to content

Commit 907c2bd

Browse files
committed
More compact writing Sgroup hierarchy/nesting info. We can compact things but collecting up all the parents and then writing them all at once.
1 parent 75c1e1e commit 907c2bd

File tree

2 files changed

+35
-15
lines changed

2 files changed

+35
-15
lines changed

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

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,18 @@
6666
import java.nio.charset.StandardCharsets;
6767
import java.text.NumberFormat;
6868
import java.text.SimpleDateFormat;
69-
import java.util.*;
69+
import java.util.AbstractMap;
70+
import java.util.ArrayList;
71+
import java.util.Arrays;
72+
import java.util.Collection;
73+
import java.util.HashMap;
74+
import java.util.Iterator;
75+
import java.util.LinkedHashMap;
76+
import java.util.List;
77+
import java.util.Locale;
78+
import java.util.Map;
79+
import java.util.Set;
80+
import java.util.TreeMap;
7081
import java.util.regex.Matcher;
7182
import java.util.regex.Pattern;
7283
import java.util.stream.Collectors;
@@ -978,9 +989,18 @@ private void writeSgroups(IAtomContainer container, BufferedWriter writer, Map<I
978989
// going to modify
979990
sgroups = new ArrayList<>(sgroups);
980991

992+
981993
// remove non-ctab Sgroups
982994
sgroups.removeIf(sgroup -> !sgroup.getType().isCtabStandard());
983995

996+
List<Map.Entry<Sgroup,Sgroup>> parentList = new ArrayList<>();
997+
998+
// collect parents
999+
for (Sgroup sgroup : sgroups) {
1000+
for (Sgroup parent : sgroup.getParents())
1001+
parentList.add(new AbstractMap.SimpleEntry<>(sgroup, parent));
1002+
}
1003+
9841004
for (List<Sgroup> wrapSgroups : wrap(sgroups, 8)) {
9851005
// Declare the SGroup type
9861006
writer.write("M STY");
@@ -994,6 +1014,19 @@ private void writeSgroups(IAtomContainer container, BufferedWriter writer, Map<I
9941014
writer.write('\n');
9951015
}
9961016

1017+
// Sgroup Parent List
1018+
for (List<Map.Entry<Sgroup,Sgroup>> parents : wrap(parentList, 8)) {
1019+
writer.write("M SPL");
1020+
writer.write(formatMDLInt(parents.size(), 3));
1021+
for (Map.Entry<Sgroup,Sgroup> e : parents) {
1022+
writer.write(' ');
1023+
writer.write(formatMDLInt(1+sgroups.indexOf(e.getKey()), 3));
1024+
writer.write(' ');
1025+
writer.write(formatMDLInt(1+sgroups.indexOf(e.getValue()), 3));
1026+
}
1027+
writer.write('\n');
1028+
}
1029+
9971030
// Sgroup output is non-compact for now - but valid
9981031
for (int id = 1; id <= sgroups.size(); id++) {
9991032
Sgroup sgroup = sgroups.get(id - 1);
@@ -1022,19 +1055,6 @@ private void writeSgroups(IAtomContainer container, BufferedWriter writer, Map<I
10221055
writer.write('\n');
10231056
}
10241057

1025-
// Sgroup Parent List
1026-
for (List<Sgroup> parents : wrap(sgroup.getParents(), 8)) {
1027-
writer.write("M SPL");
1028-
writer.write(formatMDLInt(parents.size(), 3));
1029-
for (Sgroup parent : parents) {
1030-
writer.write(' ');
1031-
writer.write(formatMDLInt(id, 3));
1032-
writer.write(' ');
1033-
writer.write(formatMDLInt(1 + sgroups.indexOf(parent), 3));
1034-
}
1035-
writer.write('\n');
1036-
}
1037-
10381058
Set<SgroupKey> attributeKeys = sgroup.getAttributeKeys();
10391059
// TODO order and aggregate attribute keys
10401060
for (SgroupKey key : attributeKeys) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,7 @@ public void sgroupUnorderedMixtureRoundTrip() throws Exception {
719719
mdlw.write(mdlr.read(new AtomContainer()));
720720
String output = sw.toString();
721721
assertThat(output, containsString("M STY 3 1 COM 2 COM 3 MIX"));
722-
assertThat(output, containsString("M SPL 1 1 3"));
722+
assertThat(output, containsString("M SPL 2 1 3 2 3"));
723723
}
724724
}
725725

0 commit comments

Comments
 (0)