/*
- * Jalview - A Sequence Alignment Editor and Viewer
- * Copyright (C) 2007 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
- *
+ * Jalview - A Sequence Alignment Editor and Viewer (Development Version 2.4.1)
+ * Copyright (C) 2009 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
- *
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
package jalview.analysis;
+import java.awt.Color;
import java.util.*;
import jalview.datamodel.*;
Hashtable[] total;
boolean canonicaliseAa = true; // if true then conservation calculation will
- // map all symbols to canonical aa numbering
- // rather than consider conservation of that
- // symbol
+
+ // map all symbols to canonical aa numbering
+ // rather than consider conservation of that
+ // symbol
/** Stores calculated quality values */
public Vector quality;
this.end = end;
maxLength = end - start + 1; // default width includes bounds of
- // calculation
+ // calculation
int s, sSize = sequences.size();
SequenceI[] sarray = new SequenceI[sSize];
}
/**
- * Translate sequence i into a numerical
- * representation and store it in the i'th position of the seqNums array.
+ * Translate sequence i into a numerical representation and store it in the
+ * i'th position of the seqNums array.
*
* @param i
*/
}
sqnum = new int[len + 1]; // better to always make a new array -
- // sequence can change its length
+ // sequence can change its length
sqnum[0] = sq.hashCode();
for (j = 1; j <= len; j++)
}
/*****************************************************************************
- * count conservation for the j'th column of the alignment
+ * count conservation for the j'th column of the alignment
+ *
* @return { gap count, conserved residue count}
*/
public int[] countConsNGaps(int j)
* maxj = -1;
*
* for (int j=0;j<24;j++) { if (cons2[i][j] > max) { max = cons2[i][j];
- * maxi = i; maxj = j; }
- * } }
+ * maxi = i; maxj = j; } } }
*/
}
}
qualityRange[0] = new Double(0);
qualityRange[1] = new Double(newmax);
}
+
+ /**
+ * complete the given consensus and quuality annotation rows.
+ * Note: currently this method will enlarge the given annotation row if it is too small, otherwise will leave its length unchanged.
+ * @param conservation conservation annotation row
+ * @param quality2 (optional - may be null)
+ * @param istart first column for conservation
+ * @param alWidth extent of conservation
+ */
+ public void completeAnnotations(AlignmentAnnotation conservation,
+ AlignmentAnnotation quality2, int istart, int alWidth)
+ {
+ char[] sequence = getConsSequence().getSequence();
+ float minR;
+ float minG;
+ float minB;
+ float maxR;
+ float maxG;
+ float maxB;
+ minR = 0.3f;
+ minG = 0.0f;
+ minB = 0f;
+ maxR = 1.0f - minR;
+ maxG = 0.9f - minG;
+ maxB = 0f - minB; // scalable range for colouring both Conservation and
+ // Quality
+
+ float min = 0f;
+ float max = 11f;
+ float qmin = 0f;
+ float qmax = 0f;
+
+ char c;
+
+ if (conservation.annotations !=null && conservation.annotations.length<alWidth)
+ { conservation.annotations = new Annotation[alWidth]; }
+
+
+ if (quality2 != null)
+ {
+ quality2.graphMax = qualityRange[1].floatValue();
+ if (quality2.annotations!=null && quality2.annotations.length<alWidth) {
+ quality2.annotations = new Annotation[alWidth];
+ }
+ qmin = qualityRange[0].floatValue();
+ qmax = qualityRange[1].floatValue();
+ }
+
+ for (int i = 0; i < alWidth; i++)
+ {
+ float value = 0;
+
+ c = sequence[i];
+
+ if (Character.isDigit(c))
+ {
+ value = (int) (c - '0');
+ }
+ else if (c == '*')
+ {
+ value = 11;
+ }
+ else if (c == '+')
+ {
+ value = 10;
+ }
+
+ float vprop = value - min;
+ vprop /= max;
+ conservation.annotations[i] = new Annotation(String.valueOf(c),
+ String.valueOf(value), ' ', value, new Color(minR
+ + (maxR * vprop), minG + (maxG * vprop), minB
+ + (maxB * vprop)));
+
+ // Quality calc
+ if (quality2 != null)
+ {
+ value = ((Double) quality.elementAt(i)).floatValue();
+ vprop = value - qmin;
+ vprop /= qmax;
+ quality2.annotations[i] = new Annotation(" ", String
+ .valueOf(value), ' ', value, new Color(minR
+ + (maxR * vprop), minG + (maxG * vprop), minB
+ + (maxB * vprop)));
+ }
+ }
+ }
}