Bailey Kessing Posted September 1, 2015 Posted September 1, 2015 We are trying to generate the chromatogram for an ABI DNA sequencing file. Biojava (http://biojava.org) has a jar that will do this and many other things for DNA sequence files. Not sure how technical I need to be but a chromatogram is basically an image of the DNA detecting on the sequencing machine. I need to generate that image. I have attached the Jar and a sequencing file ("t1.ab1" as an example) and the Java code we are trying to get to work (with not a lot of success). We think we are close, but have a couple of errors. Anyone care to take a look and see if a fresh set of eyes will help? THANKS!!! ####Code below##### import java.awt.image.BufferedImage; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.io.IOException; import java.io.File; import java.io.FileNotFoundException; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageWriter; import javax.imageio.stream.FileImageOutputStream; import org.biojava.bio.chromatogram.Chromatogram; import org.biojava.bio.chromatogram.ChromatogramFactory; import org.biojava.bio.chromatogram.UnsupportedChromatogramFormatException; import org.biojava.bio.chromatogram.graphic.ChromatogramGraphic; import org.biojava.bio.program.abi.ABIFChromatogram import org.biojava.bio.chromatogram.graphic.ChromatogramGraphic import org.biojava.bio.chromatogram.* import org.biojava.bio.chromatogram.graphic.* import org.biojava.bio.program.abi.*; import org.biojava.bio.*; import org.biojava.bio.program.abi.*; import org.biojava.bio.seq.*; import org.biojava.bio.seq.impl.*; import org.biojava.bio.seq.io.*; import org.biojava.bio.symbol.*; int OUT_HEIGHT = 240; float OUT_HORIZ_SCALE = 2.0f; File infile = new File('/Users/kessingb/Desktop/Chromatogram/t1.ab1'); //return infile String name = infile.getName() ABITrace trace = new ABITrace(infile) //return trace.getSequenceLength() return trace.getTraceLength() Chromatogram c = ABIFChromatogram.create(infile) //Chromatogram c = ChromatogramFactory.create(infile) String outExt = "png"; Iterator writers = ImageIO.getImageWritersBySuffix(outExt); ImageWriter iw = (ImageWriter) writers.next(); /* build output stream */ File outfile = new File('/Users/kessingb/Desktop/Chromatogram/t1.jpg'); //FileImageOutputStream out = new FileImageOutputStream(outfile); ChromatogramGraphic gfx = new ChromatogramGraphic(trace); gfx.setHeight(OUT_HEIGHT); gfx.setHorizontalScale(OUT_HORIZ_SCALE); //set some options that affect the output // turn off filled-in "callboxes" gfx.setOption(ChromatogramGraphic.Option.DRAW_CALL_A, Boolean.FALSE); gfx.setOption(ChromatogramGraphic.Option.DRAW_CALL_C, Boolean.FALSE); gfx.setOption(ChromatogramGraphic.Option.DRAW_CALL_G, Boolean.FALSE); gfx.setOption(ChromatogramGraphic.Option.DRAW_CALL_T, Boolean.FALSE); gfx.setOption(ChromatogramGraphic.Option.DRAW_CALL_OTHER, Boolean.FALSE); //this option controls whether each trace/callbox/etc is scaled/positioned // individually, or whether the scaling is done on all shapes at the level // of the graphics context // enabling this option is recommended for higher-quality output gfx.setOption(ChromatogramGraphic.Option.USE_PER_SHAPE_TRANSFORM, Boolean.TRUE); /* create output image */ BufferedImage bi = new BufferedImage( gfx.getWidth(), gfx.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics2D g2 = bi.createGraphics(); g2.setBackground(Color.white); g2.clearRect(0, 0, bi.getWidth(), bi.getHeight()); /* draw chromatogram into image */ // turn on AA for nicer output //g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // the main event gfx.drawTo(g2); // work-around an OS X bug where sometimes the last Shape drawn // doesn't show up in the output g2.draw(new java.awt.Rectangle(-10, -10, 5, 5)); /* write image out */ iw.setOutput(outfile); biojava-1.7.1.jar t1.ab1
john renfrew Posted September 2, 2015 Posted September 2, 2015 (edited) Bailey heres some code which works...simplified where appropriate <code> import java.awt.image.BufferedImageimport java.awt.Colorimport java.awt.Graphics2Dimport java.awt.Rectangleimport java.awt.RenderingHintsimport javax.imageio.ImageIOimport org.biojava.bio.chromatogram.Chromatogramimport org.biojava.bio.chromatogram.graphic.ChromatogramGraphicimport org.biojava.bio.program.abi.ABIFChromatogramimport org.biojava.bio.program.abi.ABITrace OUT_HEIGHT = 240OUT_HORIZ_SCALE = 2.0f infile = new File('path/to/file')//return infile name = infile.getName() trace = new ABITrace(infile) c = ABIFChromatogram.create(infile) /* build output stream */ outfile = new File('/Users/whoever/documents/t1.jpg') //ERROR in this linegfx = new ChromatogramGraphic(c)gfx.setHeight(OUT_HEIGHT)gfx.setHorizontalScale(OUT_HORIZ_SCALE)//set some options that affect the output// turn off filled-in "callboxes"gfx.setOption(ChromatogramGraphic.Option.DRAW_CALL_A, Boolean.FALSE)gfx.setOption(ChromatogramGraphic.Option.DRAW_CALL_C, Boolean.FALSE)gfx.setOption(ChromatogramGraphic.Option.DRAW_CALL_G, Boolean.FALSE)gfx.setOption(ChromatogramGraphic.Option.DRAW_CALL_T, Boolean.FALSE)gfx.setOption(ChromatogramGraphic.Option.DRAW_CALL_OTHER, Boolean.FALSE)//this option controls whether each trace/callbox/etc is scaled/positioned // individually, or whether the scaling is done on all shapes at the level // of the graphics context // enabling this option is recommended for higher-quality outputgfx.setOption(ChromatogramGraphic.Option.USE_PER_SHAPE_TRANSFORM, Boolean.TRUE) //return 888 /* create output image */ bi = new BufferedImage( gfx.getWidth(), gfx.getHeight(), BufferedImage.TYPE_INT_RGB)g2 = bi.createGraphics()g2.setBackground(Color.white)g2.clearRect(0, 0, bi.getWidth(), bi.getHeight()) /* draw chromatogram into image */ // turn on AA for nicer output //g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) // the main eventgfx.drawTo(g2) // work-around an OS X bug where sometimes the last Shape drawn // doesn't show up in the outputg2.draw(new java.awt.Rectangle(-10, -10, 5, 5)) /* write image out */ try{ ImageIO.write(bi, 'jpg', outfile)} catch (e) { return e.getMessage()}return true//OR return the image to a containerreturn bi </code> Edited September 2, 2015 by john renfrew 1
Bailey Kessing Posted September 2, 2015 Author Posted September 2, 2015 Thanks so much!!! I will give it a try right away!!!
Bailey Kessing Posted September 3, 2015 Author Posted September 3, 2015 OK John, I am still getting an error…let me see what I can ferret out… Oh, here is the error I am getting: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: Script1.groovy: 18: unexpected char: 0xA0 @ line 18, column 1. /* build output stream */ ^ 1 error Parameters: {}
David Wikström Posted September 3, 2015 Posted September 3, 2015 0xA0 is an invalid character you sometimes get when posting code from online resources etc. Try using e.g. a text editor to do a search/replace on all occurrences, and then paste the code back into FileMaker. 1
Bailey Kessing Posted September 3, 2015 Author Posted September 3, 2015 Ah, thanks. I should have thought of that!!! Will give it a try!!
john renfrew Posted September 3, 2015 Posted September 3, 2015 the new forum does not have proper code black like the older version which used to allow for copy without the extra characters... It is the Unicode Character 'NO-BREAK SPACE' (U+00A0) john 1
Bailey Kessing Posted September 3, 2015 Author Posted September 3, 2015 Hey gang, thanks a lot for your hep!!! That was it. When I put in my text viewer it was giving the same looking code that a regular space was so I didn't notice it at first…should have, but hell, I am a scientist !! Anyways, it is perfect now, thanks so much for all the help!!!
Bailey Kessing Posted September 4, 2015 Author Posted September 4, 2015 If I wanted to read from a file that was stored in a container... I am trying to use nfile = fmpro.getContainerStream("Demo::read container") but don't seem to have the syntax correct...
john renfrew Posted September 4, 2015 Posted September 4, 2015 syntax is right comment out the trace = new ABI trace line I then get an EOF problem with the ab1 file though. This is >>Signals that an end of file or end of stream has been reached unexpectedly during input. but from the Api >>Due to the non-single-pass design of the ABI format, this method will wrap the InputStream in an CachingInputStream. For this reason, create(File) should be preferred
Bailey Kessing Posted September 4, 2015 Author Posted September 4, 2015 Yeah, that is what I am getting also.
Recommended Posts
This topic is 3379 days old. Please don't post here. Open a new topic instead.
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now