package org.seqcode.deepseq.events;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
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.gseutils.Args;
public class BindingEventFilter {
protected ExperimentManager experiments;
protected EventsConfig config;
protected List<BindingEvent> events;
protected double sigThres=0.01;
protected double maxLogFold=8.0, minLogFold=-8.0;
//Constructor
public BindingEventFilter(ExperimentManager e, EventsConfig c, List<BindingEvent> ev, double st){
experiments = e;
config = c;
events = ev;
sigThres = st;
}
/**
* Filter the events a number of different ways
*/
public void execute(){
/*//TEST
try{
String testName = "TEST.events";
FileWriter fw1 = new FileWriter(testName);
fw1.write(BindingEvent.headString()+"\n");
for(BindingEvent e : events){
fw1.write(e.toString()+"\n");
}
fw1.close();
} catch (IOException e) {
e.printStackTrace();
}*/
for(ExperimentCondition c1 : experiments.getConditions()){
for(ExperimentCondition c2 : experiments.getConditions()){
if(c1!=c2){
try{
//1) List of sites enriched in one condition more than another
String outName = c1.getName()+"_gt_"+c2.getName()+".events";
FileWriter fw = new FileWriter(outName);
fw.write(BindingEvent.fullHeadString()+"\n");
for(BindingEvent e : events){
if(e.getCondSigVCtrlP(c1)<=sigThres && e.getInterCondP(c1, c2)<=sigThres)
fw.write(e.toString()+"\n");
}
fw.close();
//2) List of sites enriched in either condition
outName = c1.getName()+"_or_"+c2.getName()+".events";
fw = new FileWriter(outName);
fw.write(BindingEvent.fullHeadString()+"\n");
for(BindingEvent e : events){
if(e.getCondSigVCtrlP(c1)<=sigThres || e.getCondSigVCtrlP(c2)<=sigThres)
fw.write(e.toString()+"\n");
}
fw.close();
//3) List of sites enriched similarly in both conditions
outName = c1.getName()+"_sim_"+c2.getName()+".events";
fw = new FileWriter(outName);
fw.write(BindingEvent.fullHeadString()+"\n");
for(BindingEvent e : events){
if(e.getCondSigVCtrlP(c1)<=sigThres && e.getCondSigVCtrlP(c2)<=sigThres && e.getInterCondP(c1, c2)>sigThres && e.getInterCondFold(c1, c2)<2)
fw.write(e.toString()+"\n");
}
fw.close();
//4) Scatter plot data
String outNameA = c1.getName()+"_vs_"+c2.getName()+".unscaled.scatter";
FileWriter fwAll = new FileWriter(outNameA);
String outNameB = c1.getName()+"_vs_"+c2.getName()+".outliers.unscaled.scatter";
FileWriter fwOut = new FileWriter(outNameB);
for(BindingEvent e : events){
if(e.getCondSigVCtrlP(c1)<=sigThres || e.getCondSigVCtrlP(c2)<=sigThres)
fwAll.write(e.getPoint().getLocationString()+"\t"+e.getCondSigHits(c1)+"\t"+e.getCondSigHits(c2)+"\n");
if(e.getCondSigVCtrlP(c1)<=sigThres && e.getInterCondP(c1, c2)<=sigThres)
fwOut.write(e.getPoint().getLocationString()+"\t"+e.getCondSigHits(c1)+"\t"+e.getCondSigHits(c2)+"\n");
if(e.getCondSigVCtrlP(c2)<=sigThres && e.getInterCondP(c2, c1)<=sigThres)
fwOut.write(e.getPoint().getLocationString()+"\t"+e.getCondSigHits(c1)+"\t"+e.getCondSigHits(c2)+"\n");
}
fwAll.close();
fwOut.close();
//5) Mean/fold data
outNameA = c1.getName()+"_vs_"+c2.getName()+".scaledmean.meanfold";
fwAll = new FileWriter(outNameA);
outNameB = c1.getName()+"_vs_"+c2.getName()+".outliers.scaledmean.meanfold";
fwOut = new FileWriter(outNameB);
for(BindingEvent e : events){
double logFold = e.getInterCondFold(c1, c2)==0? minLogFold : Math.log(e.getInterCondFold(c1, c2))/Math.log(2);
if(logFold<minLogFold)
logFold=minLogFold;
if(logFold>maxLogFold)
logFold=maxLogFold;
if(e.getCondSigVCtrlP(c1)<=sigThres || e.getCondSigVCtrlP(c2)<=sigThres)
fwAll.write(e.getPoint().getLocationString()+"\t"+e.getInterCondScMean(c1, c2)+"\t"+logFold+"\n");
if(e.getCondSigVCtrlP(c1)<=sigThres && e.getInterCondP(c1, c2)<=sigThres)
fwOut.write(e.getPoint().getLocationString()+"\t"+e.getInterCondScMean(c1, c2)+"\t"+logFold+"\n");
if(e.getCondSigVCtrlP(c2)<=sigThres && e.getInterCondP(c2, c1)<=sigThres)
fwOut.write(e.getPoint().getLocationString()+"\t"+e.getInterCondScMean(c1, c2)+"\t"+logFold+"\n");
}
fwAll.close();
fwOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
//Main
public static void main(String[] args){
GenomeConfig gcon = new GenomeConfig(args);
ExptConfig econ = new ExptConfig(gcon.getGenome(), args);
EventsConfig config = new EventsConfig(gcon, args);
if(config.helpWanted()){
System.err.println("BindingEventFilter:");
System.err.println("\t--events <event file>");
System.err.println("\t--sigthres <significance threshold (log)>");
System.err.println(config.getArgsList());
}else{
ExperimentManager manager = new ExperimentManager(econ, false);
String eFile = Args.parseString(args, "events", null);
BindingEventFileReader reader = new BindingEventFileReader(eFile, manager, config);
List<BindingEvent> events = reader.execute(eFile);
double sigThres = Args.parseDouble(args, "sigthres", 0.01);
BindingEventFilter filter = new BindingEventFilter(manager, config, events, sigThres);
filter.execute();
manager.close();
}
}
}