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.
24 import jalview.api.AlignExportSettingsI;
25 import jalview.api.AlignViewportI;
26 import jalview.api.AlignmentViewPanel;
27 import jalview.api.ComplexAlignFile;
28 import jalview.api.FeatureRenderer;
29 import jalview.api.FeatureSettingsModelI;
30 import jalview.api.FeaturesDisplayedI;
31 import jalview.bin.BuildDetails;
32 import jalview.datamodel.AlignExportSettingsAdapter;
33 import jalview.datamodel.AlignmentAnnotation;
34 import jalview.datamodel.AlignmentI;
35 import jalview.datamodel.Annotation;
36 import jalview.datamodel.HiddenColumns;
37 import jalview.datamodel.HiddenSequences;
38 import jalview.datamodel.Sequence;
39 import jalview.datamodel.SequenceFeature;
40 import jalview.datamodel.SequenceGroup;
41 import jalview.datamodel.SequenceI;
42 import jalview.json.binding.biojson.v1.AlignmentAnnotationPojo;
43 import jalview.json.binding.biojson.v1.AlignmentPojo;
44 import jalview.json.binding.biojson.v1.AnnotationDisplaySettingPojo;
45 import jalview.json.binding.biojson.v1.AnnotationPojo;
46 import jalview.json.binding.biojson.v1.ColourSchemeMapper;
47 import jalview.json.binding.biojson.v1.SequenceFeaturesPojo;
48 import jalview.json.binding.biojson.v1.SequenceGrpPojo;
49 import jalview.json.binding.biojson.v1.SequencePojo;
50 import jalview.renderer.seqfeatures.FeatureColourFinder;
51 import jalview.schemes.ColourSchemeProperty;
52 import jalview.schemes.JalviewColourScheme;
53 import jalview.schemes.ResidueColourScheme;
54 import jalview.util.ColorUtils;
55 import jalview.util.Format;
56 import jalview.viewmodel.seqfeatures.FeaturesDisplayed;
58 import java.awt.Color;
59 import java.io.IOException;
60 import java.io.Reader;
61 import java.util.ArrayList;
62 import java.util.Hashtable;
63 import java.util.Iterator;
64 import java.util.List;
65 import java.util.Vector;
67 import org.json.simple.JSONArray;
68 import org.json.simple.JSONObject;
69 import org.json.simple.parser.JSONParser;
71 public class JSONFile extends AlignFile implements ComplexAlignFile
73 private static String version = new BuildDetails().getVersion();
75 private String webstartUrl = "http://www.jalview.org/services/launchApp";
77 private String application = "Jalview";
79 private String globalColourScheme;
81 private boolean showSeqFeatures;
83 private Hashtable<String, Sequence> seqMap;
85 private FeaturesDisplayedI displayedFeatures;
87 private FeatureRenderer fr;
89 private HiddenColumns hiddenColumns;
91 private List<String> hiddenSeqRefs;
93 private ArrayList<SequenceI> hiddenSequences;
95 private final static String TCOFFEE_SCORE = "TCoffeeScore";
102 public JSONFile(FileParse source) throws IOException
107 public JSONFile(String inFile, DataSourceType sourceType)
110 super(inFile, sourceType);
114 public void parse() throws IOException
121 public String print(SequenceI[] sqs, boolean jvsuffix)
123 String jsonOutput = null;
126 AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
127 AlignExportSettingsI exportSettings = getExportSettings();
130 * if no export settings were supplied, provide an 'export all' setting
132 if (exportSettings == null)
134 exportSettings = new AlignExportSettingsAdapter(true);
138 for (SequenceI seq : sqs)
140 StringBuilder name = new StringBuilder();
141 name.append(seq.getName()).append("/").append(seq.getStart())
142 .append("-").append(seq.getEnd());
143 SequencePojo jsonSeqPojo = new SequencePojo();
144 jsonSeqPojo.setId(String.valueOf(seq.hashCode()));
145 jsonSeqPojo.setOrder(++count);
146 jsonSeqPojo.setEnd(seq.getEnd());
147 jsonSeqPojo.setStart(seq.getStart());
148 jsonSeqPojo.setName(name.toString());
149 jsonSeqPojo.setSeq(seq.getSequenceAsString());
150 jsonAlignmentPojo.getSeqs().add(jsonSeqPojo);
152 jsonAlignmentPojo.setGlobalColorScheme(globalColourScheme);
153 jsonAlignmentPojo.getAppSettings().put("application", application);
154 jsonAlignmentPojo.getAppSettings().put("version", version);
155 jsonAlignmentPojo.getAppSettings().put("webStartUrl", webstartUrl);
156 jsonAlignmentPojo.getAppSettings().put("showSeqFeatures",
157 String.valueOf(showSeqFeatures));
159 String[] hiddenSections = getHiddenSections();
160 if (hiddenSections != null)
162 if (hiddenSections[0] != null
163 && exportSettings.isExportHiddenColumns())
165 jsonAlignmentPojo.getAppSettings().put("hiddenCols",
166 String.valueOf(hiddenSections[0]));
168 if (hiddenSections[1] != null
169 && exportSettings.isExportHiddenSequences())
171 jsonAlignmentPojo.getAppSettings().put("hiddenSeqs",
172 String.valueOf(hiddenSections[1]));
176 if (exportSettings.isExportAnnotations())
179 .setAlignAnnotation(annotationToJsonPojo(annotations));
183 // These color schemes require annotation, disable them if annotations
185 if (globalColourScheme
186 .equalsIgnoreCase(JalviewColourScheme.RNAHelices.toString())
187 || globalColourScheme.equalsIgnoreCase(
188 JalviewColourScheme.TCoffee.toString()))
190 jsonAlignmentPojo.setGlobalColorScheme(ResidueColourScheme.NONE);
194 if (exportSettings.isExportFeatures())
196 jsonAlignmentPojo.setSeqFeatures(sequenceFeatureToJsonPojo(sqs));
199 if (exportSettings.isExportGroups() && seqGroups != null
200 && seqGroups.size() > 0)
202 for (SequenceGroup seqGrp : seqGroups)
204 SequenceGrpPojo seqGrpPojo = new SequenceGrpPojo();
205 seqGrpPojo.setGroupName(seqGrp.getName());
206 seqGrpPojo.setColourScheme(ColourSchemeProperty
207 .getColourName(seqGrp.getColourScheme()));
208 seqGrpPojo.setColourText(seqGrp.getColourText());
209 seqGrpPojo.setDescription(seqGrp.getDescription());
210 seqGrpPojo.setDisplayBoxes(seqGrp.getDisplayBoxes());
211 seqGrpPojo.setDisplayText(seqGrp.getDisplayText());
212 seqGrpPojo.setEndRes(seqGrp.getEndRes());
213 seqGrpPojo.setStartRes(seqGrp.getStartRes());
214 seqGrpPojo.setShowNonconserved(seqGrp.getShowNonconserved());
215 for (SequenceI seq : seqGrp.getSequences())
217 seqGrpPojo.getSequenceRefs()
218 .add(String.valueOf(seq.hashCode()));
220 jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo);
223 org.json.JSONObject generatedJSon = new org.json.JSONObject(
225 jsonOutput = generatedJSon.toString();
226 return jsonOutput.replaceAll("xstart", "xStart").replaceAll("xend",
228 } catch (Exception e)
235 public String[] getHiddenSections()
237 String[] hiddenSections = new String[2];
238 if (getViewport() == null)
243 // hidden column business
244 if (getViewport().hasHiddenColumns())
246 hiddenSections[0] = getViewport().getAlignment().getHiddenColumns()
247 .regionsToString(";", "-");
250 // hidden rows/seqs business
251 HiddenSequences hiddenSeqsObj = getViewport().getAlignment()
252 .getHiddenSequences();
253 if (hiddenSeqsObj == null || hiddenSeqsObj.hiddenSequences == null)
255 return hiddenSections;
258 SequenceI[] hiddenSeqs = hiddenSeqsObj.hiddenSequences;
259 StringBuilder hiddenSeqsBuilder = new StringBuilder();
260 for (SequenceI hiddenSeq : hiddenSeqs)
262 if (hiddenSeq != null)
264 hiddenSeqsBuilder.append(";").append(hiddenSeq.hashCode());
267 if (hiddenSeqsBuilder.length() > 0)
269 hiddenSeqsBuilder.deleteCharAt(0);
271 hiddenSections[1] = hiddenSeqsBuilder.toString();
273 return hiddenSections;
276 protected List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
279 displayedFeatures = (fr == null) ? null : fr.getFeaturesDisplayed();
280 List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<>();
283 return sequenceFeaturesPojo;
286 FeatureColourFinder finder = new FeatureColourFinder(fr);
288 String[] visibleFeatureTypes = displayedFeatures == null ? null
289 : displayedFeatures.getVisibleFeatures().toArray(
290 new String[displayedFeatures.getVisibleFeatureCount()]);
292 for (SequenceI seq : sqs)
295 * get all features currently visible (and any non-positional features)
297 List<SequenceFeature> seqFeatures = seq.getFeatures().getAllFeatures(
298 visibleFeatureTypes);
299 for (SequenceFeature sf : seqFeatures)
301 SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo(
302 String.valueOf(seq.hashCode()));
304 String featureColour = (fr == null) ? null : Format
305 .getHexString(finder.findFeatureColour(Color.white, seq,
306 seq.findIndex(sf.getBegin())));
307 int xStart = sf.getBegin() == 0 ? 0
308 : seq.findIndex(sf.getBegin()) - 1;
309 int xEnd = sf.getEnd() == 0 ? 0 : seq.findIndex(sf.getEnd());
310 jsonFeature.setXstart(xStart);
311 jsonFeature.setXend(xEnd);
312 jsonFeature.setType(sf.getType());
313 jsonFeature.setDescription(sf.getDescription());
314 jsonFeature.setLinks(sf.links);
315 jsonFeature.setOtherDetails(sf.otherDetails);
316 jsonFeature.setScore(sf.getScore());
317 jsonFeature.setFillColor(featureColour);
318 jsonFeature.setFeatureGroup(sf.getFeatureGroup());
319 sequenceFeaturesPojo.add(jsonFeature);
322 return sequenceFeaturesPojo;
325 public static List<AlignmentAnnotationPojo> annotationToJsonPojo(
326 Vector<AlignmentAnnotation> annotations)
328 List<AlignmentAnnotationPojo> jsonAnnotations = new ArrayList<>();
329 if (annotations == null)
331 return jsonAnnotations;
333 for (AlignmentAnnotation annot : annotations)
335 AlignmentAnnotationPojo alignAnnotPojo = new AlignmentAnnotationPojo();
336 alignAnnotPojo.setDescription(annot.description);
337 alignAnnotPojo.setLabel(annot.label);
338 if (!Double.isNaN(annot.score))
340 alignAnnotPojo.setScore(annot.score);
342 alignAnnotPojo.setCalcId(annot.getCalcId());
343 alignAnnotPojo.setGraphType(annot.graph);
345 AnnotationDisplaySettingPojo annotSetting = new AnnotationDisplaySettingPojo();
346 annotSetting.setBelowAlignment(annot.belowAlignment);
347 annotSetting.setCentreColLabels(annot.centreColLabels);
348 annotSetting.setScaleColLabel(annot.scaleColLabel);
349 annotSetting.setShowAllColLabels(annot.showAllColLabels);
350 annotSetting.setVisible(annot.visible);
351 annotSetting.setHasIcon(annot.hasIcons);
352 alignAnnotPojo.setAnnotationSettings(annotSetting);
353 SequenceI refSeq = annot.sequenceRef;
356 alignAnnotPojo.setSequenceRef(String.valueOf(refSeq.hashCode()));
358 for (Annotation annotation : annot.annotations)
360 AnnotationPojo annotationPojo = new AnnotationPojo();
361 if (annotation != null)
363 annotationPojo.setDescription(annotation.description);
364 annotationPojo.setValue(annotation.value);
366 .setSecondaryStructure(annotation.secondaryStructure);
367 String displayChar = annotation.displayCharacter == null ? null
368 : annotation.displayCharacter;
369 // System.out.println("--------------------->[" + displayChar + "]");
370 annotationPojo.setDisplayCharacter(displayChar);
371 if (annotation.colour != null)
373 annotationPojo.setColour(
374 jalview.util.Format.getHexString(annotation.colour));
376 alignAnnotPojo.getAnnotations().add(annotationPojo);
380 if (annot.getCalcId() != null
381 && annot.getCalcId().equalsIgnoreCase(TCOFFEE_SCORE))
387 alignAnnotPojo.getAnnotations().add(annotationPojo);
391 jsonAnnotations.add(alignAnnotPojo);
393 return jsonAnnotations;
396 @SuppressWarnings("unchecked")
397 public JSONFile parse(Reader jsonAlignmentString)
401 JSONParser jsonParser = new JSONParser();
402 JSONObject alignmentJsonObj = (JSONObject) jsonParser
403 .parse(jsonAlignmentString);
404 JSONArray seqJsonArray = (JSONArray) alignmentJsonObj.get("seqs");
405 JSONArray alAnnotJsonArray = (JSONArray) alignmentJsonObj
406 .get("alignAnnotation");
407 JSONArray jsonSeqArray = (JSONArray) alignmentJsonObj
409 JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj
411 JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj
414 if (jvSettingsJsonObj != null)
416 globalColourScheme = (String) jvSettingsJsonObj
417 .get("globalColorScheme");
418 Boolean showFeatures = Boolean.valueOf(
419 jvSettingsJsonObj.get("showSeqFeatures").toString());
420 setShowSeqFeatures(showFeatures);
421 parseHiddenSeqRefsAsList(jvSettingsJsonObj);
422 parseHiddenCols(jvSettingsJsonObj);
425 hiddenSequences = new ArrayList<>();
426 seqMap = new Hashtable<>();
427 for (Iterator<JSONObject> sequenceIter = seqJsonArray
428 .iterator(); sequenceIter.hasNext();)
430 JSONObject sequence = sequenceIter.next();
431 String sequcenceString = sequence.get("seq").toString();
432 String sequenceName = sequence.get("name").toString();
433 String seqUniqueId = sequence.get("id").toString();
434 int start = Integer.valueOf(sequence.get("start").toString());
435 int end = Integer.valueOf(sequence.get("end").toString());
436 Sequence seq = new Sequence(sequenceName, sequcenceString, start,
438 if (hiddenSeqRefs != null && hiddenSeqRefs.contains(seqUniqueId))
440 hiddenSequences.add(seq);
443 seqMap.put(seqUniqueId, seq);
446 parseFeatures(jsonSeqArray);
448 for (Iterator<JSONObject> seqGrpIter = seqGrpJsonArray
449 .iterator(); seqGrpIter.hasNext();)
451 JSONObject seqGrpObj = seqGrpIter.next();
452 String grpName = seqGrpObj.get("groupName").toString();
453 String colourScheme = seqGrpObj.get("colourScheme").toString();
454 String description = (seqGrpObj.get("description") == null) ? null
455 : seqGrpObj.get("description").toString();
456 boolean displayBoxes = Boolean
457 .valueOf(seqGrpObj.get("displayBoxes").toString());
458 boolean displayText = Boolean
459 .valueOf(seqGrpObj.get("displayText").toString());
460 boolean colourText = Boolean
461 .valueOf(seqGrpObj.get("colourText").toString());
462 boolean showNonconserved = Boolean
463 .valueOf(seqGrpObj.get("showNonconserved").toString());
464 int startRes = Integer
465 .valueOf(seqGrpObj.get("startRes").toString());
466 int endRes = Integer.valueOf(seqGrpObj.get("endRes").toString());
467 JSONArray sequenceRefs = (JSONArray) seqGrpObj.get("sequenceRefs");
469 ArrayList<SequenceI> grpSeqs = new ArrayList<>();
470 if (sequenceRefs.size() > 0)
472 Iterator<String> seqHashIter = sequenceRefs.iterator();
473 while (seqHashIter.hasNext())
475 String seqHash = seqHashIter.next();
476 Sequence sequence = seqMap.get(seqHash);
477 if (sequence != null)
479 grpSeqs.add(sequence);
483 SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName, null,
484 displayBoxes, displayText, colourText, startRes, endRes);
485 seqGrp.setColourScheme(ColourSchemeMapper
486 .getJalviewColourScheme(colourScheme, seqGrp));
487 seqGrp.setShowNonconserved(showNonconserved);
488 seqGrp.setDescription(description);
489 this.seqGroups.add(seqGrp);
493 for (Iterator<JSONObject> alAnnotIter = alAnnotJsonArray
494 .iterator(); alAnnotIter.hasNext();)
496 JSONObject alAnnot = alAnnotIter.next();
497 JSONArray annotJsonArray = (JSONArray) alAnnot.get("annotations");
498 Annotation[] annotations = new Annotation[annotJsonArray.size()];
500 for (Iterator<JSONObject> annotIter = annotJsonArray
501 .iterator(); annotIter.hasNext();)
503 JSONObject annot = annotIter.next();
506 annotations[count] = null;
510 float val = annot.get("value") == null ? null
511 : Float.valueOf(annot.get("value").toString());
512 String desc = annot.get("description") == null ? null
513 : annot.get("description").toString();
514 char ss = annot.get("secondaryStructure") == null
515 || annot.get("secondaryStructure").toString()
516 .equalsIgnoreCase("u0000") ? ' '
517 : annot.get("secondaryStructure")
518 .toString().charAt(0);
519 String displayChar = annot.get("displayCharacter") == null ? ""
520 : annot.get("displayCharacter").toString();
522 annotations[count] = new Annotation(displayChar, desc, ss, val);
523 if (annot.get("colour") != null)
525 Color color = ColorUtils
526 .parseColourString(annot.get("colour").toString());
527 annotations[count].colour = color;
533 AlignmentAnnotation alignAnnot = new AlignmentAnnotation(
534 alAnnot.get("label").toString(),
535 alAnnot.get("description").toString(), annotations);
536 alignAnnot.graph = (alAnnot.get("graphType") == null) ? 0
537 : Integer.valueOf(alAnnot.get("graphType").toString());
539 JSONObject diplaySettings = (JSONObject) alAnnot
540 .get("annotationSettings");
541 if (diplaySettings != null)
544 alignAnnot.scaleColLabel = (diplaySettings
545 .get("scaleColLabel") == null) ? false
546 : Boolean.valueOf(diplaySettings
547 .get("scaleColLabel").toString());
548 alignAnnot.showAllColLabels = (diplaySettings
549 .get("showAllColLabels") == null) ? true
550 : Boolean.valueOf(diplaySettings
551 .get("showAllColLabels").toString());
552 alignAnnot.centreColLabels = (diplaySettings
553 .get("centreColLabels") == null) ? true
554 : Boolean.valueOf(diplaySettings
555 .get("centreColLabels").toString());
556 alignAnnot.belowAlignment = (diplaySettings
557 .get("belowAlignment") == null) ? false
558 : Boolean.valueOf(diplaySettings
559 .get("belowAlignment").toString());
560 alignAnnot.visible = (diplaySettings.get("visible") == null)
563 diplaySettings.get("visible").toString());
564 alignAnnot.hasIcons = (diplaySettings.get("hasIcon") == null)
567 diplaySettings.get("hasIcon").toString());
570 if (alAnnot.get("score") != null)
572 alignAnnot.score = Double
573 .valueOf(alAnnot.get("score").toString());
576 String calcId = (alAnnot.get("calcId") == null) ? ""
577 : alAnnot.get("calcId").toString();
578 alignAnnot.setCalcId(calcId);
579 String seqHash = (alAnnot.get("sequenceRef") != null)
580 ? alAnnot.get("sequenceRef").toString()
583 Sequence sequence = (seqHash != null) ? seqMap.get(seqHash) : null;
584 if (sequence != null)
586 alignAnnot.sequenceRef = sequence;
587 sequence.addAlignmentAnnotation(alignAnnot);
588 if (alignAnnot.label.equalsIgnoreCase("T-COFFEE"))
590 alignAnnot.createSequenceMapping(sequence, sequence.getStart(),
592 sequence.addAlignmentAnnotation(alignAnnot);
593 alignAnnot.adjustForAlignment();
596 alignAnnot.validateRangeAndDisplay();
597 this.annotations.add(alignAnnot);
600 } catch (Exception e)
607 public void parseHiddenSeqRefsAsList(JSONObject jvSettingsJson)
609 hiddenSeqRefs = new ArrayList<>();
610 String hiddenSeqs = (String) jvSettingsJson.get("hiddenSeqs");
611 if (hiddenSeqs != null && !hiddenSeqs.isEmpty())
613 String[] seqRefs = hiddenSeqs.split(";");
614 for (String seqRef : seqRefs)
616 hiddenSeqRefs.add(seqRef);
621 public void parseHiddenCols(JSONObject jvSettingsJson)
623 String hiddenCols = (String) jvSettingsJson.get("hiddenCols");
624 if (hiddenCols != null && !hiddenCols.isEmpty())
626 hiddenColumns = new HiddenColumns();
627 String[] rangeStrings = hiddenCols.split(";");
628 for (String rangeString : rangeStrings)
630 String[] range = rangeString.split("-");
631 hiddenColumns.hideColumns(Integer.valueOf(range[0]),
632 Integer.valueOf(range[1]));
637 @SuppressWarnings("unchecked")
638 private void parseFeatures(JSONArray jsonSeqFeatures)
640 if (jsonSeqFeatures != null)
642 displayedFeatures = new FeaturesDisplayed();
643 for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures
644 .iterator(); seqFeatureItr.hasNext();)
646 JSONObject jsonFeature = seqFeatureItr.next();
647 Long begin = (Long) jsonFeature.get("xStart");
648 Long end = (Long) jsonFeature.get("xEnd");
649 String type = (String) jsonFeature.get("type");
650 String featureGrp = (String) jsonFeature.get("featureGroup");
651 String description = (String) jsonFeature.get("description");
652 String seqRef = (String) jsonFeature.get("sequenceRef");
653 Float score = Float.valueOf(jsonFeature.get("score").toString());
655 Sequence seq = seqMap.get(seqRef);
658 * begin/end of 0 is for a non-positional feature
660 int featureBegin = begin.intValue() == 0 ? 0 : seq
661 .findPosition(begin.intValue());
662 int featureEnd = end.intValue() == 0 ? 0 : seq.findPosition(end
665 SequenceFeature sequenceFeature = new SequenceFeature(type,
666 description, featureBegin, featureEnd, score, featureGrp);
668 JSONArray linksJsonArray = (JSONArray) jsonFeature.get("links");
669 if (linksJsonArray != null && linksJsonArray.size() > 0)
671 Iterator<String> linkList = linksJsonArray.iterator();
672 while (linkList.hasNext())
674 String link = linkList.next();
675 sequenceFeature.addLink(link);
679 seq.addSequenceFeature(sequenceFeature);
680 displayedFeatures.setVisible(type);
686 public String getGlobalColourScheme()
688 return globalColourScheme;
691 public void setGlobalColorScheme(String globalColourScheme)
693 this.globalColourScheme = globalColourScheme;
697 public FeaturesDisplayedI getDisplayedFeatures()
699 return displayedFeatures;
702 public void setDisplayedFeatures(FeaturesDisplayedI displayedFeatures)
704 this.displayedFeatures = displayedFeatures;
708 public void configureForView(AlignmentViewPanel avpanel)
714 super.configureForView(avpanel);
715 AlignViewportI viewport = avpanel.getAlignViewport();
716 AlignmentI alignment = viewport.getAlignment();
717 AlignmentAnnotation[] annots = alignment.getAlignmentAnnotation();
719 seqGroups = alignment.getGroups();
720 fr = avpanel.cloneFeatureRenderer();
722 // Add non auto calculated annotation to AlignFile
725 for (AlignmentAnnotation annot : annots)
727 if (annot != null && !annot.autoCalculated)
729 annotations.add(annot);
733 globalColourScheme = ColourSchemeProperty
734 .getColourName(viewport.getGlobalColourScheme());
735 setDisplayedFeatures(viewport.getFeaturesDisplayed());
736 showSeqFeatures = viewport.isShowSequenceFeatures();
741 public boolean isShowSeqFeatures()
743 return showSeqFeatures;
746 public void setShowSeqFeatures(boolean showSeqFeatures)
748 this.showSeqFeatures = showSeqFeatures;
751 public Vector<AlignmentAnnotation> getAnnotations()
757 public HiddenColumns getHiddenColumns()
759 return hiddenColumns;
762 public void setHiddenColumns(HiddenColumns hidden)
764 this.hiddenColumns = hidden;
768 public SequenceI[] getHiddenSequences()
770 if (hiddenSequences == null || hiddenSequences.isEmpty())
772 return new SequenceI[] {};
774 synchronized (hiddenSequences)
776 return hiddenSequences.toArray(new SequenceI[hiddenSequences.size()]);
780 public void setHiddenSequences(ArrayList<SequenceI> hiddenSequences)
782 this.hiddenSequences = hiddenSequences;
785 public class JSONExportSettings
787 private boolean exportSequence;
789 private boolean exportSequenceFeatures;
791 private boolean exportAnnotations;
793 private boolean exportGroups;
795 private boolean exportJalviewSettings;
797 public boolean isExportSequence()
799 return exportSequence;
802 public void setExportSequence(boolean exportSequence)
804 this.exportSequence = exportSequence;
807 public boolean isExportSequenceFeatures()
809 return exportSequenceFeatures;
812 public void setExportSequenceFeatures(boolean exportSequenceFeatures)
814 this.exportSequenceFeatures = exportSequenceFeatures;
817 public boolean isExportAnnotations()
819 return exportAnnotations;
822 public void setExportAnnotations(boolean exportAnnotations)
824 this.exportAnnotations = exportAnnotations;
827 public boolean isExportGroups()
832 public void setExportGroups(boolean exportGroups)
834 this.exportGroups = exportGroups;
837 public boolean isExportJalviewSettings()
839 return exportJalviewSettings;
842 public void setExportJalviewSettings(boolean exportJalviewSettings)
844 this.exportJalviewSettings = exportJalviewSettings;
849 * Returns a descriptor for suitable feature display settings with
851 * <li>ResNums or insertions features visible</li>
852 * <li>insertions features coloured red</li>
853 * <li>ResNum features coloured by label</li>
854 * <li>Insertions displayed above (on top of) ResNums</li>
858 public FeatureSettingsModelI getFeatureColourScheme()
860 return new PDBFeatureSettings();