X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FSequence.java;fp=src%2Fjalview%2Fdatamodel%2FSequence.java;h=a61f0939e22f27f652aad0d07a7179b4c349449d;hb=e6134bccddc2c7faad28fad1a4e77ccd0ceb3d84;hp=6c8cbc08979a4b30ac456795a0d4db232f107ba2;hpb=174606cd2bcaed91adb0a39639e8905fa9a8a6d2;p=jalview.git diff --git a/src/jalview/datamodel/Sequence.java b/src/jalview/datamodel/Sequence.java index 6c8cbc0..a61f093 100755 --- a/src/jalview/datamodel/Sequence.java +++ b/src/jalview/datamodel/Sequence.java @@ -25,6 +25,7 @@ import jalview.api.DBRefEntryI; import jalview.util.StringUtils; import java.util.ArrayList; +import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.Vector; @@ -185,12 +186,13 @@ public class Sequence extends ASequence implements SequenceI } /** - * Creates a new Sequence object with new features, DBRefEntries, - * AlignmentAnnotations, and PDBIds but inherits any existing dataset sequence - * reference. + * Creates a new Sequence object with new AlignmentAnnotations but inherits + * any existing dataset sequence reference. If non exists, everything is + * copied. * * @param seq - * DOCUMENT ME! + * if seq is a dataset sequence, behaves like a plain old copy + * constructor */ public Sequence(SequenceI seq) { @@ -213,31 +215,48 @@ public class Sequence extends ASequence implements SequenceI } + /** + * does the heavy lifting when cloning a dataset sequence, or coping data from + * dataset to a new derived sequence. + * + * @param seq + * - source of attributes. + * @param alAnnotation + * - alignment annotation present on seq that should be copied onto + * this sequence + */ protected void initSeqFrom(SequenceI seq, AlignmentAnnotation[] alAnnotation) { - initSeqAndName(seq.getName(), seq.getSequence(), seq.getStart(), + { + char[] oseq = seq.getSequence(); + initSeqAndName(seq.getName(), Arrays.copyOf(oseq, oseq.length), + seq.getStart(), seq.getEnd()); + } description = seq.getDescription(); sourceDBRef = seq.getSourceDBRef() == null ? null : new DBRefEntry( seq.getSourceDBRef()); - if (seq.getSequenceFeatures() != null) + if (seq != datasetSequence) { - SequenceFeature[] sf = seq.getSequenceFeatures(); - for (int i = 0; i < sf.length; i++) - { - addSequenceFeature(new SequenceFeature(sf[i])); - } + setDatasetSequence(seq.getDatasetSequence()); } - setDatasetSequence(seq.getDatasetSequence()); if (datasetSequence == null && seq.getDBRefs() != null) { - // only copy DBRefs if we really are a dataset sequence + // only copy DBRefs and seqfeatures if we really are a dataset sequence DBRefEntry[] dbr = seq.getDBRefs(); for (int i = 0; i < dbr.length; i++) { addDBRef(new DBRefEntry(dbr[i])); } + if (seq.getSequenceFeatures() != null) + { + SequenceFeature[] sf = seq.getSequenceFeatures(); + for (int i = 0; i < sf.length; i++) + { + addSequenceFeature(new SequenceFeature(sf[i])); + } + } } if (seq.getAnnotation() != null) { @@ -274,22 +293,30 @@ public class Sequence extends ASequence implements SequenceI } } - /** - * DOCUMENT ME! - * - * @param v - * DOCUMENT ME! - */ + @Override public void setSequenceFeatures(SequenceFeature[] features) { - sequenceFeatures = features; + if (datasetSequence == null) + { + sequenceFeatures = features; + } + else + { + System.err + .println("Warning: JAL-2046 side effect ? Possible implementation error: overwriting dataset sequence features by setting sequence features on alignment"); + datasetSequence.setSequenceFeatures(features); + } } @Override public synchronized void addSequenceFeature(SequenceFeature sf) { - // TODO add to dataset sequence instead if there is one? + if (sequenceFeatures==null && datasetSequence != null) + { + datasetSequence.addSequenceFeature(sf); + return; + } if (sequenceFeatures == null) { sequenceFeatures = new SequenceFeature[0]; @@ -315,6 +342,9 @@ public class Sequence extends ASequence implements SequenceI { if (sequenceFeatures == null) { + if (datasetSequence!=null) { + datasetSequence.deleteFeature(sf); + } return; } @@ -1037,31 +1067,24 @@ public class Sequence extends ASequence implements SequenceI @Override public SequenceI deriveSequence() { - SequenceI seq = new Sequence(this); - if (datasetSequence != null) - { - // duplicate current sequence with same dataset - seq.setDatasetSequence(datasetSequence); - } - else + Sequence seq=null; + if (datasetSequence == null) { if (isValidDatasetSequence()) { // Use this as dataset sequence + seq = new Sequence(getName(), "", 1, -1); seq.setDatasetSequence(this); + seq.initSeqFrom(this, getAnnotation()); + return seq; } else { // Create a new, valid dataset sequence - SequenceI ds = seq; - ds.setSequence(AlignSeq.extractGaps( - jalview.util.Comparison.GapChars, new String(sequence))); - setDatasetSequence(ds); - ds.setSequenceFeatures(getSequenceFeatures()); - seq = this; // and return this sequence as the derived sequence. + createDatasetSequence(); } } - return seq; + return new Sequence(this); } /* @@ -1074,20 +1097,27 @@ public class Sequence extends ASequence implements SequenceI { if (datasetSequence == null) { - datasetSequence = new Sequence(getName(), AlignSeq.extractGaps( + Sequence dsseq = new Sequence(getName(), AlignSeq.extractGaps( jalview.util.Comparison.GapChars, getSequenceAsString()), getStart(), getEnd()); - datasetSequence.setSequenceFeatures(getSequenceFeatures()); - datasetSequence.setDescription(getDescription()); - setSequenceFeatures(null); - // move database references onto dataset sequence - datasetSequence.setDBRefs(getDBRefs()); - setDBRefs(null); - datasetSequence.setPDBId(getAllPDBEntries()); - setPDBId(null); + + datasetSequence = dsseq; + + dsseq.setDescription(description); + // move features and database references onto dataset sequence + dsseq.sequenceFeatures = sequenceFeatures; + sequenceFeatures=null; + dsseq.dbrefs = dbrefs; + dbrefs=null; + // TODO: search and replace any references to this sequence with + // references to the dataset sequence in Mappings on dbref + dsseq.pdbIds = pdbIds; + pdbIds = null; datasetSequence.updatePDBIds(); if (annotation != null) { + // annotation is cloned rather than moved, to preserve what's currently + // on the alignment for (AlignmentAnnotation aa : annotation) { AlignmentAnnotation _aa = new AlignmentAnnotation(aa);