diff --git a/src/main/java/org/mastodon/tracking/detection/DetectionUtil.java b/src/main/java/org/mastodon/tracking/detection/DetectionUtil.java
index 65ef266..9662d95 100644
--- a/src/main/java/org/mastodon/tracking/detection/DetectionUtil.java
+++ b/src/main/java/org/mastodon/tracking/detection/DetectionUtil.java
@@ -38,6 +38,7 @@
import static org.mastodon.tracking.detection.DetectorKeys.DEFAULT_THRESHOLD;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_ADD_BEHAVIOR;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_DETECTION_TYPE;
+import static org.mastodon.tracking.detection.DetectorKeys.KEY_DO_SUBPIXEL_LOCALIZATION;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_MAX_TIMEPOINT;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_MIN_TIMEPOINT;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_RADIUS;
@@ -502,6 +503,7 @@ public static final boolean checkSettingsValidity( final Map< String, Object > s
ok = ok & checkParameter( settings, KEY_MAX_TIMEPOINT, Integer.class, errorHolder );
ok = ok & checkParameter( settings, KEY_RADIUS, Double.class, errorHolder );
ok = ok & checkParameter( settings, KEY_THRESHOLD, Double.class, errorHolder );
+ ok = ok & checkParameter( settings, KEY_DO_SUBPIXEL_LOCALIZATION, Boolean.class, errorHolder );
// ok = ok & checkParameter( settings, KEY_ADD_BEHAVIOR, String.class, errorHolder );
// Check key presence.
@@ -511,6 +513,7 @@ public static final boolean checkSettingsValidity( final Map< String, Object > s
mandatoryKeys.add( KEY_MAX_TIMEPOINT );
mandatoryKeys.add( KEY_RADIUS );
mandatoryKeys.add( KEY_THRESHOLD );
+ mandatoryKeys.add( KEY_DO_SUBPIXEL_LOCALIZATION );
final List< String > optionalKeys = new ArrayList<>();
optionalKeys.add( KEY_ADD_BEHAVIOR );
optionalKeys.add( KEY_ROI );
diff --git a/src/main/java/org/mastodon/tracking/detection/DetectorKeys.java b/src/main/java/org/mastodon/tracking/detection/DetectorKeys.java
index efa494a..4b2bcb2 100644
--- a/src/main/java/org/mastodon/tracking/detection/DetectorKeys.java
+++ b/src/main/java/org/mastodon/tracking/detection/DetectorKeys.java
@@ -131,6 +131,23 @@ public class DetectorKeys
*/
public static final String DEFAULT_ADD_BEHAVIOR = null;
+ /**
+ * The key identifying the parameter setting whether we use sub-pixel
+ * localization for spot position. Accepted values are {@link Boolean}s.
+ *
+ * Currently used by:
+ *
+ * - {@link LogDetectorOp}
+ *
- {@link DogDetectorOp}
+ *
+ */
+ public static final String KEY_DO_SUBPIXEL_LOCALIZATION = "DO_SUBPIXEL_LOCALIZATION";
+
+ /**
+ * Default value for the {@link #KEY_DO_SUBPIXEL_LOCALIZATION} parameter.
+ */
+ public static final Boolean DEFAULT_DO_SUBPIXEL_LOCALIZATION = true;
+
private DetectorKeys()
{}
}
diff --git a/src/main/java/org/mastodon/tracking/detection/DoGDetectorOp.java b/src/main/java/org/mastodon/tracking/detection/DoGDetectorOp.java
index 79ce082..a5ae22c 100644
--- a/src/main/java/org/mastodon/tracking/detection/DoGDetectorOp.java
+++ b/src/main/java/org/mastodon/tracking/detection/DoGDetectorOp.java
@@ -29,6 +29,7 @@
package org.mastodon.tracking.detection;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_DETECTION_TYPE;
+import static org.mastodon.tracking.detection.DetectorKeys.KEY_DO_SUBPIXEL_LOCALIZATION;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_MAX_TIMEPOINT;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_MIN_TIMEPOINT;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_RADIUS;
@@ -104,6 +105,7 @@ public void mutate1( final DetectionCreatorFactory detectionCreatorFactory, fina
final double threshold = ( double ) settings.get( KEY_THRESHOLD );
final Interval roi = ( Interval ) settings.get( KEY_ROI );
final DetectionType detectionType = DetectionType.getOrDefault( ( String ) settings.get( KEY_DETECTION_TYPE ), DetectionType.MINIMA );
+ final boolean doSubpixelLocalization = ( boolean ) settings.get( KEY_DO_SUBPIXEL_LOCALIZATION );
statusService.showStatus( "DoG detection." );
for ( int tp = minTimepoint; tp <= maxTimepoint; tp++ )
@@ -209,7 +211,9 @@ public void mutate1( final DetectionCreatorFactory detectionCreatorFactory, fina
threshold,
true );
dog.setExecutorService( threadService.getExecutorService() );
- final ArrayList< RefinedPeak< Point > > refinedPeaks = dog.getSubpixelPeaks();
+ final ArrayList< RefinedPeak< Point > > refinedPeaks = doSubpixelLocalization ?
+ dog.getSubpixelPeaks() :
+ dog.getPeaks().stream().map( p -> new RefinedPeak< Point >( p, p, 0, false ) ).collect( ArrayList::new, ArrayList::add, ArrayList::addAll );
final double[] pos = new double[ 3 ];
final RealPoint sp = RealPoint.wrap( pos );
diff --git a/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/SemiAutomaticTracker.java b/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/SemiAutomaticTracker.java
index aed2de1..185f9bd 100644
--- a/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/SemiAutomaticTracker.java
+++ b/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/SemiAutomaticTracker.java
@@ -34,6 +34,7 @@
import static org.mastodon.tracking.detection.DetectorKeys.KEY_ROI;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_SETUP_ID;
import static org.mastodon.tracking.detection.DetectorKeys.KEY_THRESHOLD;
+import static org.mastodon.tracking.detection.DetectorKeys.KEY_DO_SUBPIXEL_LOCALIZATION;
import static org.mastodon.tracking.mamut.trackmate.semiauto.SemiAutomaticTrackerKeys.KEY_ALLOW_LINKING_IF_HAS_INCOMING;
import static org.mastodon.tracking.mamut.trackmate.semiauto.SemiAutomaticTrackerKeys.KEY_ALLOW_LINKING_IF_HAS_OUTGOING;
import static org.mastodon.tracking.mamut.trackmate.semiauto.SemiAutomaticTrackerKeys.KEY_ALLOW_LINKING_TO_EXISTING;
@@ -190,6 +191,7 @@ public void compute( final Collection< Spot > input, final Map< String, Object >
final boolean continueIfLinkExists = ( boolean ) settings.get( KEY_CONTINUE_IF_LINK_EXISTS );
final double neighborhoodFactor = Math.max( NEIGHBORHOOD_FACTOR, distanceFactor + 1. );
final boolean detectSpots = ( boolean ) settings.get( KEY_DETECT_SPOT );
+ final boolean doSubpixelLocalization = ( boolean ) settings.get( KEY_DO_SUBPIXEL_LOCALIZATION );
/*
* Units.
@@ -441,6 +443,7 @@ else if ( detectSpots )
detectorSettings.put( KEY_MIN_TIMEPOINT, Integer.valueOf( tp ) );
detectorSettings.put( KEY_MAX_TIMEPOINT, Integer.valueOf( tp ) );
detectorSettings.put( KEY_ROI, roi );
+ detectorSettings.put( KEY_DO_SUBPIXEL_LOCALIZATION, Boolean.valueOf( doSubpixelLocalization ) );
final DetectorOp detector = ( DetectorOp ) Inplaces.binary1( ops(), DoGDetectorOp.class,
detectionCreator, sources, detectorSettings );
diff --git a/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/SemiAutomaticTrackerKeys.java b/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/SemiAutomaticTrackerKeys.java
index 847dc00..e8a4fc3 100644
--- a/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/SemiAutomaticTrackerKeys.java
+++ b/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/SemiAutomaticTrackerKeys.java
@@ -60,6 +60,7 @@ public static final Map< String, Object > getDefaultDetectorSettingsMap()
settings.put( KEY_ALLOW_LINKING_IF_HAS_OUTGOING, DEFAULT_ALLOW_LINKING_IF_HAS_OUTGOING );
settings.put( KEY_CONTINUE_IF_LINK_EXISTS, DEFAULT_CONTINUE_IF_LINK_EXISTS );
settings.put( KEY_DETECT_SPOT, DEFAULT_DETECT_SPOT );
+ settings.put( KEY_DO_SUBPIXEL_LOCALIZATION, DEFAULT_DO_SUBPIXEL_LOCALIZATION );
return settings;
}
@@ -95,6 +96,7 @@ public static final boolean checkSettingsValidity( final Map< String, Object > s
ok = ok & checkParameter( settings, KEY_ALLOW_LINKING_IF_HAS_OUTGOING, Boolean.class, errorHolder );
ok = ok & checkParameter( settings, KEY_CONTINUE_IF_LINK_EXISTS, Boolean.class, errorHolder );
ok = ok & checkParameter( settings, KEY_DETECT_SPOT, Boolean.class, errorHolder );
+ ok = ok & checkParameter( settings, KEY_DO_SUBPIXEL_LOCALIZATION, Boolean.class, errorHolder );
// Check key presence.
final List< String > mandatoryKeys = new ArrayList< String >();
@@ -108,6 +110,7 @@ public static final boolean checkSettingsValidity( final Map< String, Object > s
mandatoryKeys.add( KEY_ALLOW_LINKING_IF_HAS_OUTGOING );
mandatoryKeys.add( KEY_CONTINUE_IF_LINK_EXISTS );
mandatoryKeys.add( KEY_DETECT_SPOT );
+ mandatoryKeys.add( KEY_DO_SUBPIXEL_LOCALIZATION );
final List< String > optionalKeys = new ArrayList< String >();
optionalKeys.add( KEY_RESOLUTION_LEVEL );
ok = ok & checkMapKeys( settings, mandatoryKeys, optionalKeys, errorHolder );
@@ -299,6 +302,23 @@ public static final boolean checkSettingsValidity( final Map< String, Object > s
*/
public static final boolean DEFAULT_DETECT_SPOT = true;
+ /**
+ * The key identifying the parameter setting whether we use sub-pixel
+ * localization for spot position. Accepted values are {@link Boolean}s.
+ *
+ * Currently used by:
+ *
+ * - {@link LogDetectorOp}
+ *
- {@link DogDetectorOp}
+ *
+ */
+ public static final String KEY_DO_SUBPIXEL_LOCALIZATION = "DO_SUBPIXEL_LOCALIZATION";
+
+ /**
+ * Default value for the {@link #KEY_DO_SUBPIXEL_LOCALIZATION} parameter.
+ */
+ public static final Boolean DEFAULT_DO_SUBPIXEL_LOCALIZATION = true;
+
/** Minimal size of neighborhoods, in spot diameter units. */
public static final double NEIGHBORHOOD_FACTOR = 2.;
diff --git a/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/ui/SemiAutomaticTrackerConfigPanel.java b/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/ui/SemiAutomaticTrackerConfigPanel.java
index 82a41f4..f078009 100644
--- a/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/ui/SemiAutomaticTrackerConfigPanel.java
+++ b/src/main/java/org/mastodon/tracking/mamut/trackmate/semiauto/ui/SemiAutomaticTrackerConfigPanel.java
@@ -119,6 +119,11 @@ public class SemiAutomaticTrackerConfigPanel extends JPanel
+ "to create spots to link to from the image data. "
+ "