001 /*
002 * BioJava development code
003 *
004 * This code may be freely distributed and modified under the
005 * terms of the GNU Lesser General Public Licence. This should
006 * be distributed with the code. If you do not have a copy,
007 * see:
008 *
009 * http://www.gnu.org/copyleft/lesser.html
010 *
011 * Copyright for this code is held jointly by the individual
012 * authors. These should be listed in @author doc comments.
013 *
014 * For more information on the BioJava project and its aims,
015 * or to join the biojava-l mailing list, visit the home page
016 * at:
017 *
018 * http://www.biojava.org/
019 *
020 * Created on 01-21-2010
021 */
022 package org.biojava3.core.sequence.transcription;
023
024 import org.biojava3.core.sequence.compound.NucleotideCompound;
025 import org.biojava3.core.sequence.template.Sequence;
026 import org.biojava3.core.sequence.views.ComplementSequenceView;
027 import org.biojava3.core.sequence.views.ReversedSequenceView;
028
029 /**
030 * Indicates a way of translating a sequence.
031 *
032 * @author ayates
033 */
034 public enum Frame {
035 ONE(1, false),
036 TWO(2, false),
037 THREE(3, false),
038 REVERSED_ONE(1, true),
039 REVERSED_TWO(2, true),
040 REVERSED_THREE(3, true);
041
042 private final boolean reverse;
043 private final int start;
044
045 private Frame(int start, boolean reverse) {
046 this.start = start;
047 this.reverse = reverse;
048 }
049
050 public static Frame getDefaultFrame() {
051 return ONE;
052 }
053
054 /**
055 * Returns all frames in the forward orientation
056 */
057 public static Frame[] getForwardFrames() {
058 return new Frame[]{ONE,TWO,THREE};
059 }
060
061 /**
062 * Returns all frames which are in the reverse orientation
063 */
064 public static Frame[] getReverseFrames() {
065 return new Frame[]{REVERSED_ONE,REVERSED_TWO,REVERSED_THREE};
066 }
067
068 /**
069 * Delegates to {@link Frame#values()}
070 */
071 public static Frame[] getAllFrames() {
072 return Frame.values();
073 }
074
075 /**
076 * Optionally wraps a Sequence in a reverse complementing view (if the
077 * frame is on the reverse strand) and creates a sub sequence view if
078 * it is required.
079 *
080 * If you pass in {@link #ONE} in you will get the same {@link Sequence}
081 * returned.
082 */
083 public <C extends NucleotideCompound> Sequence<C> wrap(Sequence<C> incoming) {
084 Sequence<C> reversed;
085 if(reverse) {
086 reversed = new ComplementSequenceView<C>(new ReversedSequenceView<C>(incoming));
087 }
088 else {
089 reversed = incoming;
090 }
091
092 Sequence<C> finalSeq;
093
094 if(start == 1) {
095 finalSeq = reversed;
096 }
097 else {
098 finalSeq = reversed.getSubSequence(start, reversed.getLength());
099 }
100
101 return finalSeq;
102 }
103
104 }