package org.seqcode.deepseq;
import org.seqcode.genome.Genome;
import org.seqcode.genome.location.Point;
import org.seqcode.genome.location.ScoredRegion;
/**
* StrandedPair represents a pair of reads that are paired together.
* Coordinate is the 5' end of each hit.
* Weight is determined by implementation of hit loading.
*
* @author mahony
*
*/
public class StrandedPair implements Comparable<StrandedPair>{
private Genome gen;
private int r1Chrom, r2Chrom; // int codes for chroms - convert with Genome
private char r1Strand, r2Strand;
private int r1Coordinate, r2Coordinate;
private float weight;
private boolean sameChrom;
public StrandedPair(Genome g, int r1Chr, int r1Coord, char r1Str, int r2Chr, int r2Coord, char r2Str, float w){
gen=g;
r1Chrom = r1Chr;
r2Chrom = r2Chr;
r1Strand = r1Str;
r2Strand = r2Str;
r1Coordinate = r1Coord;
r2Coordinate = r2Coord;
sameChrom = r1Chrom==r2Chrom;
weight = w;
}
/**
* Get the pair midpoint. Returns null if reads on different strands.
* @return
*/
public Point getMidpoint(){
if(!sameChrom)
return null;
else{
return new Point(gen, gen.getChromName(r1Chrom), (r1Coordinate+r2Coordinate)/2);
}
}
/**
* Returns distance between read 5' positions if this is a proper concurrent pair.
* Returns -1 otherwise.
* @return
*/
public int getFragmentSize(){
if(!sameChrom)
return -1;
else if((r1Coordinate<r2Coordinate && r1Strand=='+' && r2Strand=='-') || (r2Coordinate<r1Coordinate && r2Strand=='+' && r1Strand=='-')){
return Math.abs(r2Coordinate-r1Coordinate);
}else{
return -1;
}
}
public void setR1Strand(char strand) {
this.r1Strand = strand;
}
public void setR2Strand(char strand) {
this.r2Strand = strand;
}
public char getR1Strand() {
return r1Strand;
}
public char getR2Strand() {
return r2Strand;
}
public void setR1Coordinate(int coordinate) {
this.r1Coordinate = coordinate;
}
public void setR2Coordinate(int coordinate) {
this.r2Coordinate = coordinate;
}
public int getR1Coordinate() {
return r1Coordinate;
}
public int getR2Coordinate() {
return r2Coordinate;
}
public void setR1Chrom(int chrom){
if(r1Chrom == r2Chrom)
sameChrom=true;
this.r1Chrom=chrom;
}
public void setR2Chrom(int chrom){
if(r1Chrom == r2Chrom)
sameChrom=true;
this.r2Chrom=chrom;
}
public String getR1Chrom(){
return gen.getChromName(r1Chrom);
}
public String getR2Chrom(){
return gen.getChromName(r2Chrom);
}
public boolean pairFromSameChrom(){ return sameChrom; }
public void setWeight(float weight) {
this.weight = weight;
}
public float getWeight() {
return weight;
}
// sort according to R1 coordinate, then by R2 coordinate, then by strands
public int compareTo(StrandedPair b) {
int result;
if (r1Chrom==b.r1Chrom) { //R1 coord
result = r1Coordinate - b.r1Coordinate;
} else {
result = r1Chrom > b.r1Chrom ? +1 : r1Chrom < b.r1Chrom ? -1 : 0;
}
if (result == 0) { //R2 coord
if (r2Chrom == b.r2Chrom) {
result = r2Coordinate - b.r2Coordinate;
} else {
result = r2Chrom > b.r2Chrom ? +1 : r2Chrom < b.r2Chrom ? -1 : 0;
}
}
if (result == 0) //R1 strand
result = (r1Strand==b.r1Strand ? 0 : r1Strand=='+'?1:-1);
if (result == 0) { //R2 strand
result = (r2Strand==b.r2Strand ? 0 : r2Strand=='+'?1:-1);
}
return result;
}
public String toString(){
return new String(gen.getChromName(r1Chrom)+":"+r1Coordinate+":"+r1Strand+"\t"+gen.getChromName(r2Chrom)+":"+r2Coordinate+":"+r2Strand+"\t"+weight);
}
public ScoredRegion toContiguousRegion(){
if(r1Chrom == r2Chrom)
if (r1Coordinate<r1Coordinate) {
return new ScoredRegion(gen, gen.getChromName(r1Chrom), r1Coordinate, r2Coordinate, weight);
} else {
return new ScoredRegion(gen, gen.getChromName(r1Chrom), r2Coordinate, r1Coordinate, weight);
}
else
return null;
}
}