+
+ /**
+ * compute the PID vector used by the redundancy filter.
+ *
+ * @param originalSequences
+ * - sequences in alignment that are to filtered
+ * @param omitHidden
+ * - null or strings to be analysed (typically, visible portion of
+ * each sequence in alignment)
+ * @param start
+ * - first column in window for calculation
+ * @param end
+ * - last column in window for calculation
+ * @param ungapped
+ * - if true then use ungapped sequence to compute PID
+ * @return vector containing maximum PID for i-th sequence and any sequences
+ * longer than that seuqence
+ */
+ public static float[] computeRedundancyMatrix(
+ SequenceI[] originalSequences, String[] omitHidden, int start,
+ int end, boolean ungapped)
+ {
+ int height = originalSequences.length;
+ float[] redundancy = new float[height];
+ int[] lngth = new int[height];
+ for (int i = 0; i < height; i++)
+ {
+ redundancy[i] = 0f;
+ lngth[i] = -1;
+ }
+
+ // long start = System.currentTimeMillis();
+
+ float pid;
+ String seqi, seqj;
+ for (int i = 0; i < height; i++)
+ {
+
+ for (int j = 0; j < i; j++)
+ {
+ if (i == j)
+ {
+ continue;
+ }
+
+ if (omitHidden == null)
+ {
+ seqi = originalSequences[i].getSequenceAsString(start, end);
+ seqj = originalSequences[j].getSequenceAsString(start, end);
+ }
+ else
+ {
+ seqi = omitHidden[i];
+ seqj = omitHidden[j];
+ }
+ if (lngth[i] == -1)
+ {
+ String ug = AlignSeq.extractGaps(Comparison.GapChars, seqi);
+ lngth[i] = ug.length();
+ if (ungapped)
+ {
+ seqi = ug;
+ }
+ }
+ if (lngth[j] == -1)
+ {
+ String ug = AlignSeq.extractGaps(Comparison.GapChars, seqj);
+ lngth[j] = ug.length();
+ if (ungapped)
+ {
+ seqj = ug;
+ }
+ }
+ pid = Comparison.PID(seqi, seqj);
+
+ // use real sequence length rather than string length
+ if (lngth[j] < lngth[i])
+ {
+ redundancy[j] = Math.max(pid, redundancy[j]);
+ }
+ else
+ {
+ redundancy[i] = Math.max(pid, redundancy[i]);
+ }
+
+ }
+ }
+ return redundancy;
+ }