6666import java .nio .charset .StandardCharsets ;
6767import java .text .NumberFormat ;
6868import 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 ;
7081import java .util .regex .Matcher ;
7182import java .util .regex .Pattern ;
7283import 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 ) {
0 commit comments