/*
* #%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 PValueLogSumScale extends NumericColorScale {
private double center;
private double limit;
private double significanceLimit;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color leftMinColor;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color leftMaxColor;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color rightMinColor;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color rightMaxColor;
@XmlJavaTypeAdapter(ColorXmlAdapter.class)
private Color nonSignificantColor;
private PValueLogSumScale(double center, double limit, double significanceLimit, Color leftMinColor, Color leftMaxColor, Color rightMinColor, Color rightMaxColor, Color nonSignificantColor) {
this.center = center;
this.limit = limit;
this.significanceLimit = significanceLimit;
this.leftMinColor = leftMinColor;
this.leftMaxColor = leftMaxColor;
this.rightMinColor = rightMinColor;
this.rightMaxColor = rightMaxColor;
this.nonSignificantColor = nonSignificantColor;
}
public PValueLogSumScale() {
this(0, 10, 1.278754, Color.BLUE, Color.CYAN, Color.YELLOW, Color.RED, ColorConstants.nonSignificantColor);
}
@Override
protected Color colorOf(double value) {
double absValue = Math.abs(value);
if (absValue < significanceLimit) {
return nonSignificantColor;
}
double f = (absValue - significanceLimit) / (limit - significanceLimit);
if (value > getMaxValue()) {
return rightMaxColor;
} else if (value < getMinValue()) {
return leftMinColor;
} else if (value > center) {
return Colors.mix(rightMaxColor, rightMinColor, f);
} else {
return Colors.mix(leftMinColor, leftMaxColor, f);
}
}
@Override
public double[] getPoints() {
return new double[]{center - limit, center - significanceLimit, center + significanceLimit, center + limit};
}
@Override
protected void updateRangesList() {
ArrayList<ColorScaleRange> rangesList = getInternalScaleRanges();
rangesList.clear();
ColorScaleRange left = new ColorScaleRange(getMinValue(), -getSignificanceLimit(), -getSignificanceLimit() - getMinValue());
ColorScaleRange middle = new ColorScaleRange(-getSignificanceLimit(), getSignificanceLimit() - 0.01, getSignificanceLimit() * 2);
ColorScaleRange right = new ColorScaleRange(getSignificanceLimit(), getMaxValue(), getMaxValue() - getSignificanceLimit());
left.setLeftLabel(getMinValue());
left.setRightLabel(-getSignificanceLimit());
middle.setType(ColorScaleRange.CONSTANT_TYPE);
right.setLeftLabel(getSignificanceLimit());
right.setRightLabel(getMaxValue());
rangesList.add(left);
rangesList.add(middle);
rangesList.add(right);
}
public double getCenter() {
return center;
}
public void setCenter(double center) {
this.center = center;
updateRangesList();
}
public void setLimit(double limit) {
this.limit = limit;
updateRangesList();
}
public double getSignificanceLimit() {
return significanceLimit;
}
public void setSignificanceLimit(double significanceLimit) {
this.significanceLimit = significanceLimit;
}
public Color getLeftMinColor() {
return leftMinColor;
}
public void setLeftMinColor(Color leftMinColor) {
this.leftMinColor = leftMinColor;
updateRangesList();
}
public Color getLeftMaxColor() {
return leftMaxColor;
}
public void setLeftMaxColor(Color leftMaxColor) {
this.leftMaxColor = leftMaxColor;
updateRangesList();
}
public Color getRightMinColor() {
return rightMinColor;
}
public void setRightMinColor(Color rightMinColor) {
this.rightMinColor = rightMinColor;
updateRangesList();
}
public Color getRightMaxColor() {
return rightMaxColor;
}
public void setRightMaxColor(Color rightMaxColor) {
this.rightMaxColor = rightMaxColor;
updateRangesList();
}
public Color getNonSignificantColor() {
return nonSignificantColor;
}
public void setNonSignificantColor(Color nonSignificantColor) {
this.nonSignificantColor = nonSignificantColor;
}
public double getLimit() {
return limit;
}
}