2 * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3 * Copyright (C) $$Year-Rel$$ The Jalview Authors
5 * This file is part of Jalview.
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.
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.
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.
23 import jalview.api.AlignExportSettingI;
24 import jalview.api.AlignmentViewPanel;
25 import jalview.bin.Cache;
26 import jalview.datamodel.Alignment;
27 import jalview.datamodel.AlignmentAnnotation;
28 import jalview.datamodel.AlignmentI;
29 import jalview.datamodel.HiddenColumns;
30 import jalview.datamodel.Sequence;
31 import jalview.datamodel.SequenceGroup;
32 import jalview.datamodel.SequenceI;
33 import jalview.util.Comparison;
35 import java.io.IOException;
38 * Additional formatting methods used by the application in a number of places.
43 public class FormatAdapter extends AppletFormatAdapter
45 public FormatAdapter(AlignmentViewPanel viewpanel)
51 public FormatAdapter()
57 public FormatAdapter(AlignmentViewPanel alignPanel,
58 AlignExportSettingI settings)
60 super(alignPanel, settings);
65 if (jalview.bin.Cache.getDefault("STRUCT_FROM_PDB", true))
67 annotFromStructure = jalview.bin.Cache.getDefault("ADD_TEMPFACT_ANN",
69 localSecondaryStruct = jalview.bin.Cache.getDefault("ADD_SS_ANN",
71 serviceSecondaryStruct = jalview.bin.Cache.getDefault("USE_RNAVIEW",
76 // disable all PDB annotation options
77 annotFromStructure = false;
78 localSecondaryStruct = false;
79 serviceSecondaryStruct = false;
83 public String formatSequences(FileFormatI format, SequenceI[] seqs,
84 String[] omitHiddenColumns, int[] exportRange)
87 return formatSequences(format,
88 replaceStrings(seqs, omitHiddenColumns, exportRange));
92 * create sequences with each sequence string replaced with the one given in
96 * @param omitHiddenColumns
97 * @return new sequences
99 public SequenceI[] replaceStrings(SequenceI[] seqs,
100 String[] omitHiddenColumns, int[] startEnd)
102 if (omitHiddenColumns != null)
104 SequenceI[] tmp = new SequenceI[seqs.length];
110 for (int i = 0; i < seqs.length; i++)
112 startRes = seqs[i].getStart();
113 endRes = seqs[i].getEnd();
114 if (startEnd != null)
116 startIndex = startEnd[0];
117 endIndex = startEnd[1];
118 // get first non-gaped residue start position
119 while (Comparison.isGap(seqs[i].getCharAt(startIndex))
120 && startIndex < endIndex)
125 // get last non-gaped residue end position
126 while (Comparison.isGap(seqs[i].getCharAt(endIndex))
127 && endIndex > startIndex)
132 startRes = seqs[i].findPosition(startIndex);
133 endRes = seqs[i].findPosition(endIndex);
136 tmp[i] = new Sequence(seqs[i].getName(), omitHiddenColumns[i],
138 tmp[i].setDescription(seqs[i].getDescription());
146 * Format a vector of sequences as a flat alignment file. TODO: allow caller
147 * to detect errors and warnings encountered when generating output
152 * vector of sequences to write
154 * @return String containing sequences in desired format
156 public String formatSequences(FileFormatI format, SequenceI[] seqs)
158 boolean withSuffix = getCacheSuffixDefault(format);
159 return format.getWriter(null).print(seqs, withSuffix);
162 public boolean getCacheSuffixDefault(FileFormatI format)
164 return Cache.getDefault(format.getName().toUpperCase() + "_JVSUFFIX",
168 public String formatSequences(FileFormatI format, AlignmentI alignment,
169 String[] omitHidden, int[] exportRange, HiddenColumns hidden)
171 return formatSequences(format, alignment, omitHidden, exportRange,
172 getCacheSuffixDefault(format), hidden, null);
176 * hack function to replace sequences with visible sequence strings before
177 * generating a string of the alignment in the given format.
182 * sequence strings to write out in order of sequences in alignment
184 * defines hidden columns that are edited out of annotation
185 * @return string representation of the alignment formatted as format
187 public String formatSequences(FileFormatI format, AlignmentI alignment,
188 String[] omitHidden, int[] exportRange, boolean suffix,
189 HiddenColumns hidden)
191 return formatSequences(format, alignment, omitHidden, exportRange,
192 suffix, hidden, null);
195 public String formatSequences(FileFormatI format, AlignmentI alignment,
196 String[] omitHidden, int[] exportRange, boolean suffix,
197 HiddenColumns hidden, SequenceGroup selgp)
199 if (omitHidden != null)
201 // TODO consider using AlignmentView to prune to visible region
202 // TODO prune sequence annotation and groups to visible region
203 // TODO: JAL-1486 - set start and end for output correctly. basically,
204 // AlignmentView.getVisibleContigs does this.
205 Alignment alv = new Alignment(replaceStrings(
206 alignment.getSequencesArray(), omitHidden, exportRange));
207 AlignmentAnnotation[] ala = alignment.getAlignmentAnnotation();
210 for (int i = 0; i < ala.length; i++)
212 AlignmentAnnotation na = new AlignmentAnnotation(ala[i]);
215 na.makeVisibleAnnotation(selgp.getStartRes(), selgp.getEndRes(),
220 na.makeVisibleAnnotation(hidden);
222 alv.addAnnotation(na);
225 return this.formatSequences(format, alv, suffix);
227 return this.formatSequences(format, alignment, suffix);
231 public AlignmentI readFile(String file, DataSourceType sourceType,
232 FileFormatI fileFormat) throws IOException
234 AlignmentI al = super.readFile(file, sourceType, fileFormat);
239 public AlignmentI readFromFile(FileParse source, FileFormatI format)
242 AlignmentI al = super.readFromFile(source, format);
247 * Create a flat file representation of a given view or selected region of a
252 * alignment panel originating the view
253 * @return String containing flat file
255 public String formatSequences(FileFormatI format, AlignmentViewPanel ap,
256 boolean selectedOnly)
258 return formatSequences(format, getCacheSuffixDefault(format), ap,
262 public AlignmentI readFromFile(AlignmentFileReaderI source,
263 FileFormatI format) throws IOException
265 FileParse fp = new FileParse(source.getInFile(),
266 source.getDataSourceType());
267 return readFromFile(fp, format);