1 /* 2 * Jalview - A Sequence Alignment Editor and Viewer (2.11.1.4) 3 * Copyright (C) 2021 The Jalview Authors 4 * 5 * This file is part of Jalview. 6 * 7 * Jalview is free software: you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation, either version 3 10 * of the License, or (at your option) any later version. 11 * 12 * Jalview is distributed in the hope that it will be useful, but 13 * WITHOUT ANY WARRANTY; without even the implied warranty 14 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 15 * PURPOSE. See the GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with Jalview. If not, see <http://www.gnu.org/licenses/>. 19 * The Jalview Authors are detailed in the 'AUTHORS' file. 20 */ 21 package jalview.io; 22 23 import jalview.datamodel.Alignment; 24 import jalview.datamodel.AlignmentI; 25 26 import java.io.PrintWriter; 27 import java.io.StringWriter; 28 import java.util.Enumeration; 29 import java.util.Hashtable; 30 31 /** 32 * Render associated attributes of an alignment. The heart of this code was 33 * refactored from jalview.gui.AlignFrame and jalview.appletgui.AlignFrame TODO: 34 * consider extending the html renderer to annotate elements with CSS ids 35 * enabling finer output format control. 36 * 37 */ 38 public class AlignmentProperties 39 { 40 AlignmentI alignment; 41 AlignmentProperties(AlignmentI alignment)42 public AlignmentProperties(AlignmentI alignment) 43 { 44 this.alignment = alignment; 45 } 46 47 /** 48 * render the alignment's properties report as text or an HTML fragment 49 * 50 * @param pw 51 * @param html 52 */ writeProperties(PrintWriter pw, boolean html)53 public void writeProperties(PrintWriter pw, boolean html) 54 { 55 final String nl = html ? "<br>" : System.getProperty("line.separator"); 56 float avg = 0; 57 int min = Integer.MAX_VALUE, max = 0; 58 for (int i = 0; i < alignment.getHeight(); i++) 59 { 60 int size = 1 + alignment.getSequenceAt(i).getEnd() 61 - alignment.getSequenceAt(i).getStart(); 62 avg += size; 63 if (size > max) 64 { 65 max = size; 66 } 67 if (size < min) 68 { 69 min = size; 70 } 71 } 72 avg = avg / alignment.getHeight(); 73 pw.print(nl); 74 pw.print("Sequences: " + alignment.getHeight()); 75 pw.print(nl); 76 pw.print("Minimum Sequence Length: " + min); 77 pw.print(nl); 78 pw.print("Maximum Sequence Length: " + max); 79 pw.print(nl); 80 pw.print("Average Length: " + (int) avg); 81 82 if (((Alignment) alignment).alignmentProperties != null) 83 { 84 pw.print(nl); 85 pw.print(nl); 86 if (html) 87 { 88 pw.print("<table border=\"1\">"); 89 } 90 Hashtable props = ((Alignment) alignment).alignmentProperties; 91 Enumeration en = props.keys(); 92 while (en.hasMoreElements()) 93 { 94 String key = en.nextElement().toString(); 95 String vals = props.get(key).toString(); 96 if (html) 97 { 98 // wrap the text in the table 99 StringBuffer val = new StringBuffer(); 100 int pos = 0, npos; 101 do 102 { 103 npos = vals.indexOf("\n", pos); 104 if (npos == -1) 105 { 106 val.append(vals.substring(pos)); 107 } 108 else 109 { 110 val.append(vals.substring(pos, npos)); 111 val.append("<br>"); 112 } 113 pos = npos + 1; 114 } while (npos != -1); 115 pw.print("<tr><td>" + key + "</td><td>" + val + "</td></tr>"); 116 } 117 else 118 { 119 pw.print(nl + key + "\t" + vals); 120 } 121 } 122 if (html) 123 { 124 pw.print("</table>"); 125 } 126 } 127 } 128 129 /** 130 * generate a report as plain text 131 * 132 * @return 133 */ formatAsString()134 public StringBuffer formatAsString() 135 { 136 return formatReport(false); 137 } 138 formatReport(boolean html)139 protected StringBuffer formatReport(boolean html) 140 { 141 StringWriter content = new StringWriter(); 142 writeProperties(new PrintWriter(content), html); 143 return content.getBuffer(); 144 } 145 146 /** 147 * generate a report as a fragment of html 148 * 149 * @return 150 */ formatAsHtml()151 public StringBuffer formatAsHtml() 152 { 153 return formatReport(true); 154 } 155 156 } 157