X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Fgui%2FJalview2XML.java;h=e88b190a79833cc354bbde21e6f1dd3114df8b14;hb=8f2bef6f91e7a6e47e41e78a82f45f7e406ef90a;hp=115477d0f010ac32245c3e82cec3c4ab3c0756f7;hpb=ca74dc496f023941a3cf5f452506cfb44db211ac;p=jalview.git
diff --git a/src/jalview/gui/Jalview2XML.java b/src/jalview/gui/Jalview2XML.java
old mode 100755
new mode 100644
index 115477d..e88b190
--- a/src/jalview/gui/Jalview2XML.java
+++ b/src/jalview/gui/Jalview2XML.java
@@ -1,42 +1,49 @@
/*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.4)
- * Copyright (C) 2008 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8)
+ * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle
*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
+ * This file is part of Jalview.
*
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ * You should have received a copy of the GNU General Public License along with Jalview. If not, see .
*/
package jalview.gui;
import java.awt.Rectangle;
import java.io.*;
+import java.lang.reflect.InvocationTargetException;
import java.net.*;
import java.util.*;
+import java.util.Map.Entry;
import java.util.jar.*;
import javax.swing.*;
import org.exolab.castor.xml.*;
-import uk.ac.vamsas.objects.utils.MapList;
import jalview.bin.Cache;
import jalview.datamodel.Alignment;
+import jalview.datamodel.AlignmentAnnotation;
import jalview.datamodel.AlignmentI;
import jalview.datamodel.SequenceI;
import jalview.schemabinding.version2.*;
import jalview.schemes.*;
-import jalview.structure.StructureSelectionManager;
+import jalview.util.Platform;
import jalview.util.jarInputStreamProvider;
+import jalview.ws.jws2.Jws2Discoverer;
+import jalview.ws.jws2.dm.AAConSettings;
+import jalview.ws.jws2.jabaws2.Jws2Instance;
+import jalview.ws.params.ArgumentI;
+import jalview.ws.params.AutoCalcSetting;
+import jalview.ws.params.WsParamSetI;
/**
* Write out the current jalview desktop state as a Jalview XML stream.
@@ -46,7 +53,7 @@ import jalview.util.jarInputStreamProvider;
* will be :)
*
* @author $author$
- * @version $Revision$
+ * @version $Revision: 1.134 $
*/
public class Jalview2XML
{
@@ -401,19 +408,19 @@ public class Jalview2XML
* JarOutputStream
*
* @param ap
- * panel to create jalview model for
+ * panel to create jalview model for
* @param fileName
- * name of alignment panel written to output stream
+ * name of alignment panel written to output stream
* @param jout
- * jar output stream
+ * jar output stream
* @param out
- * jar entry name
+ * jar entry name
*/
public JalviewModel SaveState(AlignmentPanel ap, String fileName,
JarOutputStream jout)
{
initSeqRefs();
-
+ Vector jmolViewIds = new Vector(); //
Vector userColours = new Vector();
AlignViewport av = ap.av;
@@ -424,9 +431,9 @@ public class Jalview2XML
object.setCreationDate(new java.util.Date(System.currentTimeMillis()));
object.setVersion(jalview.bin.Cache.getProperty("VERSION"));
- jalview.datamodel.AlignmentI jal = av.alignment;
+ jalview.datamodel.AlignmentI jal = av.getAlignment();
- if (av.hasHiddenRows)
+ if (av.hasHiddenRows())
{
jal = jal.getHiddenSequences().getFullAlignment();
}
@@ -456,6 +463,7 @@ public class Jalview2XML
}
JSeq jseq;
+ Set calcIdSet = new HashSet();
// SAVE SEQUENCES
String id = "";
@@ -495,15 +503,14 @@ public class Jalview2XML
jseq.setId(id); // jseq id should be a string not a number
- if (av.hasHiddenRows)
+ if (av.hasHiddenRows())
{
- jseq.setHidden(av.alignment.getHiddenSequences().isHidden(jds));
+ jseq.setHidden(av.getAlignment().getHiddenSequences().isHidden(jds));
- if (av.hiddenRepSequences != null
- && av.hiddenRepSequences.containsKey(jal.getSequenceAt(i)))
+ if (av.isHiddenRepSequence(jal.getSequenceAt(i)))
{
- jalview.datamodel.SequenceI[] reps = ((jalview.datamodel.SequenceGroup) av.hiddenRepSequences
- .get(jal.getSequenceAt(i))).getSequencesInOrder(jal);
+ jalview.datamodel.SequenceI[] reps = av.getRepresentedSequences(
+ jal.getSequenceAt(i)).getSequencesInOrder(jal);
for (int h = 0; h < reps.length; h++)
{
@@ -574,41 +581,82 @@ public class Jalview2XML
AppJmol jmol;
// This must have been loaded, is it still visible?
JInternalFrame[] frames = Desktop.desktop.getAllFrames();
+ String matchedFile = null;
for (int f = frames.length - 1; f > -1; f--)
{
if (frames[f] instanceof AppJmol)
{
jmol = (AppJmol) frames[f];
- if (!jmol.pdbentry.getId().equals(entry.getId())
- && !(entry.getId().length()>4
- && entry.getId().startsWith(jmol.pdbentry.getId())))
- continue;
-
- StructureState state = new StructureState();
- state.setVisible(true);
- state.setXpos(jmol.getX());
- state.setYpos(jmol.getY());
- state.setWidth(jmol.getWidth());
- state.setHeight(jmol.getHeight());
- state.setViewId(jmol.getViewId());
- String statestring = jmol.viewer.getStateInfo();
- if (state != null)
- {
- state.setContent(statestring.replaceAll("\n", ""));
- }
- for (int s = 0; s < jmol.sequence.length; s++)
+ for (int peid = 0; peid < jmol.jmb.pdbentry.length; peid++)
{
- if (jal.findIndex(jmol.sequence[s]) > -1)
+ if (!jmol.jmb.pdbentry[peid].getId().equals(entry.getId())
+ && !(entry.getId().length() > 4 && entry
+ .getId()
+ .toLowerCase()
+ .startsWith(
+ jmol.jmb.pdbentry[peid].getId()
+ .toLowerCase())))
+ continue;
+ if (matchedFile == null)
{
- pdb.addStructureState(state);
+ matchedFile = jmol.jmb.pdbentry[peid].getFile();
+ }
+ else if (!matchedFile.equals(jmol.jmb.pdbentry[peid]
+ .getFile()))
+ {
+ Cache.log
+ .warn("Probably lost some PDB-Sequence mappings for this structure file (which apparently has same PDB Entry code): "
+ + jmol.jmb.pdbentry[peid].getFile());
+ ; // record the
+ }
+ // file so we
+ // can get at it if the ID
+ // match is ambiguous (e.g.
+ // 1QIP==1qipA)
+ String statestring = jmol.jmb.viewer.getStateInfo();
+
+ for (int smap = 0; smap < jmol.jmb.sequence[peid].length; smap++)
+ {
+ // if (jal.findIndex(jmol.jmb.sequence[peid][smap]) > -1)
+ if (jds == jmol.jmb.sequence[peid][smap])
+ {
+ StructureState state = new StructureState();
+ state.setVisible(true);
+ state.setXpos(jmol.getX());
+ state.setYpos(jmol.getY());
+ state.setWidth(jmol.getWidth());
+ state.setHeight(jmol.getHeight());
+ state.setViewId(jmol.getViewId());
+ state.setAlignwithAlignPanel(jmol.isUsedforaligment(ap));
+ state.setColourwithAlignPanel(jmol
+ .isUsedforcolourby(ap));
+ state.setColourByJmol(jmol.isColouredByJmol());
+ if (!jmolViewIds.contains(state.getViewId()))
+ {
+ // Make sure we only store a Jmol state once in each XML
+ // document.
+ jmolViewIds.addElement(state.getViewId());
+ state.setContent(statestring.replaceAll("\n", ""));
+ }
+ else
+ {
+ state.setContent("# duplicate state");
+ }
+ pdb.addStructureState(state);
+ }
}
}
}
}
- if (entry.getFile() != null)
+ if (matchedFile != null || entry.getFile() != null)
{
- pdb.setFile(entry.getFile());
+ if (entry.getFile() != null)
+ {
+ // use entry's file
+ matchedFile = entry.getFile();
+ }
+ pdb.setFile(matchedFile); // entry.getFile());
if (pdbfiles == null)
{
pdbfiles = new Vector();
@@ -619,7 +667,7 @@ public class Jalview2XML
pdbfiles.addElement(entry.getId());
try
{
- File file = new File(entry.getFile());
+ File file = new File(matchedFile);
if (file.exists() && jout != null)
{
byte[] data = new byte[(int) file.length()];
@@ -664,9 +712,9 @@ public class Jalview2XML
jms.addJSeq(jseq);
}
- if (av.hasHiddenRows)
+ if (av.hasHiddenRows())
{
- jal = av.alignment;
+ jal = av.getAlignment();
}
// SAVE MAPPINGS
if (jal.getCodonFrames() != null && jal.getCodonFrames().length > 0)
@@ -679,9 +727,10 @@ public class Jalview2XML
for (int p = 0; p < jac[i].aaWidth; p++)
{
Alcodon cmap = new Alcodon();
- if (jac[i].codons[p]!=null)
+ if (jac[i].codons[p] != null)
{
- // Null codons indicate a gapped column in the translated peptide alignment.
+ // Null codons indicate a gapped column in the translated peptide
+ // alignment.
cmap.setPos1(jac[i].codons[p][0]);
cmap.setPos2(jac[i].codons[p][1]);
cmap.setPos3(jac[i].codons[p][2]);
@@ -696,7 +745,7 @@ public class Jalview2XML
for (int m = 0; m < pmaps.length; m++)
{
AlcodMap alcmap = new AlcodMap();
- alcmap.setDnasq(seqHash(dnas[m]));
+ alcmap.setDnasq(seqHash(dnas[m]));
alcmap.setMapping(createVamsasMapping(pmaps[m], dnas[m], null,
false));
alc.addAlcodMap(alcmap);
@@ -721,7 +770,7 @@ public class Jalview2XML
{
TreePanel tp = (TreePanel) frames[t];
- if (tp.treeCanvas.av.alignment == jal)
+ if (tp.treeCanvas.av.getAlignment() == jal)
{
Tree tree = new Tree();
tree.setTitle(tp.getTitle());
@@ -749,8 +798,11 @@ public class Jalview2XML
}
}
}
-
// SAVE ANNOTATIONS
+ /**
+ * store forward refs from an annotationRow to any groups
+ */
+ IdentityHashMap groupRefs = new IdentityHashMap();
if (jal.getAlignmentAnnotation() != null)
{
jalview.datamodel.AlignmentAnnotation[] aa = jal
@@ -767,15 +819,6 @@ public class Jalview2XML
an.setId(aa[i].annotationId);
- if (aa[i] == av.quality || aa[i] == av.conservation
- || aa[i] == av.consensus)
- {
- an.setLabel(aa[i].label);
- an.setGraph(true);
- vamsasSet.addAnnotation(an);
- continue;
- }
-
an.setVisible(aa[i].visible);
an.setDescription(aa[i].description);
@@ -786,6 +829,25 @@ public class Jalview2XML
// sequence rather than its display name
an.setSequenceRef(aa[i].sequenceRef.getName());
}
+ if (aa[i].groupRef != null)
+ {
+ Object groupIdr = groupRefs.get(aa[i].groupRef);
+ if (groupIdr == null)
+ {
+ // make a locally unique String
+ groupRefs.put(aa[i].groupRef,
+ groupIdr = ("" + System.currentTimeMillis()
+ + aa[i].groupRef.getName() + groupRefs.size()));
+ }
+ an.setGroupRef(groupIdr.toString());
+ }
+
+ // store all visualization attributes for annotation
+ an.setGraphHeight(aa[i].graphHeight);
+ an.setCentreColLabels(aa[i].centreColLabels);
+ an.setScaleColLabels(aa[i].scaleColLabel);
+ an.setShowAllColLabels(aa[i].showAllColLabels);
+ an.setBelowAlignment(aa[i].belowAlignment);
if (aa[i].graph > 0)
{
@@ -807,10 +869,26 @@ public class Jalview2XML
}
an.setLabel(aa[i].label);
+
+ if (aa[i] == av.getAlignmentQualityAnnot()
+ || aa[i] == av.getAlignmentConservationAnnotation()
+ || aa[i] == av.getAlignmentConsensusAnnotation()
+ || aa[i].autoCalculated)
+ {
+ // new way of indicating autocalculated annotation -
+ an.setAutoCalculated(aa[i].autoCalculated);
+ }
if (aa[i].hasScore())
{
an.setScore(aa[i].getScore());
}
+
+ if (aa[i].getCalcId() != null)
+ {
+ calcIdSet.add(aa[i].getCalcId());
+ an.setCalcId(aa[i].getCalcId());
+ }
+
AnnotationElement ae;
if (aa[i].annotations != null)
{
@@ -834,9 +912,8 @@ public class Jalview2XML
ae.setPosition(a);
if (aa[i].annotations[a].secondaryStructure != ' '
&& aa[i].annotations[a].secondaryStructure != '\0')
- ae
- .setSecondaryStructure(aa[i].annotations[a].secondaryStructure
- + "");
+ ae.setSecondaryStructure(aa[i].annotations[a].secondaryStructure
+ + "");
if (aa[i].annotations[a].colour != null
&& aa[i].annotations[a].colour != java.awt.Color.black)
@@ -845,6 +922,13 @@ public class Jalview2XML
}
an.addAnnotationElement(ae);
+ if (aa[i].autoCalculated)
+ {
+ // only write one non-null entry into the annotation row -
+ // sufficient to get the visualization attributes necessary to
+ // display data
+ continue;
+ }
}
}
else
@@ -854,23 +938,23 @@ public class Jalview2XML
vamsasSet.addAnnotation(an);
}
}
-
// SAVE GROUPS
if (jal.getGroups() != null)
{
JGroup[] groups = new JGroup[jal.getGroups().size()];
-
- for (int i = 0; i < groups.length; i++)
+ int i = -1;
+ for (jalview.datamodel.SequenceGroup sg : jal.getGroups())
{
- groups[i] = new JGroup();
+ groups[++i] = new JGroup();
- jalview.datamodel.SequenceGroup sg = (jalview.datamodel.SequenceGroup) jal
- .getGroups().elementAt(i);
groups[i].setStart(sg.getStartRes());
groups[i].setEnd(sg.getEndRes());
- groups[i].setName(sg.getName()); // TODO later sequence group should
- // specify IDs of sequences, not just
- // names
+ groups[i].setName(sg.getName());
+ if (groupRefs.containsKey(sg))
+ {
+ // group has references so set it's ID field
+ groups[i].setId(groupRefs.get(sg).toString());
+ }
if (sg.cs != null)
{
if (sg.cs.conservationApplied())
@@ -915,7 +999,11 @@ public class Jalview2XML
groups[i].setTextCol1(sg.textColour.getRGB());
groups[i].setTextCol2(sg.textColour2.getRGB());
groups[i].setTextColThreshold(sg.thresholdTextColour);
-
+ groups[i].setShowUnconserved(sg.getShowNonconserved());
+ groups[i].setIgnoreGapsinConsensus(sg.getIgnoreGapsConsensus());
+ groups[i].setShowConsensusHistogram(sg.isShowConsensusHistogram());
+ groups[i].setShowSequenceLogo(sg.isShowSequenceLogo());
+ groups[i].setNormaliseSequenceLogo(sg.isNormaliseSequenceLogo());
for (int s = 0; s < sg.getSize(); s++)
{
jalview.datamodel.Sequence seq = (jalview.datamodel.Sequence) sg
@@ -930,8 +1018,8 @@ public class Jalview2XML
// /////////SAVE VIEWPORT
Viewport view = new Viewport();
view.setTitle(ap.alignFrame.getTitle());
- view.setSequenceSetId(makeHashCode(av.getSequenceSetId(), av
- .getSequenceSetId()));
+ view.setSequenceSetId(makeHashCode(av.getSequenceSetId(),
+ av.getSequenceSetId()));
view.setId(av.getViewId());
view.setViewName(av.viewName);
view.setGatheredViews(av.gatherViewsHere);
@@ -1022,11 +1110,21 @@ public class Jalview2XML
view.setRightAlignIds(av.rightAlignIds);
view.setShowSequenceFeatures(av.showSequenceFeatures);
view.setShowText(av.getShowText());
+ view.setShowUnconserved(av.getShowUnconserved());
view.setWrapAlignment(av.getWrapAlignment());
view.setTextCol1(av.textColour.getRGB());
view.setTextCol2(av.textColour2.getRGB());
view.setTextColThreshold(av.thresholdTextColour);
-
+ view.setShowConsensusHistogram(av.isShowConsensusHistogram());
+ view.setShowSequenceLogo(av.isShowSequenceLogo());
+ view.setNormaliseSequenceLogo(av.isNormaliseSequenceLogo());
+ view.setShowGroupConsensus(av.isShowGroupConsensus());
+ view.setShowGroupConservation(av.isShowGroupConservation());
+ view.setShowNPfeatureTooltip(av.isShowNpFeats());
+ view.setShowDbRefTooltip(av.isShowDbRefs());
+ view.setFollowHighlight(av.followHighlight);
+ view.setFollowSelection(av.followSelection);
+ view.setIgnoreGapsinConsensus(av.getIgnoreGapsConsensus());
if (av.featuresDisplayed != null)
{
jalview.schemabinding.version2.FeatureSettings fs = new jalview.schemabinding.version2.FeatureSettings();
@@ -1034,31 +1132,53 @@ public class Jalview2XML
String[] renderOrder = ap.seqPanel.seqCanvas.getFeatureRenderer().renderOrder;
Vector settingsAdded = new Vector();
- for (int ro = 0; ro < renderOrder.length; ro++)
+ Object gstyle = null;
+ GraduatedColor gcol = null;
+ if (renderOrder != null)
{
- Setting setting = new Setting();
- setting.setType(renderOrder[ro]);
- setting.setColour(ap.seqPanel.seqCanvas.getFeatureRenderer()
- .getColour(renderOrder[ro]).getRGB());
-
- setting.setDisplay(av.featuresDisplayed
- .containsKey(renderOrder[ro]));
- float rorder = ap.seqPanel.seqCanvas.getFeatureRenderer().getOrder(
- renderOrder[ro]);
- if (rorder > -1)
+ for (int ro = 0; ro < renderOrder.length; ro++)
{
- setting.setOrder(rorder);
+ gstyle = ap.seqPanel.seqCanvas.getFeatureRenderer()
+ .getFeatureStyle(renderOrder[ro]);
+ Setting setting = new Setting();
+ setting.setType(renderOrder[ro]);
+ if (gstyle instanceof GraduatedColor)
+ {
+ gcol = (GraduatedColor) gstyle;
+ setting.setColour(gcol.getMaxColor().getRGB());
+ setting.setMincolour(gcol.getMinColor().getRGB());
+ setting.setMin(gcol.getMin());
+ setting.setMax(gcol.getMax());
+ setting.setColourByLabel(gcol.isColourByLabel());
+ setting.setAutoScale(gcol.isAutoScale());
+ setting.setThreshold(gcol.getThresh());
+ setting.setThreshstate(gcol.getThreshType());
+ }
+ else
+ {
+ setting.setColour(ap.seqPanel.seqCanvas.getFeatureRenderer()
+ .getColour(renderOrder[ro]).getRGB());
+ }
+
+ setting.setDisplay(av.featuresDisplayed
+ .containsKey(renderOrder[ro]));
+ float rorder = ap.seqPanel.seqCanvas.getFeatureRenderer()
+ .getOrder(renderOrder[ro]);
+ if (rorder > -1)
+ {
+ setting.setOrder(rorder);
+ }
+ fs.addSetting(setting);
+ settingsAdded.addElement(renderOrder[ro]);
}
- fs.addSetting(setting);
- settingsAdded.addElement(renderOrder[ro]);
}
// Make sure we save none displayed feature settings
- Enumeration en = ap.seqPanel.seqCanvas.getFeatureRenderer().featureColours
- .keys();
- while (en.hasMoreElements())
+ Iterator en = ap.seqPanel.seqCanvas.getFeatureRenderer().featureColours
+ .keySet().iterator();
+ while (en.hasNext())
{
- String key = en.nextElement().toString();
+ String key = en.next().toString();
if (settingsAdded.contains(key))
{
continue;
@@ -1079,21 +1199,20 @@ public class Jalview2XML
fs.addSetting(setting);
settingsAdded.addElement(key);
}
- en = ap.seqPanel.seqCanvas.getFeatureRenderer().featureGroups.keys();
+ en = ap.seqPanel.seqCanvas.getFeatureRenderer().featureGroups
+ .keySet().iterator();
Vector groupsAdded = new Vector();
- while (en.hasMoreElements())
+ while (en.hasNext())
{
- String grp = en.nextElement().toString();
+ String grp = en.next().toString();
if (groupsAdded.contains(grp))
{
continue;
}
Group g = new Group();
g.setName(grp);
- g
- .setDisplay(((Boolean) ap.seqPanel.seqCanvas
- .getFeatureRenderer().featureGroups.get(grp))
- .booleanValue());
+ g.setDisplay(((Boolean) ap.seqPanel.seqCanvas.getFeatureRenderer().featureGroups
+ .get(grp)).booleanValue());
fs.addGroup(g);
groupsAdded.addElement(grp);
}
@@ -1101,16 +1220,40 @@ public class Jalview2XML
}
- if (av.hasHiddenColumns)
+ if (av.hasHiddenColumns())
{
- for (int c = 0; c < av.getColumnSelection().getHiddenColumns().size(); c++)
+ if (av.getColumnSelection() == null
+ || av.getColumnSelection().getHiddenColumns() == null)
{
- int[] region = (int[]) av.getColumnSelection().getHiddenColumns()
- .elementAt(c);
- HiddenColumns hc = new HiddenColumns();
- hc.setStart(region[0]);
- hc.setEnd(region[1]);
- view.addHiddenColumns(hc);
+ warn("REPORT BUG: avoided null columnselection bug (DMAM reported). Please contact Jim about this.");
+ }
+ else
+ {
+ for (int c = 0; c < av.getColumnSelection().getHiddenColumns()
+ .size(); c++)
+ {
+ int[] region = (int[]) av.getColumnSelection().getHiddenColumns()
+ .elementAt(c);
+ HiddenColumns hc = new HiddenColumns();
+ hc.setStart(region[0]);
+ hc.setEnd(region[1]);
+ view.addHiddenColumns(hc);
+ }
+ }
+ }
+ if (calcIdSet.size() > 0)
+ {
+ for (String calcId : calcIdSet)
+ {
+ if (calcId.trim().length() > 0)
+ {
+ CalcIdParam cidp = createCalcIdParam(calcId, av);
+ // Some calcIds have no parameters.
+ if (cidp != null)
+ {
+ view.addCalcIdParam(cidp);
+ }
+ }
}
}
@@ -1144,6 +1287,99 @@ public class Jalview2XML
return object;
}
+ private CalcIdParam createCalcIdParam(String calcId, AlignViewport av)
+ {
+ AutoCalcSetting settings = av.getCalcIdSettingsFor(calcId);
+ if (settings != null)
+ {
+ CalcIdParam vCalcIdParam = new CalcIdParam();
+ vCalcIdParam.setCalcId(calcId);
+ vCalcIdParam.addServiceURL(settings.getServiceURI());
+ // generic URI allowing a third party to resolve another instance of the
+ // service used for this calculation
+ for (String urls : settings.getServiceURLs())
+ {
+ vCalcIdParam.addServiceURL(urls);
+ }
+ vCalcIdParam.setVersion("1.0");
+ if (settings.getPreset() != null)
+ {
+ WsParamSetI setting = settings.getPreset();
+ vCalcIdParam.setName(setting.getName());
+ vCalcIdParam.setDescription(setting.getDescription());
+ }
+ else
+ {
+ vCalcIdParam.setName("");
+ vCalcIdParam.setDescription("Last used parameters");
+ }
+ // need to be able to recover 1) settings 2) user-defined presets or
+ // recreate settings from preset 3) predefined settings provided by
+ // service - or settings that can be transferred (or discarded)
+ vCalcIdParam.setParameters(settings.getWsParamFile().replace("\n",
+ "|\\n|"));
+ vCalcIdParam.setAutoUpdate(settings.isAutoUpdate());
+ // todo - decide if updateImmediately is needed for any projects.
+
+ return vCalcIdParam;
+ }
+ return null;
+ }
+
+ private boolean recoverCalcIdParam(CalcIdParam calcIdParam,
+ AlignViewport av)
+ {
+ if (calcIdParam.getVersion().equals("1.0"))
+ {
+ Jws2Instance service = Jws2Discoverer.getDiscoverer()
+ .getPreferredServiceFor(calcIdParam.getServiceURL());
+ if (service != null)
+ {
+ WsParamSetI parmSet = null;
+ try
+ {
+ parmSet = service.getParamStore().parseServiceParameterFile(
+ calcIdParam.getName(), calcIdParam.getDescription(),
+ calcIdParam.getServiceURL(),
+ calcIdParam.getParameters().replace("|\\n|", "\n"));
+ } catch (IOException x)
+ {
+ warn("Couldn't parse parameter data for "
+ + calcIdParam.getCalcId(), x);
+ return false;
+ }
+ List argList = null;
+ if (calcIdParam.getName().length() > 0)
+ {
+ parmSet = service.getParamStore()
+ .getPreset(calcIdParam.getName());
+ if (parmSet != null)
+ {
+ // TODO : check we have a good match with settings in AACon -
+ // otherwise we'll need to create a new preset
+ }
+ }
+ else
+ {
+ argList = parmSet.getArguments();
+ parmSet = null;
+ }
+ AAConSettings settings = new AAConSettings(
+ calcIdParam.isAutoUpdate(), service, parmSet, argList);
+ av.setCalcIdSettingsFor(calcIdParam.getCalcId(), settings,
+ calcIdParam.isNeedsUpdate());
+ return true;
+ }
+ else
+ {
+ warn("Cannot resolve a service for the parameters used in this project. Try configuring a JABAWS server.");
+ return false;
+ }
+ }
+ throw new Error("Unsupported Version for calcIdparam "
+ + calcIdParam.toString());
+ }
+
/**
* External mapping between jalview objects and objects yielding a valid and
* unique object ID string. This is null for normal Jalview project IO, but
@@ -1157,7 +1393,7 @@ public class Jalview2XML
* exist, the result of the hashcode call for the object.
*
* @param jvobj
- * jalview data object
+ * jalview data object
* @return unique ID for referring to jvobj
*/
private String makeHashCode(Object jvobj, String altCode)
@@ -1188,7 +1424,7 @@ public class Jalview2XML
* return local jalview object mapped to ID, if it exists
*
* @param idcode
- * (may be null)
+ * (may be null)
* @return null or object bound to idcode
*/
private Object retrieveExistingObj(String idcode)
@@ -1327,11 +1563,16 @@ public class Jalview2XML
{
String id = null;
jalview.schemes.UserColourScheme ucs = (jalview.schemes.UserColourScheme) cs;
-
+ boolean newucs = false;
if (!userColours.contains(ucs))
{
userColours.add(ucs);
-
+ newucs = true;
+ }
+ id = "ucs" + userColours.indexOf(ucs);
+ if (newucs)
+ {
+ // actually create the scheme's entry in the XML model
java.awt.Color[] colours = ucs.getColours();
jalview.schemabinding.version2.UserColours uc = new jalview.schemabinding.version2.UserColours();
jalview.schemabinding.version2.UserColourScheme jbucs = new jalview.schemabinding.version2.UserColourScheme();
@@ -1355,7 +1596,6 @@ public class Jalview2XML
}
}
- id = "ucs" + userColours.indexOf(ucs);
uc.setId(id);
uc.setUserColourScheme(jbucs);
jms.addUserColours(uc);
@@ -1419,8 +1659,8 @@ public class Jalview2XML
/**
* Load a jalview project archive from a jar file
*
- * @param file -
- * HTTP URL or filename
+ * @param file
+ * - HTTP URL or filename
*/
public AlignFrame LoadJalviewAlign(final String file)
{
@@ -1429,6 +1669,8 @@ public class Jalview2XML
try
{
+ // create list to store references for any new Jmol viewers created
+ newStructureViewers=new Vector();
// UNMARSHALLER SEEMS TO CLOSE JARINPUTSTREAM, MOST ANNOYING
// Workaround is to make sure caller implements the JarInputStreamProvider
// interface
@@ -1436,11 +1678,27 @@ public class Jalview2XML
jarInputStreamProvider jprovider = createjarInputStreamProvider(file);
af = LoadJalviewAlign(jprovider);
+
} catch (MalformedURLException e)
{
errorMessage = "Invalid URL format for '" + file + "'";
reportErrors();
}
+ finally {
+ try
+ {
+ SwingUtilities.invokeAndWait(new Runnable()
+ {
+ public void run()
+ {
+ setLoadingFinishedForNewStructureViewers();
+ };
+ });
+ } catch (Exception x)
+ {
+
+ }
+ }
return af;
}
@@ -1462,6 +1720,7 @@ public class Jalview2XML
return new jarInputStreamProvider()
{
+ @Override
public JarInputStream getJarInputStream() throws IOException
{
if (_url != null)
@@ -1474,6 +1733,7 @@ public class Jalview2XML
}
}
+ @Override
public String getFilename()
{
return file;
@@ -1596,8 +1856,10 @@ public class Jalview2XML
+ ex + "\n");
} catch (OutOfMemoryError e)
{
- new jalview.gui.OOMWarning("loading jalview XML file", e,
- Desktop.instance);
+ // Don't use the OOM Window here
+ errorMessage = "Out of memory loading jalview XML file";
+ System.err.println("Out of memory whilst loading jalview XML file");
+ e.printStackTrace();
}
if (Desktop.instance != null)
@@ -1636,6 +1898,7 @@ public class Jalview2XML
{
javax.swing.SwingUtilities.invokeLater(new Runnable()
{
+ @Override
public void run()
{
JOptionPane.showInternalMessageDialog(Desktop.desktop,
@@ -1660,7 +1923,7 @@ public class Jalview2XML
* Currently (28th Sep 2008) things will go horribly wrong in vamsas document
* sync if this is set to true.
*/
- private boolean updateLocalViews = false;
+ private final boolean updateLocalViews = false;
String loadPDBFile(jarInputStreamProvider jprovider, String pdbId)
{
@@ -1704,9 +1967,9 @@ public class Jalview2XML
}
;
out.close();
-
- alreadyLoadedPDB.put(pdbId, outFile.getAbsolutePath());
- return outFile.getAbsolutePath();
+ String t = outFile.getAbsolutePath();
+ alreadyLoadedPDB.put(pdbId, t);
+ return t;
}
else
{
@@ -1720,17 +1983,36 @@ public class Jalview2XML
return null;
}
+ private class JvAnnotRow
+ {
+ public JvAnnotRow(int i, AlignmentAnnotation jaa)
+ {
+ order = i;
+ template = jaa;
+ }
+
+ /**
+ * persisted version of annotation row from which to take vis properties
+ */
+ public jalview.datamodel.AlignmentAnnotation template;
+
+ /**
+ * original position of the annotation row in the alignment
+ */
+ public int order;
+ }
+
/**
* Load alignment frame from jalview XML DOM object
*
* @param object
- * DOM
+ * DOM
* @param file
- * filename source string
+ * filename source string
* @param loadTreesAndStructures
- * when false only create Viewport
+ * when false only create Viewport
* @param jprovider
- * data source provider
+ * data source provider
* @return alignment frame created from view stored in DOM
*/
AlignFrame LoadFromObject(JalviewModel object, String file,
@@ -1760,7 +2042,7 @@ public class Jalview2XML
if (seqRefIds.get(seqId) != null)
{
- tmpseqs.add((jalview.datamodel.Sequence) seqRefIds.get(seqId));
+ tmpseqs.add(seqRefIds.get(seqId));
multipleView = true;
}
else
@@ -1783,8 +2065,7 @@ public class Jalview2XML
hiddenSeqs = new Vector();
}
- hiddenSeqs.addElement((jalview.datamodel.Sequence) seqRefIds
- .get(seqId));
+ hiddenSeqs.addElement(seqRefIds.get(seqId));
}
}
@@ -1904,14 +2185,17 @@ public class Jalview2XML
Alcodon[] alcods = alc[i].getAlcodon();
for (int p = 0; p < cf.codons.length; p++)
{
- if (alcods[p].hasPos1() && alcods[p].hasPos2() && alcods[p].hasPos3())
+ if (alcods[p].hasPos1() && alcods[p].hasPos2()
+ && alcods[p].hasPos3())
{
// translated codons require three valid positions
cf.codons[p] = new int[3];
cf.codons[p][0] = (int) alcods[p].getPos1();
cf.codons[p][1] = (int) alcods[p].getPos2();
cf.codons[p][2] = (int) alcods[p].getPos3();
- } else {
+ }
+ else
+ {
cf.codons[p] = null;
}
}
@@ -1949,7 +2233,11 @@ public class Jalview2XML
// ////////////////////////////////
// LOAD ANNOTATIONS
- boolean hideQuality = true, hideConservation = true, hideConsensus = true;
+ ArrayList autoAlan = new ArrayList();
+ /**
+ * store any annotations which forward reference a group's ID
+ */
+ Hashtable> groupAnnotRefs = new Hashtable>();
if (vamsasSet.getAnnotationCount() > 0)
{
@@ -1957,22 +2245,29 @@ public class Jalview2XML
for (int i = 0; i < an.length; i++)
{
- // set visibility for automatic annotation for this view
- if (an[i].getLabel().equals("Quality"))
- {
- hideQuality = false;
- continue;
- }
- else if (an[i].getLabel().equals("Conservation"))
+ /**
+ * test if annotation is automatically calculated for this view only
+ */
+ boolean autoForView = false;
+ if (an[i].getLabel().equals("Quality")
+ || an[i].getLabel().equals("Conservation")
+ || an[i].getLabel().equals("Consensus"))
{
- hideConservation = false;
- continue;
+ // Kludge for pre 2.5 projects which lacked the autocalculated flag
+ autoForView = true;
+ if (!an[i].hasAutoCalculated())
+ {
+ an[i].setAutoCalculated(true);
+ }
}
- else if (an[i].getLabel().equals("Consensus"))
+ if (autoForView
+ || (an[i].hasAutoCalculated() && an[i].isAutoCalculated()))
{
- hideConsensus = false;
- continue;
+ // remove ID - we don't recover annotation from other views for
+ // view-specific annotation
+ an[i].setId(null);
}
+
// set visiblity for other annotation in this view
if (an[i].getId() != null
&& annotationIds.containsKey(an[i].getId()))
@@ -1991,22 +2286,25 @@ public class Jalview2XML
// Construct new annotation from model.
AnnotationElement[] ae = an[i].getAnnotationElement();
jalview.datamodel.Annotation[] anot = null;
-
+ java.awt.Color firstColour = null;
+ int anpos;
if (!an[i].getScoreOnly())
{
anot = new jalview.datamodel.Annotation[al.getWidth()];
-
for (int aa = 0; aa < ae.length && aa < anot.length; aa++)
{
- if (ae[aa].getPosition() >= anot.length)
+ anpos = ae[aa].getPosition();
+
+ if (anpos >= anot.length)
continue;
- anot[ae[aa].getPosition()] = new jalview.datamodel.Annotation(
+ anot[anpos] = new jalview.datamodel.Annotation(
- ae[aa].getDisplayCharacter(), ae[aa].getDescription(), (ae[aa]
- .getSecondaryStructure() == null || ae[aa]
- .getSecondaryStructure().length() == 0) ? ' ' : ae[aa]
- .getSecondaryStructure().charAt(0), ae[aa].getValue()
+ ae[aa].getDisplayCharacter(), ae[aa].getDescription(),
+ (ae[aa].getSecondaryStructure() == null || ae[aa]
+ .getSecondaryStructure().length() == 0) ? ' '
+ : ae[aa].getSecondaryStructure().charAt(0),
+ ae[aa].getValue()
);
// JBPNote: Consider verifying dataflow for IO of secondary
@@ -2016,19 +2314,27 @@ public class Jalview2XML
// {
// anot[ae[aa].getPosition()].displayCharacter = "";
// }
- anot[ae[aa].getPosition()].colour = new java.awt.Color(ae[aa]
- .getColour());
+ anot[anpos].colour = new java.awt.Color(ae[aa].getColour());
+ if (firstColour == null)
+ {
+ firstColour = anot[anpos].colour;
+ }
}
}
jalview.datamodel.AlignmentAnnotation jaa = null;
if (an[i].getGraph())
{
+ float llim = 0, hlim = 0;
+ // if (autoForView || an[i].isAutoCalculated()) {
+ // hlim=11f;
+ // }
jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
- an[i].getDescription(), anot, 0, 0, an[i].getGraphType());
+ an[i].getDescription(), anot, llim, hlim,
+ an[i].getGraphType());
jaa.graphGroup = an[i].getGraphGroup();
-
+ jaa._linecolour = firstColour;
if (an[i].getThresholdLine() != null)
{
jaa.setThreshold(new jalview.datamodel.GraphLine(an[i]
@@ -2037,12 +2343,18 @@ public class Jalview2XML
an[i].getThresholdLine().getColour())));
}
-
+ if (autoForView || an[i].isAutoCalculated())
+ {
+ // Hardwire the symbol display line to ensure that labels for
+ // histograms are displayed
+ jaa.hasText = true;
+ }
}
else
{
jaa = new jalview.datamodel.AlignmentAnnotation(an[i].getLabel(),
an[i].getDescription(), anot);
+ jaa._linecolour = firstColour;
}
// register new annotation
if (an[i].getId() != null)
@@ -2060,15 +2372,61 @@ public class Jalview2XML
al.findName(an[i].getSequenceRef()).addAlignmentAnnotation(jaa);
}
}
+ // and make a note of any group association
+ if (an[i].getGroupRef() != null && an[i].getGroupRef().length() > 0)
+ {
+ ArrayList aal = groupAnnotRefs
+ .get(an[i].getGroupRef());
+ if (aal == null)
+ {
+ aal = new ArrayList();
+ groupAnnotRefs.put(an[i].getGroupRef(), aal);
+ }
+ aal.add(jaa);
+ }
+
if (an[i].hasScore())
{
jaa.setScore(an[i].getScore());
}
-
if (an[i].hasVisible())
jaa.visible = an[i].getVisible();
- al.addAnnotation(jaa);
+ if (an[i].hasCentreColLabels())
+ jaa.centreColLabels = an[i].getCentreColLabels();
+
+ if (an[i].hasScaleColLabels())
+ {
+ jaa.scaleColLabel = an[i].getScaleColLabels();
+ }
+ if (an[i].hasAutoCalculated() && an[i].isAutoCalculated())
+ {
+ // newer files have an 'autoCalculated' flag and store calculation
+ // state in viewport properties
+ jaa.autoCalculated = true; // means annotation will be marked for
+ // update at end of load.
+ }
+ if (an[i].hasGraphHeight())
+ {
+ jaa.graphHeight = an[i].getGraphHeight();
+ }
+ if (an[i].hasBelowAlignment())
+ {
+ jaa.belowAlignment = an[i].isBelowAlignment();
+ }
+ jaa.setCalcId(an[i].getCalcId());
+
+ if (jaa.autoCalculated)
+ {
+ autoAlan.add(new JvAnnotRow(i, jaa));
+ }
+ else
+ // if (!autoForView)
+ {
+ // add autocalculated group annotation and any user created annotation
+ // for the view
+ al.addAnnotation(jaa);
+ }
}
}
@@ -2124,25 +2482,70 @@ public class Jalview2XML
groups[i].getDisplayText(), groups[i].getColourText(),
groups[i].getStart(), groups[i].getEnd());
- sg
- .setOutlineColour(new java.awt.Color(groups[i]
- .getOutlineColour()));
+ sg.setOutlineColour(new java.awt.Color(groups[i].getOutlineColour()));
sg.textColour = new java.awt.Color(groups[i].getTextCol1());
sg.textColour2 = new java.awt.Color(groups[i].getTextCol2());
+ sg.setShowNonconserved(groups[i].hasShowUnconserved() ? groups[i]
+ .isShowUnconserved() : false);
sg.thresholdTextColour = groups[i].getTextColThreshold();
-
+ if (groups[i].hasShowConsensusHistogram())
+ {
+ sg.setShowConsensusHistogram(groups[i].isShowConsensusHistogram());
+ }
+ ;
+ if (groups[i].hasShowSequenceLogo())
+ {
+ sg.setshowSequenceLogo(groups[i].isShowSequenceLogo());
+ }
+ if (groups[i].hasNormaliseSequenceLogo())
+ {
+ sg.setNormaliseSequenceLogo(groups[i].isNormaliseSequenceLogo());
+ }
+ if (groups[i].hasIgnoreGapsinConsensus())
+ {
+ sg.setIgnoreGapsConsensus(groups[i].getIgnoreGapsinConsensus());
+ }
if (groups[i].getConsThreshold() != 0)
{
jalview.analysis.Conservation c = new jalview.analysis.Conservation(
- "All", ResidueProperties.propHash, 3, sg
- .getSequences(null), 0, sg.getWidth() - 1);
+ "All", ResidueProperties.propHash, 3,
+ sg.getSequences(null), 0, sg.getWidth() - 1);
c.calculate();
c.verdict(false, 25);
sg.cs.setConservation(c);
}
+ if (groups[i].getId() != null && groupAnnotRefs.size() > 0)
+ {
+ // re-instate unique group/annotation row reference
+ ArrayList jaal = groupAnnotRefs
+ .get(groups[i].getId());
+ if (jaal != null)
+ {
+ for (jalview.datamodel.AlignmentAnnotation jaa : jaal)
+ {
+ jaa.groupRef = sg;
+ if (jaa.autoCalculated)
+ {
+ // match up and try to set group autocalc alignment row for this
+ // annotation
+ if (jaa.label.startsWith("Consensus for "))
+ {
+ sg.setConsensus(jaa);
+ }
+ // match up and try to set group autocalc alignment row for this
+ // annotation
+ if (jaa.label.startsWith("Conservation for "))
+ {
+ sg.setConservationRow(jaa);
+ }
+ }
+ }
+ }
+ }
al.addGroup(sg);
+
}
}
@@ -2216,9 +2619,8 @@ public class Jalview2XML
if (isnewview)
{
- af = loadViewport(file, JSEQ, hiddenSeqs, al, hideConsensus,
- hideQuality, hideConservation, jms, view, uniqueSeqSetId,
- viewId);
+ af = loadViewport(file, JSEQ, hiddenSeqs, al, jms, view,
+ uniqueSeqSetId, viewId, autoAlan);
av = af.viewport;
ap = af.alignPanel;
}
@@ -2236,17 +2638,20 @@ public class Jalview2XML
TreePanel tp = (TreePanel) retrieveExistingObj(tree.getId());
if (tp == null)
{
- tp = af.ShowNewickTree(new jalview.io.NewickFile(tree
- .getNewick()), tree.getTitle(), tree.getWidth(), tree
- .getHeight(), tree.getXpos(), tree.getYpos());
+ tp = af.ShowNewickTree(
+ new jalview.io.NewickFile(tree.getNewick()),
+ tree.getTitle(), tree.getWidth(), tree.getHeight(),
+ tree.getXpos(), tree.getYpos());
if (tree.getId() != null)
{
-
+ // perhaps bind the tree id to something ?
}
}
else
{
// update local tree attributes ?
+ // TODO: should check if tp has been manipulated by user - if so its
+ // settings shouldn't be modified
tp.setTitle(tree.getTitle());
tp.setBounds(new Rectangle(tree.getXpos(), tree.getYpos(), tree
.getWidth(), tree.getHeight()));
@@ -2257,9 +2662,10 @@ public class Jalview2XML
tp.treeCanvas.ap = ap; // af.alignPanel;
}
- if (tp==null)
+ if (tp == null)
{
- warn("There was a problem recovering stored Newick tree: \n"+tree.getNewick());
+ warn("There was a problem recovering stored Newick tree: \n"
+ + tree.getNewick());
continue;
}
@@ -2298,6 +2704,10 @@ public class Jalview2XML
// //LOAD STRUCTURES
if (loadTreesAndStructures)
{
+ // run through all PDB ids on the alignment, and collect mappings between
+ // jmol view ids and all sequences referring to it
+ Hashtable jmolViewIds = new Hashtable();
+
for (int i = 0; i < JSEQ.length; i++)
{
if (JSEQ[i].getPdbidsCount() > 0)
@@ -2322,100 +2732,356 @@ public class Jalview2XML
int y = ids[p].getStructureState(s).getYpos();
int width = ids[p].getStructureState(s).getWidth();
int height = ids[p].getStructureState(s).getHeight();
- AppJmol comp = null;
- JInternalFrame[] frames = null;
- do
+
+ // Probably don't need to do this anymore...
+ // Desktop.desktop.getComponentAt(x, y);
+ // TODO: NOW: check that this recovers the PDB file correctly.
+ String pdbFile = loadPDBFile(jprovider, ids[p].getId());
+ jalview.datamodel.SequenceI seq = (jalview.datamodel.SequenceI) seqRefIds
+ .get(JSEQ[i].getId() + "");
+ if (sviewid == null)
+ {
+ sviewid = "_jalview_pre2_4_" + x + "," + y + "," + width
+ + "," + height;
+ }
+ if (!jmolViewIds.containsKey(sviewid))
+ {
+ jmolViewIds.put(sviewid, new Object[]
+ { new int[]
+ { x, y, width, height }, "",
+ new Hashtable(), new boolean[]
+ { false, false, true } });
+ // Legacy pre-2.7 conversion JAL-823 :
+ // do not assume any view has to be linked for colour by
+ // sequence
+ }
+
+ // assemble String[] { pdb files }, String[] { id for each
+ // file }, orig_fileloc, SequenceI[][] {{ seqs_file 1 }, {
+ // seqs_file 2}, boolean[] {
+ // linkAlignPanel,superposeWithAlignpanel}} from hash
+ Object[] jmoldat = jmolViewIds.get(sviewid);
+ ((boolean[]) jmoldat[3])[0] |= ids[p].getStructureState(s)
+ .hasAlignwithAlignPanel() ? ids[p].getStructureState(
+ s).getAlignwithAlignPanel() : false;
+ // never colour by linked panel if not specified
+ ((boolean[]) jmoldat[3])[1] |= ids[p].getStructureState(s)
+ .hasColourwithAlignPanel() ? ids[p]
+ .getStructureState(s).getColourwithAlignPanel()
+ : false;
+ // default for pre-2.7 projects is that Jmol colouring is enabled
+ ((boolean[]) jmoldat[3])[2] &= ids[p].getStructureState(s)
+ .hasColourByJmol() ? ids[p].getStructureState(s)
+ .getColourByJmol() : true;
+
+ if (((String) jmoldat[1]).length() < ids[p]
+ .getStructureState(s).getContent().length())
{
- try
{
- frames = Desktop.desktop.getAllFrames();
- } catch (ArrayIndexOutOfBoundsException e)
+ jmoldat[1] = ids[p].getStructureState(s).getContent();
+ }
+ }
+ if (ids[p].getFile() != null)
+ {
+ File mapkey = new File(ids[p].getFile());
+ Object[] seqstrmaps = (Object[]) ((Hashtable) jmoldat[2])
+ .get(mapkey);
+ if (seqstrmaps == null)
{
- // occasional No such child exceptions are thrown here...
- frames = null;
- try
- {
- Thread.sleep(10);
- } catch (Exception f)
- {
- }
- ;
+ ((Hashtable) jmoldat[2]).put(mapkey,
+ seqstrmaps = new Object[]
+ { pdbFile, ids[p].getId(), new Vector(),
+ new Vector() });
}
- } while (frames == null);
- // search for any Jmol windows already open from other
- // alignment views that exactly match the stored structure state
- for (int f = 0; comp == null && f < frames.length; f++)
+ if (!((Vector) seqstrmaps[2]).contains(seq))
+ {
+ ((Vector) seqstrmaps[2]).addElement(seq);
+ // ((Vector)seqstrmaps[3]).addElement(n) :
+ // in principle, chains
+ // should be stored here : do we need to
+ // TODO: store and recover seq/pdb_id :
+ // chain mappings
+ }
+ }
+ else
+ {
+ errorMessage = ("The Jmol views in this project were imported\nfrom an older version of Jalview.\nPlease review the sequence colour associations\nin the Colour by section of the Jmol View menu.\n\nIn the case of problems, see note at\nhttp://issues.jalview.org/browse/JAL-747");
+ warn(errorMessage);
+ }
+ }
+ }
+ }
+ }
+ {
+
+ // Instantiate the associated Jmol views
+ for (Entry entry : jmolViewIds.entrySet())
+ {
+ String sviewid = entry.getKey();
+ Object[] svattrib = entry.getValue();
+ int[] geom = (int[]) svattrib[0];
+ String state = (String) svattrib[1];
+ Hashtable oldFiles = (Hashtable) svattrib[2];
+ final boolean useinJmolsuperpos = ((boolean[]) svattrib[3])[0], usetoColourbyseq = ((boolean[]) svattrib[3])[1], jmolColouring = ((boolean[]) svattrib[3])[2];
+ int x = geom[0], y = geom[1], width = geom[2], height = geom[3];
+ // collate the pdbfile -> sequence mappings from this view
+ Vector pdbfilenames = new Vector();
+ Vector seqmaps = new Vector();
+ Vector pdbids = new Vector();
+
+ // Search to see if we've already created this Jmol view
+ AppJmol comp = null;
+ JInternalFrame[] frames = null;
+ do
+ {
+ try
+ {
+ frames = Desktop.desktop.getAllFrames();
+ } catch (ArrayIndexOutOfBoundsException e)
+ {
+ // occasional No such child exceptions are thrown here...
+ frames = null;
+ try
+ {
+ Thread.sleep(10);
+ } catch (Exception f)
+ {
+ }
+ ;
+ }
+ } while (frames == null);
+ // search for any Jmol windows already open from other
+ // alignment views that exactly match the stored structure state
+ for (int f = 0; comp == null && f < frames.length; f++)
+ {
+ if (frames[f] instanceof AppJmol)
+ {
+ if (sviewid != null
+ && ((AppJmol) frames[f]).getViewId().equals(sviewid))
+ {
+ // post jalview 2.4 schema includes structure view id
+ comp = (AppJmol) frames[f];
+ }
+ else if (frames[f].getX() == x && frames[f].getY() == y
+ && frames[f].getHeight() == height
+ && frames[f].getWidth() == width)
+ {
+ comp = (AppJmol) frames[f];
+ }
+ }
+ }
+
+ if (comp == null)
+ {
+ // create a new Jmol window.
+ // First parse the Jmol state to translate filenames loaded into the
+ // view, and record the order in which files are shown in the Jmol
+ // view, so we can add the sequence mappings in same order.
+ StringBuffer newFileLoc = null;
+ int cp = 0, ncp, ecp;
+ while ((ncp = state.indexOf("load ", cp)) > -1)
+ {
+ if (newFileLoc == null)
+ {
+ newFileLoc = new StringBuffer();
+ }
+ do
{
- if (frames[f] instanceof AppJmol)
+ // look for next filename in load statement
+ newFileLoc.append(state.substring(cp,
+ ncp = (state.indexOf("\"", ncp + 1) + 1)));
+ String oldfilenam = state.substring(ncp,
+ ecp = state.indexOf("\"", ncp));
+ // recover the new mapping data for this old filename
+ // have to normalize filename - since Jmol and jalview do
+ // filename
+ // translation differently.
+ Object[] filedat = oldFiles.get(new File(oldfilenam));
+ newFileLoc.append(Platform
+ .escapeString((String) filedat[0]));
+ pdbfilenames.addElement((String) filedat[0]);
+ pdbids.addElement((String) filedat[1]);
+ seqmaps.addElement(((Vector) filedat[2])
+ .toArray(new SequenceI[0]));
+ newFileLoc.append("\"");
+ cp = ecp + 1; // advance beyond last \" and set cursor so we can
+ // look for next file statement.
+ } while ((ncp = state.indexOf("/*file*/", cp)) > -1);
+ }
+ if (cp > 0)
+ {
+ // just append rest of state
+ newFileLoc.append(state.substring(cp));
+ }
+ else
+ {
+ System.err
+ .print("Ignoring incomplete Jmol state for PDB ids: ");
+ newFileLoc = new StringBuffer(state);
+ newFileLoc.append("; load append ");
+ for (File id : oldFiles.keySet())
+ {
+ // add this and any other pdb files that should be present in
+ // the viewer
+ Object[] filedat = oldFiles.get(id);
+ String nfilename;
+ newFileLoc.append(((String) filedat[0]));
+ pdbfilenames.addElement((String) filedat[0]);
+ pdbids.addElement((String) filedat[1]);
+ seqmaps.addElement(((Vector) filedat[2])
+ .toArray(new SequenceI[0]));
+ newFileLoc.append(" \"");
+ newFileLoc.append((String) filedat[0]);
+ newFileLoc.append("\"");
+
+ }
+ newFileLoc.append(";");
+ }
+
+ if (newFileLoc != null)
+ {
+ int histbug = newFileLoc.indexOf("history = ");
+ histbug += 10;
+ int diff = histbug == -1 ? -1 : newFileLoc.indexOf(";",
+ histbug);
+ String val = (diff == -1) ? null : newFileLoc.substring(
+ histbug, diff);
+ if (val != null && val.length() >= 4)
+ {
+ if (val.contains("e"))
{
- if (sviewid != null
- && ((AppJmol) frames[f]).getViewId().equals(
- sviewid))
+ if (val.trim().equals("true"))
{
- // post jalview 2.4 schema includes structure view id
- comp = (AppJmol) frames[f];
+ val = "1";
}
- else if (frames[f].getX() == x && frames[f].getY() == y
- && frames[f].getHeight() == height
- && frames[f].getWidth() == width)
+ else
{
- comp = (AppJmol) frames[f];
+ val = "0";
}
+ newFileLoc.replace(histbug, diff, val);
}
}
- Desktop.desktop.getComponentAt(x, y);
-
- String pdbFile = loadPDBFile(jprovider, ids[p].getId());
-
- jalview.datamodel.SequenceI[] seq = new jalview.datamodel.SequenceI[]
- { (jalview.datamodel.SequenceI) seqRefIds.get(JSEQ[i].getId()
- + "") };
-
- if (comp == null)
+ // TODO: assemble String[] { pdb files }, String[] { id for each
+ // file }, orig_fileloc, SequenceI[][] {{ seqs_file 1 }, {
+ // seqs_file 2}} from hash
+ final String[] pdbf = pdbfilenames
+ .toArray(new String[pdbfilenames.size()]), id = pdbids
+ .toArray(new String[pdbids.size()]);
+ final SequenceI[][] sq = seqmaps
+ .toArray(new SequenceI[seqmaps.size()][]);
+ final String fileloc = newFileLoc.toString(), vid = sviewid;
+ final AlignFrame alf = af;
+ final java.awt.Rectangle rect = new java.awt.Rectangle(x, y,
+ width, height);
+ try
{
- // create a new Jmol window
- String state = ids[p].getStructureState(s).getContent();
-
- StringBuffer newFileLoc = new StringBuffer(state.substring(
- 0, state.indexOf("\"", state.indexOf("load")) + 1));
-
- newFileLoc.append(jpdb.getFile());
- newFileLoc.append(state.substring(state.indexOf("\"", state
- .indexOf("load \"") + 6)));
-
- new AppJmol(pdbFile, ids[p].getId(), seq, af.alignPanel,
- newFileLoc.toString(), new java.awt.Rectangle(x, y,
- width, height), sviewid);
+ javax.swing.SwingUtilities.invokeAndWait(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ AppJmol sview = null;
+ try
+ {
+ sview = new AppJmol(pdbf, id, sq, alf.alignPanel,
+ useinJmolsuperpos, usetoColourbyseq,
+ jmolColouring, fileloc, rect, vid);
+ addNewStructureViewer(sview);
+ } catch (OutOfMemoryError ex)
+ {
+ new OOMWarning("restoring structure view for PDB id "
+ + id, (OutOfMemoryError) ex.getCause());
+ if (sview != null && sview.isVisible())
+ {
+ sview.closeViewer();
+ sview.setVisible(false);
+ sview.dispose();
+ }
+ }
+ }
+ });
+ } catch (InvocationTargetException ex)
+ {
+ warn("Unexpected error when opening Jmol view.", ex);
- }
- else
- // if (comp != null)
+ } catch (InterruptedException e)
{
- // NOTE: if the jalview project is part of a shared session then
- // view synchronization should/could be done here.
+ // e.printStackTrace();
+ }
+ }
- // add mapping for this sequence to the already open Jmol
- // instance (if it doesn't already exist)
- // These
- StructureSelectionManager.getStructureSelectionManager()
- .setMapping(seq, null, pdbFile,
- jalview.io.AppletFormatAdapter.FILE);
+ }
+ else
+ // if (comp != null)
+ {
+ // NOTE: if the jalview project is part of a shared session then
+ // view synchronization should/could be done here.
- ((AppJmol) comp).addSequence(seq);
- }
+ // add mapping for sequences in this view to an already open Jmol
+ // instance
+ for (File id : oldFiles.keySet())
+ {
+ // add this and any other pdb files that should be present in the
+ // viewer
+ Object[] filedat = oldFiles.get(id);
+ String pdbFile = (String) filedat[0];
+ SequenceI[] seq = ((Vector) filedat[2])
+ .toArray(new SequenceI[0]);
+ comp.jmb.ssm.setMapping(seq, null, pdbFile,
+ jalview.io.AppletFormatAdapter.FILE);
+ comp.jmb.addSequenceForStructFile(pdbFile, seq);
+ }
+ // and add the AlignmentPanel's reference to the Jmol view
+ comp.addAlignmentPanel(ap);
+ if (useinJmolsuperpos)
+ {
+ comp.useAlignmentPanelForSuperposition(ap);
+ }
+ else
+ {
+ comp.excludeAlignmentPanelForSuperposition(ap);
+ }
+ if (usetoColourbyseq)
+ {
+ comp.useAlignmentPanelForColourbyseq(ap, !jmolColouring);
+ }
+ else
+ {
+ comp.excludeAlignmentPanelForColourbyseq(ap);
}
}
}
}
}
-
+ // and finally return.
return af;
}
+ Vector newStructureViewers=null;
+ protected void addNewStructureViewer(AppJmol sview)
+ {
+ if (newStructureViewers!=null)
+ {
+ sview.jmb.setFinishedLoadingFromArchive(false);
+ newStructureViewers.add(sview);
+ }
+ }
+ protected void setLoadingFinishedForNewStructureViewers()
+ {
+ if (newStructureViewers!=null)
+ {
+ for (AppJmol sview:newStructureViewers)
+ {
+ sview.jmb.setFinishedLoadingFromArchive(true);
+ }
+ newStructureViewers.clear();
+ newStructureViewers=null;
+ }
+ }
AlignFrame loadViewport(String file, JSeq[] JSEQ, Vector hiddenSeqs,
- Alignment al, boolean hideConsensus, boolean hideQuality,
- boolean hideConservation, JalviewModelSequence jms,
- Viewport view, String uniqueSeqSetId, String viewId)
+ Alignment al, JalviewModelSequence jms, Viewport view,
+ String uniqueSeqSetId, String viewId,
+ ArrayList autoAlan)
{
AlignFrame af = null;
af = new AlignFrame(al, view.getWidth(), view.getHeight(),
@@ -2425,8 +3091,8 @@ public class Jalview2XML
for (int i = 0; i < JSEQ.length; i++)
{
- af.viewport.setSequenceColour(af.viewport.alignment.getSequenceAt(i),
- new java.awt.Color(JSEQ[i].getColour()));
+ af.viewport.setSequenceColour(af.viewport.getAlignment()
+ .getSequenceAt(i), new java.awt.Color(JSEQ[i].getColour()));
}
af.viewport.gatherViewsHere = view.getGatheredViews();
@@ -2436,7 +3102,7 @@ public class Jalview2XML
jalview.gui.AlignViewport av = (jalview.gui.AlignViewport) viewportsAdded
.get(uniqueSeqSetId);
- af.viewport.sequenceSetID = uniqueSeqSetId;
+ af.viewport.setSequenceSetId(uniqueSeqSetId);
if (av != null)
{
// propagate shared settings to this new view
@@ -2460,8 +3126,8 @@ public class Jalview2XML
for (int r = 0; r < JSEQ[s].getHiddenSequencesCount(); r++)
{
- hidden.addSequence(al
- .getSequenceAt(JSEQ[s].getHiddenSequences(r)), false);
+ hidden.addSequence(
+ al.getSequenceAt(JSEQ[s].getHiddenSequences(r)), false);
}
af.viewport.hideRepSequences(al.getSequenceAt(s), hidden);
}
@@ -2477,35 +3143,14 @@ public class Jalview2XML
af.viewport.hideSequence(hseqs);
}
- // set visibility of annotation in view
- if ((hideConsensus || hideQuality || hideConservation)
- && al.getAlignmentAnnotation() != null)
- {
- int hSize = al.getAlignmentAnnotation().length;
- for (int h = 0; h < hSize; h++)
- {
- if ((hideConsensus && al.getAlignmentAnnotation()[h].label
- .equals("Consensus"))
- || (hideQuality && al.getAlignmentAnnotation()[h].label
- .equals("Quality"))
- || (hideConservation && al.getAlignmentAnnotation()[h].label
- .equals("Conservation")))
- {
- al.deleteAnnotation(al.getAlignmentAnnotation()[h]);
- hSize--;
- h--;
- }
- }
- af.alignPanel.adjustAnnotationHeight();
- }
// recover view properties and display parameters
if (view.getViewName() != null)
{
af.viewport.viewName = view.getViewName();
af.setInitialTabVisible();
}
- af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(), view
- .getHeight());
+ af.setBounds(view.getXpos(), view.getYpos(), view.getWidth(),
+ view.getHeight());
af.viewport.setShowAnnotation(view.getShowAnnotation());
af.viewport.setAbovePIDThreshold(view.getPidSelected());
@@ -2531,7 +3176,8 @@ public class Jalview2XML
af.viewport.textColour = new java.awt.Color(view.getTextCol1());
af.viewport.textColour2 = new java.awt.Color(view.getTextCol2());
af.viewport.thresholdTextColour = view.getTextColThreshold();
-
+ af.viewport.setShowUnconserved(view.hasShowUnconserved() ? view
+ .isShowUnconserved() : false);
af.viewport.setStartRes(view.getStartRes());
af.viewport.setStartSeq(view.getStartSeq());
@@ -2546,85 +3192,91 @@ public class Jalview2XML
else if (view.getBgColour().startsWith("Annotation"))
{
// int find annotation
- for (int i = 0; i < af.viewport.alignment.getAlignmentAnnotation().length; i++)
+ if (af.viewport.getAlignment().getAlignmentAnnotation() != null)
{
- if (af.viewport.alignment.getAlignmentAnnotation()[i].label
- .equals(view.getAnnotationColours().getAnnotation()))
+ for (int i = 0; i < af.viewport.getAlignment()
+ .getAlignmentAnnotation().length; i++)
{
- if (af.viewport.alignment.getAlignmentAnnotation()[i]
- .getThreshold() == null)
+ if (af.viewport.getAlignment().getAlignmentAnnotation()[i].label
+ .equals(view.getAnnotationColours().getAnnotation()))
{
- af.viewport.alignment.getAlignmentAnnotation()[i]
- .setThreshold(new jalview.datamodel.GraphLine(view
- .getAnnotationColours().getThreshold(),
- "Threshold", java.awt.Color.black)
-
- );
- }
+ if (af.viewport.getAlignment().getAlignmentAnnotation()[i]
+ .getThreshold() == null)
+ {
+ af.viewport.getAlignment().getAlignmentAnnotation()[i]
+ .setThreshold(new jalview.datamodel.GraphLine(view
+ .getAnnotationColours().getThreshold(),
+ "Threshold", java.awt.Color.black)
- if (view.getAnnotationColours().getColourScheme()
- .equals("None"))
- {
- cs = new AnnotationColourGradient(af.viewport.alignment
- .getAlignmentAnnotation()[i], new java.awt.Color(view
- .getAnnotationColours().getMinColour()),
- new java.awt.Color(view.getAnnotationColours()
- .getMaxColour()), view.getAnnotationColours()
- .getAboveThreshold());
- }
- else if (view.getAnnotationColours().getColourScheme()
- .startsWith("ucs"))
- {
- cs = new AnnotationColourGradient(af.viewport.alignment
- .getAlignmentAnnotation()[i], GetUserColourScheme(
- jms, view.getAnnotationColours().getColourScheme()),
- view.getAnnotationColours().getAboveThreshold());
- }
- else
- {
- cs = new AnnotationColourGradient(af.viewport.alignment
- .getAlignmentAnnotation()[i], ColourSchemeProperty
- .getColour(al, view.getAnnotationColours()
- .getColourScheme()), view
- .getAnnotationColours().getAboveThreshold());
- }
+ );
+ }
- // Also use these settings for all the groups
- if (al.getGroups() != null)
- {
- for (int g = 0; g < al.getGroups().size(); g++)
+ if (view.getAnnotationColours().getColourScheme()
+ .equals("None"))
+ {
+ cs = new AnnotationColourGradient(af.viewport
+ .getAlignment().getAlignmentAnnotation()[i],
+ new java.awt.Color(view.getAnnotationColours()
+ .getMinColour()), new java.awt.Color(view
+ .getAnnotationColours().getMaxColour()),
+ view.getAnnotationColours().getAboveThreshold());
+ }
+ else if (view.getAnnotationColours().getColourScheme()
+ .startsWith("ucs"))
+ {
+ cs = new AnnotationColourGradient(af.viewport
+ .getAlignment().getAlignmentAnnotation()[i],
+ GetUserColourScheme(jms, view
+ .getAnnotationColours().getColourScheme()),
+ view.getAnnotationColours().getAboveThreshold());
+ }
+ else
{
- jalview.datamodel.SequenceGroup sg = (jalview.datamodel.SequenceGroup) al
- .getGroups().elementAt(g);
+ cs = new AnnotationColourGradient(af.viewport
+ .getAlignment().getAlignmentAnnotation()[i],
+ ColourSchemeProperty.getColour(al, view
+ .getAnnotationColours().getColourScheme()),
+ view.getAnnotationColours().getAboveThreshold());
+ }
- if (sg.cs == null)
+ // Also use these settings for all the groups
+ if (al.getGroups() != null)
+ {
+ for (int g = 0; g < al.getGroups().size(); g++)
{
- continue;
- }
+ jalview.datamodel.SequenceGroup sg = al.getGroups()
+ .get(g);
- /*
- * if
- * (view.getAnnotationColours().getColourScheme().equals("None")) {
- * sg.cs = new AnnotationColourGradient(
- * af.viewport.alignment.getAlignmentAnnotation()[i], new
- * java.awt.Color(view.getAnnotationColours(). getMinColour()),
- * new java.awt.Color(view.getAnnotationColours().
- * getMaxColour()),
- * view.getAnnotationColours().getAboveThreshold()); } else
- */
- {
- sg.cs = new AnnotationColourGradient(
- af.viewport.alignment.getAlignmentAnnotation()[i],
- sg.cs, view.getAnnotationColours()
- .getAboveThreshold());
- }
+ if (sg.cs == null)
+ {
+ continue;
+ }
+ /*
+ * if
+ * (view.getAnnotationColours().getColourScheme().equals("None"
+ * )) { sg.cs = new AnnotationColourGradient(
+ * af.viewport.getAlignment().getAlignmentAnnotation()[i], new
+ * java.awt.Color(view.getAnnotationColours().
+ * getMinColour()), new
+ * java.awt.Color(view.getAnnotationColours().
+ * getMaxColour()),
+ * view.getAnnotationColours().getAboveThreshold()); } else
+ */
+ {
+ sg.cs = new AnnotationColourGradient(af.viewport
+ .getAlignment().getAlignmentAnnotation()[i],
+ sg.cs, view.getAnnotationColours()
+ .getAboveThreshold());
+ }
+
+ }
}
+
+ break;
}
- break;
}
-
}
}
else
@@ -2635,7 +3287,7 @@ public class Jalview2XML
if (cs != null)
{
cs.setThreshold(view.getPidThreshold(), true);
- cs.setConsensus(af.viewport.hconsensus);
+ cs.setConsensus(af.viewport.getSequenceConsensusHash());
}
}
@@ -2655,6 +3307,69 @@ public class Jalview2XML
{
af.viewport.showSequenceFeatures = true;
}
+ if (view.hasCentreColumnLabels())
+ {
+ af.viewport.setCentreColumnLabels(view.getCentreColumnLabels());
+ }
+ if (view.hasIgnoreGapsinConsensus())
+ {
+ af.viewport.setIgnoreGapsConsensus(view.getIgnoreGapsinConsensus(),
+ null);
+ }
+ if (view.hasFollowHighlight())
+ {
+ af.viewport.followHighlight = view.getFollowHighlight();
+ }
+ if (view.hasFollowSelection())
+ {
+ af.viewport.followSelection = view.getFollowSelection();
+ }
+ if (view.hasShowConsensusHistogram())
+ {
+ af.viewport.setShowConsensusHistogram(view
+ .getShowConsensusHistogram());
+ }
+ else
+ {
+ af.viewport.setShowConsensusHistogram(true);
+ }
+ if (view.hasShowSequenceLogo())
+ {
+ af.viewport.setShowSequenceLogo(view.getShowSequenceLogo());
+ }
+ else
+ {
+ af.viewport.setShowSequenceLogo(false);
+ }
+ if (view.hasNormaliseSequenceLogo())
+ {
+ af.viewport.setNormaliseSequenceLogo(view.getNormaliseSequenceLogo());
+ }
+ if (view.hasShowDbRefTooltip())
+ {
+ af.viewport.setShowDbRefs(view.getShowDbRefTooltip());
+ }
+ if (view.hasShowNPfeatureTooltip())
+ {
+ af.viewport.setShowNpFeats(view.hasShowNPfeatureTooltip());
+ }
+ if (view.hasShowGroupConsensus())
+ {
+ af.viewport.setShowGroupConsensus(view.getShowGroupConsensus());
+ }
+ else
+ {
+ af.viewport.setShowGroupConsensus(false);
+ }
+ if (view.hasShowGroupConservation())
+ {
+ af.viewport.setShowGroupConservation(view.getShowGroupConservation());
+ }
+ else
+ {
+ af.viewport.setShowGroupConservation(false);
+ }
+
// recover featre settings
if (jms.getFeatureSettings() != null)
{
@@ -2664,9 +3379,38 @@ public class Jalview2XML
for (int fs = 0; fs < jms.getFeatureSettings().getSettingCount(); fs++)
{
Setting setting = jms.getFeatureSettings().getSetting(fs);
-
- af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(
- setting.getType(), new java.awt.Color(setting.getColour()));
+ if (setting.hasMincolour())
+ {
+ GraduatedColor gc = setting.hasMin() ? new GraduatedColor(
+ new java.awt.Color(setting.getMincolour()),
+ new java.awt.Color(setting.getColour()),
+ setting.getMin(), setting.getMax()) : new GraduatedColor(
+ new java.awt.Color(setting.getMincolour()),
+ new java.awt.Color(setting.getColour()), 0, 1);
+ if (setting.hasThreshold())
+ {
+ gc.setThresh(setting.getThreshold());
+ gc.setThreshType(setting.getThreshstate());
+ }
+ gc.setAutoScaled(true); // default
+ if (setting.hasAutoScale())
+ {
+ gc.setAutoScaled(setting.getAutoScale());
+ }
+ if (setting.hasColourByLabel())
+ {
+ gc.setColourByLabel(setting.getColourByLabel());
+ }
+ // and put in the feature colour table.
+ af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(
+ setting.getType(), gc);
+ }
+ else
+ {
+ af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setColour(
+ setting.getType(),
+ new java.awt.Color(setting.getColour()));
+ }
renderOrder[fs] = setting.getType();
if (setting.hasOrder())
af.alignPanel.seqPanel.seqCanvas.getFeatureRenderer().setOrder(
@@ -2700,14 +3444,131 @@ public class Jalview2XML
);
}
}
-
+ if (view.getCalcIdParam() != null)
+ {
+ for (CalcIdParam calcIdParam : view.getCalcIdParam())
+ {
+ if (calcIdParam != null)
+ {
+ if (recoverCalcIdParam(calcIdParam, af.viewport))
+ {
+ }
+ else
+ {
+ warn("Couldn't recover parameters for "
+ + calcIdParam.getCalcId());
+ }
+ }
+ }
+ }
af.setMenusFromViewport(af.viewport);
// TODO: we don't need to do this if the viewport is aready visible.
- Desktop.addInternalFrame(af, view.getTitle(), view.getWidth(), view
- .getHeight());
+ Desktop.addInternalFrame(af, view.getTitle(), view.getWidth(),
+ view.getHeight());
+ af.alignPanel.updateAnnotation(false, true); // recompute any autoannotation
+ reorderAutoannotation(af, al, autoAlan);
return af;
}
+ private void reorderAutoannotation(AlignFrame af, Alignment al,
+ ArrayList autoAlan)
+ {
+ // copy over visualization settings for autocalculated annotation in the
+ // view
+ if (al.getAlignmentAnnotation() != null)
+ {
+ /**
+ * Kludge for magic autoannotation names (see JAL-811)
+ */
+ String[] magicNames = new String[]
+ { "Consensus", "Quality", "Conservation" };
+ JvAnnotRow nullAnnot = new JvAnnotRow(-1, null);
+ Hashtable visan = new Hashtable();
+ for (String nm : magicNames)
+ {
+ visan.put(nm, nullAnnot);
+ }
+ for (JvAnnotRow auan : autoAlan)
+ {
+ visan.put(auan.template.label
+ + (auan.template.getCalcId() == null ? "" : "\t"
+ + auan.template.getCalcId()), auan);
+ }
+ int hSize = al.getAlignmentAnnotation().length;
+ ArrayList reorder = new ArrayList();
+ // work through any autoCalculated annotation already on the view
+ // removing it if it should be placed in a different location on the
+ // annotation panel.
+ List remains = new ArrayList(visan.keySet());
+ for (int h = 0; h < hSize; h++)
+ {
+ jalview.datamodel.AlignmentAnnotation jalan = al
+ .getAlignmentAnnotation()[h];
+ if (jalan.autoCalculated)
+ {
+ String k;
+ JvAnnotRow valan = visan.get(k = jalan.label);
+ if (jalan.getCalcId() != null)
+ {
+ valan = visan.get(k = jalan.label + "\t" + jalan.getCalcId());
+ }
+
+ if (valan != null)
+ {
+ // delete the auto calculated row from the alignment
+ al.deleteAnnotation(jalan, false);
+ remains.remove(k);
+ hSize--;
+ h--;
+ if (valan != nullAnnot)
+ {
+ if (jalan != valan.template)
+ {
+ // newly created autoannotation row instance
+ // so keep a reference to the visible annotation row
+ // and copy over all relevant attributes
+ if (valan.template.graphHeight >= 0)
+
+ {
+ jalan.graphHeight = valan.template.graphHeight;
+ }
+ jalan.visible = valan.template.visible;
+ }
+ reorder.add(new JvAnnotRow(valan.order, jalan));
+ }
+ }
+ }
+ }
+ // Add any (possibly stale) autocalculated rows that were not appended to
+ // the view during construction
+ for (String other : remains)
+ {
+ JvAnnotRow othera = visan.get(other);
+ if (othera != nullAnnot && othera.template.getCalcId() != null
+ && othera.template.getCalcId().length() > 0)
+ {
+ reorder.add(othera);
+ }
+ }
+ // now put the automatic annotation in its correct place
+ int s = 0, srt[] = new int[reorder.size()];
+ JvAnnotRow[] rws = new JvAnnotRow[reorder.size()];
+ for (JvAnnotRow jvar : reorder)
+ {
+ rws[s] = jvar;
+ srt[s++] = jvar.order;
+ }
+ reorder.clear();
+ jalview.util.QuickSort.sort(srt, rws);
+ // and re-insert the annotation at its correct position
+ for (JvAnnotRow jvar : rws)
+ {
+ al.addAnnotation(jvar.template, jvar.order);
+ }
+ af.alignPanel.adjustAnnotationHeight();
+ }
+ }
+
Hashtable skipList = null;
/**
@@ -2784,6 +3645,8 @@ public class Jalview2XML
SequenceI[] dsseqs = new SequenceI[dseqs.size()];
dseqs.copyInto(dsseqs);
ds = new jalview.datamodel.Alignment(dsseqs);
+ debug("Created new dataset " + vamsasSet.getDatasetId()
+ + " for alignment " + System.identityHashCode(al));
addDatasetRef(vamsasSet.getDatasetId(), ds);
}
// set the dataset for the newly imported alignment.
@@ -2796,11 +3659,11 @@ public class Jalview2XML
/**
*
* @param vamsasSeq
- * sequence definition to create/merge dataset sequence for
+ * sequence definition to create/merge dataset sequence for
* @param ds
- * dataset alignment
+ * dataset alignment
* @param dseqs
- * vector to add new dataset sequence to
+ * vector to add new dataset sequence to
*/
private void ensureJalviewDatasetSequence(Sequence vamsasSeq,
AlignmentI ds, Vector dseqs)
@@ -2812,7 +3675,7 @@ public class Jalview2XML
jalview.datamodel.SequenceI dsq = null;
if (sq != null && sq.getDatasetSequence() != null)
{
- dsq = (jalview.datamodel.SequenceI) sq.getDatasetSequence();
+ dsq = sq.getDatasetSequence();
}
String sqid = vamsasSeq.getDsseqid();
@@ -2890,7 +3753,9 @@ public class Jalview2XML
}
java.util.Hashtable datasetIds = null;
+
java.util.IdentityHashMap dataset2Ids = null;
+
private Alignment getDatasetFor(String datasetId)
{
if (datasetIds == null)
@@ -2913,35 +3778,40 @@ public class Jalview2XML
}
datasetIds.put(datasetId, dataset);
}
+
/**
* make a new dataset ID for this jalview dataset alignment
+ *
* @param dataset
* @return
*/
private String getDatasetIdRef(jalview.datamodel.Alignment dataset)
{
- if (dataset.getDataset()!=null)
+ if (dataset.getDataset() != null)
{
warn("Serious issue! Dataset Object passed to getDatasetIdRef is not a Jalview DATASET alignment...");
}
- String datasetId=makeHashCode(dataset, null);
- if (datasetId==null)
+ String datasetId = makeHashCode(dataset, null);
+ if (datasetId == null)
{
// make a new datasetId and record it
if (dataset2Ids == null)
{
dataset2Ids = new IdentityHashMap();
- } else {
+ }
+ else
+ {
datasetId = (String) dataset2Ids.get(dataset);
}
- if (datasetId==null)
+ if (datasetId == null)
{
- datasetId = "ds"+dataset2Ids.size()+1;
- dataset2Ids.put(dataset,datasetId);
+ datasetId = "ds" + dataset2Ids.size() + 1;
+ dataset2Ids.put(dataset, datasetId);
}
}
return datasetId;
}
+
private void addDBRefs(SequenceI datasetSequence, Sequence sequence)
{
for (int d = 0; d < sequence.getDBRefCount(); d++)
@@ -2985,7 +3855,7 @@ public class Jalview2XML
MappingChoice mc = m.getMappingChoice();
if (mc.getDseqFor() != null)
{
- String dsfor = ""+mc.getDseqFor();
+ String dsfor = "" + mc.getDseqFor();
if (seqRefIds.containsKey(dsfor))
{
/**
@@ -3028,8 +3898,8 @@ public class Jalview2XML
/**
* make a new dataset sequence and add it to refIds hash
*/
- djs = new jalview.datamodel.Sequence(ms.getName(), ms
- .getSequence());
+ djs = new jalview.datamodel.Sequence(ms.getName(),
+ ms.getSequence());
djs.setStart(jmap.getMap().getToLowest());
djs.setEnd(jmap.getMap().getToHighest());
djs.setVamsasId(uniqueSetSuffix + sqid);
@@ -3061,9 +3931,12 @@ public class Jalview2XML
else
{
uniqueSetSuffix = "";
- jm.getJalviewModelSequence().getViewport(0).setId(null); // we don't overwrite the view we just copied
+ jm.getJalviewModelSequence().getViewport(0).setId(null); // we don't
+ // overwrite the
+ // view we just
+ // copied
}
- if (this.frefedSequence==null)
+ if (this.frefedSequence == null)
{
frefedSequence = new Vector();
}
@@ -3075,10 +3948,11 @@ public class Jalview2XML
af.closeMenuItem_actionPerformed(true);
/*
- * if(ap.av.alignment.getAlignmentAnnotation()!=null) { for(int i=0; i