package org.knime.knip.tracking.nodes.trackmate; import org.knime.core.data.StringValue; import org.knime.core.node.defaultnodesettings.DefaultNodeSettingsPane; import org.knime.core.node.defaultnodesettings.DialogComponentBoolean; import org.knime.core.node.defaultnodesettings.DialogComponentColumnFilter2; import org.knime.core.node.defaultnodesettings.DialogComponentColumnNameSelection; import org.knime.core.node.defaultnodesettings.DialogComponentNumber; import org.knime.core.node.defaultnodesettings.DialogComponentString; import org.knime.core.node.defaultnodesettings.DialogComponentStringSelection; import org.knime.core.node.defaultnodesettings.SettingsModelBoolean; import org.knime.core.node.defaultnodesettings.SettingsModelColumnFilter2; import org.knime.core.node.defaultnodesettings.SettingsModelDouble; import org.knime.core.node.defaultnodesettings.SettingsModelIntegerBounded; import org.knime.core.node.defaultnodesettings.SettingsModelString; import org.knime.knip.base.KNIMEKNIPPlugin; import org.knime.knip.base.data.img.ImgPlusValue; import org.knime.knip.base.data.labeling.LabelingValue; /** * Node Dialog for the Trackmate Tracker Node. * * @author christian * @author gabriel * */ public class TrackmateTrackerNodeDialog extends DefaultNodeSettingsPane { private final SettingsModelBoolean m_allowGapClosingModel = TrackmateTrackerSettingsModels.createAllowGapClosingModel(); private final SettingsModelBoolean m_allowMergingModel = TrackmateTrackerSettingsModels.createAllowMergingModel(); private final SettingsModelBoolean m_allowSplittingModel = TrackmateTrackerSettingsModels.createAllowSplittingModel(); private final SettingsModelIntegerBounded m_gapClosingMaxFrameModel = TrackmateTrackerSettingsModels.createMaxFrameGapClosingModel(); private final SettingsModelDouble m_mergingMaxDistanceModel = TrackmateTrackerSettingsModels.createMergingMaxDistance(); private final SettingsModelDouble m_gapClosingMaxDistanceModel = TrackmateTrackerSettingsModels.createGapClosingMaxDistanceModel(); private final SettingsModelDouble m_splittingMaxDistance = TrackmateTrackerSettingsModels.createSplittingMaxDistance(); private final SettingsModelDouble m_alternativeLinkingCostFactor = TrackmateTrackerSettingsModels.createAlternativeLinkingCostFactor(); private final SettingsModelDouble m_cutoffPercentileModel = TrackmateTrackerSettingsModels.createCutoffPercentileModel(); private final SettingsModelDouble m_linkingMaxDistanceModel = TrackmateTrackerSettingsModels.createLinkingMaxDistanceModel(); // KNIME private final SettingsModelString m_sourceLabelingColumn = TrackmateTrackerSettingsModels.createSourceLabelingSettingsModel(); private final SettingsModelColumnFilter2 m_columnFilterModel = TrackmateTrackerSettingsModels.createColumnFilterModel(); private final SettingsModelString m_timeAxisModel = TrackmateTrackerSettingsModels.createTimeAxisModel(); private final SettingsModelString m_bitMaskColumnModel = TrackmateTrackerSettingsModels.createBitMaskModel(); private final SettingsModelString m_labelColumnModel = TrackmateTrackerSettingsModels.createLabelModel(); private final SettingsModelBoolean m_attachSourceLabelings = TrackmateTrackerSettingsModels.createAttachSourceLabelingsModel(); private final SettingsModelBoolean m_useCustomTrackPrefix = TrackmateTrackerSettingsModels.createUseCustomTrackPrefixModel(); private final SettingsModelString m_customTrackPrefix = TrackmateTrackerSettingsModels.createCustomTrackPrefixModel(); private final SettingsModelBoolean m_calculateTrackFeatures = TrackmateTrackerSettingsModels.createCalculateTrackFeaturesModel(); /** * Creates the Dialog for the Trackmate Tracker node. */ public TrackmateTrackerNodeDialog() { createNewGroup("Basic"); addBasicOptions(); closeCurrentGroup(); createNewGroup("Splitting"); addSplittingOptions(); closeCurrentGroup(); createNewGroup("Merging"); addMergingOptions(); closeCurrentGroup(); createNewGroup("Gap-Closing"); addGapClosingOptions(); closeCurrentGroup(); createNewTab("Advanced"); createNewGroup("Advanced Tracking Settings"); addAdvancedSettings(); closeCurrentGroup(); createNewGroup("Labeling Settings"); addLabelingSettings(); closeCurrentGroup(); createNewTab("Column Settings"); addKNIMEColumnSettings(); } @SuppressWarnings("unchecked") private void addKNIMEColumnSettings() { createNewGroup("Feature Column Selection"); addDialogComponent( new DialogComponentColumnFilter2(m_columnFilterModel, 0)); closeCurrentGroup(); createNewGroup("Other Column Selection"); addDialogComponent(new DialogComponentColumnNameSelection( m_bitMaskColumnModel, "Bitmask Column", 0, ImgPlusValue.class)); addDialogComponent(new DialogComponentColumnNameSelection( m_labelColumnModel, "Labels", 0, StringValue.class)); addDialogComponent( new DialogComponentColumnNameSelection(m_sourceLabelingColumn, "Source Labeling", 0, LabelingValue.class)); } private void addAdvancedSettings() { addDialogComponent( new DialogComponentNumber(m_alternativeLinkingCostFactor, "Alternative Linking Cost Factor", 0.05)); addDialogComponent(new DialogComponentNumber(m_cutoffPercentileModel, "Cutoff Percentile", 0.05)); addDialogComponent(new DialogComponentBoolean(m_calculateTrackFeatures, "Calculate Track Features")); } private void addBasicOptions() { addDialogComponent(new DialogComponentNumber(m_linkingMaxDistanceModel, "Maximum Object Distance", 2.5)); addDialogComponent(new DialogComponentStringSelection(m_timeAxisModel, "Tracking Dimension", KNIMEKNIPPlugin.parseDimensionLabels())); } private void addGapClosingOptions() { addDialogComponent(new DialogComponentBoolean(m_allowGapClosingModel, "Allow Gap Closing")); addDialogComponent(new DialogComponentNumber( m_gapClosingMaxDistanceModel, "Max Distance", 0.5)); addDialogComponent(new DialogComponentNumber(m_gapClosingMaxFrameModel, "Max GAP Size (Frames)", 1)); m_allowGapClosingModel.addChangeListener(e -> { m_gapClosingMaxDistanceModel .setEnabled(m_allowGapClosingModel.getBooleanValue()); m_gapClosingMaxFrameModel .setEnabled(m_allowGapClosingModel.getBooleanValue()); }); } private void addLabelingSettings() { addDialogComponent(new DialogComponentBoolean(m_attachSourceLabelings, "Attach Original Labelings")); setHorizontalPlacement(true); m_customTrackPrefix.setEnabled(false); m_useCustomTrackPrefix.addChangeListener(e -> m_customTrackPrefix .setEnabled(m_useCustomTrackPrefix.getBooleanValue())); addDialogComponent(new DialogComponentBoolean(m_useCustomTrackPrefix, "Use a Custom Track Prefix")); addDialogComponent(new DialogComponentString(m_customTrackPrefix, "Custom Track Prefix:")); setHorizontalPlacement(false); } private void addMergingOptions() { addDialogComponent(new DialogComponentBoolean(m_allowMergingModel, "Allow Merging")); addDialogComponent(new DialogComponentNumber(m_mergingMaxDistanceModel, "Max Distance", 0.5)); m_allowMergingModel.addChangeListener(e -> m_mergingMaxDistanceModel .setEnabled(m_allowMergingModel.getBooleanValue())); } private void addSplittingOptions() { addDialogComponent(new DialogComponentBoolean(m_allowSplittingModel, "Allow Splitting")); addDialogComponent(new DialogComponentNumber(m_splittingMaxDistance, "Max Distance", 0.5)); m_allowSplittingModel.addChangeListener(e -> m_splittingMaxDistance .setEnabled(m_allowSplittingModel.getBooleanValue())); } }