/*
* Copyright (c) 2007-2012 The Broad Institute, Inc.
* SOFTWARE COPYRIGHT NOTICE
* This software and its documentation are the copyright of the Broad Institute, Inc. All rights are reserved.
*
* This software is supplied without any warranty or guaranteed support whatsoever. The Broad Institute is not responsible for its use, misuse, or functionality.
*
* 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.
*/
package org.broad.igv.data;
import org.broad.igv.AbstractHeadlessTest;
import org.broad.igv.feature.LocusScore;
import org.broad.igv.feature.genome.Genome;
import org.broad.igv.track.TrackType;
import org.broad.igv.util.ResourceLocator;
import org.broad.igv.util.TestUtils;
import org.junit.Test;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Created by IntelliJ IDEA.
* User: jrobinso
* Date: Dec 19, 2009
* Time: 7:17:32 PM
* To change this template use File | Settings | File Templates.
*/
public class AbstractDataSourceTest extends AbstractHeadlessTest {
/**
* # When viewed as a heatmap this feature shows a 1-pixel break at position 23,314,405 when the
* # zoom is at chr20:23,314,141-23,314,667
* chr20 23313029 23316433 91.1
*/
@Test
public void testRT_134467() {
int[] starts = {23313029};
int[] ends = {23316433};
float[] values = {91.1f};
int s = 23313929;
int e = 23314405;
TestDataSource ds = new TestDataSource(starts, ends, values);
SummaryTile tile = ds.computeSummaryTile("chr20", s, e, 1);
List<LocusScore> scores = tile.getScores();
// Scores should be within 10 +/- 0.5, and the mean should be very close to 10
for (LocusScore score : scores) {
float v = score.getScore();
assertEquals(91.1f, v, 0.00001);
}
assertEquals(1, scores.size());
}
@Test
public void testGetSummaryScoresForRange() {
TestDataSource ds = new TestDataSource();
SummaryTile tile = ds.computeSummaryTile("", 0, 10000, 1);
List<LocusScore> scores = tile.getScores();
// Scores should be within 10 +/- 0.5, and the mean should be very close to 10
float sum = 0.0f;
long totPoints = 0;
for (LocusScore score : scores) {
float v = score.getScore();
assertTrue((v >= 9.5f && v <= 10.5f));
int numPoints = score.getEnd() - score.getStart();
sum += numPoints * v;
totPoints += numPoints;
}
double mean = sum / totPoints;
assertEquals(10.0, mean, 1.0e-2);
}
@Test
public void testGetSummaryScoresForSNPs() throws Exception {
ResourceLocator locator = new ResourceLocator(TestUtils.DATA_DIR + "cn/multi_snp.cn");
Genome genome = TestUtils.loadGenome();
IGVDataset ds = new IGVDataset(locator, genome);
DatasetDataSource dataSource = new DatasetDataSource("Sample1", ds, genome);
String chr = "chr10";
dataSource.cacheSummaryTiles = false;
int zreq = 22;
int half_width = 20;
int[] starts = {72644150, 72698871, 72729621, 89614266, 89614367, 89614406, 89614478};
for (int start : starts) {
int end = start + 1 + half_width;
start -= half_width;
List<LocusScore> scores = dataSource.getSummaryScoresForRange(chr, start, end, zreq);
assertEquals(1, scores.size());
}
int start = starts[0] - 100;
int end = starts[starts.length - 1] + 100;
List<LocusScore> scores = dataSource.getSummaryScoresForRange(chr, start, end, 22);
//The last few get combined into 1 tile
assertEquals(4, scores.size());
}
public class TestDataSource extends AbstractDataSource {
private int nPts;
int[] starts;
int[] ends;
float[] values;
String[] probes;
TestDataSource(int[] starts, int[] ends, float[] values) {
super(null);
nPts = starts.length;
this.starts = starts;
this.ends = ends;
this.values = values;
this.probes = null;
}
TestDataSource() {
super(null);
nPts = 10000;
starts = new int[nPts];
ends = new int[nPts];
values = new float[nPts];
probes = new String[nPts];
for (int i = 0; i < nPts; i++) {
starts[i] = i;
ends[i] = i + 1;
values[i] = (float) (9.5 + Math.random());
probes[i] = "probe_" + i;
}
}
protected DataTile getRawData(String chr, int startLocation, int endLocation) {
return new DataTile(starts, ends, values, probes);
}
@Override
protected List<LocusScore> getPrecomputedSummaryScores(String chr, int startLocation, int endLocation, int zoom) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public int getLongestFeature(String chr) {
return 1000;
}
public double getMedian(int zoom, String chr) {
return 0; //To change body of implemented methods use File | Settings | File Templates.
}
public double getDataMax() {
return 0; //To change body of implemented methods use File | Settings | File Templates.
}
public double getDataMin() {
return 0; //To change body of implemented methods use File | Settings | File Templates.
}
public TrackType getTrackType() {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
}
}