From 83740a87c0dbdb052bed9d1b9da8cdb7aa39b3f7 Mon Sep 17 00:00:00 2001 From: Brandon Date: Tue, 21 Jul 2026 18:13:29 -0700 Subject: [PATCH 1/3] null check for datastore in finish() --- .../model/acquisitions/AcquisitionEngineDispim.java | 2 +- .../model/acquisitions/AcquisitionEngineScape.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 65df9d8..27ab253 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java @@ -566,7 +566,7 @@ void finish() { // don't save if the run never started or produced no images if (acquisitionStarted_ && acqSettings_.isSavingImagesDuringAcquisition() - && datastore_.getNumImages() > 0) { + && datastore_ != null && datastore_.getNumImages() > 0) { final String savePath = FileUtils.createUniquePath( acqSettings_.saveDirectory(), acqSettings_.saveNamePrefix()); try { 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 f7b8d50..42a9869 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -791,7 +791,7 @@ void finish() { // don't save if the run never started or produced no images if (acquisitionStarted_ && acqSettings_.isSavingImagesDuringAcquisition() - && datastore_.getNumImages() > 0) { + && datastore_ != null && datastore_.getNumImages() > 0) { final String savePath = FileUtils.createUniquePath( acqSettings_.saveDirectory(), acqSettings_.saveNamePrefix()); try { From 17da31cfcdf2f2454d83f0652c9cea25becd30cd Mon Sep 17 00:00:00 2001 From: Brandon Date: Tue, 21 Jul 2026 18:46:54 -0700 Subject: [PATCH 2/3] new null check makes acquisitionStart_ not necessary --- .../model/acquisitions/AcquisitionEngine.java | 9 ++------- .../model/acquisitions/AcquisitionEngineDispim.java | 4 ++-- .../model/acquisitions/AcquisitionEngineScape.java | 4 ++-- 3 files changed, 6 insertions(+), 11 deletions(-) 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 cb469ba..e74fb0f 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngine.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngine.java @@ -46,8 +46,6 @@ public abstract class AcquisitionEngine implements AcquisitionManager, MMAcquist private final ExecutorService acquisitionExecutor_ = Executors.newSingleThreadExecutor( r -> new Thread(r, "Acquisition Thread")); protected volatile Acquisition currentAcquisition_ = null; // TODO: consider making a getter rather than protected? - // true once setup() succeeds and run() is about to begin; the end-of-run save only runs when this is true - protected boolean acquisitionStarted_ = false; private final AutofocusAdapter autofocus_; @@ -158,8 +156,6 @@ public Future requestRun(boolean speedTest) { studio_.logs().showError(e, "Error during acquisition setup"); return; // early exit => stop acquisition } - // setup succeeded and we are about to run; end-of-run work (the save) is now valid - acquisitionStarted_ = true; run(); // run the acquisition and block until complete } catch (Exception e) { studio_.logs().showError(e); @@ -172,10 +168,9 @@ public Future requestRun(boolean speedTest) { // must ALWAYS run: if currentAcquisition_ is left set, every future // acquisition is rejected until the plugin restarts currentAcquisition_ = null; - // free the datastore at acq end so a large store isn't kept in memory; matches MM's AcqEngJAdapter.onAcquisitionEnded + // free the datastore so a large store isn't kept in memory (matches MM's + // AcqEngJAdapter.onAcquisitionEnded); also what the save guard checks to skip aborted/empty runs datastore_ = null; - // reset for the next run; must be here (always runs), not in finish() which can throw - acquisitionStarted_ = false; // LSM-ACQ-STOP in the innermost finally: fires on completion, error, abort, throwing finish() if (runId != -1) { final long elapsedMs = (System.nanoTime() - startNs) / 1_000_000L; 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 27ab253..2a4505e 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineDispim.java @@ -564,8 +564,8 @@ void finish() { // TODO: execute any end-acquisition runnables - // don't save if the run never started or produced no images - if (acquisitionStarted_ && acqSettings_.isSavingImagesDuringAcquisition() + // save only if this run created a store with images + if (acqSettings_.isSavingImagesDuringAcquisition() && datastore_ != null && datastore_.getNumImages() > 0) { final String savePath = FileUtils.createUniquePath( acqSettings_.saveDirectory(), acqSettings_.saveNamePrefix()); 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 42a9869..aaad5a6 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -789,8 +789,8 @@ void finish() { // TODO: execute any end-acquisition runnables - // don't save if the run never started or produced no images - if (acquisitionStarted_ && acqSettings_.isSavingImagesDuringAcquisition() + // save only if this run created a store with images + if (acqSettings_.isSavingImagesDuringAcquisition() && datastore_ != null && datastore_.getNumImages() > 0) { final String savePath = FileUtils.createUniquePath( acqSettings_.saveDirectory(), acqSettings_.saveNamePrefix()); From b38aa9d4577ce59b7daa96fe9dfe143a947816d0 Mon Sep 17 00:00:00 2001 From: Brandon Date: Tue, 21 Jul 2026 18:54:03 -0700 Subject: [PATCH 3/3] increase version number --- .../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 34b515b..30f8393 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.7.3"; + public static final String version = "0.7.4"; private Studio studio_; private LightSheetManager model_;