/* * The MIT License (MIT) * * Copyright (c) 2007-2015 Broad Institute * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package org.broad.igv.tools.parsers; import junit.framework.Assert; import org.broad.igv.Globals; import org.broad.igv.feature.BasicFeature; import org.broad.igv.feature.FeatureDB; import org.broad.igv.feature.genome.Genome; import org.broad.igv.feature.tribble.CodecFactory; import org.broad.igv.feature.tribble.FeatureFileHeader; import org.broad.igv.feature.tribble.IGVBEDCodec; import org.broad.igv.tools.IgvTools; import org.broad.igv.util.TestUtils; import htsjdk.tribble.AbstractFeatureReader; import htsjdk.tribble.Feature; import htsjdk.tribble.FeatureCodec; import htsjdk.tribble.bed.BEDCodec; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.Iterator; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertNotNull; /** * User: jacob * Date: 2012/01/17 */ public class TestBEDCodecs { IgvTools igvTools; @Before public void setUp() throws Exception { Globals.setHeadless(true); igvTools = new IgvTools(); } @After public void tearDown() throws Exception { igvTools = null; } @Test public void testIntervalTest() throws Exception { intervalTestFile(new BEDCodec()); intervalTestFile(new IGVBEDCodec()); } @Test public void testLargeBedNoHeader() throws Exception { String bedFile = TestUtils.DATA_DIR + "bed/Unigene.noheader.sorted.bed"; tstUnigeneBed(bedFile, new BEDCodec()); tstUnigeneBed(bedFile, new IGVBEDCodec()); } @Test public void testLargeBedWithHeader() throws Exception { String bedFile = TestUtils.DATA_DIR + "bed/Unigene.withheader.sorted.bed"; tstUnigeneBed(bedFile, new BEDCodec()); tstUnigeneBed(bedFile, new IGVBEDCodec()); } @Test public void testLargeBedWeirdHeader() throws Exception { String bedFile = TestUtils.DATA_DIR + "bed/Unigene.weirdheader.sorted.bed"; tstUnigeneBed(bedFile, new BEDCodec()); tstUnigeneBed(bedFile, new IGVBEDCodec()); } @Test public void testLargeBedNoTrack() throws Exception { String bedFile = TestUtils.DATA_DIR + "bed/Unigene.notrack.sorted.bed"; tstUnigeneBed(bedFile, new BEDCodec()); tstUnigeneBed(bedFile, new IGVBEDCodec()); } @Test public void testGffTags() throws Exception { String bedFile = TestUtils.DATA_DIR + "bed/gene.bed"; Genome genome = TestUtils.loadGenome(); FeatureCodec codec1 = CodecFactory.getCodec(bedFile, genome); assertTrue(codec1 instanceof IGVBEDCodec); IGVBEDCodec codec = (IGVBEDCodec) codec1; AbstractFeatureReader bfr = AbstractFeatureReader.getFeatureReader(bedFile, codec, false); FeatureFileHeader header = (FeatureFileHeader) bfr.getHeader(); Assert.assertNotNull(header); assertTrue(codec.isGffTags()); Iterator<BasicFeature> iter = bfr.iterator(); while (iter.hasNext()) { BasicFeature feat = iter.next(); //Note: These are not in general equal, but they are for this data file assertEquals(feat.getName(), feat.getIdentifier()); assertNotNull("No ID found for feature", feat.getIdentifier()); assertNotNull("No description found for feature", feat.getDescription()); assertNotNull("Feature not in FeatureDB", FeatureDB.getFeature(feat.getIdentifier())); } } public void intervalTestFile(FeatureCodec codec) throws Exception { int startOffset = 0; if (codec instanceof BEDCodec) { startOffset = ((BEDCodec) codec).getStartOffset(); } String bedFile = TestUtils.DATA_DIR + "bed/intervalTest.bed"; // Interval index TestUtils.createIndex(bedFile, IgvTools.INTERVAL_INDEX, 100); AbstractFeatureReader bfr = AbstractFeatureReader.getFeatureReader(bedFile, codec); Iterator<Feature> iter = bfr.query("chr1", 0, Integer.MAX_VALUE); int count = 0; while (iter.hasNext()) { Feature feat = iter.next(); if (count == 0) { //Check we don't skip first line assertEquals(1677535, feat.getStart() - startOffset); } count++; } assertEquals(6, count); } public void tstUnigeneBed(String bedFile, FeatureCodec codec) throws Exception { //chr2:178,599,764-179,830,787 <- CONTAINS TTN int startOffset = 0; if (codec instanceof BEDCodec) { startOffset = ((BEDCodec) codec).getStartOffset(); } TestUtils.createIndex(bedFile, IgvTools.LINEAR_INDEX, 10000); String chr = "chr2"; int start = 178707289 / 2; int end = 179973464 * 2; AbstractFeatureReader bfr = AbstractFeatureReader.getFeatureReader(bedFile, codec); Iterator<Feature> iter = bfr.query(chr, start, end); int count = 0; while (iter.hasNext()) { Feature feat = iter.next(); if (count == 0) { //Check we don't skip first line assertEquals(178707289, feat.getStart() - startOffset); } check_feat_unigene(feat, chr, start, end); count++; } assertEquals(71, count); //Re-query with some restrictions count = 0; start = 178709699; end = 179721089; iter = bfr.query(chr, start, end); while (iter.hasNext()) { Feature feat = iter.next(); check_feat_unigene(feat, chr, start, end); count++; } assertEquals(65, count); } /** * Some checking of features queried from a given test file * * @param feat * @param chr * @param start * @param end */ private void check_feat_unigene(Feature feat, String chr, int start, int end) { assertEquals(chr, feat.getChr()); assertTrue(feat.getEnd() > feat.getStart()); assertTrue("Start out of range", feat.getStart() >= start); assertTrue("end out of range", feat.getStart() <= end); } @Test public void testLength1Feature() throws Exception { String bedFile = TestUtils.DATA_DIR + "bed/snp_calls.bed"; TestUtils.createIndex(bedFile, IgvTools.LINEAR_INDEX, 10000); FeatureCodec codec = CodecFactory.getCodec(bedFile, null); AbstractFeatureReader<Feature, ?> bfr = AbstractFeatureReader.getFeatureReader(bedFile, codec); for (Feature feat : bfr.iterator()) { BasicFeature f = (BasicFeature) feat; assertEquals(1, f.getLength()); } } }