package org.seqcode.viz.genomicplot; 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.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.regex.Pattern; import javax.swing.JFrame; import org.seqcode.data.seqdata.SeqLocator; import org.seqcode.deepseq.experiments.ExptConfig; import org.seqcode.deepseq.experiments.ExptDescriptor; import org.seqcode.deepseq.experiments.Sample; import org.seqcode.deepseq.experiments.SampleLoader; import org.seqcode.genome.Genome; import org.seqcode.genome.GenomeConfig; import org.seqcode.genome.Species; import org.seqcode.genome.location.ExonicGene; import org.seqcode.genome.location.Gene; import org.seqcode.genome.location.Point; import org.seqcode.genome.location.Region; import org.seqcode.genome.location.StrandedRegion; import org.seqcode.gsebricks.verbs.location.PointParser; import org.seqcode.gsebricks.verbs.location.RegionParser; import org.seqcode.gsebricks.verbs.location.StrandedRegionParser; import org.seqcode.gseutils.ArgParser; import org.seqcode.gseutils.NotFoundException; import org.seqcode.gseutils.Pair; import org.seqcode.viz.paintable.PaintableFrame; //Note: RAR figure was defined for mm8 public class MultidataSpatialSetup { private MultidataSpatialPaintable painter; private PaintableFrame plotter; private int screenSizeX=1000, screenSizeY=900; private String inputFile; private Map<String, ExptDescriptor> experiments = new HashMap<String, ExptDescriptor>(); private List<Sample> times = new ArrayList<Sample>(); private List<String> timeLabels=new ArrayList<String>(); private List<ExonicGene> genes = new ArrayList<ExonicGene>(); private Map<String, List<Double>> expression = new HashMap<String, List<Double>>(); private Map<String, List<Region>> sites = new HashMap<String, List<Region>>(); private List<Pair<String, StrandedRegion>> motifs = new ArrayList<Pair<String, StrandedRegion>>(); private List<Region> lits = new ArrayList<Region>(); private int rstart=0; private int rstop = 0; private String chr; public GenomeConfig gconfig; public Genome gen; public ExptConfig econfig; public SampleLoader sampleLoader; public static void main(String[] args) { ArgParser ap = new ArgParser(args); if(!ap.hasKey("data")) { System.err.println("Usage:\n " + "MultidataSpatialSetup " + "--data <file name> "); return; } String dfile = ap.getKeyValue("data"); GenomeConfig gcon = new GenomeConfig(args); ExptConfig econ = new ExptConfig(gcon.getGenome(), args); MultidataSpatialSetup setup = new MultidataSpatialSetup(dfile, gcon, econ); } public MultidataSpatialSetup(String df, GenomeConfig gcon, ExptConfig econ){ gconfig = gcon; econfig = econ; sampleLoader = new SampleLoader(econfig); inputFile = df; //Load the file contents loadFile(inputFile); Region gRegion = new Region(gen, chr, rstart, rstop); //Paint the picture MultidataSpatialPaintable painter = new MultidataSpatialPaintable(timeLabels, times, gRegion, genes, expression, sites, motifs, lits); plotter = new PaintableFrame("Genomic Data", painter); plotter.setSize(screenSizeX, screenSizeY); plotter.setVisible(true); plotter.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } private void loadFile(String inF){ try{ File aFile = new File(inF); if(aFile.isFile()){ BufferedReader reader; reader = new BufferedReader(new FileReader(aFile)); String line; while((line= reader.readLine())!=null){ String [] tokens = line.split("\\t"); if(tokens[0].equals("timepoints")){ for(int i=1; i<tokens.length; i++){ timeLabels.add(tokens[i]); } }else if(tokens.length==2){//Setup annotations if(tokens[0].equals("regionstart")){ rstart = new Integer(tokens[1]).intValue(); } if(tokens[0].equals("regionstop")){ rstop = new Integer(tokens[1]).intValue(); } if(tokens[0].equals("regionchr")){ chr = new String(tokens[1]); } }else if(tokens.length>=15){//A gene int start = new Integer(tokens[4]).intValue(); int stop = new Integer(tokens[5]).intValue(); String name = tokens[12]; String id = tokens[1]; char str = tokens[3].charAt(0); String [] estarts = tokens[9].split(","); String [] estops = tokens[10].split(","); ExonicGene e = new ExonicGene(gen, chr, start, stop, name, id, str, "Manual"); for(int i=0; i<estarts.length; i++){ Region r = new Region(gen, chr, new Integer(estarts[i]).intValue(), new Integer(estops[i]).intValue()); e.addExon(r); } genes.add(e);System.out.println(name); }else if(tokens[0].equals("Expr")){//An expression set String name = tokens[1]; ArrayList<Double> vals = new ArrayList<Double>(); for(int i=2; i<tokens.length; i++){ vals.add(new Double(tokens[i])); } expression.put(name, vals); }else if(tokens[0].equals("Site")){//A binding site (timepoint, position, zscore) String time = tokens[1]; RegionParser rparser = new RegionParser(gen); Region r = rparser.execute(tokens[2]); if(!sites.containsKey(time)){ sites.put(time, new ArrayList<Region>()); }sites.get(time).add(r); }else if(tokens[0].equals("Motif")){//Motif hits StrandedRegionParser parser = new StrandedRegionParser(gen); StrandedRegion s = parser.execute(tokens[2]); String type = tokens[1]; if(s!=null) motifs.add(new Pair<String, StrandedRegion>(type, s)); }else if(tokens[0].equals("Lit")){//Known sites Region site = new Region(gen, tokens[3], new Integer(tokens[4]).intValue(), new Integer(tokens[5]).intValue()); lits.add(site); }else if(tokens[0].equals("Expt")){//Experiments if(!experiments.containsKey(tokens[1])){ System.err.println("Experiment: "+tokens[1]); experiments.put(tokens[1], new ExptDescriptor("", "", tokens[1], "A", true, new Pair<String,String>(tokens[2]+";"+tokens[3], "READDB"), econfig.getPerBaseMax())); } } } reader.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (NumberFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }