package gdsc.smlm.ij.settings;
import gdsc.core.clustering.ClusteringAlgorithm;
import gdsc.smlm.results.TraceManager;
import gdsc.smlm.results.TraceManager.TraceMode;
/*-----------------------------------------------------------------------------
* 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.
*---------------------------------------------------------------------------*/
/**
* Contain the settings for the clustering algorithm
*/
public class ClusteringSettings
{
public enum OptimiserPlot
{
//@formatter:off
NONE{ public String getName() { return "None"; }},
NEAREST_NEIGHBOUR{ public String getName() { return "Nearest neighbour"; }},
BILINEAR{ public String getName() { return "Bi-linear"; }};
//@formatter:on
@Override
public String toString()
{
return getName();
}
/**
* Gets the name.
*
* @return the name
*/
abstract public String getName();
}
public enum TimeUnit
{
//@formatter:off
SECOND{ public String getName() { return "Second"; }},
FRAME{ public String getName() { return "Frame"; }};
//@formatter:on
@Override
public String toString()
{
return getName();
}
/**
* Gets the name.
*
* @return the name
*/
abstract public String getName();
}
public double distanceThreshold = 50;
public double distanceExclusion = 0;
private double timeThreshold = 1;
private TimeUnit timeUnit = TimeUnit.SECOND;
private TraceManager.TraceMode traceMode = TraceMode.LATEST_FORERUNNER;
private ClusteringAlgorithm clusteringAlgorithm = ClusteringAlgorithm.PAIRWISE;
public int pulseInterval = 0;
public int pulseWindow = 0;
public boolean splitPulses = false;
public double blinkingRate = 1;
public boolean optimise = false;
public double minDistanceThreshold = 0;
public double maxDistanceThreshold = 500;
/** The min time threshold for optimisation (time is in frames). */
public int minTimeThreshold = 0;
/** The max time threshold for optimisation (time is in frames). */
public int maxTimeThreshold = 20;
public int optimiserSteps = 10;
private OptimiserPlot optimiserPlot = OptimiserPlot.BILINEAR;
public boolean saveTraces = false;
public boolean showHistograms = false;
public boolean saveTraceData = false;
public String traceDataDirectory = "";
public int histogramBins = 100;
public boolean removeOutliers = false;
public boolean refitOption = false;
// Options for tracing diffusion
public int minimumTraceLength = 6;
public boolean truncate = false;
public boolean internalDistances = true;
public boolean subSampledDistances = false;
public boolean ignoreEnds = true;
public boolean precisionCorrection = true;
public boolean msdCorrection = true;
public boolean mle = true;
public int fitLength = 6;
public int fitRestarts = 3;
public int jumpDistance = 1;
public OptimiserPlot getOptimiserPlot()
{
if (optimiserPlot == null)
optimiserPlot = OptimiserPlot.NONE;
return optimiserPlot;
}
public void setOptimiserPlot(OptimiserPlot optimiserPlot)
{
this.optimiserPlot = optimiserPlot;
}
public void setOptimiserPlot(int optimiserPlot)
{
if (optimiserPlot < 0 || optimiserPlot >= OptimiserPlot.values().length)
this.optimiserPlot = OptimiserPlot.NONE;
else
this.optimiserPlot = OptimiserPlot.values()[optimiserPlot];
}
public TraceMode getTraceMode()
{
if (traceMode == null)
traceMode = TraceMode.LATEST_FORERUNNER;
return traceMode;
}
public void setTraceMode(TraceMode traceMode)
{
this.traceMode = traceMode;
}
public void setTraceMode(int traceMode)
{
if (traceMode < 0 || traceMode >= TraceMode.values().length)
this.traceMode = TraceMode.LATEST_FORERUNNER;
else
this.traceMode = TraceMode.values()[traceMode];
}
public TimeUnit getTimeUnit()
{
if (timeUnit == null)
timeUnit = TimeUnit.SECOND;
return timeUnit;
}
public void setTimeUnit(TimeUnit timeUnit)
{
this.timeUnit = timeUnit;
}
public void setTimeUnit(int timeUnit)
{
if (timeUnit < 0 || timeUnit >= TimeUnit.values().length)
this.timeUnit = TimeUnit.SECOND;
else
this.timeUnit = TimeUnit.values()[timeUnit];
}
public ClusteringAlgorithm getClusteringAlgorithm()
{
if (clusteringAlgorithm == null)
clusteringAlgorithm = ClusteringAlgorithm.PAIRWISE;
return clusteringAlgorithm;
}
public void setClusteringAlgorithm(ClusteringAlgorithm clusteringAlgorithm)
{
this.clusteringAlgorithm = clusteringAlgorithm;
}
public void setClusteringAlgorithm(int clusteringAlgorithm)
{
if (clusteringAlgorithm < 0 || clusteringAlgorithm >= ClusteringAlgorithm.values().length)
this.clusteringAlgorithm = ClusteringAlgorithm.PAIRWISE;
else
this.clusteringAlgorithm = ClusteringAlgorithm.values()[clusteringAlgorithm];
}
/**
* Gets the time threshold.
* <p>
* The units are specified in {@link #getTimeUnit()}
*
* @return the time threshold
*/
public double getTimeThreshold()
{
return timeThreshold;
}
/**
* Sets the time threshold.
* <p>
* The units are specified in {@link #getTimeUnit()}
*
* @param timeThreshold
* the new time threshold
*/
public void setTimeThreshold(double timeThreshold)
{
this.timeThreshold = timeThreshold;
}
}