+ /**
+ * Returns the count of values that are set1 or set2 but not in both
+ *
+ * @param set1
+ * @param set2
+ * @return
+ */
+ protected int countUnsharedFeatureTypes(Set<String> set1, Set<String> set2)
+ {
+ int size1 = set1.size();
+ int size2 = set2.size();
+ Set<String> smallerSet = size1 < size2 ? set1 : set2;
+ Set<String> largerSet = (smallerSet == set1 ? set2 : set1);
+ int inCommon = 0;
+ for (String k : smallerSet)
+ {
+ if (largerSet.contains(k))
+ {
+ inCommon++;
+ }
+ }
+
+ int notInCommon = (size1 - inCommon) + (size2 - inCommon);
+ return notInCommon;
+ }
+
+ /**
+ * Builds and returns a list (one per SeqCigar) of visible feature types at
+ * the given column position
+ *
+ * @param seqs
+ * @param columnPosition
+ * @return
+ */
+ protected Map<SeqCigar, Set<String>> findFeatureTypesAtColumn(
+ SeqCigar[] seqs, int columnPosition)
+ {
+ Map<SeqCigar, Set<String>> sfap = new HashMap<SeqCigar, Set<String>>();
+ for (SeqCigar seq : seqs)
+ {
+ Set<String> types = new HashSet<String>();
+ int spos = seq.findPosition(columnPosition);
+ if (spos != -1)
+ {
+ List<SequenceFeature> sfs = fr.findFeaturesAtRes(seq.getRefSeq(),
+ spos);
+ for (SequenceFeature sf : sfs)
+ {
+ types.add(sf.getType());
+ }
+ }
+ sfap.put(seq, types);
+ }
+ return sfap;
+ }
+