aldenjava.opticalmapping.data.data.OptMapDataWriter.java Source code

Java tutorial

Introduction

Here is the source code for aldenjava.opticalmapping.data.data.OptMapDataWriter.java

Source

/**************************************************************************
**  OMBlast
**  Software aligning optical maps
**  
**  Version 1.0 -- September 1, 2015
**  
**  Copyright (C) 2015 by Alden Leung, All rights reserved.
**  Contact:  aldenleung@link.cuhk.edu.hk
**  Organization:  Hong Kong Bioinformatics Centre, School of Life Sciences, The
**                 Chinese University of Hong Kong, Shatin, NT,
**                 Hong Kong SAR
**  
**  This file is part of OMBlast.
**  
**  OMBlast is free software; you can redistribute it and/or 
**  modify it under the terms of the GNU General Public License 
**  as published by the Free Software Foundation; either version 
**  3 of the License, or (at your option) any later version.
**  
**  OMBlast is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**  
**  You should have received a copy of the GNU General Public 
**  License along with OMBlast; if not, see 
**  <http://www.gnu.org/licenses/>.
**************************************************************************/

package aldenjava.opticalmapping.data.data;

import java.io.IOException;
import java.util.LinkedHashMap;

import joptsimple.OptionSet;

import org.apache.commons.lang.StringUtils;

import aldenjava.opticalmapping.data.DataFormat;
import aldenjava.opticalmapping.data.OMWriter;
import aldenjava.opticalmapping.miscellaneous.ExtendOptionParser;

/**
 * Data Writer
 * 
 * @author Alden
 *
 */
public class OptMapDataWriter extends OMWriter<DataNode> {

    private DataFormat dformat;
    private boolean writtenSingleRefFile;

    public OptMapDataWriter(String filename, int format) throws IOException {
        this(filename, DataFormat.lookup(filename, format));
    }

    public OptMapDataWriter(String filename) throws IOException {
        this(filename, -1);
    }

    public OptMapDataWriter(String filename, DataFormat dformat) throws IOException {
        super(filename);
        if (dformat == null)
            throw new IOException("Unknown format.");
        this.dformat = dformat;
        // Initialize header only after dFormat is initialized
        initializeHeader();
        writtenSingleRefFile = false;

    }

    public OptMapDataWriter(OptionSet options) throws IOException {
        this((String) options.valueOf("optmapout"), (int) options.valueOf("optmapoutformat"));
    }

    @Override
    public void initializeHeader() throws IOException {
        if (dformat != null)
            switch (dformat) {
            case REF:
            case SILICO:
                break;
            case FA01:
                break;
            case SPOTS:
                break;
            case OPT:
                break;
            case SDATA:
                bw.write("#Fragment ID\tReference\tStrand\tStart\tEnd\tSize\tTotalSegments\tSegmentDetail\n");
                break;
            case DATA:
                bw.write("#Fragment ID\tSize\tTotalSegments\tSegmentDetail...\n");
                break;
            case BNX:
                bw.write("# BNX File Version:   0.1\n");
                bw.write("# Label Channels:   1\n");
                bw.write("# Nickase Recognition Site 1:\n");
                bw.write("# Quality Score QX01:   SNR\n");
                bw.write("# Quality Score QX02:   Ave Intensity\n");
                bw.write("# All above comments are fake\n");
                bw.write("#0h   LabelChannel   MapID   Length\n");
                bw.write("#0f   int   int   float\n");
                bw.write("#1h   LabelChannel   LabelPositions[N]\n");
                bw.write("#1f   int   float\n");
                bw.write("#2h   LabelChannel   LabelPositions[N]\n");
                bw.write("#2h   int   float\n");
                bw.write("#Qh   QualityScoreID   QualityScores[N]\n");
                bw.write("#Qf   str   float\n");
                break;
            case CMAP:
                bw.write("# \n");
                bw.write("# CompileDir= \n");
                bw.write("# CMAP File Version:   0.1\n");
                bw.write("# Label Channels:   1\n");
                bw.write("# Nickase Recognition Site 1:   unknown\n");
                bw.write("# Number of Consensus Nanomaps: 0\n");
                bw.write(
                        "#h CMapId   ContigLength   NumSites   SiteID   LabelChannel   Position   StdDev   Coverage   Occurrence\n");
                bw.write("#f int   float   int   int   int   float   float   int   int\n");
                break;
            default:
                assert false : "dformat unfound";
            }
    }

    @Override
    public void write(DataNode data) throws IOException {
        if (data != null)
            switch (dformat) {
            case REF:
            case SILICO:
                bw.write(data.name + "\t" + Long.toString(data.size) + "\t" + Integer.toString(data.refp.length)
                        + "\n");
                for (int i = 0; i < data.refp.length - 1; i++)
                    bw.write(Long.toString(data.refp[i]) + "\t");
                if (data.refp.length > 0)
                    bw.write(Long.toString(data.refp[data.refp.length - 1]) + "\n");
                else
                    bw.write("\n");
                break;
            case FA01:
                bw.write(">");
                bw.write(data.name);
                bw.write("\n");
                for (int i = 0; i < data.refp.length + 1; i++) {
                    bw.write(StringUtils.repeat("0", (int) data.getRefl(i)));
                    if (i != data.refp.length + 1 - 1)
                        bw.write("1");
                }

                bw.write("\n");
                break;
            case SPOTS:
                if (writtenSingleRefFile) {
                    System.out.println("No more than one reference can be written on the same spot file.");
                    return;
                }
                writtenSingleRefFile = true;
                bw.write("#\n");
                bw.write("#   Reference Size (Bp):   " + Long.toString(data.size) + "\n");
                bw.write("#   N Colors:   1\n");
                bw.write("NickID Color Location\n");

                long refp[] = data.refp;
                for (int i = 0; i < refp.length; i++) {
                    bw.write(Integer.toString(i));
                    bw.write(" 1 ");
                    bw.write(Long.toString(refp[i]));
                    bw.write("\n");
                }
                break;
            case OPT:
                if (writtenSingleRefFile) {
                    System.out.println("No more than one reference can be written on the same opt file.");
                    return;
                }
                writtenSingleRefFile = true;

                for (int i = 0; i < data.refp.length + 1; i++) {
                    long r = data.getRefl(i);
                    bw.write(String.format("%f\t%f\n", r / (double) 1000 + 0.001,
                            (r / (double) 1000) * 0.05 + 0.001));
                }
                break;
            case DATA:
                StringBuilder s2 = new StringBuilder();
                for (int i = 0; i < data.getTotalSegment(); i++) {
                    s2.append(Long.toString(data.getRefl(i)));
                    if (i != data.getTotalSegment() - 1)
                        s2.append(";");
                }

                bw.write(String.format("%s\t%d\t%d\t%s\n", data.name, data.length(), data.getTotalSegment(),
                        s2.toString()));
                break;
            case SDATA:
                String r = "";
                long start = -1;
                long stop = -1;
                int simuStrand = 0;

                if (data.hasSimulationInfo()) {
                    r = data.simuInfo.simuRegion.ref;
                    start = data.simuInfo.simuRegion.start;
                    stop = data.simuInfo.simuRegion.stop;
                    simuStrand = data.simuInfo.simuStrand;
                }
                StringBuilder s = new StringBuilder();
                for (int i = 0; i < data.getTotalSegment(); i++) {
                    s.append(Long.toString(data.getRefl(i)));
                    if (i != data.getTotalSegment() - 1)
                        s.append(";");
                }
                bw.write(String.format("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%s\n", data.name, r,
                        simuStrand == 1 ? "+" : simuStrand == -1 ? "-" : "", start, stop, data.length(),
                        data.getTotalSegment(), s.toString()));
                break;
            case BNX:
                bw.write("0\t");
                bw.write(data.name);
                bw.write("\t");
                bw.write(Long.toString(data.length()));
                bw.write(".0");
                bw.write("\n");
                bw.write("1");
                for (int i = 0; i < data.refp.length; i++) {
                    bw.write("\t");
                    bw.write(Long.toString(data.refp[i]));
                    bw.write(".0");
                }
                bw.write("\n");
                bw.write("QX01"); // Default as 10.0
                if (data instanceof BnxDataNode)
                    for (int i = 0; i < data.refp.length; i++)
                        bw.write("\t" + Double.toString(((BnxDataNode) data).snr[i]));
                else
                    for (int i = 0; i < data.refp.length; i++)
                        bw.write("\t10.0");
                bw.write("\n");
                bw.write("QX02"); // Default as 0.05
                if (data instanceof BnxDataNode)
                    for (int i = 0; i < data.refp.length; i++)
                        bw.write("\t" + Double.toString(((BnxDataNode) data).intensity[i]));
                else
                    for (int i = 0; i < data.refp.length; i++)
                        bw.write("\t0.05");
                bw.write("\n");
                break;
            case CMAP:

                String id = data.name;
                long size = data.size;
                int totalsites = data.getTotalSegment() - 1;
                // l[3] //site x
                int labelchannel = 1;
                double stddev = 0.0;
                int coverage = 1;
                int occurence = 1;

                for (int i = 0; i < data.refp.length + 1; i++) {
                    long pos;
                    if (i == data.refp.length) {
                        pos = size;
                        labelchannel = 0;
                    } else
                        pos = data.refp[i];
                    bw.write(String.format("%s\t%d\t%d\t%d\t%d\t%d\t%.1f\t%d\t%d\n", id, size, totalsites, i + 1,
                            labelchannel, pos, stddev, coverage, occurence));
                }
                break;
            default:
                assert false : "dformat unfound";
            }
    }

    public static void writeAll(String filename, int fileformat, LinkedHashMap<String, DataNode> fragmentmap)
            throws IOException {
        OptMapDataWriter omdw = new OptMapDataWriter(filename, fileformat);
        omdw.writeAll(fragmentmap);
        omdw.close();
    }

    public static void writeAll(OptionSet options, LinkedHashMap<String, DataNode> fragmentmap) throws IOException {
        OptMapDataWriter omdw = new OptMapDataWriter(options);
        omdw.writeAll(fragmentmap);
        omdw.close();
    }

    public static void assignOptions(ExtendOptionParser parser) {
        parser.addHeader("Data Writer Options", 1);
        parser.accepts("optmapout", "output file").withOptionalArg().ofType(String.class).defaultsTo("");
        parser.accepts("optmapoutformat", DataFormat.getFormatHelp()).withOptionalArg().ofType(Integer.class)
                .defaultsTo(-1);
    }

}