Mercurial > repos > pfrommolt > ngsrich
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(); + } +}