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.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;
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;
53 import org.json.simple.JSONArray;
54 import org.json.simple.JSONObject;
55 import org.json.simple.parser.JSONParser;
57 public class JSONFile extends AlignFile
59 private ColourSchemeI colourScheme;
61 private String version = "2.9";
63 private String webstartUrl = "www.jalview.org/services/launchApp";
65 private String application = "Jalview";
67 public static final String FILE_EXT = "json";
69 public static final String FILE_DESC = "JSON";
71 private String globalColorScheme;
73 private boolean showSeqFeatures;
75 private Hashtable<String, Sequence> seqMap;
77 private FeaturesDisplayedI displayedFeatures;
79 private FeatureRenderer fr;
81 private JSONExportSettings jsonExportSettings;
88 public JSONFile(FileParse source) throws IOException
93 public JSONFile(String inFile, String type) throws IOException
99 public void parse() throws IOException
101 StringBuilder jsonStringBuilder = new StringBuilder();
103 while ((currentLine = nextLine()) != null)
105 jsonStringBuilder.append(currentLine);
107 parse(jsonStringBuilder.toString());
112 public String print()
114 String jsonOutput = null;
117 if (getJsonExportSettings() == null)
119 jsonExportSettings = new JSONExportSettings();
120 jsonExportSettings.setExportAnnotations(true);
121 jsonExportSettings.setExportGroups(true);
122 jsonExportSettings.setExportJalviewSettings(true);
123 jsonExportSettings.setExportSequenceFeatures(true);
126 AlignmentPojo jsonAlignmentPojo = new AlignmentPojo();
127 if (getViewport() != null)
129 globalColorScheme = ColourSchemeProperty
130 .getColourName(getViewport()
131 .getGlobalColourScheme());
132 setDisplayedFeatures(getViewport().getFeaturesDisplayed());
133 showSeqFeatures = getViewport().isShowSequenceFeatures();
134 fr = getViewport().getFeatureRenderer();
138 for (SequenceI seq : seqs)
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);
153 if (jsonExportSettings.isExportJalviewSettings())
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));
162 String[] hiddenSections = exportHiddenSections();
163 if (hiddenSections != null)
165 jsonAlignmentPojo.getAppSettings().put("hiddenCols",
166 String.valueOf(hiddenSections[0]));
167 jsonAlignmentPojo.getAppSettings().put("hiddenSeqs",
168 String.valueOf(hiddenSections[1]));
172 if (jsonExportSettings.isExportAnnotations())
175 .setAlignAnnotation(annotationToJsonPojo(annotations));
178 if (jsonExportSettings.isExportSequenceFeatures())
181 .setSeqFeatures(sequenceFeatureToJsonPojo(seqs, fr));
184 if (jsonExportSettings.isExportGroups() && seqGroups != null
185 && seqGroups.size() > 0)
187 for (SequenceGroup seqGrp : seqGroups)
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())
202 seqGrpPojo.getSeqsHash().add(
203 seq.getName() + "_" + seq.hashCode());
205 jsonAlignmentPojo.getSeqGroups().add(seqGrpPojo);
208 org.json.JSONObject generatedJSon = new org.json.JSONObject(
210 jsonOutput = generatedJSon.toString();
211 return jsonOutput.replaceAll("xstart", "xStart").replaceAll("xend",
213 } catch (Exception e)
220 public String[] exportHiddenSections()
222 String[] hiddenSections = new String[2];
223 if (getViewport() == null)
228 System.out.println("--- Hidden Sections ---");
229 // hidden column business
230 if (getViewport().hasHiddenColumns())
232 System.out.print("Hidden Cols : ");
233 List<int[]> hiddenCols = getViewport().getColumnSelection()
235 StringBuilder hiddenColsBuilder = new StringBuilder();
236 for (int[] range : hiddenCols)
238 hiddenColsBuilder.append(";").append(range[0]).append("-")
242 hiddenColsBuilder.deleteCharAt(0);
243 hiddenSections[0] = hiddenColsBuilder.toString();
244 System.out.println(hiddenSections[0]);
247 // hidden rows/seqs business
248 HiddenSequences hiddenSeqsObj = getViewport().getAlignment()
249 .getHiddenSequences();
250 if (hiddenSeqsObj == null)
252 return hiddenSections;
255 SequenceI[] hiddenSeqs = hiddenSeqsObj.hiddenSequences;
256 System.out.print("Hidden Seqs : ");
257 StringBuilder hiddenSeqsBuilder = new StringBuilder();
258 for (SequenceI hiddenSeq : hiddenSeqs)
260 if (hiddenSeq != null)
262 hiddenSeqsBuilder.append(";").append(hiddenSeq.hashCode());
265 if (hiddenSeqsBuilder.length() > 0)
267 hiddenSeqsBuilder.deleteCharAt(0);
269 hiddenSections[1] = hiddenSeqsBuilder.toString();
270 System.out.println(hiddenSections[1]);
271 return hiddenSections;
274 public static List<SequenceFeaturesPojo> sequenceFeatureToJsonPojo(
275 List<SequenceI> seqs, FeatureRenderer fr)
277 FeaturesDisplayedI displayedFeatures = (fr == null) ? null : fr
278 .getFeaturesDisplayed();
279 List<SequenceFeaturesPojo> sequenceFeaturesPojo = new ArrayList<SequenceFeaturesPojo>();
280 for (SequenceI seq : seqs)
282 SequenceI dataSetSequence = seq.getDatasetSequence();
283 SequenceFeature[] seqFeatures = (dataSetSequence == null) ? null
284 : seq.getDatasetSequence().getSequenceFeatures();
286 if (seqFeatures == null)
291 for (SequenceFeature sf : seqFeatures)
293 if (displayedFeatures != null
294 && displayedFeatures.isVisible(sf.getType()))
296 SequenceFeaturesPojo jsonFeature = new SequenceFeaturesPojo(
297 seq.getName() + "_" + seq.hashCode());
298 String featureColour = (fr == null) ? null : jalview.util.Format
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);
315 return sequenceFeaturesPojo;
318 public static List<AlignmentAnnotationPojo> annotationToJsonPojo(
319 Vector<AlignmentAnnotation> annotations)
321 List<AlignmentAnnotationPojo> jsonAnnotations = new ArrayList<AlignmentAnnotationPojo>();
322 if (annotations == null)
324 return jsonAnnotations;
326 for (AlignmentAnnotation annot : annotations)
328 AlignmentAnnotationPojo alignAnnotPojo = new AlignmentAnnotationPojo();
329 alignAnnotPojo.setDescription(annot.description);
330 alignAnnotPojo.setLabel(annot.label);
331 for (Annotation annotation : annot.annotations)
333 AnnotationPojo annotationPojo = new AnnotationPojo();
334 if (annotation != null)
336 annotationPojo.setDescription(annotation.description);
337 annotationPojo.setValue(annotation.value);
339 .setSecondaryStructure(annotation.secondaryStructure);
340 annotationPojo.setDisplayCharacter(annotation.displayCharacter);
341 alignAnnotPojo.getAnnotations().add(annotationPojo);
345 alignAnnotPojo.getAnnotations().add(annotationPojo);
348 jsonAnnotations.add(alignAnnotPojo);
350 return jsonAnnotations;
353 @SuppressWarnings("unchecked")
354 public JSONFile parse(String jsonAlignmentString)
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
366 JSONArray seqGrpJsonArray = (JSONArray) alignmentJsonObj
368 JSONObject jvSettingsJsonObj = (JSONObject) alignmentJsonObj
371 if (jvSettingsJsonObj != null)
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);
381 seqMap = new Hashtable<String, Sequence>();
382 for (Iterator<JSONObject> sequenceIter = seqJsonArray.iterator(); sequenceIter
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,
394 seqMap.put(seqUniqueId, seq);
396 parseFeatures(jsonSeqArray);
398 for (Iterator<JSONObject> seqGrpIter = seqGrpJsonArray.iterator(); seqGrpIter
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")
410 boolean colourText = Boolean.valueOf(seqGrpObj.get("colourText")
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");
419 ArrayList<SequenceI> grpSeqs = new ArrayList<SequenceI>();
420 if (seqsHashArray.size() > 0)
422 Iterator<String> seqHashIter = seqsHashArray.iterator();
423 while (seqHashIter.hasNext())
425 String seqHash = seqHashIter.next();
426 Sequence sequence = seqMap.get(seqHash);
427 if (sequence != null)
429 grpSeqs.add(sequence);
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);
442 for (Iterator<JSONObject> alAnnotIter = alAnnotJsonArray.iterator(); alAnnotIter
445 JSONObject alAnnot = alAnnotIter.next();
446 JSONArray annotJsonArray = (JSONArray) alAnnot.get("annotations");
447 Annotation[] annotations = new Annotation[annotJsonArray.size()];
449 for (Iterator<JSONObject> annotIter = annotJsonArray.iterator(); annotIter
452 JSONObject annot = annotIter.next();
455 annotations[count] = null;
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();
464 char ss = annot.get("secondaryStructure") == null ? ' '
465 : annot.get("secondaryStructure").toString().charAt(0);
466 String displayChar = annot.get("displayCharacter").toString();
468 annotations[count] = new Annotation(displayChar, desc, ss, val);
473 AlignmentAnnotation alignAnnot = new AlignmentAnnotation(alAnnot
474 .get("label").toString(), alAnnot.get("description")
475 .toString(), annotations);
476 this.annotations.add(alignAnnot);
479 } catch (Exception e)
487 @SuppressWarnings("unchecked")
488 private void parseFeatures(JSONArray jsonSeqFeatures)
490 if (jsonSeqFeatures != null)
492 for (Iterator<JSONObject> seqFeatureItr = jsonSeqFeatures.iterator(); seqFeatureItr
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;
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)
512 Iterator<String> linkList = linksJsonArray.iterator();
513 while (linkList.hasNext())
515 String link = linkList.next();
516 sequenceFeature.addLink(link);
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);
530 public static ColourSchemeI getJalviewColorScheme(
531 String bioJsColourSchemeName)
533 ColourSchemeI jalviewColor = null;
534 for (JalviewBioJsColorSchemeMapper cs : JalviewBioJsColorSchemeMapper
537 if (cs.getBioJsName().equalsIgnoreCase(bioJsColourSchemeName))
539 jalviewColor = cs.getJvColourScheme();
546 public void applySettingsToAlignFrame(AlignViewControllerGuiI af)
548 af.setShowSeqFeatures(isShowSeqFeatures());
549 af.changeColour(getColourScheme());
550 af.setMenusForViewport();
553 public String getGlobalColorScheme()
555 return globalColorScheme;
558 public void setGlobalColorScheme(String globalColorScheme)
560 this.globalColorScheme = globalColorScheme;
563 public ColourSchemeI getColourScheme()
568 public void setColourScheme(ColourSchemeI colourScheme)
570 this.colourScheme = colourScheme;
573 public FeaturesDisplayedI getDisplayedFeatures()
575 return displayedFeatures;
578 public void setDisplayedFeatures(FeaturesDisplayedI displayedFeatures)
580 this.displayedFeatures = displayedFeatures;
583 public JSONExportSettings getJsonExportSettings()
585 return jsonExportSettings;
588 public void setJsonExportSettings(JSONExportSettings jsonExportSettings)
590 this.jsonExportSettings = jsonExportSettings;
593 public static String getJSONData(AlignViewportI av)
595 JSONFile jsonFile = new JSONFile();
596 jsonFile.setViewport(av);
597 jsonFile.seqGroups = av.getAlignment().getGroups();
598 jsonFile.setDisplayedFeatures(av.getFeaturesDisplayed());
600 for (SequenceI seq : av.getAlignment().getSequences())
602 jsonFile.seqs.add(seq);
605 // Add non auto calculated annotation to AlignFile
606 for (AlignmentAnnotation annot : av.getAlignment()
607 .getAlignmentAnnotation())
609 if (annot != null && !annot.autoCalculated)
611 if (annot.label.equals("PDB.CATempFactor"))
615 jsonFile.annotations.add(annot);
618 String jsonString = jsonFile.print();
622 public boolean isShowSeqFeatures()
624 return showSeqFeatures;
627 public void setShowSeqFeatures(boolean showSeqFeatures)
629 this.showSeqFeatures = showSeqFeatures;
632 public Vector<AlignmentAnnotation> getAnnotations()
637 public class JSONExportSettings
639 private boolean exportSequence;
641 private boolean exportSequenceFeatures;
643 private boolean exportAnnotations;
645 private boolean exportGroups;
647 private boolean exportJalviewSettings;
649 public boolean isExportSequence()
651 return exportSequence;
654 public void setExportSequence(boolean exportSequence)
656 this.exportSequence = exportSequence;
659 public boolean isExportSequenceFeatures()
661 return exportSequenceFeatures;
664 public void setExportSequenceFeatures(boolean exportSequenceFeatures)
666 this.exportSequenceFeatures = exportSequenceFeatures;
669 public boolean isExportAnnotations()
671 return exportAnnotations;
674 public void setExportAnnotations(boolean exportAnnotations)
676 this.exportAnnotations = exportAnnotations;
679 public boolean isExportGroups()
684 public void setExportGroups(boolean exportGroups)
686 this.exportGroups = exportGroups;
689 public boolean isExportJalviewSettings()
691 return exportJalviewSettings;
694 public void setExportJalviewSettings(boolean exportJalviewSettings)
696 this.exportJalviewSettings = exportJalviewSettings;