package aliview.sequences; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Arrays; import org.apache.commons.lang.ArrayUtils; import org.apache.log4j.Logger; import aliview.NucleotideUtilities; import aliview.sequencelist.MemoryMappedSequencesFile; import aliview.utils.ArrayUtilities; public class FileSequenceBases implements Bases { private static final Logger logger = Logger.getLogger(FileSequenceBases.class); private static final String TEXT_FILE_BYTE_ENCODING = "ASCII"; protected MemoryMappedSequencesFile sequencesFile; private long startPointer; private long endPointer; private long sequenceAfterNameStartPointer; public FileSequenceBases(MemoryMappedSequencesFile sequencesFile, long startPointer, long endPointer, long sequenceAfterNameStartPointer) { this.sequencesFile = sequencesFile; this.startPointer = startPointer; this.endPointer = endPointer; this.sequenceAfterNameStartPointer = sequenceAfterNameStartPointer; } public FileSequenceBases(MemoryMappedSequencesFile sequencesFile, long startPointer) { this.sequencesFile = sequencesFile; this.startPointer = startPointer; } public FileSequenceBases getCopy(){ return new FileSequenceBases(sequencesFile, startPointer, endPointer, sequenceAfterNameStartPointer); } public int getLength(){ long len = (getEndPointer() - getStartPointer()) - (getSequenceAfterNameStartPointer() - getStartPointer()); // +1 because seq end pointer is inclusive return (int)len; } protected long getSequenceAfterNameStartPointer(){ return sequenceAfterNameStartPointer; } protected long getStartPointer(){ return startPointer; } protected long getEndPointer(){ return endPointer; } protected void setEndPointer(long end) { this.endPointer = end; } protected void setSequenceAfterNameStartPointer(long seqStartPointer) { this.sequenceAfterNameStartPointer = seqStartPointer; } public byte get(int n) { return (byte) sequencesFile.readInFile(getSequenceAfterNameStartPointer() + n); } public char charAt(int n) { return (char) get(n); } public byte[] toByteArray() { return toByteArray(0, this.getLength() - 1); } public byte[] toByteArray(int startIndexInclusive, int endIndexInclusive) { // TODO Problem if to big if(this.getLength() > 100 * 1000 * 1000){ return null; } int subSize = endIndexInclusive - startIndexInclusive + 1; // +1 because end index is inclusive if(subSize >= 0){ byte[] subarray = new byte[subSize]; int subIndex = 0; for(int n = startIndexInclusive; n <= endIndexInclusive; n++){ subarray[subIndex] = get(n); subIndex ++; } return subarray; } return null; } @Override public String toString() { logger.warn("Maybe string could be to big...."); return super.toString(); } public void set(int n, byte newBase) { } private void assureSize(int n) { } private void resize(int n) { } // convenience public void append(byte[] newBytes) { } public void moveBaseLeft(int n) { } public void moveBaseRight(int n) { } public void insertAt(int n, byte[] newBytes) { } public void replace(int startReplaceIndex, int stopReplaceIndex, byte[] insertBases) { } public void deleteAll(byte target) { } public void delete(int[] toDelete) { } // ????? public void complement() { } // ????? public void reverse() { } // convenience method public void set(int n, char c) { } // convenience public void delete(int pos) { } // convenience public void insertAt(int n, byte newByte) { } }