package aliview.sequences; import java.io.IOException; import java.io.OutputStream; import java.io.Writer; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; // import org.bitbucket.kienerj.io.OptimizedRandomAccessFile; import aliview.AminoAcid; import aliview.NucleotideUtilities; import aliview.sequencelist.AlignmentListModel; import aliview.sequencelist.Interval; import aliview.sequencelist.MemoryMappedSequencesFile; public class FileSequence extends BasicSequence { private static final Logger logger = Logger.getLogger(FileSequence.class); public FileSequence(MemoryMappedSequencesFile sequencesFile, long startPointer) { this(new FileSequenceBases(sequencesFile, startPointer)); } public FileSequence(FileSequenceBases fileSequenceBases) { super(fileSequenceBases); } public FileSequence(FileSequence template) { super(template); } /* * This is called when creating sequences from an .fai index file */ public FileSequence(MemoryMappedSequencesFile sequencesFile, int seqIndex, String name, int seqWithoutWhitespaceLength, long seqAfterNameStartPointer, long endPointer, int lineCharLength, int lineAbsoluteLength) { this(new FileSequenceBases(sequencesFile, seqAfterNameStartPointer, endPointer, seqAfterNameStartPointer)); this.name = name; // These are not used currently //this.seqWithoutWhitespaceLength = seqWithoutWhitespaceLength; //this.sequenceAfterNameStartPointer = seqAfterNameStartPointer; //this.lineCharLength = lineCharLength; //this.lineAbsoluteLength = lineAbsoluteLength; } public FileSequence getCopy() { return new FileSequence(this); } public long getEndPointer(){ return getFileSequenceBases().getEndPointer(); } public void setEndPointer(long pointer) { getFileSequenceBases().setEndPointer(pointer); } public void setSequenceAfterNameStartPointer(long pointer) { getFileSequenceBases().setSequenceAfterNameStartPointer(pointer); } public long getSequenceAfterNameStartPointer(){ return getFileSequenceBases().getSequenceAfterNameStartPointer(); } private FileSequenceBases getFileSequenceBases(){ return (FileSequenceBases) bases; } public byte getBaseAtPos(int n) { return (byte) getBases().get(n); } public int getBaseAsIntAtPos(int n) { return getBases().get(n); } // TO DO this is not working if seq is to large public byte[] getAllBasesAsByteArray(){ return getBases().toByteArray(); } public void writeBases(OutputStream out) throws IOException{ for(int n = 0; n < getLength(); n++){ int base = getBaseAsIntAtPos(n); if(base == ' ' || base == '\n' || base =='\r'){ } else{ out.write(base); } } } public void writeBases(Writer out) throws IOException { for(int n = 0; n < getLength(); n++){ int base = getBaseAsIntAtPos(n); if(base == ' ' || base == '\n' || base =='\r'){ } else{ out.write((char)base); } } } public Interval find(Pattern pattern, int startPos) { Interval foundInterval = null; // split into chunks length = 5MB int buffSize = 5000*1000; for(int buffStart = startPos; buffStart < getLength(); buffStart += buffSize){ StringBuilder buff = new StringBuilder(); for(int n = buffStart; n < getLength() && n < (buffStart + buffSize); n++){ byte next = (byte)getBaseAsIntAtPos(n); if(next != NucleotideUtilities.GAP){ buff.append((char)next); } } // Allocate a Matcher object from the compiled regexe pattern, // and provide the input to the Matcher Matcher matcher = pattern.matcher(buff); boolean wasFound = matcher.find(0); if(wasFound){ int foundStart = matcher.start(); int foundEnd = matcher.end() - 1; foundInterval = new Interval(foundStart+buffStart, foundEnd+buffStart); } else{ // logger.info("not found"); } } return foundInterval; } public void reverseComplement() { // TODO Auto-generated method stub } public void complement() { // TODO Auto-generated method stub } public void replaceBases(int startReplaceIndex, int stopReplaceIndex, byte[] insertBases) { // TODO Auto-generated method stub } public void replaceSelectedBasesWithGap() { // TODO Auto-generated method stub } public void deleteSelectedBases() { // TODO Auto-generated method stub } public void deleteBasesFromMask(boolean[] deleteMask) { // TODO Auto-generated method stub } public void clearBase(int n) { // TODO Auto-generated method stub } public void rightPadSequenceWithGaps(int diffLen) { // TODO Auto-generated method stub } public void leftPadSequenceWithGaps(int diffLen) { // TODO Auto-generated method stub } public void setSelectionOffset(int selectionOffset) { // TODO Auto-generated method stub } public void moveSelectedResiduesRightIfGapIsPresent() { // TODO Auto-generated method stub } public void moveSelectedResiduesLeftIfGapIsPresent() { // TODO Auto-generated method stub } public void moveSelectedResiduesRightIfGapOrEndIsPresent() { // TODO Auto-generated method stub } public boolean isGapOrEndRightOfSelection() { // TODO Auto-generated method stub return false; } public boolean isGapRightOfSelection() { // TODO Auto-generated method stub return false; } public boolean isGapLeftOfSelection() { // TODO Auto-generated method stub return false; } public void deleteGapLeftOfSelection() { // TODO Auto-generated method stub } public void deleteGapRightOfSelection() { // TODO Auto-generated method stub } public void replaceSelectedBasesWithChar(char newChar) { // TODO Auto-generated method stub } public void realignNucleotidesUseThisAASequenceAsTemplate(byte[] allBasesAsByteArray) { // TODO Auto-generated method stub } public void selectAllBasesUntilGap(int x) { // TODO Auto-generated method stub } public int indexOf(char testChar) { logger.warn("This might take a long time"); return super.indexOf(testChar); } public int countChar(char targetChar, int startpos, int endpos) { logger.warn("This might take a long time"); return super.countChar(targetChar, startpos, endpos); } public int getUngapedLength() { logger.warn("this could take a lot of time and ruin memory"); return -1; } public int[] getSequenceAsBaseVals() { logger.warn("this could take a lot of time and ruin memory"); return super.getSequenceAsBaseVals(); } public int getUngapedPos(int position) { logger.warn("this could take a lot of time"); return super.getUngapedPos(position); } }