/*
* 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.
*/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.broad.igv.data;
//~--- non-JDK imports --------------------------------------------------------
import org.apache.log4j.Logger;
import org.broad.igv.Globals;
import org.broad.igv.feature.Chromosome;
import org.broad.igv.feature.LocusScore;
import org.broad.igv.feature.genome.Genome;
import org.broad.igv.track.TrackType;
import org.broad.igv.track.WindowFunction;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author jrobinso
*/
public class DatasetDataSource extends AbstractDataSource {
private Logger log = Logger.getLogger(DatasetDataSource.class);
String trackId;
Dataset dataset;
GenomeSummaryData genomeSummaryData;
/**
* @param trackId
* @param dataset
* @param genome
*/
public DatasetDataSource(String trackId, Dataset dataset, Genome genome) {
super(genome);
this.trackId = trackId;
this.dataset = dataset;
// TODO -- remove this "instanceof" hack
if (genome.getHomeChromosome().equals(Globals.CHR_ALL)) {
if (dataset instanceof IGVDataset) {
genomeSummaryData = ((IGVDataset) dataset).getGenomeSummary();
} else {
genomeSummaryData = new GenomeSummaryData(genome, new String[]{trackId});
for (Chromosome chr : genome.getChromosomes()) {
int[] startLocations = dataset.getStartLocations(chr.getName());
if (!chr.getName().equals(Globals.CHR_ALL) && (startLocations != null) && (startLocations.length > 0)) {
Map<String, float[]> dMap = new HashMap<String, float[]>();
dMap.put(trackId, dataset.getData(trackId, chr.getName()));
genomeSummaryData.addData(chr.getName(), startLocations, dMap);
}
}
}
}
}
@Override
protected DataTile getRawData(String chr, int startLocation, int endLocation) {
if (chr.equals(Globals.CHR_ALL) && genomeSummaryData != null && windowFunction != WindowFunction.none) {
int[] startLocs = genomeSummaryData.getLocations();
int[] endLocs = null;
float[] data = genomeSummaryData.getData(trackId);
return new DataTile(startLocs, endLocs, data, null);
}
if (chr.equals(Globals.CHR_ALL)) {
return getWGRawData();
} else {
int[] startLocs = dataset.getStartLocations(chr);
int[] endLocs = dataset.getEndLocations(chr);
float[] data = dataset.getData(trackId, chr);
String[] features = dataset.getFeatureNames(chr);
if (startLocs == null || (data == null) || data.length == 0) {
return null;
}
return new DataTile(startLocs, endLocs, data, features);
}
}
/**
* Create a tile for WG data. This is used when genome summary data is not useful => window function == none
*
* @return
*/
private DataTile getWGRawData() {
int size = 0;
for (String chr : genome.getAllChromosomeNames()) {
int[] s = dataset.getStartLocations(chr);
int[] e = dataset.getEndLocations(chr);
float[] d = dataset.getData(trackId, chr);
if (s != null && d != null) size += s.length;
}
if (size == 0) return null;
int[] startLocs = new int[size];
int[] endLocs = new int[size];
float[] data = new float[size];
String[] features = new String[size];
int i = 0;
for (String chr : genome.getAllChromosomeNames()) {
int[] s = dataset.getStartLocations(chr);
int[] e = dataset.getEndLocations(chr);
float[] d = dataset.getData(trackId, chr);
String[] f = dataset.getFeatureNames(chr);
if (s != null && d != null) {
int l = s.length;
for (int j = 0; j < l; j++) {
startLocs[i] = genome.getGenomeCoordinate(chr, s[j]);
endLocs[i] = e == null ? startLocs[i] + 1 : genome.getGenomeCoordinate(chr, e[j]);
data[i] = d[j];
if (f != null) features[i] = f[j];
i++;
}
}
}
return new DataTile(startLocs, endLocs, data, features);
}
@Override
protected List<LocusScore> getPrecomputedSummaryScores(String chr, int startLocation, int endLocation, int zoom) {
return null;
}
public TrackType getTrackType() {
try {
return dataset.getType();
} catch (Exception exception) {
return TrackType.OTHER;
}
}
@Override
public boolean isLogNormalized() {
return dataset.isLogNormalized();
}
public double getDataMax() {
return dataset.getDataMax();
}
public double getDataMin() {
return dataset.getDataMin();
}
@Override
public int getLongestFeature(String chr) {
return dataset.getLongestFeature(chr);
}
}