diff NGSrich_0.5.5/src/converters/ReadOnTarget2Wig.java @ 0:89ad0a9cca52 default tip

Uploaded
author pfrommolt
date Mon, 21 Nov 2011 08:12:19 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NGSrich_0.5.5/src/converters/ReadOnTarget2Wig.java	Mon Nov 21 08:12:19 2011 -0500
@@ -0,0 +1,187 @@
+package converters;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Scanner;
+import middlewares.Misc;
+
+/**
+ * Converts the detailed coverage data to the wig format. Used for the
+ * visualization of the coverage data in the ucsc-browser.
+ *
+ * @author Ali Abdallah
+ * @version 20.07.2011
+ * @since Java 1.6
+ */
+public class ReadOnTarget2Wig {
+	
+    private int 
+    /**
+     * The maximal number of hits on a base.
+     */
+    max, 
+    /**
+     * The minimal number of hits on a base.
+     */
+    min, 
+    /**
+     * The minimal position on chr1.
+     */
+    gMin, 
+    /**
+     * the maximal position on chr1.
+     */
+    gMax;
+    
+    private String 
+    /**
+     * The name of the file of detailed coverage data.
+     */
+    filename, 
+    /**
+     * The title of the track.
+     */
+    title;
+
+    /**
+     * Constructs an new ReadOnTarget2Wig object, initializes the parameters
+     * and call the conversion method.
+     * 
+     * @param filename
+     * @param prefix
+     * @param outDir
+     * @param title
+     * @throws IOException
+     */
+    public ReadOnTarget2Wig(String filename, String prefix, String outDir, String title) throws IOException{
+    	this.filename = filename;
+    	max = Integer.MIN_VALUE; gMax = Integer.MIN_VALUE;
+    	min = Integer.MAX_VALUE; gMin = Integer.MAX_VALUE;
+    	this.title = title;
+    	File f=new File(this.filename);
+    	FileWriter fw=new FileWriter(outDir+Misc.slash(outDir)
+    												+prefix+"_onTarget.wig");
+    	Scanner scanForMinMax=new Scanner(f);
+    	computeExtremas(scanForMinMax);
+    	scanForMinMax.close();
+		
+    	Scanner s = new Scanner(f);
+    	annotationHeader(fw);
+    	toWiggleFormat(fw,s);
+    	fw.close();
+    }
+ 
+    /**
+     * Writes the annotation header to the wig file.
+     * 
+     * @param fw FileWriter
+     * @throws IOException if write operation is not possible.
+     */
+    private void annotationHeader(FileWriter fw) throws IOException{
+    	String browserLines = 	"browser position chr1:"+gMin+"-"+gMax+"\r\n"+
+	    						"browser hide all"+"\r\n"+
+	    						"browser pack refGene encodeRegions"+"\r\n"+
+	    						"browser full altGraph";
+    	String trackLine = 	"track type=wiggle_0 name=\""+title+"\" " +
+	    					"description=\"Base read coverage\" visibility=full " 
+    						+"color=0,0,0 altColor=255,0,0 priority=20 " +
+    						"autoScale=off graphType=bar " +
+    						"viewLimits="+min+":"+max;
+    	fw.write(browserLines+"\r\n"+trackLine+"\r\n");
+    }
+    
+    /**
+     * Computes the hit and position minimas and maxima.
+     * 
+     * @param s the reader of the file of detailed coverage data.
+     */
+    private void computeExtremas(Scanner s){
+    	String chrom = "Datei falsch formatiert.";
+    	int start = -1;	int end = -1;
+    	while(s.hasNextLine()){
+    		String line = s.nextLine();
+    		if(isHeader(line)){
+    			chrom = chrom(line); start = start(line); end = end(line);
+    			if(gMin > start && chrom.equals("chr1")){gMin = start;}
+    			if(gMax < end && chrom.equals("chr1")){gMax = end;}
+    		}
+    		else{
+    			if(min > Integer.parseInt(line.trim())){
+    				min = Integer.parseInt(line.trim());
+    			}
+    			if(max < Integer.parseInt(line.trim())){
+    				max = Integer.parseInt(line.trim());
+    			}
+    		}
+    	}
+    }
+	
+    /**
+     * The main computation: conversion to wiggle format. 
+     * 
+     * @param fw FileWriter into the wig-file.
+     * @param s the reader of the file of detailed coverage data.
+     * @throws IOException if i/o fails.
+     */
+    private void toWiggleFormat(FileWriter fw, Scanner s) throws IOException {
+    	String chrom = "Datei falsch formatiert.";
+    	int start = -1;
+    	while(s.hasNextLine()){
+    		String line = s.nextLine();
+    		if(isHeader(line)){
+    			chrom = chrom(line); start = start(line);
+    			fw.write(declarationLine(chrom, start));
+    		}
+    		else fw.write(line+"\r\n");
+    	}
+    }
+
+    /**
+     * @param chrom
+     * @param start
+     * @return a String representing the declaration line corresponding to the
+     * specified parameters.
+     */
+    private String declarationLine(String chrom, int start) {
+    	return "fixedStep chrom="+chrom+" start="+start+" step=1\r\n";
+    }
+	
+    /**
+     * Check if the specified line is a header line.
+     * 
+     * @param 	line the current observerd line in the file of detailed coverage 
+     * 			data.
+     * @return true if line is a header and false otherwise.
+     */
+    private boolean isHeader(String line){
+    	return line.indexOf("chr")!=-1;
+    }
+	
+    /**
+     * @param line
+     * @return the start position of the current frame (header).
+     */
+    private int start(String line){
+    	Scanner s = new Scanner(line);
+    	s.next(); return s.nextInt();
+    }
+	
+    /**
+     * @param line
+     * @return the end position of the current frame.
+     */
+    private int end(String line){
+    	Scanner s = new Scanner(line);
+    	s.next(); s.next();
+    	return s.nextInt();
+    }
+	
+    /**
+     * @param line
+     * @return the chromosome corresponding to the current frame.
+     */
+	private String chrom(String line){
+		Scanner s = new Scanner(line);
+		return s.next();
+	}
+}