From 3b825cfe3a88d34dfea0063b5079647f572883b9 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 10:51:09 -0700 Subject: [PATCH 01/16] init advanced timing and slice panel based on settings --- .../lightsheetmanager/gui/tabs/AcquisitionTab.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 1a90a6b7..d24bab79 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java @@ -177,8 +177,11 @@ private void createUserInterface() { settings.acquisitionMode(), 180, 24); + final boolean isUsingAdvancedTiming = settings.isUsingAdvancedTiming(); cbxUseAdvancedTiming_ = new CheckBox("Use advanced timing settings", - 12, settings.isUsingAdvancedTiming(), CheckBox.RIGHT); + 12, isUsingAdvancedTiming, CheckBox.RIGHT); + // initial enabled or disabled state + swapTimingSettingsPanels(isUsingAdvancedTiming); btnRunOverviewAcq_.setEnabled(false); // TODO: re-enable when these features are put in btnTestAcquisition_.setEnabled(false); From a555481e33c4aa9a1237c6981df776218ccd388a Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 11:11:31 -0700 Subject: [PATCH 02/16] improve error message for galvo constant not being set --- .../lightsheetmanager/gui/tabs/setup/SetupPanel.java | 2 -- .../org/micromanager/lightsheetmanager/model/PLogicScape.java | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/SetupPanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/SetupPanel.java index cefa73ed..e5027cdb 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/SetupPanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/setup/SetupPanel.java @@ -7,8 +7,6 @@ import java.util.Objects; -// Note: changes based on camera trigger mode - /** * A setup panel for diSPIM. */ diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java index 587f0da3..2a1bf7bd 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java @@ -487,7 +487,8 @@ public boolean prepareControllerForAcquisitionSide( //final double slope2 = settings.sliceCalibration(2).sliceSlope(); double sliceRate = settings.sliceCalibration().slope();//(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."); + studio_.logs().showError("The \"Galvo constant\" is not set, it must not be 0.\n" + + "Please update the value on the setup tab."); return false; } //final double offset1 = settings.sliceCalibration(1).sliceOffset() + channelOffset; From 20b574d86db8d14e9d6ca4dc9d8dd5909f91470c Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 11:22:21 -0700 Subject: [PATCH 03/16] add tooltips to btns on save panel for acq tab --- .../lightsheetmanager/gui/tabs/acquisition/SavePanel.java | 7 +++++++ 1 file changed, 7 insertions(+) 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 038cedc4..2f805969 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 @@ -118,6 +118,13 @@ public void createUserInterface() { btnLoadSettings_ = new Button("Load", 60, 20); btnConvertSettings_ = new Button("Convert", 72, 20); + btnBrowse_.setToolTipText("Select the save directory with the file browser."); + btnOpen_.setToolTipText("Open the file explorer to the save directory."); + btnSaveSettings_.setToolTipText("Save the current acquisition settings to JSON."); + btnLoadSettings_.setToolTipText("Load acquisitions settings from a JSON file."); + btnConvertSettings_.setToolTipText("Convert \"AcqSettings.txt\" from the " + + "Micro-Manager 1.4 plugin into Light Sheet Manager settings."); + add(lblSaveDirectory, ""); add(txtSaveDirectory_, ""); add(btnBrowse_, ""); From aa55302e9e6af81d744bb866345d74b25b373fb1 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 12:48:24 -0700 Subject: [PATCH 04/16] fix settings tab layout --- .../micromanager/lightsheetmanager/gui/tabs/SettingsTab.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 8c4e6764..17d19ce7 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SettingsTab.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SettingsTab.java @@ -156,10 +156,10 @@ private void createUserInterface() { add(pnlScanSettings, "wrap"); if (isUsingPLogic_) { - add(pnlLightSheet, "growx"); + add(pnlLightSheet, "growx, wrap"); } - add(btnCreateConfigGroup_, "gaptop 40"); + add(btnCreateConfigGroup_, ""); } private void createEventHandlers() { From ab84bba2d7db3f864a78f353d61ec1d71781381d Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 13:07:52 -0700 Subject: [PATCH 05/16] stop the acquisition if the galvo constant is 0 --- .../model/acquisitions/AcquisitionEngineScape.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 7db63fc2..ed6d571c 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -992,8 +992,7 @@ private boolean doHardwareCalculations(PLogicScape plc) { } double extraChannelOffset = 0.0; - plc.prepareControllerForAcquisition(acqSettings_, extraChannelOffset); - return true; + return plc.prepareControllerForAcquisition(acqSettings_, extraChannelOffset); } private void doHardwareCalculationsNIDAQ() { From cc2a99098ed76253edf75ecbf2dc8cac8069e279 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 13:08:35 -0700 Subject: [PATCH 06/16] update plugin version --- .../micromanager/lightsheetmanager/LightSheetManagerPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/LightSheetManagerPlugin.java b/src/main/java/org/micromanager/lightsheetmanager/LightSheetManagerPlugin.java index 85ef4585..8d24b24d 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/LightSheetManagerPlugin.java +++ b/src/main/java/org/micromanager/lightsheetmanager/LightSheetManagerPlugin.java @@ -14,7 +14,7 @@ public class LightSheetManagerPlugin implements MenuPlugin, SciJavaPlugin { public static final String copyright = "Applied Scientific Instrumentation (ASI), 2022-2026"; public static final String description = "A plugin to control various types of light sheet microscopes."; public static final String menuName = "Light Sheet Manager"; - public static final String version = "0.6.1"; + public static final String version = "0.6.3"; private Studio studio_; private LightSheetManager model_; From e612b95971609911d3c950b09f919a6c64f60f35 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 13:18:12 -0700 Subject: [PATCH 07/16] fix npe during finish() if no acq created --- .../model/acquisitions/AcquisitionEngineScape.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) 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 ed6d571c..06b4f37d 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -754,11 +754,14 @@ boolean finish() { studio_.logs().logError("Couldn't restore shutter to original state"); } - // Check if acquisition ended due to an exception and show error to user if it did - try { - currentAcquisition_.checkForExceptions(); - } catch (Exception e) { - studio_.logs().logError(e); + // check if acquisition ended due to an exception and show error + // currentAcquisition_ can be null if an error occurred during setup + if (currentAcquisition_ != null) { + try { + currentAcquisition_.checkForExceptions(); + } catch (Exception e) { + studio_.logs().logError(e); + } } // TODO: execute any end-acquisition runnables From 10f6e84684a1b5b3c01fd97249308856b8c091df Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 14:04:03 -0700 Subject: [PATCH 08/16] add dialog box to remind user to enable the beam --- .../lightsheetmanager/gui/tabs/setup/PiezoCalibrationPanel.java | 2 ++ 1 file changed, 2 insertions(+) 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 10e2e289..2a43c6c1 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 @@ -173,6 +173,8 @@ private void createEventHandlers() { .sliceCalibrationBuilder().offset(newOffset); model_.studio().logs().logMessage("updated offset for view " + pathNum_ + "; new value is " + newOffset + " (with channel offset of " + channelOffset + ")"); + } else { + model_.studio().logs().showError("The beam must be enabled to update the offsets.", btnUpdate_); } }); } From 14a6c64777a15a0292a23124b75ee5073c7bc267 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 14:10:41 -0700 Subject: [PATCH 09/16] fix small typo --- .../lightsheetmanager/gui/tabs/setup/PiezoCalibrationPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2a43c6c1..40822a79 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 @@ -174,7 +174,7 @@ private void createEventHandlers() { model_.studio().logs().logMessage("updated offset for view " + pathNum_ + "; new value is " + newOffset + " (with channel offset of " + channelOffset + ")"); } else { - model_.studio().logs().showError("The beam must be enabled to update the offsets.", btnUpdate_); + model_.studio().logs().showError("The beam must be enabled to update the offset.", btnUpdate_); } }); } From e5d09a81a55c67c55c8cf0feef10bc354d609df2 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 14:19:36 -0700 Subject: [PATCH 10/16] update the durations when switching acq modes --- .../lightsheetmanager/gui/tabs/AcquisitionTab.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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 d24bab79..01b6fbf1 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java @@ -278,9 +278,11 @@ private void createEventHandlers() { }); // select the acquisition mode - cmbAcquisitionModes_.registerListener( - () -> model_.acquisitions().settingsBuilder() - .acquisitionMode(cmbAcquisitionModes_.getSelected())); + cmbAcquisitionModes_.registerListener(() -> { + model_.acquisitions().settingsBuilder() + .acquisitionMode(cmbAcquisitionModes_.getSelected()); + model_.acquisitions().updateDurationLabels(); + }); // switches timing panels based on check box cbxUseAdvancedTiming_.registerListener(() -> { From 3b141bc17968087a98a467d49913161e7b355d1d Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 16:20:44 -0700 Subject: [PATCH 11/16] improve duration timing for stage scan --- .../lightsheetmanager/model/PLogicScape.java | 9 +++-- .../acquisitions/AcquisitionEngineScape.java | 39 ++++++++++++++++++- .../model/devices/vendor/ASIXYStage.java | 7 +++- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java index 2a1bf7bd..1ab1757f 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java @@ -193,7 +193,7 @@ public boolean prepareControllerForAcquisition( final boolean isInterleaved = (settings.acquisitionMode() == AcquisitionMode.STAGE_SCAN_INTERLEAVED); // figure out the speed we should be going according to slice period, slice spacing, geometry, etc. - final double requestedMotorSpeed = computeScanSpeed(settings, scanner_.getSPIMNumScansPerSlice()); // in mm/sec + final double requestedMotorSpeed = computeScanSpeed(settings); // in mm/sec final double maxSpeed = xyStage_.getMaxSpeedX(); if (requestedMotorSpeed > (maxSpeed * 0.8)) { @@ -265,10 +265,11 @@ public boolean prepareControllerForAcquisition( } // Compute appropriate motor speed in mm/s for the given stage scanning settings - public double computeScanSpeed(ScapeAcquisitionSettings settings, final int numScansPerSlice) { + public double computeScanSpeed(final ScapeAcquisitionSettings settings) { //double sliceDuration = settings.timingSettings().sliceDuration(); // TODO: getSliceDuration only used here, but maybe should be computed elsewhere, and get with method above? - double sliceDuration = getSliceDuration(settings.timing(), numScansPerSlice); + //double sliceDuration = getSliceDuration(settings.timing(), numScansPerSlice); + double sliceDuration = settings.timing().sliceDuration(); 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 @@ -291,7 +292,7 @@ private int computeScanChannelsPerPass(ScapeAcquisitionSettings settings) { * @param motorSpeed * @return */ - public double computeScanAcceleration(final double motorSpeed, ScapeAcquisitionSettings settings) { + public double computeScanAcceleration(final double motorSpeed, final ScapeAcquisitionSettings settings) { return (10 + 100 * (motorSpeed / xyStage_.getMaxSpeedX())) * settings.stageScan().accelerationFactor(); } 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 06b4f37d..6ae4014c 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -21,6 +21,7 @@ import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.api.data.ChannelMode; import org.micromanager.lightsheetmanager.api.internal.DefaultTimingSettings; +import org.micromanager.lightsheetmanager.api.internal.ScapeAcquisitionSettings; import org.micromanager.lightsheetmanager.gui.utils.DialogUtils; import org.micromanager.lightsheetmanager.model.DataStorage; import org.micromanager.lightsheetmanager.LightSheetManager; @@ -36,6 +37,7 @@ import org.micromanager.lightsheetmanager.model.devices.vendor.ASIScanner; import org.micromanager.lightsheetmanager.model.devices.vendor.ASIXYStage; import org.micromanager.lightsheetmanager.model.utils.FileUtils; +import org.micromanager.lightsheetmanager.model.utils.GeometryUtils; import org.micromanager.lightsheetmanager.model.utils.NumberUtils; import javax.swing.JLabel; @@ -1434,8 +1436,8 @@ public double computeVolumeDuration() { final double stackDuration = numCameraTriggers * acqSettings_.timing().sliceDuration(); if (acqSettings_.stageScan().enabled()) { - final double rampDuration = 1; //getStageRampDuration(acqSettings); - final double retraceTime = 1; //getStageRetraceDuration(acqSettings); + final double rampDuration = getStageRampDuration(acqSettings_); + final double retraceTime = getStageRetraceDuration(acqSettings_); // TODO(Jon): double-check these calculations below, at least they are better than before ;-) if (acqSettings_.acquisitionMode() == AcquisitionMode.STAGE_SCAN) { if (channelMode == ChannelMode.SLICE_HW) { @@ -1470,4 +1472,37 @@ public double computeVolumeDuration() { } } + private double getStageRampDuration(final ScapeAcquisitionSettings settings) { + final double rampDuration = settings.volume().delayBeforeView() + getScanStageAcceleration(settings); + model_.studio().logs().logDebugMessage("stage ramp duration is " + rampDuration + " milliseconds"); + return rampDuration; + } + + private double getScanStageAcceleration(final ScapeAcquisitionSettings settings) { + // extra 1 for rounding up that often happens in controller + return controller_.computeScanAcceleration(controller_.computeScanSpeed(settings), settings) + 1; + } + + private double getStageRetraceDuration(final ScapeAcquisitionSettings settings) { + final ASIXYStage stage = model_.devices().device("XYStage"); + if (stage == null) { + studio_.logs().showError("could not find XY stage!"); + return 0.0; // early exit => error + } + final double retraceRelativeSpeedPercent; + if (stage.hasProperty(ASIXYStage.Properties.SCAN_RETRACE_SPEED)) { + // this added in firmware v3.30; if not present then we set to firmware default hardcoded previously + retraceRelativeSpeedPercent = stage.getScanRetraceSpeed(); + } else { + retraceRelativeSpeedPercent = 67.0; + } + final double retraceSpeed = retraceRelativeSpeedPercent / 100 * stage.getMaxSpeedX(); + final double speedFactor = GeometryUtils.getStageGeometricSpeedFactor( + settings.stageScan().firstViewAngle(), settings.volume().firstView() == 1); + final double scanDistance = settings.volume().slicesPerView() * settings.volume().sliceStepSize() * speedFactor; + final double accelerationX = getScanStageAcceleration(settings); + final double retraceDuration = scanDistance / retraceSpeed + accelerationX * 2; + studio_.logs().logDebugMessage("stage retrace duration is " + retraceDuration + " milliseconds"); + return retraceDuration; + } } diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/devices/vendor/ASIXYStage.java b/src/main/java/org/micromanager/lightsheetmanager/model/devices/vendor/ASIXYStage.java index f5fe38ed..635d2fa5 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/devices/vendor/ASIXYStage.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/devices/vendor/ASIXYStage.java @@ -166,6 +166,11 @@ public double getScanSettlingTime() { return getPropertyFloat(Properties.SCAN_SETTLING_TIME); } + // TODO: should this be an int? + public double getScanRetraceSpeed() { + return getPropertyFloat(Properties.SCAN_RETRACE_SPEED); + } + public static class Properties { public static final String AXIS_POLARITY_X = "AxisPolarityX"; public static final String AXIS_POLARITY_Y = "AxisPolarityY"; @@ -182,7 +187,7 @@ public static class Properties { public static final String SCAN_PATTERN = "ScanPattern"; public static final String SCAN_STATE = "ScanState"; public static final String SCAN_SETTLING_TIME = "ScanSettlingTime(ms)"; - + public static final String SCAN_RETRACE_SPEED = "ScanRetraceSpeedPercent(%)"; public static final String SCAN_FAST_AXIS_START_POSITION = "ScanFastAxisStartPosition(mm)"; public static final String SCAN_FAST_AXIS_STOP_POSITION = "ScanFastAxisStopPosition(mm)"; public static final String SCAN_SLOW_AXIS_START_POSITION = "ScanSlowAxisStartPosition(mm)"; From 0ce82a91b814d96d8beecd78a6f15a42e2db6b20 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 16:29:56 -0700 Subject: [PATCH 12/16] remove some of the sliceDuration fns --- .../lightsheetmanager/model/PLogicScape.java | 15 --------------- .../acquisitions/AcquisitionEngineDispim.java | 11 ----------- .../acquisitions/AcquisitionEngineScape.java | 1 + 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java index 1ab1757f..ca60b4fd 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java @@ -296,21 +296,6 @@ public double computeScanAcceleration(final double motorSpeed, final ScapeAcquis return (10 + 100 * (motorSpeed / xyStage_.getMaxSpeedX())) * settings.stageScan().accelerationFactor(); } - // 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 - - // 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.delayBeforeCamera() + s.cameraTriggerDuration() // camera time - ); - } - /** * Compute appropriate acceleration time in ms for the specified motor speed. * Set to be 10ms + 0-100ms depending on relative speed to max, all scaled by factor specified on the settings panel 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 8eda8767..73f049d9 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java @@ -885,17 +885,6 @@ public double getSliceDuration( ); } - private double getSliceDuration(DefaultTimingSettings.Builder tsb) { - DefaultTimingSettings s = tsb.build(); - // slice duration is the max out of the scan time, laser time, and camera time - return Math.max(Math.max( - s.delayBeforeScan() + (s.scanDuration() * s.scansPerSlice()), // scan time - s.delayBeforeLaser() + s.laserTriggerDuration() // laser time - ), - s.delayBeforeCamera() + s.cameraTriggerDuration() // camera time - ); - } - private double computeTimePointDuration() { final double volumeDuration = computeActualVolumeDuration(acqSettings_); if (acqSettings_.isUsingMultiplePositions()) { 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 6ae4014c..1aa4ee33 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -1505,4 +1505,5 @@ private double getStageRetraceDuration(final ScapeAcquisitionSettings settings) studio_.logs().logDebugMessage("stage retrace duration is " + retraceDuration + " milliseconds"); return retraceDuration; } + } From c2050ba4a5d3a7f6d0089a8eeec71c108084643d Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 16:39:25 -0700 Subject: [PATCH 13/16] remove commented code --- .../org/micromanager/lightsheetmanager/model/PLogicScape.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java index ca60b4fd..1df11357 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java @@ -266,9 +266,6 @@ 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.timingSettings().sliceDuration(); - // TODO: getSliceDuration only used here, but maybe should be computed elsewhere, and get with method above? - //double sliceDuration = getSliceDuration(settings.timing(), numScansPerSlice); double sliceDuration = settings.timing().sliceDuration(); if (settings.acquisitionMode() == AcquisitionMode.STAGE_SCAN_INTERLEAVED) { // pretend like our slice takes twice as long so that we move the correct speed From a9c78ba5a08526fb40d6357c6344ea259105a3ca Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 16:52:12 -0700 Subject: [PATCH 14/16] log errors as debug messages instead using a dialog box --- .../model/acquisitions/AcquisitionEngineScape.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 1aa4ee33..8febc623 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -1129,7 +1129,7 @@ public DefaultTimingSettings.Builder getTimingFromExposure() { // only true when user has specified period that is unattainable if (globalDelay < 0) { globalDelay = 0; - studio_.logs().showError("Increasing slice period to meet laser exposure constraint\n" + studio_.logs().logDebugMessage("Increasing slice period to meet laser exposure constraint\n" + "(time required for camera readout; readout time depends on ROI)."); } delayBeforeCamera += globalDelay; @@ -1314,7 +1314,7 @@ public DefaultTimingSettings.Builder getTimingFromPeriodAndLightExposure() { // only true when user has specified period that is unattainable if (globalDelay < 0) { globalDelay = 0; - studio_.logs().showError("Increasing slice period to meet laser exposure constraint\n" + studio_.logs().logDebugMessage("Increasing slice period to meet laser exposure constraint\n" + "(time required for camera readout; readout time depends on ROI)."); } delayBeforeCamera += globalDelay; From 5a336d1611555d61067e06b746701df1e56807c7 Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 17:14:23 -0700 Subject: [PATCH 15/16] use correct lsm name for xy stage, fix npe for stage scan settings --- .../model/acquisitions/AcquisitionEngineScape.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 8febc623..f7a15170 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -1479,12 +1479,16 @@ private double getStageRampDuration(final ScapeAcquisitionSettings settings) { } private double getScanStageAcceleration(final ScapeAcquisitionSettings settings) { + // TODO: remove this and find a better way + if (controller_ == null) { + controller_ = new PLogicScape(model_); + } // extra 1 for rounding up that often happens in controller return controller_.computeScanAcceleration(controller_.computeScanSpeed(settings), settings) + 1; } private double getStageRetraceDuration(final ScapeAcquisitionSettings settings) { - final ASIXYStage stage = model_.devices().device("XYStage"); + final ASIXYStage stage = model_.devices().device("SampleXY"); if (stage == null) { studio_.logs().showError("could not find XY stage!"); return 0.0; // early exit => error From d02e6430f25c9f10b546cb0dac4b94c4d1f2275a Mon Sep 17 00:00:00 2001 From: Brandon Date: Wed, 22 Apr 2026 17:26:25 -0700 Subject: [PATCH 16/16] remove unused import --- .../org/micromanager/lightsheetmanager/model/PLogicScape.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java index 1df11357..60f5babd 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/PLogicScape.java @@ -4,7 +4,6 @@ import mmcorej.Configuration; import org.micromanager.Studio; import org.micromanager.lightsheetmanager.LightSheetManager; -import org.micromanager.lightsheetmanager.api.TimingSettings; import org.micromanager.lightsheetmanager.api.data.AcquisitionMode; import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.api.data.GeometryType;