/*
* 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.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.
}
}
}