2 // FORESTER -- software libraries and applications
3 // for evolutionary biology research and applications.
5 // Copyright (C) 2008-2009 Christian M. Zmasek
6 // Copyright (C) 2008-2009 Burnham Institute for Medical Research
7 // Copyright (C) 2000-2001 Washington University School of Medicine
8 // and Howard Hughes Medical Institute
9 // Copyright (C) 2003-2007 Ethalinda K.S. Cannon
10 // All rights reserved
12 // This library is free software; you can redistribute it and/or
13 // modify it under the terms of the GNU Lesser General Public
14 // License as published by the Free Software Foundation; either
15 // version 2.1 of the License, or (at your option) any later version.
17 // This library is distributed in the hope that it will be useful,
18 // but WITHOUT ANY WARRANTY; without even the implied warranty of
19 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 // Lesser General Public License for more details.
22 // You should have received a copy of the GNU Lesser General Public
23 // License along with this library; if not, write to the Free Software
24 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
26 // Contact: phylosoft @ gmail . com
27 // WWW: https://sites.google.com/site/cmzmasek/home/software/forester
29 package org.forester.archaeopteryx;
31 import java.awt.Color;
32 import java.io.BufferedReader;
34 import java.io.FileReader;
35 import java.io.IOException;
36 import java.io.InputStream;
37 import java.io.InputStreamReader;
39 import java.util.Arrays;
40 import java.util.Hashtable;
42 import java.util.SortedMap;
43 import java.util.StringTokenizer;
44 import java.util.TreeMap;
46 import org.forester.archaeopteryx.Options.CLADOGRAM_TYPE;
47 import org.forester.archaeopteryx.Options.NODE_LABEL_DIRECTION;
48 import org.forester.archaeopteryx.Options.OVERVIEW_PLACEMENT_TYPE;
49 import org.forester.archaeopteryx.Options.PHYLOGENY_GRAPHICS_TYPE;
50 import org.forester.io.parsers.nhx.NHXParser.TAXONOMY_EXTRACTION;
51 import org.forester.phylogeny.data.NodeDataField;
52 import org.forester.phylogeny.data.NodeVisualData;
53 import org.forester.phylogeny.data.NodeVisualData.NodeFill;
54 import org.forester.phylogeny.data.NodeVisualData.NodeShape;
55 import org.forester.util.ForesterUtil;
57 public final class Configuration {
59 public enum EXT_NODE_DATA_RETURN_ON {
60 BUFFER_ONLY, CONSOLE, WINODW;
64 CROSSPLATFORM, NATIVE, NIMBUS, UNKNOWN
70 final static String clickto_options[][] = {
71 { "Display Node Data", "display" }, { "Collapse/Uncollapse", "display" }, { "Root/Reroot", "display" },
72 { "Go to Sub/Supertree", "display" }, { "Swap Descendants", "display" },
73 { "Colorize Node(s)", "display" }, { "Change Node Font(s)", "display" },
74 { "Colorize Subtree(s)", "display" }, { "Open Sequence DB", "display" }, { "Open PDB", "display" },
75 { "Open Taxonomy DB", "display" }, { "Launch BLAST", "display" }, { "Cut Subtree", "display" },
76 { "Copy Subtree", "display" }, { "Paste Subtree", "display" }, { "Delete Subtree/Node", "display" },
77 { "Add New Node", "display" }, { "Edit Node Data", "display" }, { "Sort Descendants", "display" },
78 { "List Node Data", "display" }, { "Select Node(s)", "display" } , { "Uncollapse All", "display" }, { "Order Subtree", "display" }, };
79 private final static String DEFAULT_SPECIES_COLORS[][] = {
80 { "BRAFL", "0x00FFFF" }, { "SPHGR", "0x9620F0" }, { "STRPU", "0x9620F0" }, { "CIOIN", "0xFF1CAE" },
81 { "CIOSA", "0xFF2CAE" }, { "BOVIN", "0x5C3317" }, { "CANFA", "0x8B2323" }, { "HUMAN", "0xFF2400" },
82 { "PANTR", "0xCC2400" }, { "MOUSE", "0xFF7F00" }, { "RAT", "0xFFEF00" }, { "MONDO", "0xEE9A49" },
83 { "ORNAN", "0xCD853F" }, { "XENLA", "0x6BAA23" }, { "XENTR", "0x6BAA23" }, { "CHICK", "0xFFC125" },
84 { "FUGRU", "0x0000FF" }, { "BRARE", "0x0000DD" }, { "DANRE", "0x0000BB" }, { "TETNG", "0x0000AA" },
85 { "ORYLA", "0x000088" }, { "GASAC", "0x000066" }, { "CAEEL", "0x666699" }, { "CAEBR", "0xB0B0B0" },
86 { "DROME", "0x663366" }, { "DROPS", "0x996699" }, { "APIME", "0x7A7700" }, { "AEDAE", "0x8C5900" },
87 { "TRICA", "0x918E00" }, { "NEMVE", "0x0066CC" }, { "HYDVU", "0x3399FF" }, { "LUBBA", "0xF7B5CB" },
88 { "GEOCY", "0xF5A0BD" }, { "AMPQE", "0x009966" }, { "SUBDO", "0xC790B9" }, { "MONBE", "0xFC0FC0" },
89 { "DICPU", "0xFFCC33" }, { "DICDI", "0xFFCC00" }, { "ENTHI", "0x5959AB" }, { "ARATH", "0x00FF00" },
90 { "POPTR", "0x006400" }, { "VITVI", "0x00CD00" }, { "GLYMA", "0x00FF7F" }, { "ORYSA", "0x008B00" },
91 { "ORYSJ", "0x008C00" }, { "SORBI", "0x00EE76" }, { "SELMO", "0x238E23" }, { "PHYPA", "0x09F911" },
92 { "OSTLU", "0x7FFF00" }, { "OSTTA", "0x7FFF00" }, { "OSTRC", "0x7FFF00" }, { "MICPU", "0x66CD00" },
93 { "MIC99", "0x66CD00" }, { "CHLRE", "0xB3EE3A" }, { "VOLCA", "0xC0FF3E" }, { "CHLSP", "0x6B8E23" },
94 { "CYAME", "0xD02090" }, { "YEAST", "0xAAAAAA" }, { "BACFR", "0xFF0000" }, { "BACTN", "0xFFFF00" },
95 { "MYXXD", "0x0000FF" }, { "STIAU", "0x00FFFF" }, { "BACOV", "0x8C5900" }, { "BACUN", "0x66CD00" },
96 { "PORGI", "0x918E00" } };
97 final static int display_node_data = 0;
98 final static int collapse_uncollapse = 1;
99 final static int reroot = 2;
100 final static int subtree = 3;
101 final static int swap = 4;
102 final static int color_node_font = 5;
103 final static int change_node_font = 6;
104 final static int color_subtree = 7;
105 final static int open_seq_web = 8;
106 final static int open_pdb_web = 9;
107 final static int open_tax_web = 10;
108 final static int blast = 11;
109 final static int cut_subtree = 12;
110 final static int copy_subtree = 13;
111 final static int paste_subtree = 14;
112 final static int delete_subtree_or_node = 15;
113 final static int add_new_node = 16;
114 final static int edit_node_data = 17;
115 final static int sort_descendents = 18;
116 final static int get_ext_desc_data = 19;
117 final static int select_nodes = 20;
118 final static int uncollapse_all = 21;
119 final static int order_subtree = 22;
121 // ------------------
123 // ------------------
124 final static String display_options[][] = {
125 { "Phylogram", "display", "?" }, { "Node Name", "display", "yes" }, { "Taxonomy Code", "display", "yes" },
126 { "Seq Annotations", "display", "no" }, { "Confidence Values", "display", "?" },
127 { "Node Events", "display", "?" }, { "Colorize by Taxonomy", "display", "no" },
128 { "Colorize by Sequence", "display", "no" }, { "Visual Styles/Branch Colors", "display", "no" },
129 { "Branch Widths", "display", "no" }, { "Domain Architectures", "display", "no" },
130 { "Binary Characters", "nodisplay", "no" }, { "Binary Char Counts", "nodisplay", "no" },
131 { "Seq Name", "display", "yes" }, { "Seq Accession", "display", "no" },
132 { "Show Internal Data", "display", "yes" }, { "Dyna Hide", "display", "yes" },
133 { "Taxonomy Scientific", "display", "yes" }, { "Taxonomy Common", "display", "no" },
134 { "Colorize by Annotation", "display", "no" }, { "Seq Symbol", "display", "yes" },
135 { "Rollover", "display", "yes" }, { "Relation Confidence", "nodisplay", "no" },
136 { "Vector Data", "nodisplay", "no" }, { "Taxonomy Images", "display", "no" },
137 { "Properties", "display", "no" }, { "Gene Name", "display", "yes" },
138 { "Multiple Seq Alignment", "display", "no" }, { "Branch Length Values", "display", "no" }
139 , { "Taxonomy Rank", "display", "no" }, { "Show External Data", "display", "yes" }};
140 final static int display_as_phylogram = 0;
141 final static int show_node_names = 1;
142 final static int show_tax_code = 2;
143 final static int show_annotation = 3;
144 final static int write_confidence_values = 4;
145 final static int write_events = 5;
146 final static int color_according_to_species = 6;
147 final static int color_according_to_sequence = 7;
148 final static int use_style = 8;
149 final static int width_branches = 9;
150 final static int show_domain_architectures = 10;
151 final static int show_binary_characters = 11;
152 final static int show_binary_character_counts = 12;
153 final static int show_seq_names = 13;
154 final static int show_sequence_acc = 14;
155 final static int display_internal_data = 15;
156 final static int dynamically_hide_data = 16;
157 final static int show_taxonomy_scientific_names = 17;
158 final static int show_taxonomy_common_names = 18;
159 final static int color_according_to_annotation = 19;
160 final static int show_seq_symbols = 20;
161 final static int node_data_popup = 21;
162 final static int show_relation_confidence = 22;
163 final static int show_vector_data = 23;
164 final static int show_taxonomy_images = 24;
165 final static int show_properties = 25;
166 final static int show_gene_names = 26;
167 final static int show_mol_seqs = 27;
168 final static int write_branch_length_values = 28;
169 final static int show_tax_rank = 29;
170 final static int display_external_data = 30;
172 static final String VALIDATE_AGAINST_PHYLOXML_XSD_SCHEMA = "validate_against_phyloxml_xsd_schema";
173 private static Hashtable<String, Color> _sequence_colors;
174 private static Hashtable<String, Color> _annotation_colors;
175 private static Hashtable<String, Color> _domain_colors;
176 private static Hashtable<String, Color> _species_colors;
177 private static String DEFAULT_FONT_FAMILY = "";
178 private static final int DEPRECATED = -2;
179 private static final String DISPLAY_COLOR_KEY = "display_color";
180 // ---------------------------
181 // Display options for trees
182 // ---------------------------
183 // ---------------------------------
184 // Pertaining to the config itself
185 // ---------------------------------
186 // Full path to config (may be URL)
187 String config_filename;
188 // This option is selected in the dropdown
189 int default_clickto = Configuration.display_node_data;
190 String default_config_filename = AptxConstants.DEFAULT_CONFIGURATION_FILE_NAME;
194 TreeColorSet tree_color_set;
198 TreeFontSet tree_font_set;
199 boolean verbose = AptxConstants.VERBOSE_DEFAULT;
200 private boolean _abbreviate_scientific_names = false;
201 private boolean _antialias_screen = true;
202 private boolean _background_color_gradient = false;
203 private String _base_font_family_name = "";
204 private int _base_font_size = -1;
205 private CLADOGRAM_TYPE _cladogram_type = AptxConstants.CLADOGRAM_TYPE_DEFAULT;
206 private boolean _color_labels_same_as_parent_branch = false;
207 private int _default_bootstrap_samples = -1;
208 private NodeFill _default_node_fill = NodeFill.SOLID;
209 private NodeShape _default_node_shape = NodeShape.RECTANGLE;
210 private short _default_node_shape_size = AptxConstants.DEFAULT_NODE_SHAPE_SIZE_DEFAULT;
211 private SortedMap<String, Color> _display_colors = null;
212 private boolean _display_sequence_relations = false;
213 private boolean _editable = true;
214 private NodeDataField _ext_desc_data_to_return = NodeDataField.UNKNOWN;
215 private EXT_NODE_DATA_RETURN_ON _ext_node_data_return_on = EXT_NODE_DATA_RETURN_ON.WINODW;
216 private int _frame_x_size;
217 private int _frame_y_size;
218 private Color _gui_background_color = AptxConstants.GUI_BACKGROUND_DEFAULT;
219 private Color _gui_button_background_color = AptxConstants.BUTTON_BACKGROUND_COLOR_DEFAULT;
220 private Color _gui_button_border_color = AptxConstants.BUTTON_BORDER_COLOR_DEFAULT;
221 private Color _gui_button_text_color = AptxConstants.BUTTON_TEXT_COLOR_DEFAULT;
222 private Color _gui_checkbox_and_button_active_color = AptxConstants.CHECKBOX_AND_BUTTON_ACTIVE_COLOR_DEFAULT;
223 private Color _gui_checkbox_text_color = AptxConstants.CHECKBOX_TEXT_COLOR_DEFAULT;
224 private Color _gui_menu_background_color = AptxConstants.MENU_BACKGROUND_COLOR_DEFAULT;
225 private Color _gui_menu_text_color = AptxConstants.MENU_TEXT_COLOR_DEFAULT;
226 private boolean _hide_controls_and_menus = false;
227 private boolean _internal_number_are_confidence_for_nh_parsing = false;
228 private String _label_for_get_ext_descendents_data = "";
229 private int _max_base_font_size = 20;
230 private boolean _midpoint_root = false;
231 private int _min_base_font_size = 2;
232 private double _min_confidence_value = Options.MIN_CONFIDENCE_DEFAULT;
233 private boolean _nh_parsing_replace_underscores = false;
234 private NODE_LABEL_DIRECTION _node_label_direction = NODE_LABEL_DIRECTION.HORIZONTAL;
235 private short _number_of_digits_after_comma_for_branch_length_values = AptxConstants.NUMBER_OF_DIGITS_AFTER_COMMA_FOR_BRANCH_LENGTH_VALUES_DEFAULT;
236 private short _number_of_digits_after_comma_for_confidence_values = AptxConstants.NUMBER_OF_DIGITS_AFTER_COMMA_FOR_CONFIDENCE_VALUES_DEFAULT;
237 private short _ov_max_height = 80;
238 private short _ov_max_width = 80;
239 private OVERVIEW_PLACEMENT_TYPE _ov_placement = OVERVIEW_PLACEMENT_TYPE.UPPER_LEFT;
240 private File _path_to_local_fastme = null;
241 private File _path_to_local_mafft = null;
242 private File _path_to_local_raxml = null;
243 private PHYLOGENY_GRAPHICS_TYPE _phylogeny_graphics_type = PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR;
244 private float _print_line_width = AptxConstants.PDF_LINE_WIDTH_DEFAULT;
245 private boolean _show_annotation_ref_source = true;
246 private boolean _show_default_node_shapes_external = false;
247 private boolean _show_default_node_shapes_for_marked_nodes = false;
248 private boolean _show_default_node_shapes_internal = false;
249 private boolean _show_domain_labels = true;
250 private boolean _show_overview = true;
251 private boolean _show_scale = false;
252 private TAXONOMY_EXTRACTION _taxonomy_extraction = TAXONOMY_EXTRACTION.NO;
253 private UI _ui = UI.UNKNOWN;
254 private boolean _use_tabbed_display = false;
255 private boolean _validate_against_phyloxml_xsd_schema = AptxConstants.VALIDATE_AGAINST_PHYLOXML_XSD_SCJEMA_DEFAULT;
256 private Color _vector_data_min_color = Color.BLUE;
257 private Color _vector_data_max_color = Color.YELLOW;
258 private Color _vector_data_mean_color = Color.WHITE;
259 private double _vector_data_height = 12;
260 private int _vector_data_width = 120;
261 private boolean _line_up_renderable_node_data = true;
262 private boolean _right_align_domains = false;
263 private boolean _allow_thick_strokes = false;
264 private boolean _could_read_config_file = false;
266 for( final String font_name : AptxConstants.DEFAULT_FONT_CHOICES ) {
267 if ( Arrays.binarySearch( AptxUtil.getAvailableFontFamiliesSorted(), font_name ) >= 0 ) {
268 DEFAULT_FONT_FAMILY = font_name;
272 if ( ForesterUtil.isEmpty( DEFAULT_FONT_FAMILY ) ) {
273 DEFAULT_FONT_FAMILY = AptxConstants.DEFAULT_FONT_CHOICES[ AptxConstants.DEFAULT_FONT_CHOICES.length - 1 ];
277 public Configuration() {
278 this( null, false, false, false );
280 public Configuration(final InputStream is, final boolean is_applet, final boolean verbose) {
282 setDisplayColors( new TreeMap<String, Color>() );
284 InputStreamReader isr = new InputStreamReader(is);
285 final BufferedReader bf = new BufferedReader( isr );
288 ForesterUtil.programMessage( AptxConstants.PRG_NAME, "successfully read from configuration url ["
289 + config_filename + "]" );
290 _could_read_config_file = true;
292 catch ( final Exception e ) {
293 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "failed to read configuration from ["
294 + config_filename + "]: " + e.getLocalizedMessage() );
297 public Configuration( final String cf, final boolean is_url, final boolean is_applet, final boolean verbose ) {
298 if ( ForesterUtil.isEmpty( cf ) ) {
299 config_filename = default_config_filename;
302 config_filename = cf;
304 _could_read_config_file = false;
305 setDisplayColors( new TreeMap<String, Color>() );
306 config_filename = config_filename.trim();
309 // If URL, open accordingly
311 u = new URL( config_filename );
313 final InputStreamReader isr = new InputStreamReader( u.openStream() );
314 final BufferedReader bf = new BufferedReader( isr );
317 ForesterUtil.programMessage( AptxConstants.PRG_NAME, "successfully read from configuration url ["
318 + config_filename + "]" );
319 _could_read_config_file = true;
321 catch ( final Exception e ) {
322 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "failed to read configuration from ["
323 + config_filename + "]: " + e.getLocalizedMessage() );
326 catch ( final Exception e ) {
327 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "cannot find or open configuration url ["
328 + config_filename + "]" );
332 // Otherwise, open as a file
333 File f = new File( config_filename );
335 f = new File( config_filename + ".txt" );
337 if ( f.exists() && f.canRead() ) {
339 final BufferedReader bf = new BufferedReader( new FileReader( f ) );
342 _could_read_config_file = true;
344 catch ( final Exception e ) {
346 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "failed to read configuration from ["
347 + config_filename + "]: " + e );
353 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "cannot find or open configuration file ["
354 + config_filename + "]" );
360 public String getBaseFontFamilyName() {
361 return _base_font_family_name;
364 public int getDefaultBootstrapSamples() {
365 return _default_bootstrap_samples;
368 public NodeFill getDefaultNodeFill() {
369 return _default_node_fill;
372 public NodeShape getDefaultNodeShape() {
373 return _default_node_shape;
376 public short getDefaultNodeShapeSize() {
377 return _default_node_shape_size;
380 public NodeDataField getExtDescNodeDataToReturn() {
381 return _ext_desc_data_to_return;
384 public EXT_NODE_DATA_RETURN_ON getExtNodeDataReturnOn() {
385 return _ext_node_data_return_on;
388 public int getFrameXSize() {
389 return _frame_x_size;
392 public int getFrameYSize() {
393 return _frame_y_size;
396 public String getLabelForGetExtDescendentsData() {
397 return _label_for_get_ext_descendents_data;
400 public File getPathToLocalFastme() {
401 return _path_to_local_fastme;
404 public File getPathToLocalMafft() {
405 return _path_to_local_mafft;
408 public File getPathToLocalRaxml() {
409 return _path_to_local_raxml;
412 public double getVectorDataHeight() {
413 return _vector_data_height;
416 public Color getVectorDataMaxColor() {
417 return _vector_data_max_color;
420 public Color getVectorDataMeanColor() {
421 return _vector_data_mean_color;
424 public Color getVectorDataMinColor() {
425 return _vector_data_min_color;
428 public int getVectorDataWidth() {
429 return _vector_data_width;
432 public boolean isAbbreviateScientificTaxonNames() {
433 return _abbreviate_scientific_names;
436 public boolean isAllowThickStrokes() {
437 return _allow_thick_strokes;
440 public boolean isBackgroundColorGradient() {
441 return _background_color_gradient;
444 public boolean isColorByTaxonomicGroup() {
448 public boolean isColorLabelsSameAsParentBranch() {
449 return _color_labels_same_as_parent_branch;
452 final public boolean isLineUpRendarableNodeData() {
453 return _line_up_renderable_node_data;
456 public boolean isMidpointReroot() {
457 return _midpoint_root;
460 final public boolean isRightLineUpDomains() {
461 return _right_align_domains;
464 public boolean isShowAnnotationRefSource() {
465 return _show_annotation_ref_source;
468 public boolean isShowDefaultNodeShapesExternal() {
469 return _show_default_node_shapes_external;
472 public boolean isShowDefaultNodeShapesForMarkedNodes() {
473 return _show_default_node_shapes_for_marked_nodes;
476 public boolean isShowDefaultNodeShapesInternal() {
477 return _show_default_node_shapes_internal;
480 public boolean isShowDomainLabels() {
481 return _show_domain_labels;
484 public void putDisplayColors( final String key, final Color color ) {
485 getDisplayColors().put( key, color );
488 public void setAbbreviateScientificTaxonNames( final boolean abbreviate_scientific_names ) {
489 _abbreviate_scientific_names = abbreviate_scientific_names;
492 public void setAddTaxonomyImagesCB( final boolean b ) {
493 display_options[ show_taxonomy_images ][ 1 ] = b ? "yes" : "no";
496 public void setBackgroundColorGradient( final boolean background_color_gradient ) {
497 _background_color_gradient = background_color_gradient;
500 public void setBaseFontFamilyName( final String base_font_family_name ) {
501 _base_font_family_name = base_font_family_name;
504 public void setBaseFontSize( final int base_font_size ) {
505 _base_font_size = base_font_size;
508 public void setColorizeBranches( final boolean b ) {
509 display_options[ use_style ][ 2 ] = b ? "yes" : "no";
512 public void setColorLabelsSameAsParentBranch( final boolean color_labels_same_as_parent_branch ) {
513 _color_labels_same_as_parent_branch = color_labels_same_as_parent_branch;
516 public void setDefaultNodeFill( final NodeFill default_node_fill ) {
517 _default_node_fill = default_node_fill;
520 public void setDefaultNodeShape( final NodeShape default_node_shape ) {
521 _default_node_shape = default_node_shape;
524 public void setDefaultNodeShapeSize( final short default_node_shape_size ) {
525 _default_node_shape_size = default_node_shape_size;
528 public void setDisplayAsPhylogram( final boolean b ) {
529 display_options[ display_as_phylogram ][ 2 ] = b ? "yes" : "no";
532 public void setDisplayColors( final SortedMap<String, Color> display_colors ) {
533 _display_colors = display_colors;
536 public void setDisplayConfidenceValues( final boolean b ) {
537 display_options[ write_confidence_values ][ 2 ] = b ? "yes" : "no";
540 public void setDisplayGeneNames( final boolean b ) {
541 display_options[ show_gene_names ][ 2 ] = b ? "yes" : "no";
544 public void setDisplayInternalData( final boolean b ) {
545 display_options[ display_internal_data ][ 2 ] = b ? "yes" : "no";
548 public void setDisplayExternalData( final boolean b ) {
549 display_options[ display_external_data ][ 2 ] = b ? "yes" : "no";
552 public void setDisplayMultipleSequenceAlignment( final boolean b ) {
553 display_options[ show_mol_seqs ][ 2 ] = b ? "yes" : "no";
556 public void setDisplayNodeNames( final boolean b ) {
557 display_options[ show_node_names ][ 2 ] = b ? "yes" : "no";
560 public void setDisplaySequenceAcc( final boolean b ) {
561 display_options[ show_sequence_acc ][ 2 ] = b ? "yes" : "no";
564 public void setDisplaySequenceNames( final boolean b ) {
565 display_options[ show_seq_names ][ 2 ] = b ? "yes" : "no";
568 public void setDisplaySequenceRelations( final boolean display_sequence_relations ) {
569 _display_sequence_relations = display_sequence_relations;
572 public void setDisplaySequenceSymbols( final boolean b ) {
573 display_options[ show_seq_symbols ][ 2 ] = b ? "yes" : "no";
576 public void setDisplayTaxonomyCode( final boolean b ) {
577 display_options[ show_tax_code ][ 2 ] = b ? "yes" : "no";
580 public void setDisplayTaxonomyRank( final boolean b ) {
581 display_options[ show_tax_rank ][ 2 ] = b ? "yes" : "no";
584 public void setDisplayTaxonomyCommonNames( final boolean b ) {
585 display_options[ show_taxonomy_common_names ][ 2 ] = b ? "yes" : "no";
588 public void setDisplayTaxonomyImages( final boolean b ) {
589 display_options[ show_taxonomy_images ][ 2 ] = b ? "yes" : "no";
592 public void setDisplayTaxonomyScientificNames( final boolean b ) {
593 display_options[ show_taxonomy_scientific_names ][ 2 ] = b ? "yes" : "no";
596 public void setDynamicallyHideData( final boolean b ) {
597 display_options[ dynamically_hide_data ][ 2 ] = b ? "yes" : "no";
600 public void setExtDescNodeDataToReturn( final NodeDataField ext_desc_data_to_return ) {
601 _ext_desc_data_to_return = ext_desc_data_to_return;
604 public void setFrameXSize( final int frame_x_size ) {
605 _frame_x_size = frame_x_size;
608 public void setFrameYSize( final int frame_y_size ) {
609 _frame_y_size = frame_y_size;
612 final public void setLineUpRendarableNodeData( final boolean line_up_renderable_node_data ) {
613 _line_up_renderable_node_data = line_up_renderable_node_data;
616 public void setMidpointReroot( final boolean midpoint_root ) {
617 _midpoint_root = midpoint_root;
620 public void setMinConfidenceValue( final double min_confidence_value ) {
621 _min_confidence_value = min_confidence_value;
624 public void setNodeLabelDirection( final NODE_LABEL_DIRECTION node_label_direction ) {
625 _node_label_direction = node_label_direction;
628 public void setNumberOfDigitsAfterCommaForBranchLengthValue( final short number_of_digits_after_comma_for_branch_length_values ) {
629 _number_of_digits_after_comma_for_branch_length_values = number_of_digits_after_comma_for_branch_length_values;
632 public void setNumberOfDigitsAfterCommaForConfidenceValues( final short number_of_digits_after_comma_for_confidence_values ) {
633 _number_of_digits_after_comma_for_confidence_values = number_of_digits_after_comma_for_confidence_values;
636 public void setPhylogenyGraphicsType( final PHYLOGENY_GRAPHICS_TYPE phylogeny_graphics_type ) {
637 _phylogeny_graphics_type = phylogeny_graphics_type;
640 public void setPrintLineWidth( final float print_line_width ) {
641 _print_line_width = print_line_width;
644 public void setReplaceUnderscoresInNhParsing( final boolean nh_parsing_replace_underscores ) {
645 _nh_parsing_replace_underscores = nh_parsing_replace_underscores;
648 final public void setRightLineUpDomains( final boolean right_align_domains ) {
649 _right_align_domains = right_align_domains;
652 public void setShowDefaultNodeShapesExternal( final boolean show_default_node_shapes_external ) {
653 _show_default_node_shapes_external = show_default_node_shapes_external;
656 public void setShowDefaultNodeShapesForMarkedNodes( final boolean show_default_node_shapes_for_marked_nodes ) {
657 _show_default_node_shapes_for_marked_nodes = show_default_node_shapes_for_marked_nodes;
660 public void setShowDefaultNodeShapesInternal( final boolean show_default_node_shapes_internal ) {
661 _show_default_node_shapes_internal = show_default_node_shapes_internal;
664 public void setShowDomainLabels( final boolean show_domain_labels ) {
665 _show_domain_labels = show_domain_labels;
668 public void setShowScale( final boolean show_scale ) {
669 _show_scale = show_scale;
672 public void setUseStyle( final boolean b ) {
673 display_options[ use_style ][ 2 ] = b ? "yes" : "no";
676 private int getClickToIndex( final String name ) {
678 if ( name.equals( "edit_info" ) ) {
679 index = Configuration.display_node_data;
681 .printWarningMessage( AptxConstants.PRG_NAME,
682 "configuration key [edit_info] is deprecated, use [display node data] instead" );
684 else if ( name.equals( "display_node_data" ) ) {
685 index = Configuration.display_node_data;
687 else if ( name.equals( "collapse_uncollapse" ) ) {
688 index = Configuration.collapse_uncollapse;
690 else if ( name.equals( "uncollapse_all" ) ) {
691 index = Configuration.uncollapse_all;
693 else if ( name.equals( "reroot" ) ) {
694 index = Configuration.reroot;
696 else if ( name.equals( "subtree" ) ) {
697 index = Configuration.subtree;
699 else if ( name.equals( "swap" ) ) {
700 index = Configuration.swap;
702 else if ( name.equals( "order_subtree" ) ) {
703 index = Configuration.order_subtree;
705 else if ( name.equals( "sort_descendants" ) ) {
706 index = Configuration.sort_descendents;
708 else if ( name.equals( "get_ext_descendents_data" ) ) {
709 index = Configuration.get_ext_desc_data;
711 else if ( name.equals( "display_sequences" ) ) {
713 .printWarningMessage( AptxConstants.PRG_NAME, "configuration key [display_sequences] is deprecated" );
716 else if ( name.equals( "open_seq_web" ) ) {
717 index = Configuration.open_seq_web;
719 else if ( name.equals( "open_pdb_web" ) ) {
720 index = Configuration.open_pdb_web;
722 else if ( name.equals( "open_tax_web" ) ) {
723 index = Configuration.open_tax_web;
725 else if ( name.equals( "blast" ) ) {
726 index = Configuration.blast;
728 else if ( name.equals( "cut_subtree" ) ) {
729 index = Configuration.cut_subtree;
731 else if ( name.equals( "copy_subtree" ) ) {
732 index = Configuration.copy_subtree;
734 else if ( name.equals( "paste_subtree" ) ) {
735 index = Configuration.paste_subtree;
737 else if ( name.equals( "delete" ) ) {
738 index = Configuration.delete_subtree_or_node;
740 else if ( name.equals( "add_new_node" ) ) {
741 index = Configuration.add_new_node;
743 else if ( name.equals( "edit_node_data" ) ) {
744 index = Configuration.edit_node_data;
746 else if ( name.equals( "select_nodes" ) ) {
747 index = Configuration.select_nodes;
749 else if ( name.equals( "display_node_popup" ) ) {
750 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME,
751 "configuration key [display_node_popup] is deprecated" );
754 else if ( name.equals( "custom_option" ) ) {
755 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "configuration key [custom_option] is deprecated" );
758 else if ( name.equals( "color_subtree" ) ) {
759 index = Configuration.color_subtree;
761 else if ( name.equals( "change_node_font" ) ) {
762 index = Configuration.change_node_font;
764 else if ( name.equals( "color_node_font" ) ) {
765 index = Configuration.color_node_font;
767 else if ( name.equals( "color_subtree" ) ) {
768 index = Configuration.color_subtree;
773 private final void initSpeciesColors() {
774 _species_colors = new Hashtable<String, Color>();
775 for( final String[] s : DEFAULT_SPECIES_COLORS ) {
776 _species_colors.put( s[ 0 ], Color.decode( s[ 1 ] ) );
780 private boolean parseBoolean( final String str ) {
781 final String my_str = str.trim().toLowerCase();
782 if ( my_str.equals( "yes" ) || my_str.equals( "true" ) ) {
785 else if ( my_str.equals( "no" ) || my_str.equals( "false" ) ) {
789 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse boolean value from [" + str + "]" );
794 private double parseDouble( final String str ) {
797 d = Double.parseDouble( str.trim() );
799 catch ( final Exception e ) {
800 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse double from [" + str + "]" );
806 private float parseFloat( final String str ) {
809 f = Float.parseFloat( str.trim() );
811 catch ( final Exception e ) {
812 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse float from [" + str + "]" );
818 private int parseInt( final String str ) {
821 i = Integer.parseInt( str.trim() );
823 catch ( final Exception e ) {
824 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse integer from [" + str + "]" );
830 private short parseShort( final String str ) {
833 i = Short.parseShort( str.trim() );
835 catch ( final Exception e ) {
836 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse short from [" + str + "]" );
842 private void processFontFamily( final StringTokenizer st ) {
843 setBaseFontFamilyName( "" );
844 final String font_str = ( ( String ) st.nextElement() ).trim();
845 final String[] fonts = font_str.split( ",+" );
846 for( String font : fonts ) {
847 font = font.replace( '_', ' ' ).trim();
848 if ( Arrays.binarySearch( AptxUtil.getAvailableFontFamiliesSorted(), font ) >= 0 ) {
849 setBaseFontFamilyName( font );
856 * read each line of config file, process non-comment lines
857 * @throws IOException
859 private void readConfig( final BufferedReader conf_in ) throws IOException {
862 line = conf_in.readLine();
863 if ( line != null ) {
865 // skip comments and blank lines
866 if ( !line.startsWith( "#" ) && ( !ForesterUtil.isEmpty( line ) ) ) {
867 // convert runs of spaces to tabs
868 line = line.replaceAll( "\\s+", "\t" );
869 final StringTokenizer st = new StringTokenizer( line, "\t" );
873 } while ( line != null );
876 private void setAntialiasScreen( final boolean antialias_screen ) {
877 _antialias_screen = antialias_screen;
880 private void setCladogramType( final CLADOGRAM_TYPE cladogram_type ) {
881 _cladogram_type = cladogram_type;
884 private void setDefaultBootstrapSamples( final int default_bootstrap_samples ) {
885 _default_bootstrap_samples = default_bootstrap_samples;
888 private void setEditable( final boolean editable ) {
889 _editable = editable;
892 private void setExtNodeDataReturnOn( final EXT_NODE_DATA_RETURN_ON ext_node_data_return_on ) {
893 _ext_node_data_return_on = ext_node_data_return_on;
896 //private void setGraphicsExportX( final int graphics_export_x ) {
897 // _graphics_export_x = graphics_export_x;
900 //private void setGraphicsExportY( final int graphics_export_y ) {
901 // _graphics_export_y = graphics_export_y;
904 private void setInternalNumberAreConfidenceForNhParsing( final boolean internal_number_are_confidence_for_nh_parsing ) {
905 _internal_number_are_confidence_for_nh_parsing = internal_number_are_confidence_for_nh_parsing;
909 * Set a key-value(s) tuple
911 private void setKeyValue( final StringTokenizer st ) {
912 final String key = ( ( String ) st.nextElement() ).replace( ':', ' ' ).trim().toLowerCase();
913 if ( !st.hasMoreElements() ) {
916 // Handle single value settings first:
917 if ( key.equals( "default_click_to" ) ) {
918 final String clickto_name = ( String ) st.nextElement();
919 default_clickto = getClickToIndex( clickto_name );
920 if ( default_clickto == -1 ) {
921 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "invalid value [" + clickto_name
922 + "] for [default_click_to]" );
925 else if ( default_clickto == DEPRECATED ) {
929 else if ( key.equals( "native_ui" ) ) {
930 final String my_str = ( ( String ) st.nextElement() ).trim().toLowerCase();
931 if ( my_str.equals( "yes" ) || my_str.equals( "true" ) ) {
934 else if ( my_str.equals( "no" ) || my_str.equals( "false" ) ) {
935 _ui = UI.CROSSPLATFORM;
937 else if ( my_str.equals( "?" ) ) {
941 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "could not parse yes/no/? value from [" + my_str
946 else if ( key.equals( VALIDATE_AGAINST_PHYLOXML_XSD_SCHEMA ) ) {
947 setValidatePhyloXmlAgainstSchema( parseBoolean( ( String ) st.nextElement() ) );
949 else if ( key.equals( "antialias_screen" ) ) {
950 setAntialiasScreen( parseBoolean( ( String ) st.nextElement() ) );
952 else if ( key.equals( "phylogeny_graphics_type" ) ) {
953 final String type_str = ( ( String ) st.nextElement() ).trim();
954 if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.CONVEX.toString() ) ) {
955 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.CONVEX );
957 else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.CURVED.toString() ) ) {
958 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.CURVED );
960 else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE.toString() ) ) {
961 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.EURO_STYLE );
963 else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.ROUNDED.toString() ) ) {
964 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.ROUNDED );
966 else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR.toString() ) ) {
967 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
969 else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.TRIANGULAR.toString() ) ) {
970 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.TRIANGULAR );
972 else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.UNROOTED.toString() ) ) {
973 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.UNROOTED );
975 else if ( type_str.equalsIgnoreCase( PHYLOGENY_GRAPHICS_TYPE.CIRCULAR.toString() ) ) {
976 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.CIRCULAR );
979 setPhylogenyGraphicsType( PHYLOGENY_GRAPHICS_TYPE.RECTANGULAR );
980 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + type_str
981 + "] for [phylogeny_graphics_type]" );
984 else if ( key.equals( "min_confidence_value" ) ) {
985 final String mcv_str = ( ( String ) st.nextElement() ).trim();
986 final double d = parseDouble( mcv_str );
987 setMinConfidenceValue( d );
989 else if ( key.equals( "font_family" ) ) {
990 processFontFamily( st );
992 else if ( key.equals( "font_size" ) ) {
993 final String size_str = ( ( String ) st.nextElement() ).trim();
994 final int i = parseInt( size_str );
996 setBaseFontSize( i );
999 else if ( key.equals( "font_size_min" ) ) {
1000 final String size_str = ( ( String ) st.nextElement() ).trim();
1001 final int i = parseInt( size_str );
1003 setMinBaseFontSize( i );
1006 else if ( key.equals( "font_size_max" ) ) {
1007 final String size_str = ( ( String ) st.nextElement() ).trim();
1008 final int i = parseInt( size_str );
1010 setMaxBaseFontSize( i );
1013 else if ( key.equals( "pdf_export_line_width" ) ) {
1014 final String str = ( ( String ) st.nextElement() ).trim();
1015 final float f = parseFloat( str );
1017 setPrintLineWidth( f );
1020 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME,
1021 "value for [pdf_export_line_width] cannot be zero or negative" );
1024 else if ( key.equals( "window_initial_size_x" ) ) {
1025 final String str = ( ( String ) st.nextElement() ).trim();
1026 final int i = parseInt( str );
1031 else if ( key.equals( "window_initial_size_y" ) ) {
1032 final String str = ( ( String ) st.nextElement() ).trim();
1033 final int i = parseInt( str );
1038 else if ( key.equals( "default_number_of_bootstrap_resamples" ) ) {
1039 final String str = ( ( String ) st.nextElement() ).trim();
1040 final int i = parseInt( str );
1042 setDefaultBootstrapSamples( i );
1046 .printWarningMessage( AptxConstants.PRG_NAME,
1047 "value for [default_number_of_bootstrap_resamples] cannot be negative" );
1050 else if ( key.equals( "mafft_local" ) ) {
1051 final String str = ( ( String ) st.nextElement() ).trim();
1052 if ( !ForesterUtil.isEmpty( str ) ) {
1053 setPathToLocalMafft( new File( str ) );
1056 else if ( key.equals( "fastme_local" ) ) {
1057 final String str = ( ( String ) st.nextElement() ).trim();
1058 if ( !ForesterUtil.isEmpty( str ) ) {
1059 setPathToLocalFastme( new File( str ) );
1062 else if ( key.equals( "raxml_local" ) ) {
1063 final String str = ( ( String ) st.nextElement() ).trim();
1064 if ( !ForesterUtil.isEmpty( str ) ) {
1065 setPathToLocalRaxml( new File( str ) );
1068 else if ( key.equals( "show_scale" ) ) {
1069 setShowScale( parseBoolean( ( String ) st.nextElement() ) );
1071 else if ( key.equals( "show_overview" ) ) {
1072 setShowOverview( parseBoolean( ( String ) st.nextElement() ) );
1074 else if ( key.equals( "background_gradient" ) ) {
1075 setBackgroundColorGradient( parseBoolean( ( String ) st.nextElement() ) );
1077 else if ( key.equals( "color_labels_same_as_branch_length_values" ) ) {
1078 setColorLabelsSameAsParentBranch( parseBoolean( ( String ) st.nextElement() ) );
1080 else if ( key.equals( "show_domain_labels" ) ) {
1081 setShowDomainLabels( parseBoolean( ( String ) st.nextElement() ) );
1083 else if ( key.equals( "show_seq_annotation_ref_sources" ) ) {
1084 setShowAnnotationRefSource( parseBoolean( ( String ) st.nextElement() ) );
1086 else if ( key.equals( "abbreviate_scientific_names" ) ) {
1087 setAbbreviateScientificTaxonNames( parseBoolean( ( String ) st.nextElement() ) );
1089 else if ( key.equals( "cladogram_type" ) ) {
1090 final String type_str = ( ( String ) st.nextElement() ).trim();
1091 if ( type_str.equalsIgnoreCase( Options.CLADOGRAM_TYPE.NON_LINED_UP.toString() ) ) {
1092 setCladogramType( Options.CLADOGRAM_TYPE.NON_LINED_UP );
1094 else if ( type_str.equalsIgnoreCase( Options.CLADOGRAM_TYPE.LINED_UP.toString() ) ) {
1095 setCladogramType( Options.CLADOGRAM_TYPE.LINED_UP );
1098 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + type_str
1099 + "] for [cladogram_type]" );
1102 else if ( key.equals( "hide_controls_and_menus" ) ) {
1103 _hide_controls_and_menus = parseBoolean( ( String ) st.nextElement() );
1105 else if ( key.equals( "use_tabbed_display" ) ) {
1106 _use_tabbed_display = parseBoolean( ( String ) st.nextElement() );
1108 else if ( key.equals( "overview_width" ) ) {
1109 final short i = parseShort( ( ( String ) st.nextElement() ) );
1112 else if ( key.equals( "overview_height" ) ) {
1113 final short i = parseShort( ( ( String ) st.nextElement() ) );
1114 setOvMaxHeight( i );
1116 else if ( key.equals( "overview_placement_type" ) ) {
1117 final String type_str = ( ( String ) st.nextElement() ).trim();
1118 if ( type_str.equalsIgnoreCase( OVERVIEW_PLACEMENT_TYPE.UPPER_LEFT.toTag() ) ) {
1119 setOvPlacement( OVERVIEW_PLACEMENT_TYPE.UPPER_LEFT );
1121 else if ( type_str.equalsIgnoreCase( OVERVIEW_PLACEMENT_TYPE.UPPER_RIGHT.toTag() ) ) {
1122 setOvPlacement( OVERVIEW_PLACEMENT_TYPE.UPPER_RIGHT );
1124 else if ( type_str.equalsIgnoreCase( OVERVIEW_PLACEMENT_TYPE.LOWER_LEFT.toTag() ) ) {
1125 setOvPlacement( OVERVIEW_PLACEMENT_TYPE.LOWER_LEFT );
1127 else if ( type_str.equalsIgnoreCase( OVERVIEW_PLACEMENT_TYPE.LOWER_RIGHT.toTag() ) ) {
1128 setOvPlacement( OVERVIEW_PLACEMENT_TYPE.LOWER_RIGHT );
1131 setOvPlacement( OVERVIEW_PLACEMENT_TYPE.UPPER_LEFT );
1132 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + type_str
1133 + "] for [overview_placement_type]" );
1136 else if ( key.equals( "node_label_direction" ) ) {
1137 final String type_str = ( ( String ) st.nextElement() ).trim();
1138 if ( type_str.equalsIgnoreCase( NODE_LABEL_DIRECTION.HORIZONTAL.toString() ) ) {
1139 setNodeLabelDirection( NODE_LABEL_DIRECTION.HORIZONTAL );
1141 else if ( type_str.equalsIgnoreCase( NODE_LABEL_DIRECTION.RADIAL.toString() ) ) {
1142 setNodeLabelDirection( NODE_LABEL_DIRECTION.RADIAL );
1145 setNodeLabelDirection( NODE_LABEL_DIRECTION.HORIZONTAL );
1146 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + type_str
1147 + "] for [node_label_direction]" );
1150 else if ( key.equals( "branch_length_value_digits" ) ) {
1151 final short i = parseShort( ( ( String ) st.nextElement() ).trim() );
1153 setNumberOfDigitsAfterCommaForBranchLengthValue( i );
1156 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "illegal value [" + i
1157 + "] for [branch_length_value_digits]" );
1160 else if ( key.equals( "confidence_value_digits" ) ) {
1161 final short i = parseShort( ( ( String ) st.nextElement() ).trim() );
1163 setNumberOfDigitsAfterCommaForConfidenceValues( i );
1166 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "illegal value [" + i
1167 + "] for [confidence_value_digits]" );
1170 else if ( key.equals( "allow_editing" ) ) {
1171 setEditable( parseBoolean( ( String ) st.nextElement() ) );
1173 else if ( key.equals( "display_sequence_relations" ) ) {
1174 setDisplaySequenceRelations( parseBoolean( ( String ) st.nextElement() ) );
1176 else if ( key.equals( "replace_underscores_in_nh_parsing" ) ) {
1177 final boolean r = parseBoolean( ( String ) st.nextElement() );
1178 if ( r && ( getTaxonomyExtraction() != TAXONOMY_EXTRACTION.NO ) ) {
1180 .printWarningMessage( AptxConstants.PRG_NAME,
1181 "attempt to extract taxonomies and replace underscores at the same time" );
1184 setReplaceUnderscoresInNhParsing( r );
1187 else if ( key.equals( "taxonomy_extraction_in_nh_parsing" ) ) {
1188 final String s = ( String ) st.nextElement();
1189 if ( s.equalsIgnoreCase( "no" ) ) {
1190 setTaxonomyExtraction( TAXONOMY_EXTRACTION.NO );
1192 else if ( s.equalsIgnoreCase( "pfam_relaxed" ) ) {
1193 setTaxonomyExtraction( TAXONOMY_EXTRACTION.PFAM_STYLE_RELAXED );
1195 else if ( s.equalsIgnoreCase( "pfam_strict" ) ) {
1196 setTaxonomyExtraction( TAXONOMY_EXTRACTION.PFAM_STYLE_STRICT );
1198 else if ( s.equalsIgnoreCase( "aggressive" ) ) {
1199 setTaxonomyExtraction( TAXONOMY_EXTRACTION.AGGRESSIVE );
1203 .printWarningMessage( AptxConstants.PRG_NAME,
1204 "unknown value for \"taxonomy_extraction_in_nh_parsing\": "
1206 + " (must be either: no, pfam_relaxed, pfam_strict, or aggressive)" );
1208 if ( ( getTaxonomyExtraction() != TAXONOMY_EXTRACTION.NO ) && isReplaceUnderscoresInNhParsing() ) {
1210 .printWarningMessage( AptxConstants.PRG_NAME,
1211 "attempt to extract taxonomies and replace underscores at the same time" );
1214 else if ( key.equals( "internal_labels_are_confidence_values" ) ) {
1215 setInternalNumberAreConfidenceForNhParsing( parseBoolean( ( String ) st.nextElement() ) );
1217 else if ( key.equals( "gui_background_color" ) ) {
1218 _gui_background_color = Color.decode( ( String ) st.nextElement() );
1220 else if ( key.equals( "gui_checkbox_text_color" ) ) {
1221 _gui_checkbox_text_color = Color.decode( ( String ) st.nextElement() );
1223 else if ( key.equals( "gui_checkbox_and_button_active_color" ) ) {
1224 _gui_checkbox_and_button_active_color = Color.decode( ( String ) st.nextElement() );
1226 else if ( key.equals( "gui_button_text_color" ) ) {
1227 _gui_button_text_color = Color.decode( ( String ) st.nextElement() );
1229 else if ( key.equals( "gui_button_background_color" ) ) {
1230 _gui_button_background_color = Color.decode( ( String ) st.nextElement() );
1232 else if ( key.equals( "gui_menu_background_color" ) ) {
1233 _gui_menu_background_color = Color.decode( ( String ) st.nextElement() );
1235 else if ( key.equals( "gui_menu_text_color" ) ) {
1236 _gui_menu_text_color = Color.decode( ( String ) st.nextElement() );
1238 else if ( key.equals( "gui_button_border_color" ) ) {
1239 _gui_button_border_color = Color.decode( ( String ) st.nextElement() );
1241 else if ( key.equals( "show_default_node_shapes_internal" ) ) {
1242 setShowDefaultNodeShapesInternal( parseBoolean( ( ( String ) st.nextElement() ).trim() ) );
1244 else if ( key.equals( "show_default_node_shapes_external" ) ) {
1245 setShowDefaultNodeShapesExternal( parseBoolean( ( ( String ) st.nextElement() ).trim() ) );
1247 else if ( key.equals( "show_node_shapes_for_nodes_with_vis_data" ) ) {
1248 setShowDefaultNodeShapesForMarkedNodes( parseBoolean( ( ( String ) st.nextElement() ).trim() ) );
1250 else if ( key.equals( "default_node_size" ) ) {
1251 final short i = parseShort( ( ( String ) st.nextElement() ).trim() );
1252 setDefaultNodeShapeSize( i );
1254 else if ( key.equals( "default_node_fill" ) ) {
1255 final String fill_str = ( ( String ) st.nextElement() ).trim();
1256 if ( fill_str.equalsIgnoreCase( NodeVisualData.NodeFill.NONE.toString() ) ) {
1257 setDefaultNodeFill( NodeFill.NONE );
1259 else if ( fill_str.equalsIgnoreCase( NodeVisualData.NodeFill.GRADIENT.toString() ) ) {
1260 setDefaultNodeFill( NodeFill.GRADIENT );
1262 else if ( fill_str.equalsIgnoreCase( NodeVisualData.NodeFill.SOLID.toString() ) ) {
1263 setDefaultNodeFill( NodeFill.SOLID );
1266 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + fill_str
1267 + "] for [default_node_fill]" );
1270 else if ( key.equals( "default_node_shape" ) ) {
1271 final String shape_str = ( ( String ) st.nextElement() ).trim();
1272 if ( shape_str.equalsIgnoreCase( NodeVisualData.NodeShape.CIRCLE.toString() ) ) {
1273 setDefaultNodeShape( NodeShape.CIRCLE );
1275 else if ( shape_str.equalsIgnoreCase( NodeVisualData.NodeShape.RECTANGLE.toString() ) ) {
1276 setDefaultNodeShape( NodeShape.RECTANGLE );
1279 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + shape_str
1280 + "] for [default_node_shape]" );
1283 else if ( key.equals( "midpoint_reroot" ) ) {
1284 setMidpointReroot( parseBoolean( ( String ) st.nextElement() ) );
1286 else if ( key.equals( "list_node_data_field" ) || key.equals( "ext_descendents_data_to_return" ) ) {
1287 final String s = ( ( String ) st.nextElement() ).trim();
1288 if ( s.equalsIgnoreCase( "node_name" ) ) {
1289 setExtDescNodeDataToReturn( NodeDataField.NODE_NAME );
1291 else if ( s.equalsIgnoreCase( "sequence_acc" ) ) {
1292 setExtDescNodeDataToReturn( NodeDataField.SEQUENCE_ACC );
1294 else if ( s.equalsIgnoreCase( "sequence_mol_seq_fasta" ) ) {
1295 setExtDescNodeDataToReturn( NodeDataField.SEQUENCE_MOL_SEQ_FASTA );
1297 else if ( s.equalsIgnoreCase( "sequence_name" ) ) {
1298 setExtDescNodeDataToReturn( NodeDataField.SEQUENCE_NAME );
1300 else if ( s.equalsIgnoreCase( "gene_name" ) ) {
1301 setExtDescNodeDataToReturn( NodeDataField.GENE_NAME );
1303 else if ( s.equalsIgnoreCase( "sequence_symbol" ) ) {
1304 setExtDescNodeDataToReturn( NodeDataField.SEQUENCE_SYMBOL );
1306 else if ( s.equalsIgnoreCase( "taxonomy_scientific_name" ) ) {
1307 setExtDescNodeDataToReturn( NodeDataField.TAXONOMY_SCIENTIFIC_NAME );
1309 else if ( s.equalsIgnoreCase( "taxonomy_code" ) ) {
1310 setExtDescNodeDataToReturn( NodeDataField.TAXONOMY_CODE );
1312 else if ( s.equalsIgnoreCase( "user_selected" ) ) {
1313 setExtDescNodeDataToReturn( NodeDataField.UNKNOWN );
1315 else if ( s.equalsIgnoreCase( "domains" ) ) {
1316 setExtDescNodeDataToReturn( NodeDataField.DOMAINS_ALL );
1318 else if ( s.equalsIgnoreCase( "domains_collapsed" ) ) {
1319 setExtDescNodeDataToReturn( NodeDataField.DOMAINS_COLLAPSED_PER_PROTEIN );
1321 else if ( s.equalsIgnoreCase( "seq_annotations" ) ) {
1322 setExtDescNodeDataToReturn( NodeDataField.SEQ_ANNOTATIONS );
1324 else if ( s.equalsIgnoreCase( "go_term_ids" ) ) {
1325 setExtDescNodeDataToReturn( NodeDataField.GO_TERM_IDS );
1328 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + s
1329 + "] for [ext_descendents_data_to_return]" );
1332 else if ( key.equals( "list_node_data_custom_label" ) || key.equals( "label_for_get_ext_descendents_data" ) ) {
1333 final String s = ( ( String ) st.nextElement() ).trim();
1334 if ( !ForesterUtil.isEmpty( s ) && ( s.length() > 1 ) ) {
1335 setLabelForGetExtDescendentsData( s.replaceAll( "_", " " ) );
1338 else if ( key.equals( "list_node_data_in" ) || key.equals( "ext_descendents_data_to_return_on" ) ) {
1339 final String s = ( ( String ) st.nextElement() ).trim().toLowerCase();
1340 if ( s.equals( "console" ) ) {
1341 setExtNodeDataReturnOn( EXT_NODE_DATA_RETURN_ON.CONSOLE );
1343 else if ( s.equals( "window" ) ) {
1344 setExtNodeDataReturnOn( EXT_NODE_DATA_RETURN_ON.WINODW );
1346 else if ( s.equals( "buffer_only" ) ) {
1347 setExtNodeDataReturnOn( EXT_NODE_DATA_RETURN_ON.BUFFER_ONLY );
1350 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown value [" + s
1351 + "] for [ext_descendents_data_to_return_on]" );
1354 else if ( key.equals( "vector_data_min_color" ) ) {
1355 _vector_data_min_color = Color.decode( ( String ) st.nextElement() );
1357 else if ( key.equals( "vector_data_max_color" ) ) {
1358 _vector_data_max_color = Color.decode( ( String ) st.nextElement() );
1360 else if ( key.equals( "vector_data_mean_color" ) ) {
1361 _vector_data_mean_color = Color.decode( ( String ) st.nextElement() );
1363 else if ( key.equals( "vector_data_width" ) ) {
1364 _vector_data_width = parseShort( ( String ) st.nextElement() );
1365 if ( _vector_data_width < 1 ) {
1366 _vector_data_width = 120;
1369 else if ( key.equals( "vector_data_height" ) ) {
1370 _vector_data_height = parseShort( ( String ) st.nextElement() );
1371 if ( _vector_data_height < 1 ) {
1372 _vector_data_height = 12;
1375 else if ( key.equals( "line_up_renderable_data" ) ) {
1376 setLineUpRendarableNodeData( parseBoolean( ( String ) st.nextElement() ) );
1378 else if ( key.equals( "right_align_domain_architectures" ) ) {
1379 setRightLineUpDomains( parseBoolean( ( String ) st.nextElement() ) );
1381 else if ( key.equals( "allow_thick_strokes" ) ) {
1382 _allow_thick_strokes = parseBoolean( ( String ) st.nextElement() );
1384 else if ( st.countTokens() >= 2 ) { // counts the tokens that are not
1387 if ( key.equals( "phylogram" ) ) {
1388 key_index = Configuration.display_as_phylogram;
1390 else if ( key.equals( "rollover" ) ) {
1391 key_index = Configuration.node_data_popup;
1393 else if ( key.equals( "color_according_to_species" ) ) {
1394 key_index = Configuration.color_according_to_species;
1396 else if ( key.equals( "color_according_to_sequence" ) ) {
1397 key_index = Configuration.color_according_to_sequence;
1399 else if ( key.equals( "show_node_names" ) ) {
1400 key_index = Configuration.show_node_names;
1402 else if ( key.equals( "show_taxonomy_code" ) ) {
1403 key_index = Configuration.show_tax_code;
1405 else if ( key.equals( "show_taxonomy_rank" ) ) {
1406 key_index = Configuration.show_tax_rank;
1408 else if ( key.equals( "write_confidence_values" ) ) {
1409 key_index = Configuration.write_confidence_values;
1411 else if ( key.equals( "write_branch_length_values" ) ) {
1412 key_index = Configuration.write_branch_length_values;
1414 else if ( key.equals( "write_events" ) ) {
1415 key_index = Configuration.write_events;
1417 else if ( key.equals( "use_visual_styles" ) ) {
1418 key_index = Configuration.use_style;
1420 else if ( key.equals( "color_branches" ) ) {
1421 key_index = Configuration.use_style;
1423 .printWarningMessage( AptxConstants.PRG_NAME,
1424 "configuration key [color_branches] is deprecated, use [use_visual_styles] instead" );
1426 else if ( key.equals( "width_branches" ) ) {
1427 key_index = Configuration.width_branches;
1429 else if ( key.equals( "show_domain_architectures" ) ) {
1430 key_index = Configuration.show_domain_architectures;
1432 else if ( key.equals( "show_msa" ) ) {
1433 key_index = Configuration.show_mol_seqs;
1435 else if ( key.equals( "show_annotations" ) ) {
1436 key_index = Configuration.show_annotation;
1438 else if ( key.equals( "show_binary_characters" ) ) {
1439 key_index = Configuration.show_binary_characters;
1441 else if ( key.equals( "show_binary_character_counts" ) ) {
1442 key_index = Configuration.show_binary_character_counts;
1444 else if ( key.equals( "show_seq_names" ) ) {
1445 key_index = Configuration.show_seq_names;
1447 else if ( key.equals( "show_gene_names" ) ) {
1448 key_index = Configuration.show_gene_names;
1450 else if ( key.equals( "show_seq_symbols" ) ) {
1451 key_index = Configuration.show_seq_symbols;
1453 else if ( key.equals( "show_seq_acc" ) ) {
1454 key_index = Configuration.show_sequence_acc;
1456 else if ( key.equals( "display_internal_data" ) ) {
1457 key_index = Configuration.display_internal_data;
1459 else if ( key.equals( "display_external_data" ) ) {
1460 key_index = Configuration.display_external_data;
1462 else if ( key.equals( "dynamically_hide_data" ) ) {
1463 key_index = Configuration.dynamically_hide_data;
1465 else if ( key.equals( "show_taxonomy_scientific_names" ) ) {
1466 key_index = Configuration.show_taxonomy_scientific_names;
1468 else if ( key.equals( "show_taxonomy_common_names" ) ) {
1469 key_index = Configuration.show_taxonomy_common_names;
1471 else if ( key.equals( "show_taxonomy_images" ) ) {
1472 key_index = Configuration.show_taxonomy_images;
1474 else if ( key.equals( "color_according_to_annotation" ) ) {
1475 key_index = Configuration.color_according_to_annotation;
1477 else if ( key.equals( "show_vector_data" ) ) {
1478 key_index = Configuration.show_vector_data;
1480 else if ( key.equals( "show_properties" ) ) {
1481 key_index = Configuration.show_properties;
1483 else if ( key.equals( "show_relation_confidence" ) ) {
1484 key_index = Configuration.show_relation_confidence;
1486 // If we've found the key, set the values
1487 if ( key_index >= 0 ) {
1488 display_options[ key_index ][ 1 ] = ( String ) st.nextElement();
1489 display_options[ key_index ][ 2 ] = ( String ) st.nextElement();
1490 // otherwise, keep looking
1493 if ( key_index == DEPRECATED ) {
1496 else if ( key.equals( "click_to" ) ) {
1497 final String click_to_name = ( String ) st.nextElement();
1498 key_index = getClickToIndex( click_to_name );
1499 if ( key_index >= 0 ) {
1500 clickto_options[ key_index ][ 1 ] = ( String ) st.nextElement();
1502 else if ( key_index == DEPRECATED ) {
1506 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown click-to option: "
1510 else if ( key.equals( "species_color" ) ) {
1511 getSpeciesColors().put( ( ( String ) st.nextElement() ).replace( '_', ' ' ),
1512 Color.decode( ( String ) st.nextElement() ) );
1514 else if ( key.equals( "sequence_color" ) ) {
1515 getSequenceColors().put( ( ( String ) st.nextElement() ).replace( '_', ' ' ),
1516 Color.decode( ( String ) st.nextElement() ) );
1518 else if ( key.equals( "domain_color" ) ) {
1519 getDomainColors().put( ( String ) st.nextElement(), Color.decode( ( String ) st.nextElement() ) );
1521 else if ( key.equals( "annotation_color" ) ) {
1522 getAnnotationColors()
1523 .put( ( String ) st.nextElement(), Color.decode( ( String ) st.nextElement() ) );
1525 else if ( key.equals( "function_color" ) ) {
1526 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME,
1527 "configuration key [function_color] is deprecated" );
1529 else if ( key.equals( DISPLAY_COLOR_KEY ) ) {
1530 putDisplayColors( ( String ) st.nextElement(), Color.decode( ( String ) st.nextElement() ) );
1533 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown configuration key [" + key
1534 + "] in: " + config_filename );
1539 ForesterUtil.printWarningMessage( AptxConstants.PRG_NAME, "unknown configuration key [" + key + "] in: "
1540 + config_filename );
1544 private void setLabelForGetExtDescendentsData( final String label_for_get_ext_descendents_data ) {
1545 _label_for_get_ext_descendents_data = label_for_get_ext_descendents_data;
1548 private void setMaxBaseFontSize( final int max_base_font_size ) {
1549 _max_base_font_size = max_base_font_size;
1552 private void setMinBaseFontSize( final int min_base_font_size ) {
1553 _min_base_font_size = min_base_font_size;
1556 private void setOvMaxHeight( final short ov_max_height ) {
1557 _ov_max_height = ov_max_height;
1560 private void setOvMaxWidth( final short ov_max_width ) {
1561 _ov_max_width = ov_max_width;
1564 private void setOvPlacement( final OVERVIEW_PLACEMENT_TYPE ov_placement ) {
1565 _ov_placement = ov_placement;
1568 private void setPathToLocalFastme( final File path_to_local_fastme ) {
1569 _path_to_local_fastme = path_to_local_fastme;
1572 private void setPathToLocalMafft( final File path_to_local_mafft ) {
1573 _path_to_local_mafft = path_to_local_mafft;
1576 private void setPathToLocalRaxml( final File path_to_local_raxml ) {
1577 _path_to_local_raxml = path_to_local_raxml;
1580 private void setShowAnnotationRefSource( final boolean b ) {
1581 _show_annotation_ref_source = b;
1584 private void setShowOverview( final boolean show_overview ) {
1585 _show_overview = show_overview;
1588 private void setValidatePhyloXmlAgainstSchema( final boolean validate_against_phyloxml_xsd_schema ) {
1589 _validate_against_phyloxml_xsd_schema = validate_against_phyloxml_xsd_schema;
1592 boolean displaySequenceRelations() {
1593 return _display_sequence_relations;
1596 boolean doCheckOption( final int which ) {
1597 return ( display_options[ which ][ 2 ].equalsIgnoreCase( "yes" ) )
1598 || ( display_options[ which ][ 2 ].equalsIgnoreCase( "true" ) );
1601 boolean doDisplayClickToOption( final int which ) {
1602 return clickto_options[ which ][ 1 ].equalsIgnoreCase( "display" );
1605 boolean doDisplayOption( final int which ) {
1606 return display_options[ which ][ 1 ].equalsIgnoreCase( "display" );
1610 * Will attempt to use the phylogeny to determine whether to check
1611 * this or not (e.g. phylogram)
1614 boolean doGuessCheckOption( final int which ) {
1615 return display_options[ which ][ 2 ].equals( "?" );
1618 Map<String, Color> getAnnotationColors() {
1619 if ( _annotation_colors == null ) {
1620 _annotation_colors = new Hashtable<String, Color>();
1622 return _annotation_colors;
1625 int getBaseFontSize() {
1626 return _base_font_size;
1629 CLADOGRAM_TYPE getCladogramType() {
1630 return _cladogram_type;
1633 int getClickToOptionsCount() {
1634 return clickto_options.length;
1637 String getClickToTitle( final int which ) {
1638 return clickto_options[ which ][ 0 ];
1641 int getDefaultDisplayClicktoOption() {
1642 return default_clickto;
1645 SortedMap<String, Color> getDisplayColors() {
1646 return _display_colors;
1649 String getDisplayTitle( final int which ) {
1650 return display_options[ which ][ 0 ];
1653 Map<String, Color> getDomainColors() {
1654 if ( _domain_colors == null ) {
1655 _domain_colors = new Hashtable<String, Color>();
1657 return _domain_colors;
1661 Color getGuiBackgroundColor() {
1662 return _gui_background_color;
1665 Color getGuiButtonBackgroundColor() {
1666 return _gui_button_background_color;
1669 Color getGuiButtonBorderColor() {
1670 return _gui_button_border_color;
1673 Color getGuiButtonTextColor() {
1674 return _gui_button_text_color;
1677 Color getGuiCheckboxAndButtonActiveColor() {
1678 return _gui_checkbox_and_button_active_color;
1681 Color getGuiCheckboxTextColor() {
1682 return _gui_checkbox_text_color;
1685 Color getGuiMenuBackgroundColor() {
1686 return _gui_menu_background_color;
1689 Color getGuiMenuTextColor() {
1690 return _gui_menu_text_color;
1693 static int getGuiFontSize() {
1697 int getMaxBaseFontSize() {
1698 return _max_base_font_size;
1701 int getMinBaseFontSize() {
1702 return _min_base_font_size;
1705 double getMinConfidenceValue() {
1706 return _min_confidence_value;
1709 NODE_LABEL_DIRECTION getNodeLabelDirection() {
1710 return _node_label_direction;
1713 short getNumberOfDigitsAfterCommaForBranchLengthValues() {
1714 return _number_of_digits_after_comma_for_branch_length_values;
1717 short getNumberOfDigitsAfterCommaForConfidenceValues() {
1718 return _number_of_digits_after_comma_for_confidence_values;
1721 short getOvMaxHeight() {
1722 return _ov_max_height;
1725 short getOvMaxWidth() {
1726 return _ov_max_width;
1729 OVERVIEW_PLACEMENT_TYPE getOvPlacement() {
1730 return _ov_placement;
1733 PHYLOGENY_GRAPHICS_TYPE getPhylogenyGraphicsType() {
1734 return _phylogeny_graphics_type;
1737 float getPrintLineWidth() {
1738 return _print_line_width;
1741 Hashtable<String, Color> getSequenceColors() {
1742 if ( _sequence_colors == null ) {
1743 _sequence_colors = new Hashtable<String, Color>();
1745 return _sequence_colors;
1748 Hashtable<String, Color> getSpeciesColors() {
1749 if ( _species_colors == null ) {
1750 initSpeciesColors();
1752 return _species_colors;
1755 public final TAXONOMY_EXTRACTION getTaxonomyExtraction() {
1756 return _taxonomy_extraction;
1759 boolean isAntialiasScreen() {
1760 return _antialias_screen;
1764 * Convenience method.
1766 * @return true if value in configuration file was 'yes'
1768 boolean isDrawAsPhylogram() {
1769 return doCheckOption( display_as_phylogram );
1772 boolean isEditable() {
1777 * Only used by ArchaeoptryxE.
1780 boolean isHideControlPanelAndMenubar() {
1781 return _hide_controls_and_menus;
1784 public boolean isInternalNumberAreConfidenceForNhParsing() {
1785 return _internal_number_are_confidence_for_nh_parsing;
1788 public boolean isReplaceUnderscoresInNhParsing() {
1789 return _nh_parsing_replace_underscores;
1792 boolean isShowOverview() {
1793 return _show_overview;
1796 boolean isShowScale() {
1800 final boolean isUseNativeUI() {
1801 if ( ( _ui == UI.UNKNOWN ) && ForesterUtil.isMac() ) {
1804 return _ui == UI.NATIVE;
1808 * Only used by ArchaeoptryxE.
1811 boolean isUseTabbedDisplay() {
1812 return _use_tabbed_display;
1815 public boolean isValidatePhyloXmlAgainstSchema() {
1816 return _validate_against_phyloxml_xsd_schema;
1819 final void setTaxonomyExtraction( final TAXONOMY_EXTRACTION taxonomy_extraction ) {
1820 _taxonomy_extraction = taxonomy_extraction;
1823 static String getDefaultFontFamilyName() {
1824 return DEFAULT_FONT_FAMILY;
1827 public boolean isCouldReadConfigFile() {
1828 return _could_read_config_file;
1832 public String getConfigFilename() {
1833 return config_filename;