package org.seqcode.viz.genomicplot;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.seqcode.genome.location.ExonicGene;
import org.seqcode.genome.location.Gene;
import org.seqcode.genome.location.Region;
import org.seqcode.gsebricks.verbs.location.RefGeneGenerator;
import org.seqcode.gseutils.Pair;
public class RNASeqFigurePaintable extends FigurePaintable{
private int topBorder=50, bottomBorder=50;
private int leftBorder=25, rightBorder=25;
private List<String> exptNames;
protected RefGeneGenerator<Region> geneGen=null;
protected List<List<Gene>> geneSets=new ArrayList<List<Gene>>();
protected List<String> geneSetNames = new ArrayList<String>();
protected Map<String, List<Pair<Gene,Double>>> junctions = new HashMap<String, List<Pair<Gene,Double>>>();
public RNASeqFigurePaintable(FigureOptions opts){
options = opts;
reverseIt=options.reverseOrder;
chr = options.gRegion.getChrom();
rstart = options.gRegion.getStart();
rstop = options.gRegion.getEnd();
exptNames = options.exptNames;
//Initialize genes
if(options.useDBGenes){
geneSetNames.add("Reference");
ArrayList<Gene> geneSet = new ArrayList<Gene>();
geneGen = new RefGeneGenerator<Region>(options.genome, "refGene");
geneGen.retrieveExons(true);
geneGen.setWantAlias(true);
Iterator<Gene> gi = geneGen.execute(options.gRegion);
while(gi.hasNext()) {
geneSet.add(gi.next());
}geneSets.add(geneSet);
}if(options.transcriptGTF != null){//Load GTF
geneSetNames.add(options.transcriptGTF.getName());
ArrayList<Gene> geneSet = new ArrayList<Gene>();
geneSet.addAll(loadGenes(options.transcriptGTF, options.gRegion));
geneSets.add(geneSet);
}
//Initialize junction
for(String t : exptNames){
if(options.experiments.get(t).junctionsFile!=null){
ArrayList<Pair<Gene,Double>> scoredJunctions = loadScoredBED(options.experiments.get(t).junctionsFile, options.gRegion);
junctions.put(t, scoredJunctions);
}
}
//Initialize experiment painters
}
public void paintItem (Graphics g, int x1, int y1, int x2, int y2){
Graphics2D g2d = (Graphics2D)g;
FontMetrics metrics = g2d.getFontMetrics();
int screenSizeX = x2-x1;
int screenSizeY = y2-y1;
//g2d.setColor(Color.white);
//g2d.fillRect(0, 0, screenSizeX, screenSizeY);
topBound = topBorder;
bottomBound = screenSizeY-bottomBorder;
leftBound = leftBorder+30;
rightBound = screenSizeX-rightBorder;
baseLine = topBound;
//Experiment tracks
int offset=0;
for(String t : exptNames){
System.err.println("Processing: "+t);
//Experiment label
if(options.drawExptLabels){
g2d.setColor(Color.gray);
g2d.setFont(new Font("Ariel", Font.BOLD, options.labelFontSize));
metrics = g2d.getFontMetrics();
AffineTransform oldtrans = g2d.getTransform();
AffineTransform newtrans = new AffineTransform();
newtrans.translate(leftBound-(metrics.getHeight()), baseLine+offset+metrics.getHeight()+(options.experiments.get(t).exptTrackHeight/2));
newtrans.rotate(Math.toRadians(-90));
g2d.setTransform(newtrans);
g2d.drawString(t,(-1*metrics.stringWidth(t))/2,0);
g2d.setTransform(oldtrans);
}
//RNA-seq paired reads for this experiment (if any)
//RNA-seq read depth for this experiment (if any)
//Junctions for this experiment (if any)
if(junctions.containsKey(t)){
offset += drawJunctions(g2d, x1, baseLine+offset, x2, junctions.get(t));
}
}
//Draw some coordinates & axis
drawCoordinates(g2d, x1, baseLine+offset, x2);
offset+=20;
//Gene tracks
for(int i=0; i<geneSetNames.size(); i++){
offset += drawGenes(g2d, x1, baseLine+offset, x2, geneSets.get(i), options.drawGeneLabels, geneSetNames.get(i));
}
}
public ArrayList<Pair<Gene,Double>> loadScoredBED(File jFile, Region reg){
ArrayList<Pair<Gene,Double>> sJuncts = new ArrayList<Pair<Gene,Double>>();
try {
if(!jFile.isFile()){System.err.println("Invalid junctions filename");System.exit(1);}
BufferedReader reader = new BufferedReader(new FileReader(jFile));
String line;
while ((line = reader.readLine()) != null) {
line = line.trim();
String[] words = line.split("\\t");
if(words.length==12){
String chr = words[0].replaceAll("chr", "");
if(chr.equals("MT"))
chr = "M";
Integer start = new Integer(words[1]);
Integer stop = new Integer(words[2]);
String name = words[3];
Double score = new Double(words[4]);
char strand = words[5].charAt(0);
String [] blockSizes = words[10].split(",");
String [] blockStarts = words[11].split(",");
ExonicGene currGene = new ExonicGene(options.genome, chr, start, stop, name, name, strand, "user");
if(currGene.overlaps(options.gRegion)){
for(int b=0; b<blockSizes.length; b++){
Integer bSize = new Integer(blockSizes[b]);
Integer bStartOff = new Integer(blockStarts[b]);
Region block = new Region(options.genome, chr, start+bStartOff, start+bStartOff+bSize);
currGene.addExon(block);
}sJuncts.add(new Pair(currGene, score));
}
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return(sJuncts);
}
}