package bio.pih.genoogle.search;
import bio.pih.genoogle.io.Utils;
/**
* HSP
*
* @author albrecht
*/
public final class RetrievedArea {
private int queryAreaBegin;
private int queryAreaEnd;
private int sequenceAreaBegin;
private int sequenceAreaEnd;
private int length;
public RetrievedArea(int queryAreaBegin, int sequenceAreaBegin, int subSequenceLength) {
reset(queryAreaBegin, sequenceAreaBegin, subSequenceLength);
}
private RetrievedArea(int queryAreaBegin, int queryAreaEnd, int sequenceAreaBegin, int sequenceAreaEnd, int length) {
this.queryAreaBegin = queryAreaBegin;
this.queryAreaEnd = queryAreaEnd;
this.sequenceAreaBegin = sequenceAreaBegin;
this.sequenceAreaEnd = sequenceAreaEnd;
this.length = length;
}
public void reset(int queryAreaBegin, int sequenceAreaBegin, int subSequenceLength) {
this.queryAreaBegin = queryAreaBegin;
this.queryAreaEnd = queryAreaBegin + subSequenceLength;
this.sequenceAreaBegin = sequenceAreaBegin;
this.sequenceAreaEnd = sequenceAreaBegin + subSequenceLength;
this.length = subSequenceLength;
}
public RetrievedArea copy() {
return new RetrievedArea(queryAreaBegin, queryAreaEnd, sequenceAreaBegin, sequenceAreaEnd, length);
}
public int length() {
return this.length;
}
public boolean testAndSet(final int newQueryPos, final int newSequencePos, final int maxSubSequenceDistance, final int subSequenceLength) {
if (Utils.isIn(queryAreaBegin, queryAreaEnd + maxSubSequenceDistance, newQueryPos)) {
if (Utils.isIn(sequenceAreaBegin, sequenceAreaEnd + maxSubSequenceDistance, newSequencePos)) {
int newQueryPosEnd = newQueryPos + subSequenceLength;
if (newQueryPosEnd > this.queryAreaEnd) {
this.queryAreaEnd = newQueryPosEnd;
}
int newSequencePosEnd = newSequencePos + subSequenceLength;
if (newSequencePosEnd > this.sequenceAreaEnd) {
this.sequenceAreaEnd = newSequencePosEnd;
}
this.length = Math.min(queryAreaEnd - queryAreaBegin, sequenceAreaEnd - sequenceAreaBegin);
return true;
}
}
return false;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("([");
sb.append(queryAreaBegin);
sb.append(",");
sb.append(queryAreaEnd);
sb.append("]");
sb.append("[");
sb.append(sequenceAreaBegin);
sb.append(",");
sb.append(sequenceAreaEnd);
sb.append("]:");
sb.append(length);
sb.append(")");
return sb.toString();
}
public int getQueryAreaBegin() {
return queryAreaBegin;
}
public int getQueryAreaEnd() {
return queryAreaEnd;
}
public int getSequenceAreaBegin() {
return sequenceAreaBegin;
}
public int getSequenceAreaEnd() {
return sequenceAreaEnd;
}
}