/*
* 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.
*/
package org.broad.igv.feature;
import org.broad.igv.Globals;
import java.io.*;
import java.lang.reflect.Array;
import java.util.*;
class LocAndVal {
public int loc;
public double val;
public LocAndVal(int loc, double val) {
this.loc = loc;
this.val = val;
}
}
/**
* @author sbusan
*/
public class ShapeFileUtils {
static LinkedList<LocAndVal> transformProfile(LinkedList<LocAndVal> profile,
int seqLen,
int newLeft,
String strand){
LinkedList<LocAndVal> transProfile = new LinkedList<>();
for (LocAndVal d : profile){
int loc = d.loc;
double val = d.val;
if (strand == "+"){
loc = loc + newLeft - 1;
} else if (strand == "-"){
loc = seqLen - loc + newLeft;
} else {
throw new RuntimeException("Unrecognized strand (options: \"+\",\"-\")");
}
transProfile.add(new LocAndVal(loc, val));
}
return transProfile;
}
static LinkedList<LocAndVal> loadShape(String inFile) throws
FileNotFoundException, IOException {
// TODO: add error messages for misformatted file
LinkedList<LocAndVal> profile = new LinkedList<>();
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(inFile));
String nextLine;
while ((nextLine = br.readLine()) != null) {
String[] s = Globals.whitespacePattern.split(nextLine.trim());
int loc = Integer.parseInt(s[0]);
double val = Double.parseDouble(s[1]);
if (val < -998) {
val = Double.NaN;
}
profile.add(new LocAndVal(loc, val));
}
} finally {
if (br != null) br.close();
}
return profile;
}
static void writeWigFile(String wigFile,
String chrom,
LinkedList<LocAndVal> profile) throws IOException {
PrintWriter pw = null;
try {
pw = new PrintWriter(new BufferedWriter(new FileWriter(wigFile)));
// write header
pw.println("variableStep chrom="+chrom);
// write locs and values
for (LocAndVal d : profile) {
int loc = d.loc;
double val = d.val;
if (!Double.isNaN(val)){
pw.println(""+loc+"\t"+String.format("%.6f",val));
}
}
} finally {
if (pw != null) pw.close();
}
}
public static void shapeToWigFile(String inFile,
String wigFile,
String chromosome,
String strand,
int left) throws
FileNotFoundException, IOException {
LinkedList<LocAndVal> profile = loadShape(inFile);
profile = transformProfile(profile, profile.size(), left, strand);
writeWigFile(wigFile, chromosome, profile);
}
/**
* Convert a base pairing structure file in dot-bracket notation
* (also known as Vienna format) to an easily parseable .bp arcs file. Does not
* currently handle mapping coords to spliced transcripts.
*
* @param dbFile Input file
* @param bpFile Output file
* @param chromosome Associated IGV chromosome
* @param strand Associated strand ("+" or "-")
* @param left Starting left-most position (0-based)
*/
/**
* Convert a pairing probability file as output by RNAStructure
* and/or SuperFold to an easily parseable .bp arcs file. Does not
* currently handle mapping coords to spliced transcripts.
*
* @param dpFile Input file
* @param bpFile Output file
* @param chromosome Associated IGV chromosome
* @param strand Associated strand ("+" or "-")
* @param left Starting left-most position (0-based)
*/
}