/*
* #%L
* gitools-utils
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.utils.colorscale.impl;
import org.gitools.utils.color.Colors;
import org.gitools.utils.colorscale.ColorConstants;
import org.gitools.utils.colorscale.ColorScaleRange;
import org.gitools.utils.colorscale.NumericColorScale;
import org.gitools.utils.xml.adapter.ColorXmlAdapter;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import java.awt.*;
import java.util.ArrayList;
@XmlAccessorType(XmlAccessType.FIELD)
public class PValueColorScale extends NumericColorScale {
private static final double defaultLogFactor = 0.25;
private double significanceLevel;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color minColor;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color maxColor;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color nonSignificantColor;
private PValueColorScale(double significanceLevel, Color minColor, Color maxColor, Color nonSignificantColor) {
super();
this.significanceLevel = significanceLevel;
this.maxColor = maxColor;
this.minColor = minColor;
this.nonSignificantColor = nonSignificantColor;
}
public PValueColorScale() {
this(0.05, ColorConstants.minColor, ColorConstants.maxColor, ColorConstants.nonSignificantColor);
updateRangesList();
}
@Override
protected Color colorOf(double value) {
if (value > significanceLevel || value < 0) {
return nonSignificantColor;
}
double f = value / significanceLevel;
f = (f == 0.0 ? 0.0 : 1.0 + defaultLogFactor * Math.log10(f));
return Colors.mix(maxColor, minColor, f);
}
@Override
public double[] getPoints() {
return new double[]{0, significanceLevel, 1};
}
public double getSignificanceLevel() {
return significanceLevel;
}
public void setSignificanceLevel(double significanceLevel) {
this.significanceLevel = significanceLevel;
if (significanceLevel > 1) {
this.significanceLevel = 1;
}
if (significanceLevel < 0) {
this.significanceLevel = 0;
}
updateRangesList();
}
public Color getMinColor() {
return minColor;
}
public void setMinColor(Color minColor) {
this.minColor = minColor;
}
public Color getMaxColor() {
return maxColor;
}
public void setMaxColor(Color maxColor) {
this.maxColor = maxColor;
}
public Color getNonSignificantColor() {
return nonSignificantColor;
}
public void setNonSignificantColor(Color nonSignificantColor) {
this.nonSignificantColor = nonSignificantColor;
}
@Override
protected void updateRangesList() {
ArrayList<ColorScaleRange> rangesList = getInternalScaleRanges();
rangesList.clear();
double min = getMinValue();
double max = getMaxValue();
double mid = getSignificanceLevel();
rangesList.add(new ColorScaleRange(min, mid, 20, min, null, mid, ColorScaleRange.LOGARITHMIC_TYPE));
rangesList.add(new ColorScaleRange(mid, max, 10, null, null, max, ColorScaleRange.LOGARITHMIC_TYPE));
}
}