package gdsc.smlm.results.filter; /*----------------------------------------------------------------------------- * GDSC SMLM Software * * Copyright (C) 2013 Alex Herbert * Genome Damage and Stability Centre * University of Sussex, UK * * 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. *---------------------------------------------------------------------------*/ import gdsc.smlm.results.MemoryPeakResults; import gdsc.smlm.results.PeakResult; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; /** * Filter results using a coordinate range */ public class CoordinateFilter extends DirectFilter { public static final double DEFAULT_INCREMENT = 0.01; public static final double DEFAULT_RANGE = 1; @XStreamAsAttribute final float minX; @XStreamAsAttribute final float maxX; @XStreamAsAttribute final float minY; @XStreamAsAttribute final float maxY; public CoordinateFilter(float minX, float maxX, float minY, float maxY) { if (maxX < minX) { float f = maxX; maxX = minX; minX = f; } this.minX = minX; this.maxX = maxX; if (maxY < minY) { float f = maxY; maxY = minY; minY = f; } this.minY = minY; this.maxY = maxY; } @Override protected String generateName() { return "X " + minX + "-" + maxX + ", Y " + minY + "-" + maxY; } @Override public void setup(MemoryPeakResults peakResults) { } @Override public boolean accept(PeakResult peak) { return peak.getXPosition() >= minX && peak.getXPosition() <= maxX && peak.getYPosition() >= minY && peak.getYPosition() <= maxY; } @Override public int validate(final PreprocessedPeakResult peak) { if (peak.getX() < minX || peak.getX() > maxX) return V_X; if (peak.getY() < minY || peak.getY() > maxY) return V_Y; return 0; } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#getDescription() */ @Override public String getDescription() { return "Filter results using a coordinate range."; } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#getNumberOfParameters() */ @Override public int getNumberOfParameters() { return 4; } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#getParameterValueInternal(int) */ @Override protected double getParameterValueInternal(int index) { switch (index) { case 0: return minX; case 1: return maxX; case 2: return minY; default: return maxY; } } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#getParameterIncrement(int) */ @Override public double getParameterIncrement(int index) { checkIndex(index); return DEFAULT_INCREMENT; } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#getDisabledParameterValue(int) */ @Override public double getDisabledParameterValue(int index) { checkIndex(index); switch (index) { case 0: return Double.NEGATIVE_INFINITY; case 1: return Double.POSITIVE_INFINITY; case 2: return Double.NEGATIVE_INFINITY; default: return Double.POSITIVE_INFINITY; } } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#getParameterType(int) */ @Override public ParameterType getParameterType(int index) { checkIndex(index); switch (index) { case 0: return ParameterType.MIN_X; case 1: return ParameterType.MAX_X; case 2: return ParameterType.MIN_Y; default: return ParameterType.MAX_Y; } } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#adjustParameter(int, double) */ @Override public Filter adjustParameter(int index, double delta) { checkIndex(index); switch (index) { case 0: return new CoordinateFilter(updateParameter(minX, delta, DEFAULT_RANGE), maxX, minY, maxY); case 1: return new CoordinateFilter(minX, updateParameter(maxX, delta, DEFAULT_RANGE), minY, maxY); case 2: return new CoordinateFilter(minX, maxX, updateParameter(minY, delta, DEFAULT_RANGE), maxY); default: return new CoordinateFilter(minX, maxX, minY, updateParameter(maxY, delta, DEFAULT_RANGE)); } } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#create(double[]) */ @Override public Filter create(double... parameters) { return new CoordinateFilter((float) parameters[0], (float) parameters[1], (float) parameters[2], (float) parameters[3]); } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#weakestParameters(double[]) */ @Override public void weakestParameters(double[] parameters) { setMin(parameters, 0, minX); setMax(parameters, 1, maxX); setMin(parameters, 2, minY); setMax(parameters, 3, maxY); } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.DirectFilter#lowerBoundOrientation(int) */ @Override public int lowerBoundOrientation(int index) { return (index == 1 || index == 3) ? 1 : -1; } /* * (non-Javadoc) * * @see gdsc.smlm.ga.Chromosome#length() */ public int length() { return 4; } /* * (non-Javadoc) * * @see gdsc.smlm.ga.Chromosome#sequence() */ public double[] sequence() { // Ignore the mode parameters return new double[] { minX, maxX, minY, maxY }; } /* * (non-Javadoc) * * @see gdsc.smlm.ga.Chromosome#mutationStepRange() */ public double[] mutationStepRange() { return new double[] { DEFAULT_RANGE, DEFAULT_RANGE, DEFAULT_RANGE, DEFAULT_RANGE }; } }