package org.seqcode.math.diff;
import java.io.FileWriter;
import java.io.IOException;
import org.seqcode.viz.scatter.ScatterPlotConfigured;
import Jama.Matrix;
/**
* DifferentialEnrichment: parent class for testers of pairwise differential enrichment in count data
* @author Shaun Mahony
* @version %I%, %G%
*/
public abstract class DifferentialEnrichment {
protected final int MV_IMAGE_FITLINE_POINTS=200;
protected String fileIDname="";
public DifferentialEnrichment(){
}
/**
* All DifferentialEnrichment implementations require an execute methods that will take a CountsDataset,
* process it for differential enrichment, and return a modified CountsDataset.
*
* @param data : CountsDataset
*/
public abstract CountsDataset execute(CountsDataset data);
/**
* Save a mean-variance plot for a given condition
* @param xy
* @param fitLine
* @param conditionName
* @param rasterImage
*/
public void saveMeanVarPlot(Matrix xy, double[] yfit, String conditionName, boolean rasterImage){
//Filename
String fileName = conditionName+".mean-var";
if(rasterImage)
fileName = fileName+".png";
else
fileName = fileName+".svg";
//Sub-sample fit-line and add (assuming xy is sorted, and yfit is coordinate matched with xy)
Matrix fitxy;
if(yfit.length>(MV_IMAGE_FITLINE_POINTS*2)){
fitxy= new Matrix(MV_IMAGE_FITLINE_POINTS+1,2);
for(int i=0; i<MV_IMAGE_FITLINE_POINTS; i++){
int index = yfit.length/MV_IMAGE_FITLINE_POINTS*i;
fitxy.set(i, 0, xy.get(index,0));
fitxy.set(i, 1, yfit[index]);
}
fitxy.set(MV_IMAGE_FITLINE_POINTS, 0, xy.get(yfit.length-1,0));
fitxy.set(MV_IMAGE_FITLINE_POINTS, 1, yfit[yfit.length-1]);
}else{
fitxy= new Matrix(yfit.length,2);
for(int index=0; index<yfit.length; index++){
fitxy.set(index, 0, xy.get(index,0));
fitxy.set(index, 1, yfit[index]);
}
}
//Generate image
ScatterPlotConfigured plotter = new ScatterPlotConfigured("MA plot");
plotter.saveMeanVarPlot(xy, fitxy, fileName, rasterImage);
}
/**
* Print mean-variance values to files
* @param xy : 2D mean variance matrix
* @param conditionName : String
*/
public void printMeanVarData(Matrix xy, String conditionName){
//Filename
String fileName = conditionName+".mean-var.txt";
//Print to file
try {
FileWriter fw = new FileWriter(fileName);
fw.write("Point\tMean\tVar\n");
for(int u=0; u<xy.getRowDimension(); u++)
fw.write(u+"\t"+xy.get(u,0)+"\t"+xy.get(u,1)+"\n");
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Set a file name identifier for the scripts that are produced by the differential enrichment implementation
*/
public void setFileIDname(String fid){fileIDname = fid;}
}