diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettings.java index eaf2f8fc..7683de99 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/AcquisitionSettings.java @@ -99,10 +99,10 @@ interface Builder> { /** * Sets the time point interval between time points in seconds. * - * @param timePointInterval the time point interval in seconds + * @param timePointIntervalSec the time point interval in seconds * @return {@code this} builder */ - T timePointInterval(final double timePointInterval); + T timePointIntervalSec(final double timePointIntervalSec); /** * Sets the acquisition mode. @@ -229,7 +229,7 @@ interface Builder> { * * @return the time point interval in seconds. */ - double timePointInterval(); + double timePointIntervalSec(); /** * Returns the acquisition mode. diff --git a/src/main/java/org/micromanager/lightsheetmanager/api/TimingSettings.java b/src/main/java/org/micromanager/lightsheetmanager/api/TimingSettings.java index c24eed1f..ee826d94 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/TimingSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/TimingSettings.java @@ -14,7 +14,7 @@ public interface TimingSettings { * * @return the delay time in milliseconds */ - double delayBeforeScan(); + double delayBeforeScanMs(); /** * Returns the number of one way beam scans per slice. @@ -28,49 +28,49 @@ public interface TimingSettings { * * @return the time in milliseconds of one beam scan sweep */ - double scanDuration(); + double scanDurationMs(); /** * Returns the delay time in milliseconds before the laser trigger. * * @return the delay time in milliseconds before the laser trigger */ - double delayBeforeLaser(); + double delayBeforeLaserMs(); /** * Returns the laser trigger duration in milliseconds. * * @return the laser trigger duration in milliseconds */ - double laserTriggerDuration(); + double laserTriggerDurationMs(); /** * Returns the delay time in milliseconds before the camera is triggered. * * @return the delay time in milliseconds before the camera is triggered */ - double delayBeforeCamera(); + double delayBeforeCameraMs(); /** * Returns the camera trigger duration in milliseconds. * * @return the camera trigger duration in milliseconds */ - double cameraTriggerDuration(); + double cameraTriggerDurationMs(); /** * Returns the duration in milliseconds that the camera shutter is open. * * @return the duration in milliseconds that the camera shutter is open */ - double cameraExposure(); + double cameraExposureMs(); /** * Returns the duration in milliseconds of each slice. * * @return the duration in milliseconds of each slice */ - double sliceDuration(); + double sliceDurationMs(); /** * Returns true if the scan direction is inverted. @@ -86,7 +86,7 @@ interface Builder { * * @param delayMs the delay time in milliseconds */ - Builder delayBeforeScan(final double delayMs); + Builder delayBeforeScanMs(final double delayMs); /** * Sets the number of one way beam scans per slice @@ -100,42 +100,42 @@ interface Builder { * * @param durationMs the duration in milliseconds */ - Builder scanDuration(final double durationMs); + Builder scanDurationMs(final double durationMs); /** * Sets the delay time before the laser trigger. * * @param delayMs the delay in milliseconds */ - Builder delayBeforeLaser(final double delayMs); + Builder delayBeforeLaserMs(final double delayMs); /** * Sets the duration of the laser trigger. * * @param durationMs the duration in milliseconds */ - Builder laserTriggerDuration(final double durationMs); + Builder laserTriggerDurationMs(final double durationMs); /** * Sets the delay before the camera trigger is fired. * * @param delayMs the delay in milliseconds */ - Builder delayBeforeCamera(final double delayMs); + Builder delayBeforeCameraMs(final double delayMs); /** * Sets the duration of the camera trigger. * * @param durationMs the duration in milliseconds */ - Builder cameraTriggerDuration(final double durationMs); + Builder cameraTriggerDurationMs(final double durationMs); /** * Sets the camera exposure time. * * @param exposureMs the exposure time in milliseconds */ - Builder cameraExposure(final double exposureMs); + Builder cameraExposureMs(final double exposureMs); /** * Sets the scan direction. @@ -147,7 +147,7 @@ interface Builder { /** * Computes the slice duration from the other timing settings. */ - double sliceDuration(); + double sliceDurationMs(); /** * Creates an immutable instance of TimingSettings 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 160ef745..0828785d 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/BaseAcquisitionSettings.java @@ -34,7 +34,7 @@ public abstract static class Builder> implements Acquisitio private int postMoveDelay_ = 0; private boolean useTimePoints_ = false; private int numTimePoints_ = 1; - private double timePointInterval_ = 0.0; + private double timePointIntervalSec_ = 0.0; private AcquisitionMode acquisitionMode_ = AcquisitionMode.NO_SCAN; private DefaultAutofocusSettings.Builder afBuilder_ = DefaultAutofocusSettings.builder(); @@ -56,7 +56,7 @@ public Builder(final AcquisitionSettings settings) { postMoveDelay_ = settings.postMoveDelay(); useTimePoints_ = settings.isUsingTimePoints(); numTimePoints_ = settings.numTimePoints(); - timePointInterval_ = settings.timePointInterval(); + timePointIntervalSec_ = settings.timePointIntervalSec(); acquisitionMode_ = settings.acquisitionMode(); afBuilder_ = settings.autofocus().copyBuilder(); channelBuilder_ = settings.channels().copyBuilder(); @@ -193,12 +193,12 @@ public T numTimePoints(final int numTimePoints) { /** * Sets the time point interval between time points in seconds. * - * @param timePointInterval the time point interval in seconds + * @param timePointIntervalSec the time point interval in seconds * @return {@code this} builder */ @Override - public T timePointInterval(final double timePointInterval) { - timePointInterval_ = timePointInterval; + public T timePointIntervalSec(final double timePointIntervalSec) { + timePointIntervalSec_ = timePointIntervalSec; return self(); } @@ -277,7 +277,7 @@ public VolumeSettings.Builder volumeBuilder() { private final int postMoveDelay_; private final boolean useTimePoints_; private final int numTimePoints_; - private final double timePointInterval_; + private final double timePointIntervalSec_; private final AcquisitionMode acquisitionMode_; private final DefaultAutofocusSettings autofocus_; @@ -302,7 +302,7 @@ protected BaseAcquisitionSettings(Builder builder) { postMoveDelay_ = builder.postMoveDelay_; useTimePoints_ = builder.useTimePoints_; numTimePoints_ = builder.numTimePoints_; - timePointInterval_ = builder.timePointInterval_; + timePointIntervalSec_ = builder.timePointIntervalSec_; acquisitionMode_ = builder.acquisitionMode_; autofocus_ = builder.afBuilder_.build(); channels_ = builder.channelBuilder_.build(); @@ -425,8 +425,8 @@ public int numTimePoints() { * @return the time point interval in seconds. */ @Override - public double timePointInterval() { - return timePointInterval_; + public double timePointIntervalSec() { + return timePointIntervalSec_; } /** 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 7423657e..b8d6cfb6 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultTimingSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DefaultTimingSettings.java @@ -7,26 +7,26 @@ 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 double delayBeforeScanMs_; + private final double scanDurationMs_; + private final double delayBeforeLaserMs_; + private final double laserTriggerDurationMs_; + private final double delayBeforeCameraMs_; + private final double cameraTriggerDurationMs_; + private final double cameraExposureMs_; + private final double sliceDurationMs_; 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(); + delayBeforeScanMs_ = builder.delayBeforeScanMs_; + scanDurationMs_ = builder.scanDurationMs_; + delayBeforeLaserMs_ = builder.delayBeforeLaserMs_; + laserTriggerDurationMs_ = builder.laserTriggerDurationMs_; + delayBeforeCameraMs_ = builder.delayBeforeCameraMs_; + cameraTriggerDurationMs_ = builder.cameraTriggerDurationMs_; + cameraExposureMs_ = builder.cameraExposureMs_; + sliceDurationMs_ = builder.sliceDurationMs(); alternateScanDirection_ = builder.alternateScanDirection_; } @@ -60,8 +60,8 @@ public DefaultTimingSettings.Builder copyBuilder() { * @return the delay time in milliseconds */ @Override - public double delayBeforeScan() { - return delayBeforeScan_; + public double delayBeforeScanMs() { + return delayBeforeScanMs_; } /** @@ -80,8 +80,8 @@ public int scansPerSlice() { * @return the time in milliseconds of one beam scan sweep */ @Override - public double scanDuration() { - return scanDuration_; + public double scanDurationMs() { + return scanDurationMs_; } /** @@ -90,8 +90,8 @@ public double scanDuration() { * @return the delay time in milliseconds before the laser trigger */ @Override - public double delayBeforeLaser() { - return delayBeforeLaser_; + public double delayBeforeLaserMs() { + return delayBeforeLaserMs_; } /** @@ -100,8 +100,8 @@ public double delayBeforeLaser() { * @return the laser trigger duration in milliseconds */ @Override - public double laserTriggerDuration() { - return laserTriggerDuration_; + public double laserTriggerDurationMs() { + return laserTriggerDurationMs_; } /** @@ -110,8 +110,8 @@ public double laserTriggerDuration() { * @return the delay time in milliseconds before the camera is triggered */ @Override - public double delayBeforeCamera() { - return delayBeforeCamera_; + public double delayBeforeCameraMs() { + return delayBeforeCameraMs_; } /** @@ -120,8 +120,8 @@ public double delayBeforeCamera() { * @return the camera trigger duration in milliseconds */ @Override - public double cameraTriggerDuration() { - return cameraTriggerDuration_; + public double cameraTriggerDurationMs() { + return cameraTriggerDurationMs_; } /** @@ -130,8 +130,8 @@ public double cameraTriggerDuration() { * @return the duration in milliseconds that the camera shutter is open */ @Override - public double cameraExposure() { - return cameraExposure_; + public double cameraExposureMs() { + return cameraExposureMs_; } /** @@ -140,8 +140,8 @@ public double cameraExposure() { * @return the duration in milliseconds of each slice */ @Override - public double sliceDuration() { - return sliceDuration_; + public double sliceDurationMs() { + return sliceDurationMs_; } /** @@ -164,48 +164,48 @@ public boolean equals(Object obj) { } 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 && + Double.compare(delayBeforeScanMs_, other.delayBeforeScanMs_) == 0 && + Double.compare(scanDurationMs_, other.scanDurationMs_) == 0 && + Double.compare(delayBeforeLaserMs_, other.delayBeforeLaserMs_) == 0 && + Double.compare(laserTriggerDurationMs_, other.laserTriggerDurationMs_) == 0 && + Double.compare(delayBeforeCameraMs_, other.delayBeforeCameraMs_) == 0 && + Double.compare(cameraTriggerDurationMs_, other.cameraTriggerDurationMs_) == 0 && + Double.compare(cameraExposureMs_, other.cameraExposureMs_) == 0 && + Double.compare(sliceDurationMs_, other.sliceDurationMs_) == 0 && alternateScanDirection_ == other.alternateScanDirection_; } @Override public int hashCode() { - return Objects.hash(scansPerSlice_, delayBeforeScan_, scanDuration_, delayBeforeLaser_, - laserTriggerDuration_, delayBeforeCamera_, cameraTriggerDuration_, cameraExposure_, - sliceDuration_, alternateScanDirection_); + return Objects.hash(scansPerSlice_, delayBeforeScanMs_, scanDurationMs_, delayBeforeLaserMs_, + laserTriggerDurationMs_, delayBeforeCameraMs_, cameraTriggerDurationMs_, cameraExposureMs_, + sliceDurationMs_, 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]", + "%s[scansPerSlice=%s, delayBeforeScanMs=%s, scanDurationMs=%s," + + " delayBeforeLaserMs=%s, laserTriggerDurationMs=%s," + + " delayBeforeCameraMs=%s, cameraTriggerDurationMs=%s," + + " cameraExposureMs=%s, sliceDurationMs=%s, alternateScanDirection=%s]", getClass().getSimpleName(), - scansPerSlice_, delayBeforeScan_, scanDuration_, delayBeforeLaser_, - laserTriggerDuration_, delayBeforeCamera_, cameraTriggerDuration_, - cameraExposure_, sliceDuration_, alternateScanDirection_ + scansPerSlice_, delayBeforeScanMs_, scanDurationMs_, delayBeforeLaserMs_, + laserTriggerDurationMs_, delayBeforeCameraMs_, cameraTriggerDurationMs_, + cameraExposureMs_, sliceDurationMs_, alternateScanDirection_ ); } public static class Builder implements TimingSettings.Builder { private int scansPerSlice_ = 1; - private double delayBeforeScan_ = 0.0; - private double scanDuration_ = 10.0; - private double delayBeforeLaser_ = 1.0; - private double laserTriggerDuration_ = 1.0; - private double delayBeforeCamera_ = 0.0; - private double cameraTriggerDuration_ = 1.0; - private double cameraExposure_ = 1.0; + private double delayBeforeScanMs_ = 0.0; + private double scanDurationMs_ = 10.0; + private double delayBeforeLaserMs_ = 1.0; + private double laserTriggerDurationMs_ = 1.0; + private double delayBeforeCameraMs_ = 0.0; + private double cameraTriggerDurationMs_ = 1.0; + private double cameraExposureMs_ = 1.0; private boolean alternateScanDirection_ = false; private Builder() { @@ -213,13 +213,13 @@ private Builder() { 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(); + delayBeforeScanMs_ = settings.delayBeforeScanMs(); + scanDurationMs_ = settings.scanDurationMs(); + delayBeforeLaserMs_ = settings.delayBeforeLaserMs(); + laserTriggerDurationMs_ = settings.laserTriggerDurationMs(); + delayBeforeCameraMs_ = settings.delayBeforeCameraMs(); + cameraTriggerDurationMs_ = settings.cameraTriggerDurationMs(); + cameraExposureMs_ = settings.cameraExposureMs(); alternateScanDirection_ = settings.useAlternateScanDirection(); } @@ -229,8 +229,8 @@ private Builder(final TimingSettings settings) { * @param delayMs the delay time in milliseconds */ @Override - public Builder delayBeforeScan(final double delayMs) { - delayBeforeScan_ = delayMs; + public Builder delayBeforeScanMs(final double delayMs) { + delayBeforeScanMs_ = delayMs; return this; } @@ -251,8 +251,8 @@ public Builder scansPerSlice(final int numScans) { * @param durationMs the duration in milliseconds */ @Override - public Builder scanDuration(final double durationMs) { - scanDuration_ = durationMs; + public Builder scanDurationMs(final double durationMs) { + scanDurationMs_ = durationMs; return this; } @@ -262,8 +262,8 @@ public Builder scanDuration(final double durationMs) { * @param delayMs the delay in milliseconds */ @Override - public Builder delayBeforeLaser(final double delayMs) { - delayBeforeLaser_ = delayMs; + public Builder delayBeforeLaserMs(final double delayMs) { + delayBeforeLaserMs_ = delayMs; return this; } @@ -273,8 +273,8 @@ public Builder delayBeforeLaser(final double delayMs) { * @param durationMs the duration in milliseconds */ @Override - public Builder laserTriggerDuration(final double durationMs) { - laserTriggerDuration_ = durationMs; + public Builder laserTriggerDurationMs(final double durationMs) { + laserTriggerDurationMs_ = durationMs; return this; } @@ -284,8 +284,8 @@ public Builder laserTriggerDuration(final double durationMs) { * @param delayMs the delay in milliseconds */ @Override - public Builder delayBeforeCamera(final double delayMs) { - delayBeforeCamera_ = delayMs; + public Builder delayBeforeCameraMs(final double delayMs) { + delayBeforeCameraMs_ = delayMs; return this; } @@ -295,8 +295,8 @@ public Builder delayBeforeCamera(final double delayMs) { * @param durationMs the duration in milliseconds */ @Override - public Builder cameraTriggerDuration(final double durationMs) { - cameraTriggerDuration_ = durationMs; + public Builder cameraTriggerDurationMs(final double durationMs) { + cameraTriggerDurationMs_ = durationMs; return this; } @@ -306,8 +306,8 @@ public Builder cameraTriggerDuration(final double durationMs) { * @param exposureMs the exposure time in milliseconds */ @Override - public Builder cameraExposure(final double exposureMs) { - cameraExposure_ = exposureMs; + public Builder cameraExposureMs(final double exposureMs) { + cameraExposureMs_ = exposureMs; return this; } @@ -326,25 +326,25 @@ public Builder useAlternateScanDirection(final boolean state) { * Computes the slice duration from the other timing settings. */ @Override - public double sliceDuration() { + public double sliceDurationMs() { return Math.max(Math.max( - delayBeforeScan_ + (scanDuration_ * scansPerSlice_), // scan time - delayBeforeLaser_ + laserTriggerDuration_ // laser time + delayBeforeScanMs_ + (scanDurationMs_ * scansPerSlice_), // scan time + delayBeforeLaserMs_ + laserTriggerDurationMs_ // laser time ), - delayBeforeCamera_ + cameraTriggerDuration_ // camera time + delayBeforeCameraMs_ + cameraTriggerDurationMs_ // camera time ); } @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, delayBeforeScanMs=%s, scanDurationMs=%s, " + + "delayBeforeLaserMs=%s, laserTriggerDurationMs=%s, delayBeforeCameraMs=%s, " + + "cameraTriggerDurationMs=%s, cameraExposureMs=%s, " + + "sliceDurationMs=%s, alternateScanDirection=%s]", getClass().getSimpleName(), - scansPerSlice_, delayBeforeScan_, scanDuration_, delayBeforeLaser_, laserTriggerDuration_, - delayBeforeCamera_, cameraTriggerDuration_, cameraExposure_, - sliceDuration(), alternateScanDirection_ + scansPerSlice_, delayBeforeScanMs_, scanDurationMs_, delayBeforeLaserMs_, laserTriggerDurationMs_, + delayBeforeCameraMs_, cameraTriggerDurationMs_, cameraExposureMs_, + sliceDurationMs(), alternateScanDirection_ ); } 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 6d9f0ebe..8bd3f4ba 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/DispimAcquisitionSettings.java @@ -127,7 +127,7 @@ public boolean equals(Object obj) { useHardwareTimePoints_ == other.useHardwareTimePoints_ && useAdvancedTiming_ == other.useAdvancedTiming_ && numTimePoints() == other.numTimePoints() && - Double.compare(other.timePointInterval(), timePointInterval()) == 0 && + Double.compare(other.timePointIntervalSec(), timePointIntervalSec()) == 0 && postMoveDelay() == other.postMoveDelay(); } @@ -151,7 +151,7 @@ public int hashCode() { useHardwareTimePoints_, useAdvancedTiming_, numTimePoints(), - timePointInterval(), + timePointIntervalSec(), postMoveDelay() ); } 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 3530a51e..e93611e8 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java +++ b/src/main/java/org/micromanager/lightsheetmanager/api/internal/ScapeAcquisitionSettings.java @@ -105,7 +105,7 @@ public boolean equals(Object obj) { useHardwareTimePoints_ == other.useHardwareTimePoints_ && useAdvancedTiming_ == other.useAdvancedTiming_ && numTimePoints() == other.numTimePoints() && - Double.compare(other.timePointInterval(), timePointInterval()) == 0 && + Double.compare(other.timePointIntervalSec(), timePointIntervalSec()) == 0 && postMoveDelay() == other.postMoveDelay(); } @@ -127,7 +127,7 @@ public int hashCode() { useHardwareTimePoints_, useAdvancedTiming_, numTimePoints(), - timePointInterval(), + timePointIntervalSec(), postMoveDelay() ); } diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java index bc2c7f6b..9f474ff4 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java @@ -64,21 +64,21 @@ private void createUserInterface() { final TimingSettings timingSettings = model_.acquisitions().settings().timing(); spnDelayBeforeScan_ = Spinner.createDoubleSpinner( - timingSettings.delayBeforeScan(), 0.0, 10000.0, 0.25); + timingSettings.delayBeforeScanMs(), 0.0, 10000.0, 0.25); spnDelayBeforeLaser_ = Spinner.createDoubleSpinner( - timingSettings.delayBeforeLaser(), 0.0, 10000.0, 0.25); + timingSettings.delayBeforeLaserMs(), 0.0, 10000.0, 0.25); spnDelayBeforeCamera_ = Spinner.createDoubleSpinner( - timingSettings.delayBeforeCamera(), 0.0, 10000.0, 0.25); + timingSettings.delayBeforeCameraMs(), 0.0, 10000.0, 0.25); spnLaserTriggerDuration_ = Spinner.createDoubleSpinner( - timingSettings.laserTriggerDuration(), 0.0, 10000.0, 0.25); + timingSettings.laserTriggerDurationMs(), 0.0, 10000.0, 0.25); spnCameraTriggerDuration_ = Spinner.createDoubleSpinner( - timingSettings.cameraTriggerDuration(), 0.0, 1000.0, 0.25); + timingSettings.cameraTriggerDurationMs(), 0.0, 1000.0, 0.25); spnScanDuration_ = Spinner.createDoubleSpinner( - timingSettings.scanDuration(), 0.0, 10000.0, 0.25); + timingSettings.scanDurationMs(), 0.0, 10000.0, 0.25); spnScansPerSlice_ = Spinner.createIntegerSpinner( timingSettings.scansPerSlice(), 1, 1000, 1); spnCameraExposure_ = Spinner.createDoubleSpinner( - timingSettings.cameraExposure(), 0.0, 1000.0, 0.25); + timingSettings.cameraExposureMs(), 0.0, 1000.0, 0.25); cbxAlternateScanDirection_ = new CheckBox( "Alternate scan direction", false, CheckBox.LEFT); @@ -113,7 +113,7 @@ private void createEventHandlers() { } model_.acquisitions().settingsBuilder() - .timingBuilder().delayBeforeScan(rounded); + .timingBuilder().delayBeforeScanMs(rounded); model_.acquisitions().updateDurationLabels(); }); @@ -132,7 +132,7 @@ private void createEventHandlers() { } model_.acquisitions().settingsBuilder() - .timingBuilder().scanDuration(rounded); + .timingBuilder().scanDurationMs(rounded); model_.acquisitions().updateDurationLabels(); }); @@ -145,7 +145,7 @@ private void createEventHandlers() { } model_.acquisitions().settingsBuilder() - .timingBuilder().delayBeforeLaser(rounded); + .timingBuilder().delayBeforeLaserMs(rounded); model_.acquisitions().updateDurationLabels(); }); @@ -158,7 +158,7 @@ private void createEventHandlers() { } model_.acquisitions().settingsBuilder() - .timingBuilder().laserTriggerDuration(rounded); + .timingBuilder().laserTriggerDurationMs(rounded); model_.acquisitions().updateDurationLabels(); }); @@ -171,7 +171,7 @@ private void createEventHandlers() { } model_.acquisitions().settingsBuilder() - .timingBuilder().delayBeforeCamera(rounded); + .timingBuilder().delayBeforeCameraMs(rounded); model_.acquisitions().updateDurationLabels(); }); @@ -184,13 +184,13 @@ private void createEventHandlers() { } model_.acquisitions().settingsBuilder() - .timingBuilder().cameraTriggerDuration(rounded); + .timingBuilder().cameraTriggerDurationMs(rounded); model_.acquisitions().updateDurationLabels(); }); spnCameraExposure_.registerListener(() -> { model_.acquisitions().settingsBuilder() - .timingBuilder().cameraExposure(spnCameraExposure_.getDouble()); + .timingBuilder().cameraExposureMs(spnCameraExposure_.getDouble()); model_.acquisitions().updateDurationLabels(); }); @@ -233,14 +233,14 @@ public void setPanelEnabled(final boolean state) { public void updateSpinners() { final TimingSettings timingSettings = model_.acquisitions() .settingsBuilder().timingBuilder().build(); - spnDelayBeforeScan_.setDouble(timingSettings.delayBeforeScan()); + spnDelayBeforeScan_.setDouble(timingSettings.delayBeforeScanMs()); spnScansPerSlice_.setInt(timingSettings.scansPerSlice()); - spnScanDuration_.setDouble(timingSettings.scanDuration()); - spnDelayBeforeLaser_.setDouble(timingSettings.delayBeforeLaser()); - spnLaserTriggerDuration_.setDouble(timingSettings.laserTriggerDuration()); - spnDelayBeforeCamera_.setDouble(timingSettings.delayBeforeCamera()); - spnCameraTriggerDuration_.setDouble(timingSettings.cameraTriggerDuration()); - spnCameraExposure_.setDouble(timingSettings.cameraExposure()); + spnScanDuration_.setDouble(timingSettings.scanDurationMs()); + spnDelayBeforeLaser_.setDouble(timingSettings.delayBeforeLaserMs()); + spnLaserTriggerDuration_.setDouble(timingSettings.laserTriggerDurationMs()); + spnDelayBeforeCamera_.setDouble(timingSettings.delayBeforeCameraMs()); + spnCameraTriggerDuration_.setDouble(timingSettings.cameraTriggerDurationMs()); + spnCameraExposure_.setDouble(timingSettings.cameraExposureMs()); cbxAlternateScanDirection_.setSelected(timingSettings.useAlternateScanDirection()); } @@ -248,16 +248,16 @@ public void updateSpinners() { public void onSettingsChanged(final AcquisitionSettings settings) { if (settings instanceof ScapeAcquisitionSettings) { var settingsScape = (ScapeAcquisitionSettings) settings; - spnDelayBeforeScan_.setValue(settingsScape.timing().delayBeforeScan()); + spnDelayBeforeScan_.setValue(settingsScape.timing().delayBeforeScanMs()); spnScansPerSlice_.setValue(settingsScape.timing().scansPerSlice()); - spnScanDuration_.setValue(settingsScape.timing().scanDuration()); - spnDelayBeforeLaser_.setValue(settingsScape.timing().delayBeforeLaser()); - spnLaserTriggerDuration_.setValue(settingsScape.timing().laserTriggerDuration()); - spnDelayBeforeCamera_.setValue(settingsScape.timing().cameraTriggerDuration()); - spnLaserTriggerDuration_.setValue(settingsScape.timing().cameraTriggerDuration()); - spnDelayBeforeCamera_.setDouble(settingsScape.timing().cameraTriggerDuration()); - spnCameraTriggerDuration_.setDouble(settingsScape.timing().cameraTriggerDuration()); - spnCameraExposure_.setValue(settingsScape.timing().cameraExposure()); + spnScanDuration_.setValue(settingsScape.timing().scanDurationMs()); + spnDelayBeforeLaser_.setValue(settingsScape.timing().delayBeforeLaserMs()); + spnLaserTriggerDuration_.setValue(settingsScape.timing().laserTriggerDurationMs()); + spnDelayBeforeCamera_.setValue(settingsScape.timing().cameraTriggerDurationMs()); + spnLaserTriggerDuration_.setValue(settingsScape.timing().cameraTriggerDurationMs()); + spnDelayBeforeCamera_.setDouble(settingsScape.timing().cameraTriggerDurationMs()); + spnCameraTriggerDuration_.setDouble(settingsScape.timing().cameraTriggerDurationMs()); + spnCameraExposure_.setValue(settingsScape.timing().cameraExposureMs()); cbxAlternateScanDirection_.setSelected(settingsScape.timing().useAlternateScanDirection()); } } diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/TimePointsPanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/TimePointsPanel.java index 7eefd2b4..b3f16303 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/TimePointsPanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/TimePointsPanel.java @@ -43,7 +43,7 @@ private void createUserInterface() { spnNumTimePoints_ = Spinner.createIntegerSpinner( acqSettings.numTimePoints(), 1, Integer.MAX_VALUE, 1, 6); spnTimePointInterval_ = Spinner.createDoubleSpinner( - acqSettings.timePointInterval(), 0.1, Double.MAX_VALUE, 0.1, 6); + acqSettings.timePointIntervalSec(), 0.1, Double.MAX_VALUE, 0.1, 6); add(lblNumTimePoints_, ""); add(spnNumTimePoints_, "wrap"); @@ -60,7 +60,7 @@ private void createEventHandlers() { }); spnTimePointInterval_.registerListener(() -> { - model_.acquisitions().settingsBuilder().timePointInterval(spnTimePointInterval_.getDouble()); + model_.acquisitions().settingsBuilder().timePointIntervalSec(spnTimePointInterval_.getDouble()); model_.acquisitions().updateDurationLabels(); }); } @@ -78,7 +78,7 @@ public void onSettingsChanged(final AcquisitionSettings settings) { if (settings instanceof ScapeAcquisitionSettings) { var settingsScape = (ScapeAcquisitionSettings) settings; spnNumTimePoints_.setValue(settingsScape.numTimePoints()); - spnTimePointInterval_.setValue(settingsScape.timePointInterval()); + spnTimePointInterval_.setValue(settingsScape.timePointIntervalSec()); } } } diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java index 48085d1b..40b6672e 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicDispim.java @@ -339,18 +339,18 @@ public boolean prepareControllerForAcquisitionSCAPE( // Compute appropriate motor speed in mm/s for the given stage scanning settings public double computeScanSpeed(DispimAcquisitionSettings settings, final int numScansPerSlice) { - //double sliceDuration = settings.timingSettings().sliceDuration(); - //double sliceDuration = 0.0; // TODO: get from SliceTiming - double sliceDuration = getSliceDuration(settings.timing(), numScansPerSlice); // TODO: ??? + //double sliceDurationMs = settings.timingSettings().sliceDurationMs(); + //double sliceDurationMs = 0.0; // TODO: get from SliceTiming + double sliceDurationMs = getSliceDuration(settings.timing(), numScansPerSlice); // TODO: ??? if (settings.acquisitionMode() == AcquisitionMode.STAGE_SCAN_INTERLEAVED) { // pretend like our slice takes twice as long so that we move the correct speed // this has the effect of halving the motor speed // but keeping the scan distance the same - sliceDuration *= 2; + sliceDurationMs *= 2; } final int channelsPerPass = computeScanChannelsPerPass(settings); - //return settings.getStepSize() * du.getStageGeometricSpeedFactor(settings.firstSideIsA) / sliceDuration / channelsPerPass; - return settings.volume().sliceStepSize() / sliceDuration / channelsPerPass; // TODO: add getStageGeometricSpeedFactor + //return settings.getStepSize() * du.getStageGeometricSpeedFactor(settings.firstSideIsA) / sliceDurationMs / channelsPerPass; + return settings.volume().sliceStepSize() / sliceDurationMs / channelsPerPass; // TODO: add getStageGeometricSpeedFactor } // compute how many channels we do in each one-way scan @@ -371,15 +371,15 @@ public double computeScanAcceleration(final double motorSpeed, DispimAcquisition // TODO: scanNum was part of SliceSettings (now TimingSettings) // scanNum was populated from numScansPerSlice_ which is the scanner SPIM_NUM_SCANSPERSLICE("SPIMNumScansPerSlice") // labeled "Lines scans per slice:" in advanced timing tab - // * gets the correct value for the slice timing's sliceDuration field based on other values of slice timing + // * gets the correct value for the slice timing's sliceDurationMs field based on other values of slice timing // slice duration is the max out of the scan time, laser time, and camera time public double getSliceDuration(final TimingSettings s, final int scanNum) { return Math.max(Math.max( - s.delayBeforeScan() + (s.scanDuration() * scanNum), // scan time - s.delayBeforeLaser() + s.laserTriggerDuration() // laser time + s.delayBeforeScanMs() + (s.scanDurationMs() * scanNum), // scan time + s.delayBeforeLaserMs() + s.laserTriggerDurationMs() // laser time ), - s.delayBeforeCamera() + s.cameraTriggerDuration() // camera time + s.delayBeforeCameraMs() + s.cameraTriggerDurationMs() // camera time ); } @@ -529,7 +529,7 @@ public boolean prepareControllerForAcquisitionSide( double delayRepeats = 0.0; if (settings.isUsingHardwareTimePoints() && settings.isUsingTimePoints()) { double volumeDurationMs = 1.0; - double volumeIntervalMs = settings.timePointInterval(); + double volumeIntervalMs = settings.timePointIntervalSec(); delayRepeats = volumeIntervalMs - volumeDurationMs; numVolumesPerTrigger = settings.numTimePoints(); } @@ -611,16 +611,16 @@ public boolean prepareControllerForAcquisitionSide( final boolean oppositeDirections = false; scanner.setSPIMAlternateDirections(oppositeDirections); - scanner.setSPIMScanDuration(settings.timing().scanDuration()); + scanner.setSPIMScanDuration(settings.timing().scanDurationMs()); // program the remaining per-slice timing onto the scanner card; diSPIM 1.4 wrote // these through the advanced-timing GUI spinner bindings, a path lost in the port, // so galvo scans ran on whatever stale timing was left on the card (issue #417) - scanner.setSPIMDelayBeforeScan(settings.timing().delayBeforeScan()); + scanner.setSPIMDelayBeforeScan(settings.timing().delayBeforeScanMs()); scanner.setSPIMNumScansPerSlice(settings.timing().scansPerSlice()); - scanner.setSPIMDelayBeforeLaser(settings.timing().delayBeforeLaser()); - scanner.setSPIMLaserDuration(settings.timing().laserTriggerDuration()); - scanner.setSPIMDelayBeforeCamera(settings.timing().delayBeforeCamera()); - scanner.setSPIMCameraDuration(settings.timing().cameraTriggerDuration()); + scanner.setSPIMDelayBeforeLaser(settings.timing().delayBeforeLaserMs()); + scanner.setSPIMLaserDuration(settings.timing().laserTriggerDurationMs()); + scanner.setSPIMDelayBeforeCamera(settings.timing().delayBeforeCameraMs()); + scanner.setSPIMCameraDuration(settings.timing().cameraTriggerDurationMs()); scanner.sa().setAmplitudeY(sliceAmplitude); scanner.sa().setOffsetY(sliceCenter); scanner.setSPIMNumSlices(numSlicesHW); @@ -707,7 +707,7 @@ public boolean prepareControllerForAcquisitionSide( // FIXME: !!! //final float settleTime = props_.getPropValueFloat(Devices.Keys.PLUGIN, Properties.Keys.PLUGIN_LS_SCAN_SETTLE); // infer the main scan time (during imaging) from the laser duration -// final float readoutTime = settings.timingSettings().laserTriggerDuration() - 0.25; // -0.25 is for scanLaserBufferTime +// final float readoutTime = settings.timingSettings().laserTriggerDurationMs() - 0.25; // -0.25 is for scanLaserBufferTime // // offset should be decreased by half of the distance traveled during settle time (instead of re-extracting slope use existing sheetWidth/readoutTime) // sheetOffset -= (sheetWidth * settleTime/readoutTime)/2; // // width should be increased by ratio (1 + settle_fraction) diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java index c7db815c..2f728dbb 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java @@ -255,16 +255,16 @@ public boolean prepareControllerForAcquisition( // Compute appropriate motor speed in mm/s for the given stage scanning settings public double computeScanSpeed(final ScapeAcquisitionSettings settings) { - double sliceDuration = settings.timing().sliceDuration(); + double sliceDurationMs = settings.timing().sliceDurationMs(); if (settings.acquisitionMode() == AcquisitionMode.STAGE_SCAN_INTERLEAVED) { // pretend like our slice takes twice as long so that we move the correct speed // this has the effect of halving the motor speed, but keeping the scan distance the same - sliceDuration *= 2; + sliceDurationMs *= 2; } final int channelsPerPass = computeScanChannelsPerPass(settings); final double speedFactor = GeometryUtils.getStageGeometricSpeedFactor( settings.stageScan().firstViewAngle(), settings.volume().firstView() == 1); - return settings.volume().sliceStepSize() * speedFactor / sliceDuration / channelsPerPass; + return settings.volume().sliceStepSize() * speedFactor / sliceDurationMs / channelsPerPass; } // compute how many channels we do in each one-way scan @@ -397,7 +397,7 @@ public boolean prepareControllerForAcquisitionSide( double delayRepeats = 0.0; if (settings.isUsingHardwareTimePoints() && settings.isUsingTimePoints()) { double volumeDurationMs = 1.0; - double volumeIntervalMs = settings.timePointInterval(); + double volumeIntervalMs = settings.timePointIntervalSec(); delayRepeats = volumeIntervalMs - volumeDurationMs; numVolumesPerTrigger = settings.numTimePoints(); } @@ -493,16 +493,16 @@ public boolean prepareControllerForAcquisitionSide( scanner_.setSPIMAlternateDirections(oppositeDirections); scanner_.setSPIMScanDuration( - settings.timing().sliceDuration() - settings.timing().delayBeforeScan()); + settings.timing().sliceDurationMs() - settings.timing().delayBeforeScanMs()); // program the remaining per-slice timing onto the scanner card; diSPIM 1.4 wrote // these through the advanced-timing GUI spinner bindings, a path lost in the port, // so galvo scans ran on whatever stale timing was left on the card (issue #417) - scanner_.setSPIMDelayBeforeScan(settings.timing().delayBeforeScan()); + scanner_.setSPIMDelayBeforeScan(settings.timing().delayBeforeScanMs()); scanner_.setSPIMNumScansPerSlice(settings.timing().scansPerSlice()); - scanner_.setSPIMDelayBeforeLaser(settings.timing().delayBeforeLaser()); - scanner_.setSPIMLaserDuration(settings.timing().laserTriggerDuration()); - scanner_.setSPIMDelayBeforeCamera(settings.timing().delayBeforeCamera()); - scanner_.setSPIMCameraDuration(settings.timing().cameraTriggerDuration()); + scanner_.setSPIMDelayBeforeLaser(settings.timing().delayBeforeLaserMs()); + scanner_.setSPIMLaserDuration(settings.timing().laserTriggerDurationMs()); + scanner_.setSPIMDelayBeforeCamera(settings.timing().delayBeforeCameraMs()); + scanner_.setSPIMCameraDuration(settings.timing().cameraTriggerDurationMs()); scanner_.sa().setAmplitudeY(sliceAmplitude); scanner_.sa().setOffsetY(sliceCenter); scanner_.setSPIMNumSlices(numSlicesHW); @@ -599,7 +599,7 @@ public boolean prepareControllerForAcquisitionSide( // FIXME: !!! //final float settleTime = props_.getPropValueFloat(Devices.Keys.PLUGIN, Properties.Keys.PLUGIN_LS_SCAN_SETTLE); // infer the main scan time (during imaging) from the laser duration -// final float readoutTime = settings.timingSettings().laserTriggerDuration() - 0.25; // -0.25 is for scanLaserBufferTime +// final float readoutTime = settings.timingSettings().laserTriggerDurationMs() - 0.25; // -0.25 is for scanLaserBufferTime // // offset should be decreased by half of the distance traveled during settle time (instead of re-extracting slope use existing sheetWidth/readoutTime) // sheetOffset -= (sheetWidth * settleTime/readoutTime)/2; // // width should be increased by ratio (1 + settle_fraction) diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/SettingsAdapter.java b/src/main/java/org/micromanager/lightsheetmanager/model/SettingsAdapter.java index 223e65ec..50168def 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/SettingsAdapter.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/SettingsAdapter.java @@ -70,7 +70,7 @@ public SettingsAdapter(final LightSheetManager model) { registry.put("timepointInterval", value -> model_.acquisitions().settingsBuilder() - .timePointInterval((double) value)); + .timePointIntervalSec((double) value)); registry.put("useMultiPositions", value -> model_.acquisitions().settingsBuilder() @@ -163,7 +163,7 @@ public SettingsAdapter(final LightSheetManager model) { switch (key) { case "scanDelay": model_.acquisitions().settingsBuilder() - .timingBuilder().delayBeforeScan((double) val); + .timingBuilder().delayBeforeScanMs((double) val); break; case "scanNum": model_.acquisitions().settingsBuilder() @@ -171,27 +171,27 @@ public SettingsAdapter(final LightSheetManager model) { break; case "scanPeriod": model_.acquisitions().settingsBuilder() - .timingBuilder().scanDuration((double) val); + .timingBuilder().scanDurationMs((double) val); break; case "laserDelay": model_.acquisitions().settingsBuilder() - .timingBuilder().delayBeforeLaser((double) val); + .timingBuilder().delayBeforeLaserMs((double) val); break; case "laserDuration": model_.acquisitions().settingsBuilder() - .timingBuilder().laserTriggerDuration((double) val); + .timingBuilder().laserTriggerDurationMs((double) val); break; case "cameraDelay": model_.acquisitions().settingsBuilder() - .timingBuilder().delayBeforeCamera((double) val); + .timingBuilder().delayBeforeCameraMs((double) val); break; case "cameraDuration": model_.acquisitions().settingsBuilder() - .timingBuilder().cameraTriggerDuration((double) val); + .timingBuilder().cameraTriggerDurationMs((double) val); break; case "cameraExposure": model_.acquisitions().settingsBuilder() - .timingBuilder().cameraExposure((double) val); + .timingBuilder().cameraExposureMs((double) val); break; default: break; // skip key 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 e31fdd85..2a5edfa0 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngine.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngine.java @@ -191,15 +191,15 @@ private static String describeUnusableTiming(final TimingSettings timing) { } final StringBuilder problems = new StringBuilder(); // must be strictly positive: a slice that exposes for zero time images nothing - appendTimingProblem(problems, "camera exposure", timing.cameraExposure(), true); - appendTimingProblem(problems, "slice duration", timing.sliceDuration(), true); + appendTimingProblem(problems, "camera exposure", timing.cameraExposureMs(), true); + appendTimingProblem(problems, "slice duration", timing.sliceDurationMs(), true); // may legitimately be zero, so only reject negatives - appendTimingProblem(problems, "scan duration", timing.scanDuration(), false); - appendTimingProblem(problems, "laser trigger duration", timing.laserTriggerDuration(), false); - appendTimingProblem(problems, "camera trigger duration", timing.cameraTriggerDuration(), false); - appendTimingProblem(problems, "delay before scan", timing.delayBeforeScan(), false); - appendTimingProblem(problems, "delay before laser", timing.delayBeforeLaser(), false); - appendTimingProblem(problems, "delay before camera", timing.delayBeforeCamera(), false); + appendTimingProblem(problems, "scan duration", timing.scanDurationMs(), false); + appendTimingProblem(problems, "laser trigger duration", timing.laserTriggerDurationMs(), false); + appendTimingProblem(problems, "camera trigger duration", timing.cameraTriggerDurationMs(), false); + appendTimingProblem(problems, "delay before scan", timing.delayBeforeScanMs(), false); + appendTimingProblem(problems, "delay before laser", timing.delayBeforeLaserMs(), false); + appendTimingProblem(problems, "delay before camera", timing.delayBeforeCameraMs(), false); return problems.length() == 0 ? null : problems.toString(); } @@ -503,7 +503,7 @@ public boolean isAcquisitionRunning() { @Override public double getFrameIntervalMs() { - return acqSettings_.timePointInterval(); + return acqSettings_.timePointIntervalSec(); } @Override 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 8fa38c1d..534528c1 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java @@ -671,13 +671,13 @@ private boolean doHardwareCalculations(PLogicDispim plc) { // settings are the source of truth for camera mode CameraMode camMode = acqSettings_.cameraMode(); final double cameraReadoutTime = camera.getReadoutTime(camMode); - final double exposureTime = acqSettings_.timing().cameraExposure(); + final double exposureTime = acqSettings_.timing().cameraExposureMs(); // test acq was here double volumeDuration = computeActualVolumeDuration(acqSettings_); double timepointDuration = computeTimePointDuration(); - long timepointIntervalMs = Math.round(acqSettings_.timePointInterval() * 1000.0); + long timepointIntervalMs = Math.round(acqSettings_.timePointIntervalSec() * 1000.0); // use hardware timing if < 1 second between time points // experimentally need ~0.5 sec to set up acquisition, this gives a bit of cushion @@ -704,8 +704,8 @@ private boolean doHardwareCalculations(PLogicDispim plc) { } - final double sliceDuration = acqSettings_.timing().sliceDuration(); - if (exposureTime + cameraReadoutTime > sliceDuration) { + final double sliceDurationMs = acqSettings_.timing().sliceDurationMs(); + if (exposureTime + cameraReadoutTime > sliceDurationMs) { // should only possible to mess this up using advanced timing settings // or if there are errors in our own calculations studio_.logs().showError("Exposure time of " + exposureTime + @@ -812,7 +812,7 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { // this will also be in 0.25ms increment final double globalExposureDelayMax = cameraReadoutMax + cameraResetMax; double laserDuration = NumberUtils.roundToQuarterMs(acqSettings_.slice().sampleExposure()); - double scanDuration = laserDuration + 2*scanLaserBufferTime; + double scanDurationMs = laserDuration + 2*scanLaserBufferTime; // scan will be longer than laser by 0.25ms at both start and end @@ -836,14 +836,14 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { scanDelayFilter -= 0.25; } - double delayBeforeScan = globalExposureDelayMax - scanLaserBufferTime // start scan 0.25ms before camera's global exposure + double delayBeforeScanMs = globalExposureDelayMax - scanLaserBufferTime // start scan 0.25ms before camera's global exposure - scanDelayFilter; // start galvo moving early due to card's Bessel filter and delay of TTL signals via PLC - double delayBeforeLaser = globalExposureDelayMax; // turn on laser as soon as camera's global exposure is reached - double delayBeforeCamera = cameraReadoutMax; // camera must read out last frame before triggering again + double delayBeforeLaserMs = globalExposureDelayMax; // turn on laser as soon as camera's global exposure is reached + double delayBeforeCameraMs = cameraReadoutMax; // camera must read out last frame before triggering again int scansPerSlice = 1; double cameraDuration = 0; // set in the switch statement below - double sliceDuration; + double sliceDurationMs; // figure out desired time for camera to be exposing (including reset time) // because both camera trigger and laser on occur on 0.25ms intervals (i.e. we may not @@ -851,40 +851,40 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { // special adjustment for Photometrics cameras that possibly has extra clear time which is counted in reset time // but not in the camera exposure time // TODO: skipped PVCAM case, update comment - double cameraExposure = NumberUtils.ceilToQuarterMs(cameraResetTime) + laserDuration; + double cameraExposureMs = NumberUtils.ceilToQuarterMs(cameraResetTime) + laserDuration; switch (acqSettings_.cameraMode()) { case EDGE: cameraDuration = 1; // doesn't really matter, 1ms should be plenty fast yet easy to see for debugging - cameraExposure += 0.1; // add 0.1ms as safety margin, may require adding an additional 0.25ms to slice + cameraExposureMs += 0.1; // add 0.1ms as safety margin, may require adding an additional 0.25ms to slice // slight delay between trigger and actual exposure start // is included in exposure time for Hamamatsu and negligible for Andor and PCO cameras // ensure not to miss triggers by not being done with readout in time for next trigger, add 0.25ms if needed - sliceDuration = getSliceDuration(delayBeforeScan, scanDuration, scansPerSlice, delayBeforeLaser, laserDuration, delayBeforeCamera, cameraDuration); - if (sliceDuration < (cameraExposure + cameraReadoutTime)) { - delayBeforeCamera += 0.25; - delayBeforeLaser += 0.25; - delayBeforeScan += 0.25; + sliceDurationMs = getSliceDuration(delayBeforeScanMs, scanDurationMs, scansPerSlice, delayBeforeLaserMs, laserDuration, delayBeforeCameraMs, cameraDuration); + if (sliceDurationMs < (cameraExposureMs + cameraReadoutTime)) { + delayBeforeCameraMs += 0.25; + delayBeforeLaserMs += 0.25; + delayBeforeScanMs += 0.25; } break; case LEVEL: // AKA "bulb mode", TTL rising starts exposure, TTL falling ends it - cameraDuration = NumberUtils.ceilToQuarterMs(cameraExposure); - cameraExposure = 1; // doesn't really matter, controlled by TTL + cameraDuration = NumberUtils.ceilToQuarterMs(cameraExposureMs); + cameraExposureMs = 1; // doesn't really matter, controlled by TTL break; case OVERLAP: // only Hamamatsu or Andor cameraDuration = 1; // doesn't really matter, 1ms should be plenty fast yet easy to see for debugging - cameraExposure = 1; // doesn't really matter, controlled by interval between triggers + cameraExposureMs = 1; // doesn't really matter, controlled by interval between triggers break; case PSEUDO_OVERLAP:// PCO or Photometrics, enforce 0.25ms between end exposure and start of next exposure by triggering camera 0.25ms into the slice cameraDuration = 1; // doesn't really matter, 1ms should be plenty fast yet easy to see for debugging switch (CameraLibrary.fromString(camera.getDeviceLibrary())) { case PVCAM: - // leave cameraExposure alone + // leave cameraExposureMs alone break; case PCOCAMERA: - sliceDuration = getSliceDuration(delayBeforeScan, scanDuration, scansPerSlice, - delayBeforeLaser, laserDuration, delayBeforeCamera, cameraDuration); - cameraExposure = sliceDuration - delayBeforeCamera; // delayBeforeCamera should be 0.25ms for PCO + sliceDurationMs = getSliceDuration(delayBeforeScanMs, scanDurationMs, scansPerSlice, + delayBeforeLaserMs, laserDuration, delayBeforeCameraMs, cameraDuration); + cameraExposureMs = sliceDurationMs - delayBeforeCameraMs; // delayBeforeCameraMs should be 0.25ms for PCO break; default: studio_.logs().showError("Unknown camera library for pseudo-overlap " @@ -913,15 +913,15 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { pixelSize = 0.1625; // default to pixel size of 40x with sCMOS = 6.5um/40 } final double rowReadoutTime = camera.getRowReadoutTime(); - cameraExposure = rowReadoutTime * (int)(shutterWidth/pixelSize) * shutterSpeed; - // s.cameraExposure = (rowReadoutTime * shutterWidth / pixelSize * shutterSpeed); - final double totalExposureMax = NumberUtils.ceilToQuarterMs(cameraReadoutTime + cameraExposure + 0.05); // 50-300us extra cushion time + cameraExposureMs = rowReadoutTime * (int)(shutterWidth/pixelSize) * shutterSpeed; + // s.cameraExposureMs = (rowReadoutTime * shutterWidth / pixelSize * shutterSpeed); + final double totalExposureMax = NumberUtils.ceilToQuarterMs(cameraReadoutTime + cameraExposureMs + 0.05); // 50-300us extra cushion time final double scanSettle = acqSettings_.sliceLS().scanSettleTime(); final double scanReset = acqSettings_.sliceLS().scanResetTime(); - delayBeforeScan = scanReset - scanDelayFilter; - scanDuration = scanSettle + (totalExposureMax*shutterSpeed) + scanLaserBufferTime; - delayBeforeCamera = scanReset + scanSettle; - delayBeforeLaser = delayBeforeCamera - scanLaserBufferTime; // trigger laser just before camera to make sure it's on already + delayBeforeScanMs = scanReset - scanDelayFilter; + scanDurationMs = scanSettle + (totalExposureMax*shutterSpeed) + scanLaserBufferTime; + delayBeforeCameraMs = scanReset + scanSettle; + delayBeforeLaserMs = delayBeforeCameraMs - scanLaserBufferTime; // trigger laser just before camera to make sure it's on already laserDuration = (totalExposureMax*shutterSpeed) + scanLaserBufferTime; // laser will turn off as exposure is ending break; default: @@ -930,51 +930,51 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { } // fix corner case of negative calculated scanDelay - if (delayBeforeScan < 0) { - delayBeforeCamera-= delayBeforeScan; - delayBeforeLaser -= delayBeforeScan; - delayBeforeScan = 0; // same as (-= delayBeforeScan) + if (delayBeforeScanMs < 0) { + delayBeforeCameraMs-= delayBeforeScanMs; + delayBeforeLaserMs -= delayBeforeScanMs; + delayBeforeScanMs = 0; // same as (-= delayBeforeScanMs) } // fix corner case of (exposure time + readout time) being greater than the slice duration // most of the time the slice duration is already larger - sliceDuration = getSliceDuration(delayBeforeScan, scanDuration, scansPerSlice, delayBeforeLaser, laserDuration, delayBeforeCamera, cameraDuration); - double globalDelay = NumberUtils.ceilToQuarterMs((cameraExposure + cameraReadoutTime) - sliceDuration); + sliceDurationMs = getSliceDuration(delayBeforeScanMs, scanDurationMs, scansPerSlice, delayBeforeLaserMs, laserDuration, delayBeforeCameraMs, cameraDuration); + double globalDelay = NumberUtils.ceilToQuarterMs((cameraExposureMs + cameraReadoutTime) - sliceDurationMs); if (globalDelay > 0) { - delayBeforeCamera += globalDelay; - delayBeforeLaser += globalDelay; - delayBeforeScan += globalDelay; + delayBeforeCameraMs += globalDelay; + delayBeforeLaserMs += globalDelay; + delayBeforeScanMs += globalDelay; } // update the slice duration based on our new values - sliceDuration = getSliceDuration(delayBeforeScan, scanDuration, scansPerSlice, delayBeforeLaser, laserDuration, delayBeforeCamera, cameraDuration); + sliceDurationMs = getSliceDuration(delayBeforeScanMs, scanDurationMs, scansPerSlice, delayBeforeLaserMs, laserDuration, delayBeforeCameraMs, cameraDuration); tsb.scansPerSlice(scansPerSlice); - tsb.scanDuration(scanDuration); - tsb.cameraExposure(cameraExposure); - tsb.laserTriggerDuration(laserDuration); - tsb.cameraTriggerDuration(cameraDuration); - tsb.delayBeforeCamera(delayBeforeCamera); - tsb.delayBeforeLaser(delayBeforeLaser); - tsb.delayBeforeScan(delayBeforeScan); - //tsb.sliceDuration(sliceDuration); // Note: sliceDuration removed, computed dynamically + tsb.scanDurationMs(scanDurationMs); + tsb.cameraExposureMs(cameraExposureMs); + tsb.laserTriggerDurationMs(laserDuration); + tsb.cameraTriggerDurationMs(cameraDuration); + tsb.delayBeforeCameraMs(delayBeforeCameraMs); + tsb.delayBeforeLaserMs(delayBeforeLaserMs); + tsb.delayBeforeScanMs(delayBeforeScanMs); + //tsb.sliceDurationMs(sliceDurationMs); // Note: sliceDurationMs removed, computed dynamically return tsb; } public double getSliceDuration( - final double delayBeforeScan, - final double scanDuration, + final double delayBeforeScanMs, + final double scanDurationMs, final double scansPerSlice, - final double delayBeforeLaser, + final double delayBeforeLaserMs, final double laserDuration, - final double delayBeforeCamera, + final double delayBeforeCameraMs, final double cameraDuration) { // slice duration is the max out of the scan time, laser time, and camera time return Math.max(Math.max( - delayBeforeScan + (scanDuration * scansPerSlice), // scan time - delayBeforeLaser + laserDuration // laser time + delayBeforeScanMs + (scanDurationMs * scansPerSlice), // scan time + delayBeforeLaserMs + laserDuration // laser time ), - delayBeforeCamera + cameraDuration // camera time + delayBeforeCameraMs + cameraDuration // camera time ); } @@ -1004,7 +1004,7 @@ private double computeActualVolumeDuration(final DispimAcquisitionSettings acqSe } // stackDuration is per-side, per-channel, per-position - final double stackDuration = numCameraTriggers * acqSettings.timing().sliceDuration(); + final double stackDuration = numCameraTriggers * acqSettings.timing().sliceDurationMs(); if (acqSettings.stageScan().enabled()) { // || acqSettings.isStageStepping) { // TODO: stage scanning code return 0; 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 77991822..693d6c01 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -639,7 +639,7 @@ public void close() { AcquisitionEvent baseEvent = new AcquisitionEvent(currentAcquisition_); if (acqSettings_.isUsingTimePoints()) { baseEvent.setAxisPosition(LightSheetEventAdapter.TIME_AXIS, timeIndex); - baseEvent.setMinimumStartTime((long) (timeIndex * (model_.acquisitions().settings().timePointInterval() * 1000.0))); + baseEvent.setMinimumStartTime((long) (timeIndex * (model_.acquisitions().settings().timePointIntervalSec() * 1000.0))); } // Loop 2: XY positions for (int positionIndex = 0; positionIndex < numPositions; positionIndex++) { @@ -931,6 +931,14 @@ private boolean doHardwareCalculations(PLogicScape plc) { // nrSlicesSoftware *= 2; // } + // 1.4 adjusts nrSlicesSoftware at this point when hardware timepoints are in use: one + // controller trigger covers every timepoint, so the camera sequence has to be sized for + // the whole burst rather than one volume. There is no counterpart here, and + // nrSlicesSoftware is never read below because AcqEngJ sizes the sequence from however + // many events it merges. It will not merge across a timepoint boundary while the events + // carry per-timepoint start times, so under hardware timepoints the camera sequence + // covers one timepoint while the controller runs all of them. + // TODO: make this more robust, should this be the first imaging camera? String cameraName; if (model_.devices().adapter().numSimultaneousCameras() > 1) { @@ -974,13 +982,13 @@ private boolean doHardwareCalculations(PLogicScape plc) { cameraReadoutTime = camera.getReadoutTime(acqSettings_.cameraMode()); break; } - final double exposureTime = acqSettings_.timing().cameraExposure(); + final double exposureTime = acqSettings_.timing().cameraExposureMs(); // test acq was here final double volumeDuration = computeVolumeDuration(); final double timepointDuration = computeTimePointDuration(); - final long timepointIntervalMs = Math.round(acqSettings_.timePointInterval() * 1000.0); + final long timepointIntervalMs = Math.round(acqSettings_.timePointIntervalSec() * 1000.0); // use hardware timing if < 1 second between time points // experimentally need ~0.5 sec to set up acquisition, this gives a bit of cushion @@ -1019,26 +1027,8 @@ private boolean doHardwareCalculations(PLogicScape plc) { } } - // TODO: this is not necessary below -// if (acqSettings_.isUsingHardwareTimePoints()) { -// final int numTimePoints = acqSettings_.numTimePoints(); -// final int numChannels = acqSettings_.numChannels(); -// final int slicePerView = acqSettings_.volumeSettings().slicesPerView(); -// // in hardwareTimepoints case we trigger controller once for all timepoints => need to -// // adjust number of frames we expect back from the camera during MM's SequenceAcquisition -// if (acqSettings_.cameraMode() == CameraMode.OVERLAP) { -// // For overlap mode we are send one extra trigger per channel per side for volume-switching (both PLogic and not) -// // This holds for all multichannel modes, just the order in which the extra trigger comes varies -// // Very last trigger won't ever return a frame so subtract 1. -// final int hardwareSlicesPerView = (slicePerView + 1) * numChannels * numTimePoints; -// asb_.volumeSettingsBuilder().slicesPerView(hardwareSlicesPerView - 1); -// } else { -// asb_.volumeSettingsBuilder().slicesPerView(slicePerView * numTimePoints); -// } -// } - - final double sliceDuration = asb_.timingBuilder().sliceDuration(); - if (exposureTime + cameraReadoutTime > sliceDuration) { + final double sliceDurationMs = asb_.timingBuilder().sliceDurationMs(); + if (exposureTime + cameraReadoutTime > sliceDurationMs) { // should only possible to mess this up using advanced timing settings // or if there are errors in our own calculations studio_.logs().showError("Exposure time of " + exposureTime + @@ -1046,7 +1036,7 @@ private boolean doHardwareCalculations(PLogicScape plc) { " readout time of " + cameraReadoutTime + "\n" + "This will result in dropped frames. " + "Please change input. " + - "Formula: (" + exposureTime + " + " + cameraReadoutTime + ") > " + sliceDuration); + "Formula: (" + exposureTime + " + " + cameraReadoutTime + ") > " + sliceDurationMs); return false; // early exit } @@ -1111,9 +1101,9 @@ public void recalculateSliceTiming() { if (!acqSettings_.isUsingAdvancedTiming()) { asb_.timingBuilder(getTimingFromExposure()); } - // Note: sliceDuration is computed automatically when build() is called - //final double sliceDuration = getSliceDuration(asb_.timingSettingsBuilder().build()); - //asb_.timingSettingsBuilder().sliceDuration(sliceDuration); + // Note: sliceDurationMs is computed automatically when build() is called + //final double sliceDurationMs = getSliceDuration(asb_.timingSettingsBuilder().build()); + //asb_.timingSettingsBuilder().sliceDurationMs(sliceDurationMs); //System.out.println(asb_.timingSettingsBuilder()); } @@ -1152,110 +1142,110 @@ public DefaultTimingSettings.Builder getTimingFromExposure() { // timing settings int scansPerSlice = 0; - double scanDuration = 0.0; - double cameraTriggerDuration = 0.0; - double laserTriggerDuration = 0.0; - double delayBeforeCamera = 0.0; - double delayBeforeLaser = 0.0; - double delayBeforeScan = 0.0; - double cameraExposure = 0.0; + double scanDurationMs = 0.0; + double cameraTriggerDurationMs = 0.0; + double laserTriggerDurationMs = 0.0; + double delayBeforeCameraMs = 0.0; + double delayBeforeLaserMs = 0.0; + double delayBeforeScanMs = 0.0; + double cameraExposureMs = 0.0; DefaultTimingSettings.Builder tsb = DefaultTimingSettings.builder(); switch (cameraMode) { case PSEUDO_OVERLAP: // e.g. Kinetix scansPerSlice = 1; - scanDuration = 0.25; - cameraExposure = laserDuration; - laserTriggerDuration = laserDuration; - cameraTriggerDuration = laserDuration; - delayBeforeCamera = 0.25; - delayBeforeLaser = sliceDeadTime; - delayBeforeScan = 0.0; + scanDurationMs = 0.25; + cameraExposureMs = laserDuration; + laserTriggerDurationMs = laserDuration; + cameraTriggerDurationMs = laserDuration; + delayBeforeCameraMs = 0.25; + delayBeforeLaserMs = sliceDeadTime; + delayBeforeScanMs = 0.0; break; case OVERLAP: // e.g. if (acqSettings_.channels().enabled() && acqSettings_.channels().count() > 1 && acqSettings_.channels().mode() == ChannelMode.SLICE_HW) { // for interleaved slices we should illuminate during global exposure but not during readout/reset time after each trigger scansPerSlice = 1; - scanDuration = 1.0; - cameraExposure = 0.25; - laserTriggerDuration = laserDuration; - cameraTriggerDuration = 1.0; - delayBeforeCamera = 0.0; - delayBeforeLaser = sliceDeadTime + NumberUtils.ceilToQuarterMs(cameraResetTime); - delayBeforeScan = 0.0; + scanDurationMs = 1.0; + cameraExposureMs = 0.25; + laserTriggerDurationMs = laserDuration; + cameraTriggerDurationMs = 1.0; + delayBeforeCameraMs = 0.0; + delayBeforeLaserMs = sliceDeadTime + NumberUtils.ceilToQuarterMs(cameraResetTime); + delayBeforeScanMs = 0.0; } else { // the usual case scansPerSlice = 1; - scanDuration = 1.0; - cameraExposure = 0.25; - laserTriggerDuration = laserDuration; - cameraTriggerDuration = 1.0; - delayBeforeCamera = 0.0; - delayBeforeLaser = sliceDeadTime + sliceLaserInterleaved; - delayBeforeScan = 0.0; + scanDurationMs = 1.0; + cameraExposureMs = 0.25; + laserTriggerDurationMs = laserDuration; + cameraTriggerDurationMs = 1.0; + delayBeforeCameraMs = 0.0; + delayBeforeLaserMs = sliceDeadTime + sliceLaserInterleaved; + delayBeforeScanMs = 0.0; } break; case EDGE: // should illuminate during the entire exposure (or as much as needed) => will be exposing during camera reset and readout too // Note: that this may be faster than overlap for interleaved channels scansPerSlice = 1; - scanDuration = 1.0; - cameraExposure = laserDuration - NumberUtils.ceilToQuarterMs(actualCameraResetTime + cameraReadoutTime); - laserTriggerDuration = laserDuration; - cameraTriggerDuration = 1.0; - delayBeforeCamera = sliceLaserInterleaved; - delayBeforeLaser = sliceDeadTime + sliceLaserInterleaved; - delayBeforeScan = 0.0; + scanDurationMs = 1.0; + cameraExposureMs = laserDuration - NumberUtils.ceilToQuarterMs(actualCameraResetTime + cameraReadoutTime); + laserTriggerDurationMs = laserDuration; + cameraTriggerDurationMs = 1.0; + delayBeforeCameraMs = sliceLaserInterleaved; + delayBeforeLaserMs = sliceDeadTime + sliceLaserInterleaved; + delayBeforeScanMs = 0.0; break; default: studio_.logs().showError("Invalid camera mode"); break; } - // sync with builder so that tsb.sliceDuration() is accurate + // sync with builder so that tsb.sliceDurationMs() is accurate tsb.scansPerSlice(scansPerSlice) - .scanDuration(scanDuration) - .cameraTriggerDuration(cameraTriggerDuration) - .laserTriggerDuration(laserTriggerDuration) - .delayBeforeScan(delayBeforeScan) - .delayBeforeLaser(delayBeforeLaser) - .delayBeforeCamera(delayBeforeCamera) - .cameraExposure(cameraExposure); + .scanDurationMs(scanDurationMs) + .cameraTriggerDurationMs(cameraTriggerDurationMs) + .laserTriggerDurationMs(laserTriggerDurationMs) + .delayBeforeScanMs(delayBeforeScanMs) + .delayBeforeLaserMs(delayBeforeLaserMs) + .delayBeforeCameraMs(delayBeforeCameraMs) + .cameraExposureMs(cameraExposureMs); // if a specific slice period was requested, add corresponding delay to scan/laser/camera if (!acqSettings_.slice().periodMinimized()) { - double globalDelay = acqSettings_.slice().period() - tsb.sliceDuration(); + double globalDelay = acqSettings_.slice().period() - tsb.sliceDurationMs(); // only true when user has specified period that is unattainable if (globalDelay < 0) { globalDelay = 0; studio_.logs().logDebugMessage("Increasing slice period to meet laser exposure constraint\n" + "(time required for camera readout; readout time depends on ROI)."); } - delayBeforeCamera += globalDelay; - delayBeforeLaser += globalDelay; - delayBeforeScan += globalDelay; - - // sync with builder so that tsb.sliceDuration() is accurate - tsb.delayBeforeScan(delayBeforeScan) - .delayBeforeLaser(delayBeforeLaser) - .delayBeforeCamera(delayBeforeCamera); + delayBeforeCameraMs += globalDelay; + delayBeforeLaserMs += globalDelay; + delayBeforeScanMs += globalDelay; + + // sync with builder so that tsb.sliceDurationMs() is accurate + tsb.delayBeforeScanMs(delayBeforeScanMs) + .delayBeforeLaserMs(delayBeforeLaserMs) + .delayBeforeCameraMs(delayBeforeCameraMs); } // fix corner case of (exposure time + readout time) being greater than the slice duration // most of the time the slice duration is already larger final double extraGlobalDelay = NumberUtils.ceilToQuarterMs( - (cameraExposure + cameraReadoutTime) - tsb.sliceDuration()); + (cameraExposureMs + cameraReadoutTime) - tsb.sliceDurationMs()); if (extraGlobalDelay > 0) { - delayBeforeCamera += extraGlobalDelay; - delayBeforeLaser += extraGlobalDelay; - delayBeforeScan += extraGlobalDelay; + delayBeforeCameraMs += extraGlobalDelay; + delayBeforeLaserMs += extraGlobalDelay; + delayBeforeScanMs += extraGlobalDelay; } // final sync, only values updated are delays - tsb.delayBeforeScan(delayBeforeScan) - .delayBeforeLaser(delayBeforeLaser) - .delayBeforeCamera(delayBeforeCamera); + tsb.delayBeforeScanMs(delayBeforeScanMs) + .delayBeforeLaserMs(delayBeforeLaserMs) + .delayBeforeCameraMs(delayBeforeCameraMs); return tsb; } @@ -1295,8 +1285,8 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { // we will wait cameraReadoutMax before triggering camera, then wait another cameraResetMax for global exposure // this will also be in 0.25ms increment final double globalExposureDelayMax = cameraReadoutMax + cameraResetMax; - double laserTriggerDuration = NumberUtils.roundToQuarterMs(acqSettings_.slice().sampleExposure()); - double scanDuration = laserTriggerDuration + 2*scanLaserBufferTime; + double laserTriggerDurationMs = NumberUtils.roundToQuarterMs(acqSettings_.slice().sampleExposure()); + double scanDurationMs = laserTriggerDurationMs + 2*scanLaserBufferTime; // scan will be longer than laser by 0.25ms at both start and end // account for delay in scan position due to Bessel filter by starting the scan slightly earlier @@ -1331,10 +1321,10 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { scanDelayFilter -= 0.25; } - double delayBeforeScan = globalExposureDelayMax - scanLaserBufferTime // start scan 0.25ms before camera's global exposure + double delayBeforeScanMs = globalExposureDelayMax - scanLaserBufferTime // start scan 0.25ms before camera's global exposure - scanDelayFilter; // start galvo moving early due to card's Bessel filter and delay of TTL signals via PLC - double delayBeforeLaser = globalExposureDelayMax; // turn on laser as soon as camera's global exposure is reached - double delayBeforeCamera = cameraReadoutMax; // camera must read out last frame before triggering again + double delayBeforeLaserMs = globalExposureDelayMax; // turn on laser as soon as camera's global exposure is reached + double delayBeforeCameraMs = cameraReadoutMax; // camera must read out last frame before triggering again // figure out desired time for camera to be exposing (including reset time) // because both camera trigger and laser on occur on 0.25ms intervals (i.e. we may not @@ -1344,52 +1334,52 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { // TODO: skipped PVCAM case, this should already be handled by camera.getResetTime(camMode); but there may be differences // make sure to accumulate values so our comparison logic works at the end of the method - double cameraExposure = NumberUtils.ceilToQuarterMs(cameraResetTime) + laserTriggerDuration; + double cameraExposureMs = NumberUtils.ceilToQuarterMs(cameraResetTime) + laserTriggerDurationMs; - double cameraTriggerDuration = 1.0; // a reasonable default + double cameraTriggerDurationMs = 1.0; // a reasonable default - // NOTE: tsb.sliceDuration() is needed in PSEUDO_OVERLAP camera mode. - // cameraExposure will be modified in the switch, sliceDuration does not depend on it + // NOTE: tsb.sliceDurationMs() is needed in PSEUDO_OVERLAP camera mode. + // cameraExposureMs will be modified in the switch, sliceDurationMs does not depend on it DefaultTimingSettings.Builder tsb = DefaultTimingSettings.builder(); tsb.scansPerSlice(1) - .scanDuration(scanDuration) - .cameraTriggerDuration(cameraTriggerDuration) - .laserTriggerDuration(laserTriggerDuration) - .delayBeforeScan(delayBeforeScan) - .delayBeforeLaser(delayBeforeLaser) - .delayBeforeCamera(delayBeforeCamera) - .cameraExposure(cameraExposure); // base exposure before camera mode specific adjustments + .scanDurationMs(scanDurationMs) + .cameraTriggerDurationMs(cameraTriggerDurationMs) + .laserTriggerDurationMs(laserTriggerDurationMs) + .delayBeforeScanMs(delayBeforeScanMs) + .delayBeforeLaserMs(delayBeforeLaserMs) + .delayBeforeCameraMs(delayBeforeCameraMs) + .cameraExposureMs(cameraExposureMs); // base exposure before camera mode specific adjustments final CameraMode cameraMode = acqSettings_.cameraMode(); switch (cameraMode) { case EDGE: - // cameraTriggerDuration: doesn't really matter, 1ms should be plenty fast yet easy to see for debugging - cameraExposure += 0.1; // add 0.1ms as safety margin, may require adding 0.25ms to slice + // cameraTriggerDurationMs: doesn't really matter, 1ms should be plenty fast yet easy to see for debugging + cameraExposureMs += 0.1; // add 0.1ms as safety margin, may require adding 0.25ms to slice // slight delay between trigger and actual exposure start // is included in exposure time for Hamamatsu and negligible for Andor and PCO cameras // ensure not to miss triggers by not being done with readout in time for next trigger, add 0.25ms if needed - if (tsb.sliceDuration() < (cameraExposure + cameraReadoutTime)) { - delayBeforeCamera += 0.25; - delayBeforeLaser += 0.25; - delayBeforeScan += 0.25; + if (tsb.sliceDurationMs() < (cameraExposureMs + cameraReadoutTime)) { + delayBeforeCameraMs += 0.25; + delayBeforeLaserMs += 0.25; + delayBeforeScanMs += 0.25; } break; case LEVEL: // AKA "bulb mode", TTL rising starts exposure, TTL falling ends it - cameraTriggerDuration = NumberUtils.ceilToQuarterMs(cameraExposure); - cameraExposure = 1.0; // doesn't really matter, controlled by TTL + cameraTriggerDurationMs = NumberUtils.ceilToQuarterMs(cameraExposureMs); + cameraExposureMs = 1.0; // doesn't really matter, controlled by TTL break; case OVERLAP: // only Hamamatsu or Andor - // cameraTriggerDuration: doesn't really matter, 1ms should be plenty fast yet easy to see for debugging - cameraExposure = 1.0; // doesn't really matter, controlled by interval between triggers + // cameraTriggerDurationMs: doesn't really matter, 1ms should be plenty fast yet easy to see for debugging + cameraExposureMs = 1.0; // doesn't really matter, controlled by interval between triggers break; case PSEUDO_OVERLAP:// PCO or Photometrics, enforce 0.25ms between end exposure and start of next exposure by triggering camera 0.25ms into the slice - // cameraTriggerDuration: doesn't really matter, 1ms should be plenty fast yet easy to see for debugging + // cameraTriggerDurationMs: doesn't really matter, 1ms should be plenty fast yet easy to see for debugging switch (CameraLibrary.fromString(camera.getDeviceLibrary())) { case PVCAM: - // leave cameraExposure alone + // leave cameraExposureMs alone break; case PCOCAMERA: - cameraExposure = tsb.sliceDuration() - delayBeforeCamera; // delayBeforeCamera should be 0.25ms for PCO + cameraExposureMs = tsb.sliceDurationMs() - delayBeforeCameraMs; // delayBeforeCameraMs should be 0.25ms for PCO break; default: studio_.logs().showError("Unknown camera library for pseudo-overlap " @@ -1405,60 +1395,60 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { break; } - // sync with builder so that tsb.sliceDuration() is accurate - tsb.cameraTriggerDuration(cameraTriggerDuration) - .delayBeforeScan(delayBeforeScan) - .delayBeforeLaser(delayBeforeLaser) - .delayBeforeCamera(delayBeforeCamera); + // sync with builder so that tsb.sliceDurationMs() is accurate + tsb.cameraTriggerDurationMs(cameraTriggerDurationMs) + .delayBeforeScanMs(delayBeforeScanMs) + .delayBeforeLaserMs(delayBeforeLaserMs) + .delayBeforeCameraMs(delayBeforeCameraMs); // fix corner case of negative calculated scanDelay - if (delayBeforeScan < 0) { - delayBeforeCamera -= delayBeforeScan; - delayBeforeLaser -= delayBeforeScan; - delayBeforeScan = 0; // same as (-= delayBeforeScan) + if (delayBeforeScanMs < 0) { + delayBeforeCameraMs -= delayBeforeScanMs; + delayBeforeLaserMs -= delayBeforeScanMs; + delayBeforeScanMs = 0; // same as (-= delayBeforeScanMs) // sync with builder - tsb.delayBeforeScan(delayBeforeScan) - .delayBeforeLaser(delayBeforeLaser) - .delayBeforeCamera(delayBeforeCamera); + tsb.delayBeforeScanMs(delayBeforeScanMs) + .delayBeforeLaserMs(delayBeforeLaserMs) + .delayBeforeCameraMs(delayBeforeCameraMs); } // if a specific slice period was requested, add corresponding delay to scan/laser/camera if (!acqSettings_.slice().periodMinimized()) { - double globalDelay = acqSettings_.slice().period() - tsb.sliceDuration(); + double globalDelay = acqSettings_.slice().period() - tsb.sliceDurationMs(); // only true when user has specified period that is unattainable if (globalDelay < 0) { globalDelay = 0; studio_.logs().logDebugMessage("Increasing slice period to meet laser exposure constraint\n" + "(time required for camera readout; readout time depends on ROI)."); } - delayBeforeCamera += globalDelay; - delayBeforeLaser += globalDelay; - delayBeforeScan += globalDelay; - - // sync with builder so that tsb.sliceDuration() is accurate - tsb.delayBeforeScan(delayBeforeScan) - .delayBeforeLaser(delayBeforeLaser) - .delayBeforeCamera(delayBeforeCamera); + delayBeforeCameraMs += globalDelay; + delayBeforeLaserMs += globalDelay; + delayBeforeScanMs += globalDelay; + + // sync with builder so that tsb.sliceDurationMs() is accurate + tsb.delayBeforeScanMs(delayBeforeScanMs) + .delayBeforeLaserMs(delayBeforeLaserMs) + .delayBeforeCameraMs(delayBeforeCameraMs); } // fix corner case of (exposure time + readout time) being greater than the slice duration // most of the time the slice duration is already larger final double extraGlobalDelay = NumberUtils.ceilToQuarterMs( - (cameraExposure + cameraReadoutTime) - tsb.sliceDuration()); + (cameraExposureMs + cameraReadoutTime) - tsb.sliceDurationMs()); if (extraGlobalDelay > 0) { - delayBeforeCamera += extraGlobalDelay; - delayBeforeLaser += extraGlobalDelay; - delayBeforeScan += extraGlobalDelay; + delayBeforeCameraMs += extraGlobalDelay; + delayBeforeLaserMs += extraGlobalDelay; + delayBeforeScanMs += extraGlobalDelay; } tsb.scansPerSlice(1) - .scanDuration(scanDuration) - .cameraTriggerDuration(cameraTriggerDuration) - .laserTriggerDuration(laserTriggerDuration) - .delayBeforeScan(delayBeforeScan) - .delayBeforeLaser(delayBeforeLaser) - .delayBeforeCamera(delayBeforeCamera) - .cameraExposure(cameraExposure); + .scanDurationMs(scanDurationMs) + .cameraTriggerDurationMs(cameraTriggerDurationMs) + .laserTriggerDurationMs(laserTriggerDurationMs) + .delayBeforeScanMs(delayBeforeScanMs) + .delayBeforeLaserMs(delayBeforeLaserMs) + .delayBeforeCameraMs(delayBeforeCameraMs) + .cameraExposureMs(cameraExposureMs); return tsb; } @@ -1485,7 +1475,7 @@ public void updateDurationLabels() { } private void updateSlicePeriodLabel(final JLabel label) { - label.setText(NumberUtils.doubleToDisplayString(acqSettings_.timing().sliceDuration()) + " ms"); + label.setText(NumberUtils.doubleToDisplayString(acqSettings_.timing().sliceDurationMs()) + " ms"); } private void updateVolumeDurationLabel(final JLabel label) { @@ -1521,7 +1511,7 @@ private void updateTotalTimeDurationLabel(final JLabel label) { private double computeTotalTimeDuration() { final int numTimePoints = acqSettings_.isUsingTimePoints() ? acqSettings_.numTimePoints() : 1; - return (numTimePoints - 1) * acqSettings_.timePointInterval() + computeTimePointDuration() / 1000.0; + return (numTimePoints - 1) * acqSettings_.timePointIntervalSec() + computeTimePointDuration() / 1000.0; } /** @@ -1562,7 +1552,7 @@ public double computeVolumeDuration() { } // stackDuration is per-view, per-channel, per-position - final double stackDuration = numCameraTriggers * acqSettings_.timing().sliceDuration(); + final double stackDuration = numCameraTriggers * acqSettings_.timing().sliceDurationMs(); if (acqSettings_.stageScan().enabled()) { final double rampDuration = getStageRampDuration(acqSettings_); diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/LightSheetEventAdapter.java b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/LightSheetEventAdapter.java index ee652712..108d3602 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/LightSheetEventAdapter.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/LightSheetEventAdapter.java @@ -50,7 +50,7 @@ public static Iterator createTimelapseMultiChannelVolumeAcqEve throw new RuntimeException("timelapse selected but only one timepoint"); } Function> timelapse = - timelapse(settings.numTimePoints(), settings.timePointInterval()); + timelapse(settings.numTimePoints(), settings.timePointIntervalSec()); if (settings.channels().count() == 1) { throw new RuntimeException("Expected multiple channels but only one found"); diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/autofocus/AutofocusAdapter.java b/src/main/java/org/micromanager/lightsheetmanager/model/autofocus/AutofocusAdapter.java index cb9758ba..966cf072 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/autofocus/AutofocusAdapter.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/autofocus/AutofocusAdapter.java @@ -53,7 +53,7 @@ public void run() { // TODO: is this correct? final double exposure = model_.acquisitions() .settingsBuilder().timingBuilder().build() - .cameraExposure(); + .cameraExposureMs(); // convert numImages and stepSizeUm to OughtaFocus plugin // "SearchRange_um" and "Tolerance_um" properties