package org.seqcode.viz.metaprofile;
import java.util.List;
import org.seqcode.deepseq.StrandedPair;
import org.seqcode.deepseq.experiments.ControlledExperiment;
import org.seqcode.deepseq.experiments.ExperimentManager;
import org.seqcode.genome.Genome;
import org.seqcode.genome.location.Point;
import org.seqcode.genome.location.Region;
import org.seqcode.genome.location.StrandedPoint;
public class PairedSeqMidpointProfiler implements PointProfiler<Point,PointProfile> {
private Genome genome;
private BinningParameters params;
private ExperimentManager manager=null;
private double perBaseMax=1000;
public PairedSeqMidpointProfiler(Genome gen, BinningParameters ps, ExperimentManager man) {
genome = gen;
manager = man;
params = ps;
/*******NOTE: ExperimentManager needs to be able to handle paired reads before any of this will work****/
}
public BinningParameters getBinningParameters() {
return params;
}
public PointProfile execute(Point a) {
int window = params.getWindowSize();
int left = window/2;
int right = window-left-1;
boolean strand = (a instanceof StrandedPoint) ?
((StrandedPoint)a).getStrand() == '+' : true;
int start = Math.max(1, a.getLocation()-left);
int end = Math.min(a.getLocation()+right, a.getGenome().getChromLength(a.getChrom()));
Region query = new Region(a.getGenome(), a.getChrom(), start, end);
int ext = 200;
Region extQuery = new Region(a.getGenome(), a.getChrom(), start-ext>0 ? start-ext : 1, end+ext < a.getGenome().getChromLength(a.getChrom()) ? end+ext : a.getGenome().getChromLength(a.getChrom()) );
double[] array = new double[params.getNumBins()];
for(int i = 0; i < array.length; i++) { array[i] = 0; }
for(ControlledExperiment expt : manager.getReplicates()){
List<StrandedPair> sps = expt.getSignal().getPairs(extQuery);
for(StrandedPair pair : sps){
Point midpoint = pair.getMidpoint();
if(pair!=null){
if(query.contains(midpoint)){
if (start<=midpoint.getLocation() && end>=midpoint.getLocation()){
int hitLoc = midpoint.getLocation()-start;
if(!strand)
hitLoc = end-midpoint.getLocation();
array[params.findBin(hitLoc)]+=pair.getWeight();
}
}
}
}
}
return new PointProfile(a, params, array, (a instanceof StrandedPoint));
}
public void cleanup(){
}
}