From c1373c669ed55d8cc55fd7faff2dedbec9e12173 Mon Sep 17 00:00:00 2001 From: Nick Anthony Date: Fri, 3 Aug 2018 12:09:15 -0500 Subject: [PATCH 01/36] started fixing some imports for version micromanager 2.0 --- FrameAverager.1.4.22/MANIFEST.MF | 8 +- .../nbproject/private/private.properties | 4 +- .../nbproject/private/private.xml | 9 ++ .../nbproject/project.properties | 127 ++++++++++-------- .../frameaverage/FrameAveragerRunnable.java | 4 +- .../cdp/frameaverage/TaggedFrameAverager.java | 24 ++-- 6 files changed, 101 insertions(+), 75 deletions(-) diff --git a/FrameAverager.1.4.22/MANIFEST.MF b/FrameAverager.1.4.22/MANIFEST.MF index fa6f6d2..a0ce95f 100644 --- a/FrameAverager.1.4.22/MANIFEST.MF +++ b/FrameAverager.1.4.22/MANIFEST.MF @@ -1,9 +1,9 @@ Manifest-Version: 1.0 -Ant-Version: Apache Ant 1.8.4 -Created-By: 1.6.0_31-b05 (Sun Microsystems Inc.) +Ant-Version: Apache Ant 1.9.7 +Created-By: 1.8.0_181-b13 (Oracle Corporation) Signature-Title: FrameAverager Signature-Vendor: Marine Biological Laboratory (Rudolf Oldenbourg) Application-Plugin: Micro-Manager -Built-By: Amitabh -Built-Date: 04-06-2016 +Built-By: N2-LiveCell +Built-Date: 08-02-2018 diff --git a/FrameAverager.1.4.22/nbproject/private/private.properties b/FrameAverager.1.4.22/nbproject/private/private.properties index 77040f4..7d25205 100644 --- a/FrameAverager.1.4.22/nbproject/private/private.properties +++ b/FrameAverager.1.4.22/nbproject/private/private.properties @@ -3,5 +3,5 @@ do.depend=false do.jar=true javac.debug=true javadoc.preview=true -user.properties.file=C:\\Users\\Amitabh\\AppData\\Roaming\\NetBeans\\7.3\\build.properties -work.dir=C:\\Micro-Manager-1.4.22 +user.properties.file=C:\\Users\\N2-LiveCell\\AppData\\Roaming\\NetBeans\\8.2\\build.properties +work.dir=C:\\Program Files\\Micro-Manager-2.0beta diff --git a/FrameAverager.1.4.22/nbproject/private/private.xml b/FrameAverager.1.4.22/nbproject/private/private.xml index 4750962..0eaf56a 100644 --- a/FrameAverager.1.4.22/nbproject/private/private.xml +++ b/FrameAverager.1.4.22/nbproject/private/private.xml @@ -1,4 +1,13 @@ + + + file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java + file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java + file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAverager.java + file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java + file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java + + diff --git a/FrameAverager.1.4.22/nbproject/project.properties b/FrameAverager.1.4.22/nbproject/project.properties index df9d46e..94dd850 100644 --- a/FrameAverager.1.4.22/nbproject/project.properties +++ b/FrameAverager.1.4.22/nbproject/project.properties @@ -27,38 +27,47 @@ dist.jar=${dist.dir}/FrameAverager.jar dist.javadoc.dir=${dist.dir}/javadoc endorsed.classpath= excludes= -file.reference.AbsoluteLayout.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\AbsoluteLayout.jar -file.reference.bsh-2.0b4.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\bsh-2.0b4.jar -file.reference.clojure.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\clojure.jar -file.reference.clooj.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\clooj.jar -file.reference.commons-math-2.0.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\commons-math-2.0.jar -file.reference.commons-math3-3.4.1.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\commons-math3-3.4.1.jar -file.reference.core.cache.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\core.cache.jar -file.reference.core.memoize.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\core.memoize.jar -file.reference.data.json.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\data.json.jar -file.reference.gproto.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\gproto.jar -file.reference.gson-2.2.4.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\gson-2.2.4.jar -file.reference.guava-17.0.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\guava-17.0.jar -file.reference.iconloader.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\iconloader.jar -file.reference.ij.jar=C:\\Micro-Manager-1.4.22\\ij.jar +file.reference.Big.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\Big.jar +file.reference.bsh-2.0b6.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\bsh-2.0b6.jar +file.reference.clojure-1.3.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\clojure-1.3.0.jar +file.reference.commons-math-2.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\commons-math-2.2.jar +file.reference.commons-math3-3.4.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\commons-math3-3.4.1.jar +file.reference.core.cache-0.6.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\core.cache-0.6.2.jar +file.reference.core.memoize-0.5.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\core.memoize-0.5.2.jar +file.reference.data.json-0.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\data.json-0.1.1.jar +file.reference.eventbus-1.4.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\eventbus-1.4.jar +file.reference.formats-api-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\formats-api-5.1.1.jar +file.reference.formats-common-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\formats-common-5.1.1.jar +file.reference.gentyref-1.1.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\gentyref-1.1.0.jar +file.reference.gson-2.2.4.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\gson-2.2.4.jar +file.reference.guava-17.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\guava-17.0.jar +file.reference.iconloader-GIT.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\iconloader-GIT.jar +file.reference.ij.jar=C:\\Program Files\\Micro-Manager-2.0beta\\ij.jar file.reference.ImageFlipper-src=../../Projs/MMJ_/src/plugins/ImageFlipper/src -file.reference.jcommon-1.0.16.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\jcommon-1.0.16.jar -file.reference.jfreechart-1.0.13.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\jfreechart-1.0.13.jar -file.reference.loci-common.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\loci-common.jar -file.reference.lwm.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\lwm.jar -file.reference.miglayout-4.0-swing.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\miglayout-4.0-swing.jar -file.reference.MMAcqEngine.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\MMAcqEngine.jar -file.reference.MMCoreJ.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\MMCoreJ.jar -file.reference.MMJ_.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\MMJ_.jar -file.reference.ome-xml.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\ome-xml.jar -file.reference.rsyntaxtextarea.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\rsyntaxtextarea.jar -file.reference.scifio.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\scifio.jar -file.reference.slf4j-api-1.7.1.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\slf4j-api-1.7.1.jar -file.reference.substance.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\substance.jar -file.reference.swing-layout-1.0.4.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\swing-layout-1.0.4.jar -file.reference.swingx-0.9.5.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\swingx-0.9.5.jar -file.reference.trident.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\trident.jar -file.reference.TSFProto.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\TSFProto.jar +file.reference.jcommon-1.0.23.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\jcommon-1.0.23.jar +file.reference.jfreechart-1.0.19.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\jfreechart-1.0.19.jar +file.reference.joda-time-2.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\joda-time-2.2.jar +file.reference.kryo-2.24.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\kryo-2.24.0.jar +file.reference.logback-classic-1.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\logback-classic-1.1.1.jar +file.reference.logback-core-1.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\logback-core-1.1.1.jar +file.reference.miglayout-core-4.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\miglayout-core-4.2.jar +file.reference.miglayout-swing-4.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\miglayout-swing-4.2.jar +file.reference.minlog-1.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\minlog-1.2.jar +file.reference.MMAcqEngine.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMAcqEngine.jar +file.reference.MMCoreJ.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMCoreJ.jar +file.reference.MMJ_.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMJ_.jar +file.reference.objenesis-2.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\objenesis-2.1.jar +file.reference.ome-xml-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\ome-xml-5.1.1.jar +file.reference.Projector.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\Projector.jar +file.reference.protobuf-java-2.5.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\protobuf-java-2.5.0.jar +file.reference.rsyntaxtextarea-2.5.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\rsyntaxtextarea-2.5.2.jar +file.reference.scijava-common-2.46.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\scijava-common-2.46.0.jar +file.reference.serializer-2.7.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\serializer-2.7.1.jar +file.reference.slf4j-api-1.7.6.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\slf4j-api-1.7.6.jar +file.reference.swingx-0.9.5.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\swingx-0.9.5.jar +file.reference.TSFProto-SVN.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\TSFProto-SVN.jar +file.reference.xalan-2.7.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\xalan-2.7.1.jar +file.reference.xml-apis-1.3.04.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\xml-apis-1.3.04.jar includes=** jar.archive.disabled=${jnlp.enabled} jar.compress=true @@ -66,39 +75,49 @@ jar.index=${jnlp.enabled} javac.classpath=\ ${libs.swing-layout.classpath}:\ ${file.reference.ij.jar}:\ + ${file.reference.Big.jar}:\ ${file.reference.MMAcqEngine.jar}:\ ${file.reference.MMCoreJ.jar}:\ ${file.reference.MMJ_.jar}:\ - ${file.reference.AbsoluteLayout.jar}:\ - ${file.reference.bsh-2.0b4.jar}:\ - ${file.reference.clojure.jar}:\ - ${file.reference.clooj.jar}:\ - ${file.reference.commons-math-2.0.jar}:\ + ${file.reference.Projector.jar}:\ + ${file.reference.TSFProto-SVN.jar}:\ + ${file.reference.bsh-2.0b6.jar}:\ + ${file.reference.clojure-1.3.0.jar}:\ + ${file.reference.commons-math-2.2.jar}:\ ${file.reference.commons-math3-3.4.1.jar}:\ - ${file.reference.core.cache.jar}:\ - ${file.reference.core.memoize.jar}:\ - ${file.reference.data.json.jar}:\ - ${file.reference.gproto.jar}:\ + ${file.reference.core.cache-0.6.2.jar}:\ + ${file.reference.core.memoize-0.5.2.jar}:\ + ${file.reference.data.json-0.1.1.jar}:\ + ${file.reference.eventbus-1.4.jar}:\ + ${file.reference.formats-api-5.1.1.jar}:\ + ${file.reference.formats-common-5.1.1.jar}:\ + ${file.reference.gentyref-1.1.0.jar}:\ ${file.reference.gson-2.2.4.jar}:\ ${file.reference.guava-17.0.jar}:\ - ${file.reference.iconloader.jar}:\ - ${file.reference.jcommon-1.0.16.jar}:\ - ${file.reference.jfreechart-1.0.13.jar}:\ - ${file.reference.loci-common.jar}:\ - ${file.reference.lwm.jar}:\ - ${file.reference.miglayout-4.0-swing.jar}:\ - ${file.reference.ome-xml.jar}:\ - ${file.reference.rsyntaxtextarea.jar}:\ - ${file.reference.scifio.jar}:\ - ${file.reference.slf4j-api-1.7.1.jar}:\ - ${file.reference.substance.jar}:\ - ${file.reference.swing-layout-1.0.4.jar}:\ + ${file.reference.iconloader-GIT.jar}:\ + ${file.reference.jcommon-1.0.23.jar}:\ + ${file.reference.jfreechart-1.0.19.jar}:\ + ${file.reference.joda-time-2.2.jar}:\ + ${file.reference.kryo-2.24.0.jar}:\ + ${file.reference.logback-classic-1.1.1.jar}:\ + ${file.reference.logback-core-1.1.1.jar}:\ + ${file.reference.miglayout-core-4.2.jar}:\ + ${file.reference.miglayout-swing-4.2.jar}:\ + ${file.reference.minlog-1.2.jar}:\ + ${file.reference.objenesis-2.1.jar}:\ + ${file.reference.ome-xml-5.1.1.jar}:\ + ${file.reference.protobuf-java-2.5.0.jar}:\ + ${file.reference.rsyntaxtextarea-2.5.2.jar}:\ + ${file.reference.scijava-common-2.46.0.jar}:\ + ${file.reference.serializer-2.7.1.jar}:\ + ${file.reference.slf4j-api-1.7.6.jar}:\ ${file.reference.swingx-0.9.5.jar}:\ - ${file.reference.trident.jar}:\ - ${file.reference.TSFProto.jar} + ${file.reference.xalan-2.7.1.jar}:\ + ${file.reference.xml-apis-1.3.04.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false +javac.external.vm=false javac.processorpath=\ ${javac.classpath} javac.source=1.6 diff --git a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java index e43300d..304be5a 100644 --- a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java +++ b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java @@ -33,8 +33,8 @@ */ import mmcorej.CMMCore; -import org.micromanager.acquisition.AcquisitionWrapperEngine; -import org.micromanager.utils.ReportingUtils; +import org.micromanager.acquisition.internal.AcquisitionWrapperEngine; +import org.micromanager.internal.utils.ReportingUtils; public class FrameAveragerRunnable implements Runnable { diff --git a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java index 58dae25..fe9dc31 100644 --- a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java +++ b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java @@ -34,42 +34,41 @@ import javax.swing.JFrame; import mmcorej.CMMCore; -import org.micromanager.MMStudio; -import org.micromanager.acquisition.AcquisitionWrapperEngine; -import org.micromanager.api.MMPlugin; -import org.micromanager.api.ScriptInterface; +import org.micromanager.internal.MMStudio; +import org.micromanager.acquisition.internal.AcquisitionWrapperEngine; +import org.micromanager.MMPlugin; -public class TaggedFrameAverager implements MMPlugin, org.micromanager.api.MMProcessorPlugin { +public class TaggedFrameAverager implements MMPlugin, org.micromanager.data.ProcessorPlugin { public static final String menuName = "Frame Averager"; public static final String tooltipDescription = "Multiple-Frame Averaging"; // public JFrame frame; public FrameAverager fa; - public ScriptInterface gui; + public MMStudio gui; public static Class getProcessorClass() { return FrameAveragerProcessor.class; } @Override - public void setApp(ScriptInterface si) { - gui = si; + public void setApp(MMStudio s) { + gui = s; if (fa==null) { - fa = new FrameAverager(getAcquisitionWrapperEngine(), gui.getMMCore(), this); + fa = new FrameAverager(getAcquisitionWrapperEngine(), gui.core(), this); } } public AcquisitionWrapperEngine getAcquisitionWrapperEngine() { - AcquisitionWrapperEngine engineWrapper = (AcquisitionWrapperEngine) MMStudio.getInstance().getAcquisitionEngine(); + AcquisitionWrapperEngine engineWrapper = (AcquisitionWrapperEngine) gui.getAcquisitionEngine(); return engineWrapper; } public CMMCore getCMMCore() { - return gui.getMMCore(); + return gui.core(); } - public ScriptInterface getScriptInterface() { + public MMStudio getStudio() { return gui; } @@ -81,7 +80,6 @@ public void dispose() { public void show() { if (frame == null) { frame = fa.getControlFrame(); - gui.addMMBackgroundListener(frame); frame.setLocation(fa.controlFrame_.FrameXpos, fa.controlFrame_.FrameYpos); } frame.setVisible(true); From f11cb375bb68190d276016fa6351c403df8acb6d Mon Sep 17 00:00:00 2001 From: Nick Anthony Date: Mon, 6 Aug 2018 11:25:17 -0500 Subject: [PATCH 02/36] minor --- .../edu/mbl/cdp/frameaverage/TaggedFrameAverager.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java index fe9dc31..d62a964 100644 --- a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java +++ b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java @@ -36,13 +36,16 @@ import mmcorej.CMMCore; import org.micromanager.internal.MMStudio; import org.micromanager.acquisition.internal.AcquisitionWrapperEngine; -import org.micromanager.MMPlugin; - -public class TaggedFrameAverager implements MMPlugin, org.micromanager.data.ProcessorPlugin { +import org.micromanager.data.ProcessorPlugin; +import org.scijava.plugin.SciJavaPlugin; + +public class TaggedFrameAverager implements ProcessorPlugin, SciJavaPlugin { public static final String menuName = "Frame Averager"; public static final String tooltipDescription = "Multiple-Frame Averaging"; - // + public static String versionNumber = "1.0"; + public static String copyright = "Nick Anthony"; + public JFrame frame; public FrameAverager fa; public MMStudio gui; From 6166392875621426368778715ecfafca977809d7 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 14:05:24 -0500 Subject: [PATCH 03/36] Revert "minor" This reverts commit f11cb375bb68190d276016fa6351c403df8acb6d. --- .../edu/mbl/cdp/frameaverage/TaggedFrameAverager.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java index d62a964..fe9dc31 100644 --- a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java +++ b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java @@ -36,16 +36,13 @@ import mmcorej.CMMCore; import org.micromanager.internal.MMStudio; import org.micromanager.acquisition.internal.AcquisitionWrapperEngine; -import org.micromanager.data.ProcessorPlugin; -import org.scijava.plugin.SciJavaPlugin; - -public class TaggedFrameAverager implements ProcessorPlugin, SciJavaPlugin { +import org.micromanager.MMPlugin; + +public class TaggedFrameAverager implements MMPlugin, org.micromanager.data.ProcessorPlugin { public static final String menuName = "Frame Averager"; public static final String tooltipDescription = "Multiple-Frame Averaging"; - public static String versionNumber = "1.0"; - public static String copyright = "Nick Anthony"; - + // public JFrame frame; public FrameAverager fa; public MMStudio gui; From 9101926aa2dd1f77cd9045c529845182c8738eb6 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 14:05:36 -0500 Subject: [PATCH 04/36] Revert "started fixing some imports for version micromanager 2.0" This reverts commit c1373c669ed55d8cc55fd7faff2dedbec9e12173. --- FrameAverager.1.4.22/MANIFEST.MF | 8 +- .../nbproject/private/private.properties | 4 +- .../nbproject/private/private.xml | 9 -- .../nbproject/project.properties | 127 ++++++++---------- .../frameaverage/FrameAveragerRunnable.java | 4 +- .../cdp/frameaverage/TaggedFrameAverager.java | 24 ++-- 6 files changed, 75 insertions(+), 101 deletions(-) diff --git a/FrameAverager.1.4.22/MANIFEST.MF b/FrameAverager.1.4.22/MANIFEST.MF index a0ce95f..fa6f6d2 100644 --- a/FrameAverager.1.4.22/MANIFEST.MF +++ b/FrameAverager.1.4.22/MANIFEST.MF @@ -1,9 +1,9 @@ Manifest-Version: 1.0 -Ant-Version: Apache Ant 1.9.7 -Created-By: 1.8.0_181-b13 (Oracle Corporation) +Ant-Version: Apache Ant 1.8.4 +Created-By: 1.6.0_31-b05 (Sun Microsystems Inc.) Signature-Title: FrameAverager Signature-Vendor: Marine Biological Laboratory (Rudolf Oldenbourg) Application-Plugin: Micro-Manager -Built-By: N2-LiveCell -Built-Date: 08-02-2018 +Built-By: Amitabh +Built-Date: 04-06-2016 diff --git a/FrameAverager.1.4.22/nbproject/private/private.properties b/FrameAverager.1.4.22/nbproject/private/private.properties index 7d25205..77040f4 100644 --- a/FrameAverager.1.4.22/nbproject/private/private.properties +++ b/FrameAverager.1.4.22/nbproject/private/private.properties @@ -3,5 +3,5 @@ do.depend=false do.jar=true javac.debug=true javadoc.preview=true -user.properties.file=C:\\Users\\N2-LiveCell\\AppData\\Roaming\\NetBeans\\8.2\\build.properties -work.dir=C:\\Program Files\\Micro-Manager-2.0beta +user.properties.file=C:\\Users\\Amitabh\\AppData\\Roaming\\NetBeans\\7.3\\build.properties +work.dir=C:\\Micro-Manager-1.4.22 diff --git a/FrameAverager.1.4.22/nbproject/private/private.xml b/FrameAverager.1.4.22/nbproject/private/private.xml index 0eaf56a..4750962 100644 --- a/FrameAverager.1.4.22/nbproject/private/private.xml +++ b/FrameAverager.1.4.22/nbproject/private/private.xml @@ -1,13 +1,4 @@ - - - file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java - file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java - file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAverager.java - file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java - file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java - - diff --git a/FrameAverager.1.4.22/nbproject/project.properties b/FrameAverager.1.4.22/nbproject/project.properties index 94dd850..df9d46e 100644 --- a/FrameAverager.1.4.22/nbproject/project.properties +++ b/FrameAverager.1.4.22/nbproject/project.properties @@ -27,47 +27,38 @@ dist.jar=${dist.dir}/FrameAverager.jar dist.javadoc.dir=${dist.dir}/javadoc endorsed.classpath= excludes= -file.reference.Big.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\Big.jar -file.reference.bsh-2.0b6.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\bsh-2.0b6.jar -file.reference.clojure-1.3.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\clojure-1.3.0.jar -file.reference.commons-math-2.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\commons-math-2.2.jar -file.reference.commons-math3-3.4.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\commons-math3-3.4.1.jar -file.reference.core.cache-0.6.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\core.cache-0.6.2.jar -file.reference.core.memoize-0.5.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\core.memoize-0.5.2.jar -file.reference.data.json-0.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\data.json-0.1.1.jar -file.reference.eventbus-1.4.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\eventbus-1.4.jar -file.reference.formats-api-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\formats-api-5.1.1.jar -file.reference.formats-common-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\formats-common-5.1.1.jar -file.reference.gentyref-1.1.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\gentyref-1.1.0.jar -file.reference.gson-2.2.4.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\gson-2.2.4.jar -file.reference.guava-17.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\guava-17.0.jar -file.reference.iconloader-GIT.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\iconloader-GIT.jar -file.reference.ij.jar=C:\\Program Files\\Micro-Manager-2.0beta\\ij.jar +file.reference.AbsoluteLayout.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\AbsoluteLayout.jar +file.reference.bsh-2.0b4.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\bsh-2.0b4.jar +file.reference.clojure.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\clojure.jar +file.reference.clooj.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\clooj.jar +file.reference.commons-math-2.0.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\commons-math-2.0.jar +file.reference.commons-math3-3.4.1.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\commons-math3-3.4.1.jar +file.reference.core.cache.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\core.cache.jar +file.reference.core.memoize.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\core.memoize.jar +file.reference.data.json.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\data.json.jar +file.reference.gproto.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\gproto.jar +file.reference.gson-2.2.4.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\gson-2.2.4.jar +file.reference.guava-17.0.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\guava-17.0.jar +file.reference.iconloader.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\iconloader.jar +file.reference.ij.jar=C:\\Micro-Manager-1.4.22\\ij.jar file.reference.ImageFlipper-src=../../Projs/MMJ_/src/plugins/ImageFlipper/src -file.reference.jcommon-1.0.23.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\jcommon-1.0.23.jar -file.reference.jfreechart-1.0.19.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\jfreechart-1.0.19.jar -file.reference.joda-time-2.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\joda-time-2.2.jar -file.reference.kryo-2.24.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\kryo-2.24.0.jar -file.reference.logback-classic-1.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\logback-classic-1.1.1.jar -file.reference.logback-core-1.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\logback-core-1.1.1.jar -file.reference.miglayout-core-4.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\miglayout-core-4.2.jar -file.reference.miglayout-swing-4.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\miglayout-swing-4.2.jar -file.reference.minlog-1.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\minlog-1.2.jar -file.reference.MMAcqEngine.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMAcqEngine.jar -file.reference.MMCoreJ.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMCoreJ.jar -file.reference.MMJ_.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMJ_.jar -file.reference.objenesis-2.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\objenesis-2.1.jar -file.reference.ome-xml-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\ome-xml-5.1.1.jar -file.reference.Projector.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\Projector.jar -file.reference.protobuf-java-2.5.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\protobuf-java-2.5.0.jar -file.reference.rsyntaxtextarea-2.5.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\rsyntaxtextarea-2.5.2.jar -file.reference.scijava-common-2.46.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\scijava-common-2.46.0.jar -file.reference.serializer-2.7.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\serializer-2.7.1.jar -file.reference.slf4j-api-1.7.6.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\slf4j-api-1.7.6.jar -file.reference.swingx-0.9.5.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\swingx-0.9.5.jar -file.reference.TSFProto-SVN.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\TSFProto-SVN.jar -file.reference.xalan-2.7.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\xalan-2.7.1.jar -file.reference.xml-apis-1.3.04.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\xml-apis-1.3.04.jar +file.reference.jcommon-1.0.16.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\jcommon-1.0.16.jar +file.reference.jfreechart-1.0.13.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\jfreechart-1.0.13.jar +file.reference.loci-common.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\loci-common.jar +file.reference.lwm.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\lwm.jar +file.reference.miglayout-4.0-swing.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\miglayout-4.0-swing.jar +file.reference.MMAcqEngine.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\MMAcqEngine.jar +file.reference.MMCoreJ.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\MMCoreJ.jar +file.reference.MMJ_.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\MMJ_.jar +file.reference.ome-xml.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\ome-xml.jar +file.reference.rsyntaxtextarea.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\rsyntaxtextarea.jar +file.reference.scifio.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\scifio.jar +file.reference.slf4j-api-1.7.1.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\slf4j-api-1.7.1.jar +file.reference.substance.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\substance.jar +file.reference.swing-layout-1.0.4.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\swing-layout-1.0.4.jar +file.reference.swingx-0.9.5.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\swingx-0.9.5.jar +file.reference.trident.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\trident.jar +file.reference.TSFProto.jar=C:\\Micro-Manager-1.4.22\\plugins\\Micro-Manager\\TSFProto.jar includes=** jar.archive.disabled=${jnlp.enabled} jar.compress=true @@ -75,49 +66,39 @@ jar.index=${jnlp.enabled} javac.classpath=\ ${libs.swing-layout.classpath}:\ ${file.reference.ij.jar}:\ - ${file.reference.Big.jar}:\ ${file.reference.MMAcqEngine.jar}:\ ${file.reference.MMCoreJ.jar}:\ ${file.reference.MMJ_.jar}:\ - ${file.reference.Projector.jar}:\ - ${file.reference.TSFProto-SVN.jar}:\ - ${file.reference.bsh-2.0b6.jar}:\ - ${file.reference.clojure-1.3.0.jar}:\ - ${file.reference.commons-math-2.2.jar}:\ + ${file.reference.AbsoluteLayout.jar}:\ + ${file.reference.bsh-2.0b4.jar}:\ + ${file.reference.clojure.jar}:\ + ${file.reference.clooj.jar}:\ + ${file.reference.commons-math-2.0.jar}:\ ${file.reference.commons-math3-3.4.1.jar}:\ - ${file.reference.core.cache-0.6.2.jar}:\ - ${file.reference.core.memoize-0.5.2.jar}:\ - ${file.reference.data.json-0.1.1.jar}:\ - ${file.reference.eventbus-1.4.jar}:\ - ${file.reference.formats-api-5.1.1.jar}:\ - ${file.reference.formats-common-5.1.1.jar}:\ - ${file.reference.gentyref-1.1.0.jar}:\ + ${file.reference.core.cache.jar}:\ + ${file.reference.core.memoize.jar}:\ + ${file.reference.data.json.jar}:\ + ${file.reference.gproto.jar}:\ ${file.reference.gson-2.2.4.jar}:\ ${file.reference.guava-17.0.jar}:\ - ${file.reference.iconloader-GIT.jar}:\ - ${file.reference.jcommon-1.0.23.jar}:\ - ${file.reference.jfreechart-1.0.19.jar}:\ - ${file.reference.joda-time-2.2.jar}:\ - ${file.reference.kryo-2.24.0.jar}:\ - ${file.reference.logback-classic-1.1.1.jar}:\ - ${file.reference.logback-core-1.1.1.jar}:\ - ${file.reference.miglayout-core-4.2.jar}:\ - ${file.reference.miglayout-swing-4.2.jar}:\ - ${file.reference.minlog-1.2.jar}:\ - ${file.reference.objenesis-2.1.jar}:\ - ${file.reference.ome-xml-5.1.1.jar}:\ - ${file.reference.protobuf-java-2.5.0.jar}:\ - ${file.reference.rsyntaxtextarea-2.5.2.jar}:\ - ${file.reference.scijava-common-2.46.0.jar}:\ - ${file.reference.serializer-2.7.1.jar}:\ - ${file.reference.slf4j-api-1.7.6.jar}:\ + ${file.reference.iconloader.jar}:\ + ${file.reference.jcommon-1.0.16.jar}:\ + ${file.reference.jfreechart-1.0.13.jar}:\ + ${file.reference.loci-common.jar}:\ + ${file.reference.lwm.jar}:\ + ${file.reference.miglayout-4.0-swing.jar}:\ + ${file.reference.ome-xml.jar}:\ + ${file.reference.rsyntaxtextarea.jar}:\ + ${file.reference.scifio.jar}:\ + ${file.reference.slf4j-api-1.7.1.jar}:\ + ${file.reference.substance.jar}:\ + ${file.reference.swing-layout-1.0.4.jar}:\ ${file.reference.swingx-0.9.5.jar}:\ - ${file.reference.xalan-2.7.1.jar}:\ - ${file.reference.xml-apis-1.3.04.jar} + ${file.reference.trident.jar}:\ + ${file.reference.TSFProto.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false -javac.external.vm=false javac.processorpath=\ ${javac.classpath} javac.source=1.6 diff --git a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java index 304be5a..e43300d 100644 --- a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java +++ b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java @@ -33,8 +33,8 @@ */ import mmcorej.CMMCore; -import org.micromanager.acquisition.internal.AcquisitionWrapperEngine; -import org.micromanager.internal.utils.ReportingUtils; +import org.micromanager.acquisition.AcquisitionWrapperEngine; +import org.micromanager.utils.ReportingUtils; public class FrameAveragerRunnable implements Runnable { diff --git a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java index fe9dc31..58dae25 100644 --- a/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java +++ b/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java @@ -34,41 +34,42 @@ import javax.swing.JFrame; import mmcorej.CMMCore; -import org.micromanager.internal.MMStudio; -import org.micromanager.acquisition.internal.AcquisitionWrapperEngine; -import org.micromanager.MMPlugin; +import org.micromanager.MMStudio; +import org.micromanager.acquisition.AcquisitionWrapperEngine; +import org.micromanager.api.MMPlugin; +import org.micromanager.api.ScriptInterface; -public class TaggedFrameAverager implements MMPlugin, org.micromanager.data.ProcessorPlugin { +public class TaggedFrameAverager implements MMPlugin, org.micromanager.api.MMProcessorPlugin { public static final String menuName = "Frame Averager"; public static final String tooltipDescription = "Multiple-Frame Averaging"; // public JFrame frame; public FrameAverager fa; - public MMStudio gui; + public ScriptInterface gui; public static Class getProcessorClass() { return FrameAveragerProcessor.class; } @Override - public void setApp(MMStudio s) { - gui = s; + public void setApp(ScriptInterface si) { + gui = si; if (fa==null) { - fa = new FrameAverager(getAcquisitionWrapperEngine(), gui.core(), this); + fa = new FrameAverager(getAcquisitionWrapperEngine(), gui.getMMCore(), this); } } public AcquisitionWrapperEngine getAcquisitionWrapperEngine() { - AcquisitionWrapperEngine engineWrapper = (AcquisitionWrapperEngine) gui.getAcquisitionEngine(); + AcquisitionWrapperEngine engineWrapper = (AcquisitionWrapperEngine) MMStudio.getInstance().getAcquisitionEngine(); return engineWrapper; } public CMMCore getCMMCore() { - return gui.core(); + return gui.getMMCore(); } - public MMStudio getStudio() { + public ScriptInterface getScriptInterface() { return gui; } @@ -80,6 +81,7 @@ public void dispose() { public void show() { if (frame == null) { frame = fa.getControlFrame(); + gui.addMMBackgroundListener(frame); frame.setLocation(fa.controlFrame_.FrameXpos, fa.controlFrame_.FrameYpos); } frame.setVisible(true); From 7dffa61f6e2138be39c293428b81e76661dcbb0a Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 14:06:02 -0500 Subject: [PATCH 05/36] revert changes to the 1.4.22 folder and start a 2.0 folder --- FrameAverager.2.0/MANIFEST.MF | 9 + FrameAverager.2.0/build.xml | 101 ++ .../edu/mbl/cdp/frameaverage/About$1.class | Bin 0 -> 1014 bytes .../edu/mbl/cdp/frameaverage/About$2.class | Bin 0 -> 1014 bytes .../edu/mbl/cdp/frameaverage/About.class | Bin 0 -> 10868 bytes .../mbl/cdp/frameaverage/FrameAverager.class | Bin 0 -> 8072 bytes .../FrameAveragerControls$1.class | Bin 0 -> 1015 bytes .../FrameAveragerControls$10.class | Bin 0 -> 1943 bytes .../FrameAveragerControls$2.class | Bin 0 -> 1006 bytes .../FrameAveragerControls$3.class | Bin 0 -> 925 bytes .../FrameAveragerControls$4.class | Bin 0 -> 890 bytes .../FrameAveragerControls$5.class | Bin 0 -> 925 bytes .../FrameAveragerControls$6.class | Bin 0 -> 925 bytes .../FrameAveragerControls$7.class | Bin 0 -> 890 bytes .../FrameAveragerControls$8.class | Bin 0 -> 925 bytes .../FrameAveragerControls$9.class | Bin 0 -> 1379 bytes .../frameaverage/FrameAveragerControls.class | Bin 0 -> 18177 bytes .../FrameAveragerProcessor$1.class | Bin 0 -> 1818 bytes .../frameaverage/FrameAveragerProcessor.class | Bin 0 -> 10633 bytes .../frameaverage/FrameAveragerRunnable.class | Bin 0 -> 3274 bytes .../frameaverage/TaggedFrameAverager.class | Bin 0 -> 3019 bytes .../edu/mbl/cdp/frameaverage/frameIcon.png | Bin 0 -> 497 bytes FrameAverager.2.0/dist/FrameAverager.jar | Bin 0 -> 36671 bytes FrameAverager.2.0/doc/ReadMe.txt | 7 + FrameAverager.2.0/nbproject/build-impl.xml | 1380 +++++++++++++++++ .../nbproject/genfiles.properties | 8 + .../nbproject/private/config.properties | 0 .../nbproject/private/private.properties | 7 + .../nbproject/private/private.xml | 13 + .../nbproject/project.properties | 167 ++ FrameAverager.2.0/nbproject/project.xml | 14 + .../src/edu/mbl/cdp/frameaverage/About.form | 138 ++ .../src/edu/mbl/cdp/frameaverage/About.java | 286 ++++ .../mbl/cdp/frameaverage/FrameAverager.java | 280 ++++ .../frameaverage/FrameAveragerControls.form | 175 +++ .../frameaverage/FrameAveragerControls.java | 594 +++++++ .../frameaverage/FrameAveragerProcessor.java | 444 ++++++ .../frameaverage/FrameAveragerRunnable.java | 123 ++ .../cdp/frameaverage/TaggedFrameAverager.java | 114 ++ .../edu/mbl/cdp/frameaverage/frameIcon.png | Bin 0 -> 497 bytes 40 files changed, 3860 insertions(+) create mode 100644 FrameAverager.2.0/MANIFEST.MF create mode 100644 FrameAverager.2.0/build.xml create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/About$1.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/About$2.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/About.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAverager.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$1.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$10.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$2.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$3.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$4.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$5.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$6.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$7.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$8.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$9.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerProcessor$1.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/TaggedFrameAverager.class create mode 100644 FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/frameIcon.png create mode 100644 FrameAverager.2.0/dist/FrameAverager.jar create mode 100644 FrameAverager.2.0/doc/ReadMe.txt create mode 100644 FrameAverager.2.0/nbproject/build-impl.xml create mode 100644 FrameAverager.2.0/nbproject/genfiles.properties create mode 100644 FrameAverager.2.0/nbproject/private/config.properties create mode 100644 FrameAverager.2.0/nbproject/private/private.properties create mode 100644 FrameAverager.2.0/nbproject/private/private.xml create mode 100644 FrameAverager.2.0/nbproject/project.properties create mode 100644 FrameAverager.2.0/nbproject/project.xml create mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.form create mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.java create mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java create mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.form create mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java create mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java create mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java create mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java create mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/frameIcon.png diff --git a/FrameAverager.2.0/MANIFEST.MF b/FrameAverager.2.0/MANIFEST.MF new file mode 100644 index 0000000..a0ce95f --- /dev/null +++ b/FrameAverager.2.0/MANIFEST.MF @@ -0,0 +1,9 @@ +Manifest-Version: 1.0 +Ant-Version: Apache Ant 1.9.7 +Created-By: 1.8.0_181-b13 (Oracle Corporation) +Signature-Title: FrameAverager +Signature-Vendor: Marine Biological Laboratory (Rudolf Oldenbourg) +Application-Plugin: Micro-Manager +Built-By: N2-LiveCell +Built-Date: 08-02-2018 + diff --git a/FrameAverager.2.0/build.xml b/FrameAverager.2.0/build.xml new file mode 100644 index 0000000..6eb861a --- /dev/null +++ b/FrameAverager.2.0/build.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + Builds, tests, and runs the project FrameAverager + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/About$1.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/About$1.class new file mode 100644 index 0000000000000000000000000000000000000000..c39c57b4ca3f9a980386a9640384db2df8eabef3 GIT binary patch literal 1014 zcmaiz+iuf95QhIvOiZ?>Ed|P&RXQUIc+a z@D4~I5EncE4~3YuQh_S!*z$O0Jo@Ie{`LFEPXIf(S4Rz-94>BhTt~x-TUKnj*mlum zsF@>`HG2$=u?%xRo)6n+Q`&0mx>gl*UDInKTYy9 zkdKsYh!+#OZ&OmgBOOFZru5;yG)GD3;K?e&T4;OdSkXnBW?w$~W}iy^ zUq6FTOsP8Rw;aH*Y&SPd;%TC31T@uZ%Z`DIAdngDzeguvZ{b!;#`Q0)Z)wNqon8+O zI)yGBNVd9ahd`P`566<-Hfaw~p_@FN?pLtRH&i~8RlzxuHHrb=V40*>=o~9pBa7hz zF3t&qIicS90@nSG>R$ja&~GX6y8^Oa*!4LCRL&)=6NcgPsW|5(?mgi?EWlkk6?f(& h?jzwomEx+nN-bA#4IA`!=oh|$^Q3XAyGC!i{s2Fn)S&C!ib(CA0=|KsXBJs;E*F1qmtTrl|KDdug}$5ZUX%10fIy zE|5SVE_eVQ3NdS?0#($pQ>tDZr`~=X${W@yc;IMIv;|3bW+%{&@#+D72 zp{9>i=5`qxBN^mgG!8vKn0PNz5lJzXsW_Bgf1KochiV_ISm|Act>(Pq)&YYxNCL^Q zG*YpAmPccmJ{RMVGOMG+7vX_Om5FCb%QV6O2IpxU%XAQmER&SkoU@kOqt=`#$ul_! zmH$!(3>(eSv6u=^ywaYW%2<1Q=KIjNJEpg)oN9*klByHtFxE0P%!Oi!;cKN$#P^dt z_2m;~2I7T656qG@?=bemBvbL>p43N4VB?O1ySV4zJn9a(@tSBkXdBZ(i?lD7-tAGV z|C^^DhzWH^^Oge`7R}BLl4z2|Bmt>fZ5kQ4@O_zO?!zvffZe&fS|ZoKv~5E>K|ktt z(V$ak(}85m%SHt9EP6N=%x;snjSAhAX?MPYwZEbAnW73VkgZV-@CJ)yox!YV}! z7jbDu=+6lC_7||ucU1oZc!7RP3%@HMYeih2K|t+X#u{N5uAGUpPUGGa?!z41)iZJD iPUAij?o%nQifc4-1=q1oZ;O86n^+-_Q{Odu)Aa|JE!7nO literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/About.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/About.class new file mode 100644 index 0000000000000000000000000000000000000000..6140715de8b750b8f72c690382bc200e039e07e0 GIT binary patch literal 10868 zcmb_i349!9b$?HiwbFWQ%W~|*IVX;tShB3O9p~~DuU0E-lU+&KUCCAm38USSH1Y0^ zn4PukaOC0+M}Qm!HNQ!Ss z@oky-<4*b$`i>Oem9amS;?F|#LI-^>On**)A^q=nqWD3WuA#q_;)hcFC`3OF(^>)i zSM=91@{=(Al>TNZ{Vn}0L_ZJH-_b9^^!M}+QoI(7%W1Kf<(`{xeMfMgJ|u|8&x?=%p}SM86I*F^9NCHas8V)-YX3&toIE zg?Ncjp*rm{5|W|=^mAtihoxQ`Vl7NjUM8L8QmhDZR|l^QQ=Gd2l2=J_RtK*JTwW96 zv%{3+bELBt!1>$`K2Pd3GID+gU(mr9cJM_Z*26Txm&oSz9lW7~FO}wHA>J6KoA{Ct z_Xx7yFx||X!raH3JGq}D(%mA()-Z45%fq~#uaM$O>0TwRt7Y~Y>F$tXXD9FC-O}14 z#kDfKS0G0_ctGlykUJ=?wH+J}@lc5OF=+#pnK5I=Oj@Obw=i`lZ#51Xk%Cd0iDX>I zD$VRQvpyb1KrxH1XJkNq%ma{wlSTh za2<}6=Yb}2of-x zCKNxMGv{209+S&5u8}*KGUgQjhyqXtkjCt}BWY`97Pwj=q&g!N*D6F}M!_uQ4F}uX zj+h1%$}pkUvWwOVY;IQlYELsw)+;aV+rbQCTwG$ap#d_@TU6 zKIqzWbsrE(4tislW~dQ6v46SPLCh}B*(I~&LWAuE;|LVB&{X$1c4aQ9rm+7UWr)7z zrR+-Cj1{chK{L;Ep-;9TG!Fr0M9s&gsqCuNJOt?HHI#P3s>R^POYi`JfA$He)#W*i28;XdOy-aBU4h*vRF~a(VrhEnArOY&@MQpMnErn}-3V4eR3~FsoSZpiiTj0>BlSyU)9B0ev_{9Jct(mZNpVbyr=+-t9@OXwDISpG zQ7Ilm!PoKiAx>(XqEBc%BE=|=X?z2xnfg!a!OBIWo;y2;qAmg(EM}QTPb6Q-Xt1{`a+)X zj-rRhL+ol?;X@kF^WhL5(fBrgjmEF#$q>Izia0J1)<7uVsqtNWx5jVayP;Xd zhIsN2w2j!1HD>K1%cvXg)g99{K%)SJX&y2GtR}IN?c$*C!<<#t3t&zF1aX0(WF9BC=gHnLymPLl11=&s+G#t^VOtBS6)7Ei- zV-&z0p{a;_nbZ&v_93WPhp=oK6Mzb>lxs#QWQz%v=ggeg5H?w2S&mpw$+M%f_+WoH zoE=VN^vvi`c7HS-*U=tJk4_{8#@89h2Oh|!U3 zIx#Sw9mT-9Xa+misfp;wq#i#omX2pK`e<5Dq{fm700Z=NbR?UIXZrNSNGv%%m>AjD zrvrdKGMd$siBuwsW!cd_h4jR2`sk3Jil<}4fD#=@Boo<5g>NX49T8kZKo-@8^|A5v*eIM<*cwb^V##PC6(8&ec3{-w6Y-I(o*9lNlPBR4@S2z$h=a=LKr-&3 z0-J-0bUc<7ej2S9L?g} zaKT)mA`aoXBVr&N%a0g!uacDu!UuvfJWU+b^M0d(F5Fm_mf?bhJbd02kGAASIfwWP zz(yH?7VR?PkVI^I8a|4^qtDs6*IFhH13$W$hh>=r1Gule8Z0y4C&-M_5e&^3CF?d7 z$-vSeZng#7)&bu;5(2ji>_}Jgc41l{#bu;~w~;ebTXxEb1sUwO?R;4uwhIXUsVERN z&ORTbQ{JIRaWWZGvpSxOMMJ+--{;`Xs}CEFW0f_22fvePyZ@BbxAt$ja!TJQ?*I^w zSDknEr7XN%H>ZpeUR4ejZSUWKwz9}V$GHU5~?AJ_O3{FoG<)cA4!j1-^M z_;dVujlaN8$i$N&eoEsiAJzC6e@RB3(fGJ5_%c1nw0joM!5xvv{QP|XLT(~+kaRhc zN{tmNGgj#qbyd5ic8l+aZZ!IoT+P42U&Yn@RFH}=Agdg~8}HOATX>UIDDk3d*3`?u zw7^mhynFzsWqJYV&Kc7kuq&lJ-ZN`9_B5V$!R&*&pEu_u@RUZ9fR8YB;sIZS5Zai) zKY0X(F*;$D#ij7*-*}^pt!>HtY9pTTrRFcqMD zV5di6FtZgPx|Rl!jD)<)d@!p5PjhdHkP`wPc{kuOQ)4^`)=Rp03%UR=hI_9&W|!54 zR(Mi;UKD(WcuzX_NWqNxsWwPeXo(iUu-x^SdOccd4;!^5RYAa7kcLsvSAxWhz{?N% zmql2rPizx}=0!+Ubg4&3fFDV4n57wa7737zJqf0hP#(av29%E($YD9g+-yBZ1eP{H z%}NhVG}KpQkVR4o-+-VJDM~Db2T3T6NIIyD%+{Rk$aym^T`{3qdp_Vfl`B3@^2H2SHaBUArP5y!86I=o$_?f7H$pw}GLHiUKmJH@fpR!tJOAI!s(<5cq zL<+FgbRaW7S7+IgF}&+xF^*{z0ZlNbaA-sHwah{D8rV4Q<0ZF%#Ns*7_Mka!R0?ja zfQ!T^-gxRjheu*6Yq{deOQ3q8MG}oEq|l0$V#c}+6MjCm`C+ZpCeAa46A+}D`R2s| zA@B6yN}|(yb9eg^sJ+4!EHTMp+p%uLOT{Pz+)C()R$RNRlFrJe;IiudEy8ZZHE&D- zTZ%n#JW##tt|THSa1RsHl)9OvdZtkAyyUbwGNmsgpI14#B%W+00v^-F0ZIbtzuE!? zTv*B4b|GucdC_M%)QErr5GuzJuyT=&%*ZWKva3NQG{%LNMhLHud!gG)Z6Yrjpv)Wd z1G1v&;$WBy9Qf-4D(DQfL&d4}O@U(3tss0=4kqiG5^V|vv!IqCy|SR6^k}R_ zoyCE94!YQyCTKvq+C!R=TM`a@$$H z-f*(LO~m6=Q9J$YHPhaJ_8O)tXYonJ-vkg;?_Lzd%irGtij-VJ{4C;xufpq2t}?Y^ z=gAQ)kQPWB{=WlT$Za>AtPx0jV%MD(K0K*i_!L$3%Vpco1tVvA_l@qw21Dt1GKwSzQ(u#PoEjK3AO>5Hfawc@@>Zteak<_%8W*j zCuu91+p2WAr-W`=U01?|5Es!D(B)_u<*A!yFl*8pnuaoF>uh#n#i!{rK)4J7`7C`7 zWUc|DpZ67TF?|7S5}fQ2HJZD7;bnVzyRWU%UW`U3SMqZ!`QD>6P^H+yfkBb>af(lN z54CkIKT7+mG%Q1~;)GJfbx;HvSHn84m-;v*CtHtFs!C!PV(p_+caJs9{{~qngH=kS z+F1j?v<`l!4}NEN#slBu5A<|ry@6f+z^?9bf8aPxh#L1-=>UN4_UCtZPkQsayKk)0 zD`e(4-6RWNiG|1M=E>eF-Ex#(m6RG9H#Tj0lBTMZLpxt3)9(qLEi3s`D{udGm8Q|V zy6dIZdS_EhOTFC_Xz!}hjG#nSrCC6$l2xT!gDAS%<$sk9VqFbP;Yli1sU$e7WOpr< z|K5tLLBmposA%gp980_Zusg$@JymIjtdvYS;6sf2=R0t zk@heR-~dVC_(OC1<@AgtesXnGeS$s6FYZ=|R30rV^Q{`n1jfPNlFzzYce zzrdo=U7YFx!IQb6( z;5zH%b=Jwl&kcNV4OR~=!s?H}>W>4k7Go8^UwGN9{sgT4GyrcgR`H{Vm&@wU!0OKf z;7(w*s{?lQRUh0AUvllen~qX@LksPgm$O|?eD64Jr)T{Wzn#7&8U>uMFAitPnZkK) zaX4*f3g>rn5&F*bo({@vtN@b#Pd hp}lK)JL(VPH;4n literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAverager.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAverager.class new file mode 100644 index 0000000000000000000000000000000000000000..56cd68c875ba0c28df21347840c35398d542e8ee GIT binary patch literal 8072 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 g$NodU>H{Osphh%Rx}0;bh<<9hnGFM~kv z21p#M6u6t?4OU%`TX* zjp8`X+o3=>pkxw^hFK6N1>-7IPCeo@fI?MNX?W0ts#bbd7ovMrP z9}3hXosht}L8|E4WHco6QVug7xiHYN%nqeVtv?^E+du^%;6G7{Oq9tyCmz|YxOcn9 zq5HE`C3+TRI;TWnqceCTr!tVUBA_X$B6wB)-?#Rj4c4J)A+Ww^n!xf2HC0Cf-U~f3 zF&(7#RBNZEamVhsu2ZNZ0RFC8f(QV;xafLnW3%2gZF|h;wj-W31sSu5n-I Pi+mj|w(Oagxaa3L3TpQ1 literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$10.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$10.class new file mode 100644 index 0000000000000000000000000000000000000000..f2c07f653c9029cb04e3d35dbb367814f61ba705 GIT binary patch literal 1943 zcmb7FZBrXn6n^d|un?9url7W3q!u-Vmj$WC7NpP=6bu1NMTsxh0&;FMFg3jpp+)eBhM5mca?m73|v(I_I_m97R{SCm|sP$q1*Yxs^Uan^_ zh}jI@#f=PZVor1OJ$NsJJ}l_XEfb49Sn9#;48JaBa0knpThZ#t@_sM3ADCD*v1Z~! zfy|-wMry9~f<1x3(gS%Yzpp~XiON!I6BYwM4g)VDO830$yYYg6%%8N? zcIu??83#HwHM%X3E(SG5b-v{Ks@yoJs_>qydX(f!fg`XEyNk6hTPn<3vDnFjnKKDh+Q%<}s zy+-1wuAJ==!QP5P=AOuc2g6CC{s)WEYX=1Sw_@o$T$lAEOm-5RV=HKcj#_bbE-sx} zs!45^say6PFNkP&UB&xB%|ywNKDMxp zPXxNyHw|UsQ|wr%Xi4^TOl*sy^d031q;^zf;WK=0;tLC3V#C6Hd}Tput_nwBy0e~R zF-}BT>OsWRW^`BR z5sG*hiwdTA=MVClc@e2>Ru2+D%2`S%$BB=G!T)6pQR_8w3*4tk2MS}y5QXt$7=?*r zqzXSH{X?QX%(a`^FeY$?yrp^Cc^z+%GDN)9#(Lbw+8t}6YrXIjL=)YQu*0p%o$(#Y z`h9+|T3ExlU)Gs*K#Cgr7n#gJ}(ib#sBA5CR7qoXN z40E02YX)N)UB(Qq8rLvpT*s_&1B=E@tQqsTYurM`ScEi|pp0S?MS)R|@r}!4lqkS% zJ08syc*5I-H^Vqj4NUMni}atEH8IIw&U}I#zp^PenDc4UG+)UXjF8Ll+W}Ib=WkoF B2ZjIu literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$2.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$2.class new file mode 100644 index 0000000000000000000000000000000000000000..cc86fb51ac9bb05fa04ad3603fab2de8e3e9270c GIT binary patch literal 1006 zcmb7@-EPw`6vzK=x|U>NbbJihUasJAfEn7fZP1p@rKX*0E`aJ8f*WahIW0 zp5`Wq7@|aE({Ma0!Ze$N$C{4?p9#%RL^!lc|F@zCN|ss`W}o&x$z@(XW!UT1-Tdf? zp*c{QV7QdzQXEdlBcWgMQ9+i=iAs5K#C2}jJ|g-n#8mEKD=)u|Zf zHl6iz>$ht?QuYTjEtJXS$qP}Qs;rHBKJFv%(Z&TIu9Y5O+s8v}(;?M6qadcB&&#Zz z@kuE(!)`qw!-_rfff`Sgq~cKdovtmA$J1086T}g<(qZj(SWwu%>3dOxEo$Z#^)>5s zY>7y6=yTywXDpNS7!7&>ueb9VtoH?tkEAu=)7YXlz#Cko(XV6=D_A9snhsayg#Mi1 z_CA5_e1-D|;8p0iHdGi1O literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$3.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$3.class new file mode 100644 index 0000000000000000000000000000000000000000..d50cd4f8cdfdc6854e106c7b3d11f304a1af3c42 GIT binary patch literal 925 zcmb7DZEMs(5PtS9ZA^^q`Bt^IwrZ5?6`G^hZx!J5GyOs^@)ZrS9{pCuJV z@q<6WA0^Jl1HY6)0@GM#mBrfI#p@DKev6mL;)ezhUlhz|>b|Qe|4b zCv&PzL8-u2H$Inh8OcvoL~~MAG^|~YtbAzswrO4oY+UCi;D69FlhAQy3t7Lib9*)q zQ#evduFFhK-%@p^Qx{JIJj3$Lvmf=C4m+GYPVqDkVoiVm~k(YP}mLWPF z+bG`e7XKc6w%%mvfOTu}d%NEtdf(BytbGDLIf~EExW#8s%RW|cn>AiK++83H7YJVO zE5z;(wEqM6HS{H?{ZfOh)w;I;u{7@CKEt%J#-J@cz(c+resk;Suw+R(eDn7g*CX(D literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$4.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$4.class new file mode 100644 index 0000000000000000000000000000000000000000..c93390e74ea0b978357476e6d15b74a78a1b1b1e GIT binary patch literal 890 zcmb7D(N5bi6g_UUmU!7HFxUngY>DB%MZQMogrbOC!!@G;~h?pJN7E6-MXwnD&0kR91Xu_|UGpd4I&<4Rk6Q zmg7vx)7fM!&37@*DY6>tMC2o3GUqRXo@d@1H45?4he=Ta5X&@G-g^Vl_7mvc(ndL)a1f73IQ$YJIVu=yZkhpq~p_e3SR zwwXHrDvJx9Hn9`n9o`3Mpc!DvS-aRHMXCuB_Nd2)4$@D>w2+43uo@u4bEoe>Po`QC z7sPeF?fBp#Nu;&m$1dHQ)5_XE!sGsknDFS5lFqG`BZRCP{Y&skc}`Z3d>7%JgIlo9 z9ctHQ&Qls2lmpx#pfME*cq literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$5.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$5.class new file mode 100644 index 0000000000000000000000000000000000000000..0b81d08c6998fab5b9ee853dec1903fe7b5e005c GIT binary patch literal 925 zcmb7D-)q!B5dQWqZA^^q`KxMeZPh5(D>O&7zEp(cXhDd!pxpajGQFlGyJeF*|1LpM zd?@qO=wX)>$NjgBQM0D<7GQe=j?EK6d`Zo}N+9#dbINtJ1J zOy)$Jf>MEvZhR(ZGLoOFh-Rd!Xi&QxSb5*_ZPTn0Si8zi!2h79CZWU37P5M2=XPu! zrf{H=T$h=eyrb$=r!F1`c!H+^TwDv_St-Obo=mgBgnI&=x|Ce1Npv(mql9^{Us_$9 zl@)O}1$LTc5m>UrAL`;@~ literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$6.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$6.class new file mode 100644 index 0000000000000000000000000000000000000000..4c66eb21ad15dc0c30f01f78e6a2d394af5e3119 GIT binary patch literal 925 zcmb7D-)q!B5dQWqZA^^q`KxMeZPh5(D>O%y`cM&$qXi+_f^zSB$@H3%?3PXL{JR82 z@xfQIf0Q^I4}2+w1hP9b%zX3BkG=Tw<0pV!Jon(>p^pWu`FMbJ7mr+QxY!g}tWL8s z>3Q7ewy78Hu$w+>xBASt^qCxF)VC8+ww@tH3VC^b50sn)ZnuHEBTgd9Ao!hZ_ zn8JZda$RO>@{X!gow|4&;0c}vaB(ewXQdF&crwif6YdFg>QZv4CehLOj1uO(era`a zR#wE_6xeB&MPSJef2fOdt++!xh<4X@$(Kn&Wf{Ke^HLo(UW}`{yEVclFY*HKz#>Ga zV;jZ$-QwSa&(`ZKy=2{5{NDCgh~77}KG!}0pB%;KFWlfWsAV5ZxXBtX9d6GN26F_j z_XT46JKFyN{2KZ?%_V)4!^lobXc+^9lrVd3jj9o A#{d8T literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$7.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$7.class new file mode 100644 index 0000000000000000000000000000000000000000..3a3d2915d34ba162ea1f6d4f40cf0da26bc73c49 GIT binary patch literal 890 zcmb7DT}vB56g`t{6L-3;sa0FGwO{)XBe=l|78D@_1BIJrT!!F&Kl^82)nQ|_ujd4?wxaH{#^gQ1h9+Hhlh2J2iV|vju%b5Y+{q4QJiNs z>@sv?nNFkeD36kK5}g_`mSQH2IFr%9IlWuQ^tCFC&g}v1JA95K9aSKYidWbpbr zl?;nghZ3F^inY?q+!^p2FUQ(>D$-i ziB`k~ab0gaKDbB{X>ItSOZVoaviA4zxHTjuJi4T$bF1YDA*)9J0(?@QleI^_i}23& zPq5AfYTwJ8hcq@Q2l$JC#-Ox09-&1Z!xJpc5qfh3zw-lZ`xol}0eA`hkIG$@AgiVC h&p|*)UiUKHLT(p%^p3dH7t_FY0aaVz8gL~<_Z7+ literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$8.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$8.class new file mode 100644 index 0000000000000000000000000000000000000000..8e0aa7a9324af70cbaf8edc798cccd63a9b3330b GIT binary patch literal 925 zcmb7DZEMs(5PtS9ZA^^q`Bt^IwrZ5?6`G^^p;8f!qXi+_f^y&YlIb-i*)5yg`MU%~ z@q<6WzaaWk#MyY@mr_U|yEDVgGta#2k3ZkO1K7n=4-W48SiqW(dsuhzz{Q4(O@YPg zG%LftKtHB*8WrO_O49S_#K?l=jEtO6bZC{qKgA5Ss*KLdeU5#ZsjPY>@T}W3cxxo! z40TEZ%Wm)luWcxU9QdBW&^_FYpd5 zLUcN|QM}(R{yq3?y~@&a)~&_wZGVR7eL?GE?Gy0HQGEWyH9mt{_OXQPtnt#}<{V)# zNAP-|Ahy4v{U5-up?`7O-!;fet$TA2OXC)9GfW#R4BEmS+~wQhH@AuoOO~X=H-CQt DAHMMk literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$9.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerControls$9.class new file mode 100644 index 0000000000000000000000000000000000000000..1cd87ccc22c45518be337beadcb03e935a1678f4 GIT binary patch literal 1379 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 literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerProcessor$1.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerProcessor$1.class new file mode 100644 index 0000000000000000000000000000000000000000..f3232931fbaafc181f55aae0d7a3c92ab444ebdd GIT binary patch literal 1818 zcmbtV?{eEj5dWQRtXfrxhDFbtsu8M*zxhE+k z!@vjl0I$%#1xzp<%hFm?c1;a?w^~G}B?FhNXJ03|&&A{T`I+w2EQ(;a8&j1Ev z(f5U{dpryUNiLr>oN|reWOgVIrAGr}$jaC!T2UdMX-C}pvc-F85PCa^r6n4!3iG+6 zb2Y8N608N^@`8}SwnVfU*cz@GxQ_D%&f+NpW4K{p9yblt6?qQ}8X5-P#|Ih~4J_e9 z15LCvEE`x+8mqWv;5OO@*6`86<<6A}vExQ`%|vflEd%Sgq2Xf#pWssi8@NLyKViko zHHP9r+156t;5LJKLN^Rr8WzJ?<j`^aO1_)aV1r@Q4I8cu zqlIoS+8v%mcPYiw$5(!hJC3jq6^M#Hb!_xU=+hffmptxkC-)bQb$=)jN^F#bx7ekQ zOA(FVX?D9-AjOtBh$T5Br@AAedaG5ZBZjk;$$hm{NGc;k%Y8k{SzFwTg>Q-5vG3FC zU^vIEd$B7;;y9#-Eu*0h^5Zizqz&2*%DSna|;tRn@cpNS+S^EnRXfak71lf)6=xOPJEWu)76W=fK{h{ zMdqhO=^3JVQUZE-mgsn5cpB&M0&!%37x5Cw7+rBbb@nH6iN%lAJ+MBq_pv?L>(~U+fMmDPW4fEK;e*fwhvvchjbqf&W4_h`zRgQmd^C?q+)-@$U_tr zk}MRGDs-ZfXh=zj>5KCfZeoWf*Vp(Q-@wPWM8Cri_&z~v3~;1qUnbi;GJj!dmi)a! YTn1&lN^6e3Sg+xE+UaC5N-O>T0ab_U-2eap literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..5c580e2bb78e92de6bddef0b928e070aca54bbee GIT binary patch literal 10633 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 Hgz5hP9AsR^ literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/TaggedFrameAverager.class b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/TaggedFrameAverager.class new file mode 100644 index 0000000000000000000000000000000000000000..9a8d78c72e91203bcfad1cb8860339f911a33bf8 GIT binary patch literal 3019 zcmbVOX>$`t5Pc)dtR$~FWOGAe65_}*cnvWS&R`2jL?lCy5l2X1y;{p_q+PKGh9tir zzb2^yCnQz*N>zSTDsNV&rB#&^eb|}l>DTkRr@Kdg|MSOR0M6p46b|7_1z#m`5PA8z zt>Ehv$HEwjSWaOScT%{EZ{+8mR47T=irl@Q;13Z+UM=3nUxAOBOf$tLdK7pqR zJX4@6SXE#ss0bwLrX4KnbyFZ+*wA0W@?dOJKU-xK*ug8Lm^;ZR)w2-mtV%cx>MGO?OQZ_)^qOaCM7ac>dm37yW>y|L?uUnqL+;Da)dbMg+`Z?~an*Lqa zF-*^M++0ofXk;QY(-Xx|NP5YVRkd|La7p37pvIN#HR*$A`iqT*z)WUmZc9&N9>X+V z@^#~RQE#*yI!a=T#*4u6EO|K(T)ojS-J5om;Sjh;0)t`gs%yibCnt3`bhpA@GvepIm_exB6 z>TWGy#<4Y=nVUbi$|@)>6;4f^ojX7?RKU+s~e`lI3FL(VP-+G*gkc7 z*nYcW+lsrl(-t@xi5$qpB=5bQz^|i9b|)n@koNzr3CR|4cz|xPSn`94#Y7zoQ&#qG zgV}gIs&?ASEVxN(_Y{A-VeAPL-1c3k7KWM2Ug?6Tq863;xIDdPlRtI8F&01iu-sG>(GfX!bXVUpa|khTmPGFpDhb zYEuETIK@>Gr!hw@36{spUwi_wUpVr8;kSuhplNAsp3*b?_t8Ag;ckrb>Fn%VjAY*+ z{vOA&e`54eb_=_>9(e~vfMgPH5tn>MLYryCIloA^FOkn>I&wAScA#mk#f^6H8TSMh zLZpyWwy4(OiyYVd0g4XrS_k+uV=93; z@*aDS^I3TfTTtI(OnM@v?=T*NoXD*=*!>23IIoZ1N~4Z5_*%~#c=Cilq9<) literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/frameIcon.png b/FrameAverager.2.0/build/classes/edu/mbl/cdp/frameaverage/frameIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..58fda9a4ea348713cd2b866f15c50e0eca4af533 GIT binary patch literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyq9v{oCC){ui6xo&c?uz!xv327 zci1IF)MTcIJW>WKU@!6Xbp;El%O7%2Tmcl~EbxddW?n+GNBr?+-PyBDa{r~<~kg;129e3v1aSP~zr=Bj3Ar-f#PP!@9WWeLHymNQN_ecBI z|Nq~-jVZ`W;H-0e)p;KyPPWG<&mH;ruP9ch@o?7OndjPi(_Y_u`R!MrNaAbe^D-IT z4bw#W7z_AB`%J}}?W-6%@=O`TMdTV;5B%AB@<5VE)CSfo;@nEh6?$Ik^sqVUXD7_!~^s&gQu&X%Q~loCIC2+>OTMg literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/dist/FrameAverager.jar b/FrameAverager.2.0/dist/FrameAverager.jar new file mode 100644 index 0000000000000000000000000000000000000000..4937f6ac0f0dacb5b8750ffdcd7c53875c26fb21 GIT binary patch literal 36671 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 literal 0 HcmV?d00001 diff --git a/FrameAverager.2.0/doc/ReadMe.txt b/FrameAverager.2.0/doc/ReadMe.txt new file mode 100644 index 0000000..abe1a87 --- /dev/null +++ b/FrameAverager.2.0/doc/ReadMe.txt @@ -0,0 +1,7 @@ +FrameAverager Plugin for MicroManager +by Amitabh Verma & Grant Harris +Marine Biological Laboratory, 2012 + + +Please refer to: +http://www.openpolscope.org/pages/MMPlugin_Frame_Averager.htm \ No newline at end of file diff --git a/FrameAverager.2.0/nbproject/build-impl.xml b/FrameAverager.2.0/nbproject/build-impl.xml new file mode 100644 index 0000000..6044456 --- /dev/null +++ b/FrameAverager.2.0/nbproject/build-impl.xml @@ -0,0 +1,1380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + + + + + + java -cp "${run.classpath.with.dist.jar}" ${main.class} + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FrameAverager.2.0/nbproject/genfiles.properties b/FrameAverager.2.0/nbproject/genfiles.properties new file mode 100644 index 0000000..e3b407e --- /dev/null +++ b/FrameAverager.2.0/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=5bada172 +build.xml.script.CRC32=bb72cc98 +build.xml.stylesheet.CRC32=28e38971@1.50.2.46 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=bc4483b9 +nbproject/build-impl.xml.script.CRC32=8c556dc1 +nbproject/build-impl.xml.stylesheet.CRC32=6ddba6b6@1.53.1.46 diff --git a/FrameAverager.2.0/nbproject/private/config.properties b/FrameAverager.2.0/nbproject/private/config.properties new file mode 100644 index 0000000..e69de29 diff --git a/FrameAverager.2.0/nbproject/private/private.properties b/FrameAverager.2.0/nbproject/private/private.properties new file mode 100644 index 0000000..7d25205 --- /dev/null +++ b/FrameAverager.2.0/nbproject/private/private.properties @@ -0,0 +1,7 @@ +compile.on.save=false +do.depend=false +do.jar=true +javac.debug=true +javadoc.preview=true +user.properties.file=C:\\Users\\N2-LiveCell\\AppData\\Roaming\\NetBeans\\8.2\\build.properties +work.dir=C:\\Program Files\\Micro-Manager-2.0beta diff --git a/FrameAverager.2.0/nbproject/private/private.xml b/FrameAverager.2.0/nbproject/private/private.xml new file mode 100644 index 0000000..0eaf56a --- /dev/null +++ b/FrameAverager.2.0/nbproject/private/private.xml @@ -0,0 +1,13 @@ + + + + + + file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java + file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java + file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAverager.java + file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java + file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java + + + diff --git a/FrameAverager.2.0/nbproject/project.properties b/FrameAverager.2.0/nbproject/project.properties new file mode 100644 index 0000000..94dd850 --- /dev/null +++ b/FrameAverager.2.0/nbproject/project.properties @@ -0,0 +1,167 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +application.title=FrameAverager +application.vendor=CDP-HPPAV +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/FrameAverager.jar +dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= +excludes= +file.reference.Big.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\Big.jar +file.reference.bsh-2.0b6.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\bsh-2.0b6.jar +file.reference.clojure-1.3.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\clojure-1.3.0.jar +file.reference.commons-math-2.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\commons-math-2.2.jar +file.reference.commons-math3-3.4.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\commons-math3-3.4.1.jar +file.reference.core.cache-0.6.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\core.cache-0.6.2.jar +file.reference.core.memoize-0.5.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\core.memoize-0.5.2.jar +file.reference.data.json-0.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\data.json-0.1.1.jar +file.reference.eventbus-1.4.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\eventbus-1.4.jar +file.reference.formats-api-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\formats-api-5.1.1.jar +file.reference.formats-common-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\formats-common-5.1.1.jar +file.reference.gentyref-1.1.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\gentyref-1.1.0.jar +file.reference.gson-2.2.4.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\gson-2.2.4.jar +file.reference.guava-17.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\guava-17.0.jar +file.reference.iconloader-GIT.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\iconloader-GIT.jar +file.reference.ij.jar=C:\\Program Files\\Micro-Manager-2.0beta\\ij.jar +file.reference.ImageFlipper-src=../../Projs/MMJ_/src/plugins/ImageFlipper/src +file.reference.jcommon-1.0.23.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\jcommon-1.0.23.jar +file.reference.jfreechart-1.0.19.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\jfreechart-1.0.19.jar +file.reference.joda-time-2.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\joda-time-2.2.jar +file.reference.kryo-2.24.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\kryo-2.24.0.jar +file.reference.logback-classic-1.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\logback-classic-1.1.1.jar +file.reference.logback-core-1.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\logback-core-1.1.1.jar +file.reference.miglayout-core-4.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\miglayout-core-4.2.jar +file.reference.miglayout-swing-4.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\miglayout-swing-4.2.jar +file.reference.minlog-1.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\minlog-1.2.jar +file.reference.MMAcqEngine.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMAcqEngine.jar +file.reference.MMCoreJ.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMCoreJ.jar +file.reference.MMJ_.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMJ_.jar +file.reference.objenesis-2.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\objenesis-2.1.jar +file.reference.ome-xml-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\ome-xml-5.1.1.jar +file.reference.Projector.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\Projector.jar +file.reference.protobuf-java-2.5.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\protobuf-java-2.5.0.jar +file.reference.rsyntaxtextarea-2.5.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\rsyntaxtextarea-2.5.2.jar +file.reference.scijava-common-2.46.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\scijava-common-2.46.0.jar +file.reference.serializer-2.7.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\serializer-2.7.1.jar +file.reference.slf4j-api-1.7.6.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\slf4j-api-1.7.6.jar +file.reference.swingx-0.9.5.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\swingx-0.9.5.jar +file.reference.TSFProto-SVN.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\TSFProto-SVN.jar +file.reference.xalan-2.7.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\xalan-2.7.1.jar +file.reference.xml-apis-1.3.04.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\xml-apis-1.3.04.jar +includes=** +jar.archive.disabled=${jnlp.enabled} +jar.compress=true +jar.index=${jnlp.enabled} +javac.classpath=\ + ${libs.swing-layout.classpath}:\ + ${file.reference.ij.jar}:\ + ${file.reference.Big.jar}:\ + ${file.reference.MMAcqEngine.jar}:\ + ${file.reference.MMCoreJ.jar}:\ + ${file.reference.MMJ_.jar}:\ + ${file.reference.Projector.jar}:\ + ${file.reference.TSFProto-SVN.jar}:\ + ${file.reference.bsh-2.0b6.jar}:\ + ${file.reference.clojure-1.3.0.jar}:\ + ${file.reference.commons-math-2.2.jar}:\ + ${file.reference.commons-math3-3.4.1.jar}:\ + ${file.reference.core.cache-0.6.2.jar}:\ + ${file.reference.core.memoize-0.5.2.jar}:\ + ${file.reference.data.json-0.1.1.jar}:\ + ${file.reference.eventbus-1.4.jar}:\ + ${file.reference.formats-api-5.1.1.jar}:\ + ${file.reference.formats-common-5.1.1.jar}:\ + ${file.reference.gentyref-1.1.0.jar}:\ + ${file.reference.gson-2.2.4.jar}:\ + ${file.reference.guava-17.0.jar}:\ + ${file.reference.iconloader-GIT.jar}:\ + ${file.reference.jcommon-1.0.23.jar}:\ + ${file.reference.jfreechart-1.0.19.jar}:\ + ${file.reference.joda-time-2.2.jar}:\ + ${file.reference.kryo-2.24.0.jar}:\ + ${file.reference.logback-classic-1.1.1.jar}:\ + ${file.reference.logback-core-1.1.1.jar}:\ + ${file.reference.miglayout-core-4.2.jar}:\ + ${file.reference.miglayout-swing-4.2.jar}:\ + ${file.reference.minlog-1.2.jar}:\ + ${file.reference.objenesis-2.1.jar}:\ + ${file.reference.ome-xml-5.1.1.jar}:\ + ${file.reference.protobuf-java-2.5.0.jar}:\ + ${file.reference.rsyntaxtextarea-2.5.2.jar}:\ + ${file.reference.scijava-common-2.46.0.jar}:\ + ${file.reference.serializer-2.7.1.jar}:\ + ${file.reference.slf4j-api-1.7.6.jar}:\ + ${file.reference.swingx-0.9.5.jar}:\ + ${file.reference.xalan-2.7.1.jar}:\ + ${file.reference.xml-apis-1.3.04.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.external.vm=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.6 +javac.target=1.6 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +jnlp.codebase.type=no.codebase +jnlp.descriptor=application +jnlp.enabled=false +jnlp.mixed.code=default +jnlp.offline-allowed=false +jnlp.signed=false +jnlp.signing= +jnlp.signing.alias= +jnlp.signing.keystore= +main.class=ij.ImageJ +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=true +no.dependencies=true +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.src.dir=src diff --git a/FrameAverager.2.0/nbproject/project.xml b/FrameAverager.2.0/nbproject/project.xml new file mode 100644 index 0000000..ae892c6 --- /dev/null +++ b/FrameAverager.2.0/nbproject/project.xml @@ -0,0 +1,14 @@ + + + org.netbeans.modules.java.j2seproject + + + FrameAverager + + + + + + + + diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.form b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.form new file mode 100644 index 0000000..bec803a --- /dev/null +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.form @@ -0,0 +1,138 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.java new file mode 100644 index 0000000..659d735 --- /dev/null +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.java @@ -0,0 +1,286 @@ +package edu.mbl.cdp.frameaverage; + +/* + * Copyright © 2009 – 2013, Marine Biological Laboratory + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of + * the authors and should not be interpreted as representing official policies, + * either expressed or implied, of any organization. + * + * Multiple-Frame Averaging plug-in for Micro-Manager + * @author Amitabh Verma (averma@mbl.edu), Grant Harris (gharris@mbl.edu) + * Marine Biological Laboratory, Woods Hole, Mass. + * + */ + +import com.swtdesigner.SwingResourceManager; +import java.awt.Cursor; +import java.awt.Image; +import java.awt.Rectangle; +import java.util.Calendar; +import javax.swing.JFrame; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.StyleConstants; +import org.micromanager.utils.ReportingUtils; + +public class About extends javax.swing.JFrame { + + public static final String BugPageLink_ = "http://www.openpolscope.org/mantis/"; + public static final String BugPageLinkLABEL_ = "
Web Page"; + + public static final String WebPageLink_ = "http://www.openpolscope.org/pages/MMPlugin_Frame_Averager.htm"; + public static final String WebPageLinkLABEL_ = "Web Page"; + + public About(JFrame frame) { + initComponents(); + setIcon(); + + setCopyRight(); + setLicenseText(); + Rectangle rec = frame.getBounds(); + this.setBounds(rec.x, rec.y, WIDTH, HEIGHT); + this.setVisible(true); + } + + private void setIcon() { +// URL url = this.getClass().getResource("frameIcon.png"); +// Image im = Toolkit.getDefaultToolkit().getImage(url); + Image im = SwingResourceManager.getImage(FrameAveragerControls.class, "frameIcon.png"); + setIconImage(im); + } + + private void setLicenseText() { + try { + String text = textPaneLicense.getText(); + textPaneLicense.setText(text); + textPaneLicense.setCaretPosition(0); + + SimpleAttributeSet sa = new SimpleAttributeSet(); + StyleConstants.setAlignment(sa, StyleConstants.ALIGN_JUSTIFIED); + textPaneLicense.getStyledDocument().setParagraphAttributes(0,text.length(),sa,false); + } + catch (Exception ex) {ReportingUtils.showError(ex);} + } + + private void setCopyRight() { + + Calendar cal = Calendar.getInstance(); + int year = cal.get(Calendar.YEAR); + String str = "Marine Biological Laboratory © 2009 - " + year; + labelFooter.setText(str); + } + + public void setDialogueName(String text) { + labelDialogueName.setText("About: FrameAverager"); + } + + public static void openHttpUrl(String url) { + try { + java.net.URI uri = new java.net.URI(url); + java.awt.Desktop desktop = java.awt.Desktop.getDesktop(); + desktop.browse(uri); + } catch (Exception e) { + System.err.println(e.getMessage()); + } + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + labelDialogueName = new javax.swing.JLabel(); + jScrollPane1 = new javax.swing.JScrollPane(); + textPaneLicense = new javax.swing.JTextPane(); + labelVersion = new javax.swing.JLabel(); + labelFooter = new javax.swing.JLabel(); + labelWebPage = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle("About"); + setMinimumSize(new java.awt.Dimension(450, 400)); + setPreferredSize(new java.awt.Dimension(450, 400)); + + labelDialogueName.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N + labelDialogueName.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + labelDialogueName.setText("FrameAverager"); + + jScrollPane1.setAutoscrolls(true); + jScrollPane1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); + + textPaneLicense.setEditable(false); + textPaneLicense.setText("Copyright © 2009 - 2013, Marine Biological Laboratory\n\nLICENSE (Berkeley Software Distribution License): Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n3. Neither the name of the Marine Biological Laboratory nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nThe views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of any organization.\n\nDeveloped at the Laboratory of Rudolf Oldenbourg at the Marine Biological Laboratory in Woods Hole, MA.\n\nSoftware Developers: Amitabh Verma & Grant Harris"); + textPaneLicense.setAutoscrolls(false); + jScrollPane1.setViewportView(textPaneLicense); + + labelVersion.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N + labelVersion.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + labelVersion.setText("Version 1.06b (Compatible with Micro-Manager 1.4.22)"); + + labelFooter.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + labelFooter.setText("Marine Biological Laboratory © 2009 - 2014"); + + labelWebPage.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + labelWebPage.setText("Web Page"); + labelWebPage.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + labelWebPageMouseClicked(evt); + } + public void mouseEntered(java.awt.event.MouseEvent evt) { + labelWebPageMouseEntered(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + labelWebPageMouseExited(evt); + } + }); + + jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel2.setText("Bugs and Feature Requests"); + jLabel2.setToolTipText("Email: feedback@openpolscope.org"); + jLabel2.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseClicked(java.awt.event.MouseEvent evt) { + jLabel2MouseClicked(evt); + } + public void mouseEntered(java.awt.event.MouseEvent evt) { + jLabel2MouseEntered(evt); + } + public void mouseExited(java.awt.event.MouseEvent evt) { + jLabel2MouseExited(evt); + } + }); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(labelVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 426, Short.MAX_VALUE) + .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) + .addComponent(labelDialogueName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(labelFooter, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(labelWebPage) + .addComponent(jLabel2)) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(6, 6, 6) + .addComponent(labelDialogueName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(labelVersion) + .addGap(11, 11, 11) + .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 267, Short.MAX_VALUE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(labelWebPage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(labelFooter) + .addContainerGap()) + ); + + pack(); + }// //GEN-END:initComponents + + private void labelWebPageMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_labelWebPageMouseClicked + openHttpUrl(WebPageLink_); + }//GEN-LAST:event_labelWebPageMouseClicked + + private void labelWebPageMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_labelWebPageMouseEntered + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + }//GEN-LAST:event_labelWebPageMouseEntered + + private void labelWebPageMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_labelWebPageMouseExited + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }//GEN-LAST:event_labelWebPageMouseExited + + private void jLabel2MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel2MouseClicked + openHttpUrl(BugPageLink_); + }//GEN-LAST:event_jLabel2MouseClicked + + private void jLabel2MouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel2MouseEntered + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + }//GEN-LAST:event_jLabel2MouseEntered + + private void jLabel2MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel2MouseExited + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + }//GEN-LAST:event_jLabel2MouseExited + + /** + * @param args the command line arguments + */ +// public static void main(String args[]) { +// /* +// * Set the Nimbus look and feel +// */ +// // +// /* +// * If Nimbus (introduced in Java SE 6) is not available, stay with the +// * default look and feel. For details see +// * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html +// */ +// try { +// for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { +// if ("Nimbus".equals(info.getName())) { +// javax.swing.UIManager.setLookAndFeel(info.getClassName()); +// break; +// } +// } +// } catch (ClassNotFoundException ex) { +// java.util.logging.Logger.getLogger(About.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); +// } catch (InstantiationException ex) { +// java.util.logging.Logger.getLogger(About.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); +// } catch (IllegalAccessException ex) { +// java.util.logging.Logger.getLogger(About.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); +// } catch (javax.swing.UnsupportedLookAndFeelException ex) { +// java.util.logging.Logger.getLogger(About.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); +// } +// // +// +// /* +// * Create and display the form +// */ +// java.awt.EventQueue.invokeLater(new Runnable() { +// +// public void run() { +// new About().setVisible(true); +// } +// }); +// } + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JLabel jLabel2; + private javax.swing.JScrollPane jScrollPane1; + private javax.swing.JLabel labelDialogueName; + private javax.swing.JLabel labelFooter; + private javax.swing.JLabel labelVersion; + private javax.swing.JLabel labelWebPage; + private javax.swing.JTextPane textPaneLicense; + // End of variables declaration//GEN-END:variables +} diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java new file mode 100644 index 0000000..304ebc9 --- /dev/null +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java @@ -0,0 +1,280 @@ +package edu.mbl.cdp.frameaverage; + +/* + * Copyright © 2009 – 2013, Marine Biological Laboratory + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of + * the authors and should not be interpreted as representing official policies, + * either expressed or implied, of any organization. + * + * Multiple-Frame Averaging plug-in for Micro-Manager + * @author Amitabh Verma (averma@mbl.edu), Grant Harris (gharris@mbl.edu) + * Marine Biological Laboratory, Woods Hole, Mass. + * + */ + +import ij.ImageStack; +import ij.gui.ImageWindow; +import java.util.prefs.Preferences; +import javax.swing.JFrame; +import mmcorej.CMMCore; +import mmcorej.TaggedImage; +import org.micromanager.MMOptions; +import org.micromanager.acquisition.AcquisitionWrapperEngine; +import org.micromanager.api.DataProcessor; +import org.micromanager.imagedisplay.AcquisitionVirtualStack; +import org.micromanager.imagedisplay.VirtualAcquisitionDisplay; +import org.micromanager.utils.GUIUtils; +import org.micromanager.utils.ImageFocusListener; +import org.micromanager.utils.ReportingUtils; + +public class FrameAverager implements ImageFocusListener { + + static final String METADATAKEY = "FramesAveraged"; + CMMCore core_; + TaggedFrameAverager tfa_; + AcquisitionWrapperEngine engineWrapper_; + + FrameAveragerProcessor processor; + public FrameAveragerControls controlFrame_; + + public boolean debugLogEnabled_ = false; + public boolean isEnabledForImageAcquisition = false; + + public int numberFrames = 4; // 4 frames by default + int[] avoidDisplayChs_ = null; + int[] avoidEngineChs_ = null; + // shared... + public TaggedImage[] taggedImageArray = null; + + public VirtualAcquisitionDisplay display_; + public VirtualAcquisitionDisplay displayLive_; + + boolean isAdditionalDelayReg = false; + static String CameraNameProperty = "CameraName"; + static String[] AdditionalDelayCams = {"Retiga 4000R"}; + + public FrameAverager(AcquisitionWrapperEngine engineWrapper, CMMCore core, TaggedFrameAverager tfa) { + + engineWrapper_ = engineWrapper; + core_ = core; + tfa_ = tfa; + + additionalDelayCheck(); + setNumberFrames(numberFrames); + getDebugOptions(); + + GUIUtils.registerImageFocusListener(this); // Image Window listener + } + + + final void additionalDelayCheck() { + try { + String cam = core_.getCameraDevice(); + String camName = core_.getProperty(cam, CameraNameProperty); + for (int i=0; i < AdditionalDelayCams.length; i++) { + if (camName.equals(AdditionalDelayCams[i])) { + isAdditionalDelayReg = true; + } else { + isAdditionalDelayReg = false; + } + } + } catch (Exception ex) { + isAdditionalDelayReg = false; + ReportingUtils.logError(ex); + } + } + + + public void UpdateEngineAndCore() { + if (tfa_ != null) { + engineWrapper_ = tfa_.getAcquisitionWrapperEngine(); + core_ = tfa_.getCMMCore(); + } + } + + public void getDebugOptions() { + Preferences root = Preferences.userNodeForPackage(MMOptions.class); + Preferences prefs = root.node(root.absolutePath() + "/" + "MMOptions"); + debugLogEnabled_ = prefs.getBoolean("DebugLog", debugLogEnabled_); + } + + public void attachRunnable() { + Runnable setPauseAndAcquire = new FrameAveragerRunnable(this); + // The runnable is attached to the channels for which there will be frame averaging. + // 'Engine channels' to avoid are not included. + if (avoidEngineChs_ == null || engineWrapper_.getChannels().size()==1) { + engineWrapper_.attachRunnable(-1, -1, -1, -1, setPauseAndAcquire); // t, p, s, c + } else if (engineWrapper_.getChannels().size() < avoidEngineChs_[avoidEngineChs_.length-1]) { + engineWrapper_.attachRunnable(-1, -1, -1, -1, setPauseAndAcquire); // t, p, s, c + } else { + for (int i = 0; i < engineWrapper_.getChannels().size(); i++) { + boolean bool = true; + for (int j = 0; j < avoidEngineChs_.length; j++) { + if (i == avoidEngineChs_[j]) { + bool = false; + } + } + if (bool) { + engineWrapper_.attachRunnable(-1, -1, -1, i, setPauseAndAcquire); + } + } + } + if (debugLogEnabled_) { + ReportingUtils.logMessage("FrameAvg: runnable attached"); + } + } + + public int getNumberFrames() { + return numberFrames; + } + + public void setNumberFrames(int numberFrames) { + this.numberFrames = numberFrames; + bufferArraySpace(); + } + + public void bufferArraySpace() { + taggedImageArray = new TaggedImage[numberFrames]; + } + + // Diplay channels include Engine channels and Virtual channels + public void setAvoidDisplayChannels(int[] channelsToAvoid) { + this.avoidDisplayChs_ = channelsToAvoid; + } + + // Specifies channels + public void setAvoidEngineChannels(int[] channelsToAvoid) { + this.avoidEngineChs_ = channelsToAvoid; + } + + public void enable(boolean enableAveraging) { + if (enableAveraging) { + startProcessor(); + attachRunnable(); + } else { + // Disable + stopAndClearProcessor(); + stopAndClearRunnable(); + } + } + + public void startProcessor() { + try { + attachDataProcessor(); + } catch (Exception ex) { + } + } + + public void attachDataProcessor() { + if (processor==null) { + processor = new FrameAveragerProcessor(); + processor.setName(TaggedFrameAverager.menuName); + processor.setTFA(tfa_); + processor.setApp(tfa_.gui); + } + engineWrapper_.addImageProcessor(processor); + } + + public void stopAndClearProcessor() { + if (processor != null) { + processor.requestStop(); + } + try { + engineWrapper_.removeImageProcessor(processor.getDataProcessor()); + + if (debugLogEnabled_) { + ReportingUtils.logMessage("FrameAvg: processor removed"); + } + } catch (Exception ex) { + } + } + + public void stopAndClearRunnable() { + try { + engineWrapper_.clearRunnables(); // Potentially dangerous - needs specific clearRunnable(X) + + if (debugLogEnabled_) { + ReportingUtils.logMessage("FrameAvg: runnable removed"); + } + } catch (Exception ex) { + } + } + + public void acquireImagesFromRunningSequence() { + processor.runAcquireFromRunningSequence(); + } + + public void acquireImagesStartSequence() { + processor.runAcquireStartSequence(); + } + + public DataProcessor getDataProcessor() { + return processor.getDataProcessor(); + } + + public JFrame getControlFrame() { + if (controlFrame_ == null) { + controlFrame_ = new FrameAveragerControls(this); + } + return controlFrame_; + } + + + @Override + public void focusReceived(ImageWindow focusedWindow) { + // discard if closed + if (focusedWindow == null) { + return; + } + // discard Snap/Live Window + if (focusedWindow != null) { + String str = focusedWindow.getTitle(); + if (focusedWindow.getTitle().startsWith("Snap/Live Window") || str.equals(" (100%)")) { + ImageStack ImpStack = focusedWindow.getImagePlus().getImageStack(); + if (ImpStack instanceof AcquisitionVirtualStack) { + displayLive_ = ((AcquisitionVirtualStack) ImpStack).getVirtualAcquisitionDisplay(); + } else { + displayLive_ = null; + } + return; + } + } + + if (!focusedWindow.isClosed()) { + ImageStack ImpStack = focusedWindow.getImagePlus().getImageStack(); + VirtualAcquisitionDisplay display; + if (ImpStack instanceof AcquisitionVirtualStack) { + display = ((AcquisitionVirtualStack) ImpStack).getVirtualAcquisitionDisplay(); + if (display.acquisitionIsRunning()) { + display_ = display; + display_.show(); + } + } else { + if (display_!=null && !display_.acquisitionIsRunning()) { + display_ = null; + } + } + } + } + +} diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.form b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.form new file mode 100644 index 0000000..aafdcf0 --- /dev/null +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.form @@ -0,0 +1,175 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java new file mode 100644 index 0000000..6e1f821 --- /dev/null +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java @@ -0,0 +1,594 @@ +package edu.mbl.cdp.frameaverage; + +/* + * Copyright © 2009 – 2013, Marine Biological Laboratory + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of + * the authors and should not be interpreted as representing official policies, + * either expressed or implied, of any organization. + * + * Multiple-Frame Averaging plug-in for Micro-Manager + * @author Amitabh Verma (averma@mbl.edu), Grant Harris (gharris@mbl.edu) + * Marine Biological Laboratory, Woods Hole, Mass. + * + */ + +import com.swtdesigner.SwingResourceManager; +import java.awt.Frame; +import java.awt.Image; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.Arrays; +import java.util.prefs.Preferences; +import javax.swing.JDialog; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import org.micromanager.internalinterfaces.AcqSettingsListener; + +public class FrameAveragerControls extends javax.swing.JFrame implements AcqSettingsListener { + + /* TODO + * 1. Attach Runnable channel specific if using channel avoidance + * Currently this is handled via DataProcessor which would skip for avoided channels + * + * + * + * + */ + static FrameAveragerControls frame; + private FrameAverager fa_; + private static JFrame About; + + private String lastChannelAvoidanceStr = ""; + + public static final Preferences FrameAveragerControlPrefs = Preferences.userNodeForPackage(FrameAveragerControls.class); + public final String FrameXposKey = "PREF_FrameX"; + public final String FrameYposKey = "PREF_FrameY"; + public final String NumberOfFramesKey = "PREF_NumberOfFramesKey"; + public int FrameXpos = 300; + public int FrameYpos = 300; + + Image iconImage; + + /** + * Creates new form FrameAveragerControls + */ + public FrameAveragerControls(FrameAverager fa) { + this.fa_ = fa; + initComponents(); + iconImage = SwingResourceManager.getImage(FrameAveragerControls.class, "frameIcon.png"); +// URL url = this.getClass().getResource("frameIcon.png"); +// iconImage = Toolkit.getDefaultToolkit().getImage(url); + setIconImage(iconImage); + getPreferences(); + fa.setNumberFrames(fa.numberFrames); + numFramesField.setText(String.valueOf(fa.numberFrames)); + setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE ); + this.setLocation(FrameXpos, FrameYpos); + lastChannelAvoidanceStr = channelsToAvoid.getText(); + + updateStatus(); + this.pack(); + frame = this; + } + + @Override + public void settingsChanged() { + update(); + } + + public void update() { + if (this.enabledCheckBox_.isSelected()) { + fa_.UpdateEngineAndCore(); + } + + fa_.enable(this.enabledCheckBox_.isSelected()); + if (!this.enabledCheckBox_.isSelected()) { + updateLabel(""); + } else { + // ToDo: Add disable avoid virtual channels input box + updateStatus(); + } + + fa_.isEnabledForImageAcquisition = this.enabledCheckBox_.isSelected(); + } + + private void getPreferences() { + FrameXpos = FrameAveragerControlPrefs.getInt(FrameXposKey, FrameXpos); + FrameYpos = FrameAveragerControlPrefs.getInt(FrameYposKey, FrameYpos); + fa_.numberFrames = FrameAveragerControlPrefs.getInt(NumberOfFramesKey, fa_.numberFrames); + } + + private void setPreferences() { + + FrameXpos = this.getX(); + FrameYpos = this.getY(); + + FrameAveragerControlPrefs.putInt(FrameXposKey, FrameXpos); + FrameAveragerControlPrefs.putInt(FrameYposKey, FrameYpos); + FrameAveragerControlPrefs.putInt(NumberOfFramesKey, fa_.numberFrames); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + numFramesField = new javax.swing.JTextField(); + jLabel1 = new javax.swing.JLabel(); + enabledCheckBox_ = new javax.swing.JCheckBox(); + jLabel2 = new javax.swing.JLabel(); + channelsToAvoid = new javax.swing.JTextField(); + labelStatus = new javax.swing.JLabel(); + jLabel4 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + jMenuBar1 = new javax.swing.JMenuBar(); + jMenu1 = new javax.swing.JMenu(); + jMenuItem1 = new javax.swing.JMenuItem(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle("Frame Averager"); + setBounds(new java.awt.Rectangle(300, 300, 150, 150)); + setMinimumSize(new java.awt.Dimension(150, 150)); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosed(java.awt.event.WindowEvent evt) { + formWindowClosed(evt); + } + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + }); + addFocusListener(new java.awt.event.FocusAdapter() { + public void focusGained(java.awt.event.FocusEvent evt) { + formFocusGained(evt); + } + public void focusLost(java.awt.event.FocusEvent evt) { + formFocusLost(evt); + } + }); + + numFramesField.setHorizontalAlignment(javax.swing.JTextField.CENTER); + numFramesField.setText("4"); + numFramesField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + numFramesFieldActionPerformed(evt); + } + }); + numFramesField.addFocusListener(new java.awt.event.FocusAdapter() { + public void focusLost(java.awt.event.FocusEvent evt) { + numFramesFieldFocusLost(evt); + } + }); + + jLabel1.setText("Number of Image Frames to average"); + + enabledCheckBox_.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N + enabledCheckBox_.setText("Enable for Multi-D Image Acquisition"); + enabledCheckBox_.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + enabledCheckBox_ActionPerformed(evt); + } + }); + + jLabel2.setText("Avoid Channel(s) (zero-based)"); + + channelsToAvoid.setHorizontalAlignment(javax.swing.JTextField.CENTER); + channelsToAvoid.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + channelsToAvoidActionPerformed(evt); + } + }); + channelsToAvoid.addFocusListener(new java.awt.event.FocusAdapter() { + public void focusLost(java.awt.event.FocusEvent evt) { + channelsToAvoidFocusLost(evt); + } + }); + + jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel4.setText("eg. 1,2 or 1-5"); + + jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N + jLabel3.setText("Multi-Frame Averaging"); + + jMenu1.setText("Help"); + + jMenuItem1.setText("About"); + jMenuItem1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jMenuItem1ActionPerformed(evt); + } + }); + jMenu1.add(jMenuItem1); + + jMenuBar1.add(jMenu1); + + setJMenuBar(jMenuBar1); + + org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .addContainerGap() + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(jLabel2) + .add(jLabel1)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(org.jdesktop.layout.GroupLayout.TRAILING, channelsToAvoid, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 99, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .add(org.jdesktop.layout.GroupLayout.TRAILING, numFramesField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 99, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) + .add(labelStatus, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(layout.createSequentialGroup() + .add(jLabel3) + .add(0, 0, Short.MAX_VALUE)) + .add(layout.createSequentialGroup() + .add(enabledCheckBox_) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .add(jLabel4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 99, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(layout.createSequentialGroup() + .addContainerGap() + .add(jLabel3) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) + .add(jLabel1) + .add(numFramesField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(jLabel2) + .add(channelsToAvoid, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) + .add(jLabel4) + .add(enabledCheckBox_)) + .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) + .add(labelStatus, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 21, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) + .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + pack(); + }// //GEN-END:initComponents + + private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed + + }//GEN-LAST:event_formWindowClosed + + private void enabledCheckBox_ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_enabledCheckBox_ActionPerformed + if (!showingMsg) { + if (fa_.core_.isSequenceRunning()) { + enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); + FrameAveragerControls.showMessage("Live mode is running ! Please stop before enabling/disabling."); + return; + } else if (fa_.tfa_.gui.isAcquisitionRunning()) { + enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); + FrameAveragerControls.showMessage("Acquisition is running ! Please stop before enabling/disabling."); + return; + } + update(); + } else { + enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); + } + }//GEN-LAST:event_enabledCheckBox_ActionPerformed + + private void numFramesFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_numFramesFieldActionPerformed + updateNumFramesField(); + }//GEN-LAST:event_numFramesFieldActionPerformed + private void channelsToAvoidActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_channelsToAvoidActionPerformed + channelAvoidance(); + }//GEN-LAST:event_channelsToAvoidActionPerformed + + private void channelsToAvoidFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_channelsToAvoidFocusLost + channelAvoidance(); + }//GEN-LAST:event_channelsToAvoidFocusLost + + private void numFramesFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_numFramesFieldFocusLost + updateNumFramesField(); + }//GEN-LAST:event_numFramesFieldFocusLost + + private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed + if (About == null) { + About = new About(this); + } + About.setVisible(true); + }//GEN-LAST:event_jMenuItem1ActionPerformed + + private void formFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_formFocusGained + fa_.getDebugOptions(); + }//GEN-LAST:event_formFocusGained + + private void formFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_formFocusLost + fa_.getDebugOptions(); + }//GEN-LAST:event_formFocusLost + + private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + if (fa_.core_.isSequenceRunning()) { + if (enabledCheckBox_.isSelected()) { + setVisible( true ); + FrameAveragerControls.showMessage("Live mode is running with FrameAverager ! Please stop Live before closing FrameAverager."); + } + } else if (fa_.tfa_.gui.isAcquisitionRunning()) { + if (enabledCheckBox_.isSelected()) { + setVisible( true ); + FrameAveragerControls.showMessage("Acquisition is running with FrameAverager ! Please stop Acquisition before closing FrameAverager."); + } + } else { + if (enabledCheckBox_.isSelected()) { + enabledCheckBox_.setSelected(false); + update(); + } + setVisible( true ); + setPreferences(); + showNonBlockingYesNo(iconImage); + } + }//GEN-LAST:event_formWindowClosing + + private void updateNumFramesField() { + int num; + if (!showingMsg) { + if (!numFramesField.getText().isEmpty()) { + String str = numFramesField.getText().trim().toString(); + try { + num = (int) Integer.parseInt(str); + } catch(NumberFormatException e) { + System.out.println("CAUGHT: " + e.toString()); + System.out.println("Defaulting value to 4"); + num = 4; + } + fa_.setNumberFrames(num); + updateStatus(); + } else { + FrameAveragerControls.showMessage("Number of Image Frames to average has to be an Integer"); + } + } else { + numFramesField.setText(String.valueOf(fa_.numberFrames)); + } + } + + private void channelAvoidance() { + if (!showingMsg) { + if (!lastChannelAvoidanceStr.equals(channelsToAvoid.getText())) { + if (fa_.core_.isSequenceRunning()) { + channelsToAvoid.setText(lastChannelAvoidanceStr); + FrameAveragerControls.showMessage("Live mode is running ! Please stop before changing this field."); + } else if (fa_.tfa_.gui.isAcquisitionRunning()) { + channelsToAvoid.setText(lastChannelAvoidanceStr); + FrameAveragerControls.showMessage("Acquisition is running ! Please stop before changing this field."); + } else { + updateChannelsToAvoid(); + fa_.stopAndClearRunnable(); + fa_.attachRunnable(); + + lastChannelAvoidanceStr = channelsToAvoid.getText(); + } + } + } else { + channelsToAvoid.setText(lastChannelAvoidanceStr); + } + } + + private void updateChannelsToAvoid() { + String str = channelsToAvoid.getText().trim().toString(); + int[] avoidChannels = stringToIntArray(str); + fa_.setAvoidDisplayChannels(avoidChannels); + fa_.setAvoidEngineChannels(avoidChannels); + updateStatus(); + } + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JTextField channelsToAvoid; + private javax.swing.JCheckBox enabledCheckBox_; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel jLabel4; + private javax.swing.JMenu jMenu1; + private javax.swing.JMenuBar jMenuBar1; + private javax.swing.JMenuItem jMenuItem1; + private javax.swing.JLabel labelStatus; + private javax.swing.JTextField numFramesField; + // End of variables declaration//GEN-END:variables + + public void updateStatus() { + try { + String avgString; + String avoidString = ""; + + if (fa_.numberFrames < 2) { + avgString = "Averaging is Disabled."; + avoidString = ""; + } else { + avgString = "Averaging " + fa_.numberFrames + " frames per image "; + if (fa_.avoidEngineChs_ == null) { + avoidString = "for All Channels."; + } else { + String str = channelsToAvoid.getText().trim().toString(); + if (str.contains(",") || str.contains(";")) { + avoidString = "Except " + fa_.avoidEngineChs_.length + " Channels, " + str + "."; + } else if (str.contains("-") || str.contains("=")) { + avoidString = "Except " + fa_.avoidEngineChs_.length + " Channels, " + + fa_.avoidEngineChs_[0] + " to " + + fa_.avoidEngineChs_[fa_.avoidEngineChs_.length - 1] + " (inclusive)."; + } else if (fa_.avoidEngineChs_.length == 1) { + avoidString = "Except " + fa_.avoidEngineChs_.length + " Channel, No. " + str + "."; + } + } + } + updateLabel(avgString + avoidString); + } catch (Exception ex) { + } + } + + public int[] stringToIntArray(String str) { + int[] intArray = parseString(str); + return intArray; + } + + public String intArrayToString(int[] intArray) { + if (intArray.length < 1) { + return null; + } + String str = Arrays.toString(intArray); + return str; + } + + public void updateLabel(String str) { + labelStatus.setText(str); + } + + public int[] parseString(String str) { + int[] intArray = null; + if (str.contains("-")) { + intArray = getHyphenStringToIntArray(str, "-"); + } else if (str.contains("=")) { + intArray = getHyphenStringToIntArray(str, "="); + } else if (str.contains(",")) { + intArray = getCommaStringToIntArray(str, ","); + } else if (str.contains(";")) { + intArray = getCommaStringToIntArray(str, ";"); + } else if (str.isEmpty() || str.trim().isEmpty()) { + intArray = null; + } else { + intArray = new int[1]; + intArray[0] = Integer.parseInt(str); + } + return intArray; + } + + public int[] getCommaStringToIntArray(String str, String regStr) { + String[] strArray = str.split(regStr); + int[] intArray = new int[strArray.length]; + for (int i = 0; i < strArray.length; i++) { + intArray[i] = Integer.parseInt(strArray[i]); + } + return intArray; + } + + public int[] getHyphenStringToIntArray(String str, String regStr) { + String[] strArray = str.split(regStr); + int[] intArrayTemp = new int[strArray.length]; + for (int i = 0; i < strArray.length; i++) { + intArrayTemp[i] = Integer.parseInt(strArray[i].trim()); + } + int n1 = intArrayTemp[0]; + int n2 = intArrayTemp[1]; + int[] intArray = new int[n2 - n1 + 1]; + for (int i = n1; i < n2 + 1; i++) { + intArray[i - n1] = i; + } + return intArray; + } + + public static void showMessage(String msg) { + showNonBlockingMessage(JOptionPane.WARNING_MESSAGE, TaggedFrameAverager.menuName, msg, getInstance()); + } + + public static void showMessage(String title, String msg) { + showNonBlockingMessage(JOptionPane.WARNING_MESSAGE, title, msg, getInstance()); + } + + static boolean showingMsg = false; + public static void showNonBlockingMessage(int msgType, String title, String message, Frame owningFrame_) { + if (null != owningFrame_) { + Object[] options = { "OK" }; + final JOptionPane optionPane = new JOptionPane(message, msgType, JOptionPane.DEFAULT_OPTION, null, options); + /* the false parameter is for not modal */ + final JDialog dialog = new JDialog(owningFrame_, title, false); + optionPane.addPropertyChangeListener( + new PropertyChangeListener() { + + public void propertyChange(PropertyChangeEvent e) { + String prop = e.getPropertyName(); + if (dialog.isVisible() && (e.getSource() == optionPane) && (prop.equals(JOptionPane.VALUE_PROPERTY))) { + dialog.setVisible(false); + showingMsg = false; + } + } + }); + + dialog.setContentPane(optionPane); + /* adapting the frame size to its content */ + dialog.pack(); + dialog.setLocationRelativeTo(owningFrame_); + dialog.setVisible(true); + showingMsg = true; + } + } + + public static void showNonBlockingYesNo(Image iconImage) { + showNonBlockingYesNo(JOptionPane.QUESTION_MESSAGE, TaggedFrameAverager.menuName, "Remove from Micro-Manager's Image Pipeline ?", getInstance(), iconImage); + } + + public static void showNonBlockingYesNo(int msgType, String title, String message, final FrameAveragerControls owningFrame_, Image iconImage) { + if (null != owningFrame_) { + Object[] options = { "Yes", "No", "Cancel" }; + final JOptionPane optionPane = new JOptionPane(message, msgType, JOptionPane.YES_NO_CANCEL_OPTION, null, options); + /* the false parameter is for not modal */ + final JDialog dialog = new JDialog((JDialog)null, title, false); + dialog.setIconImage(iconImage); + + optionPane.addPropertyChangeListener( + new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent e) { + String prop = e.getPropertyName(); + + if (dialog.isVisible() && (e.getSource() == optionPane) && (prop.equals(JOptionPane.VALUE_PROPERTY))) { + String selectValue = (String) e.getNewValue(); + + if ((selectValue.equals("Cancel"))) { + + } else { + if ((selectValue.equals("Yes"))) { + owningFrame_.fa_.stopAndClearProcessor(); + } + owningFrame_.setVisible(false); + } + + dialog.setVisible(false); + dialog.dispose(); + showingMsg = false; + } + } + }); + + dialog.setContentPane(optionPane); + /* adapting the frame size to its content */ + dialog.pack(); + dialog.setLocationRelativeTo(owningFrame_); + dialog.setVisible(true); + showingMsg = true; + } + } + + public static FrameAveragerControls getInstance() { + return frame; + } +} diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java new file mode 100644 index 0000000..a471f32 --- /dev/null +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -0,0 +1,444 @@ +package edu.mbl.cdp.frameaverage; + +/* + * Copyright © 2009 – 2013, Marine Biological Laboratory + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of + * the authors and should not be interpreted as representing official policies, + * either expressed or implied, of any organization. + * + * Multiple-Frame Averaging plug-in for Micro-Manager + * @author Amitabh Verma (averma@mbl.edu), Grant Harris (gharris@mbl.edu) + * Marine Biological Laboratory, Woods Hole, Mass. + * + */ +import mmcorej.TaggedImage; +import org.json.JSONObject; +import org.micromanager.acquisition.TaggedImageQueue; +import org.micromanager.api.DataProcessor; +import org.micromanager.api.ScriptInterface; +import org.micromanager.utils.MDUtils; +import org.micromanager.utils.ReportingUtils; + +public class FrameAveragerProcessor extends DataProcessor { + + + JSONObject json = null; + int imgDepth; + TaggedFrameAverager tfa; + TaggedImage imageOnError; + + @Override + public void setApp(ScriptInterface gui) { + gui_ = gui; + if (tfa == null) { + tfa = new TaggedFrameAverager(); + tfa.setApp(gui_); + this.setName(TaggedFrameAverager.menuName); + tfa.fa.processor = this; + tfa.frame = tfa.fa.getControlFrame(); + } + } + + public void setTFA(TaggedFrameAverager tf) { + tfa = tf; + } + + @Override + protected void process() { + try { + final TaggedImage taggedImage = poll(); + // make a copy to produce if FrameAverager throws an error + // preserve image acquired + imageOnError = taggedImage; + + // if in Multi-D mode and disabled on plugin skip processing + if (tfa.fa.engineWrapper_.isAcquisitionRunning() && !tfa.fa.isEnabledForImageAcquisition) { + produce(taggedImage); + return; + } + + // if less than 2 frames then disable processing + if (tfa.fa.numberFrames < 2) { // if MFA is disabled + if (taggedImage == null) { // EOL check + produce(TaggedImageQueue.POISON); + return; + } + if (TaggedImageQueue.isPoison(taggedImage)) { // EOL check + produce(taggedImage); + return; + } + + produce(taggedImage); + if (tfa.fa.debugLogEnabled_) { + ReportingUtils.logMessage("FrameAvg: averaging disabled"); + } + return; + } else { + // if we are not in a state where we have acquired some frames for averaging + if (isFirstEmptyArray() && !isPartiallyFilledArray()) { + if (taggedImage == null) { // EOL check + produce(TaggedImageQueue.POISON); + return; + } + if (TaggedImageQueue.isPoison(taggedImage)) { // EOL check + produce(taggedImage); + return; + } + } else { + // this case would be for Snap or end of Live routine where additional images + // are needed to be acquired to fill the averaging array + // a Poison image indicates EOL + if (taggedImage == null || TaggedImageQueue.isPoison(taggedImage)) { + new Thread("Poison-Image-Delay") { + public void run() { + if (isPartiallyFilledArray()) { // make sure there are empty slots in the averaging array + if (!isFirstEmptyArray()) { // basically make sure slot 1 is filled with original image + + tfa.fa.taggedImageArray[0] = tfa.fa.taggedImageArray[1]; + + if (!tfa.getCMMCore().isSequenceRunning()) { + acquireImagesStartSequence(false); + } + + computeProduceAndEmpty(tfa.fa.taggedImageArray); // on to computing avg. frame + + if (tfa.fa.debugLogEnabled_) { + tfa.getCMMCore().logMessage("FrameAvg: exiting processor"); + } + } + } + produce(TaggedImageQueue.POISON); + } + }.start(); + return; + } + } + } + json = taggedImage.tags; + final int channel = MDUtils.getChannelIndex(json); + final String channelName = MDUtils.getChannelName(json); + + if (tfa.fa.avoidDisplayChs_ != null) {// channel avoidance + for (int c = 0; c < tfa.fa.avoidDisplayChs_.length; c++) { + if (channel == tfa.fa.avoidDisplayChs_[c]) { + if (tfa.fa.debugLogEnabled_) { + ReportingUtils.logMessage("FrameAvg: avoided channel: " + channel + " " + channelName); + } + produce(taggedImage); + return; + } + } + } + + imgDepth = MDUtils.getDepth(json); + if (imgDepth == 1 || imgDepth == 2) { // if Image is not 8/16 bit + } else { + produce(taggedImage); + return; + } + if (tfa.fa.debugLogEnabled_) { + tfa.getCMMCore().logMessage("FrameAvg: entering processor"); + } + + // Only applies for Live - MultiD and Snap collect images elsewhere (in Runnable and Poison-Image-Delay thread) + // when in Live collect (n-1) required images from stream + // when averaging array is filled skip this step and continue to + // compute and produce avg. image + if (testForEmptyArray()) { + for (int i = 1; i < tfa.fa.taggedImageArray.length; i++) { + if (tfa.fa.taggedImageArray[i] == null) { + if (tfa.fa.displayLive_ != null) { + if (tfa.gui.isLiveModeOn()) { + tfa.fa.displayLive_.displayStatusLine(" - Image Avg. Acquiring No. " + (i+1)); + } + } + tfa.fa.taggedImageArray[i] = taggedImage; + return; + } + } + } + + tfa.fa.taggedImageArray[0] = taggedImage; + + // try and get Display window for status + if (tfa.fa.displayLive_ != null) { + if (tfa.gui.isLiveModeOn()) { + tfa.fa.displayLive_.displayStatusLine(" - Image Avg. Acquiring No. 1"); + } + } + + computeProduceAndEmpty(tfa.fa.taggedImageArray); // on to computing avg. frame + + if (tfa.fa.debugLogEnabled_) { + tfa.getCMMCore().logMessage("FrameAvg: exiting processor"); + } + + } catch (Exception ex) { + produce(imageOnError); + ReportingUtils.logError("ERROR: FrameAvg, in Process: "); + ex.printStackTrace(); + if (tfa.fa.numberFrames > 1) { + emptyImageArray(); + } + } + } + + public boolean testForEmptyArray() { + for (int i=1; i < tfa.fa.taggedImageArray.length; i++) { + if (tfa.fa.taggedImageArray[i] == null) { + return true; + } + } + + return false; + } + + public boolean isPartiallyFilledArray() { + for (int i=0; i < tfa.fa.taggedImageArray.length; i++) { + if (tfa.fa.taggedImageArray[i] == null) { + return true; + } + } + + return false; + } + + public boolean isFirstEmptyArray() { + if (tfa.fa.taggedImageArray[1] == null) { + return true; + } + + return false; + } + + private void computeProduceAndEmpty(TaggedImage[] taggedImageArrayTemp) { + + try { + if (tfa.fa.debugLogEnabled_) { + ReportingUtils.logMessage("FrameAvg: computing..."); + } + + int width = MDUtils.getWidth(taggedImageArrayTemp[0].tags); + int height = MDUtils.getHeight(taggedImageArrayTemp[0].tags); +// ReportingUtils.logMessage(MDUtils.getChannelName(taggedImage.tags)); + + int dimension = width * height; + byte[] pixB; + byte[] retB = new byte[dimension]; + short[] pixS; + short[] retS = new short[dimension]; + float[] retF = new float[dimension]; + Object result = null; + + for (int i = 0; i < tfa.fa.numberFrames; i++) { +// ReportingUtils.logMessage("FrameAvg: Avg... image "+i); + if (imgDepth == 1) { + pixB = (byte[]) taggedImageArrayTemp[i].pix; + for (int j = 0; j < dimension; j++) { + retF[j] = (float) (retF[j] + (int) (pixB[j] & 0xff)); + } + } else if (imgDepth == 2) { + pixS = (short[]) taggedImageArrayTemp[i].pix; + for (int j = 0; j < dimension; j++) { + retF[j] = (float) (retF[j] + (int) (pixS[j] & 0xffff)); + } + } + } + if (imgDepth == 1) { + for (int j = 0; j < dimension; j++) { + retB[j] = (byte) (int) (retF[j] / tfa.fa.numberFrames); + } + result = retB; + } else if (imgDepth == 2) { + for (int j = 0; j < dimension; j++) { + retS[j] = (short) (int) (retF[j] / tfa.fa.numberFrames); + } + result = retS; + } + // Averaged channel + // Weird way of copying a JSONObject + JSONObject tags = new JSONObject(taggedImageArrayTemp[0].tags.toString()); + tags.put(FrameAverager.METADATAKEY, tfa.fa.numberFrames); + TaggedImage averagedImage = new TaggedImage(result, tags); + produce(averagedImage); + emptyImageArray(); + if (tfa.fa.debugLogEnabled_) { + ReportingUtils.logMessage("FrameAvg: produced averaged image"); + } + } catch (Exception ex) { + produce(imageOnError); + emptyImageArray(); + ex.printStackTrace(); + ReportingUtils.logError("Error: FrameAvg, while producing averaged img."); + } + } + + public void emptyImageArray() { + for (int i = 0; i < tfa.fa.taggedImageArray.length; i++) { + tfa.fa.taggedImageArray[i] = null; + } + } + + public void runAcquireFromRunningSequence() { + if (tfa.fa.numberFrames > 1) { + try { + if (tfa.fa.debugLogEnabled_) { + ReportingUtils.logMessage("FrameAvg: acquireImagesFromRunningSequence"); + } + acquireImagesFromRunningSequence(); + } catch (Exception ex) { + ex.printStackTrace(); + ReportingUtils.logMessage("ERROR: FrameAvg: while entering acquireImagesFromRunningSequence"); + } + } + } + + public void acquireImagesFromRunningSequence() { + try { + + String cam = tfa.getCMMCore().getCameraDevice(); + + long now = System.currentTimeMillis(); + int frame = 1;// keep 0 free for the image from engine + // reference BurstExample.bsh + + while (frame < tfa.fa.numberFrames && (tfa.getCMMCore().getRemainingImageCount() > 0 || tfa.getCMMCore().isSequenceRunning(cam))) { + if (tfa.getCMMCore().getRemainingImageCount() > 0) { + if (tfa.fa.isAdditionalDelayReg) { + Thread.sleep(250); + } + tfa.fa.taggedImageArray[frame] = tfa.getCMMCore().popNextTaggedImage(); + frame++; + if (tfa.fa.display_ != null) { + if (tfa.fa.display_.isActiveDisplay()) { + tfa.fa.display_.displayStatusLine("Image Avg. Acquiring No. " + frame); + } + } + } + } + long itTook = System.currentTimeMillis() - now; + + if (tfa.fa.debugLogEnabled_) { + ReportingUtils.logMessage("Averaging Acquisition took: " + itTook + " milliseconds for "+tfa.fa.numberFrames + " frames"); + } + + } catch (Exception ex) { + ex.printStackTrace(); + ReportingUtils.logMessage("FrameAvg Error"); + } + } + + public void runAcquireStartSequence() { + if (tfa.fa.numberFrames > 1) { + try { + if (tfa.fa.debugLogEnabled_) { + ReportingUtils.logMessage("FrameAvg: entering runnable"); + } + acquireImagesStartSequence(true); + } catch (Exception ex) { + ex.printStackTrace(); + ReportingUtils.logMessage("ERROR: FrameAvg: while entering runnable"); + } + } + } + + public void acquireImagesStartSequence(boolean stopAtEnd) { + try { + tfa.getCMMCore().waitForDevice(tfa.getCMMCore().getCameraDevice()); + tfa.getCMMCore().clearCircularBuffer(); + String cam = tfa.getCMMCore().getCameraDevice(); + +// CMMCore::startSequenceAcquisition(long numImages, double intervalMs, bool stopOnOverflow) +// @param numImages Number of images requested from the camera +// @param intervalMs interval between images, currently only supported by Andor cameras +// @param stopOnOverflow whether or not the camera stops acquiring when the circular buffer is full + tfa.getCMMCore().startSequenceAcquisition(tfa.fa.numberFrames-1, 0, false); + + long now = System.currentTimeMillis(); + int frame = 1;// keep 0 free for the image from engine + // reference BurstExample.bsh + + while (tfa.getCMMCore().getRemainingImageCount() > 0 || tfa.getCMMCore().isSequenceRunning(cam)) { + if (tfa.getCMMCore().getRemainingImageCount() > 0) { + if (tfa.fa.isAdditionalDelayReg) { + Thread.sleep(250); + } + tfa.fa.taggedImageArray[frame] = tfa.getCMMCore().popNextTaggedImage(); + frame++; + if (tfa.fa.display_ != null) { + if (tfa.fa.display_.acquisitionIsRunning()) { + tfa.fa.display_.displayStatusLine("Image Avg. Acquiring No. " + frame); + } + } + if (tfa.fa.displayLive_ != null) { + if (tfa.gui.isLiveModeOn() || !stopAtEnd) { + tfa.fa.displayLive_.displayStatusLine(" - Image Avg. Acquiring No. " + frame); + } + } + } + } + long itTook = System.currentTimeMillis() - now; + if (stopAtEnd) { + tfa.getCMMCore().stopSequenceAcquisition(cam); + } + if (tfa.fa.debugLogEnabled_) { + ReportingUtils.logMessage("Averaging Acquisition took: " + itTook + " milliseconds for "+tfa.fa.numberFrames + " frames"); + } + + } catch (Exception ex) { + ex.printStackTrace(); + ReportingUtils.logMessage("FrameAvg Error"); + } + } + + public DataProcessor getDataProcessor() { + return (DataProcessor) this; + } + + public static boolean isPoison(TaggedImage image) { + return ((image.pix == null) || (image.tags == null)); + } + + @Override + public void makeConfigurationGUI() { + if (tfa==null) { + tfa = new TaggedFrameAverager(); + tfa.setApp(gui_); + tfa.fa.processor = this; + tfa.frame = tfa.fa.getControlFrame(); + tfa.gui.addMMBackgroundListener(tfa.frame); + } else if (tfa.frame==null) { + tfa.frame = tfa.fa.getControlFrame(); + tfa.gui.addMMBackgroundListener(tfa.frame); + } + tfa.frame.setVisible(true); + } + + @Override + public void dispose() { + if (tfa.frame != null) { + tfa.frame.dispose(); + tfa.frame = null; + } + } +} diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java new file mode 100644 index 0000000..304be5a --- /dev/null +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java @@ -0,0 +1,123 @@ +package edu.mbl.cdp.frameaverage; + +/* + * Copyright © 2009 – 2013, Marine Biological Laboratory + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of + * the authors and should not be interpreted as representing official policies, + * either expressed or implied, of any organization. + * + * Multiple-Frame Averaging plug-in for Micro-Manager + * @author Amitabh Verma (averma@mbl.edu), Grant Harris (gharris@mbl.edu) + * Marine Biological Laboratory, Woods Hole, Mass. + * + */ + +import mmcorej.CMMCore; +import org.micromanager.acquisition.internal.AcquisitionWrapperEngine; +import org.micromanager.internal.utils.ReportingUtils; + +public class FrameAveragerRunnable implements Runnable { + + CMMCore core_; + AcquisitionWrapperEngine engineWrapper_; + boolean isDisplayControlsEnabled = false; + FrameAverager fa; + + + FrameAveragerRunnable(FrameAverager fa) { + this.fa = fa; + this.core_ = fa.core_; + this.engineWrapper_ = fa.engineWrapper_; + + fa.getDebugOptions(); + } + + + @Override + public void run() { + if (fa.numberFrames > 1) { + try { + if (fa.debugLogEnabled_) { + ReportingUtils.logMessage("FrameAvg: entering runnable"); + } + engineWrapper_.setPause(true); + acquireImages(); + engineWrapper_.setPause(false); + } catch (Exception ex) { + ex.printStackTrace(); + ReportingUtils.logMessage("ERROR: FrameAvg: while entering runnable"); + } + } + } + + public void acquireImages() { + try { + core_.waitForDevice(core_.getCameraDevice()); + core_.clearCircularBuffer(); + String cam = core_.getCameraDevice(); + +// CMMCore::startSequenceAcquisition(long numImages, double intervalMs, bool stopOnOverflow) +// @param numImages Number of images requested from the camera +// @param intervalMs interval between images, currently only supported by Andor cameras +// @param stopOnOverflow whether or not the camera stops acquiring when the circular buffer is full + core_.startSequenceAcquisition(fa.numberFrames-1, 0, false); + + long now = System.currentTimeMillis(); + int frame = 1;// keep 0 free for the image from engine + // reference BurstExample.bsh + + while (core_.getRemainingImageCount() > 0 || core_.isSequenceRunning(cam)) { + if (core_.getRemainingImageCount() > 0) { + if (fa.isAdditionalDelayReg) { + Thread.sleep(250); + } + fa.taggedImageArray[frame] = core_.popNextTaggedImage(); + frame++; + if (fa.display_ != null) { + if (fa.display_.acquisitionIsRunning()) { + fa.display_.displayStatusLine("Image Avg. Acquiring No. " + frame); + } + } + } + } + long itTook = System.currentTimeMillis() - now; + try { + core_.stopSequenceAcquisition(); + } catch (Exception ex) { + ex.printStackTrace(); + ReportingUtils.logMessage("ERROR: FrameAvg: " + ex.getMessage()); + } + + if (fa.debugLogEnabled_) { + ReportingUtils.logMessage("Averaging Acquisition took: " + itTook + " milliseconds for "+fa.numberFrames + " frames"); + } + + } catch (Exception ex) { + ex.printStackTrace(); + ReportingUtils.logMessage("FrameAvg Error"); + engineWrapper_.setPause(false); + } + } + + +} diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java new file mode 100644 index 0000000..d62a964 --- /dev/null +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java @@ -0,0 +1,114 @@ +package edu.mbl.cdp.frameaverage; + +/* + * Copyright © 2009 – 2013, Marine Biological Laboratory + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of + * the authors and should not be interpreted as representing official policies, + * either expressed or implied, of any organization. + * + * Multiple-Frame Averaging plug-in for Micro-Manager + * @author Amitabh Verma (averma@mbl.edu), Grant Harris (gharris@mbl.edu) + * Marine Biological Laboratory, Woods Hole, Mass. + * + */ + +import javax.swing.JFrame; +import mmcorej.CMMCore; +import org.micromanager.internal.MMStudio; +import org.micromanager.acquisition.internal.AcquisitionWrapperEngine; +import org.micromanager.data.ProcessorPlugin; +import org.scijava.plugin.SciJavaPlugin; + +public class TaggedFrameAverager implements ProcessorPlugin, SciJavaPlugin { + + public static final String menuName = "Frame Averager"; + public static final String tooltipDescription = "Multiple-Frame Averaging"; + public static String versionNumber = "1.0"; + public static String copyright = "Nick Anthony"; + + public JFrame frame; + public FrameAverager fa; + public MMStudio gui; + + public static Class getProcessorClass() { + return FrameAveragerProcessor.class; + } + + @Override + public void setApp(MMStudio s) { + gui = s; + if (fa==null) { + fa = new FrameAverager(getAcquisitionWrapperEngine(), gui.core(), this); + } + } + + public AcquisitionWrapperEngine getAcquisitionWrapperEngine() { + AcquisitionWrapperEngine engineWrapper = (AcquisitionWrapperEngine) gui.getAcquisitionEngine(); + return engineWrapper; + } + + public CMMCore getCMMCore() { + return gui.core(); + } + + public MMStudio getStudio() { + return gui; + } + + @Override + public void dispose() { + } + + @Override + public void show() { + if (frame == null) { + frame = fa.getControlFrame(); + frame.setLocation(fa.controlFrame_.FrameXpos, fa.controlFrame_.FrameYpos); + } + frame.setVisible(true); + } + +// @Override + public void configurationChanged() { + } + + @Override + public String getDescription() { + return tooltipDescription; + } + + @Override + public String getInfo() { + return "Frame Averager Plugin"; + } + + @Override + public String getVersion() { + return "1.05b"; + } + + @Override + public String getCopyright() { + return "MBL, 2014"; + } +} diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/frameIcon.png b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/frameIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..58fda9a4ea348713cd2b866f15c50e0eca4af533 GIT binary patch literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyq9v{oCC){ui6xo&c?uz!xv327 zci1IF)MTcIJW>WKU@!6Xbp;El%O7%2Tmcl~EbxddW?n+GNBr?+-PyBDa{r~<~kg;129e3v1aSP~zr=Bj3Ar-f#PP!@9WWeLHymNQN_ecBI z|Nq~-jVZ`W;H-0e)p;KyPPWG<&mH;ruP9ch@o?7OndjPi(_Y_u`R!MrNaAbe^D-IT z4bw#W7z_AB`%J}}?W-6%@=O`TMdTV;5B%AB@<5VE)CSfo;@nEh6?$Ik^sqVUXD7_!~^s&gQu&X%Q~loCIC2+>OTMg literal 0 HcmV?d00001 From 31a390454cad01e6c357adee3a6ad6df09ca247f Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 14:17:40 -0500 Subject: [PATCH 06/36] fix project properties --- .../nbproject/private/private.properties | 14 +- .../nbproject/project.properties | 334 +++++++++--------- 2 files changed, 174 insertions(+), 174 deletions(-) diff --git a/FrameAverager.2.0/nbproject/private/private.properties b/FrameAverager.2.0/nbproject/private/private.properties index 7d25205..cca7f8d 100644 --- a/FrameAverager.2.0/nbproject/private/private.properties +++ b/FrameAverager.2.0/nbproject/private/private.properties @@ -1,7 +1,7 @@ -compile.on.save=false -do.depend=false -do.jar=true -javac.debug=true -javadoc.preview=true -user.properties.file=C:\\Users\\N2-LiveCell\\AppData\\Roaming\\NetBeans\\8.2\\build.properties -work.dir=C:\\Program Files\\Micro-Manager-2.0beta +compile.on.save=false +do.depend=false +do.jar=true +javac.debug=true +javadoc.preview=true +user.properties.file=C:\\Users\\Nick\\AppData\\Roaming\\NetBeans\\8.2\\build.properties +work.dir=C:\\Program Files\\Micro-Manager-2.0beta diff --git a/FrameAverager.2.0/nbproject/project.properties b/FrameAverager.2.0/nbproject/project.properties index 94dd850..734f539 100644 --- a/FrameAverager.2.0/nbproject/project.properties +++ b/FrameAverager.2.0/nbproject/project.properties @@ -1,167 +1,167 @@ -annotation.processing.enabled=true -annotation.processing.enabled.in.editor=false -annotation.processing.processors.list= -annotation.processing.run.all.processors=true -annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output -application.title=FrameAverager -application.vendor=CDP-HPPAV -build.classes.dir=${build.dir}/classes -build.classes.excludes=**/*.java,**/*.form -# This directory is removed when the project is cleaned: -build.dir=build -build.generated.dir=${build.dir}/generated -build.generated.sources.dir=${build.dir}/generated-sources -# Only compile against the classpath explicitly listed here: -build.sysclasspath=ignore -build.test.classes.dir=${build.dir}/test/classes -build.test.results.dir=${build.dir}/test/results -# Uncomment to specify the preferred debugger connection transport: -#debug.transport=dt_socket -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/FrameAverager.jar -dist.javadoc.dir=${dist.dir}/javadoc -endorsed.classpath= -excludes= -file.reference.Big.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\Big.jar -file.reference.bsh-2.0b6.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\bsh-2.0b6.jar -file.reference.clojure-1.3.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\clojure-1.3.0.jar -file.reference.commons-math-2.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\commons-math-2.2.jar -file.reference.commons-math3-3.4.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\commons-math3-3.4.1.jar -file.reference.core.cache-0.6.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\core.cache-0.6.2.jar -file.reference.core.memoize-0.5.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\core.memoize-0.5.2.jar -file.reference.data.json-0.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\data.json-0.1.1.jar -file.reference.eventbus-1.4.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\eventbus-1.4.jar -file.reference.formats-api-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\formats-api-5.1.1.jar -file.reference.formats-common-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\formats-common-5.1.1.jar -file.reference.gentyref-1.1.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\gentyref-1.1.0.jar -file.reference.gson-2.2.4.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\gson-2.2.4.jar -file.reference.guava-17.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\guava-17.0.jar -file.reference.iconloader-GIT.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\iconloader-GIT.jar -file.reference.ij.jar=C:\\Program Files\\Micro-Manager-2.0beta\\ij.jar -file.reference.ImageFlipper-src=../../Projs/MMJ_/src/plugins/ImageFlipper/src -file.reference.jcommon-1.0.23.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\jcommon-1.0.23.jar -file.reference.jfreechart-1.0.19.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\jfreechart-1.0.19.jar -file.reference.joda-time-2.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\joda-time-2.2.jar -file.reference.kryo-2.24.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\kryo-2.24.0.jar -file.reference.logback-classic-1.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\logback-classic-1.1.1.jar -file.reference.logback-core-1.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\logback-core-1.1.1.jar -file.reference.miglayout-core-4.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\miglayout-core-4.2.jar -file.reference.miglayout-swing-4.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\miglayout-swing-4.2.jar -file.reference.minlog-1.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\minlog-1.2.jar -file.reference.MMAcqEngine.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMAcqEngine.jar -file.reference.MMCoreJ.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMCoreJ.jar -file.reference.MMJ_.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMJ_.jar -file.reference.objenesis-2.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\objenesis-2.1.jar -file.reference.ome-xml-5.1.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\ome-xml-5.1.1.jar -file.reference.Projector.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\Projector.jar -file.reference.protobuf-java-2.5.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\protobuf-java-2.5.0.jar -file.reference.rsyntaxtextarea-2.5.2.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\rsyntaxtextarea-2.5.2.jar -file.reference.scijava-common-2.46.0.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\scijava-common-2.46.0.jar -file.reference.serializer-2.7.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\serializer-2.7.1.jar -file.reference.slf4j-api-1.7.6.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\slf4j-api-1.7.6.jar -file.reference.swingx-0.9.5.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\swingx-0.9.5.jar -file.reference.TSFProto-SVN.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\TSFProto-SVN.jar -file.reference.xalan-2.7.1.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\xalan-2.7.1.jar -file.reference.xml-apis-1.3.04.jar=C:\\Program Files\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\xml-apis-1.3.04.jar -includes=** -jar.archive.disabled=${jnlp.enabled} -jar.compress=true -jar.index=${jnlp.enabled} -javac.classpath=\ - ${libs.swing-layout.classpath}:\ - ${file.reference.ij.jar}:\ - ${file.reference.Big.jar}:\ - ${file.reference.MMAcqEngine.jar}:\ - ${file.reference.MMCoreJ.jar}:\ - ${file.reference.MMJ_.jar}:\ - ${file.reference.Projector.jar}:\ - ${file.reference.TSFProto-SVN.jar}:\ - ${file.reference.bsh-2.0b6.jar}:\ - ${file.reference.clojure-1.3.0.jar}:\ - ${file.reference.commons-math-2.2.jar}:\ - ${file.reference.commons-math3-3.4.1.jar}:\ - ${file.reference.core.cache-0.6.2.jar}:\ - ${file.reference.core.memoize-0.5.2.jar}:\ - ${file.reference.data.json-0.1.1.jar}:\ - ${file.reference.eventbus-1.4.jar}:\ - ${file.reference.formats-api-5.1.1.jar}:\ - ${file.reference.formats-common-5.1.1.jar}:\ - ${file.reference.gentyref-1.1.0.jar}:\ - ${file.reference.gson-2.2.4.jar}:\ - ${file.reference.guava-17.0.jar}:\ - ${file.reference.iconloader-GIT.jar}:\ - ${file.reference.jcommon-1.0.23.jar}:\ - ${file.reference.jfreechart-1.0.19.jar}:\ - ${file.reference.joda-time-2.2.jar}:\ - ${file.reference.kryo-2.24.0.jar}:\ - ${file.reference.logback-classic-1.1.1.jar}:\ - ${file.reference.logback-core-1.1.1.jar}:\ - ${file.reference.miglayout-core-4.2.jar}:\ - ${file.reference.miglayout-swing-4.2.jar}:\ - ${file.reference.minlog-1.2.jar}:\ - ${file.reference.objenesis-2.1.jar}:\ - ${file.reference.ome-xml-5.1.1.jar}:\ - ${file.reference.protobuf-java-2.5.0.jar}:\ - ${file.reference.rsyntaxtextarea-2.5.2.jar}:\ - ${file.reference.scijava-common-2.46.0.jar}:\ - ${file.reference.serializer-2.7.1.jar}:\ - ${file.reference.slf4j-api-1.7.6.jar}:\ - ${file.reference.swingx-0.9.5.jar}:\ - ${file.reference.xalan-2.7.1.jar}:\ - ${file.reference.xml-apis-1.3.04.jar} -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.external.vm=false -javac.processorpath=\ - ${javac.classpath} -javac.source=1.6 -javac.target=1.6 -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -javac.test.processorpath=\ - ${javac.test.classpath} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -jnlp.codebase.type=no.codebase -jnlp.descriptor=application -jnlp.enabled=false -jnlp.mixed.code=default -jnlp.offline-allowed=false -jnlp.signed=false -jnlp.signing= -jnlp.signing.alias= -jnlp.signing.keystore= -main.class=ij.ImageJ -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -mkdist.disabled=true -no.dependencies=true -platform.active=default_platform -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -# Space-separated list of JVM arguments used when running the project -# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value -# or test-sys-prop.name=value to set system properties for unit tests): -run.jvmargs= -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -source.encoding=UTF-8 -src.src.dir=src +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +application.title=FrameAverager +application.vendor=CDP-HPPAV +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/FrameAverager.jar +dist.javadoc.dir=${dist.dir}/javadoc +endorsed.classpath= +excludes= +file.reference.Big.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\Big.jar +file.reference.bsh-2.0b6.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\bsh-2.0b6.jar +file.reference.clojure-1.3.0.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\clojure-1.3.0.jar +file.reference.commons-math-2.2.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\commons-math-2.2.jar +file.reference.commons-math3-3.4.1.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\commons-math3-3.4.1.jar +file.reference.core.cache-0.6.2.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\core.cache-0.6.2.jar +file.reference.core.memoize-0.5.2.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\core.memoize-0.5.2.jar +file.reference.data.json-0.1.1.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\data.json-0.1.1.jar +file.reference.eventbus-1.4.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\eventbus-1.4.jar +file.reference.formats-api-5.1.1.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\formats-api-5.1.1.jar +file.reference.formats-common-5.1.1.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\formats-common-5.1.1.jar +file.reference.gentyref-1.1.0.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\gentyref-1.1.0.jar +file.reference.gson-2.2.4.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\gson-2.2.4.jar +file.reference.guava-17.0.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\guava-17.0.jar +file.reference.iconloader-GIT.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\iconloader-GIT.jar +file.reference.ij.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\ij.jar +file.reference.ImageFlipper-src=../../Projs/MMJ_/src/plugins/ImageFlipper/src +file.reference.jcommon-1.0.23.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\jcommon-1.0.23.jar +file.reference.jfreechart-1.0.19.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\jfreechart-1.0.19.jar +file.reference.joda-time-2.2.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\joda-time-2.2.jar +file.reference.kryo-2.24.0.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\kryo-2.24.0.jar +file.reference.logback-classic-1.1.1.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\logback-classic-1.1.1.jar +file.reference.logback-core-1.1.1.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\logback-core-1.1.1.jar +file.reference.miglayout-core-4.2.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\miglayout-core-4.2.jar +file.reference.miglayout-swing-4.2.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\miglayout-swing-4.2.jar +file.reference.minlog-1.2.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\minlog-1.2.jar +file.reference.MMAcqEngine.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMAcqEngine.jar +file.reference.MMCoreJ.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMCoreJ.jar +file.reference.MMJ_.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\MMJ_.jar +file.reference.objenesis-2.1.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\objenesis-2.1.jar +file.reference.ome-xml-5.1.1.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\ome-xml-5.1.1.jar +file.reference.Projector.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\Projector.jar +file.reference.protobuf-java-2.5.0.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\protobuf-java-2.5.0.jar +file.reference.rsyntaxtextarea-2.5.2.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\rsyntaxtextarea-2.5.2.jar +file.reference.scijava-common-2.46.0.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\scijava-common-2.46.0.jar +file.reference.serializer-2.7.1.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\serializer-2.7.1.jar +file.reference.slf4j-api-1.7.6.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\slf4j-api-1.7.6.jar +file.reference.swingx-0.9.5.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\swingx-0.9.5.jar +file.reference.TSFProto-SVN.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\TSFProto-SVN.jar +file.reference.xalan-2.7.1.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\xalan-2.7.1.jar +file.reference.xml-apis-1.3.04.jar=D:\\ExtProgramFiles\\Micro-Manager-2.0beta\\plugins\\Micro-Manager\\xml-apis-1.3.04.jar +includes=** +jar.archive.disabled=${jnlp.enabled} +jar.compress=true +jar.index=${jnlp.enabled} +javac.classpath=\ + ${libs.swing-layout.classpath}:\ + ${file.reference.ij.jar}:\ + ${file.reference.Big.jar}:\ + ${file.reference.MMAcqEngine.jar}:\ + ${file.reference.MMCoreJ.jar}:\ + ${file.reference.MMJ_.jar}:\ + ${file.reference.Projector.jar}:\ + ${file.reference.TSFProto-SVN.jar}:\ + ${file.reference.bsh-2.0b6.jar}:\ + ${file.reference.clojure-1.3.0.jar}:\ + ${file.reference.commons-math-2.2.jar}:\ + ${file.reference.commons-math3-3.4.1.jar}:\ + ${file.reference.core.cache-0.6.2.jar}:\ + ${file.reference.core.memoize-0.5.2.jar}:\ + ${file.reference.data.json-0.1.1.jar}:\ + ${file.reference.eventbus-1.4.jar}:\ + ${file.reference.formats-api-5.1.1.jar}:\ + ${file.reference.formats-common-5.1.1.jar}:\ + ${file.reference.gentyref-1.1.0.jar}:\ + ${file.reference.gson-2.2.4.jar}:\ + ${file.reference.guava-17.0.jar}:\ + ${file.reference.iconloader-GIT.jar}:\ + ${file.reference.jcommon-1.0.23.jar}:\ + ${file.reference.jfreechart-1.0.19.jar}:\ + ${file.reference.joda-time-2.2.jar}:\ + ${file.reference.kryo-2.24.0.jar}:\ + ${file.reference.logback-classic-1.1.1.jar}:\ + ${file.reference.logback-core-1.1.1.jar}:\ + ${file.reference.miglayout-core-4.2.jar}:\ + ${file.reference.miglayout-swing-4.2.jar}:\ + ${file.reference.minlog-1.2.jar}:\ + ${file.reference.objenesis-2.1.jar}:\ + ${file.reference.ome-xml-5.1.1.jar}:\ + ${file.reference.protobuf-java-2.5.0.jar}:\ + ${file.reference.rsyntaxtextarea-2.5.2.jar}:\ + ${file.reference.scijava-common-2.46.0.jar}:\ + ${file.reference.serializer-2.7.1.jar}:\ + ${file.reference.slf4j-api-1.7.6.jar}:\ + ${file.reference.swingx-0.9.5.jar}:\ + ${file.reference.xalan-2.7.1.jar}:\ + ${file.reference.xml-apis-1.3.04.jar} +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.external.vm=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.6 +javac.target=1.6 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +jnlp.codebase.type=no.codebase +jnlp.descriptor=application +jnlp.enabled=false +jnlp.mixed.code=default +jnlp.offline-allowed=false +jnlp.signed=false +jnlp.signing= +jnlp.signing.alias= +jnlp.signing.keystore= +main.class=ij.ImageJ +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=true +no.dependencies=true +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project +# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value +# or test-sys-prop.name=value to set system properties for unit tests): +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.src.dir=src From 8ec37c40401c9de213cbd57668362fdf324e7b83 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 14:45:34 -0500 Subject: [PATCH 07/36] Create a factory class. basically following framecombiner plugin --- .../frameaverage/FrameAveragerFactory.java | 30 +++++++++++++++++++ ...Averager.java => FrameAveragerPlugin.java} | 0 2 files changed, 30 insertions(+) create mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java rename FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/{TaggedFrameAverager.java => FrameAveragerPlugin.java} (100%) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java new file mode 100644 index 0000000..f0e6b0f --- /dev/null +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java @@ -0,0 +1,30 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package edu.mbl.cdp.frameaverage; + +import org.micromanager.data.Processor; +import org.micromanager.data.ProcessorFactory; +import org.micromanager.PropertyMap; +import org.micromanager.Studio; + +/** + * + * @author Nick + */ +public class FrameAveragerFactory implements ProcessorFactory{ + + private final Studio studio_; + private final PropertyMap settings_; + + public FrameAveragerFactory(Studio studio, PropertyMap settings) { + studio_ = studio; + settings_ = settings; + } + @Override + public Processor createProcessor() { + return new FrameAverager(); + } +} diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java similarity index 100% rename from FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java rename to FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java From 7d60647689fa04785aa7a17c708eb02c692e823b Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 14:46:06 -0500 Subject: [PATCH 08/36] rename plugin class get all theoverrides working --- .../cdp/frameaverage/FrameAveragerPlugin.java | 56 +++++++------------ 1 file changed, 21 insertions(+), 35 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java index d62a964..6c8cd00 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java @@ -34,49 +34,39 @@ import javax.swing.JFrame; import mmcorej.CMMCore; -import org.micromanager.internal.MMStudio; +import org.micromanager.Studio; import org.micromanager.acquisition.internal.AcquisitionWrapperEngine; import org.micromanager.data.ProcessorPlugin; +import org.micromanager.data.ProcessorConfigurator; +import org.micromanager.data.ProcessorFactory; +import org.micromanager.PropertyMap; import org.scijava.plugin.SciJavaPlugin; -public class TaggedFrameAverager implements ProcessorPlugin, SciJavaPlugin { +public class FrameAveragerPlugin implements ProcessorPlugin, SciJavaPlugin { - public static final String menuName = "Frame Averager"; - public static final String tooltipDescription = "Multiple-Frame Averaging"; - public static String versionNumber = "1.0"; + public static String menuName = "Frame Averager"; + public static String tooltipDescription = "Multiple-Frame Averaging"; + public static String versionNumber = "1.1"; public static String copyright = "Nick Anthony"; - public JFrame frame; - public FrameAverager fa; - public MMStudio gui; + private Studio studio_; public static Class getProcessorClass() { return FrameAveragerProcessor.class; } @Override - public void setApp(MMStudio s) { - gui = s; - if (fa==null) { - fa = new FrameAverager(getAcquisitionWrapperEngine(), gui.core(), this); - } - } - - public AcquisitionWrapperEngine getAcquisitionWrapperEngine() { - AcquisitionWrapperEngine engineWrapper = (AcquisitionWrapperEngine) gui.getAcquisitionEngine(); - return engineWrapper; - } - - public CMMCore getCMMCore() { - return gui.core(); + public ProcessorConfigurator createConfigurator(PropertyMap settings) { + return new FrameAveragerConfigurator(settings, studio_); } - public MMStudio getStudio() { - return gui; + @Override + public ProcessorFactory createFactory(PropertyMap settings) { + return new FrameAveragerFactory(studio_, settings); } - @Override - public void dispose() { + public void setContext(Studio studio) { + studio_ = studio; } @Override @@ -88,27 +78,23 @@ public void show() { frame.setVisible(true); } -// @Override - public void configurationChanged() { - } - @Override - public String getDescription() { + public String getHelpText() { return tooltipDescription; } @Override - public String getInfo() { - return "Frame Averager Plugin"; + public String getName() { + return menuName; } @Override public String getVersion() { - return "1.05b"; + return versionNumber; } @Override public String getCopyright() { - return "MBL, 2014"; + return copyright; } } From 0b7b4f1f15798dd910e9e1a8972bd53cc937241a Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 14:46:28 -0500 Subject: [PATCH 09/36] following through on rename --- .../src/edu/mbl/cdp/frameaverage/FrameAverager.java | 6 +++--- .../mbl/cdp/frameaverage/FrameAveragerControls.java | 4 ++-- .../mbl/cdp/frameaverage/FrameAveragerProcessor.java | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java index 304ebc9..20ea9c5 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java @@ -51,7 +51,7 @@ public class FrameAverager implements ImageFocusListener { static final String METADATAKEY = "FramesAveraged"; CMMCore core_; - TaggedFrameAverager tfa_; + FrameAveragerPlugin tfa_; AcquisitionWrapperEngine engineWrapper_; FrameAveragerProcessor processor; @@ -73,7 +73,7 @@ public class FrameAverager implements ImageFocusListener { static String CameraNameProperty = "CameraName"; static String[] AdditionalDelayCams = {"Retiga 4000R"}; - public FrameAverager(AcquisitionWrapperEngine engineWrapper, CMMCore core, TaggedFrameAverager tfa) { + public FrameAverager(AcquisitionWrapperEngine engineWrapper, CMMCore core, FrameAveragerPlugin tfa) { engineWrapper_ = engineWrapper; core_ = core; @@ -188,7 +188,7 @@ public void startProcessor() { public void attachDataProcessor() { if (processor==null) { processor = new FrameAveragerProcessor(); - processor.setName(TaggedFrameAverager.menuName); + processor.setName(FrameAveragerPlugin.menuName); processor.setTFA(tfa_); processor.setApp(tfa_.gui); } diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java index 6e1f821..a740d3b 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java @@ -506,7 +506,7 @@ public int[] getHyphenStringToIntArray(String str, String regStr) { } public static void showMessage(String msg) { - showNonBlockingMessage(JOptionPane.WARNING_MESSAGE, TaggedFrameAverager.menuName, msg, getInstance()); + showNonBlockingMessage(JOptionPane.WARNING_MESSAGE, FrameAveragerPlugin.menuName, msg, getInstance()); } public static void showMessage(String title, String msg) { @@ -542,7 +542,7 @@ public void propertyChange(PropertyChangeEvent e) { } public static void showNonBlockingYesNo(Image iconImage) { - showNonBlockingYesNo(JOptionPane.QUESTION_MESSAGE, TaggedFrameAverager.menuName, "Remove from Micro-Manager's Image Pipeline ?", getInstance(), iconImage); + showNonBlockingYesNo(JOptionPane.QUESTION_MESSAGE, FrameAveragerPlugin.menuName, "Remove from Micro-Manager's Image Pipeline ?", getInstance(), iconImage); } public static void showNonBlockingYesNo(int msgType, String title, String message, final FrameAveragerControls owningFrame_, Image iconImage) { diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java index a471f32..a3e31f8 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -44,22 +44,22 @@ public class FrameAveragerProcessor extends DataProcessor { JSONObject json = null; int imgDepth; - TaggedFrameAverager tfa; + FrameAveragerPlugin tfa; TaggedImage imageOnError; @Override public void setApp(ScriptInterface gui) { gui_ = gui; if (tfa == null) { - tfa = new TaggedFrameAverager(); + tfa = new FrameAveragerPlugin(); tfa.setApp(gui_); - this.setName(TaggedFrameAverager.menuName); + this.setName(FrameAveragerPlugin.menuName); tfa.fa.processor = this; tfa.frame = tfa.fa.getControlFrame(); } } - public void setTFA(TaggedFrameAverager tf) { + public void setTFA(FrameAveragerPlugin tf) { tfa = tf; } @@ -422,7 +422,7 @@ public static boolean isPoison(TaggedImage image) { @Override public void makeConfigurationGUI() { if (tfa==null) { - tfa = new TaggedFrameAverager(); + tfa = new FrameAveragerPlugin(); tfa.setApp(gui_); tfa.fa.processor = this; tfa.frame = tfa.fa.getControlFrame(); From 3b50e1f429fd6ae3c2f92686b7776a3a4f4856dd Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 15:28:36 -0500 Subject: [PATCH 10/36] remove some unnedded stuff and rename --- .../src/edu/mbl/cdp/frameaverage/About.form | 138 --------- .../src/edu/mbl/cdp/frameaverage/About.java | 286 ------------------ ...ls.form => FrameAveragerConfigurator.form} | 0 ...ls.java => FrameAveragerConfigurator.java} | 0 .../edu/mbl/cdp/frameaverage/frameIcon.png | Bin 497 -> 0 bytes 5 files changed, 424 deletions(-) delete mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.form delete mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.java rename FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/{FrameAveragerControls.form => FrameAveragerConfigurator.form} (100%) rename FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/{FrameAveragerControls.java => FrameAveragerConfigurator.java} (100%) delete mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/frameIcon.png diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.form b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.form deleted file mode 100644 index bec803a..0000000 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.form +++ /dev/null @@ -1,138 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.java deleted file mode 100644 index 659d735..0000000 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/About.java +++ /dev/null @@ -1,286 +0,0 @@ -package edu.mbl.cdp.frameaverage; - -/* - * Copyright © 2009 – 2013, Marine Biological Laboratory - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of - * the authors and should not be interpreted as representing official policies, - * either expressed or implied, of any organization. - * - * Multiple-Frame Averaging plug-in for Micro-Manager - * @author Amitabh Verma (averma@mbl.edu), Grant Harris (gharris@mbl.edu) - * Marine Biological Laboratory, Woods Hole, Mass. - * - */ - -import com.swtdesigner.SwingResourceManager; -import java.awt.Cursor; -import java.awt.Image; -import java.awt.Rectangle; -import java.util.Calendar; -import javax.swing.JFrame; -import javax.swing.text.SimpleAttributeSet; -import javax.swing.text.StyleConstants; -import org.micromanager.utils.ReportingUtils; - -public class About extends javax.swing.JFrame { - - public static final String BugPageLink_ = "http://www.openpolscope.org/mantis/"; - public static final String BugPageLinkLABEL_ = "Web Page"; - - public static final String WebPageLink_ = "http://www.openpolscope.org/pages/MMPlugin_Frame_Averager.htm"; - public static final String WebPageLinkLABEL_ = "Web Page"; - - public About(JFrame frame) { - initComponents(); - setIcon(); - - setCopyRight(); - setLicenseText(); - Rectangle rec = frame.getBounds(); - this.setBounds(rec.x, rec.y, WIDTH, HEIGHT); - this.setVisible(true); - } - - private void setIcon() { -// URL url = this.getClass().getResource("frameIcon.png"); -// Image im = Toolkit.getDefaultToolkit().getImage(url); - Image im = SwingResourceManager.getImage(FrameAveragerControls.class, "frameIcon.png"); - setIconImage(im); - } - - private void setLicenseText() { - try { - String text = textPaneLicense.getText(); - textPaneLicense.setText(text); - textPaneLicense.setCaretPosition(0); - - SimpleAttributeSet sa = new SimpleAttributeSet(); - StyleConstants.setAlignment(sa, StyleConstants.ALIGN_JUSTIFIED); - textPaneLicense.getStyledDocument().setParagraphAttributes(0,text.length(),sa,false); - } - catch (Exception ex) {ReportingUtils.showError(ex);} - } - - private void setCopyRight() { - - Calendar cal = Calendar.getInstance(); - int year = cal.get(Calendar.YEAR); - String str = "Marine Biological Laboratory © 2009 - " + year; - labelFooter.setText(str); - } - - public void setDialogueName(String text) { - labelDialogueName.setText("About: FrameAverager"); - } - - public static void openHttpUrl(String url) { - try { - java.net.URI uri = new java.net.URI(url); - java.awt.Desktop desktop = java.awt.Desktop.getDesktop(); - desktop.browse(uri); - } catch (Exception e) { - System.err.println(e.getMessage()); - } - } - - /** - * This method is called from within the constructor to initialize the form. - * WARNING: Do NOT modify this code. The content of this method is always - * regenerated by the Form Editor. - */ - @SuppressWarnings("unchecked") - // //GEN-BEGIN:initComponents - private void initComponents() { - - labelDialogueName = new javax.swing.JLabel(); - jScrollPane1 = new javax.swing.JScrollPane(); - textPaneLicense = new javax.swing.JTextPane(); - labelVersion = new javax.swing.JLabel(); - labelFooter = new javax.swing.JLabel(); - labelWebPage = new javax.swing.JLabel(); - jLabel2 = new javax.swing.JLabel(); - - setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setTitle("About"); - setMinimumSize(new java.awt.Dimension(450, 400)); - setPreferredSize(new java.awt.Dimension(450, 400)); - - labelDialogueName.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N - labelDialogueName.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - labelDialogueName.setText("FrameAverager"); - - jScrollPane1.setAutoscrolls(true); - jScrollPane1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); - - textPaneLicense.setEditable(false); - textPaneLicense.setText("Copyright © 2009 - 2013, Marine Biological Laboratory\n\nLICENSE (Berkeley Software Distribution License): Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n3. Neither the name of the Marine Biological Laboratory nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nThe views and conclusions contained in the software and documentation are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of any organization.\n\nDeveloped at the Laboratory of Rudolf Oldenbourg at the Marine Biological Laboratory in Woods Hole, MA.\n\nSoftware Developers: Amitabh Verma & Grant Harris"); - textPaneLicense.setAutoscrolls(false); - jScrollPane1.setViewportView(textPaneLicense); - - labelVersion.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N - labelVersion.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - labelVersion.setText("Version 1.06b (Compatible with Micro-Manager 1.4.22)"); - - labelFooter.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - labelFooter.setText("Marine Biological Laboratory © 2009 - 2014"); - - labelWebPage.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - labelWebPage.setText("Web Page"); - labelWebPage.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - labelWebPageMouseClicked(evt); - } - public void mouseEntered(java.awt.event.MouseEvent evt) { - labelWebPageMouseEntered(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - labelWebPageMouseExited(evt); - } - }); - - jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel2.setText("Bugs and Feature Requests"); - jLabel2.setToolTipText("Email: feedback@openpolscope.org"); - jLabel2.addMouseListener(new java.awt.event.MouseAdapter() { - public void mouseClicked(java.awt.event.MouseEvent evt) { - jLabel2MouseClicked(evt); - } - public void mouseEntered(java.awt.event.MouseEvent evt) { - jLabel2MouseEntered(evt); - } - public void mouseExited(java.awt.event.MouseEvent evt) { - jLabel2MouseExited(evt); - } - }); - - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); - getContentPane().setLayout(layout); - layout.setHorizontalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(labelVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 426, Short.MAX_VALUE) - .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) - .addComponent(labelDialogueName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(labelFooter, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(labelWebPage) - .addComponent(jLabel2)) - .addContainerGap()) - ); - layout.setVerticalGroup( - layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addGap(6, 6, 6) - .addComponent(labelDialogueName, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(labelVersion) - .addGap(11, 11, 11) - .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 267, Short.MAX_VALUE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(labelWebPage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(labelFooter) - .addContainerGap()) - ); - - pack(); - }// //GEN-END:initComponents - - private void labelWebPageMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_labelWebPageMouseClicked - openHttpUrl(WebPageLink_); - }//GEN-LAST:event_labelWebPageMouseClicked - - private void labelWebPageMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_labelWebPageMouseEntered - setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - }//GEN-LAST:event_labelWebPageMouseEntered - - private void labelWebPageMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_labelWebPageMouseExited - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }//GEN-LAST:event_labelWebPageMouseExited - - private void jLabel2MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel2MouseClicked - openHttpUrl(BugPageLink_); - }//GEN-LAST:event_jLabel2MouseClicked - - private void jLabel2MouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel2MouseEntered - setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - }//GEN-LAST:event_jLabel2MouseEntered - - private void jLabel2MouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel2MouseExited - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - }//GEN-LAST:event_jLabel2MouseExited - - /** - * @param args the command line arguments - */ -// public static void main(String args[]) { -// /* -// * Set the Nimbus look and feel -// */ -// // -// /* -// * If Nimbus (introduced in Java SE 6) is not available, stay with the -// * default look and feel. For details see -// * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html -// */ -// try { -// for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { -// if ("Nimbus".equals(info.getName())) { -// javax.swing.UIManager.setLookAndFeel(info.getClassName()); -// break; -// } -// } -// } catch (ClassNotFoundException ex) { -// java.util.logging.Logger.getLogger(About.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); -// } catch (InstantiationException ex) { -// java.util.logging.Logger.getLogger(About.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); -// } catch (IllegalAccessException ex) { -// java.util.logging.Logger.getLogger(About.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); -// } catch (javax.swing.UnsupportedLookAndFeelException ex) { -// java.util.logging.Logger.getLogger(About.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); -// } -// // -// -// /* -// * Create and display the form -// */ -// java.awt.EventQueue.invokeLater(new Runnable() { -// -// public void run() { -// new About().setVisible(true); -// } -// }); -// } - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JLabel jLabel2; - private javax.swing.JScrollPane jScrollPane1; - private javax.swing.JLabel labelDialogueName; - private javax.swing.JLabel labelFooter; - private javax.swing.JLabel labelVersion; - private javax.swing.JLabel labelWebPage; - private javax.swing.JTextPane textPaneLicense; - // End of variables declaration//GEN-END:variables -} diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.form b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form similarity index 100% rename from FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.form rename to FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java similarity index 100% rename from FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java rename to FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/frameIcon.png b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/frameIcon.png deleted file mode 100644 index 58fda9a4ea348713cd2b866f15c50e0eca4af533..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyq9v{oCC){ui6xo&c?uz!xv327 zci1IF)MTcIJW>WKU@!6Xbp;El%O7%2Tmcl~EbxddW?n+GNBr?+-PyBDa{r~<~kg;129e3v1aSP~zr=Bj3Ar-f#PP!@9WWeLHymNQN_ecBI z|Nq~-jVZ`W;H-0e)p;KyPPWG<&mH;ruP9ch@o?7OndjPi(_Y_u`R!MrNaAbe^D-IT z4bw#W7z_AB`%J}}?W-6%@=O`TMdTV;5B%AB@<5VE)CSfo;@nEh6?$Ik^sqVUXD7_!~^s&gQu&X%Q~loCIC2+>OTMg From 0835cc17f1ad5c282273e7af27f17d63e153d01c Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 15:29:06 -0500 Subject: [PATCH 11/36] renaming followthrough --- .../src/edu/mbl/cdp/frameaverage/FrameAverager.java | 4 ++-- .../src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java index 20ea9c5..4c99110 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java @@ -55,7 +55,7 @@ public class FrameAverager implements ImageFocusListener { AcquisitionWrapperEngine engineWrapper_; FrameAveragerProcessor processor; - public FrameAveragerControls controlFrame_; + public FrameAveragerConfigurator controlFrame_; public boolean debugLogEnabled_ = false; public boolean isEnabledForImageAcquisition = false; @@ -234,7 +234,7 @@ public DataProcessor getDataProcessor() { public JFrame getControlFrame() { if (controlFrame_ == null) { - controlFrame_ = new FrameAveragerControls(this); + controlFrame_ = new FrameAveragerConfigurator(this); } return controlFrame_; } diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java index f0e6b0f..fec118f 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java @@ -25,6 +25,6 @@ public FrameAveragerFactory(Studio studio, PropertyMap settings) { } @Override public Processor createProcessor() { - return new FrameAverager(); + return new FrameAveragerProcessor(); } } From 84b5ece3c71a8eaf42c7f0d89c7805b1df580438 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 15:29:29 -0500 Subject: [PATCH 12/36] getting a little more 2.0 compatible --- .../edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java | 4 ++-- .../edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java index a3e31f8..5695e21 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -34,12 +34,12 @@ import mmcorej.TaggedImage; import org.json.JSONObject; import org.micromanager.acquisition.TaggedImageQueue; -import org.micromanager.api.DataProcessor; +import org.micromanager.data.Processor; import org.micromanager.api.ScriptInterface; import org.micromanager.utils.MDUtils; import org.micromanager.utils.ReportingUtils; -public class FrameAveragerProcessor extends DataProcessor { +public class FrameAveragerProcessor extends Processor { JSONObject json = null; diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java index 304be5a..56410bf 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java @@ -38,16 +38,15 @@ public class FrameAveragerRunnable implements Runnable { - CMMCore core_; - AcquisitionWrapperEngine engineWrapper_; - boolean isDisplayControlsEnabled = false; + private static CMMCore core_; + private static AcquisitionWrapperEngine engineWrapper_; FrameAverager fa; FrameAveragerRunnable(FrameAverager fa) { this.fa = fa; - this.core_ = fa.core_; - this.engineWrapper_ = fa.engineWrapper_; + core_ = fa.core_; + engineWrapper_ = fa.engineWrapper_; fa.getDebugOptions(); } From 53924ab2880fe8670c88c72f182fe8f2f1770706 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 15:29:57 -0500 Subject: [PATCH 13/36] turning the gui into a simple configurator class --- .../FrameAveragerConfigurator.java | 112 +++++------------- 1 file changed, 27 insertions(+), 85 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java index a740d3b..362b553 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java @@ -32,8 +32,13 @@ * */ +import org.micromanager.internal.utils.MMFrame; +import org.micromanager.data.ProcessorConfigurator; +import org.micromanager.PropertyMap; +import org.micromanager.Studio; + import com.swtdesigner.SwingResourceManager; -import java.awt.Frame; + import java.awt.Image; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -42,9 +47,9 @@ import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; -import org.micromanager.internalinterfaces.AcqSettingsListener; -public class FrameAveragerControls extends javax.swing.JFrame implements AcqSettingsListener { + +public class FrameAveragerConfigurator extends MMFrame implements ProcessorConfigurator { /* TODO * 1. Attach Runnable channel specific if using channel avoidance @@ -54,41 +59,32 @@ public class FrameAveragerControls extends javax.swing.JFrame implements AcqSett * * */ - static FrameAveragerControls frame; - private FrameAverager fa_; - private static JFrame About; + private final Studio studio_; + private final PropertyMap settings_; + + /* private String lastChannelAvoidanceStr = ""; - public static final Preferences FrameAveragerControlPrefs = Preferences.userNodeForPackage(FrameAveragerControls.class); + public static final Preferences FrameAveragerControlPrefs = Preferences.userNodeForPackage(FrameAveragerConfigurator.class); public final String FrameXposKey = "PREF_FrameX"; public final String FrameYposKey = "PREF_FrameY"; public final String NumberOfFramesKey = "PREF_NumberOfFramesKey"; public int FrameXpos = 300; public int FrameYpos = 300; - Image iconImage; - + */ /** * Creates new form FrameAveragerControls */ - public FrameAveragerControls(FrameAverager fa) { - this.fa_ = fa; + public FrameAveragerConfigurator(PropertyMap settings, Studio studio) { + studio_ = studio; + settings_ = settings; initComponents(); - iconImage = SwingResourceManager.getImage(FrameAveragerControls.class, "frameIcon.png"); -// URL url = this.getClass().getResource("frameIcon.png"); -// iconImage = Toolkit.getDefaultToolkit().getImage(url); - setIconImage(iconImage); getPreferences(); - fa.setNumberFrames(fa.numberFrames); - numFramesField.setText(String.valueOf(fa.numberFrames)); - setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE ); - this.setLocation(FrameXpos, FrameYpos); - lastChannelAvoidanceStr = channelsToAvoid.getText(); - updateStatus(); - this.pack(); - frame = this; + lastChannelAvoidanceStr = channelsToAvoid.getText(); + super.loadAndRestorePosition(200, 200); } @Override @@ -285,11 +281,11 @@ private void enabledCheckBox_ActionPerformed(java.awt.event.ActionEvent evt) {// if (!showingMsg) { if (fa_.core_.isSequenceRunning()) { enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - FrameAveragerControls.showMessage("Live mode is running ! Please stop before enabling/disabling."); + FrameAveragerConfigurator.showMessage("Live mode is running ! Please stop before enabling/disabling."); return; } else if (fa_.tfa_.gui.isAcquisitionRunning()) { enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - FrameAveragerControls.showMessage("Acquisition is running ! Please stop before enabling/disabling."); + FrameAveragerConfigurator.showMessage("Acquisition is running ! Please stop before enabling/disabling."); return; } update(); @@ -314,10 +310,7 @@ private void numFramesFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST }//GEN-LAST:event_numFramesFieldFocusLost private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed - if (About == null) { - About = new About(this); - } - About.setVisible(true); + }//GEN-LAST:event_jMenuItem1ActionPerformed private void formFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_formFocusGained @@ -332,12 +325,12 @@ private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:even if (fa_.core_.isSequenceRunning()) { if (enabledCheckBox_.isSelected()) { setVisible( true ); - FrameAveragerControls.showMessage("Live mode is running with FrameAverager ! Please stop Live before closing FrameAverager."); + FrameAveragerConfigurator.showMessage("Live mode is running with FrameAverager ! Please stop Live before closing FrameAverager."); } } else if (fa_.tfa_.gui.isAcquisitionRunning()) { if (enabledCheckBox_.isSelected()) { setVisible( true ); - FrameAveragerControls.showMessage("Acquisition is running with FrameAverager ! Please stop Acquisition before closing FrameAverager."); + FrameAveragerConfigurator.showMessage("Acquisition is running with FrameAverager ! Please stop Acquisition before closing FrameAverager."); } } else { if (enabledCheckBox_.isSelected()) { @@ -365,7 +358,7 @@ private void updateNumFramesField() { fa_.setNumberFrames(num); updateStatus(); } else { - FrameAveragerControls.showMessage("Number of Image Frames to average has to be an Integer"); + FrameAveragerConfigurator.showMessage("Number of Image Frames to average has to be an Integer"); } } else { numFramesField.setText(String.valueOf(fa_.numberFrames)); @@ -377,10 +370,10 @@ private void channelAvoidance() { if (!lastChannelAvoidanceStr.equals(channelsToAvoid.getText())) { if (fa_.core_.isSequenceRunning()) { channelsToAvoid.setText(lastChannelAvoidanceStr); - FrameAveragerControls.showMessage("Live mode is running ! Please stop before changing this field."); + FrameAveragerConfigurator.showMessage("Live mode is running ! Please stop before changing this field."); } else if (fa_.tfa_.gui.isAcquisitionRunning()) { channelsToAvoid.setText(lastChannelAvoidanceStr); - FrameAveragerControls.showMessage("Acquisition is running ! Please stop before changing this field."); + FrameAveragerConfigurator.showMessage("Acquisition is running ! Please stop before changing this field."); } else { updateChannelsToAvoid(); fa_.stopAndClearRunnable(); @@ -540,55 +533,4 @@ public void propertyChange(PropertyChangeEvent e) { showingMsg = true; } } - - public static void showNonBlockingYesNo(Image iconImage) { - showNonBlockingYesNo(JOptionPane.QUESTION_MESSAGE, FrameAveragerPlugin.menuName, "Remove from Micro-Manager's Image Pipeline ?", getInstance(), iconImage); - } - - public static void showNonBlockingYesNo(int msgType, String title, String message, final FrameAveragerControls owningFrame_, Image iconImage) { - if (null != owningFrame_) { - Object[] options = { "Yes", "No", "Cancel" }; - final JOptionPane optionPane = new JOptionPane(message, msgType, JOptionPane.YES_NO_CANCEL_OPTION, null, options); - /* the false parameter is for not modal */ - final JDialog dialog = new JDialog((JDialog)null, title, false); - dialog.setIconImage(iconImage); - - optionPane.addPropertyChangeListener( - new PropertyChangeListener() { - - @Override - public void propertyChange(PropertyChangeEvent e) { - String prop = e.getPropertyName(); - - if (dialog.isVisible() && (e.getSource() == optionPane) && (prop.equals(JOptionPane.VALUE_PROPERTY))) { - String selectValue = (String) e.getNewValue(); - - if ((selectValue.equals("Cancel"))) { - - } else { - if ((selectValue.equals("Yes"))) { - owningFrame_.fa_.stopAndClearProcessor(); - } - owningFrame_.setVisible(false); - } - - dialog.setVisible(false); - dialog.dispose(); - showingMsg = false; - } - } - }); - - dialog.setContentPane(optionPane); - /* adapting the frame size to its content */ - dialog.pack(); - dialog.setLocationRelativeTo(owningFrame_); - dialog.setVisible(true); - showingMsg = true; - } - } - - public static FrameAveragerControls getInstance() { - return frame; - } } From 907658e1579006f5312fa7bc9c970911249932d8 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 15:42:27 -0500 Subject: [PATCH 14/36] move a bunch of stuff. remove help menu --- .../FrameAveragerConfigurator.form | 17 - .../FrameAveragerConfigurator.java | 417 ++++++++---------- 2 files changed, 178 insertions(+), 256 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form index aafdcf0..290485b 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form @@ -3,23 +3,6 @@
- - - - - - - - - - - - - - - - - diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java index 362b553..b74ad28 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java @@ -37,27 +37,12 @@ import org.micromanager.PropertyMap; import org.micromanager.Studio; -import com.swtdesigner.SwingResourceManager; - -import java.awt.Image; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.Arrays; -import java.util.prefs.Preferences; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JOptionPane; - public class FrameAveragerConfigurator extends MMFrame implements ProcessorConfigurator { /* TODO * 1. Attach Runnable channel specific if using channel avoidance * Currently this is handled via DataProcessor which would skip for avoided channels - * - * - * - * */ private final Studio studio_; @@ -65,14 +50,6 @@ public class FrameAveragerConfigurator extends MMFrame implements ProcessorConfi /* private String lastChannelAvoidanceStr = ""; - - public static final Preferences FrameAveragerControlPrefs = Preferences.userNodeForPackage(FrameAveragerConfigurator.class); - public final String FrameXposKey = "PREF_FrameX"; - public final String FrameYposKey = "PREF_FrameY"; - public final String NumberOfFramesKey = "PREF_NumberOfFramesKey"; - public int FrameXpos = 300; - public int FrameYpos = 300; - */ /** * Creates new form FrameAveragerControls @@ -81,16 +58,11 @@ public FrameAveragerConfigurator(PropertyMap settings, Studio studio) { studio_ = studio; settings_ = settings; initComponents(); - getPreferences(); + loadSettingValue(); lastChannelAvoidanceStr = channelsToAvoid.getText(); super.loadAndRestorePosition(200, 200); } - - @Override - public void settingsChanged() { - update(); - } public void update() { if (this.enabledCheckBox_.isSelected()) { @@ -108,22 +80,188 @@ public void update() { fa_.isEnabledForImageAcquisition = this.enabledCheckBox_.isSelected(); } - private void getPreferences() { - FrameXpos = FrameAveragerControlPrefs.getInt(FrameXposKey, FrameXpos); - FrameYpos = FrameAveragerControlPrefs.getInt(FrameYposKey, FrameYpos); + private void loadSettingValue() { fa_.numberFrames = FrameAveragerControlPrefs.getInt(NumberOfFramesKey, fa_.numberFrames); } + + public void updateStatus() { + try { + String avgString; + String avoidString = ""; + + if (fa_.numberFrames < 2) { + avgString = "Averaging is Disabled."; + avoidString = ""; + } else { + avgString = "Averaging " + fa_.numberFrames + " frames per image "; + if (fa_.avoidEngineChs_ == null) { + avoidString = "for All Channels."; + } else { + String str = channelsToAvoid.getText().trim().toString(); + if (str.contains(",") || str.contains(";")) { + avoidString = "Except " + fa_.avoidEngineChs_.length + " Channels, " + str + "."; + } else if (str.contains("-") || str.contains("=")) { + avoidString = "Except " + fa_.avoidEngineChs_.length + " Channels, " + + fa_.avoidEngineChs_[0] + " to " + + fa_.avoidEngineChs_[fa_.avoidEngineChs_.length - 1] + " (inclusive)."; + } else if (fa_.avoidEngineChs_.length == 1) { + avoidString = "Except " + fa_.avoidEngineChs_.length + " Channel, No. " + str + "."; + } + } + } + updateLabel(avgString + avoidString); + } catch (Exception ex) { + } + } + + public int[] stringToIntArray(String str) { + int[] intArray = parseString(str); + return intArray; + } + + public String intArrayToString(int[] intArray) { + if (intArray.length < 1) { + return null; + } + String str = Arrays.toString(intArray); + return str; + } + + public void updateLabel(String str) { + labelStatus.setText(str); + } + + public int[] parseString(String str) { + int[] intArray = null; + if (str.contains("-")) { + intArray = getHyphenStringToIntArray(str, "-"); + } else if (str.contains("=")) { + intArray = getHyphenStringToIntArray(str, "="); + } else if (str.contains(",")) { + intArray = getCommaStringToIntArray(str, ","); + } else if (str.contains(";")) { + intArray = getCommaStringToIntArray(str, ";"); + } else if (str.isEmpty() || str.trim().isEmpty()) { + intArray = null; + } else { + intArray = new int[1]; + intArray[0] = Integer.parseInt(str); + } + return intArray; + } + + public int[] getCommaStringToIntArray(String str, String regStr) { + String[] strArray = str.split(regStr); + int[] intArray = new int[strArray.length]; + for (int i = 0; i < strArray.length; i++) { + intArray[i] = Integer.parseInt(strArray[i]); + } + return intArray; + } + + public int[] getHyphenStringToIntArray(String str, String regStr) { + String[] strArray = str.split(regStr); + int[] intArrayTemp = new int[strArray.length]; + for (int i = 0; i < strArray.length; i++) { + intArrayTemp[i] = Integer.parseInt(strArray[i].trim()); + } + int n1 = intArrayTemp[0]; + int n2 = intArrayTemp[1]; + int[] intArray = new int[n2 - n1 + 1]; + for (int i = n1; i < n2 + 1; i++) { + intArray[i - n1] = i; + } + return intArray; + } - private void setPreferences() { - - FrameXpos = this.getX(); - FrameYpos = this.getY(); - - FrameAveragerControlPrefs.putInt(FrameXposKey, FrameXpos); - FrameAveragerControlPrefs.putInt(FrameYposKey, FrameYpos); - FrameAveragerControlPrefs.putInt(NumberOfFramesKey, fa_.numberFrames); + public static void showMessage(String msg) { + showNonBlockingMessage(JOptionPane.WARNING_MESSAGE, FrameAveragerPlugin.menuName, msg, getInstance()); + } + + public static void showMessage(String title, String msg) { + showNonBlockingMessage(JOptionPane.WARNING_MESSAGE, title, msg, getInstance()); } + static boolean showingMsg = false; + public static void showNonBlockingMessage(int msgType, String title, String message, Frame owningFrame_) { + if (null != owningFrame_) { + Object[] options = { "OK" }; + final JOptionPane optionPane = new JOptionPane(message, msgType, JOptionPane.DEFAULT_OPTION, null, options); + /* the false parameter is for not modal */ + final JDialog dialog = new JDialog(owningFrame_, title, false); + optionPane.addPropertyChangeListener( + new PropertyChangeListener() { + + public void propertyChange(PropertyChangeEvent e) { + String prop = e.getPropertyName(); + if (dialog.isVisible() && (e.getSource() == optionPane) && (prop.equals(JOptionPane.VALUE_PROPERTY))) { + dialog.setVisible(false); + showingMsg = false; + } + } + }); + + dialog.setContentPane(optionPane); + /* adapting the frame size to its content */ + dialog.pack(); + dialog.setLocationRelativeTo(owningFrame_); + dialog.setVisible(true); + showingMsg = true; + } + } +} + + private void updateNumFramesField() { + int num; + if (!showingMsg) { + if (!numFramesField.getText().isEmpty()) { + String str = numFramesField.getText().trim().toString(); + try { + num = (int) Integer.parseInt(str); + } catch(NumberFormatException e) { + System.out.println("CAUGHT: " + e.toString()); + System.out.println("Defaulting value to 4"); + num = 4; + } + fa_.setNumberFrames(num); + updateStatus(); + } else { + FrameAveragerConfigurator.showMessage("Number of Image Frames to average has to be an Integer"); + } + } else { + numFramesField.setText(String.valueOf(fa_.numberFrames)); + } + } + + private void channelAvoidance() { + if (!showingMsg) { + if (!lastChannelAvoidanceStr.equals(channelsToAvoid.getText())) { + if (fa_.core_.isSequenceRunning()) { + channelsToAvoid.setText(lastChannelAvoidanceStr); + FrameAveragerConfigurator.showMessage("Live mode is running ! Please stop before changing this field."); + } else if (fa_.tfa_.gui.isAcquisitionRunning()) { + channelsToAvoid.setText(lastChannelAvoidanceStr); + FrameAveragerConfigurator.showMessage("Acquisition is running ! Please stop before changing this field."); + } else { + updateChannelsToAvoid(); + fa_.stopAndClearRunnable(); + fa_.attachRunnable(); + + lastChannelAvoidanceStr = channelsToAvoid.getText(); + } + } + } else { + channelsToAvoid.setText(lastChannelAvoidanceStr); + } + } + + private void updateChannelsToAvoid() { + String str = channelsToAvoid.getText().trim().toString(); + int[] avoidChannels = stringToIntArray(str); + fa_.setAvoidDisplayChannels(avoidChannels); + fa_.setAvoidEngineChannels(avoidChannels); + updateStatus(); + } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -142,8 +280,6 @@ private void initComponents() { jLabel4 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jMenuBar1 = new javax.swing.JMenuBar(); - jMenu1 = new javax.swing.JMenu(); - jMenuItem1 = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Frame Averager"); @@ -208,19 +344,6 @@ public void focusLost(java.awt.event.FocusEvent evt) { jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N jLabel3.setText("Multi-Frame Averaging"); - - jMenu1.setText("Help"); - - jMenuItem1.setText("About"); - jMenuItem1.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - jMenuItem1ActionPerformed(evt); - } - }); - jMenu1.add(jMenuItem1); - - jMenuBar1.add(jMenu1); - setJMenuBar(jMenuBar1); org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); @@ -309,10 +432,6 @@ private void numFramesFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST updateNumFramesField(); }//GEN-LAST:event_numFramesFieldFocusLost - private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed - - }//GEN-LAST:event_jMenuItem1ActionPerformed - private void formFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_formFocusGained fa_.getDebugOptions(); }//GEN-LAST:event_formFocusGained @@ -343,57 +462,6 @@ private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:even } }//GEN-LAST:event_formWindowClosing - private void updateNumFramesField() { - int num; - if (!showingMsg) { - if (!numFramesField.getText().isEmpty()) { - String str = numFramesField.getText().trim().toString(); - try { - num = (int) Integer.parseInt(str); - } catch(NumberFormatException e) { - System.out.println("CAUGHT: " + e.toString()); - System.out.println("Defaulting value to 4"); - num = 4; - } - fa_.setNumberFrames(num); - updateStatus(); - } else { - FrameAveragerConfigurator.showMessage("Number of Image Frames to average has to be an Integer"); - } - } else { - numFramesField.setText(String.valueOf(fa_.numberFrames)); - } - } - - private void channelAvoidance() { - if (!showingMsg) { - if (!lastChannelAvoidanceStr.equals(channelsToAvoid.getText())) { - if (fa_.core_.isSequenceRunning()) { - channelsToAvoid.setText(lastChannelAvoidanceStr); - FrameAveragerConfigurator.showMessage("Live mode is running ! Please stop before changing this field."); - } else if (fa_.tfa_.gui.isAcquisitionRunning()) { - channelsToAvoid.setText(lastChannelAvoidanceStr); - FrameAveragerConfigurator.showMessage("Acquisition is running ! Please stop before changing this field."); - } else { - updateChannelsToAvoid(); - fa_.stopAndClearRunnable(); - fa_.attachRunnable(); - - lastChannelAvoidanceStr = channelsToAvoid.getText(); - } - } - } else { - channelsToAvoid.setText(lastChannelAvoidanceStr); - } - } - - private void updateChannelsToAvoid() { - String str = channelsToAvoid.getText().trim().toString(); - int[] avoidChannels = stringToIntArray(str); - fa_.setAvoidDisplayChannels(avoidChannels); - fa_.setAvoidEngineChannels(avoidChannels); - updateStatus(); - } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextField channelsToAvoid; private javax.swing.JCheckBox enabledCheckBox_; @@ -401,136 +469,7 @@ private void updateChannelsToAvoid() { private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; - private javax.swing.JMenu jMenu1; private javax.swing.JMenuBar jMenuBar1; - private javax.swing.JMenuItem jMenuItem1; private javax.swing.JLabel labelStatus; private javax.swing.JTextField numFramesField; // End of variables declaration//GEN-END:variables - - public void updateStatus() { - try { - String avgString; - String avoidString = ""; - - if (fa_.numberFrames < 2) { - avgString = "Averaging is Disabled."; - avoidString = ""; - } else { - avgString = "Averaging " + fa_.numberFrames + " frames per image "; - if (fa_.avoidEngineChs_ == null) { - avoidString = "for All Channels."; - } else { - String str = channelsToAvoid.getText().trim().toString(); - if (str.contains(",") || str.contains(";")) { - avoidString = "Except " + fa_.avoidEngineChs_.length + " Channels, " + str + "."; - } else if (str.contains("-") || str.contains("=")) { - avoidString = "Except " + fa_.avoidEngineChs_.length + " Channels, " - + fa_.avoidEngineChs_[0] + " to " - + fa_.avoidEngineChs_[fa_.avoidEngineChs_.length - 1] + " (inclusive)."; - } else if (fa_.avoidEngineChs_.length == 1) { - avoidString = "Except " + fa_.avoidEngineChs_.length + " Channel, No. " + str + "."; - } - } - } - updateLabel(avgString + avoidString); - } catch (Exception ex) { - } - } - - public int[] stringToIntArray(String str) { - int[] intArray = parseString(str); - return intArray; - } - - public String intArrayToString(int[] intArray) { - if (intArray.length < 1) { - return null; - } - String str = Arrays.toString(intArray); - return str; - } - - public void updateLabel(String str) { - labelStatus.setText(str); - } - - public int[] parseString(String str) { - int[] intArray = null; - if (str.contains("-")) { - intArray = getHyphenStringToIntArray(str, "-"); - } else if (str.contains("=")) { - intArray = getHyphenStringToIntArray(str, "="); - } else if (str.contains(",")) { - intArray = getCommaStringToIntArray(str, ","); - } else if (str.contains(";")) { - intArray = getCommaStringToIntArray(str, ";"); - } else if (str.isEmpty() || str.trim().isEmpty()) { - intArray = null; - } else { - intArray = new int[1]; - intArray[0] = Integer.parseInt(str); - } - return intArray; - } - - public int[] getCommaStringToIntArray(String str, String regStr) { - String[] strArray = str.split(regStr); - int[] intArray = new int[strArray.length]; - for (int i = 0; i < strArray.length; i++) { - intArray[i] = Integer.parseInt(strArray[i]); - } - return intArray; - } - - public int[] getHyphenStringToIntArray(String str, String regStr) { - String[] strArray = str.split(regStr); - int[] intArrayTemp = new int[strArray.length]; - for (int i = 0; i < strArray.length; i++) { - intArrayTemp[i] = Integer.parseInt(strArray[i].trim()); - } - int n1 = intArrayTemp[0]; - int n2 = intArrayTemp[1]; - int[] intArray = new int[n2 - n1 + 1]; - for (int i = n1; i < n2 + 1; i++) { - intArray[i - n1] = i; - } - return intArray; - } - - public static void showMessage(String msg) { - showNonBlockingMessage(JOptionPane.WARNING_MESSAGE, FrameAveragerPlugin.menuName, msg, getInstance()); - } - - public static void showMessage(String title, String msg) { - showNonBlockingMessage(JOptionPane.WARNING_MESSAGE, title, msg, getInstance()); - } - - static boolean showingMsg = false; - public static void showNonBlockingMessage(int msgType, String title, String message, Frame owningFrame_) { - if (null != owningFrame_) { - Object[] options = { "OK" }; - final JOptionPane optionPane = new JOptionPane(message, msgType, JOptionPane.DEFAULT_OPTION, null, options); - /* the false parameter is for not modal */ - final JDialog dialog = new JDialog(owningFrame_, title, false); - optionPane.addPropertyChangeListener( - new PropertyChangeListener() { - - public void propertyChange(PropertyChangeEvent e) { - String prop = e.getPropertyName(); - if (dialog.isVisible() && (e.getSource() == optionPane) && (prop.equals(JOptionPane.VALUE_PROPERTY))) { - dialog.setVisible(false); - showingMsg = false; - } - } - }); - - dialog.setContentPane(optionPane); - /* adapting the frame size to its content */ - dialog.pack(); - dialog.setLocationRelativeTo(owningFrame_); - dialog.setVisible(true); - showingMsg = true; - } - } -} From 2221950d9ab6fe8d03bd785f7f230b101ddb37a1 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 15:42:53 -0500 Subject: [PATCH 15/36] remove a bunch of unneccesary stuff. --- .../cdp/frameaverage/FrameAveragerPlugin.java | 13 ---- .../frameaverage/FrameAveragerProcessor.java | 74 ------------------- 2 files changed, 87 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java index 6c8cd00..6274cdf 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java @@ -51,10 +51,6 @@ public class FrameAveragerPlugin implements ProcessorPlugin, SciJavaPlugin { private Studio studio_; - public static Class getProcessorClass() { - return FrameAveragerProcessor.class; - } - @Override public ProcessorConfigurator createConfigurator(PropertyMap settings) { return new FrameAveragerConfigurator(settings, studio_); @@ -69,15 +65,6 @@ public void setContext(Studio studio) { studio_ = studio; } - @Override - public void show() { - if (frame == null) { - frame = fa.getControlFrame(); - frame.setLocation(fa.controlFrame_.FrameXpos, fa.controlFrame_.FrameYpos); - } - frame.setVisible(true); - } - @Override public String getHelpText() { return tooltipDescription; diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java index 5695e21..7e3fb0d 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -46,22 +46,7 @@ public class FrameAveragerProcessor extends Processor { int imgDepth; FrameAveragerPlugin tfa; TaggedImage imageOnError; - - @Override - public void setApp(ScriptInterface gui) { - gui_ = gui; - if (tfa == null) { - tfa = new FrameAveragerPlugin(); - tfa.setApp(gui_); - this.setName(FrameAveragerPlugin.menuName); - tfa.fa.processor = this; - tfa.frame = tfa.fa.getControlFrame(); - } - } - public void setTFA(FrameAveragerPlugin tf) { - tfa = tf; - } @Override protected void process() { @@ -202,34 +187,6 @@ public void run() { } } } - - public boolean testForEmptyArray() { - for (int i=1; i < tfa.fa.taggedImageArray.length; i++) { - if (tfa.fa.taggedImageArray[i] == null) { - return true; - } - } - - return false; - } - - public boolean isPartiallyFilledArray() { - for (int i=0; i < tfa.fa.taggedImageArray.length; i++) { - if (tfa.fa.taggedImageArray[i] == null) { - return true; - } - } - - return false; - } - - public boolean isFirstEmptyArray() { - if (tfa.fa.taggedImageArray[1] == null) { - return true; - } - - return false; - } private void computeProduceAndEmpty(TaggedImage[] taggedImageArrayTemp) { @@ -293,11 +250,6 @@ private void computeProduceAndEmpty(TaggedImage[] taggedImageArrayTemp) { } } - public void emptyImageArray() { - for (int i = 0; i < tfa.fa.taggedImageArray.length; i++) { - tfa.fa.taggedImageArray[i] = null; - } - } public void runAcquireFromRunningSequence() { if (tfa.fa.numberFrames > 1) { @@ -411,34 +363,8 @@ public void acquireImagesStartSequence(boolean stopAtEnd) { } } - public DataProcessor getDataProcessor() { - return (DataProcessor) this; - } - public static boolean isPoison(TaggedImage image) { return ((image.pix == null) || (image.tags == null)); } - @Override - public void makeConfigurationGUI() { - if (tfa==null) { - tfa = new FrameAveragerPlugin(); - tfa.setApp(gui_); - tfa.fa.processor = this; - tfa.frame = tfa.fa.getControlFrame(); - tfa.gui.addMMBackgroundListener(tfa.frame); - } else if (tfa.frame==null) { - tfa.frame = tfa.fa.getControlFrame(); - tfa.gui.addMMBackgroundListener(tfa.frame); - } - tfa.frame.setVisible(true); - } - - @Override - public void dispose() { - if (tfa.frame != null) { - tfa.frame.dispose(); - tfa.frame = null; - } - } } From 128e6c75de68f1383eb473244065344f6e88f384 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 15:53:58 -0500 Subject: [PATCH 16/36] remove a bunch of channel avoidance stuff --- .../FrameAveragerConfigurator.form | 31 +--- .../FrameAveragerConfigurator.java | 144 ++---------------- 2 files changed, 15 insertions(+), 160 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form index 290485b..b539f3f 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form @@ -45,15 +45,9 @@ - - - - + - - - - + @@ -80,12 +74,7 @@ - - - - - - + @@ -124,20 +113,6 @@ - - - - - - - - - - - - - - diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java index b74ad28..f709356 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java @@ -36,21 +36,14 @@ import org.micromanager.data.ProcessorConfigurator; import org.micromanager.PropertyMap; import org.micromanager.Studio; +import org.micromanager.LogManager; public class FrameAveragerConfigurator extends MMFrame implements ProcessorConfigurator { - /* TODO - * 1. Attach Runnable channel specific if using channel avoidance - * Currently this is handled via DataProcessor which would skip for avoided channels - */ - private final Studio studio_; private final PropertyMap settings_; - /* - private String lastChannelAvoidanceStr = ""; - */ /** * Creates new form FrameAveragerControls */ @@ -60,7 +53,6 @@ public FrameAveragerConfigurator(PropertyMap settings, Studio studio) { initComponents(); loadSettingValue(); - lastChannelAvoidanceStr = channelsToAvoid.getText(); super.loadAndRestorePosition(200, 200); } @@ -73,7 +65,6 @@ public void update() { if (!this.enabledCheckBox_.isSelected()) { updateLabel(""); } else { - // ToDo: Add disable avoid virtual channels input box updateStatus(); } @@ -87,29 +78,13 @@ private void loadSettingValue() { public void updateStatus() { try { String avgString; - String avoidString = ""; if (fa_.numberFrames < 2) { avgString = "Averaging is Disabled."; - avoidString = ""; } else { avgString = "Averaging " + fa_.numberFrames + " frames per image "; - if (fa_.avoidEngineChs_ == null) { - avoidString = "for All Channels."; - } else { - String str = channelsToAvoid.getText().trim().toString(); - if (str.contains(",") || str.contains(";")) { - avoidString = "Except " + fa_.avoidEngineChs_.length + " Channels, " + str + "."; - } else if (str.contains("-") || str.contains("=")) { - avoidString = "Except " + fa_.avoidEngineChs_.length + " Channels, " - + fa_.avoidEngineChs_[0] + " to " - + fa_.avoidEngineChs_[fa_.avoidEngineChs_.length - 1] + " (inclusive)."; - } else if (fa_.avoidEngineChs_.length == 1) { - avoidString = "Except " + fa_.avoidEngineChs_.length + " Channel, No. " + str + "."; - } - } } - updateLabel(avgString + avoidString); + updateLabel(avgString); } catch (Exception ex) { } } @@ -174,42 +149,8 @@ public int[] getHyphenStringToIntArray(String str, String regStr) { return intArray; } - public static void showMessage(String msg) { - showNonBlockingMessage(JOptionPane.WARNING_MESSAGE, FrameAveragerPlugin.menuName, msg, getInstance()); - } - public static void showMessage(String title, String msg) { - showNonBlockingMessage(JOptionPane.WARNING_MESSAGE, title, msg, getInstance()); - } - - static boolean showingMsg = false; - public static void showNonBlockingMessage(int msgType, String title, String message, Frame owningFrame_) { - if (null != owningFrame_) { - Object[] options = { "OK" }; - final JOptionPane optionPane = new JOptionPane(message, msgType, JOptionPane.DEFAULT_OPTION, null, options); - /* the false parameter is for not modal */ - final JDialog dialog = new JDialog(owningFrame_, title, false); - optionPane.addPropertyChangeListener( - new PropertyChangeListener() { - - public void propertyChange(PropertyChangeEvent e) { - String prop = e.getPropertyName(); - if (dialog.isVisible() && (e.getSource() == optionPane) && (prop.equals(JOptionPane.VALUE_PROPERTY))) { - dialog.setVisible(false); - showingMsg = false; - } - } - }); - - dialog.setContentPane(optionPane); - /* adapting the frame size to its content */ - dialog.pack(); - dialog.setLocationRelativeTo(owningFrame_); - dialog.setVisible(true); - showingMsg = true; - } - } -} + private void updateNumFramesField() { int num; @@ -226,42 +167,13 @@ private void updateNumFramesField() { fa_.setNumberFrames(num); updateStatus(); } else { - FrameAveragerConfigurator.showMessage("Number of Image Frames to average has to be an Integer"); + LogManager.showMessage("Number of Image Frames to average has to be an Integer"); } } else { numFramesField.setText(String.valueOf(fa_.numberFrames)); } } - - private void channelAvoidance() { - if (!showingMsg) { - if (!lastChannelAvoidanceStr.equals(channelsToAvoid.getText())) { - if (fa_.core_.isSequenceRunning()) { - channelsToAvoid.setText(lastChannelAvoidanceStr); - FrameAveragerConfigurator.showMessage("Live mode is running ! Please stop before changing this field."); - } else if (fa_.tfa_.gui.isAcquisitionRunning()) { - channelsToAvoid.setText(lastChannelAvoidanceStr); - FrameAveragerConfigurator.showMessage("Acquisition is running ! Please stop before changing this field."); - } else { - updateChannelsToAvoid(); - fa_.stopAndClearRunnable(); - fa_.attachRunnable(); - - lastChannelAvoidanceStr = channelsToAvoid.getText(); - } - } - } else { - channelsToAvoid.setText(lastChannelAvoidanceStr); - } - } - private void updateChannelsToAvoid() { - String str = channelsToAvoid.getText().trim().toString(); - int[] avoidChannels = stringToIntArray(str); - fa_.setAvoidDisplayChannels(avoidChannels); - fa_.setAvoidEngineChannels(avoidChannels); - updateStatus(); - } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -274,8 +186,6 @@ private void initComponents() { numFramesField = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); enabledCheckBox_ = new javax.swing.JCheckBox(); - jLabel2 = new javax.swing.JLabel(); - channelsToAvoid = new javax.swing.JTextField(); labelStatus = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); @@ -325,20 +235,6 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { } }); - jLabel2.setText("Avoid Channel(s) (zero-based)"); - - channelsToAvoid.setHorizontalAlignment(javax.swing.JTextField.CENTER); - channelsToAvoid.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - channelsToAvoidActionPerformed(evt); - } - }); - channelsToAvoid.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - channelsToAvoidFocusLost(evt); - } - }); - jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel4.setText("eg. 1,2 or 1-5"); @@ -354,13 +250,9 @@ public void focusLost(java.awt.event.FocusEvent evt) { .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() - .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) - .add(jLabel2) - .add(jLabel1)) + .add(jLabel1) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) - .add(org.jdesktop.layout.GroupLayout.TRAILING, channelsToAvoid, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 99, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) - .add(org.jdesktop.layout.GroupLayout.TRAILING, numFramesField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 99, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) + .add(numFramesField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 99, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) .add(labelStatus, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .add(layout.createSequentialGroup() .add(jLabel3) @@ -380,11 +272,7 @@ public void focusLost(java.awt.event.FocusEvent evt) { .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel1) .add(numFramesField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) - .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) - .add(jLabel2) - .add(channelsToAvoid, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) - .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) + .add(37, 37, 37) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel4) .add(enabledCheckBox_)) @@ -404,11 +292,11 @@ private void enabledCheckBox_ActionPerformed(java.awt.event.ActionEvent evt) {// if (!showingMsg) { if (fa_.core_.isSequenceRunning()) { enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - FrameAveragerConfigurator.showMessage("Live mode is running ! Please stop before enabling/disabling."); + LogManager.showMessage("Live mode is running ! Please stop before enabling/disabling."); return; } else if (fa_.tfa_.gui.isAcquisitionRunning()) { enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - FrameAveragerConfigurator.showMessage("Acquisition is running ! Please stop before enabling/disabling."); + LogManager.showMessage("Acquisition is running ! Please stop before enabling/disabling."); return; } update(); @@ -420,13 +308,6 @@ private void enabledCheckBox_ActionPerformed(java.awt.event.ActionEvent evt) {// private void numFramesFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_numFramesFieldActionPerformed updateNumFramesField(); }//GEN-LAST:event_numFramesFieldActionPerformed - private void channelsToAvoidActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_channelsToAvoidActionPerformed - channelAvoidance(); - }//GEN-LAST:event_channelsToAvoidActionPerformed - - private void channelsToAvoidFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_channelsToAvoidFocusLost - channelAvoidance(); - }//GEN-LAST:event_channelsToAvoidFocusLost private void numFramesFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_numFramesFieldFocusLost updateNumFramesField(); @@ -444,12 +325,12 @@ private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:even if (fa_.core_.isSequenceRunning()) { if (enabledCheckBox_.isSelected()) { setVisible( true ); - FrameAveragerConfigurator.showMessage("Live mode is running with FrameAverager ! Please stop Live before closing FrameAverager."); + LogManager.showMessage("Live mode is running with FrameAverager ! Please stop Live before closing FrameAverager."); } } else if (fa_.tfa_.gui.isAcquisitionRunning()) { if (enabledCheckBox_.isSelected()) { setVisible( true ); - FrameAveragerConfigurator.showMessage("Acquisition is running with FrameAverager ! Please stop Acquisition before closing FrameAverager."); + LogManager.showMessage("Acquisition is running with FrameAverager ! Please stop Acquisition before closing FrameAverager."); } } else { if (enabledCheckBox_.isSelected()) { @@ -463,13 +344,12 @@ private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:even }//GEN-LAST:event_formWindowClosing // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JTextField channelsToAvoid; private javax.swing.JCheckBox enabledCheckBox_; private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JMenuBar jMenuBar1; private javax.swing.JLabel labelStatus; private javax.swing.JTextField numFramesField; // End of variables declaration//GEN-END:variables +} \ No newline at end of file From 55ab1531b4d5890c2ac36e7e497acbb69d3741e1 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 16:57:36 -0500 Subject: [PATCH 17/36] get messages working.add getsettings method --- .../FrameAveragerConfigurator.java | 129 +++++------------- 1 file changed, 33 insertions(+), 96 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java index f709356..be916af 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java @@ -43,6 +43,7 @@ public class FrameAveragerConfigurator extends MMFrame implements ProcessorConfi private final Studio studio_; private final PropertyMap settings_; + private final LogManager log_; /** * Creates new form FrameAveragerControls @@ -50,11 +51,18 @@ public class FrameAveragerConfigurator extends MMFrame implements ProcessorConfi public FrameAveragerConfigurator(PropertyMap settings, Studio studio) { studio_ = studio; settings_ = settings; + log_ = studio.logs(); initComponents(); loadSettingValue(); super.loadAndRestorePosition(200, 200); } + + public PropertyMap getSettings() { + PropertyMap.PropertyMapBuilder builder = studio_.data().getPropertyMapBuilder(); + builder.putInt("numAverages", Integer.parseInt(numFramesField.getText().trim())); + return builder.build(); + } public void update() { if (this.enabledCheckBox_.isSelected()) { @@ -63,7 +71,7 @@ public void update() { fa_.enable(this.enabledCheckBox_.isSelected()); if (!this.enabledCheckBox_.isSelected()) { - updateLabel(""); + labelStatus.setText(""); } else { updateStatus(); } @@ -84,93 +92,26 @@ public void updateStatus() { } else { avgString = "Averaging " + fa_.numberFrames + " frames per image "; } - updateLabel(avgString); + labelStatus.setText(avgString); } catch (Exception ex) { } } - public int[] stringToIntArray(String str) { - int[] intArray = parseString(str); - return intArray; - } - - public String intArrayToString(int[] intArray) { - if (intArray.length < 1) { - return null; - } - String str = Arrays.toString(intArray); - return str; - } - - public void updateLabel(String str) { - labelStatus.setText(str); - } - - public int[] parseString(String str) { - int[] intArray = null; - if (str.contains("-")) { - intArray = getHyphenStringToIntArray(str, "-"); - } else if (str.contains("=")) { - intArray = getHyphenStringToIntArray(str, "="); - } else if (str.contains(",")) { - intArray = getCommaStringToIntArray(str, ","); - } else if (str.contains(";")) { - intArray = getCommaStringToIntArray(str, ";"); - } else if (str.isEmpty() || str.trim().isEmpty()) { - intArray = null; - } else { - intArray = new int[1]; - intArray[0] = Integer.parseInt(str); - } - return intArray; - } - - public int[] getCommaStringToIntArray(String str, String regStr) { - String[] strArray = str.split(regStr); - int[] intArray = new int[strArray.length]; - for (int i = 0; i < strArray.length; i++) { - intArray[i] = Integer.parseInt(strArray[i]); - } - return intArray; - } - - public int[] getHyphenStringToIntArray(String str, String regStr) { - String[] strArray = str.split(regStr); - int[] intArrayTemp = new int[strArray.length]; - for (int i = 0; i < strArray.length; i++) { - intArrayTemp[i] = Integer.parseInt(strArray[i].trim()); - } - int n1 = intArrayTemp[0]; - int n2 = intArrayTemp[1]; - int[] intArray = new int[n2 - n1 + 1]; - for (int i = n1; i < n2 + 1; i++) { - intArray[i - n1] = i; - } - return intArray; - } - - - - private void updateNumFramesField() { int num; - if (!showingMsg) { - if (!numFramesField.getText().isEmpty()) { - String str = numFramesField.getText().trim().toString(); - try { - num = (int) Integer.parseInt(str); - } catch(NumberFormatException e) { - System.out.println("CAUGHT: " + e.toString()); - System.out.println("Defaulting value to 4"); - num = 4; - } - fa_.setNumberFrames(num); - updateStatus(); - } else { - LogManager.showMessage("Number of Image Frames to average has to be an Integer"); + if (!numFramesField.getText().isEmpty()) { + String str = numFramesField.getText().trim().toString(); + try { + num = (int) Integer.parseInt(str); + } catch(NumberFormatException e) { + System.out.println("CAUGHT: " + e.toString()); + System.out.println("Defaulting value to 4"); + num = 4; } + fa_.setNumberFrames(num); + updateStatus(); } else { - numFramesField.setText(String.valueOf(fa_.numberFrames)); + log_.showMessage("Number of Image Frames to average has to be an Integer"); } } @@ -289,20 +230,16 @@ private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event }//GEN-LAST:event_formWindowClosed private void enabledCheckBox_ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_enabledCheckBox_ActionPerformed - if (!showingMsg) { - if (fa_.core_.isSequenceRunning()) { - enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - LogManager.showMessage("Live mode is running ! Please stop before enabling/disabling."); - return; - } else if (fa_.tfa_.gui.isAcquisitionRunning()) { - enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - LogManager.showMessage("Acquisition is running ! Please stop before enabling/disabling."); - return; - } - update(); - } else { - enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - } + if (fa_.core_.isSequenceRunning()) { + enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); + log_.showMessage("Live mode is running ! Please stop before enabling/disabling."); + return; + } else if (fa_.tfa_.gui.isAcquisitionRunning()) { + enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); + log_.showMessage("Acquisition is running ! Please stop before enabling/disabling."); + return; + } + update(); }//GEN-LAST:event_enabledCheckBox_ActionPerformed private void numFramesFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_numFramesFieldActionPerformed @@ -325,12 +262,12 @@ private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:even if (fa_.core_.isSequenceRunning()) { if (enabledCheckBox_.isSelected()) { setVisible( true ); - LogManager.showMessage("Live mode is running with FrameAverager ! Please stop Live before closing FrameAverager."); + log_.showMessage("Live mode is running with FrameAverager ! Please stop Live before closing FrameAverager."); } } else if (fa_.tfa_.gui.isAcquisitionRunning()) { if (enabledCheckBox_.isSelected()) { setVisible( true ); - LogManager.showMessage("Acquisition is running with FrameAverager ! Please stop Acquisition before closing FrameAverager."); + log_.showMessage("Acquisition is running with FrameAverager ! Please stop Acquisition before closing FrameAverager."); } } else { if (enabledCheckBox_.isSelected()) { From 48579d1227eafc7913b286b9bdc8df44321beefe Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 17:52:47 -0500 Subject: [PATCH 18/36] ignore build and remove unneeded class --- .gitignore | 19 +- .../mbl/cdp/frameaverage/FrameAverager.java | 280 ------------------ 2 files changed, 10 insertions(+), 289 deletions(-) delete mode 100644 FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java diff --git a/.gitignore b/.gitignore index 6217e31..502cf71 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,10 @@ -/FrameAverager.1.4.18/build/ -/FrameAverager.1.4.16/build/ -/FrameAverager/build/ -.gitignore -/FrameAverager/nbproject/private/ -/FrameAverager.1.4.16/nbproject/private/ -/FrameAverager.1.4.18/nbproject/private/ -/BitDepthDowngrader/nbproject/private/ -/BitDepthDowngrader/build/ \ No newline at end of file +/FrameAverager.1.4.18/build/ +/FrameAverager.1.4.16/build/ +/FrameAverager/build/ +.gitignore +/FrameAverager/nbproject/private/ +/FrameAverager.1.4.16/nbproject/private/ +/FrameAverager.1.4.18/nbproject/private/ +/BitDepthDowngrader/nbproject/private/ +/BitDepthDowngrader/build/ +FrameAverager.2.0/build/ diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java deleted file mode 100644 index 4c99110..0000000 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAverager.java +++ /dev/null @@ -1,280 +0,0 @@ -package edu.mbl.cdp.frameaverage; - -/* - * Copyright © 2009 – 2013, Marine Biological Laboratory - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of - * the authors and should not be interpreted as representing official policies, - * either expressed or implied, of any organization. - * - * Multiple-Frame Averaging plug-in for Micro-Manager - * @author Amitabh Verma (averma@mbl.edu), Grant Harris (gharris@mbl.edu) - * Marine Biological Laboratory, Woods Hole, Mass. - * - */ - -import ij.ImageStack; -import ij.gui.ImageWindow; -import java.util.prefs.Preferences; -import javax.swing.JFrame; -import mmcorej.CMMCore; -import mmcorej.TaggedImage; -import org.micromanager.MMOptions; -import org.micromanager.acquisition.AcquisitionWrapperEngine; -import org.micromanager.api.DataProcessor; -import org.micromanager.imagedisplay.AcquisitionVirtualStack; -import org.micromanager.imagedisplay.VirtualAcquisitionDisplay; -import org.micromanager.utils.GUIUtils; -import org.micromanager.utils.ImageFocusListener; -import org.micromanager.utils.ReportingUtils; - -public class FrameAverager implements ImageFocusListener { - - static final String METADATAKEY = "FramesAveraged"; - CMMCore core_; - FrameAveragerPlugin tfa_; - AcquisitionWrapperEngine engineWrapper_; - - FrameAveragerProcessor processor; - public FrameAveragerConfigurator controlFrame_; - - public boolean debugLogEnabled_ = false; - public boolean isEnabledForImageAcquisition = false; - - public int numberFrames = 4; // 4 frames by default - int[] avoidDisplayChs_ = null; - int[] avoidEngineChs_ = null; - // shared... - public TaggedImage[] taggedImageArray = null; - - public VirtualAcquisitionDisplay display_; - public VirtualAcquisitionDisplay displayLive_; - - boolean isAdditionalDelayReg = false; - static String CameraNameProperty = "CameraName"; - static String[] AdditionalDelayCams = {"Retiga 4000R"}; - - public FrameAverager(AcquisitionWrapperEngine engineWrapper, CMMCore core, FrameAveragerPlugin tfa) { - - engineWrapper_ = engineWrapper; - core_ = core; - tfa_ = tfa; - - additionalDelayCheck(); - setNumberFrames(numberFrames); - getDebugOptions(); - - GUIUtils.registerImageFocusListener(this); // Image Window listener - } - - - final void additionalDelayCheck() { - try { - String cam = core_.getCameraDevice(); - String camName = core_.getProperty(cam, CameraNameProperty); - for (int i=0; i < AdditionalDelayCams.length; i++) { - if (camName.equals(AdditionalDelayCams[i])) { - isAdditionalDelayReg = true; - } else { - isAdditionalDelayReg = false; - } - } - } catch (Exception ex) { - isAdditionalDelayReg = false; - ReportingUtils.logError(ex); - } - } - - - public void UpdateEngineAndCore() { - if (tfa_ != null) { - engineWrapper_ = tfa_.getAcquisitionWrapperEngine(); - core_ = tfa_.getCMMCore(); - } - } - - public void getDebugOptions() { - Preferences root = Preferences.userNodeForPackage(MMOptions.class); - Preferences prefs = root.node(root.absolutePath() + "/" + "MMOptions"); - debugLogEnabled_ = prefs.getBoolean("DebugLog", debugLogEnabled_); - } - - public void attachRunnable() { - Runnable setPauseAndAcquire = new FrameAveragerRunnable(this); - // The runnable is attached to the channels for which there will be frame averaging. - // 'Engine channels' to avoid are not included. - if (avoidEngineChs_ == null || engineWrapper_.getChannels().size()==1) { - engineWrapper_.attachRunnable(-1, -1, -1, -1, setPauseAndAcquire); // t, p, s, c - } else if (engineWrapper_.getChannels().size() < avoidEngineChs_[avoidEngineChs_.length-1]) { - engineWrapper_.attachRunnable(-1, -1, -1, -1, setPauseAndAcquire); // t, p, s, c - } else { - for (int i = 0; i < engineWrapper_.getChannels().size(); i++) { - boolean bool = true; - for (int j = 0; j < avoidEngineChs_.length; j++) { - if (i == avoidEngineChs_[j]) { - bool = false; - } - } - if (bool) { - engineWrapper_.attachRunnable(-1, -1, -1, i, setPauseAndAcquire); - } - } - } - if (debugLogEnabled_) { - ReportingUtils.logMessage("FrameAvg: runnable attached"); - } - } - - public int getNumberFrames() { - return numberFrames; - } - - public void setNumberFrames(int numberFrames) { - this.numberFrames = numberFrames; - bufferArraySpace(); - } - - public void bufferArraySpace() { - taggedImageArray = new TaggedImage[numberFrames]; - } - - // Diplay channels include Engine channels and Virtual channels - public void setAvoidDisplayChannels(int[] channelsToAvoid) { - this.avoidDisplayChs_ = channelsToAvoid; - } - - // Specifies channels - public void setAvoidEngineChannels(int[] channelsToAvoid) { - this.avoidEngineChs_ = channelsToAvoid; - } - - public void enable(boolean enableAveraging) { - if (enableAveraging) { - startProcessor(); - attachRunnable(); - } else { - // Disable - stopAndClearProcessor(); - stopAndClearRunnable(); - } - } - - public void startProcessor() { - try { - attachDataProcessor(); - } catch (Exception ex) { - } - } - - public void attachDataProcessor() { - if (processor==null) { - processor = new FrameAveragerProcessor(); - processor.setName(FrameAveragerPlugin.menuName); - processor.setTFA(tfa_); - processor.setApp(tfa_.gui); - } - engineWrapper_.addImageProcessor(processor); - } - - public void stopAndClearProcessor() { - if (processor != null) { - processor.requestStop(); - } - try { - engineWrapper_.removeImageProcessor(processor.getDataProcessor()); - - if (debugLogEnabled_) { - ReportingUtils.logMessage("FrameAvg: processor removed"); - } - } catch (Exception ex) { - } - } - - public void stopAndClearRunnable() { - try { - engineWrapper_.clearRunnables(); // Potentially dangerous - needs specific clearRunnable(X) - - if (debugLogEnabled_) { - ReportingUtils.logMessage("FrameAvg: runnable removed"); - } - } catch (Exception ex) { - } - } - - public void acquireImagesFromRunningSequence() { - processor.runAcquireFromRunningSequence(); - } - - public void acquireImagesStartSequence() { - processor.runAcquireStartSequence(); - } - - public DataProcessor getDataProcessor() { - return processor.getDataProcessor(); - } - - public JFrame getControlFrame() { - if (controlFrame_ == null) { - controlFrame_ = new FrameAveragerConfigurator(this); - } - return controlFrame_; - } - - - @Override - public void focusReceived(ImageWindow focusedWindow) { - // discard if closed - if (focusedWindow == null) { - return; - } - // discard Snap/Live Window - if (focusedWindow != null) { - String str = focusedWindow.getTitle(); - if (focusedWindow.getTitle().startsWith("Snap/Live Window") || str.equals(" (100%)")) { - ImageStack ImpStack = focusedWindow.getImagePlus().getImageStack(); - if (ImpStack instanceof AcquisitionVirtualStack) { - displayLive_ = ((AcquisitionVirtualStack) ImpStack).getVirtualAcquisitionDisplay(); - } else { - displayLive_ = null; - } - return; - } - } - - if (!focusedWindow.isClosed()) { - ImageStack ImpStack = focusedWindow.getImagePlus().getImageStack(); - VirtualAcquisitionDisplay display; - if (ImpStack instanceof AcquisitionVirtualStack) { - display = ((AcquisitionVirtualStack) ImpStack).getVirtualAcquisitionDisplay(); - if (display.acquisitionIsRunning()) { - display_ = display; - display_.show(); - } - } else { - if (display_!=null && !display_.acquisitionIsRunning()) { - display_ = null; - } - } - } - } - -} From 892696c4a323f7edb5c3d4d63ef6f0395af9fc34 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 17:55:40 -0500 Subject: [PATCH 19/36] declare the plugin as a scijava plugin --- .../cdp/frameaverage/FrameAveragerPlugin.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java index 6274cdf..213b875 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java @@ -40,8 +40,11 @@ import org.micromanager.data.ProcessorConfigurator; import org.micromanager.data.ProcessorFactory; import org.micromanager.PropertyMap; + import org.scijava.plugin.SciJavaPlugin; - +import org.scijava.plugin.Plugin; + +@Plugin(type = ProcessorPlugin.class) public class FrameAveragerPlugin implements ProcessorPlugin, SciJavaPlugin { public static String menuName = "Frame Averager"; @@ -49,8 +52,13 @@ public class FrameAveragerPlugin implements ProcessorPlugin, SciJavaPlugin { public static String versionNumber = "1.1"; public static String copyright = "Nick Anthony"; - private Studio studio_; - + private Studio studio_; + + @Override + public void setContext(Studio studio) { + studio_ = studio; + } + @Override public ProcessorConfigurator createConfigurator(PropertyMap settings) { return new FrameAveragerConfigurator(settings, studio_); @@ -60,10 +68,6 @@ public ProcessorConfigurator createConfigurator(PropertyMap settings) { public ProcessorFactory createFactory(PropertyMap settings) { return new FrameAveragerFactory(studio_, settings); } - @Override - public void setContext(Studio studio) { - studio_ = studio; - } @Override public String getHelpText() { From 71066c364aad5a8e4378c73e7a5cd8f9410e14ea Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 17:56:14 -0500 Subject: [PATCH 20/36] replace a bunch of references to fa. simplify --- .../FrameAveragerConfigurator.java | 57 ++++++------------- 1 file changed, 17 insertions(+), 40 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java index be916af..a3e8cfd 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java @@ -58,43 +58,26 @@ public FrameAveragerConfigurator(PropertyMap settings, Studio studio) { super.loadAndRestorePosition(200, 200); } + @Override public PropertyMap getSettings() { PropertyMap.PropertyMapBuilder builder = studio_.data().getPropertyMapBuilder(); builder.putInt("numAverages", Integer.parseInt(numFramesField.getText().trim())); return builder.build(); } - public void update() { - if (this.enabledCheckBox_.isSelected()) { - fa_.UpdateEngineAndCore(); - } - - fa_.enable(this.enabledCheckBox_.isSelected()); - if (!this.enabledCheckBox_.isSelected()) { - labelStatus.setText(""); - } else { - updateStatus(); - } - - fa_.isEnabledForImageAcquisition = this.enabledCheckBox_.isSelected(); + @Override + public void cleanup() { + dispose(); } - private void loadSettingValue() { - fa_.numberFrames = FrameAveragerControlPrefs.getInt(NumberOfFramesKey, fa_.numberFrames); + @Override + public void showGUI() { + pack(); + setVisible(true); } - - public void updateStatus() { - try { - String avgString; - - if (fa_.numberFrames < 2) { - avgString = "Averaging is Disabled."; - } else { - avgString = "Averaging " + fa_.numberFrames + " frames per image "; - } - labelStatus.setText(avgString); - } catch (Exception ex) { - } + + private void loadSettingValue() { + numFramesField.setText(settings_.getInt("numAverages").toString()); } private void updateNumFramesField() { @@ -108,8 +91,6 @@ private void updateNumFramesField() { System.out.println("Defaulting value to 4"); num = 4; } - fa_.setNumberFrames(num); - updateStatus(); } else { log_.showMessage("Number of Image Frames to average has to be an Integer"); } @@ -230,16 +211,15 @@ private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event }//GEN-LAST:event_formWindowClosed private void enabledCheckBox_ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_enabledCheckBox_ActionPerformed - if (fa_.core_.isSequenceRunning()) { + if (studio_.core().isSequenceRunning()) { enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); log_.showMessage("Live mode is running ! Please stop before enabling/disabling."); return; - } else if (fa_.tfa_.gui.isAcquisitionRunning()) { + } else if (studio_.acquisitions().isAcquisitionRunning()) { enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); log_.showMessage("Acquisition is running ! Please stop before enabling/disabling."); return; } - update(); }//GEN-LAST:event_enabledCheckBox_ActionPerformed private void numFramesFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_numFramesFieldActionPerformed @@ -251,20 +231,20 @@ private void numFramesFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST }//GEN-LAST:event_numFramesFieldFocusLost private void formFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_formFocusGained - fa_.getDebugOptions(); + }//GEN-LAST:event_formFocusGained private void formFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_formFocusLost - fa_.getDebugOptions(); + }//GEN-LAST:event_formFocusLost private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing - if (fa_.core_.isSequenceRunning()) { + if (studio_.core().isSequenceRunning()) { if (enabledCheckBox_.isSelected()) { setVisible( true ); log_.showMessage("Live mode is running with FrameAverager ! Please stop Live before closing FrameAverager."); } - } else if (fa_.tfa_.gui.isAcquisitionRunning()) { + } else if (studio_.acquisitions().isAcquisitionRunning()) { if (enabledCheckBox_.isSelected()) { setVisible( true ); log_.showMessage("Acquisition is running with FrameAverager ! Please stop Acquisition before closing FrameAverager."); @@ -272,11 +252,8 @@ private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:even } else { if (enabledCheckBox_.isSelected()) { enabledCheckBox_.setSelected(false); - update(); } setVisible( true ); - setPreferences(); - showNonBlockingYesNo(iconImage); } }//GEN-LAST:event_formWindowClosing From 9785a5448800fb232d507fe91e3a81101a1b3a7b Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 17:56:41 -0500 Subject: [PATCH 21/36] need to instantiate the processor in the factory --- .../src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java index fec118f..c106d4e 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java @@ -25,6 +25,6 @@ public FrameAveragerFactory(Studio studio, PropertyMap settings) { } @Override public Processor createProcessor() { - return new FrameAveragerProcessor(); + return new FrameAveragerProcessor(studio_, settings_.getInt("numAverages")); } } From 7222e643f041a451f80200729ec4c0314056ec41 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 17:57:07 -0500 Subject: [PATCH 22/36] big conversion to match the mm2.0 processor class --- .../frameaverage/FrameAveragerProcessor.java | 209 +++++------------- 1 file changed, 54 insertions(+), 155 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java index 7e3fb0d..6c04107 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -31,39 +31,50 @@ * Marine Biological Laboratory, Woods Hole, Mass. * */ -import mmcorej.TaggedImage; -import org.json.JSONObject; -import org.micromanager.acquisition.TaggedImageQueue; +import org.micromanager.internal.utils.MDUtils; +import org.micromanager.internal.utils.ReportingUtils; + import org.micromanager.data.Processor; -import org.micromanager.api.ScriptInterface; -import org.micromanager.utils.MDUtils; -import org.micromanager.utils.ReportingUtils; +import org.micromanager.Studio; +import org.micromanager.data.ProcessorContext; +import org.micromanager.data.Image; +import org.micromanager.data.SummaryMetadata; public class FrameAveragerProcessor extends Processor { - + + Studio studio_; + int averages_; - JSONObject json = null; - int imgDepth; - FrameAveragerPlugin tfa; - TaggedImage imageOnError; + public FrameAveragerProcessor(Studio studio, int averages) { + studio_ = studio; + averages_ = averages; + //addrunnable here + } - @Override - protected void process() { + public void cleanup(ProcessorContext context) { + //remove runnable here + } + + @Override + public SummaryMetadata processSummaryMetadata(SummaryMetadata metadata) { + SummaryMetadata.SummaryMetadataBuilder builder = metadata.copy(); + builder.userName("Nicks Averager"); + return builder.build(); + } + + @Override + public void processImage(Image image, ProcessorContext context) { + context.outputImage(image); try { final TaggedImage taggedImage = poll(); // make a copy to produce if FrameAverager throws an error // preserve image acquired imageOnError = taggedImage; - // if in Multi-D mode and disabled on plugin skip processing - if (tfa.fa.engineWrapper_.isAcquisitionRunning() && !tfa.fa.isEnabledForImageAcquisition) { - produce(taggedImage); - return; - } - // if less than 2 frames then disable processing - if (tfa.fa.numberFrames < 2) { // if MFA is disabled + // if we are not in a state where we have acquired some frames for averaging + if (isFirstEmptyArray() && !isPartiallyFilledArray()) { if (taggedImage == null) { // EOL check produce(TaggedImageQueue.POISON); return; @@ -72,78 +83,45 @@ protected void process() { produce(taggedImage); return; } - - produce(taggedImage); - if (tfa.fa.debugLogEnabled_) { - ReportingUtils.logMessage("FrameAvg: averaging disabled"); - } - return; } else { - // if we are not in a state where we have acquired some frames for averaging - if (isFirstEmptyArray() && !isPartiallyFilledArray()) { - if (taggedImage == null) { // EOL check - produce(TaggedImageQueue.POISON); - return; - } - if (TaggedImageQueue.isPoison(taggedImage)) { // EOL check - produce(taggedImage); - return; - } - } else { - // this case would be for Snap or end of Live routine where additional images - // are needed to be acquired to fill the averaging array - // a Poison image indicates EOL - if (taggedImage == null || TaggedImageQueue.isPoison(taggedImage)) { - new Thread("Poison-Image-Delay") { - public void run() { - if (isPartiallyFilledArray()) { // make sure there are empty slots in the averaging array - if (!isFirstEmptyArray()) { // basically make sure slot 1 is filled with original image - - tfa.fa.taggedImageArray[0] = tfa.fa.taggedImageArray[1]; + // this case would be for Snap or end of Live routine where additional images + // are needed to be acquired to fill the averaging array + // a Poison image indicates EOL + if (taggedImage == null || TaggedImageQueue.isPoison(taggedImage)) { + new Thread("Poison-Image-Delay") { + public void run() { + if (isPartiallyFilledArray()) { // make sure there are empty slots in the averaging array + if (!isFirstEmptyArray()) { // basically make sure slot 1 is filled with original image - if (!tfa.getCMMCore().isSequenceRunning()) { - acquireImagesStartSequence(false); - } + tfa.fa.taggedImageArray[0] = tfa.fa.taggedImageArray[1]; - computeProduceAndEmpty(tfa.fa.taggedImageArray); // on to computing avg. frame + if (!tfa.getCMMCore().isSequenceRunning()) { + acquireImagesStartSequence(false); + } + + computeProduceAndEmpty(tfa.fa.taggedImageArray); // on to computing avg. frame - if (tfa.fa.debugLogEnabled_) { - tfa.getCMMCore().logMessage("FrameAvg: exiting processor"); - } + if (tfa.fa.debugLogEnabled_) { + tfa.getCMMCore().logMessage("FrameAvg: exiting processor"); } } - produce(TaggedImageQueue.POISON); - } - }.start(); - return; - } + } + produce(TaggedImageQueue.POISON); + } + }.start(); + return; } - } + } json = taggedImage.tags; final int channel = MDUtils.getChannelIndex(json); final String channelName = MDUtils.getChannelName(json); - if (tfa.fa.avoidDisplayChs_ != null) {// channel avoidance - for (int c = 0; c < tfa.fa.avoidDisplayChs_.length; c++) { - if (channel == tfa.fa.avoidDisplayChs_[c]) { - if (tfa.fa.debugLogEnabled_) { - ReportingUtils.logMessage("FrameAvg: avoided channel: " + channel + " " + channelName); - } - produce(taggedImage); - return; - } - } - } - imgDepth = MDUtils.getDepth(json); if (imgDepth == 1 || imgDepth == 2) { // if Image is not 8/16 bit } else { produce(taggedImage); return; } - if (tfa.fa.debugLogEnabled_) { - tfa.getCMMCore().logMessage("FrameAvg: entering processor"); - } // Only applies for Live - MultiD and Snap collect images elsewhere (in Runnable and Poison-Image-Delay thread) // when in Live collect (n-1) required images from stream @@ -165,19 +143,8 @@ public void run() { tfa.fa.taggedImageArray[0] = taggedImage; - // try and get Display window for status - if (tfa.fa.displayLive_ != null) { - if (tfa.gui.isLiveModeOn()) { - tfa.fa.displayLive_.displayStatusLine(" - Image Avg. Acquiring No. 1"); - } - } - computeProduceAndEmpty(tfa.fa.taggedImageArray); // on to computing avg. frame - if (tfa.fa.debugLogEnabled_) { - tfa.getCMMCore().logMessage("FrameAvg: exiting processor"); - } - } catch (Exception ex) { produce(imageOnError); ReportingUtils.logError("ERROR: FrameAvg, in Process: "); @@ -251,69 +218,6 @@ private void computeProduceAndEmpty(TaggedImage[] taggedImageArrayTemp) { } - public void runAcquireFromRunningSequence() { - if (tfa.fa.numberFrames > 1) { - try { - if (tfa.fa.debugLogEnabled_) { - ReportingUtils.logMessage("FrameAvg: acquireImagesFromRunningSequence"); - } - acquireImagesFromRunningSequence(); - } catch (Exception ex) { - ex.printStackTrace(); - ReportingUtils.logMessage("ERROR: FrameAvg: while entering acquireImagesFromRunningSequence"); - } - } - } - - public void acquireImagesFromRunningSequence() { - try { - - String cam = tfa.getCMMCore().getCameraDevice(); - - long now = System.currentTimeMillis(); - int frame = 1;// keep 0 free for the image from engine - // reference BurstExample.bsh - - while (frame < tfa.fa.numberFrames && (tfa.getCMMCore().getRemainingImageCount() > 0 || tfa.getCMMCore().isSequenceRunning(cam))) { - if (tfa.getCMMCore().getRemainingImageCount() > 0) { - if (tfa.fa.isAdditionalDelayReg) { - Thread.sleep(250); - } - tfa.fa.taggedImageArray[frame] = tfa.getCMMCore().popNextTaggedImage(); - frame++; - if (tfa.fa.display_ != null) { - if (tfa.fa.display_.isActiveDisplay()) { - tfa.fa.display_.displayStatusLine("Image Avg. Acquiring No. " + frame); - } - } - } - } - long itTook = System.currentTimeMillis() - now; - - if (tfa.fa.debugLogEnabled_) { - ReportingUtils.logMessage("Averaging Acquisition took: " + itTook + " milliseconds for "+tfa.fa.numberFrames + " frames"); - } - - } catch (Exception ex) { - ex.printStackTrace(); - ReportingUtils.logMessage("FrameAvg Error"); - } - } - - public void runAcquireStartSequence() { - if (tfa.fa.numberFrames > 1) { - try { - if (tfa.fa.debugLogEnabled_) { - ReportingUtils.logMessage("FrameAvg: entering runnable"); - } - acquireImagesStartSequence(true); - } catch (Exception ex) { - ex.printStackTrace(); - ReportingUtils.logMessage("ERROR: FrameAvg: while entering runnable"); - } - } - } - public void acquireImagesStartSequence(boolean stopAtEnd) { try { tfa.getCMMCore().waitForDevice(tfa.getCMMCore().getCameraDevice()); @@ -361,10 +265,5 @@ public void acquireImagesStartSequence(boolean stopAtEnd) { ex.printStackTrace(); ReportingUtils.logMessage("FrameAvg Error"); } - } - - public static boolean isPoison(TaggedImage image) { - return ((image.pix == null) || (image.tags == null)); - } - + } } From d23ada55ad889e59fbea612955db3ceedd99f21b Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 17:57:36 -0500 Subject: [PATCH 23/36] updates to project files --- FrameAverager.2.0/MANIFEST.MF | 18 +++++++++--------- .../nbproject/private/private.properties | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/FrameAverager.2.0/MANIFEST.MF b/FrameAverager.2.0/MANIFEST.MF index a0ce95f..fe4b097 100644 --- a/FrameAverager.2.0/MANIFEST.MF +++ b/FrameAverager.2.0/MANIFEST.MF @@ -1,9 +1,9 @@ -Manifest-Version: 1.0 -Ant-Version: Apache Ant 1.9.7 -Created-By: 1.8.0_181-b13 (Oracle Corporation) -Signature-Title: FrameAverager -Signature-Vendor: Marine Biological Laboratory (Rudolf Oldenbourg) -Application-Plugin: Micro-Manager -Built-By: N2-LiveCell -Built-Date: 08-02-2018 - +Manifest-Version: 1.0 +Ant-Version: Apache Ant 1.9.7 +Created-By: 1.8.0_101-b13 (Oracle Corporation) +Signature-Title: FrameAverager +Signature-Vendor: Marine Biological Laboratory (Rudolf Oldenbourg) +Application-Plugin: Micro-Manager +Built-By: Nick +Built-Date: 08-18-2018 + diff --git a/FrameAverager.2.0/nbproject/private/private.properties b/FrameAverager.2.0/nbproject/private/private.properties index cca7f8d..87ab5ba 100644 --- a/FrameAverager.2.0/nbproject/private/private.properties +++ b/FrameAverager.2.0/nbproject/private/private.properties @@ -4,4 +4,4 @@ do.jar=true javac.debug=true javadoc.preview=true user.properties.file=C:\\Users\\Nick\\AppData\\Roaming\\NetBeans\\8.2\\build.properties -work.dir=C:\\Program Files\\Micro-Manager-2.0beta +work.dir=D:\\ExtProgramFiles\\Micro-Manager-2.0beta From a5cbf51da31cfa8fefbf74dc9ede915007ad06a1 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 18:34:18 -0500 Subject: [PATCH 24/36] replaced old gui with one that works. --- .../FrameAveragerConfigurator.form | 138 +++++------ .../FrameAveragerConfigurator.java | 219 ++++++------------ 2 files changed, 122 insertions(+), 235 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form index b539f3f..d9fbccb 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form @@ -1,30 +1,26 @@ - + - - + + + + + - - - - - - + + + - - - - @@ -32,7 +28,7 @@ - + @@ -41,93 +37,65 @@ - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - + - - - - - - - - - - - + - - - - - - - + + + - - - - - - - - - - - - - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java index a3e8cfd..5121a87 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java @@ -1,36 +1,10 @@ -package edu.mbl.cdp.frameaverage; - /* - * Copyright © 2009 – 2013, Marine Biological Laboratory - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of - * the authors and should not be interpreted as representing official policies, - * either expressed or implied, of any organization. - * - * Multiple-Frame Averaging plug-in for Micro-Manager - * @author Amitabh Verma (averma@mbl.edu), Grant Harris (gharris@mbl.edu) - * Marine Biological Laboratory, Woods Hole, Mass. - * + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. */ +package edu.mbl.cdp.frameaverage; + import org.micromanager.internal.utils.MMFrame; import org.micromanager.data.ProcessorConfigurator; @@ -42,7 +16,7 @@ public class FrameAveragerConfigurator extends MMFrame implements ProcessorConfigurator { private final Studio studio_; - private final PropertyMap settings_; + private PropertyMap settings_; private final LogManager log_; /** @@ -53,7 +27,6 @@ public FrameAveragerConfigurator(PropertyMap settings, Studio studio) { settings_ = settings; log_ = studio.logs(); initComponents(); - loadSettingValue(); super.loadAndRestorePosition(200, 200); } @@ -76,26 +49,21 @@ public void showGUI() { setVisible(true); } - private void loadSettingValue() { - numFramesField.setText(settings_.getInt("numAverages").toString()); - } private void updateNumFramesField() { int num; - if (!numFramesField.getText().isEmpty()) { - String str = numFramesField.getText().trim().toString(); - try { - num = (int) Integer.parseInt(str); - } catch(NumberFormatException e) { - System.out.println("CAUGHT: " + e.toString()); - System.out.println("Defaulting value to 4"); - num = 4; - } - } else { - log_.showMessage("Number of Image Frames to average has to be an Integer"); + String str = numFramesField.getText().trim().toString(); + try { + num = (int) Integer.parseInt(str); + } catch(NumberFormatException e) { + log_.showMessage("A valid number was not specified. Defaulting to 4."); + num = 4; } + numFramesField.setText(Integer.toString(num)); + //settings_ = settings_.copy().putInt("numAverages",num).build(); } + /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -105,138 +73,87 @@ private void updateNumFramesField() { // //GEN-BEGIN:initComponents private void initComponents() { - numFramesField = new javax.swing.JTextField(); + jCheckBox1 = new javax.swing.JCheckBox(); + jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); + numFramesField = new javax.swing.JTextField(); enabledCheckBox_ = new javax.swing.JCheckBox(); - labelStatus = new javax.swing.JLabel(); - jLabel4 = new javax.swing.JLabel(); - jLabel3 = new javax.swing.JLabel(); - jMenuBar1 = new javax.swing.JMenuBar(); + + jCheckBox1.setText("jCheckBox1"); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setTitle("Frame Averager"); - setBounds(new java.awt.Rectangle(300, 300, 150, 150)); - setMinimumSize(new java.awt.Dimension(150, 150)); + setPreferredSize(null); + setResizable(false); addWindowListener(new java.awt.event.WindowAdapter() { - public void windowClosed(java.awt.event.WindowEvent evt) { - formWindowClosed(evt); - } public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } }); - addFocusListener(new java.awt.event.FocusAdapter() { - public void focusGained(java.awt.event.FocusEvent evt) { - formFocusGained(evt); - } + + jPanel1.setAutoscrolls(true); + jPanel1.setMinimumSize(new java.awt.Dimension(332, 142)); + jPanel1.setPreferredSize(new java.awt.Dimension(332, 142)); + jPanel1.setLayout(new java.awt.GridLayout(2, 2)); + + jLabel1.setText("Averages"); + jPanel1.add(jLabel1); + + numFramesField.setToolTipText(""); + numFramesField.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { - formFocusLost(evt); + numFramesFieldFocusLost(evt); } }); - - numFramesField.setHorizontalAlignment(javax.swing.JTextField.CENTER); - numFramesField.setText("4"); numFramesField.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { numFramesFieldActionPerformed(evt); } }); - numFramesField.addFocusListener(new java.awt.event.FocusAdapter() { - public void focusLost(java.awt.event.FocusEvent evt) { - numFramesFieldFocusLost(evt); - } - }); - - jLabel1.setText("Number of Image Frames to average"); + jPanel1.add(numFramesField); + numFramesField.getAccessibleContext().setAccessibleName(""); - enabledCheckBox_.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N - enabledCheckBox_.setText("Enable for Multi-D Image Acquisition"); + enabledCheckBox_.setText("EnableMDA"); enabledCheckBox_.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { enabledCheckBox_ActionPerformed(evt); } }); + jPanel1.add(enabledCheckBox_); - jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - jLabel4.setText("eg. 1,2 or 1-5"); - - jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N - jLabel3.setText("Multi-Frame Averaging"); - setJMenuBar(jMenuBar1); - - org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( - layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) - .add(layout.createSequentialGroup() + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() .addContainerGap() - .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) - .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() - .add(jLabel1) - .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(numFramesField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 99, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) - .add(labelStatus, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(layout.createSequentialGroup() - .add(jLabel3) - .add(0, 0, Short.MAX_VALUE)) - .add(layout.createSequentialGroup() - .add(enabledCheckBox_) - .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .add(jLabel4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 99, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))) - .addContainerGap()) + .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); layout.setVerticalGroup( - layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) - .add(layout.createSequentialGroup() - .addContainerGap() - .add(jLabel3) - .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) - .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) - .add(jLabel1) - .add(numFramesField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)) - .add(37, 37, 37) - .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) - .add(jLabel4) - .add(enabledCheckBox_)) - .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED) - .add(labelStatus, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 21, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) - .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE)) ); pack(); }// //GEN-END:initComponents - private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed - - }//GEN-LAST:event_formWindowClosed - - private void enabledCheckBox_ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_enabledCheckBox_ActionPerformed - if (studio_.core().isSequenceRunning()) { - enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - log_.showMessage("Live mode is running ! Please stop before enabling/disabling."); - return; - } else if (studio_.acquisitions().isAcquisitionRunning()) { - enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - log_.showMessage("Acquisition is running ! Please stop before enabling/disabling."); - return; - } - }//GEN-LAST:event_enabledCheckBox_ActionPerformed - - private void numFramesFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_numFramesFieldActionPerformed - updateNumFramesField(); - }//GEN-LAST:event_numFramesFieldActionPerformed + private void numFramesFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_numFramesFieldActionPerformed + updateNumFramesField(); + }//GEN-LAST:event_numFramesFieldActionPerformed - private void numFramesFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_numFramesFieldFocusLost - updateNumFramesField(); - }//GEN-LAST:event_numFramesFieldFocusLost - - private void formFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_formFocusGained - - }//GEN-LAST:event_formFocusGained - - private void formFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_formFocusLost - - }//GEN-LAST:event_formFocusLost + private void enabledCheckBox_ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_enabledCheckBox_ActionPerformed + if (studio_.core().isSequenceRunning()) { + enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); + log_.showMessage("Live mode is running ! Please stop before enabling/disabling."); + return; + } else if (studio_.acquisitions().isAcquisitionRunning()) { + enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); + log_.showMessage("Acquisition is running ! Please stop before enabling/disabling."); + return; + } + }//GEN-LAST:event_enabledCheckBox_ActionPerformed private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing if (studio_.core().isSequenceRunning()) { @@ -256,14 +173,16 @@ private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:even setVisible( true ); } }//GEN-LAST:event_formWindowClosing - + + private void numFramesFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_numFramesFieldFocusLost + updateNumFramesField(); + }//GEN-LAST:event_numFramesFieldFocusLost + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBox enabledCheckBox_; + private javax.swing.JCheckBox jCheckBox1; private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel3; - private javax.swing.JLabel jLabel4; - private javax.swing.JMenuBar jMenuBar1; - private javax.swing.JLabel labelStatus; + private javax.swing.JPanel jPanel1; private javax.swing.JTextField numFramesField; // End of variables declaration//GEN-END:variables -} \ No newline at end of file +} From 0318fa355042b48eeb41826fefee14e4248feb70 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 22:32:51 -0500 Subject: [PATCH 25/36] Got runnable working --- .../frameaverage/FrameAveragerRunnable.java | 81 ++++++++----------- 1 file changed, 33 insertions(+), 48 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java index 56410bf..b309f6d 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java @@ -32,91 +32,76 @@ * */ -import mmcorej.CMMCore; -import org.micromanager.acquisition.internal.AcquisitionWrapperEngine; import org.micromanager.internal.utils.ReportingUtils; +import org.micromanager.Studio; + public class FrameAveragerRunnable implements Runnable { - private static CMMCore core_; - private static AcquisitionWrapperEngine engineWrapper_; - FrameAverager fa; - + Studio studio_; + FrameAveragerProcessor proc_; - FrameAveragerRunnable(FrameAverager fa) { - this.fa = fa; - core_ = fa.core_; - engineWrapper_ = fa.engineWrapper_; - - fa.getDebugOptions(); + FrameAveragerRunnable(FrameAveragerProcessor proc) { + studio_ = proc.studio_; + proc_ = proc; } - @Override public void run() { - if (fa.numberFrames > 1) { - try { - if (fa.debugLogEnabled_) { - ReportingUtils.logMessage("FrameAvg: entering runnable"); - } - engineWrapper_.setPause(true); - acquireImages(); - engineWrapper_.setPause(false); - } catch (Exception ex) { - ex.printStackTrace(); - ReportingUtils.logMessage("ERROR: FrameAvg: while entering runnable"); - } + try { + ReportingUtils.logMessage("FrameAvg: entering runnable"); + studio_.acquisitions().setPause(true); + acquireImages(); + studio_.acquisitions().setPause(false); + } catch (Exception ex) { + ex.printStackTrace(); + ReportingUtils.logMessage("ERROR: FrameAvg: while entering runnable"); } } public void acquireImages() { try { - core_.waitForDevice(core_.getCameraDevice()); - core_.clearCircularBuffer(); - String cam = core_.getCameraDevice(); + studio_.core().waitForDevice(studio_.core().getCameraDevice()); + studio_.core().clearCircularBuffer(); + String cam = studio_.core().getCameraDevice(); // CMMCore::startSequenceAcquisition(long numImages, double intervalMs, bool stopOnOverflow) // @param numImages Number of images requested from the camera // @param intervalMs interval between images, currently only supported by Andor cameras // @param stopOnOverflow whether or not the camera stops acquiring when the circular buffer is full - core_.startSequenceAcquisition(fa.numberFrames-1, 0, false); + studio_.core().startSequenceAcquisition(proc_.numAverages_-1, 0, false); long now = System.currentTimeMillis(); int frame = 1;// keep 0 free for the image from engine // reference BurstExample.bsh - while (core_.getRemainingImageCount() > 0 || core_.isSequenceRunning(cam)) { - if (core_.getRemainingImageCount() > 0) { - if (fa.isAdditionalDelayReg) { - Thread.sleep(250); - } - fa.taggedImageArray[frame] = core_.popNextTaggedImage(); + while (studio_.core().getRemainingImageCount() > 0 || studio_.core().isSequenceRunning(cam)) { + if (studio_.core().getRemainingImageCount() > 0) { + proc_.imageQueue.add(studio_.core().popNextTaggedImage()); frame++; - if (fa.display_ != null) { - if (fa.display_.acquisitionIsRunning()) { - fa.display_.displayStatusLine("Image Avg. Acquiring No. " + frame); - } + /* + if (proc_.display_ != null) { + if (proc_.display_.acquisitionIsRunning()) { + proc_.display_.displayStatusLine("Image Avg. Acquiring No. " + frame); } + } + */ } } long itTook = System.currentTimeMillis() - now; try { - core_.stopSequenceAcquisition(); + studio_.core().stopSequenceAcquisition(); } catch (Exception ex) { ex.printStackTrace(); ReportingUtils.logMessage("ERROR: FrameAvg: " + ex.getMessage()); + } + if (proc_.debugLogEnabled_) { + ReportingUtils.logMessage("Averaging Acquisition took: " + itTook + " milliseconds for "+proc_.numAverages_ + " frames"); } - - if (fa.debugLogEnabled_) { - ReportingUtils.logMessage("Averaging Acquisition took: " + itTook + " milliseconds for "+fa.numberFrames + " frames"); - } - } catch (Exception ex) { ex.printStackTrace(); ReportingUtils.logMessage("FrameAvg Error"); - engineWrapper_.setPause(false); + studio_.acquisitions().setPause(false); } } - - } From b4d4bd1181c0f3f283208b83954c0704a44c5d74 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 22:33:36 -0500 Subject: [PATCH 26/36] added default value to form --- .../cdp/frameaverage/FrameAveragerConfigurator.form | 1 + .../cdp/frameaverage/FrameAveragerConfigurator.java | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form index d9fbccb..c93a1be 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form @@ -77,6 +77,7 @@ + diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java index 5121a87..0015af5 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java @@ -27,14 +27,18 @@ public FrameAveragerConfigurator(PropertyMap settings, Studio studio) { settings_ = settings; log_ = studio.logs(); initComponents(); - super.loadAndRestorePosition(200, 200); } @Override public PropertyMap getSettings() { PropertyMap.PropertyMapBuilder builder = studio_.data().getPropertyMapBuilder(); - builder.putInt("numAverages", Integer.parseInt(numFramesField.getText().trim())); + try{ + builder.putInt("numAverages", Integer.parseInt(numFramesField.getText().trim())); + } + catch(NumberFormatException e){ + log_.showMessage("A valid number was not specified. Got: " + numFramesField.getText().trim()); + } return builder.build(); } @@ -60,7 +64,6 @@ private void updateNumFramesField() { num = 4; } numFramesField.setText(Integer.toString(num)); - //settings_ = settings_.copy().putInt("numAverages",num).build(); } @@ -98,6 +101,7 @@ public void windowClosing(java.awt.event.WindowEvent evt) { jLabel1.setText("Averages"); jPanel1.add(jLabel1); + numFramesField.setText("4"); numFramesField.setToolTipText(""); numFramesField.addFocusListener(new java.awt.event.FocusAdapter() { public void focusLost(java.awt.event.FocusEvent evt) { From 3213b5ece3787a6b54da5d5b74fc74d72466bd37 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 22:34:15 -0500 Subject: [PATCH 27/36] Big changes to processing part of processor. only works in MDA right now. --- .../frameaverage/FrameAveragerProcessor.java | 151 ++++++++---------- 1 file changed, 67 insertions(+), 84 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java index 6c04107..9ec9ce3 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -39,21 +39,28 @@ import org.micromanager.data.ProcessorContext; import org.micromanager.data.Image; import org.micromanager.data.SummaryMetadata; +import org.micromanager.acquisition.internal.TaggedImageQueue; +import org.micromanager.data.Coords; +import org.micromanager.data.Metadata; +import org.micromanager.data.internal.DefaultImage; public class FrameAveragerProcessor extends Processor { Studio studio_; - int averages_; + int numAverages_; + TaggedImageQueue imageQueue; + boolean debugLogEnabled_ = true; public FrameAveragerProcessor(Studio studio, int averages) { studio_ = studio; - averages_ = averages; - //addrunnable here + numAverages_ = averages; + studio_.acquisitions().attachRunnable(-1, -1, -1, -1, new FrameAveragerRunnable(this)); + imageQueue = new TaggedImageQueue(); } @Override public void cleanup(ProcessorContext context) { - //remove runnable here + studio_.acquisitions().clearRunnables(); } @Override @@ -65,53 +72,34 @@ public SummaryMetadata processSummaryMetadata(SummaryMetadata metadata) { @Override public void processImage(Image image, ProcessorContext context) { - context.outputImage(image); + if (debugLogEnabled_) { + ReportingUtils.logMessage("Queue has" + Integer.toString(imageQueue.size())); + } + Image imageOnError = image; try { - final TaggedImage taggedImage = poll(); - // make a copy to produce if FrameAverager throws an error - // preserve image acquired - imageOnError = taggedImage; - - // if we are not in a state where we have acquired some frames for averaging - if (isFirstEmptyArray() && !isPartiallyFilledArray()) { - if (taggedImage == null) { // EOL check - produce(TaggedImageQueue.POISON); - return; - } - if (TaggedImageQueue.isPoison(taggedImage)) { // EOL check - produce(taggedImage); - return; - } - } else { - // this case would be for Snap or end of Live routine where additional images - // are needed to be acquired to fill the averaging array - // a Poison image indicates EOL - if (taggedImage == null || TaggedImageQueue.isPoison(taggedImage)) { - new Thread("Poison-Image-Delay") { - public void run() { - if (isPartiallyFilledArray()) { // make sure there are empty slots in the averaging array - if (!isFirstEmptyArray()) { // basically make sure slot 1 is filled with original image - - tfa.fa.taggedImageArray[0] = tfa.fa.taggedImageArray[1]; - - if (!tfa.getCMMCore().isSequenceRunning()) { - acquireImagesStartSequence(false); - } + // this case would be for Snap or end of Live routine where additional images + // are needed to be acquired to fill the averaging array + // a Poison image indicates EOL + /*if (taggedImage == null || TaggedImageQueue.isPoison(taggedImage)) { + new Thread("Poison-Image-Delay") { + public void run() { + tfa.fa.taggedImageArray[0] = tfa.fa.taggedImageArray[1]; + + if (!studio_.core().isSequenceRunning()) { + acquireImagesStartSequence(false); + } - computeProduceAndEmpty(tfa.fa.taggedImageArray); // on to computing avg. frame + computeProduceAndEmpty(); // on to computing avg. frame - if (tfa.fa.debugLogEnabled_) { - tfa.getCMMCore().logMessage("FrameAvg: exiting processor"); - } - } - } - produce(TaggedImageQueue.POISON); + if (debugLogEnabled_) { + studio_.core().logMessage("FrameAvg: exiting processor"); } - }.start(); - return; + produce(TaggedImageQueue.POISON); + } } - } + return; + } json = taggedImage.tags; final int channel = MDUtils.getChannelIndex(json); final String channelName = MDUtils.getChannelName(json); @@ -121,50 +109,48 @@ public void run() { } else { produce(taggedImage); return; - } + }*/ // Only applies for Live - MultiD and Snap collect images elsewhere (in Runnable and Poison-Image-Delay thread) // when in Live collect (n-1) required images from stream // when averaging array is filled skip this step and continue to // compute and produce avg. image - if (testForEmptyArray()) { + /*if (studio_.live().getIsLiveModeOn()) { for (int i = 1; i < tfa.fa.taggedImageArray.length; i++) { if (tfa.fa.taggedImageArray[i] == null) { if (tfa.fa.displayLive_ != null) { - if (tfa.gui.isLiveModeOn()) { - tfa.fa.displayLive_.displayStatusLine(" - Image Avg. Acquiring No. " + (i+1)); - } + tfa.fa.displayLive_.displayStatusLine(" - Image Avg. Acquiring No. " + (i+1)); } tfa.fa.taggedImageArray[i] = taggedImage; return; } } + }*/ + Image[] imageArray = new Image[numAverages_]; + imageArray[0] = image; + int i = 1; + while (!imageQueue.isEmpty()) { + imageArray[i++] = studio_.data().convertTaggedImage(imageQueue.take()); } - tfa.fa.taggedImageArray[0] = taggedImage; - - computeProduceAndEmpty(tfa.fa.taggedImageArray); // on to computing avg. frame - + Image avg = getAverage(imageArray); // on to computing avg. frame + context.outputImage(avg); } catch (Exception ex) { - produce(imageOnError); + context.outputImage(imageOnError); ReportingUtils.logError("ERROR: FrameAvg, in Process: "); ex.printStackTrace(); - if (tfa.fa.numberFrames > 1) { - emptyImageArray(); - } + imageQueue.clear(); } } - private void computeProduceAndEmpty(TaggedImage[] taggedImageArrayTemp) { - + private Image getAverage(Image[] imArray) { try { - if (tfa.fa.debugLogEnabled_) { + if (debugLogEnabled_) { ReportingUtils.logMessage("FrameAvg: computing..."); } - - int width = MDUtils.getWidth(taggedImageArrayTemp[0].tags); - int height = MDUtils.getHeight(taggedImageArrayTemp[0].tags); -// ReportingUtils.logMessage(MDUtils.getChannelName(taggedImage.tags)); + int width = imArray[0].getHeight(); + int height = imArray[0].getWidth(); + int imgDepth = imArray[0].getBytesPerPixel(); int dimension = width * height; byte[] pixB; @@ -174,15 +160,14 @@ private void computeProduceAndEmpty(TaggedImage[] taggedImageArrayTemp) { float[] retF = new float[dimension]; Object result = null; - for (int i = 0; i < tfa.fa.numberFrames; i++) { -// ReportingUtils.logMessage("FrameAvg: Avg... image "+i); + for (int i = 0; i < imArray.length; i++) { if (imgDepth == 1) { - pixB = (byte[]) taggedImageArrayTemp[i].pix; + pixB = (byte[]) imArray[i].getRawPixels(); for (int j = 0; j < dimension; j++) { retF[j] = (float) (retF[j] + (int) (pixB[j] & 0xff)); } } else if (imgDepth == 2) { - pixS = (short[]) taggedImageArrayTemp[i].pix; + pixS = (short[]) imArray[i].getRawPixels(); for (int j = 0; j < dimension; j++) { retF[j] = (float) (retF[j] + (int) (pixS[j] & 0xffff)); } @@ -190,34 +175,31 @@ private void computeProduceAndEmpty(TaggedImage[] taggedImageArrayTemp) { } if (imgDepth == 1) { for (int j = 0; j < dimension; j++) { - retB[j] = (byte) (int) (retF[j] / tfa.fa.numberFrames); + retB[j] = (byte) (int) (retF[j] / imArray.length); } result = retB; } else if (imgDepth == 2) { for (int j = 0; j < dimension; j++) { - retS[j] = (short) (int) (retF[j] / tfa.fa.numberFrames); + retS[j] = (short) (int) (retF[j] / imArray.length); } result = retS; } - // Averaged channel - // Weird way of copying a JSONObject - JSONObject tags = new JSONObject(taggedImageArrayTemp[0].tags.toString()); - tags.put(FrameAverager.METADATAKEY, tfa.fa.numberFrames); - TaggedImage averagedImage = new TaggedImage(result, tags); - produce(averagedImage); - emptyImageArray(); - if (tfa.fa.debugLogEnabled_) { + + Metadata md = imArray[0].getMetadata(); + Coords co = imArray[0].getCoords(); + Image averagedImage = new DefaultImage(result,width,height,imgDepth,1,co,md); + if (debugLogEnabled_) { ReportingUtils.logMessage("FrameAvg: produced averaged image"); } + return averagedImage; + } catch (Exception ex) { - produce(imageOnError); - emptyImageArray(); ex.printStackTrace(); - ReportingUtils.logError("Error: FrameAvg, while producing averaged img."); + ReportingUtils.logError("Error: FrameAvg, while producing averaged img."); + return imArray[0]; } } - - + /* public void acquireImagesStartSequence(boolean stopAtEnd) { try { tfa.getCMMCore().waitForDevice(tfa.getCMMCore().getCameraDevice()); @@ -266,4 +248,5 @@ public void acquireImagesStartSequence(boolean stopAtEnd) { ReportingUtils.logMessage("FrameAvg Error"); } } +*/ } From b76b101fa20ee34920ea785738ba4a9e228bb9d9 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sat, 18 Aug 2018 22:49:40 -0500 Subject: [PATCH 28/36] allow for disabling MDA averaging --- .../cdp/frameaverage/FrameAveragerConfigurator.java | 1 + .../mbl/cdp/frameaverage/FrameAveragerFactory.java | 2 +- .../mbl/cdp/frameaverage/FrameAveragerProcessor.java | 12 +++++++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java index 0015af5..014afc1 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java @@ -35,6 +35,7 @@ public PropertyMap getSettings() { PropertyMap.PropertyMapBuilder builder = studio_.data().getPropertyMapBuilder(); try{ builder.putInt("numAverages", Integer.parseInt(numFramesField.getText().trim())); + builder.putBoolean("MDAEnabled", enabledCheckBox_.isSelected()); } catch(NumberFormatException e){ log_.showMessage("A valid number was not specified. Got: " + numFramesField.getText().trim()); diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java index c106d4e..3dd422b 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java @@ -25,6 +25,6 @@ public FrameAveragerFactory(Studio studio, PropertyMap settings) { } @Override public Processor createProcessor() { - return new FrameAveragerProcessor(studio_, settings_.getInt("numAverages")); + return new FrameAveragerProcessor(studio_, settings_.getInt("numAverages"),settings_.getBoolean("MDAEnabled")); } } diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java index 9ec9ce3..9351d88 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -48,19 +48,25 @@ public class FrameAveragerProcessor extends Processor { Studio studio_; int numAverages_; + boolean MDAEnabled_; TaggedImageQueue imageQueue; boolean debugLogEnabled_ = true; - public FrameAveragerProcessor(Studio studio, int averages) { + public FrameAveragerProcessor(Studio studio, int averages, boolean MDAEnabled) { studio_ = studio; numAverages_ = averages; - studio_.acquisitions().attachRunnable(-1, -1, -1, -1, new FrameAveragerRunnable(this)); + MDAEnabled_ = MDAEnabled; + if (MDAEnabled_) { + studio_.acquisitions().attachRunnable(-1, -1, -1, -1, new FrameAveragerRunnable(this)); + } imageQueue = new TaggedImageQueue(); } @Override public void cleanup(ProcessorContext context) { - studio_.acquisitions().clearRunnables(); + if (MDAEnabled_) { + studio_.acquisitions().clearRunnables(); + } } @Override From 7922b46b2ee859b4e25e4747d0621e532e863a1e Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sun, 19 Aug 2018 00:01:19 -0500 Subject: [PATCH 29/36] got rid of option to disable in mda --- .../FrameAveragerConfigurator.form | 22 ++----- .../FrameAveragerConfigurator.java | 58 ++++--------------- 2 files changed, 16 insertions(+), 64 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form index c93a1be..c804b16 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.form @@ -10,9 +10,6 @@ - - - @@ -38,17 +35,16 @@ - - + - - - + + + @@ -67,7 +63,7 @@ - + @@ -88,14 +84,6 @@ - - - - - - - - diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java index 014afc1..df9beb0 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java @@ -35,7 +35,6 @@ public PropertyMap getSettings() { PropertyMap.PropertyMapBuilder builder = studio_.data().getPropertyMapBuilder(); try{ builder.putInt("numAverages", Integer.parseInt(numFramesField.getText().trim())); - builder.putBoolean("MDAEnabled", enabledCheckBox_.isSelected()); } catch(NumberFormatException e){ log_.showMessage("A valid number was not specified. Got: " + numFramesField.getText().trim()); @@ -64,6 +63,10 @@ private void updateNumFramesField() { log_.showMessage("A valid number was not specified. Defaulting to 4."); num = 4; } + if (num < 2) { + log_.showMessage("Can not average less than 2 frames. Defaulting to 4."); + num = 4; + } numFramesField.setText(Integer.toString(num)); } @@ -81,12 +84,10 @@ private void initComponents() { jPanel1 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); numFramesField = new javax.swing.JTextField(); - enabledCheckBox_ = new javax.swing.JCheckBox(); jCheckBox1.setText("jCheckBox1"); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); - setPreferredSize(null); setResizable(false); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { @@ -97,7 +98,7 @@ public void windowClosing(java.awt.event.WindowEvent evt) { jPanel1.setAutoscrolls(true); jPanel1.setMinimumSize(new java.awt.Dimension(332, 142)); jPanel1.setPreferredSize(new java.awt.Dimension(332, 142)); - jPanel1.setLayout(new java.awt.GridLayout(2, 2)); + jPanel1.setLayout(new java.awt.GridLayout(1, 2)); jLabel1.setText("Averages"); jPanel1.add(jLabel1); @@ -117,28 +118,19 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { jPanel1.add(numFramesField); numFramesField.getAccessibleContext().setAccessibleName(""); - enabledCheckBox_.setText("EnableMDA"); - enabledCheckBox_.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - enabledCheckBox_ActionPerformed(evt); - } - }); - jPanel1.add(enabledCheckBox_); - javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() - .addContainerGap() - .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 164, javax.swing.GroupLayout.PREFERRED_SIZE) - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 151, javax.swing.GroupLayout.PREFERRED_SIZE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addGroup(layout.createSequentialGroup() - .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addGap(0, 0, Short.MAX_VALUE) + .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)) ); pack(); @@ -148,35 +140,8 @@ private void numFramesFieldActionPerformed(java.awt.event.ActionEvent evt) {//GE updateNumFramesField(); }//GEN-LAST:event_numFramesFieldActionPerformed - private void enabledCheckBox_ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_enabledCheckBox_ActionPerformed - if (studio_.core().isSequenceRunning()) { - enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - log_.showMessage("Live mode is running ! Please stop before enabling/disabling."); - return; - } else if (studio_.acquisitions().isAcquisitionRunning()) { - enabledCheckBox_.setSelected(!enabledCheckBox_.isSelected()); - log_.showMessage("Acquisition is running ! Please stop before enabling/disabling."); - return; - } - }//GEN-LAST:event_enabledCheckBox_ActionPerformed - private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing - if (studio_.core().isSequenceRunning()) { - if (enabledCheckBox_.isSelected()) { - setVisible( true ); - log_.showMessage("Live mode is running with FrameAverager ! Please stop Live before closing FrameAverager."); - } - } else if (studio_.acquisitions().isAcquisitionRunning()) { - if (enabledCheckBox_.isSelected()) { - setVisible( true ); - log_.showMessage("Acquisition is running with FrameAverager ! Please stop Acquisition before closing FrameAverager."); - } - } else { - if (enabledCheckBox_.isSelected()) { - enabledCheckBox_.setSelected(false); - } - setVisible( true ); - } + }//GEN-LAST:event_formWindowClosing private void numFramesFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_numFramesFieldFocusLost @@ -184,7 +149,6 @@ private void numFramesFieldFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST }//GEN-LAST:event_numFramesFieldFocusLost // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JCheckBox enabledCheckBox_; private javax.swing.JCheckBox jCheckBox1; private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel1; From 5604caa70416b079d9c44be998398cd57f588bf8 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sun, 19 Aug 2018 00:02:07 -0500 Subject: [PATCH 30/36] broke everyting and fixed it again --- .../frameaverage/FrameAveragerFactory.java | 2 +- .../frameaverage/FrameAveragerProcessor.java | 136 ++++++++---------- 2 files changed, 59 insertions(+), 79 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java index 3dd422b..c106d4e 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java @@ -25,6 +25,6 @@ public FrameAveragerFactory(Studio studio, PropertyMap settings) { } @Override public Processor createProcessor() { - return new FrameAveragerProcessor(studio_, settings_.getInt("numAverages"),settings_.getBoolean("MDAEnabled")); + return new FrameAveragerProcessor(studio_, settings_.getInt("numAverages")); } } diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java index 9351d88..760fdfa 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -48,25 +48,22 @@ public class FrameAveragerProcessor extends Processor { Studio studio_; int numAverages_; - boolean MDAEnabled_; TaggedImageQueue imageQueue; boolean debugLogEnabled_ = true; + Image[] imageArray; + int liveIndex = 0; - public FrameAveragerProcessor(Studio studio, int averages, boolean MDAEnabled) { + public FrameAveragerProcessor(Studio studio, int averages) { studio_ = studio; numAverages_ = averages; - MDAEnabled_ = MDAEnabled; - if (MDAEnabled_) { - studio_.acquisitions().attachRunnable(-1, -1, -1, -1, new FrameAveragerRunnable(this)); - } + imageArray = new Image[numAverages_]; + studio_.acquisitions().attachRunnable(-1, -1, -1, -1, new FrameAveragerRunnable(this)); imageQueue = new TaggedImageQueue(); } @Override public void cleanup(ProcessorContext context) { - if (MDAEnabled_) { studio_.acquisitions().clearRunnables(); - } } @Override @@ -78,22 +75,51 @@ public SummaryMetadata processSummaryMetadata(SummaryMetadata metadata) { @Override public void processImage(Image image, ProcessorContext context) { - if (debugLogEnabled_) { - ReportingUtils.logMessage("Queue has" + Integer.toString(imageQueue.size())); - } + Image imageOnError = image; - try { + try { + if (studio_.acquisitions().isAcquisitionRunning()) { + if (debugLogEnabled_) { + ReportingUtils.logMessage("Queue has" + Integer.toString(imageQueue.size())); + } + imageArray[0] = image; + int i = 1; + studio_.logs().logMessage("Array length" + Integer.toString(imageArray.length)); + while (!imageQueue.isEmpty()) { + studio_.logs().logMessage(Integer.toString(i)); + imageArray[i++] = studio_.data().convertTaggedImage(imageQueue.take()); //Lets make an array with the acquisition image first and then the queued images after. + } + } + // Only applies for Live - MultiD and Snap collect images elsewhere (in Runnable and Poison-Image-Delay thread) + // when in Live collect (n-1) required images from stream + // when averaging array is filled skip this step and continue to + // compute and produce avg. image + else if (studio_.live().getIsLiveModeOn()) { + imageArray[liveIndex] = image; + liveIndex++; + if (liveIndex < numAverages_) { + return; //We'll keep building the array until it's full. + } + liveIndex = 0; + } // if we are not in a state where we have acquired some frames for averaging // this case would be for Snap or end of Live routine where additional images // are needed to be acquired to fill the averaging array // a Poison image indicates EOL - /*if (taggedImage == null || TaggedImageQueue.isPoison(taggedImage)) { + else { //We are not in an acquisition or live mode so we must be taking a snap shot. + //acquireImages(); + imageArray[0] = image; + int i = 1; + while (!imageQueue.isEmpty()) { + imageArray[i++] = studio_.data().convertTaggedImage(imageQueue.take()); //Lets make an array with the acquisition image first and then the queued images after. + } + /*if (taggedImage == null || TaggedImageQueue.isPoison(taggedImage)) { new Thread("Poison-Image-Delay") { public void run() { tfa.fa.taggedImageArray[0] = tfa.fa.taggedImageArray[1]; if (!studio_.core().isSequenceRunning()) { - acquireImagesStartSequence(false); + acquireImages(); } computeProduceAndEmpty(); // on to computing avg. frame @@ -103,48 +129,16 @@ public void run() { } produce(TaggedImageQueue.POISON); } - } + }.start(); return; - } - json = taggedImage.tags; - final int channel = MDUtils.getChannelIndex(json); - final String channelName = MDUtils.getChannelName(json); - - imgDepth = MDUtils.getDepth(json); - if (imgDepth == 1 || imgDepth == 2) { // if Image is not 8/16 bit - } else { - produce(taggedImage); - return; - }*/ - - // Only applies for Live - MultiD and Snap collect images elsewhere (in Runnable and Poison-Image-Delay thread) - // when in Live collect (n-1) required images from stream - // when averaging array is filled skip this step and continue to - // compute and produce avg. image - /*if (studio_.live().getIsLiveModeOn()) { - for (int i = 1; i < tfa.fa.taggedImageArray.length; i++) { - if (tfa.fa.taggedImageArray[i] == null) { - if (tfa.fa.displayLive_ != null) { - tfa.fa.displayLive_.displayStatusLine(" - Image Avg. Acquiring No. " + (i+1)); - } - tfa.fa.taggedImageArray[i] = taggedImage; - return; - } - } - }*/ - Image[] imageArray = new Image[numAverages_]; - imageArray[0] = image; - int i = 1; - while (!imageQueue.isEmpty()) { - imageArray[i++] = studio_.data().convertTaggedImage(imageQueue.take()); + } */ } - + Image avg = getAverage(imageArray); // on to computing avg. frame context.outputImage(avg); } catch (Exception ex) { context.outputImage(imageOnError); - ReportingUtils.logError("ERROR: FrameAvg, in Process: "); - ex.printStackTrace(); + ReportingUtils.logError("FrameAvg, in Process: " + ex.toString()); imageQueue.clear(); } } @@ -157,6 +151,10 @@ private Image getAverage(Image[] imArray) { int width = imArray[0].getHeight(); int height = imArray[0].getWidth(); int imgDepth = imArray[0].getBytesPerPixel(); + + if (imgDepth > 2) { + studio_.logs().showError("Frame Averager Plugin does not support images with greater than 16 bit bitdepth."); + } int dimension = width * height; byte[] pixB; @@ -200,13 +198,12 @@ private Image getAverage(Image[] imArray) { return averagedImage; } catch (Exception ex) { - ex.printStackTrace(); - ReportingUtils.logError("Error: FrameAvg, while producing averaged img."); + ReportingUtils.logError("Error: FrameAvg, while producing averaged img: "+ ex.toString()); return imArray[0]; } } - /* - public void acquireImagesStartSequence(boolean stopAtEnd) { + + /* public void acquireImagesStartSequence() { try { tfa.getCMMCore().waitForDevice(tfa.getCMMCore().getCameraDevice()); tfa.getCMMCore().clearCircularBuffer(); @@ -216,43 +213,26 @@ public void acquireImagesStartSequence(boolean stopAtEnd) { // @param numImages Number of images requested from the camera // @param intervalMs interval between images, currently only supported by Andor cameras // @param stopOnOverflow whether or not the camera stops acquiring when the circular buffer is full - tfa.getCMMCore().startSequenceAcquisition(tfa.fa.numberFrames-1, 0, false); + studio_.core().startSequenceAcquisition(numAverages_-1, 0, false); long now = System.currentTimeMillis(); int frame = 1;// keep 0 free for the image from engine // reference BurstExample.bsh - while (tfa.getCMMCore().getRemainingImageCount() > 0 || tfa.getCMMCore().isSequenceRunning(cam)) { - if (tfa.getCMMCore().getRemainingImageCount() > 0) { - if (tfa.fa.isAdditionalDelayReg) { - Thread.sleep(250); - } + while (studio_.core().getRemainingImageCount() > 0 || studio_.isSequenceRunning(cam)) { + if (studio_.core().getRemainingImageCount() > 0) { tfa.fa.taggedImageArray[frame] = tfa.getCMMCore().popNextTaggedImage(); frame++; - if (tfa.fa.display_ != null) { - if (tfa.fa.display_.acquisitionIsRunning()) { - tfa.fa.display_.displayStatusLine("Image Avg. Acquiring No. " + frame); - } - } - if (tfa.fa.displayLive_ != null) { - if (tfa.gui.isLiveModeOn() || !stopAtEnd) { - tfa.fa.displayLive_.displayStatusLine(" - Image Avg. Acquiring No. " + frame); - } - } } } long itTook = System.currentTimeMillis() - now; - if (stopAtEnd) { - tfa.getCMMCore().stopSequenceAcquisition(cam); - } - if (tfa.fa.debugLogEnabled_) { - ReportingUtils.logMessage("Averaging Acquisition took: " + itTook + " milliseconds for "+tfa.fa.numberFrames + " frames"); + if (debugLogEnabled_) { + ReportingUtils.logMessage("Averaging Acquisition took: " + itTook + " milliseconds for " + numAverages_ + " frames"); } } catch (Exception ex) { ex.printStackTrace(); ReportingUtils.logMessage("FrameAvg Error"); } - } -*/ -} + } */ +} \ No newline at end of file From b2d1576c5d6fc57a88dc4ae47c8329a83a68eebd Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sun, 19 Aug 2018 00:02:20 -0500 Subject: [PATCH 31/36] tiny --- .../src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java index b309f6d..e6c3f78 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java @@ -58,8 +58,8 @@ public void run() { ReportingUtils.logMessage("ERROR: FrameAvg: while entering runnable"); } } - - public void acquireImages() { + + public void acquireImages() { try { studio_.core().waitForDevice(studio_.core().getCameraDevice()); studio_.core().clearCircularBuffer(); @@ -101,7 +101,6 @@ public void acquireImages() { } catch (Exception ex) { ex.printStackTrace(); ReportingUtils.logMessage("FrameAvg Error"); - studio_.acquisitions().setPause(false); } } } From cdc3c4a5e5560952c6f72a1d0acea25aa91e5df8 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sun, 19 Aug 2018 00:37:08 -0500 Subject: [PATCH 32/36] swtiched to rolling average for live mode. --- .../cdp/frameaverage/FrameAveragerProcessor.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java index 760fdfa..b10da94 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -51,7 +51,6 @@ public class FrameAveragerProcessor extends Processor { TaggedImageQueue imageQueue; boolean debugLogEnabled_ = true; Image[] imageArray; - int liveIndex = 0; public FrameAveragerProcessor(Studio studio, int averages) { studio_ = studio; @@ -84,9 +83,7 @@ public void processImage(Image image, ProcessorContext context) { } imageArray[0] = image; int i = 1; - studio_.logs().logMessage("Array length" + Integer.toString(imageArray.length)); while (!imageQueue.isEmpty()) { - studio_.logs().logMessage(Integer.toString(i)); imageArray[i++] = studio_.data().convertTaggedImage(imageQueue.take()); //Lets make an array with the acquisition image first and then the queued images after. } } @@ -94,13 +91,11 @@ public void processImage(Image image, ProcessorContext context) { // when in Live collect (n-1) required images from stream // when averaging array is filled skip this step and continue to // compute and produce avg. image - else if (studio_.live().getIsLiveModeOn()) { - imageArray[liveIndex] = image; - liveIndex++; - if (liveIndex < numAverages_) { - return; //We'll keep building the array until it's full. + else if (studio_.live().getIsLiveModeOn()) { //Rolling average for live mode. + for (int i = 1; i < numAverages_; i++) { + imageArray[i-1] = imageArray[i]; } - liveIndex = 0; + imageArray[numAverages_-1] = image; } // if we are not in a state where we have acquired some frames for averaging // this case would be for Snap or end of Live routine where additional images From 7a14482da5d7f4cad834c3de5ed847e99c1738f5 Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sun, 19 Aug 2018 00:38:02 -0500 Subject: [PATCH 33/36] moved acquire Images to processor class. This is now used by both the acquisition engine runnable and for snap images. Everything appears to be working. --- .../frameaverage/FrameAveragerProcessor.java | 48 ++++++++++++++++++- .../frameaverage/FrameAveragerRunnable.java | 48 +------------------ 2 files changed, 49 insertions(+), 47 deletions(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java index b10da94..c270f48 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -102,7 +102,7 @@ else if (studio_.live().getIsLiveModeOn()) { //Rolling average for live mode. // are needed to be acquired to fill the averaging array // a Poison image indicates EOL else { //We are not in an acquisition or live mode so we must be taking a snap shot. - //acquireImages(); + acquireImages(); imageArray[0] = image; int i = 1; while (!imageQueue.isEmpty()) { @@ -230,4 +230,50 @@ private Image getAverage(Image[] imArray) { ReportingUtils.logMessage("FrameAvg Error"); } } */ + + + public void acquireImages() { + try { + studio_.core().waitForDevice(studio_.core().getCameraDevice()); + studio_.core().clearCircularBuffer(); + String cam = studio_.core().getCameraDevice(); + +// CMMCore::startSequenceAcquisition(long numImages, double intervalMs, bool stopOnOverflow) +// @param numImages Number of images requested from the camera +// @param intervalMs interval between images, currently only supported by Andor cameras +// @param stopOnOverflow whether or not the camera stops acquiring when the circular buffer is full + studio_.core().startSequenceAcquisition(numAverages_-1, 0, false); + + long now = System.currentTimeMillis(); + int frame = 1;// keep 0 free for the image from engine + // reference BurstExample.bsh + + while (studio_.core().getRemainingImageCount() > 0 || studio_.core().isSequenceRunning(cam)) { + if (studio_.core().getRemainingImageCount() > 0) { + imageQueue.add(studio_.core().popNextTaggedImage()); + frame++; + /* + if (proc_.display_ != null) { + if (proc_.display_.acquisitionIsRunning()) { + proc_.display_.displayStatusLine("Image Avg. Acquiring No. " + frame); + } + } + */ + } + } + long itTook = System.currentTimeMillis() - now; + try { + studio_.core().stopSequenceAcquisition(); + } catch (Exception ex) { + ex.printStackTrace(); + ReportingUtils.logMessage("ERROR: FrameAvg: " + ex.getMessage()); + } + if (debugLogEnabled_) { + ReportingUtils.logMessage("Averaging Acquisition took: " + itTook + " milliseconds for "+numAverages_ + " frames"); + } + } catch (Exception ex) { + ex.printStackTrace(); + ReportingUtils.logMessage("FrameAvg Error"); + } + } } \ No newline at end of file diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java index e6c3f78..29b6694 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java @@ -51,56 +51,12 @@ public void run() { try { ReportingUtils.logMessage("FrameAvg: entering runnable"); studio_.acquisitions().setPause(true); - acquireImages(); + proc_.acquireImages(); studio_.acquisitions().setPause(false); } catch (Exception ex) { ex.printStackTrace(); ReportingUtils.logMessage("ERROR: FrameAvg: while entering runnable"); } } - - public void acquireImages() { - try { - studio_.core().waitForDevice(studio_.core().getCameraDevice()); - studio_.core().clearCircularBuffer(); - String cam = studio_.core().getCameraDevice(); - -// CMMCore::startSequenceAcquisition(long numImages, double intervalMs, bool stopOnOverflow) -// @param numImages Number of images requested from the camera -// @param intervalMs interval between images, currently only supported by Andor cameras -// @param stopOnOverflow whether or not the camera stops acquiring when the circular buffer is full - studio_.core().startSequenceAcquisition(proc_.numAverages_-1, 0, false); - - long now = System.currentTimeMillis(); - int frame = 1;// keep 0 free for the image from engine - // reference BurstExample.bsh - - while (studio_.core().getRemainingImageCount() > 0 || studio_.core().isSequenceRunning(cam)) { - if (studio_.core().getRemainingImageCount() > 0) { - proc_.imageQueue.add(studio_.core().popNextTaggedImage()); - frame++; - /* - if (proc_.display_ != null) { - if (proc_.display_.acquisitionIsRunning()) { - proc_.display_.displayStatusLine("Image Avg. Acquiring No. " + frame); - } - } - */ - } - } - long itTook = System.currentTimeMillis() - now; - try { - studio_.core().stopSequenceAcquisition(); - } catch (Exception ex) { - ex.printStackTrace(); - ReportingUtils.logMessage("ERROR: FrameAvg: " + ex.getMessage()); - } - if (proc_.debugLogEnabled_) { - ReportingUtils.logMessage("Averaging Acquisition took: " + itTook + " milliseconds for "+proc_.numAverages_ + " frames"); - } - } catch (Exception ex) { - ex.printStackTrace(); - ReportingUtils.logMessage("FrameAvg Error"); - } - } + } From 0068ec1f9b87ddf4989ebb6c531aa5aef0d6a31b Mon Sep 17 00:00:00 2001 From: nanthony21 Date: Sun, 19 Aug 2018 15:18:40 -0500 Subject: [PATCH 34/36] Add the JAR --- FrameAverager.2.0/dist/FrameAverager.jar | Bin 36671 -> 42661 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/FrameAverager.2.0/dist/FrameAverager.jar b/FrameAverager.2.0/dist/FrameAverager.jar index 4937f6ac0f0dacb5b8750ffdcd7c53875c26fb21..827bbf53307ad81314e733afe4a93c5e6e05f7fd 100644 GIT binary patch delta 13944 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 EfA>9``v3p{ delta 8431 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 Date: Thu, 23 Aug 2018 01:41:03 -0500 Subject: [PATCH 35/36] update comments --- FrameAverager.2.0/MANIFEST.MF | 2 +- .../nbproject/private/private.xml | 26 +++++++++---------- .../cdp/frameaverage/FrameAveragerPlugin.java | 5 +++- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/FrameAverager.2.0/MANIFEST.MF b/FrameAverager.2.0/MANIFEST.MF index fe4b097..e069867 100644 --- a/FrameAverager.2.0/MANIFEST.MF +++ b/FrameAverager.2.0/MANIFEST.MF @@ -5,5 +5,5 @@ Signature-Title: FrameAverager Signature-Vendor: Marine Biological Laboratory (Rudolf Oldenbourg) Application-Plugin: Micro-Manager Built-By: Nick -Built-Date: 08-18-2018 +Built-Date: 08-19-2018 diff --git a/FrameAverager.2.0/nbproject/private/private.xml b/FrameAverager.2.0/nbproject/private/private.xml index 0eaf56a..ca95026 100644 --- a/FrameAverager.2.0/nbproject/private/private.xml +++ b/FrameAverager.2.0/nbproject/private/private.xml @@ -1,13 +1,13 @@ - - - - - - file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/TaggedFrameAverager.java - file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerControls.java - file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAverager.java - file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java - file:/C:/Users/N2-LiveCell/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.1.4.22/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java - - - + + + + + + file:/C:/Users/Nick/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerRunnable.java + file:/C:/Users/Nick/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerFactory.java + file:/C:/Users/Nick/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java + file:/C:/Users/Nick/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java + file:/C:/Users/Nick/Documents/Bitbucket/Micro-Manager-Addons/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerConfigurator.java + + + diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java index 213b875..e25f8a8 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerPlugin.java @@ -30,6 +30,9 @@ * @author Amitabh Verma (averma@mbl.edu), Grant Harris (gharris@mbl.edu) * Marine Biological Laboratory, Woods Hole, Mass. * + * + * Updated for Micromanager 2.0 by Nick Anthony (nicholas.anthony@northwestern.edu) + * Backman Photonics Lab, Northwestern University, Evanston, IL. */ import javax.swing.JFrame; @@ -50,7 +53,7 @@ public class FrameAveragerPlugin implements ProcessorPlugin, SciJavaPlugin { public static String menuName = "Frame Averager"; public static String tooltipDescription = "Multiple-Frame Averaging"; public static String versionNumber = "1.1"; - public static String copyright = "Nick Anthony"; + public static String copyright = ""; private Studio studio_; From 530356d9624ef9d6aca18ad1b758529df52929ea Mon Sep 17 00:00:00 2001 From: Nick Anthony Date: Tue, 18 Sep 2018 12:36:12 -0500 Subject: [PATCH 36/36] remove name --- .../src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java index c270f48..2de3654 100644 --- a/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java +++ b/FrameAverager.2.0/src/edu/mbl/cdp/frameaverage/FrameAveragerProcessor.java @@ -68,7 +68,7 @@ public void cleanup(ProcessorContext context) { @Override public SummaryMetadata processSummaryMetadata(SummaryMetadata metadata) { SummaryMetadata.SummaryMetadataBuilder builder = metadata.copy(); - builder.userName("Nicks Averager"); + builder.userName("FrameAverager"); return builder.build(); }