From b05cd177a233f2044300aa18ec5ad7b59f17a7c5 Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 12:08:56 -0700 Subject: [PATCH 01/11] cleanup settings objects, use interface docstrings and move builders to bottom --- .../api/AcquisitionSettingsScape.java | 11 +- .../internal/DispimAcquisitionSettings.java | 472 ++++++------------ .../internal/ScapeAcquisitionSettings.java | 446 ++++++----------- 3 files changed, 319 insertions(+), 610 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java index aac2450..a9439ff 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java @@ -22,9 +22,9 @@ public interface AcquisitionSettingsScape extends AcquisitionSettings { //Builder copyBuilder(); /** - * Returns the immutable DefaultChannelSettings instance. + * Returns the immutable ChannelSettings instance. * - * @return immutable DefaultChannelSettings instance. + * @return immutable ChannelSettings instance. */ ChannelSettings channels(); @@ -43,9 +43,9 @@ public interface AcquisitionSettingsScape extends AcquisitionSettings { DefaultVolumeSettings volume(); /** - * Returns the immutable DefaultSliceSettings instance. + * Returns the immutable SliceSettings instance. * - * @return immutable DefaultSliceSettings instance. + * @return immutable SliceSettings instance. */ SliceSettings slice(); @@ -144,6 +144,9 @@ interface Builder> extends AcquisitionS /** * Sets the acquisition mode. + *

+ * If the mode is a stage scanning mode, + * set the stage scanning flag to true. * * @param mode the acquisition mode * @return {@code this} builder diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java index 97e94f1..2381516 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -6,12 +6,170 @@ import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; +import java.util.Objects; + public class DispimAcquisitionSettings extends BaseAcquisitionSettings implements AcquisitionSettingsDispim { + private final ChannelSettings channels_; + private final DefaultTimingSettings timing_; + private final DefaultVolumeSettings volume_; + private final DefaultSliceSettingsLS sliceLS_; + private final DefaultSliceSettings slice_; + private final StageScanSettings stageScan_; + private final DefaultSheetCalibration[] sheetCalibrations_; + private final DefaultSliceCalibration[] sliceCalibrations_; + + private final AcquisitionMode acquisitionMode_; + private final CameraMode cameraMode_; + + private final boolean useTimePoints_; + private final boolean useMultiplePositions_; + private final boolean useHardwareTimePoints_; + private final boolean useAdvancedTiming_; + + private final int numTimePoints_; + private final int timePointInterval_; + private final int postMoveDelay_; + + private final double liveScanPeriod_; + + private DispimAcquisitionSettings(Builder builder) { + super(builder); + channels_ = builder.channelBuilder_.build(); + timing_ = builder.timingBuilder_.build(); + volume_ = builder.volumeBuilder_.build(); + slice_ = builder.sliceBuilder_.build(); + sliceLS_ = builder.ssbLS_.build(); + stageScan_ = builder.stageScanBuilder_.build(); + sheetCalibrations_ = new DefaultSheetCalibration[2]; + sliceCalibrations_ = new DefaultSliceCalibration[2]; // TODO: populate with numViews instead of magic number + for (int i = 0; i < 2; i++) { + sheetCalibrations_[i] = builder.shcb_[i].build(); + sliceCalibrations_[i] = builder.slcb_[i].build(); + } + acquisitionMode_ = builder.acquisitionMode_; + cameraMode_ = builder.cameraMode_; + useTimePoints_ = builder.useTimePoints_; + useMultiplePositions_ = builder.useMultiplePositions_; + useHardwareTimePoints_ = builder.useHardwareTimePoints_; + useAdvancedTiming_ = builder.useAdvancedTiming_; + numTimePoints_ = builder.numTimePoints_; + timePointInterval_ = builder.timePointInterval_; + postMoveDelay_ = builder.postMoveDelay_; + liveScanPeriod_= builder.liveScanPeriod_; + } + public static Builder builder() { return new Builder(); } + public static Builder builder(DispimAcquisitionSettings settings) { + Objects.requireNonNull(settings, "Cannot copy from null settings"); + return new Builder(settings); + } + +// @Override +// public DefaultAcquisitionSettingsDISPIM.Builder copyBuilder() { +// return new Builder(this); +// ); +// } + + @Override + public ChannelSettings channels() { + return channels_; + } + + @Override + public DefaultTimingSettings timing() { + return timing_; + } + + @Override + public DefaultVolumeSettings volume() { + return volume_; + } + + @Override + public DefaultSliceSettings slice() { + return slice_; + } + + @Override + public DefaultSliceSettingsLS sliceLS() { + return sliceLS_; + } + + @Override + public StageScanSettings stageScan() { + return stageScan_; + } + + @Override + public DefaultSheetCalibration sheetCalibration(final int view) { + return sheetCalibrations_[view-1]; + } + + @Override + public DefaultSliceCalibration sliceCalibration(final int view) { + return sliceCalibrations_[view-1]; + } + + @Override + public AcquisitionMode acquisitionMode() { + return acquisitionMode_; + } + + @Override + public CameraMode cameraMode() { + return cameraMode_; + } + + @Override + public boolean isUsingTimePoints() { + return useTimePoints_; + } + + @Override + public boolean isUsingMultiplePositions() { + return useMultiplePositions_; + } + + @Override + public boolean isUsingHardwareTimePoints() { + return useHardwareTimePoints_; + } + + @Override + public boolean isUsingAdvancedTiming() { + return useAdvancedTiming_; + } + + @Override + public int numTimePoints() { + return numTimePoints_; + } + + @Override + public int timePointInterval() { + return timePointInterval_; + } + + @Override + public int postMoveDelay() { + return postMoveDelay_; + } + + @Override + public double liveScanPeriod() { + return liveScanPeriod_; + } + + // TODO: finish this, and maybe use pretty printing? or just rely on JSON conversion? + @Override + public String toString() { + return String.format("[timing=%s]", timing_); + } + public static class Builder extends BaseAcquisitionSettings.Builder implements AcquisitionSettingsDispim.Builder { private ChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); @@ -68,99 +226,54 @@ public Builder(final DispimAcquisitionSettings settings) { liveScanPeriod_ = settings.liveScanPeriod_; } - /** - * Sets the acquisition mode. - * - * @param acqMode the acquisition mode - */ @Override - public Builder acquisitionMode(final AcquisitionMode acqMode) { - acquisitionMode_ = acqMode; + public Builder acquisitionMode(final AcquisitionMode mode) { + acquisitionMode_ = mode; return this; } - /** - * Sets the camera mode. - * - * @param cameraMode the camera mode. - */ @Override - public Builder cameraMode(final CameraMode cameraMode) { - cameraMode_ = cameraMode; + public Builder cameraMode(final CameraMode mode) { + cameraMode_ = mode; return this; } - /** - * Sets the acquisition to use time points. - * - * @param state true to use time points. - */ @Override public Builder useTimePoints(final boolean state) { useTimePoints_ = state; return this; } - /** - * Sets the acquisition to use multiple positions. - * - * @param state true to use multiple positions. - */ @Override public Builder useMultiplePositions(final boolean state) { useMultiplePositions_ = state; return this; } - /** - * Sets the acquisition to use hardware time points. - * - * @param state true to use time points. - */ @Override public Builder useHardwareTimePoints(final boolean state) { useHardwareTimePoints_ = state; return this; } - /** - * Sets the acquisition to use advanced timing settings. - * - * @param state true to use advanced timing settings - */ @Override public Builder useAdvancedTiming(final boolean state) { useAdvancedTiming_ = state; return this; } - /** - * Sets the number of time points. - * - * @param numTimePoints the number of time points - */ @Override public Builder numTimePoints(final int numTimePoints) { numTimePoints_ = numTimePoints; return this; } - /** - * Sets the time point interval between time points in seconds. - * - * @param timePointInterval the time point interval in seconds. - */ @Override public Builder timePointInterval(final int timePointInterval) { timePointInterval_ = timePointInterval; return this; } - /** - * Sets the delay after a move when using multiple positions. - * - * @param postMoveDelay the delay in milliseconds. - */ @Override public Builder postMoveDelay(final int postMoveDelay) { postMoveDelay_ = postMoveDelay; @@ -214,11 +327,6 @@ public void volumeSettingsBuilder(DefaultVolumeSettings.Builder builder) { volumeBuilder_ = builder; } - /** - * Creates an immutable instance of DispimAcquisitionSettings - * - * @return Immutable version of DispimAcquisitionSettings - */ @Override public DispimAcquisitionSettings build() { return new DispimAcquisitionSettings(this); @@ -232,263 +340,9 @@ public Builder self() { // TODO: finish toString with rest of properties @Override public String toString() { - return String.format("[tsb_=%s]", timingBuilder_); + return String.format("[timingBuilder_=%s]", timingBuilder_); } } - private final ChannelSettings channels_; - private final DefaultTimingSettings timing_; - private final DefaultVolumeSettings volume_; - private final DefaultSliceSettingsLS sliceLS_; - private final DefaultSliceSettings slice_; - private final StageScanSettings stageScan_; - private final DefaultSheetCalibration[] sheetCalibrations_; - private final DefaultSliceCalibration[] sliceCalibrations_; - - private final AcquisitionMode acquisitionMode_; - private final CameraMode cameraMode_; - - private final boolean useTimePoints_; - private final boolean useMultiplePositions_; - private final boolean useHardwareTimePoints_; - private final boolean useAdvancedTiming_; - - private final int numTimePoints_; - private final int timePointInterval_; - private final int postMoveDelay_; - - private final double liveScanPeriod_; - - private DispimAcquisitionSettings(Builder builder) { - super(builder); - channels_ = builder.channelBuilder_.build(); - timing_ = builder.timingBuilder_.build(); - volume_ = builder.volumeBuilder_.build(); - slice_ = builder.sliceBuilder_.build(); - sliceLS_ = builder.ssbLS_.build(); - stageScan_ = builder.stageScanBuilder_.build(); - sheetCalibrations_ = new DefaultSheetCalibration[2]; - sliceCalibrations_ = new DefaultSliceCalibration[2]; // TODO: populate with numViews instead of magic number - for (int i = 0; i < 2; i++) { - sheetCalibrations_[i] = builder.shcb_[i].build(); - sliceCalibrations_[i] = builder.slcb_[i].build(); - } - acquisitionMode_ = builder.acquisitionMode_; - cameraMode_ = builder.cameraMode_; - useTimePoints_ = builder.useTimePoints_; - useMultiplePositions_ = builder.useMultiplePositions_; - useHardwareTimePoints_ = builder.useHardwareTimePoints_; - useAdvancedTiming_ = builder.useAdvancedTiming_; - numTimePoints_ = builder.numTimePoints_; - timePointInterval_ = builder.timePointInterval_; - postMoveDelay_ = builder.postMoveDelay_; - liveScanPeriod_= builder.liveScanPeriod_; - } - -// /** -// * Creates a Builder populated with settings of this DefaultAcquisitionSettingsDISPIM instance. -// * -// * @return DefaultAcquisitionSettingsDISPIM.Builder pre-populated with settings of this instance. -// */ -// @Override -// public DefaultAcquisitionSettingsDISPIM.Builder copyBuilder() { -// return new Builder(this); -// ); -// } - - /** - * Returns the immutable DefaultChannelSettings instance. - * - * @return immutable DefaultChannelSettings instance. - */ - @Override - public ChannelSettings channels() { - return channels_; - } - - /** - * Returns the immutable DefaultTimingSettings instance. - * - * @return immutable DefaultTimingSettings instance. - */ - @Override - public DefaultTimingSettings timing() { - return timing_; - } - - /** - * Returns the immutable DefaultVolumeSettings instance. - * - * @return immutable DefaultVolumeSettings instance. - */ - @Override - public DefaultVolumeSettings volume() { - return volume_; - } - - /** - * Returns the immutable DefaultSliceSettings instance. - * - * @return immutable DefaultSliceSettings instance. - */ - @Override - public DefaultSliceSettings slice() { - return slice_; - } - - /** - * Returns the immutable DefaultSliceSettingsLS instance. - * - * @return immutable DefaultSliceSettingsLS instance. - */ - @Override - public DefaultSliceSettingsLS sliceLS() { - return sliceLS_; - } - - /** - * Returns the immutable DefaultScanSettings instance. - * - * @return immutable DefaultScanSettings instance. - */ - @Override - public StageScanSettings stageScan() { - return stageScan_; - } - - /** - * Returns the immutable DefaultSheetCalibration instance. - * - * @return immutable DefaultSheetCalibration instance. - */ - @Override - public DefaultSheetCalibration sheetCalibration(final int view) { - return sheetCalibrations_[view-1]; - } - - /** - * Returns an immutable DefaultSliceCalibration instance. - *

- * Views start at index 1. - * - * @return immutable DefaultSliceCalibration instance. - */ - @Override - public DefaultSliceCalibration sliceCalibration(final int view) { - return sliceCalibrations_[view-1]; - } - - /** - * Returns the acquisition mode. - * - * @return the acquisition mode. - */ - @Override - public AcquisitionMode acquisitionMode() { - return acquisitionMode_; - } - - /** - * Returns the camera mode. - * - * @return the camera mode. - */ - @Override - public CameraMode cameraMode() { - return cameraMode_; - } - - /** - * Returns true if using time points. - * - * @return true if using time points. - */ - @Override - public boolean isUsingTimePoints() { - return useTimePoints_; - } - - /** - * Returns true if using multiple positions. - * - * @return true if using multiple positions. - */ - @Override - public boolean isUsingMultiplePositions() { - return useMultiplePositions_; - } - - /** - * Returns true if using hardware time points. - * - * @return true if using hardware time points. - */ - @Override - public boolean isUsingHardwareTimePoints() { - return useHardwareTimePoints_; - } - - /** - * Returns true if using advanced timing settings. - * - * @return true if using advanced timing settings. - */ - @Override - public boolean isUsingAdvancedTiming() { - return useAdvancedTiming_; - } - - /** - * Returns the number of time points. - * - * @return the number of time points. - */ - @Override - public int numTimePoints() { - return numTimePoints_; - } - - /** - * Returns the time point interval in seconds. - * - * @return the time point interval in seconds. - */ - @Override - public int timePointInterval() { - return timePointInterval_; - } - - /** - * Returns the post move delay in milliseconds. - * - * @return the post move delay in milliseconds. - */ - @Override - public int postMoveDelay() { - return postMoveDelay_; - } - - @Override - public double liveScanPeriod() { - return liveScanPeriod_; - } - - // TODO: finish this, and maybe use pretty printing? or just rely on JSON conversion? - @Override - public String toString() { - return String.format("[timing=%s]", timing_); - } -// public String toJson() { -// return new Gson().toJson(this); -// } - -// public String toPrettyJson() { -// final Gson gson = new GsonBuilder().setPrettyPrinting().create(); -// return gson.toJson(this); -// } - -// public static DefaultAcquisitionSettingsDISPIM fromJson(final String json) { -// return new Gson().fromJson(json, DefaultAcquisitionSettingsDISPIM.class); -// } } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java index 2353ba7..eb2ddc9 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java @@ -8,13 +8,161 @@ import org.micromanager.lightsheetmanager.api.data.CameraData; import org.micromanager.lightsheetmanager.api.data.CameraMode; +import java.util.Objects; + public class ScapeAcquisitionSettings extends BaseAcquisitionSettings implements AcquisitionSettingsScape { + private final ChannelSettings channels_; + private final DefaultTimingSettings timing_; + private final DefaultVolumeSettings volume_; + private final SliceSettings slice_; + private final StageScanSettings stageScan_; + private final DefaultSheetCalibration sheetCalibration_; + private final DefaultSliceCalibration sliceCalibration_; + + private final AcquisitionMode acquisitionMode_; + + private final CameraMode cameraMode_; + private final CameraData[] imagingCameraOrder_; + + private final boolean useTimePoints_; + private final boolean useMultiplePositions_; + private final boolean useHardwareTimePoints_; + private final boolean useAdvancedTiming_; + + private final int numTimePoints_; + private final double timePointInterval_; + private final int postMoveDelay_; + + private ScapeAcquisitionSettings(Builder builder) { + super(builder); + channels_ = builder.channelBuilder().build(); + timing_ = builder.timingBuilder_.build(); + volume_ = builder.volumeBuilder_.build(); + slice_ = builder.sliceBuilder().build(); + stageScan_ = builder.stageScanBuilder().build(); + sheetCalibration_ = builder.sheetCalibBuilder_.build(); + sliceCalibration_ = builder.sliceCalibBuilder_.build(); + acquisitionMode_ = builder.acquisitionMode_; + cameraMode_ = builder.cameraMode_; + imagingCameraOrder_ = builder.imagingCameraOrder_; + useTimePoints_ = builder.useTimePoints_; + useMultiplePositions_ = builder.useMultiplePositions_; + useHardwareTimePoints_ = builder.useHardwareTimePoints_; + useAdvancedTiming_ = builder.useAdvancedTiming_; + numTimePoints_ = builder.numTimePoints_; + timePointInterval_ = builder.timePointInterval_; + postMoveDelay_ = builder.postMoveDelay_; + } + public static Builder builder() { return new Builder(); } - public static class Builder extends BaseAcquisitionSettings.Builder implements AcquisitionSettingsScape.Builder { + public static Builder builder(ScapeAcquisitionSettings settings) { + Objects.requireNonNull(settings, "Cannot copy from null settings"); + return new Builder(settings); + } + +// @Override +// public DefaultAcquisitionSettingsSCAPE.Builder copyBuilder() { +// return new Builder(this); +// } + + @Override + public ChannelSettings channels() { + return channels_; + } + + @Override + public DefaultTimingSettings timing() { + return timing_; + } + + @Override + public DefaultVolumeSettings volume() { + return volume_; + } + + @Override + public SliceSettings slice() { + return slice_; + } + + @Override + public StageScanSettings stageScan() { + return stageScan_; + } + + @Override + public DefaultSheetCalibration sheetCalibration() { + return sheetCalibration_; + } + + @Override + public DefaultSliceCalibration sliceCalibration() { + return sliceCalibration_; + } + + @Override + public AcquisitionMode acquisitionMode() { + return acquisitionMode_; + } + + @Override + public CameraMode cameraMode() { + return cameraMode_; + } + + @Override + public CameraData[] imagingCameraOrder() { + return imagingCameraOrder_; + } + + @Override + public boolean isUsingTimePoints() { + return useTimePoints_; + } + + @Override + public boolean isUsingMultiplePositions() { + return useMultiplePositions_; + } + + @Override + public boolean isUsingHardwareTimePoints() { + return useHardwareTimePoints_; + } + + @Override + public boolean isUsingAdvancedTiming() { + return useAdvancedTiming_; + } + + @Override + public int numTimePoints() { + return numTimePoints_; + } + + @Override + public double timePointInterval() { + return timePointInterval_; + } + + @Override + public int postMoveDelay() { + return postMoveDelay_; + } + + // TODO: finish this, and maybe use pretty printing? or just rely on JSON conversion? + @Override + public String toString() { + return String.format("[timing=%s]", timing_); + } + + public static class Builder + extends BaseAcquisitionSettings.Builder + implements AcquisitionSettingsScape.Builder { private ChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); private DefaultTimingSettings.Builder timingBuilder_ = DefaultTimingSettings.builder(); @@ -62,14 +210,6 @@ public Builder(final ScapeAcquisitionSettings settings) { postMoveDelay_ = settings.postMoveDelay(); } - /** - * Set the mode for the acquisition. - *

- * If the mode is a stage scanning mode, - * set internal stage scanning flag. - * - * @param mode the acquisition mode - */ @Override public Builder acquisitionMode(final AcquisitionMode mode) { acquisitionMode_ = mode; @@ -80,99 +220,54 @@ public Builder acquisitionMode(final AcquisitionMode mode) { return this; } - /** - * Sets the camera mode. - * - * @param mode the camera mode. - */ @Override public Builder cameraMode(final CameraMode mode) { cameraMode_ = mode; return this; } - /** - * Sets the imaging camera order. - * - * @param order the imaging camera order - */ @Override public Builder imagingCameraOrder(final CameraData[] order) { imagingCameraOrder_ = order; return this; } - /** - * Sets the acquisition to use time points. - * - * @param state true to use time points. - */ @Override public Builder useTimePoints(final boolean state) { useTimePoints_ = state; return this; } - /** - * Sets the acquisition to use multiple positions. - * - * @param state true to use multiple positions. - */ @Override public Builder useMultiplePositions(final boolean state) { useMultiplePositions_ = state; return this; } - /** - * Sets the acquisition to use hardware time points. - * - * @param state true to use time points. - */ @Override public Builder useHardwareTimePoints(final boolean state) { useHardwareTimePoints_ = state; return this; } - /** - * Sets the acquisition to use advanced timing settings. - * - * @param state true to use advanced timing settings - */ @Override public Builder useAdvancedTiming(final boolean state) { useAdvancedTiming_ = state; return this; } - /** - * Sets the number of time points. - * - * @param numTimePoints the number of time points - */ @Override public Builder numTimePoints(final int numTimePoints) { numTimePoints_ = numTimePoints; return this; } - /** - * Sets the time point interval between time points in seconds. - * - * @param timePointInterval the time point interval in seconds. - */ @Override public Builder timePointInterval(final double timePointInterval) { timePointInterval_ = timePointInterval; return this; } - /** - * Sets the delay after a move when using multiple positions. - * - * @param postMoveDelay the delay in milliseconds. - */ @Override public Builder postMoveDelay(final int postMoveDelay) { postMoveDelay_ = postMoveDelay; @@ -234,247 +329,4 @@ public String toString() { } - private final ChannelSettings channels_; - private final DefaultTimingSettings timing_; - private final DefaultVolumeSettings volume_; - private final SliceSettings slice_; - private final StageScanSettings stageScan_; - private final DefaultSheetCalibration sheetCalibration_; - private final DefaultSliceCalibration sliceCalibration_; - - private final AcquisitionMode acquisitionMode_; - - private final CameraMode cameraMode_; - private final CameraData[] imagingCameraOrder_; - - private final boolean useTimePoints_; - private final boolean useMultiplePositions_; - private final boolean useHardwareTimePoints_; - private final boolean useAdvancedTiming_; - - private final int numTimePoints_; - private final double timePointInterval_; - private final int postMoveDelay_; - - private ScapeAcquisitionSettings(Builder builder) { - super(builder); - channels_ = builder.channelBuilder().build(); - timing_ = builder.timingBuilder_.build(); - volume_ = builder.volumeBuilder_.build(); - slice_ = builder.sliceBuilder().build(); - stageScan_ = builder.stageScanBuilder().build(); - sheetCalibration_ = builder.sheetCalibBuilder_.build(); - sliceCalibration_ = builder.sliceCalibBuilder_.build(); - acquisitionMode_ = builder.acquisitionMode_; - cameraMode_ = builder.cameraMode_; - imagingCameraOrder_ = builder.imagingCameraOrder_; - useTimePoints_ = builder.useTimePoints_; - useMultiplePositions_ = builder.useMultiplePositions_; - useHardwareTimePoints_ = builder.useHardwareTimePoints_; - useAdvancedTiming_ = builder.useAdvancedTiming_; - numTimePoints_ = builder.numTimePoints_; - timePointInterval_ = builder.timePointInterval_; - postMoveDelay_ = builder.postMoveDelay_; - } - -// /** -// * Creates a Builder populated with settings of this DefaultAcquisitionSettingsSCAPE instance. -// * -// * @return DefaultAcquisitionSettingsSCAPE.Builder pre-populated with settings of this instance. -// */ -// @Override -// public DefaultAcquisitionSettingsSCAPE.Builder copyBuilder() { -// return new Builder(this); -// } - - /** - * Returns the immutable DefaultChannelSettings instance. - * - * @return immutable DefaultChannelSettings instance. - */ - @Override - public ChannelSettings channels() { - return channels_; - } - - /** - * Returns the immutable DefaultTimingSettings instance. - * - * @return immutable DefaultTimingSettings instance. - */ - @Override - public DefaultTimingSettings timing() { - return timing_; - } - - /** - * Returns the immutable DefaultVolumeSettings instance. - * - * @return immutable DefaultVolumeSettings instance. - */ - @Override - public DefaultVolumeSettings volume() { - return volume_; - } - - /** - * Returns the immutable DefaultSliceSettings instance. - * - * @return immutable DefaultSliceSettings instance. - */ - @Override - public SliceSettings slice() { - return slice_; - } - - /** - * Returns the immutable DefaultStageScanSettings instance. - * - * @return immutable DefaultStageScanSettings instance. - */ - @Override - public StageScanSettings stageScan() { - return stageScan_; - } - - /** - * Returns the immutable DefaultSheetCalibration instance. - * - * @return immutable DefaultSheetCalibration instance. - */ - @Override - public DefaultSheetCalibration sheetCalibration() { - return sheetCalibration_; - } - - /** - * Returns an immutable DefaultSliceCalibration instance. - *

- * Views start at index 1. - * - * @return immutable DefaultSliceCalibration instance. - */ - @Override - public DefaultSliceCalibration sliceCalibration() { - return sliceCalibration_; - } - - /** - * Returns the acquisition mode. - * - * @return the acquisition mode. - */ - @Override - public AcquisitionMode acquisitionMode() { - return acquisitionMode_; - } - - /** - * Returns the camera mode. - * - * @return the camera mode. - */ - @Override - public CameraMode cameraMode() { - return cameraMode_; - } - - /** - * Returns the imaging camera order. - * - * @return the imaging camera order - */ - @Override - public CameraData[] imagingCameraOrder() { - return imagingCameraOrder_; - } - - /** - * Returns true if using time points. - * - * @return true if using time points. - */ - @Override - public boolean isUsingTimePoints() { - return useTimePoints_; - } - - /** - * Returns true if using multiple positions. - * - * @return true if using multiple positions. - */ - @Override - public boolean isUsingMultiplePositions() { - return useMultiplePositions_; - } - - /** - * Returns true if using hardware time points. - * - * @return true if using hardware time points. - */ - @Override - public boolean isUsingHardwareTimePoints() { - return useHardwareTimePoints_; - } - - /** - * Returns true if using advanced timing settings. - * - * @return true if using advanced timing settings. - */ - @Override - public boolean isUsingAdvancedTiming() { - return useAdvancedTiming_; - } - - /** - * Returns the number of time points. - * - * @return the number of time points. - */ - @Override - public int numTimePoints() { - return numTimePoints_; - } - - /** - * Returns the time point interval in seconds. - * - * @return the time point interval in seconds. - */ - @Override - public double timePointInterval() { - return timePointInterval_; - } - - /** - * Returns the post move delay in milliseconds. - * - * @return the post move delay in milliseconds. - */ - @Override - public int postMoveDelay() { - return postMoveDelay_; - } - - // TODO: finish this, and maybe use pretty printing? or just rely on JSON conversion? - @Override - public String toString() { - return String.format("[timingSettings_=%s]", timing_); - } - -// public String toJson() { -// return new Gson().toJson(this); -// } - -// public String toPrettyJson() { -// final Gson gson = new GsonBuilder().setPrettyPrinting().create(); -// return gson.toJson(this); -// } - -// public static DefaultAcquisitionSettingsDISPIM fromJson(final String json) { -// return new Gson().fromJson(json, DefaultAcquisitionSettingsDISPIM.class); -// } } From c9d7eba9c9a7447575eb358b3ec92f74321c2770 Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 12:16:28 -0700 Subject: [PATCH 02/11] add hashCode to scape settings --- .../internal/DispimAcquisitionSettings.java | 14 ++++++++-- .../internal/ScapeAcquisitionSettings.java | 27 ++++++++++++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java index 2381516..d907af2 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -164,13 +164,23 @@ public double liveScanPeriod() { return liveScanPeriod_; } + // TODO: finish this + @Override + public int hashCode() { + return Objects.hash( + channels_ + ); + } + // TODO: finish this, and maybe use pretty printing? or just rely on JSON conversion? @Override public String toString() { - return String.format("[timing=%s]", timing_); + return String.format("%s[channels=%s, timing=%s]", getClass().getSimpleName(), channels_, timing_); } - public static class Builder extends BaseAcquisitionSettings.Builder implements AcquisitionSettingsDispim.Builder { + public static class Builder + extends BaseAcquisitionSettings.Builder + implements AcquisitionSettingsDispim.Builder { private ChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); private DefaultTimingSettings.Builder timingBuilder_ = DefaultTimingSettings.builder(); diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java index eb2ddc9..54988e0 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java @@ -8,6 +8,7 @@ import org.micromanager.lightsheetmanager.api.data.CameraData; import org.micromanager.lightsheetmanager.api.data.CameraMode; +import java.util.Arrays; import java.util.Objects; public class ScapeAcquisitionSettings extends BaseAcquisitionSettings implements AcquisitionSettingsScape { @@ -154,10 +155,34 @@ public int postMoveDelay() { return postMoveDelay_; } + @Override + public int hashCode() { + return Objects.hash( + channels_, + timing_, + volume_, + slice_, + stageScan_, + sheetCalibration_, + sliceCalibration_, + acquisitionMode_, + cameraMode_, + Arrays.hashCode(imagingCameraOrder_), + useTimePoints_, + useMultiplePositions_, + useHardwareTimePoints_, + useAdvancedTiming_, + numTimePoints_, + timePointInterval_, + postMoveDelay_ + ); + } + // TODO: finish this, and maybe use pretty printing? or just rely on JSON conversion? @Override public String toString() { - return String.format("[timing=%s]", timing_); + return String.format("%s[channels=%s, timing=%s, volume=%s, slice=%s]", + getClass().getSimpleName(), channels_, timing_, volume_, slice_); } public static class Builder From 26a475ea395b1b9379613ed59302159582f96637 Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 12:30:24 -0700 Subject: [PATCH 03/11] impl equals() for scape settings --- .../internal/DispimAcquisitionSettings.java | 26 ++++++++++------- .../internal/ScapeAcquisitionSettings.java | 28 +++++++++++++++++++ 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java index d907af2..c9ff4f2 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -13,8 +13,8 @@ public class DispimAcquisitionSettings extends BaseAcquisitionSettings implement private final ChannelSettings channels_; private final DefaultTimingSettings timing_; private final DefaultVolumeSettings volume_; - private final DefaultSliceSettingsLS sliceLS_; private final DefaultSliceSettings slice_; + private final DefaultSliceSettingsLS sliceLS_; private final StageScanSettings stageScan_; private final DefaultSheetCalibration[] sheetCalibrations_; private final DefaultSliceCalibration[] sliceCalibrations_; @@ -168,14 +168,20 @@ public double liveScanPeriod() { @Override public int hashCode() { return Objects.hash( - channels_ + channels_, + timing_, + volume_, + slice_, + sliceLS_, + stageScan_ ); } // TODO: finish this, and maybe use pretty printing? or just rely on JSON conversion? @Override public String toString() { - return String.format("%s[channels=%s, timing=%s]", getClass().getSimpleName(), channels_, timing_); + return String.format("%s[channels=%s, timing=%s, volume=%s, slice=%s, sliceLS=%s, stageScan=%s]", + getClass().getSimpleName(), channels_, timing_, volume_, slice_, sliceLS_, stageScan_); } public static class Builder @@ -301,23 +307,23 @@ public ChannelSettings.Builder channelBuilder() { return channelBuilder_; } - public DefaultTimingSettings.Builder timingSettingsBuilder() { + public DefaultTimingSettings.Builder timingBuilder() { return timingBuilder_; } - public DefaultVolumeSettings.Builder volumeSettingsBuilder() { + public DefaultVolumeSettings.Builder volumeBuilder() { return volumeBuilder_; } - public DefaultSliceSettings.Builder sliceSettingsBuilder() { + public DefaultSliceSettings.Builder sliceBuilder() { return sliceBuilder_; } - public DefaultSliceSettingsLS.Builder sliceSettingsLSBuilder() { + public DefaultSliceSettingsLS.Builder sliceLSBuilder() { return ssbLS_; } - public StageScanSettings.Builder scanSettingsBuilder() { + public StageScanSettings.Builder stageScanBuilder() { return stageScanBuilder_; } @@ -329,11 +335,11 @@ public DefaultSliceCalibration.Builder sliceCalibrationBuilder(final int view) { return slcb_[view-1]; } - public void timingSettingsBuilder(DefaultTimingSettings.Builder builder) { + public void timingBuilder(DefaultTimingSettings.Builder builder) { timingBuilder_ = builder; } - public void volumeSettingsBuilder(DefaultVolumeSettings.Builder builder) { + public void volumeBuilder(DefaultVolumeSettings.Builder builder) { volumeBuilder_ = builder; } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java index 54988e0..b0ef34a 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java @@ -155,6 +155,34 @@ public int postMoveDelay() { return postMoveDelay_; } + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + ScapeAcquisitionSettings other = (ScapeAcquisitionSettings) obj; + return Objects.equals(channels_, other.channels_) && + Objects.equals(timing_, other.timing_) && + Objects.equals(volume_, other.volume_) && + Objects.equals(slice_, other.slice_) && + Objects.equals(stageScan_, other.stageScan_) && + Objects.equals(sheetCalibration_, other.sheetCalibration_) && + Objects.equals(sliceCalibration_, other.sliceCalibration_) && + acquisitionMode_ == other.acquisitionMode_ && + cameraMode_ == other.cameraMode_ && + Arrays.equals(imagingCameraOrder_, other.imagingCameraOrder_) && + useTimePoints_ == other.useTimePoints_ && + useMultiplePositions_ == other.useMultiplePositions_ && + useHardwareTimePoints_ == other.useHardwareTimePoints_ && + useAdvancedTiming_ == other.useAdvancedTiming_ && + numTimePoints_ == other.numTimePoints_ && + Double.compare(other.timePointInterval_, timePointInterval_) == 0 && + postMoveDelay_ == other.postMoveDelay_; + } + @Override public int hashCode() { return Objects.hash( From 1200e68367752e96627c46d0316291508b76fca0 Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 13:09:26 -0700 Subject: [PATCH 04/11] start on hashCode and equals for dispim settings --- .../internal/DispimAcquisitionSettings.java | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java index c9ff4f2..819fa02 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -6,6 +6,7 @@ import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; +import java.util.Arrays; import java.util.Objects; public class DispimAcquisitionSettings extends BaseAcquisitionSettings implements AcquisitionSettingsDispim { @@ -164,6 +165,36 @@ public double liveScanPeriod() { return liveScanPeriod_; } + // TODO: finish this + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + DispimAcquisitionSettings other = (DispimAcquisitionSettings) obj; + return Objects.equals(channels_, other.channels_) && + Objects.equals(timing_, other.timing_) && + Objects.equals(volume_, other.volume_) && + Objects.equals(slice_, other.slice_) && + Objects.equals(sliceLS_, other.sliceLS_) && + Objects.equals(stageScan_, other.stageScan_) && + // Objects.equals(sheetCalibration_, other.sheetCalibration_) && + // Objects.equals(sliceCalibration_, other.sliceCalibration_) && + acquisitionMode_ == other.acquisitionMode_ && + cameraMode_ == other.cameraMode_ && + // Arrays.equals(imagingCameraOrder_, other.imagingCameraOrder_) && + useTimePoints_ == other.useTimePoints_ && + useMultiplePositions_ == other.useMultiplePositions_ && + useHardwareTimePoints_ == other.useHardwareTimePoints_ && + useAdvancedTiming_ == other.useAdvancedTiming_ && + numTimePoints_ == other.numTimePoints_ && + Double.compare(other.timePointInterval_, timePointInterval_) == 0 && + postMoveDelay_ == other.postMoveDelay_; + } + // TODO: finish this @Override public int hashCode() { @@ -173,7 +204,19 @@ public int hashCode() { volume_, slice_, sliceLS_, - stageScan_ + stageScan_, + // sheetCalibration_, + // sliceCalibration_, + acquisitionMode_, + cameraMode_, + //Arrays.hashCode(imagingCameraOrder_), + useTimePoints_, + useMultiplePositions_, + useHardwareTimePoints_, + useAdvancedTiming_, + numTimePoints_, + timePointInterval_, + postMoveDelay_ ); } From a5f7d71a7020f53bc9728a1cab571e1d34eb0e36 Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 13:40:29 -0700 Subject: [PATCH 05/11] use the interface for field types in scape --- .../api/AcquisitionSettingsScape.java | 4 ++-- .../api/internal/BaseAcquisitionSettings.java | 12 ++++++++++++ .../api/internal/DefaultSheetCalibration.java | 5 +++++ .../api/internal/DefaultSliceCalibration.java | 5 +++++ .../api/internal/ScapeAcquisitionSettings.java | 18 ++++++++++-------- 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java index a9439ff..056efbb 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java @@ -61,14 +61,14 @@ public interface AcquisitionSettingsScape extends AcquisitionSettings { * * @return immutable DefaultSheetCalibration instance. */ - DefaultSheetCalibration sheetCalibration(); + SheetCalibration sheetCalibration(); /** * Returns the immutable DefaultSliceCalibration instance. * * @return immutable DefaultSliceCalibration instance. */ - DefaultSliceCalibration sliceCalibration(); + SliceCalibration sliceCalibration(); /** * Returns the acquisition mode. diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java index 8d91871..099813f 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java @@ -5,6 +5,8 @@ import com.google.gson.JsonDeserializer; import org.micromanager.lightsheetmanager.api.AcquisitionSettings; import org.micromanager.lightsheetmanager.api.ChannelSettings; +import org.micromanager.lightsheetmanager.api.SheetCalibration; +import org.micromanager.lightsheetmanager.api.SliceCalibration; import org.micromanager.lightsheetmanager.api.SliceSettings; import org.micromanager.lightsheetmanager.api.StageScanSettings; import org.micromanager.lightsheetmanager.model.DataStorage; @@ -236,6 +238,16 @@ public static T fromJson(final String json, fina // This forces Gson to use the concrete implementation class return context.deserialize(jsonElement, DefaultSliceSettings.class); }) + .registerTypeAdapter(SheetCalibration.class, (JsonDeserializer) + (jsonElement, typeOfT, context) -> { + // This forces Gson to use the concrete implementation class + return context.deserialize(jsonElement, DefaultSheetCalibration.class); + }) + .registerTypeAdapter(SliceCalibration.class, (JsonDeserializer) + (jsonElement, typeOfT, context) -> { + // This forces Gson to use the concrete implementation class + return context.deserialize(jsonElement, DefaultSliceCalibration.class); + }) .create(); return gson.fromJson(json, cls); } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSheetCalibration.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSheetCalibration.java index 0bb4da8..fd5dbd1 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSheetCalibration.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSheetCalibration.java @@ -24,6 +24,11 @@ private DefaultSheetCalibration(Builder builder) { scanOffset_ = builder.scanOffset_; } + // Note: used by GSON library for deserialization + private DefaultSheetCalibration() { + this(new Builder()); + } + public static Builder builder() { return new Builder(); } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceCalibration.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceCalibration.java index a61f8fc..0c99ef3 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceCalibration.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceCalibration.java @@ -14,6 +14,11 @@ private DefaultSliceCalibration(Builder builder) { offset_ = builder.offset_; } + // Note: used by GSON library for deserialization + private DefaultSliceCalibration() { + this(new Builder()); + } + public static Builder builder() { return new Builder(); } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java index b0ef34a..c5d3771 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java @@ -2,6 +2,8 @@ import org.micromanager.lightsheetmanager.api.AcquisitionSettingsScape; import org.micromanager.lightsheetmanager.api.ChannelSettings; +import org.micromanager.lightsheetmanager.api.SheetCalibration; +import org.micromanager.lightsheetmanager.api.SliceCalibration; import org.micromanager.lightsheetmanager.api.SliceSettings; import org.micromanager.lightsheetmanager.api.StageScanSettings; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; @@ -18,8 +20,8 @@ public class ScapeAcquisitionSettings extends BaseAcquisitionSettings implements private final DefaultVolumeSettings volume_; private final SliceSettings slice_; private final StageScanSettings stageScan_; - private final DefaultSheetCalibration sheetCalibration_; - private final DefaultSliceCalibration sliceCalibration_; + private final SheetCalibration sheetCalibration_; + private final SliceCalibration sliceCalibration_; private final AcquisitionMode acquisitionMode_; @@ -96,12 +98,12 @@ public StageScanSettings stageScan() { } @Override - public DefaultSheetCalibration sheetCalibration() { + public SheetCalibration sheetCalibration() { return sheetCalibration_; } @Override - public DefaultSliceCalibration sliceCalibration() { + public SliceCalibration sliceCalibration() { return sliceCalibration_; } @@ -222,8 +224,8 @@ public static class Builder private DefaultVolumeSettings.Builder volumeBuilder_ = DefaultVolumeSettings.builder(); private SliceSettings.Builder sliceBuilder_ = DefaultSliceSettings.builder(); private StageScanSettings.Builder stageScanBuilder_ = DefaultStageScanSettings.builder(); - private DefaultSheetCalibration.Builder sheetCalibBuilder_ = DefaultSheetCalibration.builder(); - private DefaultSliceCalibration.Builder sliceCalibBuilder_ = DefaultSliceCalibration.builder(); + private SheetCalibration.Builder sheetCalibBuilder_ = DefaultSheetCalibration.builder(); + private SliceCalibration.Builder sliceCalibBuilder_ = DefaultSliceCalibration.builder(); private AcquisitionMode acquisitionMode_ = AcquisitionMode.NO_SCAN; @@ -348,11 +350,11 @@ public StageScanSettings.Builder stageScanBuilder() { return stageScanBuilder_; } - public DefaultSheetCalibration.Builder sheetCalibrationBuilder() { + public SheetCalibration.Builder sheetCalibrationBuilder() { return sheetCalibBuilder_; } - public DefaultSliceCalibration.Builder sliceCalibrationBuilder() { + public SliceCalibration.Builder sliceCalibrationBuilder() { return sliceCalibBuilder_; } From 91f0e8849ac5e9bcffec96244892b53f2a4e8d8b Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 13:46:03 -0700 Subject: [PATCH 06/11] use VolumeSettings instead of DefaultVolumeSettings --- .../api/AcquisitionSettingsScape.java | 2 +- .../api/internal/BaseAcquisitionSettings.java | 14 ++++++++++---- .../api/internal/DefaultTimingSettings.java | 5 +++++ .../api/internal/DefaultVolumeSettings.java | 5 +++++ .../api/internal/ScapeAcquisitionSettings.java | 9 +++++---- .../gui/tabs/acquisition/VolumePanel.java | 4 ++-- 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java index 056efbb..48af829 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java @@ -40,7 +40,7 @@ public interface AcquisitionSettingsScape extends AcquisitionSettings { * * @return immutable DefaultVolumeSettings instance. */ - DefaultVolumeSettings volume(); + VolumeSettings volume(); /** * Returns the immutable SliceSettings instance. diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java index 099813f..91b5fe3 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java @@ -9,6 +9,7 @@ import org.micromanager.lightsheetmanager.api.SliceCalibration; import org.micromanager.lightsheetmanager.api.SliceSettings; import org.micromanager.lightsheetmanager.api.StageScanSettings; +import org.micromanager.lightsheetmanager.api.VolumeSettings; import org.micromanager.lightsheetmanager.model.DataStorage; /** @@ -223,15 +224,20 @@ public String toPrettyJson() { public static T fromJson(final String json, final Class cls) { Gson gson = new GsonBuilder() - .registerTypeAdapter(StageScanSettings.class, (JsonDeserializer) + .registerTypeAdapter(ChannelSettings.class, (JsonDeserializer) (jsonElement, typeOfT, context) -> { // This forces Gson to use the concrete implementation class - return context.deserialize(jsonElement, DefaultStageScanSettings.class); + return context.deserialize(jsonElement, DefaultChannelSettings.class); }) - .registerTypeAdapter(ChannelSettings.class, (JsonDeserializer) + .registerTypeAdapter(VolumeSettings.class, (JsonDeserializer) (jsonElement, typeOfT, context) -> { // This forces Gson to use the concrete implementation class - return context.deserialize(jsonElement, DefaultChannelSettings.class); + return context.deserialize(jsonElement, DefaultVolumeSettings.class); + }) + .registerTypeAdapter(StageScanSettings.class, (JsonDeserializer) + (jsonElement, typeOfT, context) -> { + // This forces Gson to use the concrete implementation class + return context.deserialize(jsonElement, DefaultStageScanSettings.class); }) .registerTypeAdapter(SliceSettings.class, (JsonDeserializer) (jsonElement, typeOfT, context) -> { diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultTimingSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultTimingSettings.java index 497be4c..7423657 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultTimingSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultTimingSettings.java @@ -30,6 +30,11 @@ private DefaultTimingSettings(Builder builder) { alternateScanDirection_ = builder.alternateScanDirection_; } + // Note: used by GSON library for deserialization + private DefaultTimingSettings() { + this(new Builder()); + } + public static Builder builder() { return new Builder(); } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultVolumeSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultVolumeSettings.java index d6a1bf2..0ca5ef4 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultVolumeSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultVolumeSettings.java @@ -26,6 +26,11 @@ private DefaultVolumeSettings(Builder builder) { endPosition_ = builder.endPosition_; } + // Note: used by GSON library for deserialization + private DefaultVolumeSettings() { + this(new Builder()); + } + public static Builder builder() { return new Builder(); } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java index c5d3771..b7748df 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java @@ -6,6 +6,7 @@ import org.micromanager.lightsheetmanager.api.SliceCalibration; import org.micromanager.lightsheetmanager.api.SliceSettings; import org.micromanager.lightsheetmanager.api.StageScanSettings; +import org.micromanager.lightsheetmanager.api.VolumeSettings; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; import org.micromanager.lightsheetmanager.api.data.CameraData; import org.micromanager.lightsheetmanager.api.data.CameraMode; @@ -17,7 +18,7 @@ public class ScapeAcquisitionSettings extends BaseAcquisitionSettings implements private final ChannelSettings channels_; private final DefaultTimingSettings timing_; - private final DefaultVolumeSettings volume_; + private final VolumeSettings volume_; private final SliceSettings slice_; private final StageScanSettings stageScan_; private final SheetCalibration sheetCalibration_; @@ -83,7 +84,7 @@ public DefaultTimingSettings timing() { } @Override - public DefaultVolumeSettings volume() { + public VolumeSettings volume() { return volume_; } @@ -221,7 +222,7 @@ public static class Builder private ChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); private DefaultTimingSettings.Builder timingBuilder_ = DefaultTimingSettings.builder(); - private DefaultVolumeSettings.Builder volumeBuilder_ = DefaultVolumeSettings.builder(); + private VolumeSettings.Builder volumeBuilder_ = DefaultVolumeSettings.builder(); private SliceSettings.Builder sliceBuilder_ = DefaultSliceSettings.builder(); private StageScanSettings.Builder stageScanBuilder_ = DefaultStageScanSettings.builder(); private SheetCalibration.Builder sheetCalibBuilder_ = DefaultSheetCalibration.builder(); @@ -338,7 +339,7 @@ public DefaultTimingSettings.Builder timingBuilder() { return timingBuilder_; } - public DefaultVolumeSettings.Builder volumeBuilder() { + public VolumeSettings.Builder volumeBuilder() { return volumeBuilder_; } diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/VolumePanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/VolumePanel.java index 90e9c40..ecba902 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/VolumePanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/VolumePanel.java @@ -1,5 +1,6 @@ package org.micromanager.lightsheetmanager.gui.tabs.acquisition; +import org.micromanager.lightsheetmanager.api.VolumeSettings; import org.micromanager.lightsheetmanager.api.data.GeometryType; import org.micromanager.lightsheetmanager.api.internal.DefaultVolumeSettings; import org.micromanager.lightsheetmanager.LightSheetManager; @@ -40,8 +41,7 @@ private void createUserInterface() { final GeometryType geometryType = model_.devices().adapter().geometry(); final int numImagingPaths = model_.devices().adapter().numImagingPaths(); - final DefaultVolumeSettings volumeSettings = model_.acquisitions() - .settings().volume(); + final VolumeSettings volumeSettings = model_.acquisitions().settings().volume(); // create labels for combo boxes Integer[] viewOptions = new Integer[numImagingPaths]; From cbba5e9c119e67eaacfce9203349771cd5a15912 Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 13:55:50 -0700 Subject: [PATCH 07/11] use timing settings interface --- .../api/AcquisitionSettingsScape.java | 2 +- .../api/internal/BaseAcquisitionSettings.java | 6 ++++++ .../internal/DispimAcquisitionSettings.java | 12 +++++------ .../internal/ScapeAcquisitionSettings.java | 20 ++++++++++--------- .../tabs/acquisition/AdvancedTimingPanel.java | 5 +++-- .../lightsheetmanager/model/PLogicScape.java | 3 ++- 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java index 48af829..36c956a 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java @@ -33,7 +33,7 @@ public interface AcquisitionSettingsScape extends AcquisitionSettings { * * @return immutable DefaultTimingSettings instance. */ - DefaultTimingSettings timing(); + TimingSettings timing(); /** * Returns the immutable DefaultVolumeSettings instance. diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java index 91b5fe3..1dba436 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java @@ -9,6 +9,7 @@ import org.micromanager.lightsheetmanager.api.SliceCalibration; import org.micromanager.lightsheetmanager.api.SliceSettings; import org.micromanager.lightsheetmanager.api.StageScanSettings; +import org.micromanager.lightsheetmanager.api.TimingSettings; import org.micromanager.lightsheetmanager.api.VolumeSettings; import org.micromanager.lightsheetmanager.model.DataStorage; @@ -229,6 +230,11 @@ public static T fromJson(final String json, fina // This forces Gson to use the concrete implementation class return context.deserialize(jsonElement, DefaultChannelSettings.class); }) + .registerTypeAdapter(TimingSettings.class, (JsonDeserializer) + (jsonElement, typeOfT, context) -> { + // This forces Gson to use the concrete implementation class + return context.deserialize(jsonElement, DefaultTimingSettings.class); + }) .registerTypeAdapter(VolumeSettings.class, (JsonDeserializer) (jsonElement, typeOfT, context) -> { // This forces Gson to use the concrete implementation class diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java index 819fa02..83af389 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -36,12 +36,12 @@ public class DispimAcquisitionSettings extends BaseAcquisitionSettings implement private DispimAcquisitionSettings(Builder builder) { super(builder); - channels_ = builder.channelBuilder_.build(); - timing_ = builder.timingBuilder_.build(); - volume_ = builder.volumeBuilder_.build(); - slice_ = builder.sliceBuilder_.build(); - sliceLS_ = builder.ssbLS_.build(); - stageScan_ = builder.stageScanBuilder_.build(); + channels_ = builder.channelBuilder().build(); + timing_ = builder.timingBuilder().build(); + volume_ = builder.volumeBuilder().build(); + slice_ = builder.sliceBuilder().build(); + sliceLS_ = builder.sliceLSBuilder().build(); + stageScan_ = builder.stageScanBuilder().build(); sheetCalibrations_ = new DefaultSheetCalibration[2]; sliceCalibrations_ = new DefaultSliceCalibration[2]; // TODO: populate with numViews instead of magic number for (int i = 0; i < 2; i++) { diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java index b7748df..99c3422 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java @@ -6,6 +6,7 @@ import org.micromanager.lightsheetmanager.api.SliceCalibration; import org.micromanager.lightsheetmanager.api.SliceSettings; import org.micromanager.lightsheetmanager.api.StageScanSettings; +import org.micromanager.lightsheetmanager.api.TimingSettings; import org.micromanager.lightsheetmanager.api.VolumeSettings; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; import org.micromanager.lightsheetmanager.api.data.CameraData; @@ -17,7 +18,7 @@ public class ScapeAcquisitionSettings extends BaseAcquisitionSettings implements AcquisitionSettingsScape { private final ChannelSettings channels_; - private final DefaultTimingSettings timing_; + private final TimingSettings timing_; private final VolumeSettings volume_; private final SliceSettings slice_; private final StageScanSettings stageScan_; @@ -41,12 +42,12 @@ public class ScapeAcquisitionSettings extends BaseAcquisitionSettings implements private ScapeAcquisitionSettings(Builder builder) { super(builder); channels_ = builder.channelBuilder().build(); - timing_ = builder.timingBuilder_.build(); - volume_ = builder.volumeBuilder_.build(); + timing_ = builder.timingBuilder().build(); + volume_ = builder.volumeBuilder().build(); slice_ = builder.sliceBuilder().build(); stageScan_ = builder.stageScanBuilder().build(); - sheetCalibration_ = builder.sheetCalibBuilder_.build(); - sliceCalibration_ = builder.sliceCalibBuilder_.build(); + sheetCalibration_ = builder.sheetCalibrationBuilder().build(); + sliceCalibration_ = builder.sliceCalibrationBuilder().build(); acquisitionMode_ = builder.acquisitionMode_; cameraMode_ = builder.cameraMode_; imagingCameraOrder_ = builder.imagingCameraOrder_; @@ -79,7 +80,7 @@ public ChannelSettings channels() { } @Override - public DefaultTimingSettings timing() { + public TimingSettings timing() { return timing_; } @@ -221,7 +222,7 @@ public static class Builder implements AcquisitionSettingsScape.Builder { private ChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); - private DefaultTimingSettings.Builder timingBuilder_ = DefaultTimingSettings.builder(); + private TimingSettings.Builder timingBuilder_ = DefaultTimingSettings.builder(); private VolumeSettings.Builder volumeBuilder_ = DefaultVolumeSettings.builder(); private SliceSettings.Builder sliceBuilder_ = DefaultSliceSettings.builder(); private StageScanSettings.Builder stageScanBuilder_ = DefaultStageScanSettings.builder(); @@ -335,7 +336,7 @@ public ChannelSettings.Builder channelBuilder() { return channelBuilder_; } - public DefaultTimingSettings.Builder timingBuilder() { + public TimingSettings.Builder timingBuilder() { return timingBuilder_; } @@ -380,7 +381,8 @@ public ScapeAcquisitionSettings build() { // TODO: finish toString with rest of properties @Override public String toString() { - return String.format("[tsb_=%s]", timingBuilder_); + return String.format("%s[timingBuilder=%s]", + getClass().getSimpleName(), timingBuilder_); } } diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java index 85c97dd..25b81b1 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java @@ -1,5 +1,6 @@ package org.micromanager.lightsheetmanager.gui.tabs.acquisition; +import org.micromanager.lightsheetmanager.api.TimingSettings; import org.micromanager.lightsheetmanager.api.internal.DefaultTimingSettings; import org.micromanager.lightsheetmanager.gui.components.CheckBox; import org.micromanager.lightsheetmanager.gui.components.Label; @@ -48,7 +49,7 @@ private void createUserInterface() { final Label lblScansPerSlice = new Label("Scans Per Slice: "); final Label lblCameraExposure = new Label("Camera Exposure [ms]: "); - final DefaultTimingSettings timingSettings = model_.acquisitions().settings().timing(); + final TimingSettings timingSettings = model_.acquisitions().settings().timing(); spnDelayBeforeScan_ = Spinner.createDoubleSpinner( timingSettings.delayBeforeScan(), 0.0, 10000.0, 0.25); @@ -191,7 +192,7 @@ private void createEventHandlers() { * Updates the spinner values from the timing settings builder. */ public void updateSpinners() { - final DefaultTimingSettings timingSettings = model_.acquisitions() + final TimingSettings timingSettings = model_.acquisitions() .settingsBuilder().timingBuilder().build(); spnDelayBeforeScan_.setDouble(timingSettings.delayBeforeScan()); spnScansPerSlice_.setInt(timingSettings.scansPerSlice()); diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java index 9cbf1bb..ce49ac8 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java @@ -4,6 +4,7 @@ import mmcorej.Configuration; import org.micromanager.Studio; import org.micromanager.lightsheetmanager.LightSheetManager; +import org.micromanager.lightsheetmanager.api.TimingSettings; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.api.data.GeometryType; @@ -301,7 +302,7 @@ public double computeScanAcceleration(final double motorSpeed, ScapeAcquisitionS // * gets the correct value for the slice timing's sliceDuration field based on other values of slice timing // slice duration is the max out of the scan time, laser time, and camera time - public double getSliceDuration(final DefaultTimingSettings s, final int scanNum) { + public double getSliceDuration(final TimingSettings s, final int scanNum) { return Math.max(Math.max( s.delayBeforeScan() + (s.scanDuration() * scanNum), // scan time s.delayBeforeLaser() + s.laserTriggerDuration() // laser time From 80da695d5790975780f9f00b42a4244ea1f56784 Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 14:04:05 -0700 Subject: [PATCH 08/11] use docstrings from interface, improve dispim settings --- .../api/AcquisitionSettingsDispim.java | 2 +- .../lightsheetmanager/api/VolumeSettings.java | 4 +- .../api/internal/DefaultVolumeSettings.java | 95 +------------------ .../internal/DispimAcquisitionSettings.java | 15 +-- 4 files changed, 16 insertions(+), 100 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java index 0219625..d5602ae 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java @@ -41,7 +41,7 @@ public interface AcquisitionSettingsDispim extends AcquisitionSettings { * * @return immutable DefaultVolumeSettings instance. */ - DefaultVolumeSettings volume(); + VolumeSettings volume(); /** * Returns the immutable DefaultSliceSettings instance. diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/VolumeSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/VolumeSettings.java index a8ed47d..2ac459b 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/VolumeSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/VolumeSettings.java @@ -92,9 +92,9 @@ interface Builder { */ Builder delayBeforeView(final double viewDelayMs); - Builder slicesPerView(final int n); + Builder slicesPerView(final int numSlices); - Builder sliceStepSize(final double um); + Builder sliceStepSize(final double stepSizeUm); /** * Sets the volume bounds, automatically computing numSlices and centerPosition. diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultVolumeSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultVolumeSettings.java index 0ca5ef4..ace4cd0 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultVolumeSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultVolumeSettings.java @@ -45,81 +45,41 @@ public Builder copyBuilder() { return new Builder(this); } - /** - * Returns the imaging path that the acquisition starts on. - * - * @return the first view - */ @Override public int firstView() { return firstView_; } - /** - * Return the number of views to use during an acquisition. - * - * @return the number of views - */ @Override public int numViews() { return numViews_; } - /** - * Returns the number of slices per volume. - * - * @return the number of slices - */ @Override public int slicesPerView() { return slicesPerView_; } - /** - * Return the delay in milliseconds before switching imaging paths in milliseconds. - * - * @return the delay in milliseconds - */ @Override public double delayBeforeView() { return delayBeforeView_; } - /** - * Returns the step size in microns. - * - * @return the step size in microns - */ @Override public double sliceStepSize() { return sliceStepSize_; } - /** - * Returns the start position of the volume. - * - * @return the start position - */ @Override public double startPosition() { return startPosition_; } - /** - * Returns the center position of the volume. - * - * @return the center position - */ @Override public double centerPosition() { return centerPosition_; } - /** - * Returns the end position of the volume. - * - * @return the end position - */ @Override public double endPosition() { return endPosition_; @@ -175,11 +135,6 @@ public static class Builder implements VolumeSettings.Builder { private Builder() { } - /** - * Create a builder with values populated from already existing DefaultVolumeSettings. - * - * @param settings the settings to copy - */ private Builder(final VolumeSettings settings) { firstView_ = settings.firstView(); numViews_ = settings.numViews(); @@ -191,33 +146,18 @@ private Builder(final VolumeSettings settings) { endPosition_ = settings.endPosition(); } - /** - * Sets the number of views to use during an acquisition. - * - * @param numViews the number of view - */ @Override public Builder numViews(final int numViews) { numViews_ = numViews; return this; } - /** - * Sets the imaging path to start the acquisition with. - * - * @param firstView the first view - */ @Override public Builder firstView(final int firstView) { firstView_ = firstView; return this; } - /** - * Sets the delay between switching imaging paths in an acquisition. - * - * @param viewDelayMs the delay in milliseconds - */ @Override public Builder delayBeforeView(final double viewDelayMs) { delayBeforeView_ = viewDelayMs; @@ -225,25 +165,18 @@ public Builder delayBeforeView(final double viewDelayMs) { } @Override - public Builder slicesPerView(final int n) { - slicesPerView_ = n; + public Builder slicesPerView(final int numSlices) { + slicesPerView_ = numSlices; return this; } @Override - public Builder sliceStepSize(final double um) { - sliceStepSize_ = um; + public Builder sliceStepSize(final double stepSizeUm) { + sliceStepSize_ = stepSizeUm; return this; } // TODO: what happens when stepSize is not evenly divided by range? maybe just remove? - /** - * Sets the volume bounds, automatically computing numSlices and centerPosition. - * - * @param startPosition the start position - * @param endPosition the end position - * @param stepSizeUm the step size in micron - */ @Override public Builder volumeBounds(final double startPosition, final double endPosition, final double stepSizeUm) { startPosition_ = startPosition; @@ -254,13 +187,6 @@ public Builder volumeBounds(final double startPosition, final double endPosition return this; } - /** - * Sets the volume bounds, automatically computing stepSizeUm and centerPosition. - * - * @param startPosition the start position - * @param endPosition the end position - * @param numSlices the number of slices - */ @Override public Builder volumeBounds(final double startPosition, final double endPosition, final int numSlices) { startPosition_ = startPosition; @@ -271,13 +197,6 @@ public Builder volumeBounds(final double startPosition, final double endPosition return this; } - /** - * Sets the volume bounds, automatically computing startPosition and endPosition. - * - * @param centerPosition the center position - * @param numSlices the number of slices - * @param stepSizeUm the step size in microns - */ @Override public Builder volumeBounds(final double centerPosition, final int numSlices, final double stepSizeUm) { final double halfDistance = (stepSizeUm * numSlices) / 2.0; @@ -289,15 +208,11 @@ public Builder volumeBounds(final double centerPosition, final int numSlices, fi return this; } - /** - * Creates an immutable instance of VolumeSettings - * - * @return Immutable version of VolumeSettings - */ @Override public DefaultVolumeSettings build() { return new DefaultVolumeSettings(this); } + } } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java index 83af389..67cfbe7 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -3,6 +3,7 @@ import org.micromanager.lightsheetmanager.api.AcquisitionSettingsDispim; import org.micromanager.lightsheetmanager.api.ChannelSettings; import org.micromanager.lightsheetmanager.api.StageScanSettings; +import org.micromanager.lightsheetmanager.api.VolumeSettings; import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; @@ -13,7 +14,7 @@ public class DispimAcquisitionSettings extends BaseAcquisitionSettings implement private final ChannelSettings channels_; private final DefaultTimingSettings timing_; - private final DefaultVolumeSettings volume_; + private final VolumeSettings volume_; private final DefaultSliceSettings slice_; private final DefaultSliceSettingsLS sliceLS_; private final StageScanSettings stageScan_; @@ -86,7 +87,7 @@ public DefaultTimingSettings timing() { } @Override - public DefaultVolumeSettings volume() { + public VolumeSettings volume() { return volume_; } @@ -233,7 +234,7 @@ public static class Builder private ChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); private DefaultTimingSettings.Builder timingBuilder_ = DefaultTimingSettings.builder(); - private DefaultVolumeSettings.Builder volumeBuilder_ = DefaultVolumeSettings.builder(); + private VolumeSettings.Builder volumeBuilder_ = DefaultVolumeSettings.builder(); private DefaultSliceSettings.Builder sliceBuilder_ = DefaultSliceSettings.builder(); private DefaultSliceSettingsLS.Builder ssbLS_ = DefaultSliceSettingsLS.builder(); // maybe this should be LightSheetSliceSettings? replace ssb_? private StageScanSettings.Builder stageScanBuilder_ = DefaultStageScanSettings.builder(); @@ -264,9 +265,9 @@ private Builder() { public Builder(final DispimAcquisitionSettings settings) { super(settings); channelBuilder_ = settings.channels().copyBuilder(); - timingBuilder_ = settings.timing_.copyBuilder(); - volumeBuilder_ = settings.volume_.copyBuilder(); - sliceBuilder_ = settings.slice_.copyBuilder(); + timingBuilder_ = settings.timing().copyBuilder(); + volumeBuilder_ = settings.volume().copyBuilder(); + sliceBuilder_ = settings.slice().copyBuilder(); ssbLS_ = settings.sliceLS_.copyBuilder(); stageScanBuilder_ = settings.stageScan().copyBuilder(); for (int i = 0; i < 2; i++) { @@ -354,7 +355,7 @@ public DefaultTimingSettings.Builder timingBuilder() { return timingBuilder_; } - public DefaultVolumeSettings.Builder volumeBuilder() { + public VolumeSettings.Builder volumeBuilder() { return volumeBuilder_; } From ba8e96a8d17d2aa9f74945d91777faceae7d586d Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 14:10:59 -0700 Subject: [PATCH 09/11] program to the interface in dispim settings --- .../api/AcquisitionSettingsDispim.java | 11 +++-- .../internal/DispimAcquisitionSettings.java | 45 ++++++++++--------- .../lightsheetmanager/model/PLogicDispim.java | 3 +- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java index d5602ae..f5f11ec 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java @@ -34,7 +34,7 @@ public interface AcquisitionSettingsDispim extends AcquisitionSettings { * * @return immutable DefaultTimingSettings instance. */ - DefaultTimingSettings timing(); + TimingSettings timing(); /** * Returns the immutable DefaultVolumeSettings instance. @@ -48,14 +48,14 @@ public interface AcquisitionSettingsDispim extends AcquisitionSettings { * * @return immutable DefaultSliceSettings instance. */ - DefaultSliceSettings slice(); + SliceSettings slice(); /** * Returns the immutable DefaultSliceSettingsLS instance. * * @return immutable DefaultSliceSettingsLS instance. */ - DefaultSliceSettingsLS sliceLS(); + SliceSettingsLightSheet sliceLS(); /** * Returns the immutable DefaultScanSettings instance. @@ -69,15 +69,14 @@ public interface AcquisitionSettingsDispim extends AcquisitionSettings { * * @return immutable DefaultSheetCalibration instance. */ - DefaultSheetCalibration sheetCalibration(final int view); + SheetCalibration sheetCalibration(final int view); /** * Returns the immutable DefaultSliceCalibration instance. * * @return immutable DefaultSliceCalibration instance. */ - DefaultSliceCalibration sliceCalibration(final int view); - //DefaultSliceCalibration sliceCalibration(); + SliceCalibration sliceCalibration(final int view); /** * Returns the acquisition mode. diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java index 67cfbe7..75044ab 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -2,7 +2,12 @@ import org.micromanager.lightsheetmanager.api.AcquisitionSettingsDispim; import org.micromanager.lightsheetmanager.api.ChannelSettings; +import org.micromanager.lightsheetmanager.api.SheetCalibration; +import org.micromanager.lightsheetmanager.api.SliceCalibration; +import org.micromanager.lightsheetmanager.api.SliceSettings; +import org.micromanager.lightsheetmanager.api.SliceSettingsLightSheet; import org.micromanager.lightsheetmanager.api.StageScanSettings; +import org.micromanager.lightsheetmanager.api.TimingSettings; import org.micromanager.lightsheetmanager.api.VolumeSettings; import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; @@ -13,13 +18,13 @@ public class DispimAcquisitionSettings extends BaseAcquisitionSettings implements AcquisitionSettingsDispim { private final ChannelSettings channels_; - private final DefaultTimingSettings timing_; + private final TimingSettings timing_; private final VolumeSettings volume_; - private final DefaultSliceSettings slice_; - private final DefaultSliceSettingsLS sliceLS_; + private final SliceSettings slice_; + private final SliceSettingsLightSheet sliceLS_; private final StageScanSettings stageScan_; - private final DefaultSheetCalibration[] sheetCalibrations_; - private final DefaultSliceCalibration[] sliceCalibrations_; + private final SheetCalibration[] sheetCalibrations_; + private final SliceCalibration[] sliceCalibrations_; private final AcquisitionMode acquisitionMode_; private final CameraMode cameraMode_; @@ -82,7 +87,7 @@ public ChannelSettings channels() { } @Override - public DefaultTimingSettings timing() { + public TimingSettings timing() { return timing_; } @@ -92,12 +97,12 @@ public VolumeSettings volume() { } @Override - public DefaultSliceSettings slice() { + public SliceSettings slice() { return slice_; } @Override - public DefaultSliceSettingsLS sliceLS() { + public SliceSettingsLightSheet sliceLS() { return sliceLS_; } @@ -107,12 +112,12 @@ public StageScanSettings stageScan() { } @Override - public DefaultSheetCalibration sheetCalibration(final int view) { + public SheetCalibration sheetCalibration(final int view) { return sheetCalibrations_[view-1]; } @Override - public DefaultSliceCalibration sliceCalibration(final int view) { + public SliceCalibration sliceCalibration(final int view) { return sliceCalibrations_[view-1]; } @@ -233,13 +238,13 @@ public static class Builder implements AcquisitionSettingsDispim.Builder { private ChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); - private DefaultTimingSettings.Builder timingBuilder_ = DefaultTimingSettings.builder(); + private TimingSettings.Builder timingBuilder_ = DefaultTimingSettings.builder(); private VolumeSettings.Builder volumeBuilder_ = DefaultVolumeSettings.builder(); - private DefaultSliceSettings.Builder sliceBuilder_ = DefaultSliceSettings.builder(); - private DefaultSliceSettingsLS.Builder ssbLS_ = DefaultSliceSettingsLS.builder(); // maybe this should be LightSheetSliceSettings? replace ssb_? + private SliceSettings.Builder sliceBuilder_ = DefaultSliceSettings.builder(); + private SliceSettingsLightSheet.Builder ssbLS_ = DefaultSliceSettingsLS.builder(); // maybe this should be LightSheetSliceSettings? replace ssb_? private StageScanSettings.Builder stageScanBuilder_ = DefaultStageScanSettings.builder(); - private DefaultSheetCalibration.Builder[] shcb_ = new DefaultSheetCalibration.Builder[2]; - private DefaultSliceCalibration.Builder[] slcb_ = new DefaultSliceCalibration.Builder[2]; + private SheetCalibration.Builder[] shcb_ = new DefaultSheetCalibration.Builder[2]; + private SliceCalibration.Builder[] slcb_ = new DefaultSliceCalibration.Builder[2]; private AcquisitionMode acquisitionMode_ = AcquisitionMode.NO_SCAN; private CameraMode cameraMode_ = CameraMode.EDGE; @@ -351,7 +356,7 @@ public ChannelSettings.Builder channelBuilder() { return channelBuilder_; } - public DefaultTimingSettings.Builder timingBuilder() { + public TimingSettings.Builder timingBuilder() { return timingBuilder_; } @@ -359,11 +364,11 @@ public VolumeSettings.Builder volumeBuilder() { return volumeBuilder_; } - public DefaultSliceSettings.Builder sliceBuilder() { + public SliceSettings.Builder sliceBuilder() { return sliceBuilder_; } - public DefaultSliceSettingsLS.Builder sliceLSBuilder() { + public SliceSettingsLightSheet.Builder sliceLSBuilder() { return ssbLS_; } @@ -371,11 +376,11 @@ public StageScanSettings.Builder stageScanBuilder() { return stageScanBuilder_; } - public DefaultSheetCalibration.Builder sheetCalibrationBuilder(final int view) { + public SheetCalibration.Builder sheetCalibrationBuilder(final int view) { return shcb_[view-1]; } - public DefaultSliceCalibration.Builder sliceCalibrationBuilder(final int view) { + public SliceCalibration.Builder sliceCalibrationBuilder(final int view) { return slcb_[view-1]; } diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java index c49e280..37811ce 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java @@ -5,6 +5,7 @@ import org.micromanager.Studio; import org.micromanager.lightsheetmanager.LightSheetManager; import org.micromanager.lightsheetmanager.api.AcquisitionSettingsDispim; +import org.micromanager.lightsheetmanager.api.TimingSettings; import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.api.data.DispimDevice; import org.micromanager.lightsheetmanager.api.data.GeometryType; @@ -384,7 +385,7 @@ public double computeScanAcceleration(final double motorSpeed, DispimAcquisition // * gets the correct value for the slice timing's sliceDuration field based on other values of slice timing // slice duration is the max out of the scan time, laser time, and camera time - public double getSliceDuration(final DefaultTimingSettings s, final int scanNum) { + public double getSliceDuration(final TimingSettings s, final int scanNum) { return Math.max(Math.max( s.delayBeforeScan() + (s.scanDuration() * scanNum), // scan time s.delayBeforeLaser() + s.laserTriggerDuration() // laser time From 3f8732f556287da133fa0d4adae1db3b5273c9c1 Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 23:30:54 -0700 Subject: [PATCH 10/11] add copyBuilder() to dispim and scape settings --- .../lightsheetmanager/api/AcquisitionSettingsDispim.java | 2 +- .../lightsheetmanager/api/AcquisitionSettingsScape.java | 2 +- .../api/internal/DispimAcquisitionSettings.java | 9 ++++----- .../api/internal/ScapeAcquisitionSettings.java | 8 ++++---- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java index f5f11ec..3c27879 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java @@ -20,7 +20,7 @@ public interface AcquisitionSettingsDispim extends AcquisitionSettings { * * @return a builder to create a modified copy of these settings */ - //Builder copyBuilder(); + Builder copyBuilder(); /** * Returns the immutable DefaultChannelSettings instance. diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java index 36c956a..413fb74 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java @@ -19,7 +19,7 @@ public interface AcquisitionSettingsScape extends AcquisitionSettings { * * @return a builder to create a modified copy of these settings */ - //Builder copyBuilder(); + Builder copyBuilder(); /** * Returns the immutable ChannelSettings instance. diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java index 75044ab..645134c 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -75,11 +75,10 @@ public static Builder builder(DispimAcquisitionSettings settings) { return new Builder(settings); } -// @Override -// public DefaultAcquisitionSettingsDISPIM.Builder copyBuilder() { -// return new Builder(this); -// ); -// } + @Override + public Builder copyBuilder() { + return new Builder(this); + } @Override public ChannelSettings channels() { diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java index 99c3422..e506e5e 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java @@ -69,10 +69,10 @@ public static Builder builder(ScapeAcquisitionSettings settings) { return new Builder(settings); } -// @Override -// public DefaultAcquisitionSettingsSCAPE.Builder copyBuilder() { -// return new Builder(this); -// } + @Override + public Builder copyBuilder() { + return new Builder(this); + } @Override public ChannelSettings channels() { From 20f5687cb8238e3e12d811861b28f35fbb9e0806 Mon Sep 17 00:00:00 2001 From: Brandon Date: Mon, 23 Mar 2026 23:43:48 -0700 Subject: [PATCH 11/11] add imaging camera order to dispim settings --- .../api/AcquisitionSettingsDispim.java | 23 ++++++---- .../api/AcquisitionSettingsScape.java | 5 --- .../internal/DispimAcquisitionSettings.java | 42 +++++++++++++------ .../internal/ScapeAcquisitionSettings.java | 2 +- 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java index 3c27879..7bfbebf 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java @@ -1,13 +1,7 @@ package org.micromanager.lightsheetmanager.api; +import org.micromanager.lightsheetmanager.api.data.CameraData; import org.micromanager.lightsheetmanager.api.data.CameraMode; -import org.micromanager.lightsheetmanager.api.internal.DefaultChannelSettings; -import org.micromanager.lightsheetmanager.api.internal.DefaultSheetCalibration; -import org.micromanager.lightsheetmanager.api.internal.DefaultSliceCalibration; -import org.micromanager.lightsheetmanager.api.internal.DefaultSliceSettings; -import org.micromanager.lightsheetmanager.api.internal.DefaultSliceSettingsLS; -import org.micromanager.lightsheetmanager.api.internal.DefaultTimingSettings; -import org.micromanager.lightsheetmanager.api.internal.DefaultVolumeSettings; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; /** @@ -92,6 +86,13 @@ public interface AcquisitionSettingsDispim extends AcquisitionSettings { */ CameraMode cameraMode(); + /** + * Returns the imaging camera order. + * + * @return the imaging camera order + */ + CameraData[] imagingCameraOrder(); + /** * Returns true if using time points. * @@ -161,6 +162,14 @@ interface Builder> extends AcquisitionS */ T cameraMode(final CameraMode cameraMode); + /** + * Sets the imaging camera order. + * + * @param order the imaging camera order + * @return {@code this} builder + */ + T imagingCameraOrder(final CameraData[] order); + /** * Sets the acquisition to use time points. * diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java index 413fb74..0e58f32 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java @@ -3,11 +3,6 @@ import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; import org.micromanager.lightsheetmanager.api.data.CameraData; import org.micromanager.lightsheetmanager.api.data.CameraMode; -import org.micromanager.lightsheetmanager.api.internal.DefaultSheetCalibration; -import org.micromanager.lightsheetmanager.api.internal.DefaultSliceCalibration; -import org.micromanager.lightsheetmanager.api.internal.DefaultSliceSettings; -import org.micromanager.lightsheetmanager.api.internal.DefaultTimingSettings; -import org.micromanager.lightsheetmanager.api.internal.DefaultVolumeSettings; /** * Acquisition settings for SCAPE microscopes. diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java index 645134c..4df088a 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -9,6 +9,7 @@ import org.micromanager.lightsheetmanager.api.StageScanSettings; import org.micromanager.lightsheetmanager.api.TimingSettings; import org.micromanager.lightsheetmanager.api.VolumeSettings; +import org.micromanager.lightsheetmanager.api.data.CameraData; import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; @@ -27,7 +28,9 @@ public class DispimAcquisitionSettings extends BaseAcquisitionSettings implement private final SliceCalibration[] sliceCalibrations_; private final AcquisitionMode acquisitionMode_; + private final CameraMode cameraMode_; + private final CameraData[] imagingCameraOrder_; private final boolean useTimePoints_; private final boolean useMultiplePositions_; @@ -56,6 +59,7 @@ private DispimAcquisitionSettings(Builder builder) { } acquisitionMode_ = builder.acquisitionMode_; cameraMode_ = builder.cameraMode_; + imagingCameraOrder_ = builder.imagingCameraOrder_.clone(); useTimePoints_ = builder.useTimePoints_; useMultiplePositions_ = builder.useMultiplePositions_; useHardwareTimePoints_ = builder.useHardwareTimePoints_; @@ -130,6 +134,11 @@ public CameraMode cameraMode() { return cameraMode_; } + @Override + public CameraData[] imagingCameraOrder() { + return imagingCameraOrder_; + } + @Override public boolean isUsingTimePoints() { return useTimePoints_; @@ -190,7 +199,7 @@ public boolean equals(Object obj) { // Objects.equals(sliceCalibration_, other.sliceCalibration_) && acquisitionMode_ == other.acquisitionMode_ && cameraMode_ == other.cameraMode_ && - // Arrays.equals(imagingCameraOrder_, other.imagingCameraOrder_) && + Arrays.equals(imagingCameraOrder_, other.imagingCameraOrder_) && useTimePoints_ == other.useTimePoints_ && useMultiplePositions_ == other.useMultiplePositions_ && useHardwareTimePoints_ == other.useHardwareTimePoints_ && @@ -214,7 +223,7 @@ public int hashCode() { // sliceCalibration_, acquisitionMode_, cameraMode_, - //Arrays.hashCode(imagingCameraOrder_), + Arrays.hashCode(imagingCameraOrder_), useTimePoints_, useMultiplePositions_, useHardwareTimePoints_, @@ -246,7 +255,9 @@ public static class Builder private SliceCalibration.Builder[] slcb_ = new DefaultSliceCalibration.Builder[2]; private AcquisitionMode acquisitionMode_ = AcquisitionMode.NO_SCAN; + private CameraMode cameraMode_ = CameraMode.EDGE; + private CameraData[] imagingCameraOrder_ = {}; private boolean useTimePoints_ = false; private boolean useMultiplePositions_ = false; @@ -278,16 +289,17 @@ public Builder(final DispimAcquisitionSettings settings) { slcb_[i] = settings.sliceCalibrations_[i].copyBuilder(); shcb_[i] = settings.sheetCalibrations_[i].copyBuilder(); } - acquisitionMode_ = settings.acquisitionMode_; - cameraMode_ = settings.cameraMode_; - useTimePoints_ = settings.useTimePoints_; - useMultiplePositions_ = settings.useMultiplePositions_; - useHardwareTimePoints_ = settings.useHardwareTimePoints_; - useAdvancedTiming_ = settings.useAdvancedTiming_; - numTimePoints_ = settings.numTimePoints_; - timePointInterval_ = settings.timePointInterval_; - postMoveDelay_ = settings.postMoveDelay_; - liveScanPeriod_ = settings.liveScanPeriod_; + acquisitionMode_ = settings.acquisitionMode(); + cameraMode_ = settings.cameraMode(); + imagingCameraOrder_ = settings.imagingCameraOrder(); + useTimePoints_ = settings.isUsingTimePoints(); + useMultiplePositions_ = settings.isUsingMultiplePositions(); + useHardwareTimePoints_ = settings.isUsingHardwareTimePoints(); + useAdvancedTiming_ = settings.isUsingAdvancedTiming(); + numTimePoints_ = settings.numTimePoints(); + timePointInterval_ = settings.timePointInterval(); + postMoveDelay_ = settings.postMoveDelay(); + liveScanPeriod_ = settings.liveScanPeriod(); } @Override @@ -296,6 +308,12 @@ public Builder acquisitionMode(final AcquisitionMode mode) { return this; } + @Override + public Builder imagingCameraOrder(final CameraData[] order) { + imagingCameraOrder_ = order; + return this; + } + @Override public Builder cameraMode(final CameraMode mode) { cameraMode_ = mode; diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java index e506e5e..a73abe5 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java @@ -50,7 +50,7 @@ private ScapeAcquisitionSettings(Builder builder) { sliceCalibration_ = builder.sliceCalibrationBuilder().build(); acquisitionMode_ = builder.acquisitionMode_; cameraMode_ = builder.cameraMode_; - imagingCameraOrder_ = builder.imagingCameraOrder_; + imagingCameraOrder_ = builder.imagingCameraOrder_.clone(); useTimePoints_ = builder.useTimePoints_; useMultiplePositions_ = builder.useMultiplePositions_; useHardwareTimePoints_ = builder.useHardwareTimePoints_;