package org.seqcode.deepseq.events;
import java.util.List;
import org.seqcode.data.io.RegionFileUtilities;
import org.seqcode.deepseq.StrandedBaseCount;
import org.seqcode.deepseq.experiments.ControlledExperiment;
import org.seqcode.deepseq.experiments.ExperimentCondition;
import org.seqcode.deepseq.experiments.ExperimentManager;
import org.seqcode.deepseq.experiments.ExptConfig;
import org.seqcode.genome.GenomeConfig;
import org.seqcode.genome.location.StrandedPoint;
import org.seqcode.gseutils.Args;
public class BindingModelMaker {
protected ExperimentManager experiments;
protected List<StrandedPoint> points;
protected Integer win;
public BindingModelMaker(List<StrandedPoint> p, ExperimentManager e, int w){
experiments = e;
win = w;
points = p;
}
public void execute(){
double[] watson = new double[win];
double[] crick = new double[win];
for(ExperimentCondition c : experiments.getConditions()){
for(ControlledExperiment r : c.getReplicates()){
//Reset
for(int w=0; w<win; w++){
watson[w]=0; crick[w]=0;
}
//Iterate through points
for(StrandedPoint pt : points){
//Load reads
List<StrandedBaseCount> wReads = r.getSignal().getStrandedBases(pt.expand(win), pt.getStrand());
List<StrandedBaseCount> cReads = r.getSignal().getStrandedBases(pt.expand(win), pt.getStrand()=='+' ? '-' : '+');
if(pt.getStrand()=='+'){
for(StrandedBaseCount sbc : wReads){
int sdist = sbc.getCoordinate()-pt.getLocation()+(win/2);
if(sdist>=0 && sdist<win)
watson[sdist]+=sbc.getCount();
}
for(StrandedBaseCount sbc : cReads){
int sdist = pt.getLocation()-sbc.getCoordinate()+(win/2);
if(sdist>=0 && sdist<win)
crick[sdist]+=sbc.getCount();
}
}else{
for(StrandedBaseCount sbc : wReads){
int sdist = pt.getLocation()-sbc.getCoordinate()+(win/2);
if(sdist>=0 && sdist<win)
watson[sdist]+=sbc.getCount();
}
for(StrandedBaseCount sbc : cReads){
int sdist = sbc.getCoordinate()-pt.getLocation()+(win/2);
if(sdist>=0 && sdist<win)
crick[sdist]+=sbc.getCount();
}
}
}
//Print
for(int w=0; w<win; w++){
System.out.println(w-(win/2)+"\t"+watson[w]+"\t"+crick[w]);
}
}
}
}
//Main
public static void main(String[] args){
GenomeConfig gcon = new GenomeConfig(args);
ExptConfig econ = new ExptConfig(gcon.getGenome(), args);
if(gcon.helpWanted()){
System.err.println("BindingModelMaker:");
System.err.println("\t--points <stranded point file>");
System.err.println("\t--win <window around points>");
}else{
ExperimentManager manager = new ExperimentManager(econ);
int w = Args.parseInteger(args, "win", 400);
String pFile = Args.parseString(args, "points", null);
List<StrandedPoint> pts = RegionFileUtilities.loadStrandedPointsFromFile(gcon.getGenome(), pFile);
BindingModelMaker maker = new BindingModelMaker(pts, manager, w);
maker.execute();
manager.close();
}
}
}