}
/**
+ * Divide the given sequences based on the equivalence of characters at
+ * selected columns If exgroups is provided, existing groups will be
+ * subdivided.
+ *
+ * @param sequences
+ * @param columnSelection
+ * @param list
+ * @return
+ */
+ public static SequenceGroup[] makeGroupsFromCols(SequenceI[] sequences,
+ ColumnSelection cs, List<SequenceGroup> list)
+ {
+ // TODO: determine how to get/recover input data for group generation
+ Map<String, List<SequenceI>> gps = new HashMap<String, List<SequenceI>>();
+ Map<String, SequenceGroup> pgroup = new HashMap<String, SequenceGroup>();
+ if (list != null)
+ {
+ for (SequenceGroup sg : list)
+ {
+ for (SequenceI sq : sg.getSequences(null))
+ {
+ pgroup.put(sq.toString(), sg);
+ }
+ }
+ }
+ int[] spos = new int[cs.getSelected().size()];
+ int width = -1;
+ int i = 0;
+ for (Integer pos : cs.getSelected())
+ {
+ spos[i++] = pos.intValue();
+ }
+ ;
+ for (i = 0; i < sequences.length; i++)
+ {
+ int slen = sequences[i].getLength();
+ if (width < slen)
+ {
+ width = slen;
+ }
+
+ SequenceGroup pgp = pgroup.get(((Object) sequences[i]).toString());
+ StringBuilder schar = new StringBuilder();
+ if (pgp != null)
+ {
+ schar.append(pgp.getName() + ":");
+ }
+ for (int p : spos)
+ {
+ if (p >= slen)
+ {
+ schar.append("~");
+ }
+ else
+ {
+ schar.append(sequences[i].getCharAt(p));
+ }
+ }
+ List<SequenceI> svec = gps.get(schar.toString());
+ if (svec == null)
+ {
+ svec = new ArrayList<SequenceI>();
+ gps.put(schar.toString(), svec);
+ }
+ svec.add(sequences[i]);
+ }
+ // make some groups
+ SequenceGroup[] groups = new SequenceGroup[gps.size()];
+ i = 0;
+ for (String key : gps.keySet())
+ {
+ SequenceGroup group = new SequenceGroup(gps.get(key), "Subseq: "
+ + key, null, true, true, false, 0, width - 1);
+
+ groups[i++] = group;
+ }
+ gps.clear();
+ pgroup.clear();
+ return groups;
+ }
+
+ /**
* subdivide the given sequences based on the distribution of features
*
* @param featureLabels
--- /dev/null
+package jalview.analysis;
+
+import static org.junit.Assert.fail;
+import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentI;
+import jalview.datamodel.ColumnSelection;
+import jalview.datamodel.Sequence;
+import jalview.datamodel.SequenceGroup;
+import jalview.datamodel.SequenceI;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class GroupingTest
+{
+ Sequence s1 = new Sequence("s1", "AAAADDDDEEEE");
+
+ Sequence s2 = new Sequence("s2", "AAAADDDDEEEE");
+
+ Sequence s3 = new Sequence("s3", "ACAADDEDEEEE");
+
+ Sequence s4 = new Sequence("s4", "AAAADDEDEEEE");
+
+ Sequence s5 = new Sequence("s5", "AAAADDEDTTEE");
+
+ SequenceGroup sg1 = new SequenceGroup(Arrays.asList(new SequenceI[]
+ { s1, s2 }), "Group1", null, false, false, false, 0, 5);
+
+ SequenceGroup sg2 = new SequenceGroup(Arrays.asList(new SequenceI[]
+ { s3, s4, s5 }), "Group2", null, false, false, false, 0, 5);
+
+ AlignmentI alignment = new Alignment(new SequenceI[]
+ { s1, s2, s3, s4, s5 });
+
+ int[] positions = new int[]
+ { 1, 7, 9 };
+
+ @Test
+ public void testMakeGroupsWithBoth()
+ {
+ ArrayList<String> str = new ArrayList<String>();
+ for (SequenceI s : alignment.getSequences())
+ {
+ StringBuilder sb = new StringBuilder();
+ for (int p : positions)
+ {
+ sb.append(s.getCharAt(p));
+ }
+ str.add(sb.toString());
+ }
+ SequenceGroup[] seqgroupsString = Grouping.makeGroupsFrom(
+ alignment.getSequencesArray(),
+ str.toArray(new String[str.size()]),
+ Arrays.asList(new SequenceGroup[]
+ { sg1, sg2 }));
+ ColumnSelection cs = new ColumnSelection();
+ for (int p : positions)
+ {
+ cs.addElement(p);
+ }
+ SequenceGroup[] seqgroupsColSel = Grouping.makeGroupsFromCols(
+ alignment.getSequencesArray(), cs,
+ Arrays.asList(new SequenceGroup[]
+ { sg1, sg2 }));
+ Assert.assertEquals(seqgroupsString.length, seqgroupsColSel.length);
+ for (int p = 0; p < seqgroupsString.length; p++)
+ {
+ Assert.assertEquals(seqgroupsString[p].getName(),
+ seqgroupsColSel[p].getName());
+ Assert.assertArrayEquals(
+ seqgroupsString[p].getSequencesInOrder(alignment),
+ seqgroupsColSel[p].getSequencesInOrder(alignment));
+ if (seqgroupsString[p].getSequences().contains(s2))
+ {
+ Assert.assertTrue(seqgroupsString[p].getSize() == 2);
+ }
+ }
+ }
+
+ @Test
+ public void testMakeGroupsFromCols()
+ {
+ fail("Not yet implemented"); // TODO
+ }
+
+}