5e2139e5d3734722ae905925d27ca759a3618871
[jalview.git] / src / jalview / io / JSONFile.java
1 /*
2  * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
3  * Copyright (C) $$Year-Rel$$ The Jalview Authors
4  * 
5  * This file is part of Jalview.
6  * 
7  * Jalview is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License 
9  * as published by the Free Software Foundation, either version 3
10  * of the License, or (at your option) any later version.
11  *  
12  * Jalview is distributed in the hope that it will be useful, but 
13  * WITHOUT ANY WARRANTY; without even the implied warranty 
14  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
15  * PURPOSE.  See the GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with Jalview.  If not, see <http://www.gnu.org/licenses/>.
19  * The Jalview Authors are detailed in the 'AUTHORS' file.
20  */
21
22 package jalview.io;
23
24 import jalview.api.AlignViewControllerGuiI;
25 import jalview.api.AlignViewportI;
26 import jalview.api.FeatureRenderer;
27 import jalview.api.FeaturesDisplayedI;
28 import jalview.datamodel.AlignmentAnnotation;
29 import jalview.datamodel.Annotation;
30 import jalview.datamodel.HiddenSequences;
31 import jalview.datamodel.Sequence;
32 import jalview.datamodel.SequenceFeature;
33 import jalview.datamodel.SequenceGroup;
34 import jalview.datamodel.SequenceI;
35 import jalview.json.binding.v1.AlignmentAnnotationPojo;
36 import jalview.json.binding.v1.AlignmentPojo;
37 import jalview.json.binding.v1.AlignmentPojo.JalviewBioJsColorSchemeMapper;
38 import jalview.json.binding.v1.AnnotationPojo;
39 import jalview.json.binding.v1.SequenceFeaturesPojo;
40 import jalview.json.binding.v1.SequenceGrpPojo;
41 import jalview.json.binding.v1.SequencePojo;
42 import jalview.schemes.ColourSchemeI;
43 import jalview.schemes.ColourSchemeProperty;
44
45 import java.awt.Color;
46 import java.io.IOException;
47 import java.util.ArrayList;
48 import java.util.Hashtable;
49 import java.util.Iterator;
50 import java.util.List;
51 import java.util.Vector;
52
53 import org.json.simple.JSONArray;
54 import org.json.simple.JSONObject;
55 import org.json.simple.parser.JSONParser;
56
57 public class JSONFile extends AlignFile
58 {
59   private ColourSchemeI colourScheme;
60
61   private String version = "2.9";
62
63   private String webstartUrl = "www.jalview.org/services/launchApp";
64
65   private String application = "Jalview";
66
67   public static final String FILE_EXT = "json";
68
69   public static final String FILE_DESC = "JSON";
70
71   private String globalColorScheme;
72
73   private boolean showSeqFeatures;
74
75   private Hashtable<String, Sequence> seqMap;
76
77   private FeaturesDisplayedI displayedFeatures;
78
79   private FeatureRenderer fr;
80
81   private JSONExportSettings jsonExportSettings;
82
83   public JSONFile()
84   {
85     super();
86   }
87
88   public JSONFile(FileParse source) throws IOException
89   {
90     super(source);
91   }
92
93   public JSONFile(String inFile, String type) throws IOException
94   {
95     super(inFile, type);
96   }
97
98   @Override
99   public void parse() throws IOException
100   {
101     StringBuilder jsonStringBuilder = new StringBuilder();
102     String currentLine;
103     while ((currentLine = nextLine()) != null)
104     {
105       jsonStringBuilder.append(currentLine);
106     }
107     parse(jsonStringBuilder.toString());
108
109   }
110
111   @Override
112   public String print()
113   {
114     String jsonOutput = null;
115     try
116     {
117       if (getJsonExportSettings() == null)
118       {
119         jsonExportSettings = new JSONExportSettings();
120         jsonExportSettings.setExportAnnotations(true);
121         jsonExportSettings.setExportGroups(true);
122         jsonExportSettings.setExportJalviewSettings(true);
123         jsonExportSettings.setExportSequenceFeatures(true);
124       }
125
126       AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
127       if (getViewport() != null)
128       {
129         globalColorScheme = ColourSchemeProperty
130                 .getColourName(getViewport()
131                 .getGlobalColourScheme());
132         setDisplayedFeatures(getViewport().getFeaturesDisplayed());
133         showSeqFeatures = getViewport().isShowSequenceFeatures();
134         fr = getViewport().getFeatureRenderer();
135       }
136
137       int count = 0;
138       for (SequenceI seq : seqs)
139       {
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(seq.getName() + "_" + 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);
151       }
152
153       if (jsonExportSettings.isExportJalviewSettings())
154       {
155         jsonAlignmentPojo.setGlobalColorScheme(globalColorScheme);
156         jsonAlignmentPojo.getAppSettings().put("application", application);
157         jsonAlignmentPojo.getAppSettings().put("version", version);
158         jsonAlignmentPojo.getAppSettings().put("webStartUrl", webstartUrl);
159         jsonAlignmentPojo.getAppSettings().put("showSeqFeatures",
160                 String.valueOf(showSeqFeatures));
161
162         String[] hiddenSections = exportHiddenSections();
163         if (hiddenSections != null)
164         {
165           jsonAlignmentPojo.getAppSettings().put("hiddenCols",
166                   String.valueOf(hiddenSections[0]));
167           jsonAlignmentPojo.getAppSettings().put("hiddenSeqs",
168                   String.valueOf(hiddenSections[1]));
169         }
170       }
171
172       if (jsonExportSettings.isExportAnnotations())
173       {
174         jsonAlignmentPojo
175                 .setAlignAnnotation(annotationToJsonPojo(annotations));
176       }
177
178       if (jsonExportSettings.isExportSequenceFeatures())
179       {
180         jsonAlignmentPojo
181                 .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr));
182       }
183
184       if (jsonExportSettings.isExportGroups() && seqGroups != null
185               && seqGroups.size() > 0)
186       {
187         for (SequenceGroup seqGrp : seqGroups)
188         {
189           SequenceGrpPojo seqGrpPojo = new SequenceGrpPojo();
190           seqGrpPojo.setGroupName(seqGrp.getName());
191           seqGrpPojo.setColourScheme(ColourSchemeProperty
192                   .getColourName(seqGrp.cs));
193           seqGrpPojo.setColourText(seqGrp.getColourText());
194           seqGrpPojo.setDescription(seqGrp.getDescription());
195           seqGrpPojo.setDisplayBoxes(seqGrp.getDisplayBoxes());
196           seqGrpPojo.setDisplayText(seqGrp.getDisplayText());
197           seqGrpPojo.setEndRes(seqGrp.getEndRes());
198           seqGrpPojo.setStartRes(seqGrp.getStartRes());
199           seqGrpPojo.setShowNonconserved(seqGrp.getShowNonconserved());
200           for (SequenceI seq : seqGrp.getSequences())
201           {
202             seqGrpPojo.getSeqsHash().add(
203                     seq.getName() + "_" + seq.hashCode());
204           }
205           jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo);
206         }
207       }
208       org.json.JSONObject generatedJSon = new org.json.JSONObject(
209               jsonAlignmentPojo);
210       jsonOutput = generatedJSon.toString();
211       return jsonOutput.replaceAll("xstart", "xStart").replaceAll("xend",
212               "xEnd");
213     } catch (Exception e)
214     {
215       e.printStackTrace();
216     }
217     return jsonOutput;
218   }
219
220   public String[] exportHiddenSections()
221   {
222     String[] hiddenSections = new String[2];
223     if (getViewport() == null)
224     {
225       return null;
226     }
227
228     System.out.println("--- Hidden Sections ---");
229     // hidden column business
230     if (getViewport().hasHiddenColumns())
231     {
232       System.out.print("Hidden Cols : ");
233       List<int[]> hiddenCols = getViewport().getColumnSelection()
234               .getHiddenColumns();
235       StringBuilder hiddenColsBuilder = new StringBuilder();
236       for (int[] range : hiddenCols)
237       {
238         hiddenColsBuilder.append(";").append(range[0]).append("-")
239                 .append(range[1]);
240       }
241
242       hiddenColsBuilder.deleteCharAt(0);
243       hiddenSections[0] = hiddenColsBuilder.toString();
244       System.out.println(hiddenSections[0]);
245     }
246
247     // hidden rows/seqs business
248     HiddenSequences hiddenSeqsObj = getViewport().getAlignment()
249             .getHiddenSequences();
250     if (hiddenSeqsObj == null)
251     {
252       return hiddenSections;
253     }
254
255     SequenceI[] hiddenSeqs = hiddenSeqsObj.hiddenSequences;
256     System.out.print("Hidden Seqs : ");
257     StringBuilder hiddenSeqsBuilder = new StringBuilder();
258     for (SequenceI hiddenSeq : hiddenSeqs)
259     {
260       if (hiddenSeq != null)
261       {
262         hiddenSeqsBuilder.append(";").append(hiddenSeq.hashCode());
263       }
264     }
265     if (hiddenSeqsBuilder.length() > 0)
266     {
267       hiddenSeqsBuilder.deleteCharAt(0);
268     }
269     hiddenSections[1] = hiddenSeqsBuilder.toString();
270     System.out.println(hiddenSections[1]);
271     return hiddenSections;
272   }
273
274   public static List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
275           List<SequenceI> seqs, FeatureRenderer fr)
276   {
277     FeaturesDisplayedI displayedFeatures = (fr == null) ? null : fr
278             .getFeaturesDisplayed();
279     List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<SequenceFeaturesPojo>();
280     for (SequenceI seq : seqs)
281     {
282       SequenceI dataSetSequence = seq.getDatasetSequence();
283       SequenceFeature[] seqFeatures = (dataSetSequence == null) ? null
284               : seq.getDatasetSequence().getSequenceFeatures();
285
286       if (seqFeatures == null)
287       {
288         continue;
289       }
290
291       for (SequenceFeature sf : seqFeatures)
292       {
293         if (displayedFeatures != null
294                 && displayedFeatures.isVisible(sf.getType()))
295         {
296           SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo(
297                   seq.getName() + "_" + seq.hashCode());
298           String featureColour = (fr == null) ? null : jalview.util.Format
299                   .getHexString(fr
300                   .findFeatureColour(Color.white, seq,
301                           seq.findIndex(sf.getBegin())));
302           jsonFeature.setXstart(seq.findIndex(sf.getBegin()) - 1);
303           jsonFeature.setXend(seq.findIndex(sf.getEnd()));
304           jsonFeature.setType(sf.getType());
305           jsonFeature.setDescription(sf.getDescription());
306           jsonFeature.setLinks(sf.links);
307           jsonFeature.setOtherDetails(sf.otherDetails);
308           jsonFeature.setScore(sf.getScore());
309           jsonFeature.setFillColor(featureColour);
310           jsonFeature.setFeatureGroup(sf.getFeatureGroup());
311           sequenceFeaturesPojo.add(jsonFeature);
312         }
313       }
314     }
315     return sequenceFeaturesPojo;
316   }
317
318   public static List<AlignmentAnnotationPojo> annotationToJsonPojo(
319           Vector<AlignmentAnnotation> annotations)
320   {
321     List<AlignmentAnnotationPojo> jsonAnnotations = new ArrayList<AlignmentAnnotationPojo>();
322     if (annotations == null)
323     {
324       return jsonAnnotations;
325     }
326     for (AlignmentAnnotation annot : annotations)
327     {
328       AlignmentAnnotationPojo alignAnnotPojo = new AlignmentAnnotationPojo();
329       alignAnnotPojo.setDescription(annot.description);
330       alignAnnotPojo.setLabel(annot.label);
331       for (Annotation annotation : annot.annotations)
332       {
333         AnnotationPojo annotationPojo = new AnnotationPojo();
334         if (annotation != null)
335         {
336           annotationPojo.setDescription(annotation.description);
337           annotationPojo.setValue(annotation.value);
338           annotationPojo
339                   .setSecondaryStructure(annotation.secondaryStructure);
340           annotationPojo.setDisplayCharacter(annotation.displayCharacter);
341           alignAnnotPojo.getAnnotations().add(annotationPojo);
342         }
343         else
344         {
345           alignAnnotPojo.getAnnotations().add(annotationPojo);
346         }
347       }
348       jsonAnnotations.add(alignAnnotPojo);
349     }
350     return jsonAnnotations;
351   }
352
353   @SuppressWarnings("unchecked")
354   public JSONFile parse(String jsonAlignmentString)
355   {
356     try
357     {
358       JSONParser jsonParser = new JSONParser();
359       JSONObject alignmentJsonObj = (JSONObject) jsonParser
360               .parse(jsonAlignmentString);
361       JSONArray seqJsonArray = (JSONArray) alignmentJsonObj.get("seqs");
362       JSONArray alAnnotJsonArray = (JSONArray) alignmentJsonObj
363               .get("alignAnnotation");
364       JSONArray jsonSeqArray = (JSONArray) alignmentJsonObj
365               .get("seqFeatures");
366       JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj
367               .get("seqGroups");
368       JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj
369               .get("appSettings");
370
371       if (jvSettingsJsonObj != null)
372       {
373         String jsColourScheme = (String) jvSettingsJsonObj
374                 .get("globalColorScheme");
375         Boolean showFeatures = Boolean.valueOf(jvSettingsJsonObj.get(
376                 "showSeqFeatures").toString());
377         setColourScheme(getJalviewColorScheme(jsColourScheme));
378         setShowSeqFeatures(showFeatures);
379       }
380
381       seqMap = new Hashtable<String, Sequence>();
382       for (Iterator<JSONObject> sequenceIter = seqJsonArray.iterator(); sequenceIter
383               .hasNext();)
384       {
385         JSONObject sequence = sequenceIter.next();
386         String sequcenceString = sequence.get("seq").toString();
387         String sequenceName = sequence.get("name").toString();
388         String seqUniqueId = sequence.get("id").toString();
389         int start = Integer.valueOf(sequence.get("start").toString());
390         int end = Integer.valueOf(sequence.get("end").toString());
391         Sequence seq = new Sequence(sequenceName, sequcenceString, start,
392                 end);
393         seqs.add(seq);
394         seqMap.put(seqUniqueId, seq);
395       }
396       parseFeatures(jsonSeqArray);
397
398       for (Iterator<JSONObject> seqGrpIter = seqGrpJsonArray.iterator(); seqGrpIter
399               .hasNext();)
400       {
401         JSONObject seqGrpObj = seqGrpIter.next();
402         String grpName = seqGrpObj.get("groupName").toString();
403         String colourScheme = seqGrpObj.get("colourScheme").toString();
404         String description = (seqGrpObj.get("description") == null) ? null
405                 : seqGrpObj.get("description").toString();
406         boolean displayBoxes = Boolean.valueOf(seqGrpObj
407                 .get("displayBoxes").toString());
408         boolean displayText = Boolean.valueOf(seqGrpObj.get("displayText")
409                 .toString());
410         boolean colourText = Boolean.valueOf(seqGrpObj.get("colourText")
411                 .toString());
412         boolean showNonconserved = Boolean.valueOf(seqGrpObj.get(
413                 "showNonconserved").toString());
414         int startRes = Integer
415                 .valueOf(seqGrpObj.get("startRes").toString());
416         int endRes = Integer.valueOf(seqGrpObj.get("endRes").toString());
417         JSONArray seqsHashArray = (JSONArray) seqGrpObj.get("seqsHash");
418
419         ArrayList<SequenceI> grpSeqs = new ArrayList<SequenceI>();
420         if (seqsHashArray.size() > 0)
421         {
422           Iterator<String> seqHashIter = seqsHashArray.iterator();
423           while (seqHashIter.hasNext())
424           {
425             String seqHash = seqHashIter.next();
426             Sequence sequence = seqMap.get(seqHash);
427             if (sequence != null)
428             {
429               grpSeqs.add(sequence);
430             }
431           }
432         }
433         ColourSchemeI scheme = getJalviewColorScheme(colourScheme);
434         SequenceGroup seqGrp = new SequenceGroup(grpSeqs, grpName, scheme,
435                 displayBoxes, displayText, colourText, startRes, endRes);
436         seqGrp.setShowNonconserved(showNonconserved);
437         seqGrp.setDescription(description);
438         this.seqGroups.add(seqGrp);
439
440       }
441
442       for (Iterator<JSONObject> alAnnotIter = alAnnotJsonArray.iterator(); alAnnotIter
443               .hasNext();)
444       {
445         JSONObject alAnnot = alAnnotIter.next();
446         JSONArray annotJsonArray = (JSONArray) alAnnot.get("annotations");
447         Annotation[] annotations = new Annotation[annotJsonArray.size()];
448         int count = 0;
449         for (Iterator<JSONObject> annotIter = annotJsonArray.iterator(); annotIter
450                 .hasNext();)
451         {
452           JSONObject annot = annotIter.next();
453           if (annot == null)
454           {
455             annotations[count] = null;
456           }
457           else
458           {
459             float val = annot.get("value") == null ? null : Float
460                     .valueOf(annot.get("value").toString());
461             String desc = annot.get("description") == null ? null : annot
462                     .get("description").toString();
463
464             char ss = annot.get("secondaryStructure") == null ? ' '
465                     : annot.get("secondaryStructure").toString().charAt(0);
466             String displayChar = annot.get("displayCharacter").toString();
467
468             annotations[count] = new Annotation(displayChar, desc, ss, val);
469           }
470           ++count;
471         }
472
473         AlignmentAnnotation alignAnnot = new AlignmentAnnotation(alAnnot
474                 .get("label").toString(), alAnnot.get("description")
475                 .toString(), annotations);
476         this.annotations.add(alignAnnot);
477       }
478
479     } catch (Exception e)
480     {
481       e.printStackTrace();
482     }
483     return this;
484   }
485
486
487   @SuppressWarnings("unchecked")
488   private void parseFeatures(JSONArray jsonSeqFeatures)
489   {
490     if (jsonSeqFeatures != null)
491     {
492       for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr
493               .hasNext();)
494       {
495         JSONObject jsonFeature = seqFeatureItr.next();
496         Long begin = (Long) jsonFeature.get("xStart");
497         Long end = (Long) jsonFeature.get("xEnd");
498         String type = (String) jsonFeature.get("type");
499         String featureGrp = (String) jsonFeature.get("featureGroup");
500         String descripiton = (String) jsonFeature.get("description");
501         String seqRef = (String) jsonFeature.get("sequenceRef");
502         Float score = Float.valueOf(jsonFeature.get("score").toString());
503         // Hashtable otherDetails = (Hashtable) jsonFeature
504         // .get("otherDetails");
505         // sequenceFeature.otherDetails = otherDetails;
506
507         Sequence seq = seqMap.get(seqRef);
508         SequenceFeature sequenceFeature = new SequenceFeature();
509         JSONArray linksJsonArray = (JSONArray) jsonFeature.get("links");
510         if (linksJsonArray != null && linksJsonArray.size() > 0)
511         {
512           Iterator<String> linkList = linksJsonArray.iterator();
513           while (linkList.hasNext())
514           {
515             String link = linkList.next();
516             sequenceFeature.addLink(link);
517           }
518         }
519         sequenceFeature.setFeatureGroup(featureGrp);
520         sequenceFeature.setScore(score);
521         sequenceFeature.setDescription(descripiton);
522         sequenceFeature.setType(type);
523         sequenceFeature.setBegin(seq.findPosition(begin.intValue()));
524         sequenceFeature.setEnd(seq.findPosition(end.intValue()) - 1);
525         seq.addSequenceFeature(sequenceFeature);
526       }
527     }
528   }
529
530   public static ColourSchemeI getJalviewColorScheme(
531           String bioJsColourSchemeName)
532   {
533     ColourSchemeI jalviewColor = null;
534     for (JalviewBioJsColorSchemeMapper cs : JalviewBioJsColorSchemeMapper
535             .values())
536     {
537       if (cs.getBioJsName().equalsIgnoreCase(bioJsColourSchemeName))
538       {
539         jalviewColor = cs.getJvColourScheme();
540         break;
541       }
542     }
543     return jalviewColor;
544   }
545
546   public void applySettingsToAlignFrame(AlignViewControllerGuiI af)
547   {
548     af.setShowSeqFeatures(isShowSeqFeatures());
549     af.changeColour(getColourScheme());
550     af.setMenusForViewport();
551   }
552
553   public String getGlobalColorScheme()
554   {
555     return globalColorScheme;
556   }
557
558   public void setGlobalColorScheme(String globalColorScheme)
559   {
560     this.globalColorScheme = globalColorScheme;
561   }
562
563   public ColourSchemeI getColourScheme()
564   {
565     return colourScheme;
566   }
567
568   public void setColourScheme(ColourSchemeI colourScheme)
569   {
570     this.colourScheme = colourScheme;
571   }
572
573   public FeaturesDisplayedI getDisplayedFeatures()
574   {
575     return displayedFeatures;
576   }
577
578   public void setDisplayedFeatures(FeaturesDisplayedI displayedFeatures)
579   {
580     this.displayedFeatures = displayedFeatures;
581   }
582
583   public JSONExportSettings getJsonExportSettings()
584   {
585     return jsonExportSettings;
586   }
587
588   public void setJsonExportSettings(JSONExportSettings jsonExportSettings)
589   {
590     this.jsonExportSettings = jsonExportSettings;
591   }
592
593   public static String getJSONData(AlignViewportI av)
594   {
595     JSONFile jsonFile = new JSONFile();
596     jsonFile.setViewport(av);
597     jsonFile.seqGroups = av.getAlignment().getGroups();
598     jsonFile.setDisplayedFeatures(av.getFeaturesDisplayed());
599
600     for (SequenceI seq : av.getAlignment().getSequences())
601     {
602       jsonFile.seqs.add(seq);
603     }
604   
605     // Add non auto calculated annotation to AlignFile
606     for (AlignmentAnnotation annot : av.getAlignment()
607             .getAlignmentAnnotation())
608     {
609       if (annot != null && !annot.autoCalculated)
610       {
611         if (annot.label.equals("PDB.CATempFactor"))
612         {
613           continue;
614         }
615         jsonFile.annotations.add(annot);
616       }
617     }
618     String jsonString = jsonFile.print();
619     return jsonString;
620   }
621
622   public boolean isShowSeqFeatures()
623   {
624     return showSeqFeatures;
625   }
626
627   public void setShowSeqFeatures(boolean showSeqFeatures)
628   {
629     this.showSeqFeatures = showSeqFeatures;
630   }
631
632   public Vector<AlignmentAnnotation> getAnnotations()
633   {
634     return annotations;
635   }
636
637   public class JSONExportSettings
638   {
639     private boolean exportSequence;
640
641     private boolean exportSequenceFeatures;
642
643     private boolean exportAnnotations;
644
645     private boolean exportGroups;
646
647     private boolean exportJalviewSettings;
648
649     public boolean isExportSequence()
650     {
651       return exportSequence;
652     }
653
654     public void setExportSequence(boolean exportSequence)
655     {
656       this.exportSequence = exportSequence;
657     }
658
659     public boolean isExportSequenceFeatures()
660     {
661       return exportSequenceFeatures;
662     }
663
664     public void setExportSequenceFeatures(boolean exportSequenceFeatures)
665     {
666       this.exportSequenceFeatures = exportSequenceFeatures;
667     }
668
669     public boolean isExportAnnotations()
670     {
671       return exportAnnotations;
672     }
673
674     public void setExportAnnotations(boolean exportAnnotations)
675     {
676       this.exportAnnotations = exportAnnotations;
677     }
678
679     public boolean isExportGroups()
680     {
681       return exportGroups;
682     }
683
684     public void setExportGroups(boolean exportGroups)
685     {
686       this.exportGroups = exportGroups;
687     }
688
689     public boolean isExportJalviewSettings()
690     {
691       return exportJalviewSettings;
692     }
693
694     public void setExportJalviewSettings(boolean exportJalviewSettings)
695     {
696       this.exportJalviewSettings = exportJalviewSettings;
697     }
698   }
699 }