X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FSequence.java;h=4219c8ef1023acff6ecaf97a56677cdeda468c44;hb=3d4ead4880755ec949de0300c232544ba965e60d;hp=0acf7017a271bb325d42d238834f84b3bb61b5be;hpb=b3a1578f1b29594527e347534f39ffc4e5b37298;p=jalview.git diff --git a/src/jalview/datamodel/Sequence.java b/src/jalview/datamodel/Sequence.java index 0acf701..4219c8e 100755 --- a/src/jalview/datamodel/Sequence.java +++ b/src/jalview/datamodel/Sequence.java @@ -27,7 +27,6 @@ import jalview.util.Comparison; import jalview.util.DBRefUtils; import jalview.util.MapList; import jalview.util.StringUtils; -import jalview.ws.params.InvalidArgumentException; import java.util.ArrayList; import java.util.Arrays; @@ -48,37 +47,40 @@ import fr.orsay.lri.varna.models.rna.RNA; public class Sequence extends ASequence implements SequenceI { - /** - * A subclass that gives us access to modCount, which tracks - * whether there have been any changes. We use this to update - * @author hansonr - * - * @param - */ + /** + * A subclass that gives us access to modCount, which tracks whether there + * have been any changes. We use this to update + * + * @author hansonr + * + * @param + */ @SuppressWarnings("serial") - protected class DBModList extends ArrayList { + public class DBModList extends ArrayList + { + + protected int getModCount() + { + return modCount; + } - protected int getModCount() { - return modCount; - } - } -SequenceI datasetSequence; + SequenceI datasetSequence; - String name; + private String name; private char[] sequence; - String description; + private String description; - int start; + private int start; - int end; + private int end; - Vector pdbIds; + private Vector pdbIds; - String vamsasId; + private String vamsasId; private DBModList dbrefs; // controlled access @@ -89,15 +91,15 @@ SequenceI datasetSequence; */ private int refModCount = 0; - RNA rna; - + private RNA rna; + /** * This annotation is displayed below the alignment but the positions are tied * to the residues of this sequence * * TODO: change to List<> */ - Vector annotation; + private Vector annotation; private SequenceFeaturesI sequenceFeatureStore; @@ -302,7 +304,7 @@ SequenceI datasetSequence; { setDatasetSequence(seq.getDatasetSequence()); } - + /* * only copy DBRefs and seqfeatures if we really are a dataset sequence */ @@ -377,8 +379,8 @@ SequenceI datasetSequence; { if (sf.getType() == null) { - System.err.println("SequenceFeature type may not be null: " - + sf.toString()); + System.err.println( + "SequenceFeature type may not be null: " + sf.toString()); return false; } @@ -597,8 +599,8 @@ SequenceI datasetSequence; public char[] getSequence() { // return sequence; - return sequence == null ? null : Arrays.copyOf(sequence, - sequence.length); + return sequence == null ? null + : Arrays.copyOf(sequence, sequence.length); } /* @@ -694,8 +696,8 @@ SequenceI datasetSequence; public void setGeneLoci(String speciesId, String assemblyId, String chromosomeId, MapList map) { - addDBRef(new DBRefEntry(speciesId, assemblyId, DBRefEntry.CHROMOSOME - + ":" + chromosomeId, new Mapping(map))); + addDBRef(new DBRefEntry(speciesId, assemblyId, + DBRefEntry.CHROMOSOME + ":" + chromosomeId, new Mapping(map))); } /** @@ -724,6 +726,11 @@ SequenceI datasetSequence; @Override public String getAssemblyId() { + // DEV NOTE: DBRefEntry is reused here to hold chromosomal locus + // of a gene sequence. + // source=species, version=assemblyId, accession=chromosome, map = + // positions. + return ref.getVersion(); } @@ -731,8 +738,8 @@ SequenceI datasetSequence; public String getChromosomeId() { // strip off "chromosome:" prefix to chrId - return ref.getAccessionId().substring( - DBRefEntry.CHROMOSOME.length() + 1); + return ref.getAccessionId() + .substring(DBRefEntry.CHROMOSOME.length() + 1); } @Override @@ -903,7 +910,7 @@ SequenceI datasetSequence; { return findPosition(column + 1, cursor); } - + // TODO recode this more naturally i.e. count residues only // as they are found, not 'in anticipation' @@ -1090,7 +1097,7 @@ SequenceI datasetSequence; * {@inheritDoc} */ @Override - public Range findPositions(int fromColumn, int toColumn) + public ContiguousI findPositions(int fromColumn, int toColumn) { if (toColumn < fromColumn || fromColumn < 1) { @@ -1208,7 +1215,7 @@ SequenceI datasetSequence; { ArrayList map = new ArrayList<>(); int lastj = -1, j = 0; - int pos = start; + // int pos = start; int seqlen = sequence.length; while ((j < seqlen)) { @@ -1242,7 +1249,7 @@ SequenceI datasetSequence; { BitSet map = new BitSet(); int lastj = -1, j = 0; - int pos = start; + // int pos = start; int seqlen = sequence.length; while ((j < seqlen)) { @@ -1410,35 +1417,22 @@ SequenceI datasetSequence; vamsasId = id; } - @SuppressWarnings("deprecation") -@Override - public void setDBRefs(List newDBrefs) throws InvalidArgumentException + @Deprecated + @Override + public void setDBRefs(DBModList newDBrefs) { if (dbrefs == null && datasetSequence != null && this != datasetSequence) { - datasetSequence.setDBRefs((DBModList)newDBrefs); + datasetSequence.setDBRefs(newDBrefs); return; } - if (newDBrefs != null && !(newDBrefs instanceof DBModList)) - throw new InvalidArgumentException("DBrefs must have DBModList class"); - - dbrefs = (DBModList)newDBrefs; + dbrefs = newDBrefs; refModCount = 0; } @Override - public void getDBRefsFrom(SequenceI seq) { - try { - setDBRefs(seq.getDBRefs()); - } catch (InvalidArgumentException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - - @Override - public List getDBRefs() + public DBModList getDBRefs() { if (dbrefs == null && datasetSequence != null && this != datasetSequence) @@ -1448,7 +1442,6 @@ SequenceI datasetSequence; return dbrefs; } - @Override public void addDBRef(DBRefEntry entry) { @@ -1460,10 +1453,10 @@ SequenceI datasetSequence; if (dbrefs == null) { - dbrefs = new DBModList(); + dbrefs = new DBModList<>(); } - for (int ib = 0, nb= dbrefs.size(); ib < nb; ib++) + for (int ib = 0, nb = dbrefs.size(); ib < nb; ib++) { if (dbrefs.get(ib).updateFrom(entry)) { @@ -1475,19 +1468,18 @@ SequenceI datasetSequence; } } + // /// BH OUCH! + // /* + // * extend the array to make room for one more + // */ + // // TODO use an ArrayList instead + // int j = dbrefs.length; + // List temp = new DBRefEntry[j + 1]; + // System.arraycopy(dbrefs, 0, temp, 0, j); + // temp[temp.length - 1] = entry; + // + // dbrefs = temp; -// /// BH OUCH! -// /* -// * extend the array to make room for one more -// */ -// // TODO use an ArrayList instead -// int j = dbrefs.length; -// List temp = new DBRefEntry[j + 1]; -// System.arraycopy(dbrefs, 0, temp, 0, j); -// temp[temp.length - 1] = entry; -// -// dbrefs = temp; - dbrefs.add(entry); } @@ -1601,7 +1593,7 @@ SequenceI datasetSequence; private int _seqhash = 0; -private List primaryRefs; + private List primaryRefs; /** * Answers false if the sequence is more than 85% nucleotide (ACGTU), else @@ -1777,8 +1769,9 @@ private List primaryRefs; List sfs = entry.getSequenceFeatures(); for (SequenceFeature feature : sfs) { - SequenceFeature sf[] = (mp != null) ? mp.locateFeature(feature) - : new SequenceFeature[] { new SequenceFeature(feature) }; + SequenceFeature sf[] = (mp != null) ? mp.locateFeature(feature) + : new SequenceFeature[] + { new SequenceFeature(feature) }; if (sf != null) { for (int sfi = 0; sfi < sf.length; sfi++) @@ -1880,7 +1873,7 @@ private List primaryRefs; } private List tmpList; - + @Override public List getPrimaryDBRefs() { @@ -1895,17 +1888,22 @@ private List primaryRefs; synchronized (dbrefs) { if (refModCount == dbrefs.getModCount() && primaryRefs != null) - return primaryRefs; // no changes - refModCount = dbrefs.getModCount(); - List primaries = (primaryRefs == null ? (primaryRefs = new ArrayList<>()) : primaryRefs); + { + return primaryRefs; // no changes + } + refModCount = dbrefs.getModCount(); + List primaries = (primaryRefs == null + ? (primaryRefs = new ArrayList<>()) + : primaryRefs); primaries.clear(); - if (tmpList == null) { - tmpList = new ArrayList<>(); - tmpList.add(null); // for replacement + if (tmpList == null) + { + tmpList = new ArrayList<>(); + tmpList.add(null); // for replacement } for (int i = 0, n = dbrefs.size(); i < n; i++) { - DBRefEntry ref = dbrefs.get(i); + DBRefEntry ref = dbrefs.get(i); if (!ref.isPrimaryCandidate()) { continue; @@ -1920,7 +1918,8 @@ private List primaryRefs; } } // whilst it looks like it is a primary ref, we also sanity check type - if (DBRefSource.PDB_CANONICAL_NAME.equals(ref.getCanonicalSourceName())) + if (DBRefSource.PDB_CANONICAL_NAME + .equals(ref.getCanonicalSourceName())) { // PDB dbrefs imply there should be a PDBEntry associated // TODO: tighten PDB dbrefs @@ -1933,18 +1932,23 @@ private List primaryRefs; { continue; } - } else { - // check standard protein or dna sources - tmpList.set(0, ref); - List res = DBRefUtils.selectDbRefs(!isProtein(), tmpList); - if (res == null || res.get(0) != tmpList.get(0)) - { - continue; - } - } + } + else + { + // check standard protein or dna sources + tmpList.set(0, ref); + List res = DBRefUtils.selectDbRefs(!isProtein(), + tmpList); + if (res == null || res.get(0) != tmpList.get(0)) + { + continue; + } + } primaries.add(ref); } - + + // version must be not null, as otherwise it will not be a candidate, + // above DBRefUtils.ensurePrimaries(this, primaries); return primaries; } @@ -1963,15 +1967,15 @@ private List primaryRefs; List result = getFeatures().findFeatures(startPos, endPos, types); - if (datasetSequence != null) - { - result = datasetSequence.getFeatures().findFeatures(startPos, endPos, - types); - } - else - { - result = sequenceFeatureStore.findFeatures(startPos, endPos, types); - } + // if (datasetSequence != null) + // { + // result = datasetSequence.getFeatures().findFeatures(startPos, endPos, + // types); + // } + // else + // { + // result = sequenceFeatureStore.findFeatures(startPos, endPos, types); + // } /* * if end column is gapped, endPos may be to the right, @@ -2022,6 +2026,7 @@ private List primaryRefs; @Override public void sequenceChanged() { + argb = null; changeCount++; } @@ -2123,4 +2128,54 @@ private List primaryRefs; // otherwise, sequence was completely hidden return 0; } + + private int[] argb; + + @Override + public int getColor(int i) + { + return argb == null ? 0 : argb[i]; + } + + @Override + public int setColor(int i, int rgb) + { + if (argb == null) + { + argb = new int[this.sequence.length]; + } + return (argb[i] = rgb); + } + + @Override + public void resetColors() + { + argb = null; + } + + /** + * @author Bob Hanson 2019.07.30 + * + * allows passing the result ArrayList as a parameter to avoid + * unnecessary construction + * @return result (JavaScript) or new ArrayList (Java -- see FeatureRender) + * + */ + @Override + public List findFeatures(int column, String type, + List result) + { + return getFeatures().findFeatures(findPosition(column - 1), type, + result); + } + + /** + * allows early intervention for renderer if this returns false + */ + @Override + public boolean hasFeatures(String type) + { + return getFeatures().hasFeatures(type); + } + }