From: jprocter Date: Thu, 30 Aug 2007 16:01:38 +0000 (+0000) Subject: ensure codon mappings and database references are merged back onto alignment X-Git-Tag: Release_2_4~291 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=684da8b2ac49893bb776763b317a2bf24b9e5501;p=jalview.git ensure codon mappings and database references are merged back onto alignment --- diff --git a/src/jalview/gui/Jalview2XML.java b/src/jalview/gui/Jalview2XML.java index e57e748..62a05df 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(); } } @@ -1399,7 +1400,6 @@ public class Jalview2XML { // older jalview projects do not have a dataset id. al.setDataset(null); - // addDatasetRef(al.getDataset()); } else { @@ -1440,7 +1440,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 +1467,6 @@ public class Jalview2XML al.getSequenceAt(i).getDatasetSequence().addPDBId(entry); } } - if (vamsasSeq[i].getDBRefCount() > 0) - { - addDBRefs(al.getSequenceAt(i).getDatasetSequence(), vamsasSeq[i]); - } } } @@ -2139,79 +2138,105 @@ 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); } - - } - // 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()); - 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()); - } - System.err - .println("DEBUG Notice: Merged dataset sequence (" - + (pre ? "prepended" : "") + " " - + (post ? "appended" : "")); + } else { + // make this dataset sequence sq's dataset sequence + sq.setDatasetSequence(dsq); } } - // create a new dataset - if (ds == null) + // 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) { - 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); + StringBuffer sb = new StringBuffer(); + String newres = jalview.analysis.AlignSeq.extractGaps( + jalview.util.Comparison.GapChars, sq.getSequenceAsString()); + 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()); + } + System.err + .println("DEBUG Notice: Merged dataset sequence (" + + (pre ? "prepended" : "") + " " + + (post ? "appended" : "")); } } @@ -2299,18 +2324,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);