diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettings.java index af3c6871..8d960ee9 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettings.java @@ -115,5 +115,5 @@ interface Builder> { * * @return the autofocus settings */ - DefaultAutofocusSettings autofocusSettings(); + DefaultAutofocusSettings autofocus(); } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java index 38b7c5d9..02196256 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsDispim.java @@ -27,7 +27,7 @@ public interface AcquisitionSettingsDispim extends AcquisitionSettings { * * @return immutable DefaultChannelSettings instance. */ - DefaultChannelSettings channels(); + ChannelSettings channels(); /** * Returns the immutable DefaultTimingSettings instance. @@ -100,13 +100,6 @@ public interface AcquisitionSettingsDispim extends AcquisitionSettings { */ boolean isUsingTimePoints(); - /** - * Returns true if using autofocus. - * - * @return true if using autofocus. - */ - boolean isUsingAutofocus(); - /** * Returns true if using multiple positions. * @@ -121,13 +114,6 @@ public interface AcquisitionSettingsDispim extends AcquisitionSettings { */ boolean isUsingHardwareTimePoints(); - /** - * Returns true if using stage scanning. - * - * @return true if using stage scanning. - */ - boolean isUsingStageScanning(); - /** * Returns true if using advanced timing settings. * @@ -184,14 +170,6 @@ interface Builder> extends AcquisitionS */ T useTimePoints(final boolean state); - /** - * Sets the acquisition to use autofocus. - * - * @param state true to use autofocus - * @return {@code this} builder - */ - T useAutofocus(final boolean state); - /** * Sets the acquisition to use multiple positions. * @@ -208,14 +186,6 @@ interface Builder> extends AcquisitionS */ T useHardwareTimePoints(final boolean state); - /** - * Sets the acquisition to use stage scanning. - * - * @param state true to use stage scanning - * @return {@code this} builder - */ - T useStageScanning(final boolean state); - /** * Sets the acquisition to use advanced timing settings. * diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java index ce4992a3..fb0498f4 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettingsScape.java @@ -3,7 +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.DefaultChannelSettings; import org.micromanager.lightsheetmanager.api.internal.DefaultSheetCalibration; import org.micromanager.lightsheetmanager.api.internal.DefaultSliceCalibration; import org.micromanager.lightsheetmanager.api.internal.DefaultSliceSettings; @@ -27,7 +26,7 @@ public interface AcquisitionSettingsScape extends AcquisitionSettings { * * @return immutable DefaultChannelSettings instance. */ - DefaultChannelSettings channels(); + ChannelSettings channels(); /** * Returns the immutable DefaultTimingSettings instance. @@ -62,14 +61,14 @@ public interface AcquisitionSettingsScape extends AcquisitionSettings { * * @return immutable DefaultSheetCalibration instance. */ - DefaultSheetCalibration sheetCalibration(final int view); + DefaultSheetCalibration sheetCalibration(); /** * Returns the immutable DefaultSliceCalibration instance. * * @return immutable DefaultSliceCalibration instance. */ - DefaultSliceCalibration sliceCalibration(final int view); + DefaultSliceCalibration sliceCalibration(); /** * Returns the acquisition mode. @@ -99,13 +98,6 @@ public interface AcquisitionSettingsScape extends AcquisitionSettings { */ boolean isUsingTimePoints(); - /** - * Returns true if using autofocus. - * - * @return true if using autofocus. - */ - boolean isUsingAutofocus(); - /** * Returns true if using multiple positions. * @@ -120,13 +112,6 @@ public interface AcquisitionSettingsScape extends AcquisitionSettings { */ boolean isUsingHardwareTimePoints(); - /** - * Returns true if using stage scanning. - * - * @return true if using stage scanning. - */ - boolean isUsingStageScanning(); - /** * Returns true if using advanced timing settings. * @@ -160,26 +145,26 @@ interface Builder> extends AcquisitionS /** * Sets the acquisition mode. * - * @param acqMode the acquisition mode + * @param mode the acquisition mode * @return {@code this} builder */ - T acquisitionMode(final AcquisitionMode acqMode); + T acquisitionMode(final AcquisitionMode mode); /** * Sets the camera mode. * - * @param cameraMode the camera mode. + * @param mode the camera mode. * @return {@code this} builder */ - T cameraMode(final CameraMode cameraMode); + T cameraMode(final CameraMode mode); /** * Sets the imaging camera order. * - * @param cameraOrder the imaging camera order + * @param order the imaging camera order * @return {@code this} builder */ - T imagingCameraOrder(final CameraData[] cameraOrder); + T imagingCameraOrder(final CameraData[] order); /** * Sets the acquisition to use time points. @@ -189,14 +174,6 @@ interface Builder> extends AcquisitionS */ T useTimePoints(final boolean state); - /** - * Sets the acquisition to use autofocus. - * - * @param state true to use autofocus - * @return {@code this} builder - */ - T useAutofocus(final boolean state); - /** * Sets the acquisition to use multiple positions. * diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AutofocusSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/AutofocusSettings.java index 19641778..035df4c0 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AutofocusSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AutofocusSettings.java @@ -1,17 +1,22 @@ package org.micromanager.lightsheetmanager.api; - import org.micromanager.lightsheetmanager.api.data.AutofocusMode; import org.micromanager.lightsheetmanager.api.data.AutofocusType; /** * Autofocus settings. - * */ public interface AutofocusSettings { interface Builder { + /** + * Return true if channels are enabled. + * + * @param state true if channels are enabled + */ + Builder enabled(final boolean state); + /** * Sets the number of images to capture in the autofocus routine. * @@ -106,6 +111,13 @@ interface Builder { */ Builder copyBuilder(); + /** + * Return true if channels are enabled. + * + * @return true if channels are enabled + */ + boolean enabled(); + /** * Returns the number of images used in for autofocus routine. * diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/ChannelSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/ChannelSettings.java index 82533a34..c940376f 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/ChannelSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/ChannelSettings.java @@ -3,8 +3,12 @@ import org.micromanager.lightsheetmanager.api.data.ChannelMode; import org.micromanager.lightsheetmanager.model.channels.ChannelSpec; +import java.util.Map; + public interface ChannelSettings { + Builder copyBuilder(); + boolean enabled(); int count(); @@ -21,6 +25,13 @@ public interface ChannelSettings { ChannelSpec[] data(); + /** + * Returns an immutable shallow copy of the map. + * + * @return an immutable shallow copy of the map + */ + Map groups(); + interface Builder { Builder enabled(final boolean state); diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/SliceSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/SliceSettings.java index 5d9f4961..f66bd108 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/SliceSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/SliceSettings.java @@ -8,7 +8,7 @@ interface Builder { * * @param slicePeriodMs the slice period in milliseconds */ - Builder slicePeriod(final double slicePeriodMs); + Builder period(final double slicePeriodMs); /** * Sets the sample exposure time in milliseconds. @@ -22,7 +22,7 @@ interface Builder { * * @param state true to minimize the slice period */ - Builder minimizeSlicePeriod(final boolean state); + Builder minimizePeriod(final boolean state); /** * Creates an immutable instance of SliceSettings @@ -44,7 +44,7 @@ interface Builder { * * @return the slice period in milliseconds */ - double slicePeriod(); + double period(); /** * Returns the sample exposure time in milliseconds. @@ -58,5 +58,5 @@ interface Builder { * * @return true if slice period is minimized */ - boolean isSlicePeriodMinimized(); + boolean periodMinimized(); } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/StageScanSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/StageScanSettings.java index 2300f3cf..81ea9ab4 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/StageScanSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/StageScanSettings.java @@ -16,6 +16,13 @@ public interface StageScanSettings { */ Builder copyBuilder(); + /** + * Returns true if the autofocus settings are enabled. + * + * @return true if the autofocus settings are enabled + */ + boolean enabled(); + /** * Returns the acceleration factor. * @@ -67,6 +74,14 @@ public interface StageScanSettings { interface Builder { + /** + * Enable or disable the autofocus settings. + * + * @param state true to enable stage scanning + * @return {@code this} builder + */ + Builder enabled(final boolean state); + /** * Sets the acceleration factor. *

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 8faebf48..76b91f0c 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java @@ -2,7 +2,9 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializer; import org.micromanager.lightsheetmanager.api.AcquisitionSettings; +import org.micromanager.lightsheetmanager.api.ChannelSettings; import org.micromanager.lightsheetmanager.api.StageScanSettings; import org.micromanager.lightsheetmanager.model.DataStorage; @@ -24,13 +26,13 @@ public abstract static class Builder> implements Acquisitio public Builder() { } - public Builder(final BaseAcquisitionSettings settings) { - saveDirectory_ = settings.saveDirectory_; - saveNamePrefix_ = settings.saveNamePrefix_; - saveDuringAcq_ = settings.saveDuringAcq_; - demoMode_ = settings.demoMode_; - saveMode_ = settings.saveMode_; - afBuilder_ = settings.autofocusSettings_.copyBuilder(); + public Builder(final AcquisitionSettings settings) { + saveDirectory_ = settings.saveDirectory(); + saveNamePrefix_ = settings.saveNamePrefix(); + saveDuringAcq_ = settings.isSavingImagesDuringAcquisition(); + demoMode_ = settings.demoMode(); + saveMode_ = settings.saveMode(); + afBuilder_ = settings.autofocus().copyBuilder(); } /** @@ -122,7 +124,7 @@ public DefaultAutofocusSettings.Builder autofocusSettingsBuilder() { private final boolean demoMode_; private final DataStorage.SaveMode saveMode_; - private final DefaultAutofocusSettings autofocusSettings_; + private final DefaultAutofocusSettings autofocus_; // public DefaultAcquisitionSettings() { // saveNamePrefix_ = ""; @@ -136,7 +138,7 @@ protected BaseAcquisitionSettings(Builder builder) { saveDuringAcq_ = builder.saveDuringAcq_; demoMode_ = builder.demoMode_; saveMode_ = builder.saveMode_; - autofocusSettings_ = builder.afBuilder_.build(); + autofocus_ = builder.afBuilder_.build(); } /** @@ -195,8 +197,8 @@ public DataStorage.SaveMode saveMode() { * @return the autofocus settings */ @Override - public DefaultAutofocusSettings autofocusSettings() { - return autofocusSettings_; + public DefaultAutofocusSettings autofocus() { + return autofocus_; } @Override @@ -218,11 +220,16 @@ public String toPrettyJson() { public static T fromJson(final String json, final Class cls) { Gson gson = new GsonBuilder() - .registerTypeAdapter(StageScanSettings.class, (com.google.gson.JsonDeserializer) + .registerTypeAdapter(StageScanSettings.class, (JsonDeserializer) (jsonElement, typeOfT, context) -> { // This forces Gson to use the concrete implementation class return context.deserialize(jsonElement, DefaultStageScanSettings.class); }) + .registerTypeAdapter(ChannelSettings.class, (JsonDeserializer) + (jsonElement, typeOfT, context) -> { + // This forces Gson to use the concrete implementation class + return context.deserialize(jsonElement, DefaultChannelSettings.class); + }) .create(); return gson.fromJson(json, cls); } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultAutofocusSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultAutofocusSettings.java index 8ace1ef7..061cf7ac 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultAutofocusSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultAutofocusSettings.java @@ -12,6 +12,7 @@ public static Builder builder() { public static class Builder implements AutofocusSettings.Builder { + private boolean enabled_ = false; private int numImages_ = 10; private double stepSizeUm_ = 1.0; //private double toleranceUm_ = 1.0; @@ -30,6 +31,7 @@ private Builder() { } private Builder(final DefaultAutofocusSettings settings) { + enabled_ = settings.enabled_; numImages_ = settings.numImages_; stepSizeUm_ = settings.stepSizeUm_; //toleranceUm_ = autofocusSettings.toleranceUm_; @@ -45,13 +47,19 @@ private Builder(final DefaultAutofocusSettings settings) { // autoUpdateMaxOffset_ = autofocusSettings.autoUpdateMaxOffset_; } + @Override + public Builder enabled(final boolean state) { + enabled_ = state; + return this; + } + /** * Sets the number of images to capture in the autofocus routine. * * @param numImages the number of images */ @Override - public AutofocusSettings.Builder numImages(int numImages) { + public Builder numImages(final int numImages) { numImages_ = numImages; return this; } @@ -62,7 +70,7 @@ public AutofocusSettings.Builder numImages(int numImages) { * @param stepSize the step size in microns */ @Override - public AutofocusSettings.Builder stepSizeUm(final double stepSize) { + public Builder stepSizeUm(final double stepSize) { stepSizeUm_ = stepSize; return this; } @@ -73,7 +81,7 @@ public AutofocusSettings.Builder stepSizeUm(final double stepSize) { // * @param value the tolerance in microns // */ // @Override -// public AutofocusSettings.Builder toleranceUm(final double value) { +// public Builder toleranceUm(final double value) { // toleranceUm_ = value; // return this; // } @@ -84,7 +92,7 @@ public AutofocusSettings.Builder stepSizeUm(final double stepSize) { * @param state {@code true} to show images */ @Override - public AutofocusSettings.Builder showImages(boolean state) { + public Builder showImages(boolean state) { showImages_ = state; return this; } @@ -95,7 +103,7 @@ public AutofocusSettings.Builder showImages(boolean state) { * @param state {@code true} to show the graph */ @Override - public AutofocusSettings.Builder showGraph(boolean state) { + public Builder showGraph(boolean state) { showGraph_ = state; return this; } @@ -106,7 +114,7 @@ public AutofocusSettings.Builder showGraph(boolean state) { * @param mode the autofocus mode */ @Override - public AutofocusSettings.Builder mode(final AutofocusMode mode) { + public Builder mode(final AutofocusMode mode) { mode_ = mode; return this; } @@ -117,7 +125,7 @@ public AutofocusSettings.Builder mode(final AutofocusMode mode) { * @param type the scoring algorithm */ @Override - public AutofocusSettings.Builder scoringMethod(final AutofocusType type) { + public Builder scoringMethod(final AutofocusType type) { scoringMethod_ = type; return this; } @@ -128,7 +136,7 @@ public AutofocusSettings.Builder scoringMethod(final AutofocusType type) { * @param channel the channel to run autofocus on */ @Override - public AutofocusSettings.Builder channel(final String channel) { + public Builder channel(final String channel) { channel_ = channel; return this; } @@ -139,7 +147,7 @@ public AutofocusSettings.Builder channel(final String channel) { // * @param state true to enable autofocus every stage pass // */ // @Override -// public AutofocusSettings.Builder useEveryStagePass(final boolean state) { +// public Builder useEveryStagePass(final boolean state) { // useEveryStagePass_ = state; // return this; // } @@ -150,25 +158,25 @@ public AutofocusSettings.Builder channel(final String channel) { // * @param state true or false // */ // @Override -// public AutofocusSettings.Builder useBeforeAcquisition(final boolean state) { +// public Builder useBeforeAcquisition(final boolean state) { // useBeforeAcquisition_ = state; // return this; // } // @Override -// public AutofocusSettings.Builder maxOffset(final double maxOffset) { +// public Builder maxOffset(final double maxOffset) { // maxOffset_ = maxOffset; // return this; // } // // @Override -// public AutofocusSettings.Builder autoUpdateOffset(final boolean state) { +// public Builder autoUpdateOffset(final boolean state) { // autoUpdateOffset_ = state; // return this; // } // // @Override -// public AutofocusSettings.Builder autoUpdateMaxOffset(final double um) { +// public Builder autoUpdateMaxOffset(final double um) { // autoUpdateMaxOffset_ = um; // return this; // } @@ -185,6 +193,7 @@ public DefaultAutofocusSettings build() { } + private final boolean enabled_; private final int numImages_; private final double stepSizeUm_; // private final double toleranceUm_; @@ -200,6 +209,7 @@ public DefaultAutofocusSettings build() { // private final double autoUpdateMaxOffset_; private DefaultAutofocusSettings(Builder builder) { + enabled_ = builder.enabled_; numImages_ = builder.numImages_; stepSizeUm_ = builder.stepSizeUm_; // toleranceUm_ = builder.toleranceUm_; @@ -219,6 +229,11 @@ public Builder copyBuilder() { return new Builder(this); } + @Override + public boolean enabled() { + return enabled_; + } + /** * Returns the number of images used for autofocus routine. * diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultChannelSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultChannelSettings.java index a96a72b6..6f691557 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultChannelSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultChannelSettings.java @@ -5,61 +5,13 @@ import org.micromanager.lightsheetmanager.model.channels.ChannelSpec; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; +import java.util.Map; +import java.util.Objects; public class DefaultChannelSettings implements ChannelSettings { - public static Builder builder() { - return new Builder(); - } - - public static class Builder implements ChannelSettings.Builder { - - private boolean enabled_ = false; - private String group_ = ""; - private ChannelMode mode_ = ChannelMode.VOLUME; - private HashMap groups_ = new HashMap<>(); - - private Builder() { - } - - public Builder(final DefaultChannelSettings settings) { - enabled_ = settings.enabled_; - group_ = settings.group_; - mode_ = settings.mode_; - groups_ = new HashMap<>(settings.groups_); // deep copy - } - - @Override - public ChannelSettings.Builder enabled(final boolean state) { - enabled_ = state; - return this; - } - - @Override - public ChannelSettings.Builder group(final String group) { - group_ = group; - return this; - } - - @Override - public ChannelSettings.Builder mode(final ChannelMode mode) { - mode_ = mode; - return this; - } - - @Override - public ChannelSettings.Builder data(final ChannelSpec[] channels) { - groups_.put(group_, channels); - return this; - } - - @Override - public DefaultChannelSettings build() { - return new DefaultChannelSettings(this); - } - } - private final boolean enabled_; private final String group_; private final ChannelMode mode_; @@ -75,6 +27,21 @@ private DefaultChannelSettings(Builder builder) { groups_ = builder.groups_; } + // Note: used by GSON library for deserialization + private DefaultChannelSettings() { + this(new Builder()); + } + + public static Builder builder() { + return new Builder(); + } + + public static Builder builder(ChannelSettings settings) { + Objects.requireNonNull(settings, "Cannot copy from null settings"); + return new Builder(settings); + } + + @Override public Builder copyBuilder() { return new Builder(this); } @@ -165,4 +132,92 @@ public ChannelSpec[] data() { return groups_.getOrDefault(group_, EMPTY_CHANNELS); } + @Override + public Map groups() { + return Collections.unmodifiableMap(groups_); + } + + // TODO: add groups_ to toString, equals, and hashCode methods + + @Override + public String toString() { + return String.format("%s[enabled=%s, group=%s, mode=%s]", + getClass().getSimpleName(), enabled_, group_, mode_); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + DefaultChannelSettings other = (DefaultChannelSettings) obj; + return enabled_ == other.enabled_ + && group_.equals(other.group_) + && mode_ == other.mode_; + } + + @Override + public int hashCode() { + return Objects.hash(enabled_, group_, mode_); + } + + public static class Builder implements ChannelSettings.Builder { + + private boolean enabled_ = false; + private String group_ = ""; + private ChannelMode mode_ = ChannelMode.VOLUME; + private HashMap groups_ = new HashMap<>(); + + private Builder() { + } + + public Builder(final ChannelSettings settings) { + enabled_ = settings.enabled(); + group_ = settings.group(); + mode_ = settings.mode(); + groups_ = new HashMap<>(); + // deep copy + settings.groups().forEach((name, channels) -> { + ChannelSpec[] array = new ChannelSpec[channels.length]; + for (int i = 0; i < channels.length; i++) { + array[i] = new ChannelSpec(channels[i]); + } + groups_.put(name, array); + }); + } + + @Override + public Builder enabled(final boolean state) { + enabled_ = state; + return this; + } + + @Override + public Builder group(final String group) { + group_ = group; + return this; + } + + @Override + public Builder mode(final ChannelMode mode) { + mode_ = mode; + return this; + } + + @Override + public Builder data(final ChannelSpec[] channels) { + groups_.put(group_, channels); + return this; + } + + @Override + public DefaultChannelSettings build() { + return new DefaultChannelSettings(this); + } + + } + } 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 63d45865..0a0760c2 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSheetCalibration.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSheetCalibration.java @@ -2,12 +2,114 @@ import org.micromanager.lightsheetmanager.api.SheetCalibration; +import java.util.Objects; + public class DefaultSheetCalibration implements SheetCalibration { + private final double imagingCenter_; + private final double sheetWidth_; + private final double sheetOffset_; + private final boolean useAutoSheetWidth_; + private final double autoSheetWidthPerPixel_; + private final double scanSpeed_; + private final double scanOffset_; + + private DefaultSheetCalibration(Builder builder) { + imagingCenter_ = builder.imagingCenter_; + sheetWidth_ = builder.sheetWidth_; + sheetOffset_ = builder.sheetOffset_; + useAutoSheetWidth_ = builder.useAutoSheetWidth_; + autoSheetWidthPerPixel_ = builder.autoSheetWidthPerPixel_; + scanSpeed_ = builder.scanSpeed_; + scanOffset_ = builder.scanOffset_; + } + public static Builder builder() { return new Builder(); } + public static Builder builder(SheetCalibration settings) { + Objects.requireNonNull(settings, "Cannot copy from null settings"); + return new Builder(settings); + } + + @Override + public Builder copyBuilder() { + return new Builder(this); + } + + @Override + public double imagingCenter() { + return imagingCenter_; + } + + // standard camera modes + + @Override + public double sheetWidth() { + return sheetWidth_; + } + + @Override + public double sheetOffset() { + return sheetOffset_; + } + + @Override + public boolean isUsingAutoSheetWidth() { + return useAutoSheetWidth_; + } + + @Override + public double autoSheetWidthPerPixel() { + return autoSheetWidthPerPixel_; + } + + // virtual slit camera mode + + @Override + public double scanSpeed() { + return scanSpeed_; + } + + @Override + public double scanOffset() { + return scanOffset_; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + DefaultSheetCalibration other = (DefaultSheetCalibration) obj; + return Double.compare(imagingCenter_, other.imagingCenter_) == 0 && + Double.compare(sheetWidth_, other.sheetWidth_) == 0 && + Double.compare(sheetOffset_, other.sheetOffset_) == 0 && + useAutoSheetWidth_ == other.useAutoSheetWidth_ && + Double.compare(autoSheetWidthPerPixel_, other.autoSheetWidthPerPixel_) == 0 && + Double.compare(scanSpeed_, other.scanSpeed_) == 0 && + Double.compare(scanOffset_, other.scanOffset_) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(imagingCenter_, sheetWidth_, sheetOffset_, + useAutoSheetWidth_, autoSheetWidthPerPixel_, scanSpeed_, scanOffset_); + } + + @Override + public String toString() { + return String.format("%s[imagingCenter=%s, sheetWidth=%s, sheetOffset=%s, " + + "useAutoSheetWidth=%s, autoSheetWidthPerPixel=%s, scanSpeed=%s, scanOffset=%s]", + getClass().getSimpleName(), + imagingCenter_, sheetWidth_, sheetOffset_, + useAutoSheetWidth_, autoSheetWidthPerPixel_, scanSpeed_, scanOffset_); + } + public static class Builder implements SheetCalibration.Builder { private double imagingCenter_ = 0.0; @@ -21,44 +123,44 @@ public static class Builder implements SheetCalibration.Builder { private Builder() { } - private Builder(final DefaultSheetCalibration settings) { - imagingCenter_ = settings.imagingCenter_; - sheetWidth_ = settings.sheetWidth_; - sheetOffset_ = settings.sheetOffset_; - useAutoSheetWidth_ = settings.useAutoSheetWidth_; - autoSheetWidthPerPixel_ = settings.autoSheetWidthPerPixel_; - scanSpeed_ = settings.scanSpeed_; - scanOffset_ = settings.scanOffset_; + private Builder(final SheetCalibration settings) { + imagingCenter_ = settings.imagingCenter(); + sheetWidth_ = settings.sheetWidth(); + sheetOffset_ = settings.sheetOffset(); + useAutoSheetWidth_ = settings.isUsingAutoSheetWidth(); + autoSheetWidthPerPixel_ = settings.autoSheetWidthPerPixel(); + scanSpeed_ = settings.scanSpeed(); + scanOffset_ = settings.scanOffset(); } // normal camera modes @Override - public SheetCalibration.Builder imagingCenter(double center) { + public Builder imagingCenter(double center) { imagingCenter_ = center; return this; } @Override - public SheetCalibration.Builder sheetWidth(double width) { + public Builder sheetWidth(double width) { sheetWidth_ = width; return this; } @Override - public SheetCalibration.Builder sheetOffset(double offset) { + public Builder sheetOffset(double offset) { sheetOffset_ = offset; return this; } @Override - public SheetCalibration.Builder useAutoSheetWidth(boolean state) { + public Builder useAutoSheetWidth(boolean state) { useAutoSheetWidth_ = state; return this; } @Override - public SheetCalibration.Builder autoSheetWidthPerPixel(double widthPerPixel) { + public Builder autoSheetWidthPerPixel(double widthPerPixel) { autoSheetWidthPerPixel_ = widthPerPixel; return this; } @@ -66,13 +168,13 @@ public SheetCalibration.Builder autoSheetWidthPerPixel(double widthPerPixel) { // virtual slit camera mode @Override - public SheetCalibration.Builder scanSpeed(double speed) { + public Builder scanSpeed(double speed) { scanSpeed_ = speed; return this; } @Override - public SheetCalibration.Builder scanOffset(double offset) { + public Builder scanOffset(double offset) { scanOffset_ = offset; return this; } @@ -81,68 +183,7 @@ public SheetCalibration.Builder scanOffset(double offset) { public DefaultSheetCalibration build() { return new DefaultSheetCalibration(this); } - } - - private final double imagingCenter_; - private final double sheetWidth_; - private final double sheetOffset_; - private final boolean useAutoSheetWidth_; - private final double autoSheetWidthPerPixel_; - private final double scanSpeed_; - private final double scanOffset_; - - private DefaultSheetCalibration(Builder builder) { - imagingCenter_ = builder.imagingCenter_; - sheetWidth_ = builder.sheetWidth_; - sheetOffset_ = builder.sheetOffset_; - useAutoSheetWidth_ = builder.useAutoSheetWidth_; - autoSheetWidthPerPixel_ = builder.autoSheetWidthPerPixel_; - scanSpeed_ = builder.scanSpeed_; - scanOffset_ = builder.scanOffset_; - } - @Override - public DefaultSheetCalibration.Builder copyBuilder() { - return new Builder(this); - } - - @Override - public double imagingCenter() { - return imagingCenter_; - } - - // standard camera modes - - @Override - public double sheetWidth() { - return sheetWidth_; - } - - @Override - public double sheetOffset() { - return sheetOffset_; - } - - @Override - public boolean isUsingAutoSheetWidth() { - return useAutoSheetWidth_; - } - - @Override - public double autoSheetWidthPerPixel() { - return autoSheetWidthPerPixel_; - } - - // virtual slit camera mode - - @Override - public double scanSpeed() { - return scanSpeed_; - } - - @Override - public double scanOffset() { - return scanOffset_; } } 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 fb85a319..c2a75d61 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceCalibration.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceCalibration.java @@ -2,12 +2,66 @@ import org.micromanager.lightsheetmanager.api.SliceCalibration; +import java.util.Objects; + public class DefaultSliceCalibration implements SliceCalibration { + private final double sliceSlope_; + private final double sliceOffset_; + + private DefaultSliceCalibration(Builder builder) { + sliceSlope_ = builder.sliceSlope_; + sliceOffset_ = builder.sliceOffset_; + } + public static Builder builder() { return new Builder(); } + public static Builder builder(SliceCalibration settings) { + Objects.requireNonNull(settings, "Cannot copy from null settings"); + return new Builder(settings); + } + + @Override + public Builder copyBuilder() { + return new Builder(this); + } + + @Override + public double sliceSlope() { + return sliceSlope_; + } + + @Override + public double sliceOffset() { + return sliceOffset_; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + DefaultSliceCalibration other = (DefaultSliceCalibration) obj; + return Double.compare(sliceSlope_, other.sliceSlope_) == 0 && + Double.compare(sliceOffset_, other.sliceOffset_) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(sliceSlope_, sliceOffset_); + } + + @Override + public String toString() { + return String.format("%s[sliceSlope=%s, sliceOffset=%s]", + getClass().getSimpleName(), sliceSlope_, sliceOffset_); + } + public static class Builder implements SliceCalibration.Builder { private double sliceSlope_ = 0.0; @@ -22,13 +76,13 @@ private Builder(final SliceCalibration settings) { } @Override - public SliceCalibration.Builder sliceSlope(final double slope) { + public Builder sliceSlope(final double slope) { sliceSlope_ = slope; return this; } @Override - public SliceCalibration.Builder sliceOffset(final double offset) { + public Builder sliceOffset(final double offset) { sliceOffset_ = offset; return this; } @@ -37,29 +91,7 @@ public SliceCalibration.Builder sliceOffset(final double offset) { public DefaultSliceCalibration build() { return new DefaultSliceCalibration(this); } - } - - private final double sliceSlope_; - private final double sliceOffset_; - - private DefaultSliceCalibration(Builder builder) { - sliceSlope_ = builder.sliceSlope_; - sliceOffset_ = builder.sliceOffset_; - } - - @Override - public DefaultSliceCalibration.Builder copyBuilder() { - return new Builder(this); - } - - @Override - public double sliceSlope() { - return sliceSlope_; - } - @Override - public double sliceOffset() { - return sliceOffset_; } } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceSettings.java index ddee1218..0a9cb6d4 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceSettings.java @@ -2,42 +2,107 @@ import org.micromanager.lightsheetmanager.api.SliceSettings; +import java.util.Objects; + public class DefaultSliceSettings implements SliceSettings { + private final double period_; + private final double sampleExposure_; + private final boolean periodMinimized_; + + private DefaultSliceSettings(Builder builder) { + period_ = builder.period_; + sampleExposure_ = builder.sampleExposure_; + periodMinimized_ = builder.periodMinimized_; + } + public static Builder builder() { return new Builder(); } + public static Builder builder(SliceSettings settings) { + Objects.requireNonNull(settings, "Cannot copy from null settings"); + return new Builder(settings); + } + + @Override + public Builder copyBuilder() { + return new Builder(this); + } + + @Override + public double period() { + return period_; + } + + @Override + public double sampleExposure() { + return sampleExposure_; + } + + @Override + public boolean periodMinimized() { + return periodMinimized_; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + DefaultSliceSettings other = (DefaultSliceSettings) obj; + return Double.compare(period_, other.period_) == 0 && + Double.compare(sampleExposure_, other.sampleExposure_) == 0 && + periodMinimized_ == other.periodMinimized_; + } + + @Override + public int hashCode() { + return Objects.hash(period_, sampleExposure_, periodMinimized_); + } + + @Override + public String toString() { + return String.format( + "%s[period=%s, sampleExposure=%s, periodMinimized=%s]", + getClass().getSimpleName(), + period_, sampleExposure_, periodMinimized_ + ); + } + public static class Builder implements SliceSettings.Builder { - private double slicePeriod_ = 10.0; + private double period_ = 10.0; private double sampleExposure_ = 1.0; - private boolean minimizeSlicePeriod_ = false; + private boolean periodMinimized_ = false; private Builder() { } - private Builder(final DefaultSliceSettings settings) { - slicePeriod_ = settings.slicePeriod(); + private Builder(final SliceSettings settings) { + period_ = settings.period(); sampleExposure_ = settings.sampleExposure(); - minimizeSlicePeriod_ = settings.isSlicePeriodMinimized(); + periodMinimized_ = settings.periodMinimized(); } @Override - public SliceSettings.Builder slicePeriod(double slicePeriodMs) { - slicePeriod_ = slicePeriodMs; + public Builder period(double periodMs) { + period_ = periodMs; return this; } @Override - public SliceSettings.Builder sampleExposure(double exposureMs) { + public Builder sampleExposure(double exposureMs) { sampleExposure_ = exposureMs; return this; } @Override - public SliceSettings.Builder minimizeSlicePeriod(boolean state) { - minimizeSlicePeriod_ = state; + public Builder minimizePeriod(boolean state) { + periodMinimized_ = state; return this; } @@ -45,44 +110,7 @@ public SliceSettings.Builder minimizeSlicePeriod(boolean state) { public DefaultSliceSettings build() { return new DefaultSliceSettings(this); } - } - - private final double slicePeriod_; - private final double sampleExposure_; - private final boolean minimizeSlicePeriod_; - - private DefaultSliceSettings(Builder builder) { - slicePeriod_ = builder.slicePeriod_; - sampleExposure_ = builder.sampleExposure_; - minimizeSlicePeriod_ = builder.minimizeSlicePeriod_; - } - - @Override - public DefaultSliceSettings.Builder copyBuilder() { - return new Builder(this); - } - - @Override - public double slicePeriod() { - return slicePeriod_; - } - - @Override - public double sampleExposure() { - return sampleExposure_; - } - @Override - public boolean isSlicePeriodMinimized() { - return minimizeSlicePeriod_; } - @Override - public String toString() { - return String.format( - "%s[slicePeriod_=%s, sampleExposure_=%s, minimizeSlicePeriod_=%s]", - getClass().getSimpleName(), - slicePeriod_, sampleExposure_, minimizeSlicePeriod_ - ); - } } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceSettingsLS.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceSettingsLS.java index 846c9030..ddff878a 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceSettingsLS.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultSliceSettingsLS.java @@ -2,12 +2,85 @@ import org.micromanager.lightsheetmanager.api.SliceSettingsLightSheet; +import java.util.Objects; + public class DefaultSliceSettingsLS implements SliceSettingsLightSheet { + private final double scanResetTime_; + private final double scanSettleTime_; + private final double shutterWidth_; + private final double shutterSpeedFactor_; + + private DefaultSliceSettingsLS(Builder builder) { + scanResetTime_ = builder.scanResetTime_; + scanSettleTime_ = builder.scanSettleTime_; + shutterWidth_ = builder.shutterWidth_; + shutterSpeedFactor_ = builder.shutterSpeedFactor_; + } + public static Builder builder() { return new Builder(); } + public static Builder builder(SliceSettingsLightSheet settings) { + Objects.requireNonNull(settings, "Cannot copy from null settings"); + return new Builder(settings); + } + + @Override + public Builder copyBuilder() { + return new Builder(this); + } + + @Override + public double scanResetTime() { + return scanResetTime_; + } + + @Override + public double scanSettleTime() { + return scanSettleTime_; + } + + @Override + public double shutterWidth() { + return shutterWidth_; + } + + @Override + public double shutterSpeedFactor() { + return shutterSpeedFactor_; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + DefaultSliceSettingsLS other = (DefaultSliceSettingsLS) obj; + return Double.compare(scanResetTime_, other.scanResetTime_) == 0 && + Double.compare(scanSettleTime_, other.scanSettleTime_) == 0 && + Double.compare(shutterWidth_, other.shutterWidth_) == 0 && + Double.compare(shutterSpeedFactor_, other.shutterSpeedFactor_) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(scanResetTime_, scanSettleTime_, shutterWidth_, shutterSpeedFactor_); + } + + @Override + public String toString() { + return String.format( + "%s[scanResetTime=%s, scanSettleTime=%s, shutterWidth=%s, shutterSpeedFactor=%s]", + getClass().getSimpleName(), + scanResetTime_, scanSettleTime_, shutterWidth_, shutterSpeedFactor_ + ); + } + public static class Builder implements SliceSettingsLightSheet.Builder { private double scanResetTime_ = 3.0; @@ -18,7 +91,7 @@ public static class Builder implements SliceSettingsLightSheet.Builder { private Builder() { } - private Builder(DefaultSliceSettingsLS settings) { + private Builder(final SliceSettingsLightSheet settings) { scanResetTime_ = settings.scanResetTime(); scanSettleTime_ = settings.scanSettleTime(); shutterWidth_ = settings.shutterWidth(); @@ -26,25 +99,25 @@ private Builder(DefaultSliceSettingsLS settings) { } @Override - public SliceSettingsLightSheet.Builder shutterWidth(final double um) { + public Builder shutterWidth(final double um) { shutterWidth_ = um; return this; } @Override - public SliceSettingsLightSheet.Builder shutterSpeedFactor(final double factor) { + public Builder shutterSpeedFactor(final double factor) { shutterSpeedFactor_ = factor; return this; } @Override - public SliceSettingsLightSheet.Builder scanSettleTime(final double ms) { + public Builder scanSettleTime(final double ms) { scanSettleTime_ = ms; return this; } @Override - public SliceSettingsLightSheet.Builder scanResetTime(final double ms) { + public Builder scanResetTime(final double ms) { scanResetTime_ = ms; return this; } @@ -55,49 +128,4 @@ public DefaultSliceSettingsLS build() { } } - private final double scanResetTime_; - private final double scanSettleTime_; - private final double shutterWidth_; - private final double shutterSpeedFactor_; - - private DefaultSliceSettingsLS(Builder builder) { - scanResetTime_ = builder.scanResetTime_; - scanSettleTime_ = builder.scanSettleTime_; - shutterWidth_ = builder.shutterWidth_; - shutterSpeedFactor_ = builder.shutterSpeedFactor_; - } - - @Override - public DefaultSliceSettingsLS.Builder copyBuilder() { - return new Builder(this); - } - - @Override - public double scanResetTime() { - return scanResetTime_; - } - - @Override - public double scanSettleTime() { - return scanSettleTime_; - } - - @Override - public double shutterWidth() { - return shutterWidth_; - } - - @Override - public double shutterSpeedFactor() { - return shutterSpeedFactor_; - } - - @Override - public String toString() { - return String.format( - "%s[scanResetTime=%s, scanSettleTime=%s, shutterWidth=%s, shutterSpeedFactor=%s]", - getClass().getSimpleName(), - scanResetTime_, scanSettleTime_, shutterWidth_, shutterSpeedFactor_ - ); - } } diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultStageScanSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultStageScanSettings.java index 58256150..e6a27197 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultStageScanSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultStageScanSettings.java @@ -6,15 +6,7 @@ public class DefaultStageScanSettings implements StageScanSettings { - public static Builder builder() { - return new Builder(); - } - - public static Builder builder(StageScanSettings settings) { - Objects.requireNonNull(settings, "Cannot copy from null settings"); - return new Builder(settings); - } - + private final boolean enabled_; private final double accelerationFactor_; private final int overshootDistance_; private final double retraceSpeed_; @@ -24,6 +16,7 @@ public static Builder builder(StageScanSettings settings) { private final boolean fromNegativeDirection_; private DefaultStageScanSettings(Builder builder) { + enabled_ = builder.enabled_; accelerationFactor_ = builder.accelerationFactor_; overshootDistance_ = builder.overshootDistance_; retraceSpeed_ = builder.retraceSpeed_; @@ -38,11 +31,25 @@ private DefaultStageScanSettings() { this(new Builder()); } + public static Builder builder() { + return new Builder(); + } + + public static Builder builder(StageScanSettings settings) { + Objects.requireNonNull(settings, "Cannot copy from null settings"); + return new Builder(settings); + } + @Override public StageScanSettings.Builder copyBuilder() { return new Builder(this); } + @Override + public boolean enabled() { + return enabled_; + } + @Override public double accelerationFactor() { return accelerationFactor_; @@ -78,17 +85,6 @@ public boolean fromNegativeDirection() { return fromNegativeDirection_; } - @Override - public String toString() { - return String.format( - "%s[accelerationFactor=%s, overshootDistance=%s, retraceSpeed=%s, firstViewAngle=%s, " + - "returnToStart=%s, fromCurrentPosition=%s, fromNegativeDirection=%s]", - getClass().getSimpleName(), - accelerationFactor_, overshootDistance_, retraceSpeed_, firstViewAngle_, - returnToStart_, fromCurrentPosition_, fromNegativeDirection_ - ); - } - @Override public boolean equals(Object obj) { if (this == obj) { @@ -98,7 +94,8 @@ public boolean equals(Object obj) { return false; } DefaultStageScanSettings other = (DefaultStageScanSettings) obj; - return Double.compare(other.accelerationFactor_, accelerationFactor_) == 0 && + return enabled_ == other.enabled_ && + Double.compare(other.accelerationFactor_, accelerationFactor_) == 0 && overshootDistance_ == other.overshootDistance_ && Double.compare(other.retraceSpeed_, retraceSpeed_) == 0 && Double.compare(other.firstViewAngle_, firstViewAngle_) == 0 && @@ -110,6 +107,7 @@ public boolean equals(Object obj) { @Override public int hashCode() { return Objects.hash( + enabled_, accelerationFactor_, overshootDistance_, retraceSpeed_, @@ -120,8 +118,20 @@ public int hashCode() { ); } + @Override + public String toString() { + return String.format( + "%s[enabled=%s, accelerationFactor=%s, overshootDistance=%s, retraceSpeed=%s, firstViewAngle=%s, " + + "returnToStart=%s, fromCurrentPosition=%s, fromNegativeDirection=%s]", + getClass().getSimpleName(), + enabled_, accelerationFactor_, overshootDistance_, retraceSpeed_, firstViewAngle_, + returnToStart_, fromCurrentPosition_, fromNegativeDirection_ + ); + } + public static class Builder implements StageScanSettings.Builder { + private boolean enabled_ = false; private double accelerationFactor_ = 1.0; private int overshootDistance_ = 0; private double retraceSpeed_ = 67.0; @@ -134,6 +144,7 @@ private Builder() { } private Builder(StageScanSettings settings) { + enabled_ = settings.enabled(); accelerationFactor_ = settings.accelerationFactor(); overshootDistance_ = settings.overshootDistance(); retraceSpeed_ = settings.retraceSpeed(); @@ -144,43 +155,49 @@ private Builder(StageScanSettings settings) { } @Override - public StageScanSettings.Builder accelerationFactor(final double factor) { + public Builder enabled(final boolean state) { + enabled_ = state; + return this; + } + + @Override + public Builder accelerationFactor(final double factor) { accelerationFactor_ = factor; return this; } @Override - public StageScanSettings.Builder overshootDistance(final int distance) { + public Builder overshootDistance(final int distance) { overshootDistance_ = distance; return this; } @Override - public StageScanSettings.Builder retraceSpeed(final double speed) { + public Builder retraceSpeed(final double speed) { retraceSpeed_ = speed; return this; } @Override - public StageScanSettings.Builder firstViewAngle(final double angle) { + public Builder firstViewAngle(final double angle) { firstViewAngle_ = angle; return this; } @Override - public StageScanSettings.Builder returnToStart(final boolean state) { + public Builder returnToStart(final boolean state) { returnToStart_ = state; return this; } @Override - public StageScanSettings.Builder fromCurrentPosition(final boolean state) { + public Builder fromCurrentPosition(final boolean state) { fromCurrentPosition_ = state; return this; } @Override - public StageScanSettings.Builder fromNegativeDirection(final boolean state) { + public Builder fromNegativeDirection(final boolean state) { fromNegativeDirection_ = state; return this; } 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 b80925c2..497be4c2 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultTimingSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultTimingSettings.java @@ -2,13 +2,197 @@ import org.micromanager.lightsheetmanager.api.TimingSettings; +import java.util.Objects; + public class DefaultTimingSettings implements TimingSettings { + private final int scansPerSlice_; + private final double delayBeforeScan_; + private final double scanDuration_; + private final double delayBeforeLaser_; + private final double laserTriggerDuration_; + private final double delayBeforeCamera_; + private final double cameraTriggerDuration_; + private final double cameraExposure_; + private final double sliceDuration_; + private final boolean alternateScanDirection_; + + private DefaultTimingSettings(Builder builder) { + scansPerSlice_ = builder.scansPerSlice_; + delayBeforeScan_ = builder.delayBeforeScan_; + scanDuration_ = builder.scanDuration_; + delayBeforeLaser_ = builder.delayBeforeLaser_; + laserTriggerDuration_ = builder.laserTriggerDuration_; + delayBeforeCamera_ = builder.delayBeforeCamera_; + cameraTriggerDuration_ = builder.cameraTriggerDuration_; + cameraExposure_ = builder.cameraExposure_; + sliceDuration_ = builder.sliceDuration(); + alternateScanDirection_ = builder.alternateScanDirection_; + } + public static Builder builder() { return new Builder(); } + public static Builder builder(TimingSettings settings) { + Objects.requireNonNull(settings, "Cannot copy from null settings"); + return new Builder(settings); + } + + /** + * Creates a Builder populated with settings of this TimingSettings instance. + * + * @return TimingSettings.Builder pre-populated with settings of this instance. + */ + @Override + public DefaultTimingSettings.Builder copyBuilder() { + return new Builder(this); + } + + /** + * Return the delay time in milliseconds before the scan begins. + * + * @return the delay time in milliseconds + */ + @Override + public double delayBeforeScan() { + return delayBeforeScan_; + } + + /** + * Returns the number of one way beam scans per slice. + * + * @return the number of one way beam scans per slice + */ + @Override + public int scansPerSlice() { + return scansPerSlice_; + } + + /** + * Returns the time in milliseconds of one beam scan sweep. + * + * @return the time in milliseconds of one beam scan sweep + */ + @Override + public double scanDuration() { + return scanDuration_; + } + + /** + * Returns the delay time in milliseconds before the laser trigger. + * + * @return the delay time in milliseconds before the laser trigger + */ + @Override + public double delayBeforeLaser() { + return delayBeforeLaser_; + } + + /** + * Returns the laser trigger duration in milliseconds. + * + * @return the laser trigger duration in milliseconds + */ + @Override + public double laserTriggerDuration() { + return laserTriggerDuration_; + } + + /** + * Returns the delay time in milliseconds before the camera is triggered. + * + * @return the delay time in milliseconds before the camera is triggered + */ + @Override + public double delayBeforeCamera() { + return delayBeforeCamera_; + } + + /** + * Returns the camera trigger duration in milliseconds. + * + * @return the camera trigger duration in milliseconds + */ + @Override + public double cameraTriggerDuration() { + return cameraTriggerDuration_; + } + + /** + * Returns the duration in milliseconds that the camera shutter is open. + * + * @return the duration in milliseconds that the camera shutter is open + */ + @Override + public double cameraExposure() { + return cameraExposure_; + } + + /** + * Returns the duration in milliseconds of each slice. + * + * @return the duration in milliseconds of each slice + */ + @Override + public double sliceDuration() { + return sliceDuration_; + } + + /** + * Returns true if the scan direction is inverted. + * + * @return true if the scan direction is inverted + */ + @Override + public boolean useAlternateScanDirection() { + return alternateScanDirection_; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + DefaultTimingSettings other = (DefaultTimingSettings) obj; + return scansPerSlice_ == other.scansPerSlice_ && + Double.compare(delayBeforeScan_, other.delayBeforeScan_) == 0 && + Double.compare(scanDuration_, other.scanDuration_) == 0 && + Double.compare(delayBeforeLaser_, other.delayBeforeLaser_) == 0 && + Double.compare(laserTriggerDuration_, other.laserTriggerDuration_) == 0 && + Double.compare(delayBeforeCamera_, other.delayBeforeCamera_) == 0 && + Double.compare(cameraTriggerDuration_, other.cameraTriggerDuration_) == 0 && + Double.compare(cameraExposure_, other.cameraExposure_) == 0 && + Double.compare(sliceDuration_, other.sliceDuration_) == 0 && + alternateScanDirection_ == other.alternateScanDirection_; + } + + @Override + public int hashCode() { + return Objects.hash(scansPerSlice_, delayBeforeScan_, scanDuration_, delayBeforeLaser_, + laserTriggerDuration_, delayBeforeCamera_, cameraTriggerDuration_, cameraExposure_, + sliceDuration_, alternateScanDirection_); + } + + @Override + public String toString() { + return String.format( + "%s[scansPerSlice=%s, delayBeforeScan=%s, scanDuration=%s," + + " delayBeforeLaser=%s, laserTriggerDuration=%s," + + " delayBeforeCamera=%s, cameraTriggerDuration=%s," + + " cameraExposure=%s, sliceDuration=%s, alternateScanDirection=%s]", + getClass().getSimpleName(), + scansPerSlice_, delayBeforeScan_, scanDuration_, delayBeforeLaser_, + laserTriggerDuration_, delayBeforeCamera_, cameraTriggerDuration_, + cameraExposure_, sliceDuration_, alternateScanDirection_ + ); + } + public static class Builder implements TimingSettings.Builder { + private int scansPerSlice_ = 1; private double delayBeforeScan_ = 0.0; private double scanDuration_ = 10.0; @@ -22,16 +206,16 @@ public static class Builder implements TimingSettings.Builder { private Builder() { } - private Builder(DefaultTimingSettings settings) { - scansPerSlice_ = settings.scansPerSlice_; - delayBeforeScan_ = settings.delayBeforeScan_; - scanDuration_ = settings.scanDuration_; - delayBeforeLaser_ = settings.delayBeforeLaser_; - laserTriggerDuration_ = settings.laserTriggerDuration_; - delayBeforeCamera_ = settings.delayBeforeCamera_; - cameraTriggerDuration_ = settings.cameraTriggerDuration_; - cameraExposure_ = settings.cameraExposure_; - alternateScanDirection_ = settings.alternateScanDirection_; + private Builder(final TimingSettings settings) { + scansPerSlice_ = settings.scansPerSlice(); + delayBeforeScan_ = settings.delayBeforeScan(); + scanDuration_ = settings.scanDuration(); + delayBeforeLaser_ = settings.delayBeforeLaser(); + laserTriggerDuration_ = settings.laserTriggerDuration(); + delayBeforeCamera_ = settings.delayBeforeCamera(); + cameraTriggerDuration_ = settings.cameraTriggerDuration(); + cameraExposure_ = settings.cameraExposure(); + alternateScanDirection_ = settings.useAlternateScanDirection(); } /** @@ -40,7 +224,7 @@ private Builder(DefaultTimingSettings settings) { * @param delayMs the delay time in milliseconds */ @Override - public TimingSettings.Builder delayBeforeScan(final double delayMs) { + public Builder delayBeforeScan(final double delayMs) { delayBeforeScan_ = delayMs; return this; } @@ -51,7 +235,7 @@ public TimingSettings.Builder delayBeforeScan(final double delayMs) { * @param numScans the number of scans */ @Override - public TimingSettings.Builder scansPerSlice(final int numScans) { + public Builder scansPerSlice(final int numScans) { scansPerSlice_ = numScans; return this; } @@ -62,7 +246,7 @@ public TimingSettings.Builder scansPerSlice(final int numScans) { * @param durationMs the duration in milliseconds */ @Override - public TimingSettings.Builder scanDuration(final double durationMs) { + public Builder scanDuration(final double durationMs) { scanDuration_ = durationMs; return this; } @@ -73,7 +257,7 @@ public TimingSettings.Builder scanDuration(final double durationMs) { * @param delayMs the delay in milliseconds */ @Override - public TimingSettings.Builder delayBeforeLaser(final double delayMs) { + public Builder delayBeforeLaser(final double delayMs) { delayBeforeLaser_ = delayMs; return this; } @@ -84,7 +268,7 @@ public TimingSettings.Builder delayBeforeLaser(final double delayMs) { * @param durationMs the duration in milliseconds */ @Override - public TimingSettings.Builder laserTriggerDuration(final double durationMs) { + public Builder laserTriggerDuration(final double durationMs) { laserTriggerDuration_ = durationMs; return this; } @@ -95,7 +279,7 @@ public TimingSettings.Builder laserTriggerDuration(final double durationMs) { * @param delayMs the delay in milliseconds */ @Override - public TimingSettings.Builder delayBeforeCamera(final double delayMs) { + public Builder delayBeforeCamera(final double delayMs) { delayBeforeCamera_ = delayMs; return this; } @@ -106,7 +290,7 @@ public TimingSettings.Builder delayBeforeCamera(final double delayMs) { * @param durationMs the duration in milliseconds */ @Override - public TimingSettings.Builder cameraTriggerDuration(final double durationMs) { + public Builder cameraTriggerDuration(final double durationMs) { cameraTriggerDuration_ = durationMs; return this; } @@ -117,7 +301,7 @@ public TimingSettings.Builder cameraTriggerDuration(final double durationMs) { * @param exposureMs the exposure time in milliseconds */ @Override - public TimingSettings.Builder cameraExposure(final double exposureMs) { + public Builder cameraExposure(final double exposureMs) { cameraExposure_ = exposureMs; return this; } @@ -128,7 +312,7 @@ public TimingSettings.Builder cameraExposure(final double exposureMs) { * @param state true to invert the scan direction */ @Override - public TimingSettings.Builder useAlternateScanDirection(final boolean state) { + public Builder useAlternateScanDirection(final boolean state) { alternateScanDirection_ = state; return this; } @@ -148,10 +332,10 @@ public double sliceDuration() { @Override public String toString() { - return String.format("%s[scansPerSlice_=%s, delayBeforeScan_=%s, scanDuration_=%s, " - + "delayBeforeLaser_=%s, laserTriggerDuration_=%s, delayBeforeCamera_=%s, " - + "cameraTriggerDuration_=%s, cameraExposure_=%s, " - + "sliceDuration=%s, alternateScanDirection_=%s]", + return String.format("%s[scansPerSlice=%s, delayBeforeScan=%s, scanDuration=%s, " + + "delayBeforeLaser=%s, laserTriggerDuration=%s, delayBeforeCamera=%s, " + + "cameraTriggerDuration=%s, cameraExposure=%s, " + + "sliceDuration=%s, alternateScanDirection=%s]", getClass().getSimpleName(), scansPerSlice_, delayBeforeScan_, scanDuration_, delayBeforeLaser_, laserTriggerDuration_, delayBeforeCamera_, cameraTriggerDuration_, cameraExposure_, @@ -168,154 +352,7 @@ public String toString() { public DefaultTimingSettings build() { return new DefaultTimingSettings(this); } - } - - private final int scansPerSlice_; - private final double delayBeforeScan_; - private final double scanDuration_; - private final double delayBeforeLaser_; - private final double laserTriggerDuration_; - private final double delayBeforeCamera_; - private final double cameraTriggerDuration_; - private final double cameraExposure_; - private final double sliceDuration_; - private final boolean alternateScanDirection_; - - private DefaultTimingSettings(Builder builder) { - scansPerSlice_ = builder.scansPerSlice_; - delayBeforeScan_ = builder.delayBeforeScan_; - scanDuration_ = builder.scanDuration_; - delayBeforeLaser_ = builder.delayBeforeLaser_; - laserTriggerDuration_ = builder.laserTriggerDuration_; - delayBeforeCamera_ = builder.delayBeforeCamera_; - cameraTriggerDuration_ = builder.cameraTriggerDuration_; - cameraExposure_ = builder.cameraExposure_; - sliceDuration_ = builder.sliceDuration(); - alternateScanDirection_ = builder.alternateScanDirection_; - } - - /** - * Creates a Builder populated with settings of this TimingSettings instance. - * - * @return TimingSettings.Builder pre-populated with settings of this instance. - */ - @Override - public DefaultTimingSettings.Builder copyBuilder() { - return new Builder(this); - } - - /** - * Return the delay time in milliseconds before the scan begins. - * - * @return the delay time in milliseconds - */ - @Override - public double delayBeforeScan() { - return delayBeforeScan_; - } - - /** - * Returns the number of one way beam scans per slice. - * - * @return the number of one way beam scans per slice - */ - @Override - public int scansPerSlice() { - return scansPerSlice_; - } - - /** - * Returns the time in milliseconds of one beam scan sweep. - * - * @return the time in milliseconds of one beam scan sweep - */ - @Override - public double scanDuration() { - return scanDuration_; - } - - /** - * Returns the delay time in milliseconds before the laser trigger. - * - * @return the delay time in milliseconds before the laser trigger - */ - @Override - public double delayBeforeLaser() { - return delayBeforeLaser_; - } - - /** - * Returns the laser trigger duration in milliseconds. - * - * @return the laser trigger duration in milliseconds - */ - @Override - public double laserTriggerDuration() { - return laserTriggerDuration_; - } - - /** - * Returns the delay time in milliseconds before the camera is triggered. - * - * @return the delay time in milliseconds before the camera is triggered - */ - @Override - public double delayBeforeCamera() { - return delayBeforeCamera_; - } - - /** - * Returns the camera trigger duration in milliseconds. - * - * @return the camera trigger duration in milliseconds - */ - @Override - public double cameraTriggerDuration() { - return cameraTriggerDuration_; - } - /** - * Returns the duration in milliseconds that the camera shutter is open. - * - * @return the duration in milliseconds that the camera shutter is open - */ - @Override - public double cameraExposure() { - return cameraExposure_; - } - - /** - * Returns the duration in milliseconds of each slice. - * - * @return the duration in milliseconds of each slice - */ - @Override - public double sliceDuration() { - return sliceDuration_; - } - - /** - * Returns true if the scan direction is inverted. - * - * @return true if the scan direction is inverted - */ - @Override - public boolean useAlternateScanDirection() { - return alternateScanDirection_; - } - - @Override - public String toString() { - return String.format( - "%s[scansPerSlice=%s, delayBeforeScan=%s, scanDuration=%s," - + " delayBeforeLaser=%s, laserTriggerDuration=%s," - + " delayBeforeCamera=%s, cameraTriggerDuration=%s, cameraExposure=%s," - + " sliceDuration=%s, alternateScanDirection=%s]", - getClass().getSimpleName(), - scansPerSlice_, delayBeforeScan_, scanDuration_, delayBeforeLaser_, laserTriggerDuration_, - delayBeforeCamera_, cameraTriggerDuration_, cameraExposure_, - sliceDuration_, alternateScanDirection_ - ); } } 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 648435bf..d6a1bf20 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultVolumeSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultVolumeSettings.java @@ -1,15 +1,163 @@ package org.micromanager.lightsheetmanager.api.internal; - import org.micromanager.lightsheetmanager.api.VolumeSettings; +import java.util.Objects; + public class DefaultVolumeSettings implements VolumeSettings { + private final int firstView_; + private final int numViews_; + private final int slicesPerView_; + private final double delayBeforeView_; + private final double sliceStepSize_; + private final double startPosition_; + private final double centerPosition_; + private final double endPosition_; + + private DefaultVolumeSettings(Builder builder) { + firstView_ = builder.firstView_; + numViews_ = builder.numViews_; + slicesPerView_ = builder.slicesPerView_; + delayBeforeView_ = builder.delayBeforeView_; + sliceStepSize_ = builder.sliceStepSize_; + startPosition_ = builder.startPosition_; + centerPosition_ = builder.centerPosition_; + endPosition_ = builder.endPosition_; + } + public static Builder builder() { return new Builder(); } + public static Builder builder(VolumeSettings settings) { + Objects.requireNonNull(settings, "Cannot copy from null settings"); + return new Builder(settings); + } + + @Override + 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_; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + DefaultVolumeSettings other = (DefaultVolumeSettings) obj; + return firstView_ == other.firstView_ && + numViews_ == other.numViews_ && + slicesPerView_ == other.slicesPerView_ && + Double.compare(delayBeforeView_, other.delayBeforeView_) == 0 && + Double.compare(sliceStepSize_, other.sliceStepSize_) == 0 && + Double.compare(startPosition_, other.startPosition_) == 0 && + Double.compare(centerPosition_, other.centerPosition_) == 0 && + Double.compare(endPosition_, other.endPosition_) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(firstView_, numViews_, slicesPerView_, delayBeforeView_, sliceStepSize_, + startPosition_, centerPosition_, endPosition_); + } + + @Override + public String toString() { + return String.format( + "%s[firstView=%s, numViews=%s, numSlices=%s, viewDelayMs=%s, stepSizeUm=%s, " + + "startPosition=%s, centerPosition=%s, endPosition=%s]", + getClass().getSimpleName(), + firstView_, numViews_, slicesPerView_, delayBeforeView_, sliceStepSize_, + startPosition_, centerPosition_, endPosition_ + ); + } + public static class Builder implements VolumeSettings.Builder { + private int firstView_ = 1; private int numViews_ = 1; private int slicesPerView_ = 10; @@ -27,15 +175,15 @@ private Builder() { * * @param settings the settings to copy */ - private Builder(DefaultVolumeSettings settings) { - firstView_ = settings.firstView_; - numViews_ = settings.numViews_; - slicesPerView_ = settings.slicesPerView_; - delayBeforeView_ = settings.delayBeforeView_; - sliceStepSize_ = settings.sliceStepSize_; - startPosition_ = settings.startPosition_; - centerPosition_ = settings.centerPosition_; - endPosition_ = settings.endPosition_; + private Builder(final VolumeSettings settings) { + firstView_ = settings.firstView(); + numViews_ = settings.numViews(); + slicesPerView_ = settings.slicesPerView(); + delayBeforeView_ = settings.delayBeforeView(); + sliceStepSize_ = settings.sliceStepSize(); + startPosition_ = settings.startPosition(); + centerPosition_ = settings.centerPosition(); + endPosition_ = settings.endPosition(); } /** @@ -44,7 +192,7 @@ private Builder(DefaultVolumeSettings settings) { * @param numViews the number of view */ @Override - public VolumeSettings.Builder numViews(final int numViews) { + public Builder numViews(final int numViews) { numViews_ = numViews; return this; } @@ -55,7 +203,7 @@ public VolumeSettings.Builder numViews(final int numViews) { * @param firstView the first view */ @Override - public VolumeSettings.Builder firstView(final int firstView) { + public Builder firstView(final int firstView) { firstView_ = firstView; return this; } @@ -66,19 +214,19 @@ public VolumeSettings.Builder firstView(final int firstView) { * @param viewDelayMs the delay in milliseconds */ @Override - public VolumeSettings.Builder delayBeforeView(final double viewDelayMs) { + public Builder delayBeforeView(final double viewDelayMs) { delayBeforeView_ = viewDelayMs; return this; } @Override - public VolumeSettings.Builder slicesPerView(final int n) { + public Builder slicesPerView(final int n) { slicesPerView_ = n; return this; } @Override - public VolumeSettings.Builder sliceStepSize(final double um) { + public Builder sliceStepSize(final double um) { sliceStepSize_ = um; return this; } @@ -92,7 +240,7 @@ public VolumeSettings.Builder sliceStepSize(final double um) { * @param stepSizeUm the step size in micron */ @Override - public VolumeSettings.Builder volumeBounds(final double startPosition, final double endPosition, final double stepSizeUm) { + public Builder volumeBounds(final double startPosition, final double endPosition, final double stepSizeUm) { startPosition_ = startPosition; endPosition_ = endPosition; sliceStepSize_ = stepSizeUm; @@ -109,7 +257,7 @@ public VolumeSettings.Builder volumeBounds(final double startPosition, final dou * @param numSlices the number of slices */ @Override - public VolumeSettings.Builder volumeBounds(final double startPosition, final double endPosition, final int numSlices) { + public Builder volumeBounds(final double startPosition, final double endPosition, final int numSlices) { startPosition_ = startPosition; endPosition_ = endPosition; slicesPerView_ = numSlices; @@ -126,7 +274,7 @@ public VolumeSettings.Builder volumeBounds(final double startPosition, final dou * @param stepSizeUm the step size in microns */ @Override - public VolumeSettings.Builder volumeBounds(final double centerPosition, final int numSlices, final double stepSizeUm) { + public Builder volumeBounds(final double centerPosition, final int numSlices, final double stepSizeUm) { final double halfDistance = (stepSizeUm * numSlices) / 2.0; centerPosition_ = centerPosition; sliceStepSize_ = stepSizeUm; @@ -147,112 +295,4 @@ public DefaultVolumeSettings build() { } } - private final int firstView_; - private final int numViews_; - private final int slicesPerView_; - private final double delayBeforeView_; - private final double sliceStepSize_; - private final double startPosition_; - private final double centerPosition_; - private final double endPosition_; - - private DefaultVolumeSettings(Builder builder) { - firstView_ = builder.firstView_; - numViews_ = builder.numViews_; - slicesPerView_ = builder.slicesPerView_; - delayBeforeView_ = builder.delayBeforeView_; - sliceStepSize_ = builder.sliceStepSize_; - startPosition_ = builder.startPosition_; - centerPosition_ = builder.centerPosition_; - endPosition_ = builder.endPosition_; - } - - public Builder copyBuilder() { - return new Builder(this); - } - - /** - * Returns the imaging path that the acquisition starts on. - * - * @return the first view - */ - public int firstView() { - return firstView_; - } - - /** - * Return the number of views to use during an acquisition. - * - * @return the number of views - */ - - public int numViews() { - return numViews_; - } - - /** - * Returns the number of slices per volume. - * - * @return the number of slices - */ - public int slicesPerView() { - return slicesPerView_; - } - - /** - * Return the delay in milliseconds before switching imaging paths in milliseconds. - * - * @return the delay in milliseconds - */ - public double delayBeforeView() { - return delayBeforeView_; - } - - /** - * Returns the step size in microns. - * - * @return the step size in microns - */ - public double sliceStepSize() { - return sliceStepSize_; - } - - /** - * Returns the start position of the volume. - * - * @return the start position - */ - public double startPosition() { - return startPosition_; - } - - /** - * Returns the center position of the volume. - * - * @return the center position - */ - public double centerPosition() { - return centerPosition_; - } - - /** - * Returns the end position of the volume. - * - * @return the end position - */ - public double endPosition() { - return endPosition_; - } - - @Override - public String toString() { - return String.format( - "%s[firstView=%s, numViews=%s, numSlices=%s, viewDelayMs=%s, stepSizeUm=%s, " - + "startPosition=%s, centerPosition=%s, endPosition=%s]", - getClass().getSimpleName(), - firstView_, numViews_, slicesPerView_, delayBeforeView_, sliceStepSize_, - startPosition_, centerPosition_, endPosition_ - ); - } - } 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 6b84d78a..97e94f1a 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -1,6 +1,7 @@ package org.micromanager.lightsheetmanager.api.internal; import org.micromanager.lightsheetmanager.api.AcquisitionSettingsDispim; +import org.micromanager.lightsheetmanager.api.ChannelSettings; import org.micromanager.lightsheetmanager.api.StageScanSettings; import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; @@ -13,7 +14,7 @@ public static Builder builder() { public static class Builder extends BaseAcquisitionSettings.Builder implements AcquisitionSettingsDispim.Builder { - private DefaultChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); + private ChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); private DefaultTimingSettings.Builder timingBuilder_ = DefaultTimingSettings.builder(); private DefaultVolumeSettings.Builder volumeBuilder_ = DefaultVolumeSettings.builder(); private DefaultSliceSettings.Builder sliceBuilder_ = DefaultSliceSettings.builder(); @@ -26,10 +27,8 @@ public static class Builder extends BaseAcquisitionSettings.Builder imp private CameraMode cameraMode_ = CameraMode.EDGE; private boolean useTimePoints_ = false; - private boolean useAutofocus_ = false; private boolean useMultiplePositions_ = false; private boolean useHardwareTimePoints_ = false; - private boolean useStageScanning_ = false; private boolean useAdvancedTiming_ = false; private int numTimePoints_ = 1; @@ -47,11 +46,11 @@ private Builder() { public Builder(final DispimAcquisitionSettings settings) { super(settings); - channelBuilder_ = settings.channelSettings_.copyBuilder(); - timingBuilder_ = settings.timingSettings_.copyBuilder(); - volumeBuilder_ = settings.volumeSettings_.copyBuilder(); - sliceBuilder_ = settings.sliceSettings_.copyBuilder(); - ssbLS_ = settings.sliceSettingsLS_.copyBuilder(); + channelBuilder_ = settings.channels().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++) { slcb_[i] = settings.sliceCalibrations_[i].copyBuilder(); @@ -60,10 +59,8 @@ public Builder(final DispimAcquisitionSettings settings) { acquisitionMode_ = settings.acquisitionMode_; cameraMode_ = settings.cameraMode_; useTimePoints_ = settings.useTimePoints_; - useAutofocus_ = settings.useAutofocus_; useMultiplePositions_ = settings.useMultiplePositions_; useHardwareTimePoints_ = settings.useHardwareTimePoints_; - useStageScanning_ = settings.useStageScanning_; useAdvancedTiming_ = settings.useAdvancedTiming_; numTimePoints_ = settings.numTimePoints_; timePointInterval_ = settings.timePointInterval_; @@ -104,17 +101,6 @@ public Builder useTimePoints(final boolean state) { return this; } - /** - * Sets the acquisition to use autofocus. - * - * @param state true to use autofocus. - */ - @Override - public Builder useAutofocus(final boolean state) { - useAutofocus_ = state; - return this; - } - /** * Sets the acquisition to use multiple positions. * @@ -137,17 +123,6 @@ public Builder useHardwareTimePoints(final boolean state) { return this; } - /** - * Sets the acquisition to use stage scanning. - * - * @param state true to use stage scanning. - */ - @Override - public Builder useStageScanning(final boolean state) { - useStageScanning_ = state; - return this; - } - /** * Sets the acquisition to use advanced timing settings. * @@ -199,7 +174,7 @@ public Builder liveScanPeriod(double liveScanPeriod) { } // getters for sub-builders - public DefaultChannelSettings.Builder channelBuilder() { + public ChannelSettings.Builder channelBuilder() { return channelBuilder_; } @@ -240,9 +215,9 @@ public void volumeSettingsBuilder(DefaultVolumeSettings.Builder builder) { } /** - * Creates an immutable instance of DefaultAcquisitionSettingsDISPIM + * Creates an immutable instance of DispimAcquisitionSettings * - * @return Immutable version of DefaultAcquisitionSettingsDISPIM + * @return Immutable version of DispimAcquisitionSettings */ @Override public DispimAcquisitionSettings build() { @@ -262,11 +237,11 @@ public String toString() { } - private final DefaultChannelSettings channelSettings_; - private final DefaultTimingSettings timingSettings_; - private final DefaultVolumeSettings volumeSettings_; - private final DefaultSliceSettingsLS sliceSettingsLS_; - private final DefaultSliceSettings sliceSettings_; + 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_; @@ -275,10 +250,8 @@ public String toString() { private final CameraMode cameraMode_; private final boolean useTimePoints_; - private final boolean useAutofocus_; private final boolean useMultiplePositions_; private final boolean useHardwareTimePoints_; - private final boolean useStageScanning_; private final boolean useAdvancedTiming_; private final int numTimePoints_; @@ -289,11 +262,11 @@ public String toString() { private DispimAcquisitionSettings(Builder builder) { super(builder); - channelSettings_ = builder.channelBuilder_.build(); - timingSettings_ = builder.timingBuilder_.build(); - volumeSettings_ = builder.volumeBuilder_.build(); - sliceSettings_ = builder.sliceBuilder_.build(); - sliceSettingsLS_ = builder.ssbLS_.build(); + 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 @@ -304,8 +277,6 @@ private DispimAcquisitionSettings(Builder builder) { acquisitionMode_ = builder.acquisitionMode_; cameraMode_ = builder.cameraMode_; useTimePoints_ = builder.useTimePoints_; - useAutofocus_ = builder.useAutofocus_; - useStageScanning_ = builder.useStageScanning_; useMultiplePositions_ = builder.useMultiplePositions_; useHardwareTimePoints_ = builder.useHardwareTimePoints_; useAdvancedTiming_ = builder.useAdvancedTiming_; @@ -332,8 +303,8 @@ private DispimAcquisitionSettings(Builder builder) { * @return immutable DefaultChannelSettings instance. */ @Override - public DefaultChannelSettings channels() { - return channelSettings_; + public ChannelSettings channels() { + return channels_; } /** @@ -343,7 +314,7 @@ public DefaultChannelSettings channels() { */ @Override public DefaultTimingSettings timing() { - return timingSettings_; + return timing_; } /** @@ -353,7 +324,7 @@ public DefaultTimingSettings timing() { */ @Override public DefaultVolumeSettings volume() { - return volumeSettings_; + return volume_; } /** @@ -363,7 +334,7 @@ public DefaultVolumeSettings volume() { */ @Override public DefaultSliceSettings slice() { - return sliceSettings_; + return slice_; } /** @@ -373,7 +344,7 @@ public DefaultSliceSettings slice() { */ @Override public DefaultSliceSettingsLS sliceLS() { - return sliceSettingsLS_; + return sliceLS_; } /** @@ -438,16 +409,6 @@ public boolean isUsingTimePoints() { return useTimePoints_; } - /** - * Returns true if using autofocus. - * - * @return true if using autofocus. - */ - @Override - public boolean isUsingAutofocus() { - return useAutofocus_; - } - /** * Returns true if using multiple positions. * @@ -468,16 +429,6 @@ public boolean isUsingHardwareTimePoints() { return useHardwareTimePoints_; } - /** - * Returns true if using stage scanning. - * - * @return true if using stage scanning. - */ - @Override - public boolean isUsingStageScanning() { - return useStageScanning_; - } - /** * Returns true if using advanced timing settings. * @@ -526,7 +477,7 @@ public double liveScanPeriod() { // TODO: finish this, and maybe use pretty printing? or just rely on JSON conversion? @Override public String toString() { - return String.format("[timingSettings_=%s]", timingSettings_); + return String.format("[timing=%s]", timing_); } // public String toJson() { // return new Gson().toJson(this); 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 3cd584d5..e9e20951 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java @@ -1,6 +1,7 @@ package org.micromanager.lightsheetmanager.api.internal; import org.micromanager.lightsheetmanager.api.AcquisitionSettingsScape; +import org.micromanager.lightsheetmanager.api.ChannelSettings; import org.micromanager.lightsheetmanager.api.StageScanSettings; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; import org.micromanager.lightsheetmanager.api.data.CameraData; @@ -14,13 +15,13 @@ public static Builder builder() { public static class Builder extends BaseAcquisitionSettings.Builder implements AcquisitionSettingsScape.Builder { - private DefaultChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); + private ChannelSettings.Builder channelBuilder_ = DefaultChannelSettings.builder(); private DefaultTimingSettings.Builder timingBuilder_ = DefaultTimingSettings.builder(); private DefaultVolumeSettings.Builder volumeBuilder_ = DefaultVolumeSettings.builder(); private DefaultSliceSettings.Builder sliceBuilder_ = DefaultSliceSettings.builder(); private StageScanSettings.Builder stageScanBuilder_ = DefaultStageScanSettings.builder(); - private DefaultSheetCalibration.Builder[] sheetCalibBuilder_ = new DefaultSheetCalibration.Builder[1]; - private DefaultSliceCalibration.Builder[] sliceCalibBuilder_ = new DefaultSliceCalibration.Builder[1]; + private DefaultSheetCalibration.Builder sheetCalibBuilder_ = DefaultSheetCalibration.builder(); + private DefaultSliceCalibration.Builder sliceCalibBuilder_ = DefaultSliceCalibration.builder(); private AcquisitionMode acquisitionMode_ = AcquisitionMode.NO_SCAN; @@ -28,10 +29,8 @@ public static class Builder extends BaseAcquisitionSettings.Builder imp private CameraData[] imagingCameraOrder_ = {}; private boolean useTimePoints_ = false; - private boolean useAutofocus_ = false; private boolean useMultiplePositions_ = false; private boolean useHardwareTimePoints_ = false; - private boolean useStageScanning_ = false; private boolean useAdvancedTiming_ = false; private int numTimePoints_ = 1; @@ -39,35 +38,27 @@ public static class Builder extends BaseAcquisitionSettings.Builder imp private int postMoveDelay_ = 0; private Builder() { - for (int i = 0; i < 1; i++) { - sheetCalibBuilder_[i] = DefaultSheetCalibration.builder(); - sliceCalibBuilder_[i] = DefaultSliceCalibration.builder(); - } } public Builder(final ScapeAcquisitionSettings settings) { super(settings); - channelBuilder_ = settings.channelSettings_.copyBuilder(); - timingBuilder_ = settings.timingSettings_.copyBuilder(); - volumeBuilder_ = settings.volumeSettings_.copyBuilder(); - sliceBuilder_ = settings.sliceSettings_.copyBuilder(); + channelBuilder_ = settings.channels().copyBuilder(); + timingBuilder_ = settings.timing().copyBuilder(); + volumeBuilder_ = settings.volume().copyBuilder(); + sliceBuilder_ = settings.slice().copyBuilder(); stageScanBuilder_ = settings.stageScan().copyBuilder(); - for (int i = 0; i < 1; i++) { - sliceCalibBuilder_[i] = settings.sliceCalibrations_[i].copyBuilder(); - sheetCalibBuilder_[i] = settings.sheetCalibrations_[i].copyBuilder(); - } - acquisitionMode_ = settings.acquisitionMode_; - cameraMode_ = settings.cameraMode_; - imagingCameraOrder_ = settings.imagingCameraOrder_; - useTimePoints_ = settings.useTimePoints_; - useAutofocus_ = settings.useAutofocus_; - useMultiplePositions_ = settings.useMultiplePositions_; - useHardwareTimePoints_ = settings.useHardwareTimePoints_; - useStageScanning_ = settings.useStageScanning_; - useAdvancedTiming_ = settings.useAdvancedTiming_; - numTimePoints_ = settings.numTimePoints_; - timePointInterval_ = settings.timePointInterval_; - postMoveDelay_ = settings.postMoveDelay_; + sheetCalibBuilder_ = settings.sheetCalibration().copyBuilder(); + sliceCalibBuilder_ = settings.sliceCalibration().copyBuilder(); + 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(); } /** @@ -76,36 +67,37 @@ public Builder(final ScapeAcquisitionSettings settings) { * If the mode is a stage scanning mode, * set internal stage scanning flag. * - * @param acqMode the acquisition mode + * @param mode the acquisition mode */ @Override - public Builder acquisitionMode(final AcquisitionMode acqMode) { - acquisitionMode_ = acqMode; - useStageScanning_ = acqMode == AcquisitionMode.STAGE_SCAN - || acqMode == AcquisitionMode.STAGE_SCAN_INTERLEAVED - || acqMode == AcquisitionMode.STAGE_SCAN_UNIDIRECTIONAL; + public Builder acquisitionMode(final AcquisitionMode mode) { + acquisitionMode_ = mode; + final boolean scanEnabled = (mode == AcquisitionMode.STAGE_SCAN + || mode == AcquisitionMode.STAGE_SCAN_INTERLEAVED + || mode == AcquisitionMode.STAGE_SCAN_UNIDIRECTIONAL); + stageScanBuilder_.enabled(scanEnabled); return this; } /** * Sets the camera mode. * - * @param cameraMode the camera mode. + * @param mode the camera mode. */ @Override - public Builder cameraMode(final CameraMode cameraMode) { - cameraMode_ = cameraMode; + public Builder cameraMode(final CameraMode mode) { + cameraMode_ = mode; return this; } /** * Sets the imaging camera order. * - * @param cameraOrder the imaging camera order + * @param order the imaging camera order */ @Override - public Builder imagingCameraOrder(final CameraData[] cameraOrder) { - imagingCameraOrder_ = cameraOrder; + public Builder imagingCameraOrder(final CameraData[] order) { + imagingCameraOrder_ = order; return this; } @@ -120,17 +112,6 @@ public Builder useTimePoints(final boolean state) { return this; } - /** - * Sets the acquisition to use autofocus. - * - * @param state true to use autofocus. - */ - @Override - public Builder useAutofocus(final boolean state) { - useAutofocus_ = state; - return this; - } - /** * Sets the acquisition to use multiple positions. * @@ -198,7 +179,7 @@ public Builder postMoveDelay(final int postMoveDelay) { } // getters for sub-builders - public DefaultChannelSettings.Builder channelBuilder() { + public ChannelSettings.Builder channelBuilder() { return channelBuilder_; } @@ -218,12 +199,12 @@ public StageScanSettings.Builder stageScanBuilder() { return stageScanBuilder_; } - public DefaultSheetCalibration.Builder sheetCalibrationBuilder(final int view) { - return sheetCalibBuilder_[view-1]; + public DefaultSheetCalibration.Builder sheetCalibrationBuilder() { + return sheetCalibBuilder_; } - public DefaultSliceCalibration.Builder sliceCalibrationBuilder(final int view) { - return sliceCalibBuilder_[view-1]; + public DefaultSliceCalibration.Builder sliceCalibrationBuilder() { + return sliceCalibBuilder_; } public void timingBuilder(DefaultTimingSettings.Builder builder) { @@ -252,13 +233,13 @@ public String toString() { } - private final DefaultChannelSettings channelSettings_; - private final DefaultTimingSettings timingSettings_; - private final DefaultVolumeSettings volumeSettings_; - private final DefaultSliceSettings sliceSettings_; + private final ChannelSettings channels_; + private final DefaultTimingSettings timing_; + private final DefaultVolumeSettings volume_; + private final DefaultSliceSettings slice_; private final StageScanSettings stageScan_; - private final DefaultSheetCalibration[] sheetCalibrations_; - private final DefaultSliceCalibration[] sliceCalibrations_; + private final DefaultSheetCalibration sheetCalibration_; + private final DefaultSliceCalibration sliceCalibration_; private final AcquisitionMode acquisitionMode_; @@ -266,10 +247,8 @@ public String toString() { private final CameraData[] imagingCameraOrder_; private final boolean useTimePoints_; - private final boolean useAutofocus_; private final boolean useMultiplePositions_; private final boolean useHardwareTimePoints_; - private final boolean useStageScanning_; private final boolean useAdvancedTiming_; private final int numTimePoints_; @@ -278,23 +257,17 @@ public String toString() { private ScapeAcquisitionSettings(Builder builder) { super(builder); - channelSettings_ = builder.channelBuilder_.build(); - timingSettings_ = builder.timingBuilder_.build(); - volumeSettings_ = builder.volumeBuilder_.build(); - sliceSettings_ = builder.sliceBuilder_.build(); + channels_ = builder.channelBuilder().build(); + timing_ = builder.timingBuilder_.build(); + volume_ = builder.volumeBuilder_.build(); + slice_ = builder.sliceBuilder_.build(); stageScan_ = builder.stageScanBuilder().build(); - sheetCalibrations_ = new DefaultSheetCalibration[1]; - sliceCalibrations_ = new DefaultSliceCalibration[1]; // TODO: use this object directly - for (int i = 0; i < 1; i ++) { - sheetCalibrations_[i] = builder.sheetCalibBuilder_[i].build(); - sliceCalibrations_[i] = builder.sliceCalibBuilder_[i].build(); - } + sheetCalibration_ = builder.sheetCalibBuilder_.build(); + sliceCalibration_ = builder.sliceCalibBuilder_.build(); acquisitionMode_ = builder.acquisitionMode_; cameraMode_ = builder.cameraMode_; imagingCameraOrder_ = builder.imagingCameraOrder_; useTimePoints_ = builder.useTimePoints_; - useAutofocus_ = builder.useAutofocus_; - useStageScanning_ = builder.useStageScanning_; useMultiplePositions_ = builder.useMultiplePositions_; useHardwareTimePoints_ = builder.useHardwareTimePoints_; useAdvancedTiming_ = builder.useAdvancedTiming_; @@ -319,8 +292,8 @@ private ScapeAcquisitionSettings(Builder builder) { * @return immutable DefaultChannelSettings instance. */ @Override - public DefaultChannelSettings channels() { - return channelSettings_; + public ChannelSettings channels() { + return channels_; } /** @@ -330,7 +303,7 @@ public DefaultChannelSettings channels() { */ @Override public DefaultTimingSettings timing() { - return timingSettings_; + return timing_; } /** @@ -340,7 +313,7 @@ public DefaultTimingSettings timing() { */ @Override public DefaultVolumeSettings volume() { - return volumeSettings_; + return volume_; } /** @@ -350,7 +323,7 @@ public DefaultVolumeSettings volume() { */ @Override public DefaultSliceSettings slice() { - return sliceSettings_; + return slice_; } /** @@ -369,8 +342,8 @@ public StageScanSettings stageScan() { * @return immutable DefaultSheetCalibration instance. */ @Override - public DefaultSheetCalibration sheetCalibration(final int view) { - return sheetCalibrations_[view-1]; + public DefaultSheetCalibration sheetCalibration() { + return sheetCalibration_; } /** @@ -381,8 +354,8 @@ public DefaultSheetCalibration sheetCalibration(final int view) { * @return immutable DefaultSliceCalibration instance. */ @Override - public DefaultSliceCalibration sliceCalibration(final int view) { - return sliceCalibrations_[view-1]; + public DefaultSliceCalibration sliceCalibration() { + return sliceCalibration_; } /** @@ -425,16 +398,6 @@ public boolean isUsingTimePoints() { return useTimePoints_; } - /** - * Returns true if using autofocus. - * - * @return true if using autofocus. - */ - @Override - public boolean isUsingAutofocus() { - return useAutofocus_; - } - /** * Returns true if using multiple positions. * @@ -455,16 +418,6 @@ public boolean isUsingHardwareTimePoints() { return useHardwareTimePoints_; } - /** - * Returns true if using stage scanning. - * - * @return true if using stage scanning. - */ - @Override - public boolean isUsingStageScanning() { - return useStageScanning_; - } - /** * Returns true if using advanced timing settings. * @@ -508,7 +461,7 @@ public int postMoveDelay() { // TODO: finish this, and maybe use pretty printing? or just rely on JSON conversion? @Override public String toString() { - return String.format("[timingSettings_=%s]", timingSettings_); + return String.format("[timingSettings_=%s]", timing_); } // public String toJson() { diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java index 36b22501..c20121a7 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java @@ -170,7 +170,7 @@ private void createUserInterface() { cmbAcquisitionModes_ = new ComboBox<>( AcquisitionMode.modesByType( model_.devices().adapter().geometry(), - model_.devices().isUsingStageScanning()), + model_.devices().hasStageScanning()), settings.acquisitionMode(), 180, 24); diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AutofocusTab.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AutofocusTab.java index 3df787f9..4dd4e1a8 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AutofocusTab.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AutofocusTab.java @@ -78,21 +78,21 @@ public void createUserInterface() { // final Label lblToleranceUm = new Label("Tolerance [µm]"); cbxShowImages_ = new CheckBox("Show Images", 12, - acqSettings.autofocusSettings().showImages(), CheckBox.RIGHT); + acqSettings.autofocus().showImages(), CheckBox.RIGHT); cbxShowGraph_ = new CheckBox("Show Graph", 12, - acqSettings.autofocusSettings().showGraph(), CheckBox.RIGHT); + acqSettings.autofocus().showGraph(), CheckBox.RIGHT); spnNumImages_ = Spinner.createIntegerSpinner( - acqSettings.autofocusSettings().numImages(), 0, Integer.MAX_VALUE, 1); + acqSettings.autofocus().numImages(), 0, Integer.MAX_VALUE, 1); spnStepSize_ = Spinner.createDoubleSpinner( - acqSettings.autofocusSettings().stepSizeUm(), 0.0, 100.0, 1.0); + acqSettings.autofocus().stepSizeUm(), 0.0, 100.0, 1.0); // spnToleranceUm_ = Spinner.createDoubleSpinner( // acqSettings.autofocusSettings().toleranceUm(), 0.0, 1.0, 0.01); cmbScoringMethod_ = new ComboBox<>(AutofocusType.values(), - acqSettings.autofocusSettings().scoringMethod(), 120, 20); + acqSettings.autofocus().scoringMethod(), 120, 20); cmbAutofocusMode_ = new ComboBox<>(AutofocusMode.values(), - acqSettings.autofocusSettings().mode(), 140, 20); + acqSettings.autofocus().mode(), 140, 20); btnRunAutofocus_ = new Button("Run Autofocus", 120, 30); btnRunAutofocus_.setEnabled(false); // FIXME: impl autofocus diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SettingsTab.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SettingsTab.java index d3dc408d..ce16913f 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SettingsTab.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SettingsTab.java @@ -45,7 +45,7 @@ private void createUserInterface() { // check for devices to set up the tab isUsingPLogic_ = model_.devices().isUsingPLogic(); - isUsingScanSettings_ = model_.devices().isUsingStageScanning(); + isUsingScanSettings_ = model_.devices().hasStageScanning(); final Panel pnlScanSettings = new Panel("Stage Scan Settings"); pnlScanSettings.setMigLayout( diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/DurationPanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/DurationPanel.java index cf1925f7..33d3b561 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/DurationPanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/DurationPanel.java @@ -16,7 +16,7 @@ public class DurationPanel extends Panel { public DurationPanel(final LightSheetManager model) { super("Durations"); Objects.requireNonNull(model) - .acquisitions().setVolumeDurationPanel(this); + .acquisitions().setDurationPanel(this); createUserInterface(); } diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SavePanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SavePanel.java index 07a893cb..637265b0 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SavePanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SavePanel.java @@ -36,7 +36,7 @@ public class SavePanel extends Panel { private final LightSheetManagerFrame frame_; public SavePanel(final LightSheetManager model, final LightSheetManagerFrame frame) { - super("Save Data"); + super("Save Settings"); model_ = Objects.requireNonNull(model); frame_ = Objects.requireNonNull(frame); diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SlicePanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SlicePanel.java index 3280f15c..a1b2e61b 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SlicePanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SlicePanel.java @@ -46,7 +46,7 @@ private void createUserInterface() { ); final DefaultSliceSettings sliceSettings = model_.acquisitions().settings().slice(); - final boolean isSlicePeriodMinimized = sliceSettings.isSlicePeriodMinimized(); + final boolean isSlicePeriodMinimized = sliceSettings.periodMinimized(); // regular panel lblSlicePeriod_ = new Label("Slice period [ms]:"); @@ -54,7 +54,7 @@ private void createUserInterface() { cbxMinimizeSlicePeriod_ = new CheckBox( "Minimize slice period", 12, isSlicePeriodMinimized, CheckBox.RIGHT); spnSlicePeriod_ = Spinner.createDoubleSpinner( - sliceSettings.slicePeriod(), 0.0, Double.MAX_VALUE, 0.25); + sliceSettings.period(), 0.0, Double.MAX_VALUE, 0.25); spnSampleExposure_ = Spinner.createDoubleSpinner( sliceSettings.sampleExposure(), 0.0, Double.MAX_VALUE, 0.25); @@ -97,7 +97,7 @@ private void createEventHandlers() { lblSlicePeriod_.setEnabled(!selected); spnSlicePeriod_.setEnabled(!selected); model_.acquisitions().settingsBuilder() - .sliceBuilder().minimizeSlicePeriod(selected); + .sliceBuilder().minimizePeriod(selected); // update slice timing model_.acquisitions().updateAcquisitionSettings(); model_.acquisitions().recalculateSliceTiming(); @@ -105,7 +105,7 @@ private void createEventHandlers() { spnSlicePeriod_.registerListener(e -> { model_.acquisitions().settingsBuilder() - .sliceBuilder().slicePeriod(spnSlicePeriod_.getDouble()); + .sliceBuilder().period(spnSlicePeriod_.getDouble()); // update slice timing model_.acquisitions().updateAcquisitionSettings(); model_.acquisitions().recalculateSliceTiming(); diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/BeamSheetControlPanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/BeamSheetControlPanel.java index 2588cc00..7754fccf 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/BeamSheetControlPanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/BeamSheetControlPanel.java @@ -58,7 +58,7 @@ public BeamSheetControlPanel(final LightSheetManager model, final int pathNum) { createEventHandlers(); currentOffset_ = model_.acquisitions().settings() - .sheetCalibration(pathNum_).sheetOffset(); + .sheetCalibration().sheetOffset(); } private void createUserInterface() { @@ -101,8 +101,8 @@ private void createUserInterface() { sldSheetWidth_ = new Slider(0, 8, 1000); sldSheetOffset_ = new Slider(-1, 1, 1000); - sldSheetWidth_.setDouble(acqSettings.sheetCalibration(pathNum_).sheetWidth()); - sldSheetOffset_.setDouble(acqSettings.sheetCalibration(pathNum_).sheetOffset()); + sldSheetWidth_.setDouble(acqSettings.sheetCalibration().sheetWidth()); + sldSheetOffset_.setDouble(acqSettings.sheetCalibration().sheetOffset()); // virtual slit trigger mode pnlFirst_.add(lblSlope, ""); @@ -132,7 +132,7 @@ private void createUserInterface() { case SCAPE: txtSheetOffset_ = new TextField(6); final double value = model_.acquisitions().settings() - .sheetCalibration(pathNum_).sheetOffset(); + .sheetCalibration().sheetOffset(); txtSheetOffset_.setText(String.valueOf(value)); //lblSlopeOffset_ = new JLabel(strValue); pnlSecond_.add(lblSheetOffset, ""); @@ -194,7 +194,7 @@ private void createEventHandlers() { final double value = Double.parseDouble(txtSheetOffset_.getText()); //final double total = Math.max(-1.0, Math.min(1.0, value)); model_.acquisitions().settingsBuilder() - .sheetCalibrationBuilder(pathNum_).sheetOffset(value); + .sheetCalibrationBuilder().sheetOffset(value); // currentOffset_ = total; // EventQueue.invokeLater(() -> { // lblSlopeOffset_.setText(String.format("%.3f", total)); diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/PiezoCalibrationPanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/PiezoCalibrationPanel.java index de27a3f1..e37aaa70 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/PiezoCalibrationPanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/PiezoCalibrationPanel.java @@ -86,8 +86,8 @@ private void createUserInterface() { txtOffset_ = new TextField(7); txtStepSize_ = new TextField(); - final double sliceSlope = acqSettings.sliceCalibration(pathNum_).sliceSlope(); - final double sliceOffset = acqSettings.sliceCalibration(pathNum_).sliceOffset(); + final double sliceSlope = acqSettings.sliceCalibration().sliceSlope(); + final double sliceOffset = acqSettings.sliceCalibration().sliceOffset(); txtSlope_.setText("0"); txtOffset_.setText("0"); @@ -157,7 +157,7 @@ private void createEventHandlers() { btnUpdate_.registerListener(e -> { if (scanner.isBeamOn()) { final double rate = model_.acquisitions().settings() - .sliceCalibration(pathNum_).sliceSlope(); + .sliceCalibration().sliceSlope(); final double piezoPosition = piezo.getPosition(); final double scannerPosition = scanner.getPosition().y; double channelOffset = 0.0; @@ -168,9 +168,9 @@ private void createEventHandlers() { lblOffsetValue_.setText(String.format("%.3f μm", newOffset)); panel_.setImagingCenterValue(newOffset); model_.acquisitions().settingsBuilder() - .sheetCalibrationBuilder(pathNum_).imagingCenter(newOffset); + .sheetCalibrationBuilder().imagingCenter(newOffset); model_.acquisitions().settingsBuilder() - .sliceCalibrationBuilder(pathNum_).sliceOffset(newOffset); + .sliceCalibrationBuilder().sliceOffset(newOffset); model_.studio().logs().logMessage("updated offset for view " + pathNum_ + "; new value is " + newOffset + " (with channel offset of " + channelOffset + ")"); } @@ -187,19 +187,19 @@ private void createEventHandlers() { txtSlope_.registerListener(e -> { final double slope = Double.parseDouble(txtSlope_.getText()); model_.acquisitions().settingsBuilder() - .sliceCalibrationBuilder(pathNum_).sliceSlope(slope); + .sliceCalibrationBuilder().sliceSlope(slope); lblSlopeValue_.setText(String.format("%.3f μm/°", slope)); }); txtOffset_.registerListener(e -> { final double offset = Double.parseDouble(txtOffset_.getText()); model_.acquisitions().settingsBuilder() - .sliceCalibrationBuilder(pathNum_).sliceOffset(offset); + .sliceCalibrationBuilder().sliceOffset(offset); lblOffsetValue_.setText(String.format("%.3f μm", offset)); // also update the imaging center on the position panel panel_.setImagingCenterValue(offset); model_.acquisitions().settingsBuilder() - .sheetCalibrationBuilder(pathNum_).imagingCenter(offset); + .sheetCalibrationBuilder().imagingCenter(offset); }); btnRunAutofocus_.registerListener(e -> { diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/PositionPanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/PositionPanel.java index bbb7f8c3..39d8f9a1 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/PositionPanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/PositionPanel.java @@ -59,7 +59,7 @@ private void createUserInterface() { final JLabel lblImagingCenter = new JLabel("Imaging Center:"); final double imagingCenter = model_.acquisitions().settings() - .sheetCalibration(pathNum_).imagingCenter(); + .sheetCalibration().imagingCenter(); lblImagingCenterValue_ = new JLabel(imagingCenter + " μm"); setMigLayout( @@ -187,14 +187,14 @@ private void createEventHandlers() { // FIXME: check for piezo limits! final double piezoPosition = piezo.getPosition(); model_.acquisitions().settingsBuilder() - .sheetCalibrationBuilder(pathNum_).imagingCenter(piezoPosition); + .sheetCalibrationBuilder().imagingCenter(piezoPosition); lblImagingCenterValue_.setText(String.format("%.3f μm", piezoPosition)); }); btnImagingCenterGo_.registerListener(e -> { // FIXME: make sure this is the same as original plugin, diSPIM also moves Scanner with computeGalvoFromPiezo final double imagingCenter = model_.acquisitions().settingsBuilder().build() - .sheetCalibration(pathNum_).imagingCenter(); + .sheetCalibration().imagingCenter(); piezo.setPosition(imagingCenter); lblImagingPositionValue_.setText(String.format("%.3f μm", piezo.getPosition())); }); diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/DeviceManager.java b/src/main/java/org/micromanager/lightsheetmanager/model/DeviceManager.java index 2c8fea07..3fc55e8c 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/DeviceManager.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/DeviceManager.java @@ -264,13 +264,19 @@ public T device(final String deviceName) { public Optional device2(final String deviceName, final Class type) { final DeviceBase device = deviceMap_.get(deviceName); + // is the device in the map? if (device == null) { + studio_.logs().logError("Device '" + deviceName + "' not found."); return Optional.empty(); } + // are both types the same? if (!type.isInstance(device)) { - throw new DeviceTypeMismatchException( - deviceName, device.getClass().getSimpleName(), type.getSimpleName()); + studio_.logs().logError(String.format( + "Device '%s' is a %s, but you requested a %s.", + deviceName, device.getClass().getSimpleName(), type.getSimpleName())); + return Optional.empty(); } + // cast at runtime return Optional.of(type.cast(device)); } @@ -452,7 +458,7 @@ public boolean isUsingPLogic() { } // check for ASI stage scanning - public boolean isUsingStageScanning() { + public boolean hasStageScanning() { if (deviceMap_.get("SampleXY") == null) { return false; // early exit => device not set } diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java index ccd83b8a..b893b517 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java @@ -188,7 +188,7 @@ public boolean prepareControllerForAcquisition( } } - if (settings.isUsingStageScanning() + if (settings.stageScan().enabled() && settings.acquisitionMode() == AcquisitionMode.STAGE_SCAN_INTERLEAVED) { if (numViews != 2) { studio_.logs().showError("Interleaved stage scan only possible for 2-sided acquisition."); @@ -211,7 +211,7 @@ public boolean prepareControllerForAcquisition( studio_.logs().showError("could not set shutter to " + plcLaser_.getDeviceName()); } - if (settings.isUsingStageScanning()) { + if (settings.stageScan().enabled()) { // scanning with ASI stage // algorithm is as follows: // use the # of slices and slice spacing that the user specifies @@ -547,11 +547,11 @@ public boolean prepareControllerForAcquisitionSide( scanner.setSPIMNumRepeats(numVolumesPerTrigger); scanner.setSPIMDelayBeforeSide( - settings.isUsingStageScanning() ? 0 // minimal delay on micro-mirror card for stage scanning (can't actually be less than 2ms but this will get as small as possible) + settings.stageScan().enabled() ? 0 // minimal delay on micro-mirror card for stage scanning (can't actually be less than 2ms but this will get as small as possible) : settings.volume().delayBeforeView()); // this is the usual behavior } double piezoCenter; - if (settings.isUsingStageScanning()) { + if (settings.stageScan().enabled()) { // for stage scanning we define the piezo position to be the home position (normally 0) // this is basically required for interleaved mode (otherwise piezo would be moving every slice) // and by convention we'll do it for all stage scanning @@ -562,14 +562,13 @@ public boolean prepareControllerForAcquisitionSide( if (centerAtCurrentZ) { piezoCenter = piezo.getPosition(); //positions_.getUpdatedPosition(piezoDevice, Joystick.Directions.NONE); } else { - piezoCenter = model_.acquisitions().settings() - .sheetCalibration(view).imagingCenter(); + piezoCenter = model_.acquisitions().settings().sheetCalibration().imagingCenter(); } } // if we set piezoAmplitude to 0 here then sliceAmplitude will also be 0 double piezoAmplitude; - if (settings.isUsingStageScanning() || settings.acquisitionMode() == AcquisitionMode.NO_SCAN) { + if (settings.stageScan().enabled() || settings.acquisitionMode() == AcquisitionMode.NO_SCAN) { piezoAmplitude = 0.0; } else { piezoAmplitude = (settings.volume().slicesPerView() - 1) * settings.volume().sliceStepSize(); @@ -664,14 +663,14 @@ public boolean prepareControllerForAcquisitionSide( piezo.sa().setAmplitude(piezoAmplitude); piezo.sa().setOffset(piezoCenter); - if (!settings.isUsingStageScanning()) { + if (!settings.stageScan().enabled()) { piezo.setSPIMNumSlices(numSlicesHW); piezo.setSPIMState(ASIPiezo.SPIMState.ARMED); } // TODO figure out what we should do with piezo illumination/center position during stage scan // set up stage scan parameters if necessary - if (settings.isUsingStageScanning()) { + if (settings.stageScan().enabled()) { // TODO update UI to hide image center control for stage scanning // for interleaved stage scanning there will never be "home" pulse and for normal stage scanning // the first side piezo will never get moved into position either so do both manually (for @@ -679,8 +678,8 @@ public boolean prepareControllerForAcquisitionSide( piezo.home(); } - final boolean isInterleaved = (settings.isUsingStageScanning() - && settings.acquisitionMode() == AcquisitionMode.STAGE_SCAN_INTERLEAVED); + final boolean isInterleaved = settings.stageScan().enabled() + && settings.acquisitionMode() == AcquisitionMode.STAGE_SCAN_INTERLEAVED; // even though we have moved piezos to home position let's still tell firmware // not to move piezos anywhere (i.e. maybe setting "home disable" to true doesn't have any really effect) @@ -1021,7 +1020,7 @@ public double getSheetWidth(CameraMode cameraMode, int view) { // final Properties.Keys widthProp = (side == Devices.Sides.A) ? // Properties.Keys.PLUGIN_SHEET_WIDTH_EDGE_A : Properties.Keys.PLUGIN_SHEET_WIDTH_EDGE_B; // sheetWidth = props_.getPropValueFloat(Devices.Keys.PLUGIN, widthProp); - sheetWidth = model_.getAcquisitionEngine().settings().sheetCalibration(view).sheetWidth(); + sheetWidth = model_.getAcquisitionEngine().settings().sheetCalibration().sheetWidth(); if (cameraName == null || cameraName.isEmpty()) { studio_.logs().logDebugMessage("Could not get sheet width for invalid device " + cameraName); @@ -1040,13 +1039,13 @@ public double getSheetWidth(CameraMode cameraMode, int view) { // final float slopePolarity = (side == Devices.Sides.B) ? -1 : 1; // sheetWidth = roi.height * sheetSlope * slopePolarity / 1e6; // in microdegrees per pixel, convert to degrees } else { - final boolean autoSheet = model_.getAcquisitionEngine().settings().sheetCalibration(view).isUsingAutoSheetWidth(); + final boolean autoSheet = model_.getAcquisitionEngine().settings().sheetCalibration().isUsingAutoSheetWidth(); if (autoSheet) { Rectangle roi = camera.getROI(); if (roi == null || roi.height == 0) { studio_.logs().logDebugMessage("Could not get camera ROI for auto sheet mode"); } - final double sheetSlope = model_.getAcquisitionEngine().settings().sheetCalibration(view).autoSheetWidthPerPixel(); + final double sheetSlope = model_.getAcquisitionEngine().settings().sheetCalibration().autoSheetWidthPerPixel(); sheetWidth = roi.height * sheetSlope / 1000.0; // in millidegrees per pixel, convert to degrees sheetWidth *= 1.1; // 10% extra width just to be sure } @@ -1075,12 +1074,12 @@ public double getSheetOffset(CameraMode cameraMode, int view) { if (cameraMode == CameraMode.VIRTUAL_SLIT) { // in millidegrees, convert to degrees // TODO: is this correct? - sheetOffset = model_.getAcquisitionEngine().settings().sheetCalibration(view).sheetOffset() / 1000.0; + sheetOffset = model_.getAcquisitionEngine().settings().sheetCalibration().sheetOffset() / 1000.0; //sheetOffset = prefs_.getFloat( //MyStrings.PanelNames.SETUP.toString() + side.toString(), //Properties.Keys.PLUGIN_LIGHTSHEET_OFFSET, 0) / 1000; // in millidegrees, convert to degrees } else { - sheetOffset = model_.getAcquisitionEngine().settings().sheetCalibration(view).sheetOffset(); + sheetOffset = model_.getAcquisitionEngine().settings().sheetCalibration().sheetOffset(); //final Properties.Keys offsetProp = (side == Devices.Sides.A) ? // Properties.Keys.PLUGIN_SHEET_OFFSET_EDGE_A : Properties.Keys.PLUGIN_SHEET_OFFSET_EDGE_B; // sheetOffset = props_.getPropValueFloat(Devices.Keys.PLUGIN, offsetProp); diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java index 1e25bbe6..2f9716dd 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java @@ -148,7 +148,7 @@ public boolean prepareControllerForAcquisition( // } // } - if (settings.isUsingStageScanning() + if (settings.stageScan().enabled() && settings.acquisitionMode() == AcquisitionMode.STAGE_SCAN_INTERLEAVED) { if (settings.volume().numViews() != 2) { studio_.logs().showError("Interleaved stage scan only possible for 2-sided acquisition."); @@ -171,7 +171,7 @@ public boolean prepareControllerForAcquisition( studio_.logs().showError("could not set shutter to " + plcLaser_.getDeviceName()); } - if (!acqSettings_.isUsingStageScanning()) { + if (!acqSettings_.stageScan().enabled()) { scanDistance_ = 0; } else { // stage scanning with ASI stage @@ -433,11 +433,11 @@ public boolean prepareControllerForAcquisitionSide( scanner_.setSPIMNumRepeats(numVolumesPerTrigger); scanner_.setSPIMDelayBeforeSide( - settings.isUsingStageScanning() ? 0 // minimal delay on micro-mirror card for stage scanning (can't actually be less than 2ms but this will get as small as possible) + settings.stageScan().enabled() ? 0 // minimal delay on micro-mirror card for stage scanning (can't actually be less than 2ms but this will get as small as possible) : settings.volume().delayBeforeView()); // this is the usual behavior } double piezoCenter; - if (settings.isUsingStageScanning()) { + if (settings.stageScan().enabled()) { // for stage scanning we define the piezo position to be the home position (normally 0) // this is basically required for interleaved mode (otherwise piezo would be moving every slice) // and by convention we'll do it for all stage scanning @@ -448,14 +448,13 @@ public boolean prepareControllerForAcquisitionSide( if (centerAtCurrentZ) { piezoCenter = piezo_.getPosition(); //positions_.getUpdatedPosition(piezoDevice, Joystick.Directions.NONE); } else { - piezoCenter = model_.acquisitions().settings() - .sheetCalibration(view).imagingCenter(); + piezoCenter = model_.acquisitions().settings().sheetCalibration().imagingCenter(); } } // if we set piezoAmplitude to 0 here then sliceAmplitude will also be 0 double piezoAmplitude; - if (settings.isUsingStageScanning() || settings.acquisitionMode() == AcquisitionMode.NO_SCAN) { + if (settings.stageScan().enabled() || settings.acquisitionMode() == AcquisitionMode.NO_SCAN) { piezoAmplitude = 0.0; } else { piezoAmplitude = (settings.volume().slicesPerView() - 1) * settings.volume().sliceStepSize(); @@ -486,14 +485,14 @@ public boolean prepareControllerForAcquisitionSide( // FIXME: more light sheet setup //final double slope1 = settings.sliceCalibration(1).sliceSlope(); //final double slope2 = settings.sliceCalibration(2).sliceSlope(); - double sliceRate = settings.sliceCalibration(1).sliceSlope();//(view == 1) ? slope1 : slope2; + double sliceRate = settings.sliceCalibration().sliceSlope();//(view == 1) ? slope1 : slope2; if (NumberUtils.doublesEqual(sliceRate, 0.0)) { studio_.logs().showError("Calibration slope for view " + view + " cannot be zero. Re-do calibration on Setup tab."); return false; } //final double offset1 = settings.sliceCalibration(1).sliceOffset() + channelOffset; //final double offset2 = settings.sliceCalibration(2).sliceOffset() + channelOffset; - double sliceOffset = settings.sliceCalibration(1).sliceOffset() + channelOffset; //(view == 1) ? offset1 : offset2; + double sliceOffset = settings.sliceCalibration().sliceOffset() + channelOffset; //(view == 1) ? offset1 : offset2; double sliceAmplitude = piezoAmplitude / sliceRate; double sliceCenter = (piezoCenter - sliceOffset) / sliceRate; @@ -552,14 +551,14 @@ public boolean prepareControllerForAcquisitionSide( piezo_.sa().setAmplitude(piezoAmplitude); piezo_.sa().setOffset(piezoCenter); - if (!settings.isUsingStageScanning()) { + if (!settings.stageScan().enabled()) { piezo_.setSPIMNumSlices(numSlicesHW); piezo_.setSPIMState(ASIPiezo.SPIMState.ARMED); } // TODO figure out what we should do with piezo illumination/center position during stage scan // set up stage scan parameters if necessary - if (settings.isUsingStageScanning()) { + if (settings.stageScan().enabled()) { // TODO update UI to hide image center control for stage scanning // for interleaved stage scanning there will never be "home" pulse and for normal stage scanning // the first side piezo will never get moved into position either so do both manually (for @@ -567,8 +566,8 @@ public boolean prepareControllerForAcquisitionSide( piezo_.home(); } - final boolean isInterleaved = (settings.isUsingStageScanning() - && settings.acquisitionMode() == AcquisitionMode.STAGE_SCAN_INTERLEAVED); + final boolean isInterleaved = settings.stageScan().enabled() + && settings.acquisitionMode() == AcquisitionMode.STAGE_SCAN_INTERLEAVED; // even though we have moved piezos to home position let's still tell firmware // not to move piezos anywhere (i.e. maybe setting "home disable" to true doesn't have any really effect) @@ -919,7 +918,7 @@ public double getSheetWidth(CameraMode cameraMode, int view) { // final Properties.Keys widthProp = (side == Devices.Sides.A) ? // Properties.Keys.PLUGIN_SHEET_WIDTH_EDGE_A : Properties.Keys.PLUGIN_SHEET_WIDTH_EDGE_B; // sheetWidth = props_.getPropValueFloat(Devices.Keys.PLUGIN, widthProp); - sheetWidth = model_.getAcquisitionEngine().settings().sheetCalibration(view).sheetWidth(); + sheetWidth = model_.getAcquisitionEngine().settings().sheetCalibration().sheetWidth(); if (cameraName == null || cameraName.isEmpty()) { studio_.logs().logDebugMessage("Could not get sheet width for invalid device " + cameraName); @@ -938,13 +937,13 @@ public double getSheetWidth(CameraMode cameraMode, int view) { // final float slopePolarity = (side == Devices.Sides.B) ? -1 : 1; // sheetWidth = roi.height * sheetSlope * slopePolarity / 1e6; // in microdegrees per pixel, convert to degrees } else { - final boolean autoSheet = model_.getAcquisitionEngine().settings().sheetCalibration(view).isUsingAutoSheetWidth(); + final boolean autoSheet = model_.getAcquisitionEngine().settings().sheetCalibration().isUsingAutoSheetWidth(); if (autoSheet) { Rectangle roi = camera.getROI(); if (roi == null || roi.height == 0) { studio_.logs().logDebugMessage("Could not get camera ROI for auto sheet mode"); } - final double sheetSlope = model_.getAcquisitionEngine().settings().sheetCalibration(view).autoSheetWidthPerPixel(); + final double sheetSlope = model_.getAcquisitionEngine().settings().sheetCalibration().autoSheetWidthPerPixel(); sheetWidth = roi.height * sheetSlope / 1000.0; // in millidegrees per pixel, convert to degrees sheetWidth *= 1.1; // 10% extra width just to be sure } @@ -973,12 +972,12 @@ public double getSheetOffset(CameraMode cameraMode, int view) { if (cameraMode == CameraMode.VIRTUAL_SLIT) { // in millidegrees, convert to degrees // TODO: is this correct? - sheetOffset = model_.getAcquisitionEngine().settings().sheetCalibration(view).sheetOffset() / 1000.0; + sheetOffset = model_.getAcquisitionEngine().settings().sheetCalibration().sheetOffset() / 1000.0; //sheetOffset = prefs_.getFloat( //MyStrings.PanelNames.SETUP.toString() + side.toString(), //Properties.Keys.PLUGIN_LIGHTSHEET_OFFSET, 0) / 1000; // in millidegrees, convert to degrees } else { - sheetOffset = model_.getAcquisitionEngine().settings().sheetCalibration(view).sheetOffset(); + sheetOffset = model_.getAcquisitionEngine().settings().sheetCalibration().sheetOffset(); //final Properties.Keys offsetProp = (side == Devices.Sides.A) ? // Properties.Keys.PLUGIN_SHEET_OFFSET_EDGE_A : Properties.Keys.PLUGIN_SHEET_OFFSET_EDGE_B; // sheetOffset = props_.getPropValueFloat(Devices.Keys.PLUGIN, offsetProp); @@ -1029,7 +1028,7 @@ public void setPathPreset(int side) { public void stopSPIMStateMachines() { scanner_.setSPIMState(ASIScanner.SPIMState.IDLE); - if (acqSettings_.isUsingStageScanning()) { + if (acqSettings_.stageScan().enabled()) { // give the stage scan 5 seconds to clean itself up, after which we stop it // once all images come in there is still a time when stage is moving back to its start/center position final int timeoutStageScanCleanupMs = 5000; diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngine.java b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngine.java index 32e5a933..43aed483 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngine.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngine.java @@ -50,7 +50,7 @@ public abstract class AcquisitionEngine implements AcquisitionManager, MMAcquist protected Pipeline curPipeline_; protected long nextWakeTime_ = -1; - protected DurationPanel pnlVolumeDurations_; + protected DurationPanel pnlDuration_; // TODO: remove later, hacky method to stop position updater for now protected LightSheetManagerFrame frame_; @@ -84,8 +84,8 @@ public AcquisitionEngine(final LightSheetManager model) { public abstract void updateDurationLabels(); - public void setVolumeDurationPanel(final DurationPanel panel) { - pnlVolumeDurations_ = panel; + public void setDurationPanel(final DurationPanel panel) { + pnlDuration_ = Objects.requireNonNull(panel);; } public void setFrame(final LightSheetManagerFrame frame) { diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java index faa95327..24ee679b 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java @@ -299,7 +299,7 @@ public AcquisitionEvent run(AcquisitionEvent event) { // TODO: where should these come from? In diSPIM they appear to come from preferences, // not settings... - boolean doAutofocus = acqSettings_.isUsingAutofocus(); + boolean doAutofocus = acqSettings_.autofocus().enabled(); boolean autofocusAtT0 = false; // TODO: this is where they come from in diSPIM? @@ -311,7 +311,7 @@ public AcquisitionEvent run(AcquisitionEvent event) { // TODO: this is the diSPIM plugin's autofocus code, which needs to be reimplemented // and translated. There are also currently no autofocus related things in the acqSettings_ -// if (acqSettings_.isUsingAutofocus()) { +// if (acqSettings_.autofocus().enabled()) { // // (Copied from diSPIM): Note that we will not autofocus as expected when using hardware // // timing. Seems OK, since hardware timing will result in short // // acquisition times that do not need autofocus. @@ -617,7 +617,7 @@ private boolean doHardwareCalculations(PLogicDispim plc) { if (acqSettings_.isUsingTimePoints() && acqSettings_.numTimePoints() > 1 && timepointIntervalMs < (timepointDuration + 750) - && !acqSettings_.isUsingStageScanning()) { + && !acqSettings_.stageScan().enabled()) { // acqSettings_.useHardwareTimesPoints(true); asb_.useHardwareTimePoints(true); } @@ -929,7 +929,7 @@ private double computeActualVolumeDuration(final DispimAcquisitionSettings acqSe // stackDuration is per-side, per-channel, per-position final double stackDuration = numCameraTriggers * acqSettings.timing().sliceDuration(); - if (acqSettings.isUsingStageScanning()) { // || acqSettings.isStageStepping) { + if (acqSettings.stageScan().enabled()) { // || acqSettings.isStageStepping) { // TODO: stage scanning code return 0; } else { diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java index d22ca2bd..5f4e1820 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -72,8 +72,8 @@ boolean setup() { studio_.logs().logMessage("stopped position polling"); } - asb_.sheetCalibrationBuilder(1).useAutoSheetWidth(true); - asb_.sheetCalibrationBuilder(1).autoSheetWidthPerPixel(0.0); + asb_.sheetCalibrationBuilder().useAutoSheetWidth(true); + asb_.sheetCalibrationBuilder().autoSheetWidthPerPixel(0.0); // make settings current updateAcquisitionSettings(); @@ -145,7 +145,7 @@ boolean run() { origAccelX_ = 1.0; // don't want 0 in case something goes wrong // make sure stage scan is supported if selected - if (acqSettings_.isUsingStageScanning()) { + if (acqSettings_.stageScan().enabled()) { final ASIXYStage xyStage = model_.devices().device("SampleXY"); if (xyStage != null) { if (!xyStage.hasProperty(ASIXYStage.Properties.SCAN_NUM_LINES)) { @@ -358,7 +358,7 @@ public AcquisitionEvent run(AcquisitionEvent event) { // TODO: where should these come from? In diSPIM they appear to come from preferences, // not settings... - boolean doAutofocus = acqSettings_.isUsingAutofocus(); + boolean doAutofocus = acqSettings_.autofocus().enabled(); boolean autofocusAtT0 = false; // TODO: this is where they come from in diSPIM? @@ -370,7 +370,7 @@ public AcquisitionEvent run(AcquisitionEvent event) { // TODO: this is the diSPIM plugin's autofocus code, which needs to be reimplemented // and translated. -// if (acqSettings_.isUsingAutofocus()) { +// if (acqSettings_.autofocus().enabled()) { // // (Copied from diSPIM): Note that we will not autofocus as expected when using hardware // // timing. Seems OK, since hardware timing will result in short // // acquisition times that do not need autofocus. @@ -411,7 +411,7 @@ public AcquisitionEvent run(AcquisitionEvent event) { // move between positions fast scanSpeedX_ = 1.0; scanAccelX_ = 1.0; - if (acqSettings_.isUsingStageScanning() && acqSettings_.isUsingMultiplePositions()) { + if (acqSettings_.stageScan().enabled() && acqSettings_.isUsingMultiplePositions()) { final ASIXYStage xyStage = model_.devices().device("SampleXY"); scanSpeedX_ = xyStage.getSpeedX(); scanAccelX_ = xyStage.getAccelerationX(); @@ -436,7 +436,7 @@ public void close() { // System.out.println("After hardware hook"); // // for stage scanning: restore speed and set up scan at new position // // non-multi-position situation is handled in prepareControllerForAcquisition instead -//// if (acqSettings_.isUsingStageScanning() && acqSettings_.isUsingMultiplePositions()) { +//// if (acqSettings_.stageScan().enabled() && acqSettings_.isUsingMultiplePositions()) { //// final ASIXYStage xyStage = model_.devices().getDevice("SampleXY"); //// final Point2D.Double pos = xyStage.getXYPosition(); //// xyStage.setSpeedX(scanSpeedX_); @@ -464,7 +464,7 @@ public AcquisitionEvent run(AcquisitionEvent event) { // TODO: Cameras are now ready to receive triggers, so we can send (software) trigger // to the tiger to tell it to start outputting TTLs if (isUsingPLC) { - if (acqSettings_.isUsingStageScanning() && acqSettings_.isUsingMultiplePositions()) { + if (acqSettings_.stageScan().enabled() && acqSettings_.isUsingMultiplePositions()) { final ASIXYStage xyStage = model_.devices().device("SampleXY"); final Point2D.Double pos = xyStage.getXYPosition(); xyStage.setSpeedX(scanSpeedX_); @@ -721,7 +721,7 @@ boolean finish() { } // if we did stage scanning restore the original position and speed - if (acqSettings_.isUsingStageScanning()) { + if (acqSettings_.stageScan().enabled()) { final ASIXYStage xyStage = model_.devices().device("SampleXY"); final boolean returnToOriginalPosition = acqSettings_.stageScan().returnToStart(); @@ -906,7 +906,7 @@ private boolean doHardwareCalculations(PLogicScape plc) { if (acqSettings_.isUsingTimePoints() && acqSettings_.numTimePoints() > 1 && timepointIntervalMs < (timepointDuration + 750) - && !acqSettings_.isUsingStageScanning()) { + && !acqSettings_.stageScan().enabled()) { asb_.useHardwareTimePoints(true); isUsingHardwareTimePoints = true; } @@ -969,7 +969,7 @@ private boolean doHardwareCalculations(PLogicScape plc) { "with software channels (need to use PLogic channel switching)."); return false; } - if (acqSettings_.isUsingStageScanning()) { + if (acqSettings_.stageScan().enabled()) { // stage scanning needs to be triggered for each time point studio_.logs().showError("Cannot use hardware time points (small time point interval) " + "with stage scanning."); @@ -1010,9 +1010,8 @@ public void recalculateSliceTiming() { * @return a builder for DefaultTimingSettings */ public DefaultTimingSettings.Builder getTimingFromExposure() { - // temporary measure: use diSPIM-like settings unless we are doing stage scanning - if (!acqSettings_.isUsingStageScanning()) { + if (!acqSettings_.stageScan().enabled()) { return getTimingFromPeriodAndLightExposure(); } @@ -1112,8 +1111,8 @@ public DefaultTimingSettings.Builder getTimingFromExposure() { .cameraExposure(cameraExposure); // if a specific slice period was requested, add corresponding delay to scan/laser/camera - if (!acqSettings_.slice().isSlicePeriodMinimized()) { - double globalDelay = acqSettings_.slice().slicePeriod() - tsb.sliceDuration(); + if (!acqSettings_.slice().periodMinimized()) { + double globalDelay = acqSettings_.slice().period() - tsb.sliceDuration(); // only true when user has specified period that is unattainable if (globalDelay < 0) { globalDelay = 0; @@ -1156,8 +1155,6 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { // 4. start scan 0.25ms before camera global exposure and shifted up in time to account for delay introduced by Bessel filter // 5. turn on laser as soon as camera global exposure, leave laser on for desired light exposure time // 7. end camera exposure in final 0.25ms, post-filter scan waveform also ends now - ASIScanner scanner = model_.devices().device("IllumSlice"); //.getDevice("IllumBeam"); - // ASIScanner scanner2 = model_.devices().getDevice("Illum2Beam"); CameraBase camera = model_.devices().firstImagingCamera(); //.getDevice("ImagingCamera"); if (camera == null) { @@ -1196,8 +1193,11 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { // delay to start is (empirically) 0.07ms + 0.25/(freq in kHz) // delay to midpoint is empirically 0.38/(freq in kHz) // group delay for 5th-order Bessel filter ~0.39/freq from theory and ~0.4/freq from IC datasheet - //final double scanFilterFreq = Math.max(scanner1.getFilterFreqX(), scanner2.getFilterFreqX()); - final double scanFilterFreq = (scanner == null) ? 0.4 : scanner.getFilterFreqX(); // default to 0.4 if no scanner + final double scanFilterFreq = model_.devices() + .device2("IllumSlice", ASIScanner.class) + .map(ASIScanner::getFilterFreqX) + .orElse(0.4); // default value + double scanDelayFilter = 0; if (scanFilterFreq != 0) { scanDelayFilter = NumberUtils.roundToQuarterMs(0.39 / scanFilterFreq); @@ -1296,8 +1296,8 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { } // if a specific slice period was requested, add corresponding delay to scan/laser/camera - if (!acqSettings_.slice().isSlicePeriodMinimized()) { - double globalDelay = acqSettings_.slice().slicePeriod() - tsb.sliceDuration(); + if (!acqSettings_.slice().periodMinimized()) { + double globalDelay = acqSettings_.slice().period() - tsb.sliceDuration(); // only true when user has specified period that is unattainable if (globalDelay < 0) { globalDelay = 0; @@ -1341,9 +1341,9 @@ public void updateDurationLabels() { model_.acquisitions().recalculateSliceTiming(); model_.acquisitions().updateAcquisitionSettings(); // update durations now that settings are current - updateSlicePeriodLabel(pnlVolumeDurations_.getSliceDurationLabel()); - updateVolumeDurationLabel(pnlVolumeDurations_.getVolumeDurationLabel()); - updateTotalTimeDurationLabel(pnlVolumeDurations_.getTotalDurationLabel()); + updateSlicePeriodLabel(pnlDuration_.getSliceDurationLabel()); + updateVolumeDurationLabel(pnlDuration_.getVolumeDurationLabel()); + updateTotalTimeDurationLabel(pnlDuration_.getTotalDurationLabel()); } private void updateSlicePeriodLabel(final JLabel label) { @@ -1422,7 +1422,7 @@ public double computeVolumeDuration() { // stackDuration is per-view, per-channel, per-position final double stackDuration = numCameraTriggers * acqSettings_.timing().sliceDuration(); - if (acqSettings_.isUsingStageScanning()) { + if (acqSettings_.stageScan().enabled()) { final double rampDuration = 1; //getStageRampDuration(acqSettings); final double retraceTime = 1; //getStageRetraceDuration(acqSettings); // TODO(Jon): double-check these calculations below, at least they are better than before ;-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/autofocus/AutofocusRunner.java b/src/main/java/org/micromanager/lightsheetmanager/model/autofocus/AutofocusRunner.java index 8aaf7c33..643d42fd 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/autofocus/AutofocusRunner.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/autofocus/AutofocusRunner.java @@ -45,7 +45,7 @@ public void runAutofocus() { return; // early exit } - final String scoringAlgorithmName = acqSettings.autofocusSettings() + final String scoringAlgorithmName = acqSettings.autofocus() .scoringMethod().toString(); // set scoring algorithm @@ -62,18 +62,18 @@ public void runAutofocus() { // TODO: get fit function? //final AutofocusFitter.FunctionType function = AutofocusFitter.getFunctionTypeAsType(); - final AutofocusMode afMode = acqSettings.autofocusSettings().mode(); + final AutofocusMode afMode = acqSettings.autofocus().mode(); final boolean isPiezoScan = afMode == AutofocusMode.FIXED_SLICE_SWEEP_PIEZO; studio_.logs().logDebugMessage("Autofocus getting ready using \"" + scoringAlgorithmName + "\" algorithm, mode \"" + afMode + "\""); - final int numImages = acqSettings.autofocusSettings().numImages(); - final double stepSize = acqSettings.autofocusSettings().stepSizeUm(); + final int numImages = acqSettings.autofocus().numImages(); + final double stepSize = acqSettings.autofocus().stepSizeUm(); //final double minimumRSquared = acqSettings.autofocusSettings().toleranceUm(); // TODO: view 1? - final double imagingCenter = acqSettings.sheetCalibration(1).imagingCenter(); + final double imagingCenter = acqSettings.sheetCalibration().imagingCenter(); final boolean isBeamOff = !scanner.isBeamOn(); scanner.setBeamOn(true);