- SequenceI datasetSequence;
- String name;
- private String sequence;
- String description;
- int start;
- int end;
- Color color = Color.white;
- Vector pdbIds;
- String vamsasId;
- DBRefEntry [] dbrefs;
-
- /** This annotation is displayed below the alignment but the
- * positions are tied to the residues of this sequence */
- Vector annotation;
-
- /** DOCUMENT ME!! */
- public SequenceFeature [] sequenceFeatures;
-
- /** This array holds hidden sequences
- * of which this sequence is the representitive member of a group
- */
- SequenceGroup hiddenSequences;
-
- /**
- * Creates a new Sequence object.
- *
- * @param name DOCUMENT ME!
- * @param sequence DOCUMENT ME!
- * @param start DOCUMENT ME!
- * @param end DOCUMENT ME!
- */
- public Sequence(String name, String sequence, int start, int end)
- {
- this.name = name;
- this.sequence = sequence;
- this.start = start;
- this.end = end;
-
- parseId();
-
- checkValidRange();
- }
-
- com.stevesoft.pat.Regex limitrx = new com.stevesoft.pat.Regex(
- "[/][0-9]{1,}[-][0-9]{1,}$");
- com.stevesoft.pat.Regex endrx = new com.stevesoft.pat.Regex(
- "[0-9]{1,}$");
-
- void parseId()
- {
- // Does sequence have the /start-end signiature?
- if(limitrx.search(name))
- {
- name = limitrx.left();
- endrx.search(limitrx.stringMatched());
- setStart( Integer.parseInt( limitrx.stringMatched().substring(1,endrx.matchedFrom()-1 )));
- setEnd( Integer.parseInt( endrx.stringMatched() ));
- }
- }
-
- void checkValidRange()
- {
- if (end < 1)
+ SequenceI datasetSequence;
+
+ String name;
+
+ private char[] sequence;
+
+ String description;
+
+ int start;
+
+ int end;
+
+ Vector pdbIds;
+
+ String vamsasId;
+
+ DBRefEntry[] dbrefs;
+
+ /**
+ * This annotation is displayed below the alignment but the positions are tied
+ * to the residues of this sequence
+ */
+ Vector annotation;
+
+ /**
+ * The index of the sequence in a MSA
+ */
+ int index = -1;
+
+ /** array of seuqence features - may not be null for a valid sequence object */
+ public SequenceFeature[] sequenceFeatures;
+
+ /**
+ * Creates a new Sequence object.
+ *
+ * @param name
+ * display name string
+ * @param sequence
+ * string to form a possibly gapped sequence out of
+ * @param start
+ * first position of non-gap residue in the sequence
+ * @param end
+ * last position of ungapped residues (nearly always only used for
+ * display purposes)
+ */
+ public Sequence(String name, String sequence, int start, int end)
+ {
+ this.name = name;
+ this.sequence = sequence.toCharArray();
+ this.start = start;
+ this.end = end;
+ parseId();
+ checkValidRange();
+ }
+
+ public Sequence(String name, char[] sequence, int start, int end)
+ {
+ this.name = name;
+ this.sequence = sequence;
+ this.start = start;
+ this.end = end;
+ parseId();
+ checkValidRange();
+ }
+
+ com.stevesoft.pat.Regex limitrx = new com.stevesoft.pat.Regex(
+ "[/][0-9]{1,}[-][0-9]{1,}$");
+
+ com.stevesoft.pat.Regex endrx = new com.stevesoft.pat.Regex("[0-9]{1,}$");
+
+ void parseId()
+ {
+ if (name == null)
+ {
+ System.err
+ .println("POSSIBLE IMPLEMENTATION ERROR: null sequence name passed to constructor.");
+ name = "";
+ }
+ // Does sequence have the /start-end signiature?
+ if (limitrx.search(name))
+ {
+ name = limitrx.left();
+ endrx.search(limitrx.stringMatched());
+ setStart(Integer.parseInt(limitrx.stringMatched().substring(1,
+ endrx.matchedFrom() - 1)));
+ setEnd(Integer.parseInt(endrx.stringMatched()));
+ }
+ }
+
+ void checkValidRange()
+ {
+ // Note: JAL-774 :
+ // http://issues.jalview.org/browse/JAL-774?focusedCommentId=11239&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-11239
+ {
+ int endRes = 0;
+ for (int j = 0; j < sequence.length; j++)
+ {
+ if (!jalview.util.Comparison.isGap(sequence[j]))
+ {
+ endRes++;
+ }
+ }
+ if (endRes > 0)
+ {
+ endRes += start - 1;
+ }
+
+ if (end < endRes)
+ {
+ end = endRes;
+ }
+ }
+
+ }
+
+ /**
+ * Creates a new Sequence object.
+ *
+ * @param name
+ * DOCUMENT ME!
+ * @param sequence
+ * DOCUMENT ME!
+ */
+ public Sequence(String name, String sequence)
+ {
+ this(name, sequence, 1, -1);
+ }
+
+ /**
+ * Creates a new Sequence object with new features, DBRefEntries,
+ * AlignmentAnnotations, and PDBIds but inherits any existing dataset sequence
+ * reference.
+ *
+ * @param seq
+ * DOCUMENT ME!
+ */
+ public Sequence(SequenceI seq)
+ {
+ this(seq, seq.getAnnotation());
+ }
+
+ /**
+ * Create a new sequence object with new features, DBRefEntries, and PDBIds
+ * but inherits any existing dataset sequence reference, and duplicate of any
+ * annotation that is present in the given annotation array.
+ *
+ * @param seq
+ * the sequence to be copied
+ * @param alAnnotation
+ * an array of annotation including some associated with seq
+ */
+ public Sequence(SequenceI seq, AlignmentAnnotation[] alAnnotation)
+ {
+ this(seq.getName(), seq.getSequence(), seq.getStart(), seq.getEnd());
+ description = seq.getDescription();
+ if (seq.getSequenceFeatures() != null)
+ {
+ SequenceFeature[] sf = seq.getSequenceFeatures();
+ for (int i = 0; i < sf.length; i++)
+ {
+ addSequenceFeature(new SequenceFeature(sf[i]));
+ }
+ }
+ setDatasetSequence(seq.getDatasetSequence());
+ if (datasetSequence == null && seq.getDBRef() != null)
+ {
+ // only copy DBRefs if we really are a dataset sequence
+ DBRefEntry[] dbr = seq.getDBRef();
+ for (int i = 0; i < dbr.length; i++)
+ {
+ addDBRef(new DBRefEntry(dbr[i]));
+ }
+ }
+ if (seq.getAnnotation() != null)
+ {
+ AlignmentAnnotation[] sqann = seq.getAnnotation();
+ for (int i = 0; i < sqann.length; i++)