import jalview.analysis.PCA;
import jalview.analysis.scoremodels.ScoreModels;
import jalview.analysis.scoremodels.SimilarityParams;
+import jalview.api.AlignmentViewPanel;
import jalview.api.FeatureColourI;
import jalview.api.ViewStyleI;
import jalview.api.analysis.ScoreModelI;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
-import java.lang.reflect.InvocationTargetException;
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.net.URL;
* core method for storing state for a set of AlignFrames.
*
* @param frames
- * - frames involving all data to be exported (including containing
- * splitframes)
+ * - frames involving all data to be exported (including those
+ * contained in splitframes, though not the split frames themselves)
* @param jout
* - project output stream
*/
private void saveAllFrames(List<AlignFrame> frames, JarOutputStream jout)
{
+
Hashtable<String, AlignFrame> dsses = new Hashtable<>();
/*
for (int i = frames.size() - 1; i > -1; i--)
{
AlignFrame af = frames.get(i);
+ AlignViewport vp = af.getViewport();
// skip ?
if (skipList != null && skipList
- .containsKey(af.getViewport().getSequenceSetId()))
+ .containsKey(vp.getSequenceSetId()))
{
continue;
}
String shortName = makeFilename(af, shortNames);
- int apSize = af.getAlignPanels().size();
-
+ AlignmentI alignment = vp.getAlignment();
+ List<? extends AlignmentViewPanel> panels = af.getAlignPanels();
+ int apSize = panels.size();
for (int ap = 0; ap < apSize; ap++)
- {
- AlignmentPanel apanel = (AlignmentPanel) af.getAlignPanels()
- .get(ap);
+ {
+ AlignmentPanel apanel = (AlignmentPanel) panels.get(ap);
String fileName = apSize == 1 ? shortName : ap + shortName;
if (!fileName.endsWith(".xml"))
{
}
saveState(apanel, fileName, jout, viewIds);
-
- String dssid = getDatasetIdRef(
- af.getViewport().getAlignment().getDataset());
+ }
+ if (apSize > 0)
+ {
+ // BH moved next bit out of inner loop, not that it really matters.
+ // so we are testing to make sure we actually have an alignment,
+ // apparently.
+ String dssid = getDatasetIdRef(alignment.getDataset());
if (!dsses.containsKey(dssid))
{
+ // We have not already covered this data by reference from another
+ // frame.
dsses.put(dssid, af);
}
}
}
}
+ /**
+ * Each AlignFrame has a single data set associated with it. Note that none of
+ * these frames are split frames, because Desktop.getAlignFrames() collects
+ * top and bottom separately here.
+ *
+ * @param dsses
+ * @param fileName
+ * @param jout
+ */
private void writeDatasetFor(Hashtable<String, AlignFrame> dsses,
String fileName, JarOutputStream jout)
{
- // BH: Question: What is this Dataset for, as it seems to
- // duplicate the actual XML file data.
+ // Note that in saveAllFrames we have associated each specific dataset to
+ // ONE of its associated frames.
for (String dssids : dsses.keySet())
{
{
try
{
- SwingUtilities.invokeAndWait(new Runnable()
+ // BH 2019 -- can't wait
+ SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
JarEntry jarentry = null;
int entryCount = 1;
+ // Look for all the entry names ending with ".xml"
+ // This includes all panels and at least one frame.
+// Platform.timeCheck(null, Platform.TIME_MARK);
do
{
jin = jprovider.getJarInputStream();
jarentry = jin.getNextJarEntry();
}
String name = (jarentry == null ? null : jarentry.getName());
- if (name != null && name.endsWith(".xml")
- // The question here is what to do with the two
- // .xml files in the jvp file. They are identical?
- // && name.indexOf(" Dataset for ") < 0 // BH 2019.05.21
- // we need to talk about how to avoid the full duplication of
- // reading these.
- )
+ if (name != null && name.endsWith(".xml"))
{
+
+ // The question here is what to do with the two
+ // .xml files in the jvp file.
+ // Some number of them, "...Dataset for...", will be the
+ // Only AlignPanels and will have Viewport.
+ // One or more will be the source data, with the DBRefs.
+ //
+ // JVP file writing (above) ensures tha the AlignPanels are written
+ // first, then all relevant datasets (which are
+ // Jalview.datamodel.Alignment).
+ //
+
+// Platform.timeCheck("Jalview2XML JAXB " + name, Platform.TIME_MARK);
JAXBContext jc = JAXBContext
.newInstance("jalview.xml.binding.jalview");
XMLStreamReader streamReader = XMLInputFactory.newInstance()
javax.xml.bind.Unmarshaller um = jc.createUnmarshaller();
JAXBElement<JalviewModel> jbe = um
.unmarshal(streamReader, JalviewModel.class);
- JalviewModel object = jbe.getValue();
+ JalviewModel model = jbe.getValue();
if (true) // !skipViewport(object))
{
- _af = loadFromObject(object, file, true, jprovider);
- if (_af != null && object.getViewport().size() > 0)
- // getJalviewModelSequence().getViewportCount() > 0)
+ // Q: Do we have to load from the model, even if it
+ // does not have a viewport, could we discover that early on?
+ // Q: Do we need to load this object?
+ _af = loadFromObject(model, file, true, jprovider);
+// Platform.timeCheck("Jalview2XML.loadFromObject",
+ // Platform.TIME_MARK);
+ if (_af != null && model.getViewport().size() > 0)
{
+ // That is, this is one of the AlignmentPanel models
if (af == null)
{
// store a reference to the first view
af.getViewport().getAlignment().getDataset());
}
}
+// Platform.timeCheck("JAXB " + name, Platform.TIME_MARK);
entryCount++;
}
else if (jarentry != null)
entryCount++;
}
} while (jarentry != null);
+// Platform.timeCheck("JAXB loop exit", Platform.TIME_MARK);
resolveFrefedSequences();
+// Platform.timeCheck("JAXB resolveFrefed", Platform.TIME_MARK);
+
} catch (IOException ex)
{
ex.printStackTrace();
}
/**
- * Load alignment frame from jalview XML DOM object
+ * Load alignment frame from jalview XML DOM object. For a DOM object that
+ * includes one or more Viewport elements (one with a title that does NOT
+ * contain "Dataset for"), create the frame.
*
* @param jalviewModel
* DOM
AlignFrame loadFromObject(JalviewModel jalviewModel, String file,
boolean loadTreesAndStructures, jarInputStreamProvider jprovider)
{
+
+// Platform.timeCheck("Jalview2XML.loadFromObject0", Platform.TIME_MARK);
+
SequenceSet vamsasSet = jalviewModel.getVamsasModel().getSequenceSet().get(0);
List<Sequence> vamsasSeqs = vamsasSet.getSequence();
+
// JalviewModelSequence jms = object.getJalviewModelSequence();
// Viewport view = (jms.getViewportCount() > 0) ? jms.getViewport(0)
: view.getId() + uniqueSetSuffix);
}
+// Platform.timeCheck("Jalview2XML.loadFromObject1", Platform.TIME_MARK);
// ////////////////////////////////
// LOAD SEQUENCES
SequenceI tmpSeq = seqRefIds.get(seqId);
if (tmpSeq != null)
{
+ //
if (!incompleteSeqs.containsKey(seqId))
{
// may not need this check, but keep it for at least 2.9,1 release
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-seq",
+// Platform.TIME_MARK);
// /
// Create the alignment object from the sequence set
// ///////////////////////////////
recoverDatasetFor(vamsasSet, al, isdsal, uniqueSeqSetId);
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-align",
+// Platform.TIME_MARK);
if (referenceseqForView != null)
{
al.setSeqrep(referenceseqForView);
al.setProperty(ssp.getKey(), ssp.getValue());
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-setseqprop",
+// Platform.TIME_MARK);
// ///////////////////////////////
Hashtable pdbloaded = new Hashtable(); // TODO nothing writes to this??
}
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-endmultiview",
+// Platform.TIME_MARK);
} // end !multipleview
// ///////////////////////////////
al.addCodonFrame(cf);
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-seqmap",
+// Platform.TIME_MARK);
}
// ////////////////////////////////
}
// Construct new annotation from model.
List<AnnotationElement> ae = annotation.getAnnotationElement();
+// System.err.println(
+// "Jalview2XML processing " + ae.size() + " annotations");
+
jalview.datamodel.Annotation[] anot = null;
java.awt.Color firstColour = null;
int anpos;
}
}
}
+ // create the new AlignmentAnnotation
jalview.datamodel.AlignmentAnnotation jaa = null;
if (annotation.isGraph())
jaa._linecolour = firstColour;
}
// register new annotation
+ // Annotation graphs such as Conservation will not have id.
if (annotation.getId() != null)
{
annotationIds.put(annotation.getId(), jaa);
al.addAnnotation(jaa);
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-annot",
+// Platform.TIME_MARK);
}
// ///////////////////////
// LOAD GROUPS
jGroup.getAnnotationColours(), null, al, jalviewModel, false));
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-groups",
+// Platform.TIME_MARK);
}
if (view == null)
{
// ///////////////////////////////
// LOAD VIEWPORT
- AlignFrame af = null;
- AlignViewport av = null;
// now check to see if we really need to create a new viewport.
if (multipleView && viewportsAdded.size() == 0)
{
}
}
+// Platform.timeCheck("Jalview2XML.loadFromObject-viewport",
+// Platform.TIME_MARK);
}
/**
* indicate that annotation colours are applied across all groups (pre
boolean doGroupAnnColour = Jalview2XML.isVersionStringLaterThan("2.8.1",
jalviewModel.getVersion());
+ AlignFrame af = null;
AlignmentPanel ap = null;
- boolean isnewview = true;
+ AlignViewport av = null;
if (viewId != null)
{
// Check to see if this alignment already has a view id == viewId
{
for (int v = 0; v < views.length; v++)
{
- if (views[v].av.getViewId().equalsIgnoreCase(viewId))
+ ap = views[v];
+ av = ap.av;
+ if (av.getViewId().equalsIgnoreCase(viewId))
{
// recover the existing alignpanel, alignframe, viewport
- af = views[v].alignFrame;
- av = views[v].av;
- ap = views[v];
+ af = ap.alignFrame;
+ break;
// TODO: could even skip resetting view settings if we don't want to
// change the local settings from other jalview processes
- isnewview = false;
}
}
}
}
- if (isnewview)
+ if (af == null)
{
af = loadViewport(file, jseqs, hiddenSeqs, al, jalviewModel, view,
uniqueSeqSetId, viewId, autoAlan);
av = af.getViewport();
+ // note that this only retrieves the most recently accessed
+ // tab of an AlignFrame.
ap = af.alignPanel;
}
*
* Not done if flag is false (when this method is used for New View)
*/
+ final AlignFrame af0 = af;
+ final AlignViewport av0 = av;
+ final AlignmentPanel ap0 = ap;
+// Platform.timeCheck("Jalview2XML.loadFromObject-beforetree",
+// Platform.TIME_MARK);
if (loadTreesAndStructures)
{
- loadTrees(jalviewModel, view, af, av, ap);
- loadPCAViewers(jalviewModel, ap);
- loadPDBStructures(jprovider, jseqs, af, ap);
- loadRnaViewers(jprovider, jseqs, ap);
+ if (!jalviewModel.getTree().isEmpty())
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+// Platform.timeCheck(null, Platform.TIME_MARK);
+ loadTrees(jalviewModel, view, af0, av0, ap0);
+// Platform.timeCheck("Jalview2XML.loadTrees", Platform.TIME_MARK);
+ }
+ });
+ }
+ if (!jalviewModel.getPcaViewer().isEmpty())
+ {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+// Platform.timeCheck(null, Platform.TIME_MARK);
+ loadPCAViewers(jalviewModel, ap0);
+// Platform.timeCheck("Jalview2XML.loadPCA", Platform.TIME_MARK);
+ }
+ });
+ }
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+// Platform.timeCheck(null, Platform.TIME_MARK);
+ loadPDBStructures(jprovider, jseqs, af0, ap0);
+// Platform.timeCheck("Jalview2XML.loadPDB", Platform.TIME_MARK);
+ }
+ });
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ loadRnaViewers(jprovider, jseqs, ap0);
+ }
+ });
}
// and finally return.
return af;
* @param jseqs
* @param ap
*/
- private void loadRnaViewers(jarInputStreamProvider jprovider,
+ protected void loadRnaViewers(jarInputStreamProvider jprovider,
List<JSeq> jseqs, AlignmentPanel ap)
{
/*
final AlignFrame alf = af;
final Rectangle rect = new Rectangle(svattrib.getX(), svattrib.getY(),
svattrib.getWidth(), svattrib.getHeight());
- try
- {
- javax.swing.SwingUtilities.invokeAndWait(new Runnable()
+ // try
+ // {
+ javax.swing.SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
}
}
});
- } catch (InvocationTargetException ex)
- {
- warn("Unexpected error when opening Jmol view.", ex);
-
- } catch (InterruptedException e)
- {
- // e.printStackTrace();
- }
+ // } catch (InvocationTargetException ex)
+ // {
+ // warn("Unexpected error when opening Jmol view.", ex);
+ //
+ // } catch (InterruptedException e)
+ // {
+ // // e.printStackTrace();
+ // }
}