X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FConservation.java;h=6957b5cb0e3f6ba119dc7c08e18a1a866fe0008d;hb=e9aa1cee679000405c5549829ee08e1c08b2ffd5;hp=eb68cc450c671686f2c578021c94bbb2ff8d30da;hpb=c9fc6a5f7f6fc4ffb29830500dc5a61111e6a44f;p=jalview.git diff --git a/src/jalview/analysis/Conservation.java b/src/jalview/analysis/Conservation.java index eb68cc4..6957b5c 100755 --- a/src/jalview/analysis/Conservation.java +++ b/src/jalview/analysis/Conservation.java @@ -1,20 +1,19 @@ /* - * 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 + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, J Engelhardt, LM Lui, 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 file is part of Jalview. * - * 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. + * Jalview 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 3 of the License, or (at your option) any later version. * - * 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 + * Jalview 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 Jalview. If not, see . */ package jalview.analysis; @@ -73,23 +72,21 @@ public class Conservation * Creates a new Conservation object. * * @param name - * Name of conservation + * Name of conservation * @param propHash - * hash of properties for each symbol + * hash of properties for each symbol * @param threshold - * to count the residues in residueHash(). commonly used value - * is 3 + * to count the residues in residueHash(). commonly used value is 3 * @param sequences - * sequences to be used in calculation + * sequences to be used in calculation * @param start - * start residue position + * start residue position * @param end - * end residue position + * end residue position */ public Conservation(String name, Hashtable propHash, int threshold, - Vector sequences, int start, int end) + List sequences, int start, int end) { - this.name = name; this.propHash = propHash; this.threshold = threshold; @@ -102,15 +99,21 @@ public class Conservation int s, sSize = sequences.size(); SequenceI[] sarray = new SequenceI[sSize]; this.sequences = sarray; - + try { for (s = 0; s < sSize; s++) { - sarray[s] = (SequenceI) sequences.elementAt(s); + sarray[s] = (SequenceI) sequences.get(s); if (sarray[s].getLength() > maxLength) { maxLength = sarray[s].getLength(); } } + } catch (ArrayIndexOutOfBoundsException ex) + { + // bail - another thread has modified the sequence array, so the current calculation is probably invalid. + this.sequences=new SequenceI[0]; + maxLength=0; + } } /** @@ -273,7 +276,9 @@ public class Conservation } } - total[i - start] = resultHash; + if (total.length>0) { + total[i - start] = resultHash; + } } } @@ -332,10 +337,10 @@ public class Conservation * Calculates the conservation sequence * * @param consflag - * if true, poitiveve conservation; false calculates negative - * conservation + * if true, poitiveve conservation; false calculates negative + * conservation * @param percentageGaps - * commonly used value is 25 + * commonly used value is 25 */ public void verdict(boolean consflag, float percentageGaps) { @@ -489,9 +494,9 @@ public class Conservation * Calculates the quality of the set of sequences * * @param start - * Start residue + * Start residue * @param end - * End residue + * End residue */ public void findQuality(int start, int end) { @@ -594,13 +599,21 @@ public class Conservation } /** - * complete the given consensus and quuality annotation rows - * @param conservation conservation annotation row - * @param quality2 (optional - may be null) - * @param alWidth extent of consensus + * 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 alWidth) + AlignmentAnnotation quality2, int istart, int alWidth) { char[] sequence = getConsSequence().getSequence(); float minR; @@ -615,7 +628,7 @@ public class Conservation maxR = 1.0f - minR; maxG = 0.9f - minG; maxB = 0f - minB; // scalable range for colouring both Conservation and - // Quality + // Quality float min = 0f; float max = 11f; @@ -624,12 +637,20 @@ public class Conservation char c; - conservation.annotations = new Annotation[alWidth]; + if (conservation.annotations != null + && conservation.annotations.length < alWidth) + { + conservation.annotations = new Annotation[alWidth]; + } if (quality2 != null) { quality2.graphMax = qualityRange[1].floatValue(); - quality2.annotations = new Annotation[alWidth]; + if (quality2.annotations != null + && quality2.annotations.length < alWidth) + { + quality2.annotations = new Annotation[alWidth]; + } qmin = qualityRange[0].floatValue(); qmax = qualityRange[1].floatValue(); } @@ -663,14 +684,52 @@ public class Conservation // Quality calc if (quality2 != null) { - value = ((Double) quality.get(i)).floatValue(); + 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))); + quality2.annotations[i] = new Annotation(" ", + String.valueOf(value), ' ', value, new Color(minR + + (maxR * vprop), minG + (maxG * vprop), minB + + (maxB * vprop))); } } } + + /** + * construct and call the calculation methods on a new Conservation object + * @param name - name of conservation + * @param consHash - hash table of properties for each amino acid (normally ResidueProperties.propHash) + * @param threshold - minimum number of conserved residues needed to indicate conservation (typically 3) + * @param seqs + * @param start first column in calculation window + * @param end last column in calculation window + * @param posOrNeg positive (true) or negative (false) conservation + * @param consPercGaps percentage of gaps tolerated in column + * @param calcQuality flag indicating if alignment quality should be calculated + * @return Conservation object ready for use in visualization + */ + public static Conservation calculateConservation(String name, + Hashtable consHash, int threshold, List seqs, int start, int end, boolean posOrNeg, int consPercGaps, boolean calcQuality) + { + Conservation cons = new Conservation(name, consHash, threshold, seqs, start,end); + return calculateConservation(cons, posOrNeg, consPercGaps, calcQuality); + } + /** + * @param b positive (true) or negative (false) conservation + * @param consPercGaps percentage of gaps tolerated in column + * @param calcQuality flag indicating if alignment quality should be calculated + * @return Conservation object ready for use in visualization + */ + public static Conservation calculateConservation(Conservation cons, boolean b, int consPercGaps, boolean calcQuality) + { + cons.calculate(); + cons.verdict(b, consPercGaps); + + if (calcQuality) + { + cons.findQuality(); + } + + return cons; + } }