All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eqtlmappingpipeline.binarymeta.meta.graphics.ZScorePlot Maven / Gradle / Ivy

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package eqtlmappingpipeline.binarymeta.meta.graphics;

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfContentByte;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.concurrent.ArrayBlockingQueue;

/**
 *
 * @author harmjan
 */
public class ZScorePlot {

    int width = 0;
    int height = 0;
    int spacer = 50;
    BufferedImage bimage;
    Graphics2D g2d;
    int numDatasets = 0;
    private int unitsize = 0;
    private int halfsize;
    private int plotsize;
    private ZScorePlotThread thread;
    private ArrayBlockingQueue queue;
    private String[] datasets;
    private boolean pdfOutput = false;
    private String outfilename = "";
    private Document document;
    private PdfContentByte cb;
    private com.itextpdf.text.pdf.PdfWriter writer;

    public void init(int numdatasets, String[] datasets, boolean pdf, String filename) {

        if (pdf) {
            pdfOutput = true;
            outfilename = filename + ".pdf";
        }


        this.datasets = datasets;
        plotsize = 400;
        numDatasets = numdatasets;
        halfsize = 200;
        unitsize = 5;
        spacer = 5 * unitsize * 3;

        width = (plotsize * numDatasets) + ((numdatasets + 1) * spacer) - (plotsize + spacer);
        height = (plotsize * numDatasets) + ((numdatasets + 1) * spacer) - (plotsize + spacer);

        if (pdfOutput) {
            com.itextpdf.text.Rectangle rectangle = new com.itextpdf.text.Rectangle(width, height);
            document = new com.itextpdf.text.Document(rectangle);
            writer = null;
            try {
                writer = com.itextpdf.text.pdf.PdfWriter.getInstance(document, new java.io.FileOutputStream(filename));
                document.open();
                cb = writer.getDirectContent();
                cb.saveState();
                g2d = cb.createGraphics(width, height);
            } catch (Exception e) {
                System.out.println("Cannot write to PDF file!:\t" + filename);
                System.exit(-1);
            }

        } else {
            bimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            g2d = bimage.createGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(new Color(255, 255, 255));
            g2d.fillRect(0, 0, width, height);
            g2d.setColor(new Color(0, 0, 0));
        }

        queue = new ArrayBlockingQueue(8);

        thread = new ZScorePlotThread(queue, bimage, g2d, width, height, spacer, numdatasets, unitsize, halfsize, plotsize);

        thread.setName("Plotter");
        thread.start();
//        
    }

    public synchronized void draw(Double zScore, Double zScore2, int dataset1, int dataset2) {
//        if(dataset1 > dataset2){
//            int tmp = dataset2;
//            dataset2 = dataset1;
//            dataset1 = tmp;
//        }

        try {
            PlotPackage p = new PlotPackage();
            p.zscore1 = zScore;
            p.zscore2 = zScore2;
            p.dataset1 = dataset1;
            p.dataset2 = dataset2;
            queue.put(p);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }

    public void write(String outputFile) throws Exception {
        try {
            PlotPackage p = new PlotPackage();
            p.poison = true;
            queue.put(p);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }

        thread.join();
        g2d.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER, 1.00f));
        Color black = new Color(0, 0, 0);
        Color grey = new Color(150, 150, 150);
        g2d.setColor(grey);
        g2d.setStroke(new java.awt.BasicStroke(2.0f, java.awt.BasicStroke.CAP_SQUARE, java.awt.BasicStroke.JOIN_ROUND));
        AffineTransform atNormal = new AffineTransform();
        AffineTransform at90deg = new AffineTransform();
        atNormal.setToRotation(0);
        at90deg.setToRotation(-Math.PI / 2.0);

        Font f = new Font("Sans-Serif", Font.BOLD, 15);
        g2d.setFont(f);
        AffineTransform fontAT = new AffineTransform();
        fontAT.rotate(Math.toRadians(-90));
        Font font = g2d.getFont();
        Font theDerivedFont = font.deriveFont(fontAT);


        g2d.setFont(font);



        for (int dataset1 = 0; dataset1 < numDatasets; dataset1++) {
//           int dataset2 = 1;
            for (int dataset2 = dataset1 + 1; dataset2 < numDatasets; dataset2++) {

                g2d.setColor(grey);
                int leftmargin = (dataset2 + 1) * spacer + (dataset2 * plotsize) - (plotsize + spacer);
                int topmargin = (dataset1 + 1) * spacer + (dataset1 * plotsize);

                int startX = leftmargin + 0;
                int stopX = leftmargin + plotsize;
                int midX = leftmargin + halfsize;
                int startY = topmargin + 0;
                int stopY = topmargin + plotsize;
                int midY = topmargin + halfsize;

                g2d.drawLine(startX, midY, stopX, midY); // x-axis
                g2d.drawLine(midX, startY, midX, stopY); // x-axis

                for (int z = -40; z <= 40; z += 5) {
                    g2d.drawLine(midX + z * unitsize, midY, midX + z * unitsize, midY + unitsize); // x-ticks
                    g2d.drawLine(midX, midY - z * unitsize, midX + unitsize, midY - z * unitsize);
                }

                g2d.setColor(black);
                // axis labels
                g2d.setFont(font);

                g2d.drawString(datasets[dataset1], startX, midY - unitsize);
                g2d.setFont(theDerivedFont);

                g2d.drawString(datasets[dataset2], midX - unitsize, stopY);

            }
        }

        g2d.setFont(font);
        g2d.setColor(grey);
        for (int dataset1 = 0; dataset1 < numDatasets; dataset1++) {
//           int dataset2 = 1;
            for (int dataset2 = dataset1 + 1; dataset2 < numDatasets; dataset2++) {

                int leftmargin = (dataset2 + 1) * spacer + (dataset2 * plotsize) - (plotsize + spacer);
                int topmargin = (dataset1 + 1) * spacer + (dataset1 * plotsize);

                int boxdist = 5 * unitsize;

                g2d.setStroke(new java.awt.BasicStroke(1.0f, java.awt.BasicStroke.CAP_SQUARE, java.awt.BasicStroke.JOIN_ROUND));
                g2d.setColor(new Color(0, 0, 0));
                g2d.drawRect(leftmargin - boxdist, topmargin - boxdist, plotsize + boxdist * 2, plotsize + boxdist * 2);
            }
        }



        /*
         * drawLine(int x1, int y1, int x2, int y2)
         */


        if (pdfOutput) {
            g2d.dispose();
            cb.restoreState();
            document.close();
            writer.close();
        } else {
            javax.imageio.ImageIO.write(bimage, "png", new File(outputFile + "-ZScoreComparison.png"));
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy