package compbio.data.sequence; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Set; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import compbio.util.annotation.Immutable; /** * A value class for AACon annotation results storage. The objects of this type * are immutable * * @author pvtroshin * */ @XmlAccessorType(XmlAccessType.FIELD) @Immutable public class Score { static final NumberFormat NUMBER_FORMAT = NumberFormat .getNumberInstance(Locale.UK); static { NUMBER_FORMAT.setGroupingUsed(false); NUMBER_FORMAT.setMaximumFractionDigits(3); } private ConservationMethod method; private List scores; private Score() { // JaXB default constructor } /** * Instantiate the Score * * @param method * the ConservationMethod with which {@code scores} were * calculated * @param scores * the actual conservation values for each column of the * alignment */ public Score(ConservationMethod method, List scores) { this.method = method; this.scores = new ArrayList(scores); } /** * Returns the ConservationMethod * * @return the ConservationMethod */ public ConservationMethod getMethod() { return method; } /** * The column scores for the alignment * * @return the column scores for the alignment */ public List getScores() { return scores; } @Override public String toString() { return "Score [method=" + method + ", scores=" + scores + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((method == null) ? 0 : method.hashCode()); result = prime * result + ((scores == null) ? 0 : scores.hashCode()); return result; } /* * TODO test ! (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Score other = (Score) obj; if (method != other.method) return false; if (scores == other.scores) { return true; } if (scores == null) { return false; } if (!Arrays.deepEquals(scores.toArray(), other.scores.toArray())) return false; return true; } /** * Outputs the List of Score objects into the Output stream. The output * format is as follows: * *
	 * {@code
	 * #MethodName 
	 * 	  
	 * For example:
	 * 	 
	 * #KABAT 0.2 0.3 0.2 0 0.645 0.333 1 1 0 0
	 * #SMERFS 0.645 0.333 1 1 0 0 0.2 0.3 0.2 0
	 * }
	 * 
* * The maximum precision for values is 3 digits, but can be less. * * @param scores * the list of scores to output * @param output * the stream to output the data to * @throws IOException * if the OutputStream cannot be written into * @throws NullPointerException * if the output stream is null */ public static void write(Set scores, OutputStream output) throws IOException { if (output == null) { throw new NullPointerException("OutputStream must be provided!"); } BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( output)); for (Score score : scores) { writer.write("#" + score.method + " "); for (Float scoreVal : score.getScores()) { writer.write(NUMBER_FORMAT.format(scoreVal) + " "); } writer.write("\n"); } writer.flush(); } }