/* * Copyright (c) 2007-2010 by The Broad Institute, Inc. and the Massachusetts Institute of Technology. * All Rights Reserved. * * This software is licensed under the terms of the GNU Lesser General Public License (LGPL), Version 2.1 which * is available at http://www.opensource.org/licenses/lgpl-2.1.php. * * THE SOFTWARE IS PROVIDED "AS IS." THE BROAD AND MIT MAKE NO REPRESENTATIONS OR WARRANTIES OF * ANY KIND CONCERNING THE SOFTWARE, EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT * OR OTHER DEFECTS, WHETHER OR NOT DISCOVERABLE. IN NO EVENT SHALL THE BROAD OR MIT, OR THEIR * RESPECTIVE TRUSTEES, DIRECTORS, OFFICERS, EMPLOYEES, AND AFFILIATES BE LIABLE FOR ANY DAMAGES OF * ANY KIND, INCLUDING, WITHOUT LIMITATION, INCIDENTAL OR CONSEQUENTIAL DAMAGES, ECONOMIC * DAMAGES OR INJURY TO PROPERTY AND LOST PROFITS, REGARDLESS OF WHETHER THE BROAD OR MIT SHALL * BE ADVISED, SHALL HAVE OTHER REASON TO KNOW, OR IN FACT SHALL KNOW OF THE POSSIBILITY OF THE * FOREGOING. */ package htsjdk.tribble.index.interval; import htsjdk.tribble.AbstractFeatureReader; import htsjdk.tribble.CloseableTribbleIterator; import htsjdk.tribble.FeatureReader; import htsjdk.tribble.TestUtils; import htsjdk.tribble.bed.BEDCodec; import htsjdk.tribble.bed.BEDFeature; import htsjdk.tribble.index.Index; import htsjdk.tribble.index.IndexFactory; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; /** * User: jrobinso * Date: Mar 24, 2010 */ public class IntervalTreeTest { static IntervalTree tree; @BeforeClass public static void setupTree() { tree = new IntervalTree(); tree.insert(new Interval(0, 3, null)); tree.insert(new Interval(5, 8, null)); tree.insert(new Interval(6, 10, null)); tree.insert(new Interval(8, 9, null)); tree.insert(new Interval(15, 23, null)); tree.insert(new Interval(16, 21, null)); tree.insert(new Interval(17, 19, null)); tree.insert(new Interval(19, 20, null)); tree.insert(new Interval(25, 30, null)); tree.insert(new Interval(26, 27, null)); } @Test public void testSearch() { final Interval queryInterval = new Interval(1, 2); List<Interval> intervals = tree.findOverlapping(queryInterval); Assert.assertNotNull(intervals); for (Interval iv : intervals) { Assert.assertTrue(queryInterval.overlaps(iv)); } } @Test public void testBed() throws Exception { String bedFile = TestUtils.DATA_DIR + "/index/chrY_Y4_small.bed"; tree = new IntervalTree(); Assert.assertTrue(tree.isValid()); BufferedReader br = new BufferedReader(new FileReader(bedFile)); String nextLine = ""; while ((nextLine = br.readLine()) != null) { if (!(nextLine.startsWith("#") || nextLine.startsWith("track"))) { String[] tokens = nextLine.split("\t"); if (tokens.length > 2) { int start = Integer.parseInt(tokens[1]); int end = Integer.parseInt(tokens[2]); tree.insert(new Interval(start, end)); } } } // List iv = (List) tree.findOverlapping(new Interval(2770226, 2770300)); Interval searchInterval = new Interval(2782632, 2782732); List<Interval> iv = tree.findOverlapping(searchInterval); for (Interval i : iv) { Assert.assertTrue(i.overlaps(searchInterval)); } br.close(); } @Test /** * * chr2 1 200000000 LONG_FEATURE * ... * chr2 179098961 179380395 Hs.134602 * chr2 179209546 179287210 Hs.620337 * chr2 179266309 179266748 Hs.609465 * chr2 179296428 179300012 Hs.623987 * chr2 179302952 179303488 Hs.594545 */ public void testOverlappingFeatures() throws Exception { //chr2:179,222,066-179,262,059<- CONTAINS TTN Set<String> names = new HashSet<String>(Arrays.asList("Hs.134602", "Hs.620337", "Hs.609465", "Hs.623987", "Hs.594545", "LONG_FEATURE")); String bedFile = TestUtils.DATA_DIR + "/bed/Unigene.sample.bed"; String chr = "chr2"; int start = 179266309; int end = 179303488 ; int expectedCount = 6; // Interval tree index int batchSize = 1; Index idx = IndexFactory.createIntervalIndex(new File(bedFile), new BEDCodec(), batchSize); FeatureReader<BEDFeature> bfr = AbstractFeatureReader.getFeatureReader(bedFile, new BEDCodec(), idx); CloseableTribbleIterator<BEDFeature>iter = bfr.query(chr, start, end); int countInterval = 0; while (iter.hasNext()) { BEDFeature feature = iter.next(); Assert.assertTrue(feature.getEnd() >= start && feature.getStart() <= end); Assert.assertTrue(names.contains(feature.getName())); countInterval++; } Assert.assertEquals(countInterval, expectedCount); } }