/*
* The MIT License (MIT)
*
* Copyright (c) 2007-2015 Broad Institute
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.broad.igv.tdf;
import org.broad.igv.Globals;
import org.broad.igv.track.WindowFunction;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Map;
/**
* @author jrobinso
*/
public class TDFUtils {
public static void main(String[] args) throws FileNotFoundException {
//TDFUtils.dumpIndex(args[0]);
//TDFUtils.dumpAllTiles(args[0]);
//TDFUtils.tdfToBedgraph(args[0], args[1])
TDFUtils.dumpTile(args[0], args[1], Integer.parseInt(args[2])); //"allaml.dataset.gct.tdf", "/chr4/raw", 130);
//TDFUtils.dumpDatasets(args[0]);
//TDFUtils.dumpDatasets(args[0]);
}
public static void dumpIndex(String tdfFile) {
TDFReader reader = TDFReader.getReader(tdfFile);
reader.dumpIndex();
reader.close();;
}
public static void tdfToBedgraph(String tdfFile, String bedGraphFile) throws FileNotFoundException {
TDFReader reader = null;
PrintStream ps = null;
try {
reader = TDFReader.getReader(tdfFile);
ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(bedGraphFile)));
String trackLine = reader.getTrackLine();
if (trackLine != null && trackLine.length() > 0) {
ps.println(trackLine);
}
for (String dsName : reader.getDatasetNames()) {
String[] tokens = dsName.split("/");
String chrName = tokens[1];
if (!chrName.equals(Globals.CHR_ALL) && dsName.contains("raw")) {
TDFDataset ds = reader.getDataset(dsName);
for (int i = 0; i < ds.nTiles; i++) {
TDFTile tile = ds.getTile(i);
if (tile != null) {
dumpTileData(reader, chrName, tile, ps);
}
}
}
}
} finally {
if (reader != null) reader.close();
if (ps != null) ps.close();
}
}
public static void dumpRootAttributes(String ibfFile) {
TDFReader reader = TDFReader.getReader(ibfFile);
System.out.println("Track line = " + reader.getTrackLine());
TDFGroup group = reader.getGroup("/");
for (Map.Entry<String, String> entries : group.attributes.entrySet()) {
System.out.println(entries.getKey() + " = " + entries.getValue());
}
System.out.println(reader.getTrackLine());
}
public static void dumpDatasets(String ibfFile) {
TDFReader reader = TDFReader.getReader(ibfFile);
System.out.println("DATASETS");
for (String dsName : reader.getDatasetNames()) {
System.out.println(dsName);
TDFDataset ds = reader.getDataset(dsName);
System.out.println("Attributes");
for (Map.Entry<String, String> entry : ds.attributes.entrySet()) {
System.out.println("\t" + entry.getKey() + " = " + entry.getValue());
}
System.out.println();
System.out.println("Tile Positions");
for (int i = 0; i < ds.nTiles; i++) {
System.out.print("\t" + ds.tilePositions[i]);
}
System.out.println();
}
}
public static void dumpAllTiles(String ibfFile) {
TDFReader reader = TDFReader.getReader(ibfFile);
System.out.println("DATASETS");
for (String dsName : reader.getDatasetNames()) {
System.out.println(dsName);
TDFDataset ds = reader.getDataset(dsName);
for (int i = 0; i < ds.nTiles; i++) {
TDFTile tile = ds.getTile(i);
if (tile != null) {
System.out.println("Tile: " + i);
dumpTileData(reader, "", tile, System.out);
}
}
}
}
public static void dumpTile(String ibfFile, String dsName, int tileNumber) {
TDFReader reader = TDFReader.getReader(ibfFile);
TDFDataset ds = reader.getDataset(dsName);
TDFTile tile = reader.readTile(ds, tileNumber);
if (tile == null) {
System.out.println("Null tile: " + dsName + " [" + tileNumber + "]");
} else {
dumpTileData(reader, "", tile, System.out);
}
}
private static void dumpTileData(TDFReader reader, String chrName, TDFTile tile, PrintStream ps) {
int nTracks = reader.getTrackNames().length;
int nBins = tile.getSize();
if (nBins > 0) {
for (int b = 0; b < nBins; b++) {
ps.print(chrName);
ps.print("\t" + tile.getStartPosition(b));
ps.print("\t" + tile.getEndPosition(b));
for (int t = 0; t < nTracks; t++) {
ps.print("\t" + tile.getValue(t, b));
}
ps.println();
}
}
}
public static void dumpRange(String ibfFile, String dsName, int startLocation, int endLocation) {
TDFReader reader = TDFReader.getReader(ibfFile);
TDFDataset ds = reader.getDataset(dsName);
int tileWidth = ds.tileWidth;
int startTile = startLocation / tileWidth;
int endTile = endLocation / tileWidth;
for (int tileNumber = startTile; tileNumber <= endTile; tileNumber++) {
TDFTile tile = reader.readTile(ds, tileNumber);
if (tile == null) {
System.out.println("Null tile: " + dsName + " [" + tileNumber + "]");
} else {
int nTracks = reader.getTrackNames().length;
int nBins = tile.getSize();
if (nBins > 0) {
for (int b = 0; b < nBins; b++) {
int start = tile.getStartPosition(b);
int end = tile.getEndPosition(b);
if (start > endLocation) {
break;
}
if (end >= startLocation) {
System.out.print(tile.getStartPosition(b));
for (int t = 0; t < nTracks; t++) {
System.out.print("\t" + tile.getValue(t, b));
}
System.out.println();
}
}
}
}
}
}
/*
* magic number (4 bytes)
version
index position
index size (bytes)
# of window functions
[window functions]
track type (string)
track line (string)
# of tracks
[track names]
*/
public static void dumpSummary(String ibfFile) {
TDFReader reader = TDFReader.getReader(ibfFile);
System.out.println("Version: " + reader.getVersion());
System.out.println("Window Functions");
for (WindowFunction wf : reader.getWindowFunctions()) {
System.out.println("\t" + wf.toString());
}
System.out.println("Tracks");
String[] trackNames = reader.getTrackNames();
for (String trackName : trackNames) {
System.out.println(trackName);
}
System.out.println();
System.out.println("DATASETS");
for (String dsName : reader.getDatasetNames()) {
System.out.println(dsName);
TDFDataset ds = reader.getDataset(dsName);
System.out.println("Attributes");
for (Map.Entry<String, String> entry : ds.attributes.entrySet()) {
System.out.println("\t" + entry.getKey() + " = " + entry.getValue());
}
System.out.println();
System.out.println("Tiles");
int nTracks = trackNames.length;
int tracksToShow = Math.min(4, nTracks);
for (int i = 0; i < ds.nTiles; i++) {
TDFTile tile = reader.readTile(ds, i);
if (tile != null) {
System.out.print(" " + i);
/*int nBins = tile.getSize();
int binsToShow = Math.min(4, nBins);
for (int b = 0; b < binsToShow; b++) {
System.out.print(tile.getStartPosition(b));
for (int t = 0; t < tracksToShow; t++) {
float value = tile.getValue(0, b);
if (!Float.isNaN(value)) {
System.out.print("\t" + tile.getValue(t, b));
}
}
System.out.println();
}
*/
}
}
System.out.println();
System.out.println();
}
System.out.println("GROUPS");
for (String name : reader.getGroupNames()) {
System.out.println(name);
TDFGroup group = reader.getGroup(name);
System.out.println("Attributes");
for (Map.Entry<String, String> entry : group.attributes.entrySet()) {
System.out.println("\t" + entry.getKey() + " = " + entry.getValue());
}
System.out.println();
}
}
/*
chr1:241356465-241356657
chr1:241358198-241358223
chr1:241359291-241359329
chr4:119691730-119691768
chr4:119692843-119692868
chr4:119694419-119694611
*/
}