X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fgui%2FJalview2XML.java;h=aab41cabccd92614870e97a0bff4796afaeb69c5;hb=d08e816685826d0cb6f79b046b4d09bff1a6d68c;hp=e57e7486e8bc7dafc5b2a77e5f235b1aa9b8a2ab;hpb=10e5f98521859f56139ca49860b2678e78e61da7;p=jalview.git diff --git a/src/jalview/gui/Jalview2XML.java b/src/jalview/gui/Jalview2XML.java index e57e748..aab41ca 100755 --- a/src/jalview/gui/Jalview2XML.java +++ b/src/jalview/gui/Jalview2XML.java @@ -188,6 +188,7 @@ public class Jalview2XML jout.close(); } catch (Exception ex) { + //TODO: inform user of the problem - they need to know if their data was not saved ! ex.printStackTrace(); } } @@ -966,9 +967,10 @@ public class Jalview2XML } else { + vamsasSeq.setDsseqid(id + ""); // so we can tell which sequences really are dataset sequences only dbrefs = jds.getDBRef(); } - if (jds.getDBRef() != null) + if (dbrefs != null) { for (int d = 0; d < dbrefs.length; d++) { @@ -1399,7 +1401,6 @@ public class Jalview2XML { // older jalview projects do not have a dataset id. al.setDataset(null); - // addDatasetRef(al.getDataset()); } else { @@ -1440,7 +1441,10 @@ public class Jalview2XML al.getSequenceAt(i).getDatasetSequence().addSequenceFeature(sf); } } - + if (vamsasSeq[i].getDBRefCount() > 0) + { + addDBRefs(al.getSequenceAt(i).getDatasetSequence(), vamsasSeq[i]); + } if (JSEQ[i].getPdbidsCount() > 0) { Pdbids[] ids = JSEQ[i].getPdbids(); @@ -1464,10 +1468,6 @@ public class Jalview2XML al.getSequenceAt(i).getDatasetSequence().addPDBId(entry); } } - if (vamsasSeq[i].getDBRefCount() > 0) - { - addDBRefs(al.getSequenceAt(i).getDatasetSequence(), vamsasSeq[i]); - } } } @@ -2139,80 +2139,114 @@ public class Jalview2XML for (int i = 0, iSize = vamsasSet.getSequenceCount(); i < iSize; i++) { Sequence vamsasSeq = vamsasSet.getSequence(i); - jalview.datamodel.Sequence sq = null; - String sqid = vamsasSeq.getDsseqid(); + ensureJalviewDatasetSequence(vamsasSeq, ds, dseqs); + } + // create a new dataset + if (ds == null) + { + SequenceI[] dsseqs = new SequenceI[dseqs.size()]; + dseqs.copyInto(dsseqs); + ds = new jalview.datamodel.Alignment(dsseqs); + addDatasetRef(vamsasSet.getDatasetId(), ds); + } + // set the dataset for the newly imported alignment. + if (al.getDataset() == null) + { + al.setDataset(ds); + } + } + + + /** + * + * @param vamsasSeq sequence definition to create/merge dataset sequence for + * @param ds dataset alignment + * @param dseqs vector to add new dataset sequence to + */ + private void ensureJalviewDatasetSequence(Sequence vamsasSeq, AlignmentI ds, Vector dseqs) + { + jalview.datamodel.Sequence sq = (jalview.datamodel.Sequence) seqRefIds.get(vamsasSeq.getId()); + jalview.datamodel.SequenceI dsq = null; + if (sq!=null && sq.getDatasetSequence()!=null) + { + dsq = (jalview.datamodel.SequenceI) sq.getDatasetSequence(); + } + + String sqid = vamsasSeq.getDsseqid(); + if (dsq==null) + { + // need to create or add a new dataset sequence reference to this sequence if (sqid != null) { - sq = (jalview.datamodel.Sequence) seqRefIds.get(vamsasSeq - .getDsseqid()); + dsq = (jalview.datamodel.SequenceI) seqRefIds.get(sqid); } - if (sq == null) + // check again + if (dsq == null) { - sq = (jalview.datamodel.Sequence) seqRefIds.get(vamsasSeq.getId()); - jalview.datamodel.SequenceI dsq = sq.createDatasetSequence(); + // make a new dataset sequence + dsq = sq.createDatasetSequence(); if (sqid == null) { // make up a new dataset reference for this sequence sqid = "" + dsq.hashCode(); } - ((SequenceI) dsq).setVamsasId(uniqueSetSuffix + sqid); + dsq.setVamsasId(uniqueSetSuffix + sqid); seqRefIds.put(sqid, dsq); if (ds == null) { - dseqs.addElement(dsq); + if (dseqs!=null) + { + dseqs.addElement(dsq); + } } else { ds.addSequence(dsq); } - + } else { + if (sq!=dsq) + { // make this dataset sequence sq's dataset sequence + sq.setDatasetSequence(dsq); + } } - // TODO: refactor: This is a low-level sequence operation - effectively merging one dataset sequence into another. - // check that dataset sequence really is the union of all references to it - boolean pre = sq.getStart() < sq.getDatasetSequence().getStart(); - boolean post = sq.getEnd() > sq.getDatasetSequence().getEnd(); - if (pre || post) - { - SequenceI dsq = sq.getDatasetSequence(); - StringBuffer sb = new StringBuffer(); - String newres = jalview.analysis.AlignSeq.extractGaps( - jalview.util.Comparison.GapChars, sq.getSequenceAsString()); + } + // TODO: refactor this as a merge dataset sequence function + // now check that sq (the dataset sequence) sequence really is the union of all references to it + //boolean pre = sq.getStart() < dsq.getStart(); + //boolean post = sq.getEnd() > dsq.getEnd(); + //if (pre || post) + if (sq!=dsq) + { + StringBuffer sb = new StringBuffer(); + String newres = jalview.analysis.AlignSeq.extractGaps( + jalview.util.Comparison.GapChars, sq.getSequenceAsString()); + if (!newres.equalsIgnoreCase(dsq.getSequenceAsString()) && newres.length()>dsq.getLength()) + { + // Update with the longer sequence. synchronized (dsq) { - sb.append(dsq.getSequence()); - if (pre) - { - sb.insert(0, newres - .substring(0, dsq.getStart() - sq.getStart())); - dsq.setStart(sq.getStart()); - } - if (post) - { - sb.append(newres.substring(newres.length() - sq.getEnd() - - dsq.getEnd())); - dsq.setEnd(sq.getEnd()); - } - dsq.setSequence(sb.toString()); + /*if (pre) + { + sb.insert(0, newres + .substring(0, dsq.getStart() - sq.getStart())); + dsq.setStart(sq.getStart()); + } + if (post) + { + sb.append(newres.substring(newres.length() - sq.getEnd() + - dsq.getEnd())); + dsq.setEnd(sq.getEnd()); } + */ + dsq.setSequence(sb.toString()); + } + //TODO: merges will never happen if we 'know' we have the real dataset sequence - this should be detected when id==dssid System.err - .println("DEBUG Notice: Merged dataset sequence (" - + (pre ? "prepended" : "") + " " - + (post ? "appended" : "")); + .println("DEBUG Notice: Merged dataset sequence"); // (" + // + (pre ? "prepended" : "") + " " + //+ (post ? "appended" : "")); } } - // create a new dataset - if (ds == null) - { - SequenceI[] dsseqs = new SequenceI[dseqs.size()]; - dseqs.copyInto(dsseqs); - ds = new jalview.datamodel.Alignment(dsseqs); - addDatasetRef(vamsasSet.getDatasetId(), ds); - } - // set the dataset for the newly imported alignment. - if (al.getDataset() == null) - { - al.setDataset(ds); - } } java.util.Hashtable datasetIds = null; @@ -2299,18 +2333,38 @@ public class Jalview2XML else { /** - * make a new sequence and add it to refIds hash + * local sequence definition */ Sequence ms = mc.getSequence(); - jalview.datamodel.Sequence djs = new jalview.datamodel.Sequence(ms + jalview.datamodel.Sequence djs=null; + String sqid = ms.getDsseqid(); + if (sqid!=null && sqid.length()>0) + { + /* + * recover dataset sequence + */ + djs = (jalview.datamodel.Sequence) seqRefIds.get(sqid); + } else { + System.err.println("Warning - making up dataset sequence id for DbRef sequence map reference"); + sqid = ""+ms.hashCode(); // make up a new hascode for undefined dataset sequence hash (unlikely to happen) + } + + if (djs==null) { + /** + * make a new dataset sequence and add it to refIds hash + */ + djs = new jalview.datamodel.Sequence(ms .getName(), ms.getSequence()); - djs.setStart(jmap.getMap().getToLowest()); - djs.setEnd(jmap.getMap().getToHighest()); - djs.setVamsasId(uniqueSetSuffix + ms.getId()); - jmap.setTo(djs); - seqRefIds.put(ms.getId(), djs); + djs.setStart(jmap.getMap().getToLowest()); + djs.setEnd(jmap.getMap().getToHighest()); + djs.setVamsasId(uniqueSetSuffix + sqid); + jmap.setTo(djs); + seqRefIds.put(sqid, djs); + + } jalview.bin.Cache.log.debug("about to recurse on addDBRefs."); addDBRefs(djs, ms); + } } return (jmap);