package gdsc.smlm.results.filter; import java.util.HashSet; import java.util.Set; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import com.thoughtworks.xstream.annotations.XStreamOmitField; /*----------------------------------------------------------------------------- * 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 gdsc.smlm.results.Trace; import gdsc.smlm.results.TraceManager; /** * Filter results that can be traced over time frames. */ public class TraceFilter extends Filter { private static final double DEFAULT_DISTANCE_INCREMENT = 0.05; private static final int DEFAULT_TIME_INCREMENT = 1; private static final double DEFAULT_DISTANCE_RANGE = 2; private static final int DEFAULT_TIME_RANGE = 10; @XStreamAsAttribute final double d; @XStreamAsAttribute final int t; @XStreamOmitField Set<PeakResult> ok; public TraceFilter(double d, int t) { this.d = Math.max(0, d); this.t = Math.max(0, t); } @Override protected String generateName() { return String.format("Trace d=%.2f, t=%d", d, t); } @Override public void setup(MemoryPeakResults peakResults) { ok = new HashSet<PeakResult>(); // Trace molecules. Anything that is part of a trace is OK TraceManager tm = new TraceManager(peakResults); tm.traceMolecules(d, t); Trace[] traces = tm.getTraces(); for (Trace trace : traces) { if (trace.size() > 1) { for (PeakResult result : trace.getPoints()) { ok.add(result); } } } } /** * @throws NullPointerException * if not first initialised with a call to {@link #setup(MemoryPeakResults)} * @see gdsc.smlm.results.filter.Filter#accept(gdsc.smlm.results.PeakResult) */ @Override public boolean accept(PeakResult peak) throws NullPointerException { return ok.contains(peak); } @Override public double getNumericalValue() { return t; } @Override public String getNumericalValueName() { return ParameterType.TIME_THRESHOLD.toString(); } @Override public String getDescription() { return "Filter results that can be traced over time frames."; } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#getNumberOfParameters() */ @Override public int getNumberOfParameters() { return 2; } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#getParameterValueInternal(int) */ @Override protected double getParameterValueInternal(int index) { switch (index) { case 0: return d; default: return t; } } /* (non-Javadoc) * @see gdsc.smlm.results.filter.Filter#getParameterIncrement(int) */ @Override public double getParameterIncrement(int index) { checkIndex(index); switch (index) { case 0: return DEFAULT_DISTANCE_INCREMENT; default: return DEFAULT_TIME_INCREMENT; } } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#getParameterType(int) */ @Override public ParameterType getParameterType(int index) { checkIndex(index); switch (index) { case 0: return ParameterType.DISTANCE_THRESHOLD; default: return ParameterType.TIME_THRESHOLD; } } /* * (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 TraceFilter(updateParameter(d, delta, DEFAULT_DISTANCE_RANGE), t); default: return new TraceFilter(d, updateParameter(t, delta, DEFAULT_TIME_RANGE)); } } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#create(double[]) */ @Override public Filter create(double... parameters) { return new TraceFilter(parameters[0], (int) parameters[1]); } /* * (non-Javadoc) * * @see gdsc.smlm.results.filter.Filter#weakestParameters(double[]) */ @Override public void weakestParameters(double[] parameters) { setMax(parameters, 0, d); setMax(parameters, 1, t); } /* * (non-Javadoc) * * @see gdsc.smlm.ga.Chromosome#mutationStepRange() */ public double[] mutationStepRange() { return new double[] { DEFAULT_DISTANCE_RANGE, DEFAULT_TIME_RANGE }; } }