From 631ecb118655a6648ff6f79be06888129a29ebd8 Mon Sep 17 00:00:00 2001 From: MaxGreil Date: Sat, 5 May 2018 19:26:51 +0200 Subject: [PATCH 1/6] First commit for ABITracer --- .../nbio/core/sequence/io/ABITrace.java | 521 ++++++++++++++++++ .../nbio/core/sequence/io/ABITracerTest.java | 62 +++ biojava-core/src/test/resources/3730.ab1 | Bin 0 -> 299987 bytes 3 files changed, 583 insertions(+) create mode 100644 biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java create mode 100644 biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java create mode 100644 biojava-core/src/test/resources/3730.ab1 diff --git a/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java new file mode 100644 index 0000000000..509aa8a75a --- /dev/null +++ b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java @@ -0,0 +1,521 @@ +/* + * BioJava development code + * + * This code may be freely distributed and modified under the + * terms of the GNU Lesser General Public Licence. This should + * be distributed with the code. If you do not have a copy, + * see: + * + * http://www.gnu.org/copyleft/lesser.html + * + * Copyright for this code is held jointly by the individual + * authors. These should be listed in @author doc comments. + * + * For more information on the BioJava project and its aims, + * or to join the biojava-l mailing list, visit the home page + * at: + * + * http://www.biojava.org/ + * + * Created on 05-04-2018 + */ + +package org.biojava.nbio.core.sequence.io; + +import java.io.IOException; +import java.io.File; +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileInputStream; +import java.io.DataInputStream; +import java.io.ByteArrayInputStream; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; + +import org.biojava.nbio.core.sequence.compound.DNACompoundSet; +import org.biojava.nbio.core.sequence.compound.NucleotideCompound; +import org.biojava.nbio.core.sequence.template.AbstractSequence; +import org.biojava.nbio.core.exceptions.CompoundNotFoundException; + +/** + * Title: ABITrace

+ * ABITrace is a class for managing ABI file information, + * it is capable of opening an ABI file and storing + * the most important fields, which can be recalled as simple java types. It can also return + * an image corresponding to the trace. + * It has three constructors with input types File, URL, and byte[].

+ * ABI files contain two sets of basecall and sequence data, one that was originally + * created programatically and the other, which is an editable copy. This version of this object + * only references the original unedited data.
+ */ +public class ABITrace { + + //the next three lines are the important persistent data + private String sequence; + private int A[], G[], C[], T[], Basecalls[], Qcalls[]; + private int TraceLength, SeqLength; + + //This is the actual file data. + private byte[] TraceData; + + private int maximum = 0; + + //the next four declaration lines comprise the file index information + private int MacJunk = 0; //sometimes when macintosh files are + //FTPed in binary form, they have 128 bytes + //of crap pre-pended to them. This constant + //allows ABITrace to handle that in a way that + //is invisible to the user. + private static int AbsIndexBase = 26; //The file location of the Index pointer + private int IndexBase, PLOC, PCON; + + //the next declaration is for the actual file pointers + private int DATA9, DATA10, DATA11, DATA12, PBAS2, FWO; + + /** + * The File constructor opens a local ABI file and parses the content. + * + * @param ABIFile is a java.io.File on the local file system. + * @throws IOException if there is a problem reading the file. + * @throws IllegalArgumentException if the file is not a valid ABI file. + */ + public ABITrace(File ABIFile) throws IOException { + byte[] bytes = null; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + FileInputStream fis = new FileInputStream(ABIFile); + BufferedInputStream bis = new BufferedInputStream(fis); + int b; + while ((b = bis.read()) >= 0) { + baos.write(b); + } + bis.close(); + fis.close(); + baos.close(); + bytes = baos.toByteArray(); + initData(bytes); + } + + /** + * The byte[] constructor parses an ABI file represented as a byte array. + * + * @throws IllegalArgumentException if the data does not represent a valid ABI file. + */ + public ABITrace(byte[] ABIFileData) { + initData(ABIFileData); + } + + /** + * Returns the length of the sequence (number of bases) in this trace. + */ + public int getSequenceLength() { + return SeqLength; + } + + /** + * Returns the length of the trace (number of x-coordinate points in the graph). + */ + public int getTraceLength() { + return TraceLength; + } + + /** + * Returns an int[] array that represents the basecalls - each int in the + * array corresponds to an x-coordinate point in the graph that is a peak (a base location). + */ + public int[] getBasecalls() { + return Basecalls; + } + + /** + * Returns an int[] array that represents the quality - each int in the + * array corresponds to an quality value 90-255) in the graph at a base location). + */ + public int[] getQcalls() { + return Qcalls; + } + + /** + * Returns the original programmatically determined (unedited) sequence as a AbstractSequence. + */ + public AbstractSequence getSequence() throws CompoundNotFoundException { + try { + DNASequenceCreator creator = new DNASequenceCreator(DNACompoundSet.getDNACompoundSet()); + return creator.getSequence(sequence, 0); + } catch (Exception e) { + // this should be impossible! + throw new CompoundNotFoundException(e.toString()); + } + } + + /** + * Returns a BufferedImage that represents the entire trace. The height can be set precisely in + * pixels, the width in pixels is determined by the scaling factor times the number + * of points in the trace (getTraceLength()). The entire trace is represented + * in the returned image. + * + * @param imageHeight is the desired height of the image in pixels. + * @param widthScale indiates how many horizontal pixels to use to represent a single x-coordinate (try 2). + */ + public BufferedImage getImage(int imageHeight, int widthScale) { + BufferedImage out = new BufferedImage(TraceLength * widthScale, imageHeight, BufferedImage.TYPE_BYTE_INDEXED); + Graphics2D g = out.createGraphics(); + Color acolor = Color.green.darker(); + Color ccolor = Color.blue; + Color gcolor = Color.black; + Color tcolor = Color.red; + Color ncolor = Color.pink; + double scale = calculateScale(imageHeight); + int[] bc = Basecalls; + char[] seq = sequence.toCharArray(); + g.setBackground(Color.white); + g.clearRect(0, 0, TraceLength * widthScale, imageHeight); + int here = 0; + int basenum = 0; + for (int q = 1; q <= 5; q++) { + for (int x = 0; x <= TraceLength - 2; x++) { + if (q == 1) { + g.setColor(acolor); + g.drawLine(2 * x, transmute(A[x], imageHeight, scale), + 2 * (x + 1), transmute(A[x + 1], imageHeight, scale)); + } + if (q == 2) { + g.setColor(ccolor); + g.drawLine(2 * x, transmute(C[x], imageHeight, scale), + 2 * (x + 1), transmute(C[x + 1], imageHeight, scale)); + } + if (q == 3) { + g.setColor(tcolor); + g.drawLine(2 * x, transmute(T[x], imageHeight, scale), + 2 * (x + 1), transmute(T[x + 1], imageHeight, scale)); + } + if (q == 4) { + g.setColor(gcolor); + g.drawLine(2 * x, transmute(G[x], imageHeight, scale), + 2 * (x + 1), transmute(G[x + 1], imageHeight, scale)); + } + if (q == 5) { + if ((here > bc.length - 1) || (basenum > seq.length - 1)) break; + if (bc[here] == x) { + g.drawLine(2 * x, transmute(-2, imageHeight, 1.0), + 2 * x, transmute(-7, imageHeight, 1.0)); + if ((basenum + 1) % 10 == 0) //if the basecount is divisible by ten + //add a number + { + g.drawLine(2 * x, transmute(-20, imageHeight, 1.0), + 2 * x, transmute(-25, imageHeight, 1.0)); + g.drawString(Integer.toString(basenum + 1), + 2 * x - 3, transmute(-36, imageHeight, 1.0)); + } + switch (seq[basenum]) { + case 'A': + case 'a': + g.setColor(acolor); + break; + case 'C': + case 'c': + g.setColor(ccolor); + break; + case 'G': + case 'g': + g.setColor(gcolor); + break; + case 'T': + case 't': + g.setColor(tcolor); + break; + default: + g.setColor(ncolor); + } + g.drawChars(seq, basenum, 1, + 2 * x - 3, transmute(-18, imageHeight, 1.0)); + g.setColor(Color.black); + here++; + basenum++; + } + } + } + } + return out; + } + + /** + * Utility method to translate y coordinates from graph space (where up is greater) + * to image space (where down is greater). + */ + private int transmute(int ya, int height, double scale) { + return (height - 45 - (int) (ya * scale)); + } + + //calculates the necessary scaling to allow the trace to fit vertically + //in the space specified. + + /** + * Returns the scaling factor necessary to allow all of the traces to fit vertically + * into the specified space. + * + * @param - the required height in pixels. + */ + private double calculateScale(int height) { + double newScale = 0.0; + double max = (double) getMaximum(); + double ht = (double) height; + newScale = ((ht - 50.0)) / max; + return newScale; + } + + /** + * Get the maximum height of any of the traces. The data is persisted for performance + * in the event of multiple calls, but it initialized lazily. + */ + private int getMaximum() { + if (maximum > 0) return maximum; + int max = 0; + for (int x = 0; x <= T.length - 1; x++) { + if (T[x] > max) max = T[x]; + if (A[x] > max) max = A[x]; + if (C[x] > max) max = C[x]; + if (G[x] > max) max = G[x]; + } + return max; + } + + /** + * Initialize all of the data fields for this object. + * + * @throws IllegalArgumentException which will propagate to all of the constructors. + */ + private void initData(byte[] fileData) { + TraceData = fileData; + if (isABI()) { + setIndex(); + setBasecalls(); + setQcalls(); + setSeq(); + setTraces(); + } else throw new IllegalArgumentException("Not a valid ABI file."); + } + + /** + * Shuffle the pointers to point to the proper spots in the trace, then load the + * traces into their arrays. + */ + private void setTraces() { + int pointers[] = new int[4]; //alphabetical, 0=A, 1=C, 2=G, 3=T + int datas[] = new int[4]; + char order[] = new char[4]; + + datas[0] = DATA9; + datas[1] = DATA10; + datas[2] = DATA11; + datas[3] = DATA12; + + for (int i = 0; i <= 3; i++) { + order[i] = (char) TraceData[FWO + i]; + } + + for (int i = 0; i <= 3; i++) { + switch (order[i]) { + case 'A': + case 'a': + pointers[0] = datas[i]; + break; + case 'C': + case 'c': + pointers[1] = datas[i]; + break; + case 'G': + case 'g': + pointers[2] = datas[i]; + break; + case 'T': + case 't': + pointers[3] = datas[i]; + break; + default: + throw new IllegalArgumentException("Trace contains illegal values."); + } + } + + A = new int[TraceLength]; + C = new int[TraceLength]; + G = new int[TraceLength]; + T = new int[TraceLength]; + + for (int i = 0; i <= 3; i++) { + byte[] qq = new byte[TraceLength * 2]; + getSubArray(qq, pointers[i]); + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(qq)); + for (int x = 0; x <= TraceLength - 1; x++) { + try { + if (i == 0) A[x] = (int) dis.readShort(); + if (i == 1) C[x] = (int) dis.readShort(); + if (i == 2) G[x] = (int) dis.readShort(); + if (i == 3) T[x] = (int) dis.readShort(); + } catch (IOException e)//This shouldn't happen. If it does something must be seriously wrong. + { + throw new IllegalStateException("Unexpected IOException encountered while manipulating internal streams."); + } + } + } + return; + } + + /** + * Fetch the sequence from the trace data. + */ + private void setSeq() { + char tempseq[] = new char[SeqLength]; + for (int x = 0; x <= SeqLength - 1; ++x) { + tempseq[x] = (char) TraceData[PBAS2 + x]; + } + sequence = new String(tempseq); + } + + /** + * Fetch the quality calls from the trace data. + */ + private void setQcalls() { + Qcalls = new int[SeqLength]; + byte[] qq = new byte[SeqLength]; + getSubArray(qq, PCON); + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(qq)); + for (int i = 0; i <= SeqLength - 1; ++i) { + try { + Qcalls[i] = (int) dis.readByte(); + } catch (IOException e)//This shouldn't happen. If it does something must be seriously wrong. + { + throw new IllegalStateException("Unexpected IOException encountered while manipulating internal streams."); + } + } + } + + /** + * Fetch the basecalls from the trace data. + */ + private void setBasecalls() { + Basecalls = new int[SeqLength]; + byte[] qq = new byte[SeqLength * 2]; + getSubArray(qq, PLOC); + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(qq)); + for (int i = 0; i <= SeqLength - 1; ++i) { + try { + Basecalls[i] = (int) dis.readShort(); + } catch (IOException e)//This shouldn't happen. If it does something must be seriously wrong. + { + throw new IllegalStateException("Unexpected IOException encountered while manipulating internal streams."); + } + } + } + + /** + * Sets up all of the initial pointers to the important records in TraceData. + */ + private void setIndex() { + int DataCounter, PBASCounter, PLOCCounter, PCONCounter, NumRecords; + byte[] RecNameArray = new byte[4]; + String RecName; + + DataCounter = 0; + PBASCounter = 0; + PLOCCounter = 0; + PCONCounter = 0; + + IndexBase = getIntAt(AbsIndexBase + MacJunk); + NumRecords = getIntAt(AbsIndexBase - 8 + MacJunk); + + for (int record = 0; record <= NumRecords - 1; record++) { + getSubArray(RecNameArray, (IndexBase + (record * 28))); + RecName = new String(RecNameArray); + if (RecName.equals("FWO_")) + FWO = IndexBase + (record * 28) + 20; + if (RecName.equals("DATA")) { + ++DataCounter; + if (DataCounter == 9) + DATA9 = IndexBase + (record * 28) + 20; + if (DataCounter == 10) + DATA10 = IndexBase + (record * 28) + 20; + if (DataCounter == 11) + DATA11 = IndexBase + (record * 28) + 20; + if (DataCounter == 12) + DATA12 = IndexBase + (record * 28) + 20; + } + if (RecName.equals("PBAS")) { + ++PBASCounter; + if (PBASCounter == 2) + PBAS2 = IndexBase + (record * 28) + 20; + } + if (RecName.equals("PLOC")) { + ++PLOCCounter; + if (PLOCCounter == 2) + PLOC = IndexBase + (record * 28) + 20; + } + if (RecName.equals("PCON")) { + ++PCONCounter; + if (PCONCounter == 2) + PCON = IndexBase + (record * 28) + 20; + } + + } //next record + TraceLength = getIntAt(DATA12 - 8); + SeqLength = getIntAt(PBAS2 - 4); + PLOC = getIntAt(PLOC) + MacJunk; + DATA9 = getIntAt(DATA9) + MacJunk; + DATA10 = getIntAt(DATA10) + MacJunk; + DATA11 = getIntAt(DATA11) + MacJunk; + DATA12 = getIntAt(DATA12) + MacJunk; + PBAS2 = getIntAt(PBAS2) + MacJunk; + PCON = getIntAt(PCON) + MacJunk; + } + + /** + * Utility method to return an int beginning at pointer in the TraceData array. + */ + private int getIntAt(int pointer) { + int out = 0; + byte[] temp = new byte[4]; + getSubArray(temp, pointer); + try { + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(temp)); + out = dis.readInt(); + } catch (IOException e) //This shouldn't happen. If it does something must be seriously wrong. + { + throw new IllegalStateException("Unexpected IOException encountered while manipulating internal streams."); + } + return out; + } + + /** + * A utility method which fills array b with data from the trace starting at traceDataOffset. + */ + private void getSubArray(byte[] b, int traceDataOffset) { + for (int x = 0; x <= b.length - 1; x++) { + b[x] = TraceData[traceDataOffset + x]; + } + } + + /** + * Test to see if the file is ABI format by checking to see that the first three bytes + * are "ABI". Also handle the special case where 128 bytes were prepended to the file + * due to binary FTP from an older macintosh system. + */ + private boolean isABI() { + char ABI[] = new char[4]; + + for (int i = 0; i <= 2; i++) { + ABI[i] = (char) TraceData[i]; + } + if (ABI[0] == 'A' && (ABI[1] == 'B' && ABI[2] == 'I')) { + return true; + } else { + for (int i = 128; i <= 130; i++) { + ABI[i] = (char) TraceData[i]; + } + if (ABI[0] == 'A' && (ABI[1] == 'B' && ABI[2] == 'I')) { + MacJunk = 128; + return true; + } else + return false; + } + } +} diff --git a/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java b/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java new file mode 100644 index 0000000000..96a89d9ad8 --- /dev/null +++ b/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java @@ -0,0 +1,62 @@ +/* + * BioJava development code + * + * This code may be freely distributed and modified under the + * terms of the GNU Lesser General Public Licence. This should + * be distributed with the code. If you do not have a copy, + * see: + * + * http://www.gnu.org/copyleft/lesser.html + * + * Copyright for this code is held jointly by the individual + * authors. These should be listed in @author doc comments. + * + * For more information on the BioJava project and its aims, + * or to join the biojava-l mailing list, visit the home page + * at: + * + * http://www.biojava.org/ + * + */ + +package org.biojava.nbio.core.sequence.io; + +import java.io.File; +import org.junit.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ABITracerTest { + + private final static Logger logger = LoggerFactory.getLogger(ABITracerTest.class); + + public ABITracerTest() { + } + + @BeforeClass + public static void setUpClass() throws Exception { + } + + @AfterClass + public static void tearDownClass() throws Exception { + } + + @Before + public void setUp() { + } + + @After + public void tearDown() { + } + + /** + * Test of process method, of class ABITracer. + */ + @Test + public void testProcess() throws Exception { + logger.info("process"); + File file = new File("/3730.ab1"); + ABITrace tracer = new ABITrace(file); + Assert.assertNotNull(tracer); + } +} diff --git a/biojava-core/src/test/resources/3730.ab1 b/biojava-core/src/test/resources/3730.ab1 new file mode 100644 index 0000000000000000000000000000000000000000..6c2c6c43b9d48262633e00f9c5d8d410f7462dbe GIT binary patch literal 299987 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⩔ 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 literal 0 HcmV?d00001 From e924815e1d5f54cf870c10f7e8dc206fa741ed7f Mon Sep 17 00:00:00 2001 From: MaxGreil Date: Sat, 5 May 2018 21:43:05 +0200 Subject: [PATCH 2/6] ABITracer Constructor with URL --- .../nbio/core/sequence/io/ABITrace.java | 24 +++++++++++++++++++ .../nbio/core/sequence/io/ABITracerTest.java | 18 +++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java index 509aa8a75a..d54c6cf78f 100644 --- a/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java +++ b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java @@ -32,6 +32,8 @@ import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; +import java.net.URL; +import java.io.InputStream; import org.biojava.nbio.core.sequence.compound.DNACompoundSet; import org.biojava.nbio.core.sequence.compound.NucleotideCompound; @@ -96,6 +98,28 @@ public ABITrace(File ABIFile) throws IOException { initData(bytes); } + /** + * The URL constructor opens an ABI file from any URL. + * @param ABIFile is a java.net.URL for an ABI trace file. + * @throws IOException if there is a problem reading from the URL. + * @throws IllegalArgumentException if the URL does not contain a valid ABI file. + */ + public ABITrace( URL ABIFile ) throws IOException + { + byte[] bytes = null; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + InputStream is = ABIFile.openStream(); + BufferedInputStream bis = new BufferedInputStream(is); + int b; + while ((b = bis.read()) >= 0) + { + baos.write(b); + } + bis.close(); is.close(); baos.close(); + bytes = baos.toByteArray(); + initData(bytes); + } + /** * The byte[] constructor parses an ABI file represented as a byte array. * diff --git a/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java b/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java index 96a89d9ad8..bad847a68a 100644 --- a/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java +++ b/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java @@ -22,6 +22,7 @@ package org.biojava.nbio.core.sequence.io; import java.io.File; +import java.net.URL; import org.junit.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,12 +51,23 @@ public void tearDown() { } /** - * Test of process method, of class ABITracer. + * Test of local method, of class ABITracer. */ @Test - public void testProcess() throws Exception { - logger.info("process"); + public void testURL() throws Exception { + URL url = new URL("https://github.com/biopython/biopython/blob/master/Tests/Abi/3730.ab1"); + Assert.assertNotNull(url); + ABITrace tracer = new ABITrace(url); + Assert.assertNotNull(tracer); + } + + /** + * Test of local method, of class ABITracer. + */ + @Test + public void testLocal() throws Exception { File file = new File("/3730.ab1"); + Assert.assertNotNull(file); ABITrace tracer = new ABITrace(file); Assert.assertNotNull(tracer); } From 9ecbbe0b156691416548a84bdc249fcf9d31dc7a Mon Sep 17 00:00:00 2001 From: MaxGreil Date: Sun, 6 May 2018 12:25:55 +0200 Subject: [PATCH 3/6] Tests ABITracerTest now running --- .../biojava/nbio/core/sequence/io/ABITrace.java | 6 ++---- .../nbio/core/sequence/io/ABITracerTest.java | 14 +++++++------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java index d54c6cf78f..927ada2b4b 100644 --- a/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java +++ b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java @@ -91,9 +91,7 @@ public ABITrace(File ABIFile) throws IOException { while ((b = bis.read()) >= 0) { baos.write(b); } - bis.close(); - fis.close(); - baos.close(); + bis.close(); fis.close(); baos.close(); bytes = baos.toByteArray(); initData(bytes); } @@ -533,7 +531,7 @@ private boolean isABI() { return true; } else { for (int i = 128; i <= 130; i++) { - ABI[i] = (char) TraceData[i]; + ABI[i-128] = (char) TraceData[i]; } if (ABI[0] == 'A' && (ABI[1] == 'B' && ABI[2] == 'I')) { MacJunk = 128; diff --git a/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java b/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java index bad847a68a..b97981abec 100644 --- a/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java +++ b/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java @@ -24,12 +24,10 @@ import java.io.File; import java.net.URL; import org.junit.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class ABITracerTest { - private final static Logger logger = LoggerFactory.getLogger(ABITracerTest.class); + private String filePath = System.getProperty("user.dir") + "/src/test/resources/3730.ab1"; public ABITracerTest() { } @@ -51,22 +49,24 @@ public void tearDown() { } /** - * Test of local method, of class ABITracer. + * Test of URL method, of class ABITracer. */ @Test public void testURL() throws Exception { - URL url = new URL("https://github.com/biopython/biopython/blob/master/Tests/Abi/3730.ab1"); + File file = new File(filePath); + Assert.assertNotNull(file); + URL url = file.toURI().toURL(); Assert.assertNotNull(url); ABITrace tracer = new ABITrace(url); Assert.assertNotNull(tracer); } /** - * Test of local method, of class ABITracer. + * Test of Local file method, of class ABITracer. */ @Test public void testLocal() throws Exception { - File file = new File("/3730.ab1"); + File file = new File(filePath); Assert.assertNotNull(file); ABITrace tracer = new ABITrace(file); Assert.assertNotNull(tracer); From e30cc52d6b8e357580705dcffa6078f76d280e09 Mon Sep 17 00:00:00 2001 From: MaxGreil Date: Sun, 6 May 2018 14:58:02 +0200 Subject: [PATCH 4/6] New ABITracer class with ABITracerTest and new ABITracerCompoundSet --- .../compound/ABITracerCompoundSet.java | 65 +++++++++++++++++++ .../nbio/core/sequence/io/ABITrace.java | 27 +++++++- .../nbio/core/sequence/io/ABITracerTest.java | 23 +++++++ 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 biojava-core/src/main/java/org/biojava/nbio/core/sequence/compound/ABITracerCompoundSet.java diff --git a/biojava-core/src/main/java/org/biojava/nbio/core/sequence/compound/ABITracerCompoundSet.java b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/compound/ABITracerCompoundSet.java new file mode 100644 index 0000000000..078c524515 --- /dev/null +++ b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/compound/ABITracerCompoundSet.java @@ -0,0 +1,65 @@ +/* + * BioJava development code + * + * This code may be freely distributed and modified under the + * terms of the GNU Lesser General Public Licence. This should + * be distributed with the code. If you do not have a copy, + * see: + * + * http://www.gnu.org/copyleft/lesser.html + * + * Copyright for this code is held jointly by the individual + * authors. These should be listed in @author doc comments. + * + * For more information on the BioJava project and its aims, + * or to join the biojava-l mailing list, visit the home page + * at: + * + * http://www.biojava.org/ + * + * Created on 05-06-2018 + */ + +package org.biojava.nbio.core.sequence.compound; + +import org.biojava.nbio.core.sequence.template.AbstractNucleotideCompoundSet; + +/** + * @author Maximilian Greil + */ +public class ABITracerCompoundSet extends AbstractNucleotideCompoundSet { + + private static class InitaliseOnDemand { + public static final ABITracerCompoundSet INSTANCE = new ABITracerCompoundSet(); + } + + public static ABITracerCompoundSet getABITracerCompoundSet() { + return InitaliseOnDemand.INSTANCE; + } + + public ABITracerCompoundSet() { + addNucleotideCompound("A", "T"); + addNucleotideCompound("T", "A"); + addNucleotideCompound("G", "C"); + addNucleotideCompound("C", "G"); + addNucleotideCompound("N", "N"); + addNucleotideCompound("K", "K"); + addNucleotideCompound("Y", "Y"); + addNucleotideCompound("R", "R"); + addNucleotideCompound("-", "-"); + } + + @Override + public NucleotideCompound newNucleotideCompound(String base, String complement, String... equivalents) { + if(equivalents.length == 0) { + return new NucleotideCompound(base, this, complement); + } + else { + NucleotideCompound[] compounds = new NucleotideCompound[equivalents.length]; + for(int i=0; i getSequence() throws CompoundNotFoundException { try { - DNASequenceCreator creator = new DNASequenceCreator(DNACompoundSet.getDNACompoundSet()); + DNASequenceCreator creator = new DNASequenceCreator(ABITracerCompoundSet.getABITracerCompoundSet()); return creator.getSequence(sequence, 0); } catch (Exception e) { // this should be impossible! @@ -170,6 +171,30 @@ public AbstractSequence getSequence() throws CompoundNotFoun } } + /** + * Returns one of the four traces - all of the y-coordinate values, + * each of which correspond to a single x-coordinate relative to the + * position in the array, so that if element 4 in the array is 972, then + * x is 4 and y is 972 for that point. + * + * @param base the DNA String to retrieve the trace values for + * @return an array of ints giving the entire trace for that base + * @throws CompoundNotFoundException if the base is not valid + */ + public int[] getTrace (String base) throws CompoundNotFoundException { + if (base.equals("A")) { + return A; + } else if (base.equals("C")) { + return C; + } else if (base.equals("G")) { + return G; + } else if (base.equals("T")) { + return T; + } else { + throw new CompoundNotFoundException("Don't know base: " + base); + } + } + /** * Returns a BufferedImage that represents the entire trace. The height can be set precisely in * pixels, the width in pixels is determined by the scaling factor times the number diff --git a/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java b/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java index b97981abec..6604199f81 100644 --- a/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java +++ b/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java @@ -21,13 +21,21 @@ package org.biojava.nbio.core.sequence.io; +import java.awt.image.BufferedImage; import java.io.File; import java.net.URL; import org.junit.*; +/** + * Test file 3730.ab1 is from https://github.com/biopython/biopython/blob/master/Tests/Abi/3730.ab1 + * The test data for comparing the results from ABITracer for file 3730.ab1 is from https://github.com/biopython/biopython/blob/master/Tests/Abi/test_data + */ public class ABITracerTest { private String filePath = System.getProperty("user.dir") + "/src/test/resources/3730.ab1"; + private String sequence = "GGGCGAGCKYYAYATTTTGGCAAGAATTGAGCTCTATGGCCACAACCATGGTGAGCAAGGGCGAGGAGGATAACATGGCCATCATCAAGGAGTTCATGCGCTTCAAGGTGCACATGGAGGGCTCCGTGAACGGCCACGAGTTCGAGATCGAGGGCGAGGGCGAGGGCCGCCCCTACGAGGGCACCCAGACCGCCAAGCTGAAGGTGACCAAGGGTGGCCCCCTGCCCTTCGCCTGGGACATCCTGTCCCCTCAGTTCATGTACGGCTCCAAGGCCTACGTGAAGCACCCCGCCGACATCCCCGACTACTTGAAGCTGTCCTTCCCCGAGGGCTTCAAGTGGGAGCGCGTGATGAACTTCGAGGACGGCGGCGTGGTGACCGTGACCCAGGACTCCTCCCTGCAGGACGGCGAGTTCATCTACAAGGTGAAGCTGCGCGGCACCAACTTCCCCTCCGACGGCCCCGTAATGCAGAAGAAGACCATGGGCTGGGAGGCCTCCTCCGAGCGGATGTACCCCGAGGACGGCGCCCTGAAGGGCGAGATCAAGCAGAGGCTGAAGCTGAAGGACGGCGGCCACTACGACGCTGAGGTCAAGACCACCTACAAGGCCAAGAAGCCCGTGCAGCTGCCCGGCGCCTACAACGTCAACATCAAGTTGGACATCACCTCCCACAACGAGGACTACACCATCGTGGAACAGTACGAACGCGCCGAGGGCCGCCACTCCACCGGCGGCATGGACGAGCTGTACAAGGGCGGCAGCGGCATGGTGAGCAAGGGCGAGGAGCTGTTCACCGGGGTGGTGCCCATCCTGGTCGAGCTGGACGGCGACGTAAACGGCCACAAGTTCAGCGTGTCCGGCGAGGGCGAGGGCGATGCCACCTACGGCAAGCTGACCCTGAAGTTCATCTGCACCACCGGCAAGCTGCCCGTGCCCTGGCCCACCCTCGTGACCACCCTGACCTACGGCGTGCAGTGCTTCAGCCGCTACCCCGACCACATGAAGCAGCACGACTTCTTCAAGTCCGCCATGCCCGAAGGCTACGTCCAGGAGCGCACCATCTTCTTCAAGGACGACGGCAACTACAARACCCGCGCCGAGGTGAARTTCGAGGGCGACACCCTGGTGAACCGCATCGAGCTGAAAGGGGCAYCGCACCTTTC"; + private int[] qual = {20, 3, 4, 4, 4, 6, 4, 4, 0, 0, 0, 6, 0, 10, 20, 26, 22, 17, 21, 31, 29, 32, 28, 18, 23, 17, 19, 35, 36, 50, 39, 50, 50, 50, 50, 50, 25, 35, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, 39, 33, 20, 35, 31, 50, 50, 50, 50, 50, 50, 50, 50, 50, 31, 50, 35, 31, 23, 28, 31, 21, 43, 39, 35, 24, 30, 26, 35, 31, 50, 50, 50, 50, 50, 50, 50, 50, 50, 39, 31, 24, 39, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 31, 31, 43, 43, 50, 50, 50, 50, 50, 31, 31, 31, 31, 50, 50, 50, 50, 50, 50, 50, 50, 31, 31, 35, 50, 50, 50, 50, 31, 36, 55, 55, 55, 55, 36, 55, 55, 55, 55, 55, 36, 55, 55, 55, 55, 55, 36, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 40, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 36, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 40, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 43, 43, 50, 43, 43, 50, 43, 43, 50, 43, 43, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 43, 43, 50, 43, 43, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 28, 28, 35, 28, 28, 35, 28, 28, 35, 28, 28, 35, 28, 28, 35, 28, 21, 28, 35, 28, 28, 35, 35, 35, 35, 35, 37, 38, 21, 28, 35, 28, 28, 35, 35, 35, 35, 35, 35, 35, 36, 36, 21, 39, 35, 35, 35, 39, 35, 37, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 28, 28, 35, 35, 28, 28, 35, 35, 35, 36, 36, 22, 39, 35, 35, 35, 35, 35, 35, 37, 38, 28, 35, 21, 36, 36, 37, 35, 35, 20, 39, 39, 35, 35, 35, 35, 37, 38, 28, 35, 37, 34, 35, 24, 24, 27, 25, 20, 24, 37, 35, 27, 21, 20, 21, 27, 17, 20, 24, 32, 26, 20, 12, 20, 10, 20, 24, 25, 23, 20, 32, 24, 24, 23, 20, 24, 23, 18, 34, 34, 34, 22, 26, 24, 24, 18, 22, 22, 23, 25, 20, 12, 20, 24, 23, 24, 23, 22, 20, 20, 0, 20, 24, 23, 20, 8, 10, 4, 20, 20, 3, 7, 19, 20, 4, 4, 7, 7, 0, 7, 11, 18, 8, 3, 23, 23, 20, 11, 4, 20, 18, 12, 20, 20, 20, 4, 20, 4, 2, 3, 21, 21, 21, 21, 10, 15, 14, 15, 19, 2, 4, 3, 6, 11, 3, 4, 6, 21, 16, 20, 11, 1, 4, 12, 0, 15, 8, 1, 3, 3, 12, 1, 11, 20, 4}; + private int[] base = {2, 13, 38, 51, 67, 78, 92, 118, 138, 162, 181, 191, 210, 222, 239, 253, 266, 280, 288, 304, 317, 333, 347, 359, 375, 386, 394, 406, 418, 433, 444, 457, 472, 482, 496, 506, 519, 529, 544, 557, 569, 579, 590, 601, 614, 626, 638, 649, 663, 673, 686, 706, 715, 731, 740, 753, 765, 777, 787, 799, 813, 826, 838, 854, 863, 876, 892, 901, 913, 929, 937, 948, 960, 970, 981, 993, 1004, 1017, 1034, 1045, 1056, 1068, 1080, 1091, 1103, 1115, 1126, 1138, 1148, 1160, 1177, 1187, 1199, 1211, 1222, 1232, 1243, 1254, 1268, 1279, 1294, 1307, 1319, 1330, 1341, 1352, 1362, 1374, 1388, 1398, 1411, 1422, 1433, 1444, 1456, 1466, 1479, 1497, 1506, 1519, 1531, 1543, 1556, 1567, 1578, 1589, 1604, 1614, 1630, 1641, 1651, 1662, 1675, 1688, 1700, 1711, 1721, 1732, 1748, 1758, 1772, 1784, 1795, 1806, 1820, 1830, 1844, 1855, 1866, 1877, 1892, 1902, 1914, 1926, 1939, 1950, 1965, 1974, 1986, 1999, 2011, 2023, 2037, 2047, 2059, 2072, 2084, 2096, 2107, 2120, 2132, 2144, 2156, 2169, 2180, 2191, 2202, 2217, 2227, 2239, 2251, 2264, 2275, 2286, 2297, 2309, 2321, 2332, 2347, 2358, 2369, 2381, 2394, 2406, 2417, 2429, 2439, 2452, 2465, 2476, 2490, 2501, 2512, 2524, 2536, 2546, 2560, 2570, 2581, 2593, 2605, 2616, 2628, 2640, 2653, 2664, 2676, 2688, 2700, 2712, 2723, 2735, 2748, 2759, 2772, 2784, 2795, 2808, 2820, 2831, 2842, 2854, 2866, 2878, 2888, 2901, 2913, 2927, 2936, 2947, 2958, 2970, 2982, 2994, 3005, 3019, 3030, 3041, 3053, 3064, 3077, 3088, 3099, 3110, 3123, 3135, 3146, 3157, 3168, 3179, 3192, 3203, 3214, 3226, 3238, 3251, 3263, 3275, 3286, 3297, 3308, 3320, 3331, 3344, 3356, 3368, 3380, 3391, 3402, 3415, 3426, 3440, 3451, 3462, 3474, 3485, 3496, 3508, 3520, 3532, 3543, 3556, 3569, 3580, 3593, 3604, 3615, 3626, 3638, 3650, 3661, 3673, 3684, 3698, 3709, 3721, 3732, 3744, 3756, 3767, 3779, 3792, 3803, 3814, 3827, 3838, 3850, 3862, 3873, 3885, 3897, 3909, 3920, 3932, 3943, 3955, 3966, 3980, 3990, 4002, 4014, 4026, 4038, 4050, 4061, 4072, 4083, 4095, 4107, 4119, 4131, 4143, 4156, 4167, 4179, 4191, 4203, 4215, 4227, 4238, 4252, 4262, 4274, 4287, 4298, 4310, 4321, 4333, 4345, 4356, 4370, 4381, 4393, 4406, 4417, 4428, 4440, 4453, 4464, 4477, 4489, 4500, 4513, 4524, 4536, 4548, 4560, 4573, 4583, 4595, 4607, 4620, 4631, 4645, 4655, 4667, 4679, 4690, 4702, 4714, 4728, 4739, 4750, 4762, 4774, 4786, 4798, 4810, 4821, 4833, 4845, 4857, 4869, 4880, 4892, 4905, 4916, 4927, 4940, 4952, 4963, 4977, 4988, 5000, 5012, 5023, 5034, 5045, 5057, 5069, 5081, 5093, 5104, 5115, 5127, 5139, 5151, 5163, 5176, 5188, 5199, 5211, 5223, 5235, 5247, 5259, 5272, 5283, 5296, 5308, 5320, 5331, 5343, 5354, 5366, 5378, 5390, 5402, 5414, 5426, 5438, 5450, 5462, 5474, 5486, 5497, 5510, 5521, 5532, 5544, 5557, 5569, 5581, 5592, 5604, 5617, 5629, 5641, 5652, 5663, 5676, 5687, 5699, 5712, 5724, 5735, 5748, 5760, 5771, 5784, 5794, 5806, 5817, 5829, 5841, 5853, 5866, 5879, 5891, 5903, 5916, 5928, 5941, 5952, 5964, 5976, 5988, 6000, 6012, 6024, 6036, 6048, 6060, 6072, 6085, 6096, 6109, 6121, 6133, 6146, 6157, 6168, 6180, 6192, 6203, 6215, 6227, 6239, 6251, 6265, 6276, 6289, 6302, 6313, 6325, 6337, 6349, 6361, 6374, 6386, 6398, 6410, 6422, 6436, 6448, 6459, 6471, 6483, 6495, 6507, 6520, 6532, 6545, 6555, 6567, 6579, 6591, 6603, 6615, 6627, 6640, 6652, 6664, 6676, 6688, 6700, 6713, 6726, 6738, 6749, 6761, 6774, 6786, 6799, 6811, 6823, 6835, 6848, 6859, 6871, 6883, 6895, 6907, 6920, 6933, 6945, 6956, 6968, 6980, 6992, 7005, 7016, 7030, 7042, 7053, 7066, 7079, 7091, 7104, 7115, 7128, 7140, 7152, 7163, 7175, 7187, 7200, 7212, 7224, 7235, 7248, 7260, 7272, 7285, 7297, 7309, 7321, 7333, 7345, 7358, 7370, 7382, 7394, 7406, 7419, 7431, 7443, 7455, 7468, 7480, 7492, 7505, 7517, 7530, 7542, 7554, 7566, 7578, 7591, 7603, 7615, 7628, 7640, 7653, 7666, 7677, 7690, 7702, 7714, 7727, 7738, 7750, 7762, 7775, 7786, 7799, 7812, 7823, 7836, 7848, 7859, 7871, 7884, 7896, 7909, 7921, 7933, 7946, 7958, 7971, 7984, 7996, 8007, 8019, 8032, 8044, 8056, 8069, 8081, 8094, 8107, 8119, 8131, 8143, 8155, 8167, 8179, 8192, 8205, 8218, 8230, 8244, 8255, 8267, 8279, 8291, 8303, 8315, 8328, 8340, 8353, 8366, 8378, 8392, 8404, 8417, 8431, 8443, 8455, 8467, 8479, 8492, 8504, 8516, 8529, 8543, 8555, 8567, 8580, 8593, 8606, 8619, 8632, 8644, 8658, 8670, 8683, 8695, 8708, 8721, 8733, 8746, 8759, 8771, 8783, 8795, 8808, 8821, 8833, 8845, 8858, 8871, 8885, 8898, 8910, 8923, 8936, 8949, 8960, 8973, 8986, 9000, 9012, 9025, 9038, 9051, 9064, 9076, 9089, 9102, 9114, 9126, 9139, 9151, 9164, 9177, 9191, 9204, 9217, 9230, 9243, 9255, 9268, 9281, 9294, 9307, 9320, 9333, 9345, 9358, 9371, 9384, 9398, 9412, 9424, 9437, 9450, 9462, 9475, 9488, 9501, 9514, 9528, 9542, 9554, 9567, 9581, 9593, 9606, 9619, 9632, 9645, 9658, 9671, 9682, 9695, 9708, 9721, 9735, 9749, 9762, 9776, 9789, 9802, 9815, 9828, 9842, 9855, 9867, 9880, 9893, 9906, 9920, 9933, 9947, 9960, 9974, 9987, 10000, 10014, 10027, 10040, 10054, 10067, 10081, 10095, 10107, 10120, 10134, 10148, 10161, 10175, 10188, 10201, 10214, 10228, 10241, 10254, 10267, 10280, 10294, 10309, 10322, 10335, 10348, 10362, 10374, 10387, 10401, 10415, 10428, 10441, 10455, 10469, 10482, 10497, 10510, 10523, 10537, 10551, 10565, 10579, 10593, 10606, 10621, 10634, 10647, 10661, 10675, 10689, 10704, 10719, 10732, 10746, 10760, 10774, 10788, 10802, 10815, 10829, 10843, 10856, 10871, 10884, 10898, 10913, 10927, 10940, 10955, 10970, 10984, 10999, 11013, 11027, 11042, 11056, 11071, 11086, 11100, 11114, 11128, 11142, 11158, 11171, 11186, 11200, 11213, 11228, 11241, 11255, 11270, 11284, 11299, 11314, 11328, 11342, 11356, 11370, 11385, 11399, 11413, 11429, 11445, 11460, 11474, 11489, 11503, 11518, 11533, 11549, 11563, 11577, 11592, 11607, 11621, 11637, 11651, 11665, 11680, 11694, 11708, 11725, 11740, 11754, 11768, 11784, 11798, 11813, 11828, 11843, 11858, 11874, 11888, 11904, 11920, 11933, 11948, 11964, 11979, 11993, 12009, 12024, 12041, 12058, 12071, 12087, 12102, 12117, 12132, 12148, 12165, 12179, 12195, 12210, 12226, 12241, 12256, 12273, 12288, 12304, 12320, 12335, 12350, 12365, 12382, 12398, 12414, 12430, 12446, 12462, 12478, 12495, 12511, 12525, 12541, 12556, 12575, 12591, 12605, 12622, 12638, 12653, 12671, 12686, 12705, 12721, 12739, 12756, 12772, 12788, 12806, 12822, 12839, 12855, 12873, 12890, 12908, 12923, 12941, 12960, 12975, 12992, 13009, 13024, 13040, 13059, 13076, 13092, 13109, 13128, 13145, 13161, 13179, 13194, 13216, 13233, 13249, 13266, 13287, 13303, 13322, 13337, 13357, 13375, 13392, 13410, 13424, 13446, 13465, 13480, 13499, 13517, 13533, 13559, 13575, 13595, 13612, 13632, 13650, 13670, 13687, 13706, 13726, 13744, 13765, 13783, 13803, 13822, 13841, 13860, 13879, 13897, 13917, 13936, 13960, 13979, 13996, 14019, 14040, 14057, 14077, 14102, 14122, 14141, 14163, 14184, 14202, 14225, 14244, 14265, 14287, 14312, 14336, 14356, 14375, 14393, 14420, 14438, 14465, 14483, 14500, 14536, 14555, 14575, 14604, 14619, 14648, 14668, 14691, 14725, 14748, 14770, 14788, 14818, 14840, 14862, 14888, 14921, 14939, 14969, 14996, 15022, 15051, 15075, 15098, 15130, 15149, 15167, 15218, 15237, 15276, 15297, 15333, 15356, 15379, 15418, 15447, 15481, 15508, 15530, 15574, 15599, 15643, 15680, 15697, 15743, 15759, 15775, 15813, 15845, 15877, 15911, 15931, 15968, 16014, 16049, 16077, 16088, 16138, 16149, 16185, 16200, 16241, 16280, 16296}; public ABITracerTest() { } @@ -70,5 +78,20 @@ public void testLocal() throws Exception { Assert.assertNotNull(file); ABITrace tracer = new ABITrace(file); Assert.assertNotNull(tracer); + + //Test length of tracer for file 3730.ab1 + Assert.assertEquals(16302, tracer.getTraceLength()); + //Test length of sequence for file 3730.ab1 + Assert.assertEquals(1165, tracer.getSequenceLength()); + + //Test sequence of tracer for file 3730.ab1 + Assert.assertTrue(sequence.equals(tracer.getSequence().getSequenceAsString())); + //Test array that represents the quality of tracer for file 3730.ab1 + Assert.assertArrayEquals(qual, tracer.getQcalls()); + //Test array that represents the baseline of tracer for file 3730.ab1 + Assert.assertArrayEquals(base, tracer.getBasecalls()); + //Test image of tracer for file 3730.ab1 + BufferedImage image = tracer.getImage(100,100); + Assert.assertNotNull(image); } } From e1ef8a36d88e06fed8b0fc05b1445790263cacea Mon Sep 17 00:00:00 2001 From: MaxGreil Date: Mon, 7 May 2018 18:55:06 +0200 Subject: [PATCH 5/6] Code reviewer requests --- .../nbio/core/sequence/io/ABITrace.java | 179 ++++++++++-------- .../nbio/core/sequence/io/ABITracerTest.java | 15 +- 2 files changed, 111 insertions(+), 83 deletions(-) diff --git a/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java index 648531cf54..1ef6a85b50 100644 --- a/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java +++ b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java @@ -36,41 +36,40 @@ import java.io.InputStream; import org.biojava.nbio.core.sequence.compound.ABITracerCompoundSet; -import org.biojava.nbio.core.sequence.compound.DNACompoundSet; import org.biojava.nbio.core.sequence.compound.NucleotideCompound; import org.biojava.nbio.core.sequence.template.AbstractSequence; import org.biojava.nbio.core.exceptions.CompoundNotFoundException; /** - * Title: ABITrace

+ * Title: ABITrace

* ABITrace is a class for managing ABI file information, * it is capable of opening an ABI file and storing * the most important fields, which can be recalled as simple java types. It can also return * an image corresponding to the trace. - * It has three constructors with input types File, URL, and byte[].

+ * It has three constructors with input types File, URL, and byte[].

* ABI files contain two sets of basecall and sequence data, one that was originally * created programatically and the other, which is an editable copy. This version of this object - * only references the original unedited data.
+ * only references the original unedited data.

*/ public class ABITrace { //the next three lines are the important persistent data private String sequence; - private int A[], G[], C[], T[], Basecalls[], Qcalls[]; - private int TraceLength, SeqLength; + private int A[], G[], C[], T[], baseCalls[], qCalls[]; + private int traceLength, seqLength; //This is the actual file data. - private byte[] TraceData; + private byte[] traceData; private int maximum = 0; //the next four declaration lines comprise the file index information - private int MacJunk = 0; //sometimes when macintosh files are + private int macJunk = 0; //sometimes when macintosh files are //FTPed in binary form, they have 128 bytes //of crap pre-pended to them. This constant //allows ABITrace to handle that in a way that //is invisible to the user. - private static int AbsIndexBase = 26; //The file location of the Index pointer + private static final int absIndexBase = 26; //The file location of the Index pointer private int IndexBase, PLOC, PCON; //the next declaration is for the actual file pointers @@ -83,38 +82,44 @@ public class ABITrace { * @throws IOException if there is a problem reading the file. * @throws IllegalArgumentException if the file is not a valid ABI file. */ - public ABITrace(File ABIFile) throws IOException { - byte[] bytes = null; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); + public ABITrace(File ABIFile) throws IOException + { FileInputStream fis = new FileInputStream(ABIFile); BufferedInputStream bis = new BufferedInputStream(fis); - int b; - while ((b = bis.read()) >= 0) { - baos.write(b); - } - bis.close(); fis.close(); baos.close(); - bytes = baos.toByteArray(); - initData(bytes); + ABITraceInit(bis); + fis.close(); } /** * The URL constructor opens an ABI file from any URL. + * * @param ABIFile is a java.net.URL for an ABI trace file. * @throws IOException if there is a problem reading from the URL. * @throws IllegalArgumentException if the URL does not contain a valid ABI file. */ public ABITrace( URL ABIFile ) throws IOException { - byte[] bytes = null; - ByteArrayOutputStream baos = new ByteArrayOutputStream(); InputStream is = ABIFile.openStream(); BufferedInputStream bis = new BufferedInputStream(is); + ABITraceInit(bis); + is.close(); + } + + /** + * Helper method for constructors + * + * @param bis - BufferedInputStream + * @throws IOException if there is a problem reading from the BufferedInputStream + */ + private void ABITraceInit(BufferedInputStream bis) throws IOException{ + byte[] bytes = null; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); int b; while ((b = bis.read()) >= 0) { baos.write(b); } - bis.close(); is.close(); baos.close(); + bis.close(); baos.close(); bytes = baos.toByteArray(); initData(bytes); } @@ -122,6 +127,7 @@ public ABITrace( URL ABIFile ) throws IOException /** * The byte[] constructor parses an ABI file represented as a byte array. * + * @param ABIFileData - byte array * @throws IllegalArgumentException if the data does not represent a valid ABI file. */ public ABITrace(byte[] ABIFileData) { @@ -130,45 +136,50 @@ public ABITrace(byte[] ABIFileData) { /** * Returns the length of the sequence (number of bases) in this trace. + * + * @return int seqLength */ public int getSequenceLength() { - return SeqLength; + return seqLength; } /** * Returns the length of the trace (number of x-coordinate points in the graph). + * + * @return int traceLength */ public int getTraceLength() { - return TraceLength; + return traceLength; } /** * Returns an int[] array that represents the basecalls - each int in the * array corresponds to an x-coordinate point in the graph that is a peak (a base location). + * + * @return int[] Basecalls */ public int[] getBasecalls() { - return Basecalls; + return baseCalls; } /** * Returns an int[] array that represents the quality - each int in the * array corresponds to an quality value 90-255) in the graph at a base location). + * + * @return int[] qCalls */ public int[] getQcalls() { - return Qcalls; + return qCalls; } /** * Returns the original programmatically determined (unedited) sequence as a AbstractSequence. + * + * @return AbstractSequence sequence */ public AbstractSequence getSequence() throws CompoundNotFoundException { - try { - DNASequenceCreator creator = new DNASequenceCreator(ABITracerCompoundSet.getABITracerCompoundSet()); - return creator.getSequence(sequence, 0); - } catch (Exception e) { - // this should be impossible! - throw new CompoundNotFoundException(e.toString()); - } + DNASequenceCreator creator = new DNASequenceCreator(ABITracerCompoundSet.getABITracerCompoundSet()); + return creator.getSequence(sequence, 0); } /** @@ -177,7 +188,7 @@ public AbstractSequence getSequence() throws CompoundNotFoun * position in the array, so that if element 4 in the array is 972, then * x is 4 and y is 972 for that point. * - * @param base the DNA String to retrieve the trace values for + * @param base - the DNA String to retrieve the trace values for * @return an array of ints giving the entire trace for that base * @throws CompoundNotFoundException if the base is not valid */ @@ -201,11 +212,12 @@ public int[] getTrace (String base) throws CompoundNotFoundException { * of points in the trace (getTraceLength()). The entire trace is represented * in the returned image. * - * @param imageHeight is the desired height of the image in pixels. - * @param widthScale indiates how many horizontal pixels to use to represent a single x-coordinate (try 2). + * @param imageHeight - desired height of the image in pixels. + * @param widthScale - how many horizontal pixels to use to represent a single x-coordinate (try 2). + * @return BufferedImage image */ public BufferedImage getImage(int imageHeight, int widthScale) { - BufferedImage out = new BufferedImage(TraceLength * widthScale, imageHeight, BufferedImage.TYPE_BYTE_INDEXED); + BufferedImage out = new BufferedImage(traceLength * widthScale, imageHeight, BufferedImage.TYPE_BYTE_INDEXED); Graphics2D g = out.createGraphics(); Color acolor = Color.green.darker(); Color ccolor = Color.blue; @@ -213,14 +225,14 @@ public BufferedImage getImage(int imageHeight, int widthScale) { Color tcolor = Color.red; Color ncolor = Color.pink; double scale = calculateScale(imageHeight); - int[] bc = Basecalls; + int[] bc = baseCalls; char[] seq = sequence.toCharArray(); g.setBackground(Color.white); - g.clearRect(0, 0, TraceLength * widthScale, imageHeight); + g.clearRect(0, 0, traceLength * widthScale, imageHeight); int here = 0; int basenum = 0; for (int q = 1; q <= 5; q++) { - for (int x = 0; x <= TraceLength - 2; x++) { + for (int x = 0; x <= traceLength - 2; x++) { if (q == 1) { g.setColor(acolor); g.drawLine(2 * x, transmute(A[x], imageHeight, scale), @@ -289,6 +301,11 @@ public BufferedImage getImage(int imageHeight, int widthScale) { /** * Utility method to translate y coordinates from graph space (where up is greater) * to image space (where down is greater). + * + * @param ya + * @param height + * @param scale + * @return - translated y coordinates from graph space (where up is greater) to image space */ private int transmute(int ya, int height, double scale) { return (height - 45 - (int) (ya * scale)); @@ -301,7 +318,8 @@ private int transmute(int ya, int height, double scale) { * Returns the scaling factor necessary to allow all of the traces to fit vertically * into the specified space. * - * @param - the required height in pixels. + * @param height - required height in pixels + * @return - scaling factor */ private double calculateScale(int height) { double newScale = 0.0; @@ -314,6 +332,8 @@ private double calculateScale(int height) { /** * Get the maximum height of any of the traces. The data is persisted for performance * in the event of multiple calls, but it initialized lazily. + * + * @return - maximum height of any of the traces */ private int getMaximum() { if (maximum > 0) return maximum; @@ -330,10 +350,11 @@ private int getMaximum() { /** * Initialize all of the data fields for this object. * + * @param fileData - data for object * @throws IllegalArgumentException which will propagate to all of the constructors. */ private void initData(byte[] fileData) { - TraceData = fileData; + traceData = fileData; if (isABI()) { setIndex(); setBasecalls(); @@ -358,7 +379,7 @@ private void setTraces() { datas[3] = DATA12; for (int i = 0; i <= 3; i++) { - order[i] = (char) TraceData[FWO + i]; + order[i] = (char) traceData[FWO + i]; } for (int i = 0; i <= 3; i++) { @@ -384,16 +405,16 @@ private void setTraces() { } } - A = new int[TraceLength]; - C = new int[TraceLength]; - G = new int[TraceLength]; - T = new int[TraceLength]; + A = new int[traceLength]; + C = new int[traceLength]; + G = new int[traceLength]; + T = new int[traceLength]; for (int i = 0; i <= 3; i++) { - byte[] qq = new byte[TraceLength * 2]; + byte[] qq = new byte[traceLength * 2]; getSubArray(qq, pointers[i]); DataInputStream dis = new DataInputStream(new ByteArrayInputStream(qq)); - for (int x = 0; x <= TraceLength - 1; x++) { + for (int x = 0; x <= traceLength - 1; x++) { try { if (i == 0) A[x] = (int) dis.readShort(); if (i == 1) C[x] = (int) dis.readShort(); @@ -412,9 +433,9 @@ private void setTraces() { * Fetch the sequence from the trace data. */ private void setSeq() { - char tempseq[] = new char[SeqLength]; - for (int x = 0; x <= SeqLength - 1; ++x) { - tempseq[x] = (char) TraceData[PBAS2 + x]; + char tempseq[] = new char[seqLength]; + for (int x = 0; x <= seqLength - 1; ++x) { + tempseq[x] = (char) traceData[PBAS2 + x]; } sequence = new String(tempseq); } @@ -423,13 +444,13 @@ private void setSeq() { * Fetch the quality calls from the trace data. */ private void setQcalls() { - Qcalls = new int[SeqLength]; - byte[] qq = new byte[SeqLength]; + qCalls = new int[seqLength]; + byte[] qq = new byte[seqLength]; getSubArray(qq, PCON); DataInputStream dis = new DataInputStream(new ByteArrayInputStream(qq)); - for (int i = 0; i <= SeqLength - 1; ++i) { + for (int i = 0; i <= seqLength - 1; ++i) { try { - Qcalls[i] = (int) dis.readByte(); + qCalls[i] = (int) dis.readByte(); } catch (IOException e)//This shouldn't happen. If it does something must be seriously wrong. { throw new IllegalStateException("Unexpected IOException encountered while manipulating internal streams."); @@ -441,13 +462,13 @@ private void setQcalls() { * Fetch the basecalls from the trace data. */ private void setBasecalls() { - Basecalls = new int[SeqLength]; - byte[] qq = new byte[SeqLength * 2]; + baseCalls = new int[seqLength]; + byte[] qq = new byte[seqLength * 2]; getSubArray(qq, PLOC); DataInputStream dis = new DataInputStream(new ByteArrayInputStream(qq)); - for (int i = 0; i <= SeqLength - 1; ++i) { + for (int i = 0; i <= seqLength - 1; ++i) { try { - Basecalls[i] = (int) dis.readShort(); + baseCalls[i] = (int) dis.readShort(); } catch (IOException e)//This shouldn't happen. If it does something must be seriously wrong. { throw new IllegalStateException("Unexpected IOException encountered while manipulating internal streams."); @@ -468,8 +489,8 @@ private void setIndex() { PLOCCounter = 0; PCONCounter = 0; - IndexBase = getIntAt(AbsIndexBase + MacJunk); - NumRecords = getIntAt(AbsIndexBase - 8 + MacJunk); + IndexBase = getIntAt(absIndexBase + macJunk); + NumRecords = getIntAt(absIndexBase - 8 + macJunk); for (int record = 0; record <= NumRecords - 1; record++) { getSubArray(RecNameArray, (IndexBase + (record * 28))); @@ -504,19 +525,22 @@ private void setIndex() { } } //next record - TraceLength = getIntAt(DATA12 - 8); - SeqLength = getIntAt(PBAS2 - 4); - PLOC = getIntAt(PLOC) + MacJunk; - DATA9 = getIntAt(DATA9) + MacJunk; - DATA10 = getIntAt(DATA10) + MacJunk; - DATA11 = getIntAt(DATA11) + MacJunk; - DATA12 = getIntAt(DATA12) + MacJunk; - PBAS2 = getIntAt(PBAS2) + MacJunk; - PCON = getIntAt(PCON) + MacJunk; + traceLength = getIntAt(DATA12 - 8); + seqLength = getIntAt(PBAS2 - 4); + PLOC = getIntAt(PLOC) + macJunk; + DATA9 = getIntAt(DATA9) + macJunk; + DATA10 = getIntAt(DATA10) + macJunk; + DATA11 = getIntAt(DATA11) + macJunk; + DATA12 = getIntAt(DATA12) + macJunk; + PBAS2 = getIntAt(PBAS2) + macJunk; + PCON = getIntAt(PCON) + macJunk; } /** * Utility method to return an int beginning at pointer in the TraceData array. + * + * @param pointer - beginning of trace array + * @return - int beginning at pointer in trace array */ private int getIntAt(int pointer) { int out = 0; @@ -534,10 +558,13 @@ private int getIntAt(int pointer) { /** * A utility method which fills array b with data from the trace starting at traceDataOffset. + * + * @param b - trace byte array + * @param traceDataOffset - starting point */ private void getSubArray(byte[] b, int traceDataOffset) { for (int x = 0; x <= b.length - 1; x++) { - b[x] = TraceData[traceDataOffset + x]; + b[x] = traceData[traceDataOffset + x]; } } @@ -545,21 +572,23 @@ private void getSubArray(byte[] b, int traceDataOffset) { * Test to see if the file is ABI format by checking to see that the first three bytes * are "ABI". Also handle the special case where 128 bytes were prepended to the file * due to binary FTP from an older macintosh system. + * + * @return - if format of ABI file is correct */ private boolean isABI() { char ABI[] = new char[4]; for (int i = 0; i <= 2; i++) { - ABI[i] = (char) TraceData[i]; + ABI[i] = (char) traceData[i]; } if (ABI[0] == 'A' && (ABI[1] == 'B' && ABI[2] == 'I')) { return true; } else { for (int i = 128; i <= 130; i++) { - ABI[i-128] = (char) TraceData[i]; + ABI[i-128] = (char) traceData[i]; } if (ABI[0] == 'A' && (ABI[1] == 'B' && ABI[2] == 'I')) { - MacJunk = 128; + macJunk = 128; return true; } else return false; diff --git a/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java b/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java index 6604199f81..719b813d00 100644 --- a/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java +++ b/biojava-core/src/test/java/org/biojava/nbio/core/sequence/io/ABITracerTest.java @@ -28,11 +28,10 @@ /** * Test file 3730.ab1 is from https://github.com/biopython/biopython/blob/master/Tests/Abi/3730.ab1 - * The test data for comparing the results from ABITracer for file 3730.ab1 is from https://github.com/biopython/biopython/blob/master/Tests/Abi/test_data + * The test data for comparing the results from ABITrace.java for file 3730.ab1 is from https://github.com/biopython/biopython/blob/master/Tests/Abi/test_data */ public class ABITracerTest { - private String filePath = System.getProperty("user.dir") + "/src/test/resources/3730.ab1"; private String sequence = "GGGCGAGCKYYAYATTTTGGCAAGAATTGAGCTCTATGGCCACAACCATGGTGAGCAAGGGCGAGGAGGATAACATGGCCATCATCAAGGAGTTCATGCGCTTCAAGGTGCACATGGAGGGCTCCGTGAACGGCCACGAGTTCGAGATCGAGGGCGAGGGCGAGGGCCGCCCCTACGAGGGCACCCAGACCGCCAAGCTGAAGGTGACCAAGGGTGGCCCCCTGCCCTTCGCCTGGGACATCCTGTCCCCTCAGTTCATGTACGGCTCCAAGGCCTACGTGAAGCACCCCGCCGACATCCCCGACTACTTGAAGCTGTCCTTCCCCGAGGGCTTCAAGTGGGAGCGCGTGATGAACTTCGAGGACGGCGGCGTGGTGACCGTGACCCAGGACTCCTCCCTGCAGGACGGCGAGTTCATCTACAAGGTGAAGCTGCGCGGCACCAACTTCCCCTCCGACGGCCCCGTAATGCAGAAGAAGACCATGGGCTGGGAGGCCTCCTCCGAGCGGATGTACCCCGAGGACGGCGCCCTGAAGGGCGAGATCAAGCAGAGGCTGAAGCTGAAGGACGGCGGCCACTACGACGCTGAGGTCAAGACCACCTACAAGGCCAAGAAGCCCGTGCAGCTGCCCGGCGCCTACAACGTCAACATCAAGTTGGACATCACCTCCCACAACGAGGACTACACCATCGTGGAACAGTACGAACGCGCCGAGGGCCGCCACTCCACCGGCGGCATGGACGAGCTGTACAAGGGCGGCAGCGGCATGGTGAGCAAGGGCGAGGAGCTGTTCACCGGGGTGGTGCCCATCCTGGTCGAGCTGGACGGCGACGTAAACGGCCACAAGTTCAGCGTGTCCGGCGAGGGCGAGGGCGATGCCACCTACGGCAAGCTGACCCTGAAGTTCATCTGCACCACCGGCAAGCTGCCCGTGCCCTGGCCCACCCTCGTGACCACCCTGACCTACGGCGTGCAGTGCTTCAGCCGCTACCCCGACCACATGAAGCAGCACGACTTCTTCAAGTCCGCCATGCCCGAAGGCTACGTCCAGGAGCGCACCATCTTCTTCAAGGACGACGGCAACTACAARACCCGCGCCGAGGTGAARTTCGAGGGCGACACCCTGGTGAACCGCATCGAGCTGAAAGGGGCAYCGCACCTTTC"; private int[] qual = {20, 3, 4, 4, 4, 6, 4, 4, 0, 0, 0, 6, 0, 10, 20, 26, 22, 17, 21, 31, 29, 32, 28, 18, 23, 17, 19, 35, 36, 50, 39, 50, 50, 50, 50, 50, 25, 35, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, 39, 33, 20, 35, 31, 50, 50, 50, 50, 50, 50, 50, 50, 50, 31, 50, 35, 31, 23, 28, 31, 21, 43, 39, 35, 24, 30, 26, 35, 31, 50, 50, 50, 50, 50, 50, 50, 50, 50, 39, 31, 24, 39, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 31, 31, 43, 43, 50, 50, 50, 50, 50, 31, 31, 31, 31, 50, 50, 50, 50, 50, 50, 50, 50, 31, 31, 35, 50, 50, 50, 50, 31, 36, 55, 55, 55, 55, 36, 55, 55, 55, 55, 55, 36, 55, 55, 55, 55, 55, 36, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 40, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 36, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 40, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 43, 43, 50, 43, 43, 50, 43, 43, 50, 43, 43, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 43, 43, 50, 43, 43, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 28, 28, 35, 28, 28, 35, 28, 28, 35, 28, 28, 35, 28, 28, 35, 28, 21, 28, 35, 28, 28, 35, 35, 35, 35, 35, 37, 38, 21, 28, 35, 28, 28, 35, 35, 35, 35, 35, 35, 35, 36, 36, 21, 39, 35, 35, 35, 39, 35, 37, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 28, 28, 35, 35, 28, 28, 35, 35, 35, 36, 36, 22, 39, 35, 35, 35, 35, 35, 35, 37, 38, 28, 35, 21, 36, 36, 37, 35, 35, 20, 39, 39, 35, 35, 35, 35, 37, 38, 28, 35, 37, 34, 35, 24, 24, 27, 25, 20, 24, 37, 35, 27, 21, 20, 21, 27, 17, 20, 24, 32, 26, 20, 12, 20, 10, 20, 24, 25, 23, 20, 32, 24, 24, 23, 20, 24, 23, 18, 34, 34, 34, 22, 26, 24, 24, 18, 22, 22, 23, 25, 20, 12, 20, 24, 23, 24, 23, 22, 20, 20, 0, 20, 24, 23, 20, 8, 10, 4, 20, 20, 3, 7, 19, 20, 4, 4, 7, 7, 0, 7, 11, 18, 8, 3, 23, 23, 20, 11, 4, 20, 18, 12, 20, 20, 20, 4, 20, 4, 2, 3, 21, 21, 21, 21, 10, 15, 14, 15, 19, 2, 4, 3, 6, 11, 3, 4, 6, 21, 16, 20, 11, 1, 4, 12, 0, 15, 8, 1, 3, 3, 12, 1, 11, 20, 4}; private int[] base = {2, 13, 38, 51, 67, 78, 92, 118, 138, 162, 181, 191, 210, 222, 239, 253, 266, 280, 288, 304, 317, 333, 347, 359, 375, 386, 394, 406, 418, 433, 444, 457, 472, 482, 496, 506, 519, 529, 544, 557, 569, 579, 590, 601, 614, 626, 638, 649, 663, 673, 686, 706, 715, 731, 740, 753, 765, 777, 787, 799, 813, 826, 838, 854, 863, 876, 892, 901, 913, 929, 937, 948, 960, 970, 981, 993, 1004, 1017, 1034, 1045, 1056, 1068, 1080, 1091, 1103, 1115, 1126, 1138, 1148, 1160, 1177, 1187, 1199, 1211, 1222, 1232, 1243, 1254, 1268, 1279, 1294, 1307, 1319, 1330, 1341, 1352, 1362, 1374, 1388, 1398, 1411, 1422, 1433, 1444, 1456, 1466, 1479, 1497, 1506, 1519, 1531, 1543, 1556, 1567, 1578, 1589, 1604, 1614, 1630, 1641, 1651, 1662, 1675, 1688, 1700, 1711, 1721, 1732, 1748, 1758, 1772, 1784, 1795, 1806, 1820, 1830, 1844, 1855, 1866, 1877, 1892, 1902, 1914, 1926, 1939, 1950, 1965, 1974, 1986, 1999, 2011, 2023, 2037, 2047, 2059, 2072, 2084, 2096, 2107, 2120, 2132, 2144, 2156, 2169, 2180, 2191, 2202, 2217, 2227, 2239, 2251, 2264, 2275, 2286, 2297, 2309, 2321, 2332, 2347, 2358, 2369, 2381, 2394, 2406, 2417, 2429, 2439, 2452, 2465, 2476, 2490, 2501, 2512, 2524, 2536, 2546, 2560, 2570, 2581, 2593, 2605, 2616, 2628, 2640, 2653, 2664, 2676, 2688, 2700, 2712, 2723, 2735, 2748, 2759, 2772, 2784, 2795, 2808, 2820, 2831, 2842, 2854, 2866, 2878, 2888, 2901, 2913, 2927, 2936, 2947, 2958, 2970, 2982, 2994, 3005, 3019, 3030, 3041, 3053, 3064, 3077, 3088, 3099, 3110, 3123, 3135, 3146, 3157, 3168, 3179, 3192, 3203, 3214, 3226, 3238, 3251, 3263, 3275, 3286, 3297, 3308, 3320, 3331, 3344, 3356, 3368, 3380, 3391, 3402, 3415, 3426, 3440, 3451, 3462, 3474, 3485, 3496, 3508, 3520, 3532, 3543, 3556, 3569, 3580, 3593, 3604, 3615, 3626, 3638, 3650, 3661, 3673, 3684, 3698, 3709, 3721, 3732, 3744, 3756, 3767, 3779, 3792, 3803, 3814, 3827, 3838, 3850, 3862, 3873, 3885, 3897, 3909, 3920, 3932, 3943, 3955, 3966, 3980, 3990, 4002, 4014, 4026, 4038, 4050, 4061, 4072, 4083, 4095, 4107, 4119, 4131, 4143, 4156, 4167, 4179, 4191, 4203, 4215, 4227, 4238, 4252, 4262, 4274, 4287, 4298, 4310, 4321, 4333, 4345, 4356, 4370, 4381, 4393, 4406, 4417, 4428, 4440, 4453, 4464, 4477, 4489, 4500, 4513, 4524, 4536, 4548, 4560, 4573, 4583, 4595, 4607, 4620, 4631, 4645, 4655, 4667, 4679, 4690, 4702, 4714, 4728, 4739, 4750, 4762, 4774, 4786, 4798, 4810, 4821, 4833, 4845, 4857, 4869, 4880, 4892, 4905, 4916, 4927, 4940, 4952, 4963, 4977, 4988, 5000, 5012, 5023, 5034, 5045, 5057, 5069, 5081, 5093, 5104, 5115, 5127, 5139, 5151, 5163, 5176, 5188, 5199, 5211, 5223, 5235, 5247, 5259, 5272, 5283, 5296, 5308, 5320, 5331, 5343, 5354, 5366, 5378, 5390, 5402, 5414, 5426, 5438, 5450, 5462, 5474, 5486, 5497, 5510, 5521, 5532, 5544, 5557, 5569, 5581, 5592, 5604, 5617, 5629, 5641, 5652, 5663, 5676, 5687, 5699, 5712, 5724, 5735, 5748, 5760, 5771, 5784, 5794, 5806, 5817, 5829, 5841, 5853, 5866, 5879, 5891, 5903, 5916, 5928, 5941, 5952, 5964, 5976, 5988, 6000, 6012, 6024, 6036, 6048, 6060, 6072, 6085, 6096, 6109, 6121, 6133, 6146, 6157, 6168, 6180, 6192, 6203, 6215, 6227, 6239, 6251, 6265, 6276, 6289, 6302, 6313, 6325, 6337, 6349, 6361, 6374, 6386, 6398, 6410, 6422, 6436, 6448, 6459, 6471, 6483, 6495, 6507, 6520, 6532, 6545, 6555, 6567, 6579, 6591, 6603, 6615, 6627, 6640, 6652, 6664, 6676, 6688, 6700, 6713, 6726, 6738, 6749, 6761, 6774, 6786, 6799, 6811, 6823, 6835, 6848, 6859, 6871, 6883, 6895, 6907, 6920, 6933, 6945, 6956, 6968, 6980, 6992, 7005, 7016, 7030, 7042, 7053, 7066, 7079, 7091, 7104, 7115, 7128, 7140, 7152, 7163, 7175, 7187, 7200, 7212, 7224, 7235, 7248, 7260, 7272, 7285, 7297, 7309, 7321, 7333, 7345, 7358, 7370, 7382, 7394, 7406, 7419, 7431, 7443, 7455, 7468, 7480, 7492, 7505, 7517, 7530, 7542, 7554, 7566, 7578, 7591, 7603, 7615, 7628, 7640, 7653, 7666, 7677, 7690, 7702, 7714, 7727, 7738, 7750, 7762, 7775, 7786, 7799, 7812, 7823, 7836, 7848, 7859, 7871, 7884, 7896, 7909, 7921, 7933, 7946, 7958, 7971, 7984, 7996, 8007, 8019, 8032, 8044, 8056, 8069, 8081, 8094, 8107, 8119, 8131, 8143, 8155, 8167, 8179, 8192, 8205, 8218, 8230, 8244, 8255, 8267, 8279, 8291, 8303, 8315, 8328, 8340, 8353, 8366, 8378, 8392, 8404, 8417, 8431, 8443, 8455, 8467, 8479, 8492, 8504, 8516, 8529, 8543, 8555, 8567, 8580, 8593, 8606, 8619, 8632, 8644, 8658, 8670, 8683, 8695, 8708, 8721, 8733, 8746, 8759, 8771, 8783, 8795, 8808, 8821, 8833, 8845, 8858, 8871, 8885, 8898, 8910, 8923, 8936, 8949, 8960, 8973, 8986, 9000, 9012, 9025, 9038, 9051, 9064, 9076, 9089, 9102, 9114, 9126, 9139, 9151, 9164, 9177, 9191, 9204, 9217, 9230, 9243, 9255, 9268, 9281, 9294, 9307, 9320, 9333, 9345, 9358, 9371, 9384, 9398, 9412, 9424, 9437, 9450, 9462, 9475, 9488, 9501, 9514, 9528, 9542, 9554, 9567, 9581, 9593, 9606, 9619, 9632, 9645, 9658, 9671, 9682, 9695, 9708, 9721, 9735, 9749, 9762, 9776, 9789, 9802, 9815, 9828, 9842, 9855, 9867, 9880, 9893, 9906, 9920, 9933, 9947, 9960, 9974, 9987, 10000, 10014, 10027, 10040, 10054, 10067, 10081, 10095, 10107, 10120, 10134, 10148, 10161, 10175, 10188, 10201, 10214, 10228, 10241, 10254, 10267, 10280, 10294, 10309, 10322, 10335, 10348, 10362, 10374, 10387, 10401, 10415, 10428, 10441, 10455, 10469, 10482, 10497, 10510, 10523, 10537, 10551, 10565, 10579, 10593, 10606, 10621, 10634, 10647, 10661, 10675, 10689, 10704, 10719, 10732, 10746, 10760, 10774, 10788, 10802, 10815, 10829, 10843, 10856, 10871, 10884, 10898, 10913, 10927, 10940, 10955, 10970, 10984, 10999, 11013, 11027, 11042, 11056, 11071, 11086, 11100, 11114, 11128, 11142, 11158, 11171, 11186, 11200, 11213, 11228, 11241, 11255, 11270, 11284, 11299, 11314, 11328, 11342, 11356, 11370, 11385, 11399, 11413, 11429, 11445, 11460, 11474, 11489, 11503, 11518, 11533, 11549, 11563, 11577, 11592, 11607, 11621, 11637, 11651, 11665, 11680, 11694, 11708, 11725, 11740, 11754, 11768, 11784, 11798, 11813, 11828, 11843, 11858, 11874, 11888, 11904, 11920, 11933, 11948, 11964, 11979, 11993, 12009, 12024, 12041, 12058, 12071, 12087, 12102, 12117, 12132, 12148, 12165, 12179, 12195, 12210, 12226, 12241, 12256, 12273, 12288, 12304, 12320, 12335, 12350, 12365, 12382, 12398, 12414, 12430, 12446, 12462, 12478, 12495, 12511, 12525, 12541, 12556, 12575, 12591, 12605, 12622, 12638, 12653, 12671, 12686, 12705, 12721, 12739, 12756, 12772, 12788, 12806, 12822, 12839, 12855, 12873, 12890, 12908, 12923, 12941, 12960, 12975, 12992, 13009, 13024, 13040, 13059, 13076, 13092, 13109, 13128, 13145, 13161, 13179, 13194, 13216, 13233, 13249, 13266, 13287, 13303, 13322, 13337, 13357, 13375, 13392, 13410, 13424, 13446, 13465, 13480, 13499, 13517, 13533, 13559, 13575, 13595, 13612, 13632, 13650, 13670, 13687, 13706, 13726, 13744, 13765, 13783, 13803, 13822, 13841, 13860, 13879, 13897, 13917, 13936, 13960, 13979, 13996, 14019, 14040, 14057, 14077, 14102, 14122, 14141, 14163, 14184, 14202, 14225, 14244, 14265, 14287, 14312, 14336, 14356, 14375, 14393, 14420, 14438, 14465, 14483, 14500, 14536, 14555, 14575, 14604, 14619, 14648, 14668, 14691, 14725, 14748, 14770, 14788, 14818, 14840, 14862, 14888, 14921, 14939, 14969, 14996, 15022, 15051, 15075, 15098, 15130, 15149, 15167, 15218, 15237, 15276, 15297, 15333, 15356, 15379, 15418, 15447, 15481, 15508, 15530, 15574, 15599, 15643, 15680, 15697, 15743, 15759, 15775, 15813, 15845, 15877, 15911, 15931, 15968, 16014, 16049, 16077, 16088, 16138, 16149, 16185, 16200, 16241, 16280, 16296}; @@ -61,11 +60,9 @@ public void tearDown() { */ @Test public void testURL() throws Exception { - File file = new File(filePath); - Assert.assertNotNull(file); - URL url = file.toURI().toURL(); - Assert.assertNotNull(url); - ABITrace tracer = new ABITrace(url); + URL resource = this.getClass().getResource("/3730.ab1"); + Assert.assertNotNull(resource); + ABITrace tracer = new ABITrace(resource); Assert.assertNotNull(tracer); } @@ -74,7 +71,9 @@ public void testURL() throws Exception { */ @Test public void testLocal() throws Exception { - File file = new File(filePath); + URL resource = this.getClass().getResource("/3730.ab1"); + Assert.assertNotNull(resource); + File file = new File(resource.toURI()); Assert.assertNotNull(file); ABITrace tracer = new ABITrace(file); Assert.assertNotNull(tracer); From c6fa93bbd538b82f376bb1cf934fbbd971821e85 Mon Sep 17 00:00:00 2001 From: MaxGreil Date: Mon, 7 May 2018 20:34:26 +0200 Subject: [PATCH 6/6] Fixed minor issues --- .../nbio/core/sequence/io/ABITrace.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java index 1ef6a85b50..b11b8e3c42 100644 --- a/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java +++ b/biojava-core/src/main/java/org/biojava/nbio/core/sequence/io/ABITrace.java @@ -61,8 +61,6 @@ public class ABITrace { //This is the actual file data. private byte[] traceData; - private int maximum = 0; - //the next four declaration lines comprise the file index information private int macJunk = 0; //sometimes when macintosh files are //FTPed in binary form, they have 128 bytes @@ -70,7 +68,7 @@ public class ABITrace { //allows ABITrace to handle that in a way that //is invisible to the user. private static final int absIndexBase = 26; //The file location of the Index pointer - private int IndexBase, PLOC, PCON; + private int PLOC, PCON; //the next declaration is for the actual file pointers private int DATA9, DATA10, DATA11, DATA12, PBAS2, FWO; @@ -336,7 +334,6 @@ private double calculateScale(int height) { * @return - maximum height of any of the traces */ private int getMaximum() { - if (maximum > 0) return maximum; int max = 0; for (int x = 0; x <= T.length - 1; x++) { if (T[x] > max) max = T[x]; @@ -480,7 +477,7 @@ private void setBasecalls() { * Sets up all of the initial pointers to the important records in TraceData. */ private void setIndex() { - int DataCounter, PBASCounter, PLOCCounter, PCONCounter, NumRecords; + int DataCounter, PBASCounter, PLOCCounter, PCONCounter, NumRecords, indexBase; byte[] RecNameArray = new byte[4]; String RecName; @@ -489,39 +486,39 @@ private void setIndex() { PLOCCounter = 0; PCONCounter = 0; - IndexBase = getIntAt(absIndexBase + macJunk); + indexBase = getIntAt(absIndexBase + macJunk); NumRecords = getIntAt(absIndexBase - 8 + macJunk); for (int record = 0; record <= NumRecords - 1; record++) { - getSubArray(RecNameArray, (IndexBase + (record * 28))); + getSubArray(RecNameArray, (indexBase + (record * 28))); RecName = new String(RecNameArray); if (RecName.equals("FWO_")) - FWO = IndexBase + (record * 28) + 20; + FWO = indexBase + (record * 28) + 20; if (RecName.equals("DATA")) { ++DataCounter; if (DataCounter == 9) - DATA9 = IndexBase + (record * 28) + 20; + DATA9 = indexBase + (record * 28) + 20; if (DataCounter == 10) - DATA10 = IndexBase + (record * 28) + 20; + DATA10 = indexBase + (record * 28) + 20; if (DataCounter == 11) - DATA11 = IndexBase + (record * 28) + 20; + DATA11 = indexBase + (record * 28) + 20; if (DataCounter == 12) - DATA12 = IndexBase + (record * 28) + 20; + DATA12 = indexBase + (record * 28) + 20; } if (RecName.equals("PBAS")) { ++PBASCounter; if (PBASCounter == 2) - PBAS2 = IndexBase + (record * 28) + 20; + PBAS2 = indexBase + (record * 28) + 20; } if (RecName.equals("PLOC")) { ++PLOCCounter; if (PLOCCounter == 2) - PLOC = IndexBase + (record * 28) + 20; + PLOC = indexBase + (record * 28) + 20; } if (RecName.equals("PCON")) { ++PCONCounter; if (PCONCounter == 2) - PCON = IndexBase + (record * 28) + 20; + PCON = indexBase + (record * 28) + 20; } } //next record