diff --git a/.classpath b/.classpath index 373b83c7ad36b985d889e4699104d78f14456193..46222352c47d7768e185d55b381831b0734f08cf 100644 --- a/.classpath +++ b/.classpath @@ -1,10 +1,48 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> - <classpathentry kind="src" path="src"/> + <classpathentry kind="src" path="src/main/java"/> + <classpathentry kind="src" path="src/main/resources"/> + <classpathentry kind="src" path="src/test/java"/> <classpathentry kind="lib" path="/Icy-App/plugins/adufour/ezplug/EzPlug.jar"/> <classpathentry kind="lib" path="/Icy-App/plugins/adufour/blocks/Blocks.jar"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/> <classpathentry kind="var" path="ICY_JAR"/> - <classpathentry kind="output" path="bin"/> - <referencedentry kind="lib" path="D:/Stephane/Documents/dev/GIT/Icy-App/lib/scifio.jar" sourcepath="D:/Stephane/Documents/dev/GIT/bioformats"/> + <classpathentry kind="lib" path="F:/SDKs/Java/jdk1.8.0_241/lib/tools.jar"/> + <classpathentry kind="var" path="USER_HOME/SDKs/Java/jdk1.8.0_251/lib/tools.jar"/> + <classpathentry kind="var" path="USER_HOME/SDKs/Java/jdk1.8.0_251/lib/tools.jar"/> + <classpathentry kind="var" path="USER_HOME/SDKs/Java/jdk1.8.0_251/lib/tools.jar"/> + <classpathentry kind="var" path="USER_HOME/SDKs/Java/jdk1.8.0_251/lib/tools.jar"/> + <classpathentry kind="var" path="USER_HOME/SDKs/Java/jdk1.8.0_251/lib/tools.jar"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.bioimageanalysis.icy:icy-kernel:2.1.0"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: net.sf.ehcache:ehcache:2.10.6"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.slf4j:slf4j-api:1.7.25"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.bioimageanalysis.icy:icy-bioformats:6.3.1"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.bioimageanalysis.icy:icy-insubstantial:7.3.7"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.bioimageanalysis.icy:icy-vtk:6.3.0.1"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: net.imagej:ij:1.52q"/> + <classpathentry kind="var" path="USER_HOME/SDKs/Java/jdk1.8.0_251/lib/tools.jar"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: javax.media:jai-core:1.1.3"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: javax.media:jai-codec:1.1.3"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.jogl:jogl-all:2.1.5-01"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.jogl:jogl-all-natives-linux-amd64:2.1.5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.jogl:jogl-all-natives-linux-i586:2.1.5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.jogl:jogl-all-natives-macosx-universal:2.1.5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.jogl:jogl-all-natives-windows-amd64:2.1.5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.jogl:jogl-all-natives-windows-i586:2.1.5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.gluegen:gluegen-rt:2.1.5-01"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.gluegen:gluegen-rt-natives-linux-amd64:2.1.5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.gluegen:gluegen-rt-natives-linux-i586:2.1.5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.gluegen:gluegen-rt-natives-macosx-universal:2.1.5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.gluegen:gluegen-rt-natives-windows-amd64:2.1.5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.jogamp.gluegen:gluegen-rt-natives-windows-i586:2.1.5"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.javassist:javassist:3.22.0-GA"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: net.sourceforge.jexcelapi:jxl:2.6.12"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: log4j:log4j:1.2.14"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.swinglabs.swingx:swingx-all:1.6.5-1"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.bioimageanalysis.icy:icy-blocks:1.0.1"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.bioimageanalysis.icy:icy-protocols:3.0.9"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.bioimageanalysis.icy:icy-javadocparser:1.0.0"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: com.nativelibs4java:ochafik-util:0.12"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Maven: org.bioimageanalysis.icy:icy-ezplug:3.15.13"/> + <classpathentry kind="output" path="target/classes"/> </classpath> diff --git a/.gitignore b/.gitignore index 88e283fbbe38edf75f524ead36b103a8eeb25e1a..4d6d26eb5c996073a0b63007cf16faee399b26cd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ -bin -*.jar - +.idea/ +.settings/ +build/ +target/ +*.iml +*.eml +.classpath +.project \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..ff1742542d6363c006ec70520db33f20b37886d0 --- /dev/null +++ b/pom.xml @@ -0,0 +1,82 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>icy-sequence-blocks</artifactId> + <version>2.0.14</version> + + <packaging>jar</packaging> + + <name>SequenceBlocks</name> + <description> + This plugin allows one to use various basic sequence operations within Blocks. + </description> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <jdk.version>1.8</jdk.version> + + <maven.compiler.source>1.8</maven.compiler.source> + <maven.compiler.target>1.8</maven.compiler.target> + + <outputJar>${project.build.outputDirectory}/../plugin</outputJar> + </properties> + + <build> + <finalName>${project.artifactId}</finalName> + + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.1.2</version> + <configuration> + <outputDirectory>${outputJar}</outputDirectory> + <archive> + <manifest> + <addClasspath>true</addClasspath> + <mainClass>plugins.tprovoost.sequenceblocks.SequenceBlocks</mainClass> + </manifest> + </archive> + </configuration> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>icy-kernel</artifactId> + <version>2.1.0</version> + </dependency> + <dependency> + <groupId>org.bioimageanalysis.icy</groupId> + <artifactId>icy-blocks</artifactId> + <version>1.0.1</version> + </dependency> + </dependencies> + + <repositories> + <repository> + <id>icy</id> + <url>https://icy-nexus.pasteur.fr/repository/Icy/</url> + </repository> + </repositories> + + <distributionManagement> + <snapshotRepository> + <id>icy-dev</id> + <name>icy-dev</name> + <url>https://icy-nexus-dev.pasteur.cloud/repository/icy-core/</url> + </snapshotRepository> + <repository> + <id>icy-prod</id> + <name>icy-prod</name> + <url>https://icy-nexus.pasteur.fr/repository/icy-core/</url> + </repository> + </distributionManagement> + +</project> \ No newline at end of file diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/SequenceBlocks.java b/src/main/java/plugins/tprovoost/sequenceblocks/SequenceBlocks.java new file mode 100644 index 0000000000000000000000000000000000000000..2a194ff3f2e713996cbec739d8681a9f72cc710c --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/SequenceBlocks.java @@ -0,0 +1,16 @@ +package plugins.tprovoost.sequenceblocks; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginLibrary; + +/** + * This class is used as a main class for all the blocks contained in this + * package. Each Block has a specified dedicated purpose. More documentation on + * the concerned files. + * + * @author thomasprovoost + */ +public class SequenceBlocks extends Plugin implements PluginLibrary +{ + // +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/add/AddOverlays.java b/src/main/java/plugins/tprovoost/sequenceblocks/add/AddOverlays.java new file mode 100644 index 0000000000000000000000000000000000000000..4251b970849bbe310e71ff4160b4fbf00e20e712 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/add/AddOverlays.java @@ -0,0 +1,79 @@ +package plugins.tprovoost.sequenceblocks.add; + +import icy.painter.Overlay; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to add one or several {@link Overlay} to a Sequence + * + * @author Stephane + */ +public class AddOverlays extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarArray<Overlay> overlays = new VarArray<Overlay>("Overlay(s)", Overlay[].class, new Overlay[0]) + { + @Override + public String getValueAsString() + { + final Overlay[] value = getValue(); + + if (value == null || value.length == 0) + return "No overlay"; + + return value.length + " overlay"; + } + }; + + @Override + public void run() + { + final Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + + final Overlay[] o = overlays.getValue(); + if (o != null) + { + s.beginUpdate(); + try + { + for (Overlay overlay : o) + s.addOverlay(overlay); + } + finally + { + s.endUpdate(); + } + } + + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("overlay(s)", overlays); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/add/AddRois.java b/src/main/java/plugins/tprovoost/sequenceblocks/add/AddRois.java new file mode 100644 index 0000000000000000000000000000000000000000..cbf26c84a61aa965af654edd9d7f4973873a6d8e --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/add/AddRois.java @@ -0,0 +1,63 @@ +package plugins.tprovoost.sequenceblocks.add; + +import java.util.Arrays; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to add one or several {@link ROI} to a Sequence + * + * @author Stephane + */ +public class AddRois extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarROIArray rois = new VarROIArray("Roi(s)"); + final protected VarBoolean removePrevious = new VarBoolean("Remove previous", Boolean.FALSE); + + @Override + public void run() + { + final Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + + if (removePrevious.getValue().booleanValue()) + s.removeAllROI(); + + final ROI[] r = rois.getValue(); + if (r != null) + s.addROIs(Arrays.asList(r), false); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("rois(s)", rois); + inputMap.add("remove", removePrevious); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/convert/ConvertColor.java b/src/main/java/plugins/tprovoost/sequenceblocks/convert/ConvertColor.java new file mode 100644 index 0000000000000000000000000000000000000000..3347c0383581322dec8dd49b53031d25eea44751 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/convert/ConvertColor.java @@ -0,0 +1,131 @@ +package plugins.tprovoost.sequenceblocks.convert; + +import java.awt.image.BufferedImage; + +import icy.image.IcyBufferedImageUtil; +import icy.image.lut.LUT; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import icy.util.OMEUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarEnum; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to render a given Sequence using a specific LUT.<br> + * The result can be provided ARGB, RGB or GRAY sequence. + * + * @author Stephane + */ +public class ConvertColor extends Plugin implements SequenceBlock, PluginBundled +{ + public static enum ColorConversion + { + GRAY, RGB, ARGB; + }; + + final protected VarSequence EZseq = new VarSequence("Sequence", null); + final protected VarEnum<ColorConversion> EZtype = new VarEnum<ColorConversion>("Conversion", ColorConversion.ARGB); + final protected Var<LUT> EZlut = new Var<LUT>("Lut", LUT.class); + final protected VarSequence varOut = new VarSequence("Out", null); + + @Override + public void run() + { + Sequence s; + + // EZ PLUG + s = EZseq.getValue(); + if (s == null) + throw new VarException(EZseq, "Input sequence is null."); + + varOut.setValue(convertColor(s, getImageType(EZtype.getValue()), EZlut.getValue())); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("Sequence", EZseq); + inputMap.add("Conversion", EZtype); + inputMap.add("Lut", EZlut); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("Out", varOut); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } + + public static int getImageType(ColorConversion value) + { + switch (value) + { + default: + case ARGB: + return BufferedImage.TYPE_INT_ARGB; + + case RGB: + return BufferedImage.TYPE_INT_RGB; + + case GRAY: + return BufferedImage.TYPE_BYTE_GRAY; + } + } + + public static Sequence convertColor(Sequence source, int imageType, LUT lut) + { + final Sequence result = new Sequence(OMEUtil.createOMEXMLMetadata(source.getOMEXMLMetadata())); + // image receiver + final BufferedImage imgOut = new BufferedImage(source.getSizeX(), source.getSizeY(), imageType); + + result.beginUpdate(); + try + { + for (int t = 0; t < source.getSizeT(); t++) + for (int z = 0; z < source.getSizeZ(); z++) + result.setImage(t, z, IcyBufferedImageUtil.toBufferedImage(source.getImage(t, z), imgOut, lut)); + + // rename channels and set final name + switch (imageType) + { + default: + case BufferedImage.TYPE_INT_ARGB: + result.setChannelName(0, "red"); + result.setChannelName(1, "green"); + result.setChannelName(2, "blue"); + result.setChannelName(3, "alpha"); + result.setName(source.getName() + " (ARGB rendering)"); + break; + + case BufferedImage.TYPE_INT_RGB: + result.setChannelName(0, "red"); + result.setChannelName(1, "green"); + result.setChannelName(2, "blue"); + result.setName(source.getName() + " (RGB rendering)"); + break; + + case BufferedImage.TYPE_BYTE_GRAY: + result.setChannelName(0, "gray"); + result.setName(source.getName() + " (gray rendering)"); + break; + } + } + finally + { + result.endUpdate(); + } + + return result; + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/convert/ConvertStack.java b/src/main/java/plugins/tprovoost/sequenceblocks/convert/ConvertStack.java new file mode 100644 index 0000000000000000000000000000000000000000..e7dbfdcaff0953815304a16d920bcecffe335b6a --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/convert/ConvertStack.java @@ -0,0 +1,63 @@ +package plugins.tprovoost.sequenceblocks.convert; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarEnum; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class ConvertStack extends Plugin implements SequenceBlock, PluginBundled +{ + public static enum TypeConversion + { + STACK, TIME + }; + + final protected VarEnum<TypeConversion> type = new VarEnum<TypeConversion>("Type Wanted", TypeConversion.STACK); + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarSequence outputSequence = new VarSequence("Out", null); + + @Override + public void run() + { + Sequence in = inputSequence.getValue(); + if (in == null) + throw new VarException(inputSequence, "Input sequence is null."); + + // create a copy as we don't want to modify input + Sequence out = SequenceUtil.getCopy(in); + if (type.getValue() == TypeConversion.TIME) + SequenceUtil.convertToTime(out); + else + SequenceUtil.convertToStack(out); + outputSequence.setValue(out); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("Type Wanted", type); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("out", outputSequence); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } + +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/convert/ConvertType.java b/src/main/java/plugins/tprovoost/sequenceblocks/convert/ConvertType.java new file mode 100644 index 0000000000000000000000000000000000000000..0ec910c079fb9de5b9768bfaf77ce9a819140c9a --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/convert/ConvertType.java @@ -0,0 +1,57 @@ +package plugins.tprovoost.sequenceblocks.convert; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import icy.type.DataType; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarEnum; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class ConvertType extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarEnum<DataType> type = new VarEnum<DataType>("Type Wanted", DataType.UBYTE); + final protected VarSequence inputSequence = new VarSequence("sequence", null); + final protected VarSequence outputSequence = new VarSequence("converted", null); + final protected VarBoolean rescale = new VarBoolean("Rescale", Boolean.TRUE); + + @Override + public void run() + { + Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + + outputSequence.setValue(SequenceUtil.convertToType(s, type.getValue(), rescale.getValue().booleanValue())); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("Type Wanted", type); + inputMap.add("Rescale", rescale); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("converted", outputSequence); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } + +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/convert/Resize.java b/src/main/java/plugins/tprovoost/sequenceblocks/convert/Resize.java new file mode 100644 index 0000000000000000000000000000000000000000..b222d0f51980e8838a83101c485c9a8b8ae8a1a2 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/convert/Resize.java @@ -0,0 +1,92 @@ +package plugins.tprovoost.sequenceblocks.convert; + +import icy.image.IcyBufferedImageUtil.FilterType; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; + +import javax.swing.SwingConstants; + +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarEnum; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +public class Resize extends Plugin implements SequenceBlock, PluginBundled +{ + protected enum Proportional + { + NO, TO_WIDTH, TO_HEIGHT + }; + + final protected VarSequence EZseq = new VarSequence("Sequence", null); + final protected VarInteger EZsizew = new VarInteger("Width", 320); + final protected VarInteger EZsizeh = new VarInteger("Height", 200); + final protected VarEnum<Proportional> EZproportional = new VarEnum<Proportional>("Proportional", Proportional.NO); + final protected VarBoolean EZscale = new VarBoolean("Scale content", Boolean.TRUE); + final protected VarEnum<FilterType> EZtype = new VarEnum<FilterType>("Filter", FilterType.BICUBIC); + final protected VarSequence varOut = new VarSequence("Out", null); + + @Override + public void run() + { + Sequence s; + int w, h; + FilterType type; + + // EZ PLUG + s = EZseq.getValue(); + w = EZsizew.getValue().intValue(); + h = EZsizeh.getValue().intValue(); + type = EZtype.getValue(); + + if (s == null || w <= 0 || h <= 0) + throw new VarException(null, "No sequence chosen for resize, or wrong size."); + + double scale = 1d * s.getWidth() / s.getHeight(); + switch (EZproportional.getValue()) + { + case NO: + break; + case TO_WIDTH: + h = (int) (w / scale); + break; + case TO_HEIGHT: + w = (int) (scale * h); + break; + } + + if (EZscale.getValue().booleanValue()) + varOut.setValue(SequenceUtil.scale(s, w, h, type)); + else + varOut.setValue(SequenceUtil.scale(s, w, h, false, SwingConstants.CENTER, SwingConstants.CENTER, type)); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("Sequence", EZseq); + inputMap.add("Width", EZsizew); + inputMap.add("Height", EZsizeh); + inputMap.add("Proportional", EZproportional); + inputMap.add("Filter", EZtype); + inputMap.add("Scale content", EZscale); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("Out", varOut); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/creation/CombineChannels.java b/src/main/java/plugins/tprovoost/sequenceblocks/creation/CombineChannels.java new file mode 100644 index 0000000000000000000000000000000000000000..b1fc9e1f6ab9986312da533bd14eb6995e3d58a7 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/creation/CombineChannels.java @@ -0,0 +1,89 @@ +package plugins.tprovoost.sequenceblocks.creation; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarIntegerArrayNative; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class CombineChannels extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence 1", null); + final protected VarSequence inputSequence2 = new VarSequence("Sequence 2", null); + final protected VarSequence outputSequence = new VarSequence("Merged", null); + final protected VarIntegerArrayNative channelIdx = new VarIntegerArrayNative("Channel(s) 1", new int[] {0}); + final protected VarIntegerArrayNative channelIdx2 = new VarIntegerArrayNative("Channel(s) 2", new int[] {0}); + final protected VarBoolean fillStackHole = new VarBoolean("Fill stack hole", Boolean.TRUE); + final protected VarBoolean fitToMaxSize = new VarBoolean("Fit to max size", Boolean.TRUE); + + @Override + public void run() + { + Sequence s = inputSequence.getValue(); + Sequence s2 = inputSequence2.getValue(); + + if (s == null) + throw new VarException(inputSequence, "Input sequence 1 is null."); + if (s2 == null) + throw new VarException(inputSequence2, "Input sequence 2 is null."); + + int[] channels1 = channelIdx.getValue(); + int[] channels2 = channelIdx2.getValue(); + int sizeC1 = channels1.length; + int sizeC2 = channels2.length; + + // Because of concatC, it is necessary to create a sequence[] and int[] of the same size, + // and duplicate the sequence as many times in the first as necessary. + Sequence[] sequences = new Sequence[sizeC1 + sizeC2]; + int channels[] = new int[sizeC1 + sizeC2]; + + for (int i = 0; i < sizeC1; ++i) + { + sequences[i] = s; + channels[i] = channels1[i]; + } + for (int i = 0; i < sizeC2; ++i) + { + sequences[sizeC1 + i] = s2; + channels[sizeC1 + i] = channels2[i]; + } + + final Sequence res = SequenceUtil.concatC(sequences, channels, fillStackHole.getValue().booleanValue(), + fitToMaxSize.getValue().booleanValue(), null); + + outputSequence.setValue(res); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence 1", inputSequence); + inputMap.add("Channel 1", channelIdx); + inputMap.add("sequence 2", inputSequence2); + inputMap.add("Channel 2", channelIdx2); + inputMap.add("fit to max size", fitToMaxSize); + inputMap.add("fill stack hole", fillStackHole); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("out", outputSequence); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/creation/CreateSequence.java b/src/main/java/plugins/tprovoost/sequenceblocks/creation/CreateSequence.java new file mode 100644 index 0000000000000000000000000000000000000000..a133b94e6c608e5d912586d90084bed0b526f516 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/creation/CreateSequence.java @@ -0,0 +1,45 @@ +package plugins.tprovoost.sequenceblocks.creation; + +import icy.image.IcyBufferedImage; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarSequence; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class CreateSequence extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected Var<IcyBufferedImage> in = new Var<IcyBufferedImage>("image (optional)", IcyBufferedImage.class); + final protected VarSequence out = new VarSequence("sequence", null); + + @Override + public void run() + { + out.setValue(new Sequence(in.getValue())); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("image (optional)", in); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("sequence", out); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/creation/DuplicateSequence.java b/src/main/java/plugins/tprovoost/sequenceblocks/creation/DuplicateSequence.java new file mode 100644 index 0000000000000000000000000000000000000000..3379d9d69b177f8b4042ec975f642ec13eb76161 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/creation/DuplicateSequence.java @@ -0,0 +1,48 @@ +package plugins.tprovoost.sequenceblocks.creation; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class DuplicateSequence extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence in = new VarSequence("sequence", null); + final protected VarSequence out = new VarSequence("duplicated", null); + + @Override + public void run() + { + Sequence s = in.getValue(); + if (s == null) + throw new VarException(in, "Input Sequence is null."); + out.setValue(SequenceUtil.getCopy(s)); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", in); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("duplicated", out); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/extract/CropCZT.java b/src/main/java/plugins/tprovoost/sequenceblocks/extract/CropCZT.java new file mode 100644 index 0000000000000000000000000000000000000000..4ffa86cedabf80fd2f6c2df656f67a8e267010bb --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/extract/CropCZT.java @@ -0,0 +1,84 @@ +package plugins.tprovoost.sequenceblocks.extract; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import icy.type.rectangle.Rectangle5D; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +public class CropCZT extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSeq = new VarSequence("Sequence", null); + final protected VarInteger varStartC = new VarInteger("Start index C", 0); + final protected VarInteger varSizeC = new VarInteger("Size C", 1); + final protected VarInteger varStartZ = new VarInteger("Start index Z", 0); + final protected VarInteger varSizeZ = new VarInteger("Size Z", 1); + final protected VarInteger varStartT = new VarInteger("Start index T", 0); + final protected VarInteger varSizeT = new VarInteger("Size T", 1); + final protected VarSequence varOut = new VarSequence("Out", null); + + @Override + public void run() + { + final Sequence seq; + final int startX, sizeX; + final int startY, sizeY; + final int startC, sizeC; + final int startZ, sizeZ; + final int startT, sizeT; + + // EZ PLUG + seq = varSeq.getValue(); + + if (seq == null) + throw new VarException(varSeq, "No sequence chosen !"); + + startC = Math.min(varStartC.getValue().intValue(), seq.getSizeC() - 1); + sizeC = Math.min(varSizeC.getValue().intValue(), seq.getSizeC() - startC); + startZ = Math.min(varStartZ.getValue().intValue(), seq.getSizeZ() - 1); + sizeZ = Math.min(varSizeZ.getValue().intValue(), seq.getSizeZ() - startZ); + startT = Math.min(varStartT.getValue().intValue(), seq.getSizeT() - 1); + sizeT = Math.min(varSizeT.getValue().intValue(), seq.getSizeT() - startT); + + startX = 0; + sizeX = seq.getSizeX(); + startY = 0; + sizeY = seq.getSizeY(); + + if ((sizeC <= 0) || (sizeZ <= 0) || (sizeT <= 0)) + throw new VarException(null, "Size C/Z/T cannot be <= 0 !"); + + varOut.setValue(SequenceUtil.getSubSequence(seq, + new Rectangle5D.Integer(startX, startY, startZ, startT, startC, sizeX, sizeY, sizeZ, sizeT, sizeC))); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("Sequence", varSeq); + inputMap.add("Start index C", varStartC); + inputMap.add("Size C", varSizeC); + inputMap.add("Start index Z", varStartZ); + inputMap.add("Size Z", varSizeZ); + inputMap.add("Start index T", varStartT); + inputMap.add("Size T", varSizeT); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("Out", varOut); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/extract/CropSequence.java b/src/main/java/plugins/tprovoost/sequenceblocks/extract/CropSequence.java new file mode 100644 index 0000000000000000000000000000000000000000..8379e58ac9ea4c6463923fd0a91c39de50fc4176 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/extract/CropSequence.java @@ -0,0 +1,84 @@ +package plugins.tprovoost.sequenceblocks.extract; + +import java.util.ArrayList; +import java.util.List; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import icy.roi.ROIUtil; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import icy.type.collection.CollectionUtil; +import icy.util.ShapeUtil.BooleanOperator; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarMutable; +import plugins.adufour.vars.lang.VarSequence; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class CropSequence extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + VarMutable inputROIs = new VarMutable("ROI(s)", null) + { + @Override + public boolean isAssignableFrom(@SuppressWarnings("rawtypes") Var source) + { + return (ROI.class == source.getType()) || (ROI[].class == source.getType()); + } + }; + final protected VarSequence outputSequence = new VarSequence("Cropped", null); + + @Override + public void run() + { + outputSequence.setValue(null); + + final Sequence s = inputSequence.getValue(); + if (s == null) + return; + + final Object obj = inputROIs.getValue(); + if (obj == null) + return; + + final List<ROI> rois; + + if (obj instanceof ROI) + { + rois = new ArrayList<ROI>(); + rois.add((ROI) obj); + } + else + rois = CollectionUtil.asList((ROI[]) obj); + + final ROI roi = ROIUtil.merge(rois, BooleanOperator.OR); + + outputSequence.setValue(SequenceUtil.getSubSequence(s, roi)); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("roi", inputROIs); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("cropped", outputSequence); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractChannel.java b/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractChannel.java new file mode 100644 index 0000000000000000000000000000000000000000..4ed5c38a906119a45c9443916dcbc0f64b407303 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractChannel.java @@ -0,0 +1,59 @@ +package plugins.tprovoost.sequenceblocks.extract; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class ExtractChannel extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarSequence outputSequence = new VarSequence("Extracted", null); + final protected VarInteger channelIdx = new VarInteger("Channel", 0); + + @Override + public void run() + { + final Sequence s = inputSequence.getValue(); + final int channel = channelIdx.getValue().intValue(); + + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + if (channel < 0 || channel >= s.getSizeC()) + throw new VarException(channelIdx, "Channel index must be between 0 and " + (s.getSizeC() - 1)); + + final Sequence res = SequenceUtil.extractChannel(s, channelIdx.getValue().intValue()); + res.setName(s.getName() + " - channel: " + channelIdx.getValue()); + + outputSequence.setValue(res); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("channel", channelIdx); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("extracted", outputSequence); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractMultiChannels.java b/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractMultiChannels.java new file mode 100644 index 0000000000000000000000000000000000000000..56f892e270db6be695126a830ba2288a3c6fd34c --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractMultiChannels.java @@ -0,0 +1,53 @@ +package plugins.tprovoost.sequenceblocks.extract; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarIntegerArrayNative; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class ExtractMultiChannels extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarSequence outputSequence = new VarSequence("Extracted", null); + final protected VarIntegerArrayNative channelIdx = new VarIntegerArrayNative("Channel(s)", new int[] {0}); + + @Override + public void run() + { + Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + Sequence res = SequenceUtil.extractChannels(s, channelIdx.getValue()); + res.setName(s.getName() + " - channel: " + channelIdx.getValue()); + outputSequence.setValue(res); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("Channel", channelIdx); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("extracted", outputSequence); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractSlice.java b/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractSlice.java new file mode 100644 index 0000000000000000000000000000000000000000..d579387491349753cca9cd09c52da5f1251b42ff --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractSlice.java @@ -0,0 +1,52 @@ +package plugins.tprovoost.sequenceblocks.extract; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class ExtractSlice extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarSequence outputSequence = new VarSequence("Extracted", null); + final protected VarInteger chosenZ = new VarInteger("Z", 0); + + @Override + public void run() + { + Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + Sequence extracted = SequenceUtil.extractSlice(s, chosenZ.getValue().intValue()); + outputSequence.setValue(extracted); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("Z pos", chosenZ); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("extracted", outputSequence); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractTime.java b/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractTime.java new file mode 100644 index 0000000000000000000000000000000000000000..67004582a278dc3e3a131b459f585dd3240ee3d9 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/extract/ExtractTime.java @@ -0,0 +1,52 @@ +package plugins.tprovoost.sequenceblocks.extract; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class ExtractTime extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarSequence outputSequence = new VarSequence("Extracted", null); + final protected VarInteger chosenT = new VarInteger("T", 0); + + @Override + public void run() + { + Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + Sequence extracted = SequenceUtil.extractFrame(s, chosenT.getValue().intValue()); + outputSequence.setValue(extracted); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("T pos", chosenT); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("extracted", outputSequence); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/files/IsFileValid.java b/src/main/java/plugins/tprovoost/sequenceblocks/files/IsFileValid.java new file mode 100644 index 0000000000000000000000000000000000000000..7b250ea63ee1f64ff2098b761f9ae3420856928f --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/files/IsFileValid.java @@ -0,0 +1,67 @@ +package plugins.tprovoost.sequenceblocks.files; + +import java.io.File; + +import icy.file.Loader; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarMutable; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to know if a file represents an image file + * + * @author Stephane + */ +public class IsFileValid extends Plugin implements PluginLibrary, SequenceBlock, PluginBundled +{ + final protected VarMutable f_in = new VarMutable("File", null) + { + @Override + public boolean isAssignableFrom(@SuppressWarnings("rawtypes") Var source) + { + return String.class == source.getType() || File.class == source.getType(); + } + }; + final protected VarBoolean result = new VarBoolean("Valid", Boolean.FALSE); + + @Override + public void run() + { + final Object obj = f_in.getValue(); + if (obj != null) + { + final File f; + + if (obj instanceof String) + f = new File((String) obj); + else + f = (File) obj; + + result.setValue(Boolean.valueOf(Loader.isSupportedImageFile(f.getAbsolutePath()))); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("file", f_in); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("valid", result); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/files/LoadMetadata.java b/src/main/java/plugins/tprovoost/sequenceblocks/files/LoadMetadata.java new file mode 100644 index 0000000000000000000000000000000000000000..18d6f4f772b5345e9bc3a93cac28576b594cf0eb --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/files/LoadMetadata.java @@ -0,0 +1,85 @@ +package plugins.tprovoost.sequenceblocks.files; + +import java.io.File; + +import icy.file.Loader; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.MetaDataUtil; +import ome.xml.meta.OMEXMLMetadata; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarMutable; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to load Sequence metadata from a file + * + * @author Stephane + */ +public class LoadMetadata extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarMutable f_in = new VarMutable("File", null) + { + @Override + public boolean isAssignableFrom(@SuppressWarnings("rawtypes") Var source) + { + return (String.class == source.getType()) || (File.class == source.getType()); + } + }; + final protected Var<OMEXMLMetadata> output = new Var<OMEXMLMetadata>("Metadata", OMEXMLMetadata.class); + final protected VarInteger numSerie = new VarInteger("Series number", 1); + + @Override + public void run() + { + final Object obj = f_in.getValue(); + if (obj != null) + { + final File f; + + if (obj instanceof String) + f = new File((String) obj); + else + f = (File) obj; + + try + { + final OMEXMLMetadata meta = Loader.getOMEXMLMetaData(f.getAbsolutePath()); + + if (meta != null) + { + output.setValue(meta); + numSerie.setValue(Integer.valueOf(MetaDataUtil.getNumSeries(meta))); + } + } + catch (Exception e) + { + throw new VarException(null, e.getMessage()); + } + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("file", f_in); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("Metadata", output); + outputMap.add("Serie number", numSerie); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/files/LoadSequence.java b/src/main/java/plugins/tprovoost/sequenceblocks/files/LoadSequence.java new file mode 100644 index 0000000000000000000000000000000000000000..a0135c26ff104affc10665ff975f57d31dca0090 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/files/LoadSequence.java @@ -0,0 +1,74 @@ +package plugins.tprovoost.sequenceblocks.files; + +import java.io.File; + +import icy.file.Loader; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarMutable; +import plugins.adufour.vars.lang.VarSequence; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to load a Sequence from a file + * + * @author Stephane + */ +public class LoadSequence extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarMutable f_in = new VarMutable("File", null) + { + @Override + public boolean isAssignableFrom(@SuppressWarnings("rawtypes") Var source) + { + return (String.class == source.getType()) || (File.class == source.getType()); + } + }; + final protected VarInteger serie_in = new VarInteger("Series", 0); + final protected VarSequence outputSequence = new VarSequence("Sequence", null); + + @Override + public void run() + { + final Object obj = f_in.getValue(); + if (obj != null) + { + final File f; + + if (obj instanceof String) + f = new File((String) obj); + else + f = (File) obj; + + // if (f.isDirectory()) + // throw new VarException("file should not be a directory."); + + outputSequence.setValue(Loader.loadSequence(f.getAbsolutePath(), serie_in.getValue().intValue(), false)); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("file", f_in); + inputMap.add("serie", serie_in); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("sequence", outputSequence); + + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/files/LoadSubSequence.java b/src/main/java/plugins/tprovoost/sequenceblocks/files/LoadSubSequence.java new file mode 100644 index 0000000000000000000000000000000000000000..27861d6e9ba7ff4355f2378d207eef31e5495789 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/files/LoadSubSequence.java @@ -0,0 +1,137 @@ +package plugins.tprovoost.sequenceblocks.files; + +import java.io.File; + +import icy.file.Loader; +import icy.file.SequenceFileImporter; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import plugins.adufour.blocks.tools.io.IOBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarMutable; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to returns a Sequence with the given parameters from the specified closed) SequenceFileImporter. + * + * @author Stephane + */ +public class LoadSubSequence extends Plugin implements IOBlock, PluginLibrary, PluginBundled +{ + final protected Var<SequenceFileImporter> importer; + final protected VarMutable file; + final protected VarInteger series; + final protected VarInteger resolution; + final protected VarROIArray region; + final protected VarInteger minZIndex; + final protected VarInteger maxZIndex; + final protected VarInteger minTIndex; + final protected VarInteger maxTIndex; + final protected VarInteger cIndex; + final protected VarBoolean showProgress; + + final protected VarSequence sequence; + + public LoadSubSequence() + { + super(); + + importer = new Var<SequenceFileImporter>("Importer", SequenceFileImporter.class); + file = new VarMutable("File", null) + { + @Override + public boolean isAssignableFrom(@SuppressWarnings("rawtypes") Var source) + { + return (String.class == source.getType()) || (File.class == source.getType()); + } + }; + series = new VarInteger("Series", 0); + resolution = new VarInteger("Resolution (0=full, 1=1/2, ..)", 0); + region = new VarROIArray("XY region (ROI)", null); + minZIndex = new VarInteger("Z min (slice)", -1); + maxZIndex = new VarInteger("Z max (slice)", -1); + minTIndex = new VarInteger("T min (frame)", -1); + maxTIndex = new VarInteger("T max (frame)", -1); + cIndex = new VarInteger("C (channel) index", -1); + showProgress = new VarBoolean("Show progress", Boolean.FALSE); + + sequence = new VarSequence("Sequence", null); + } + + @Override + public void run() + { + final String path; + final Object obj = file.getValue(); + + if (obj != null) + { + if (obj instanceof String) + path = (String) obj; + else + path = ((File) obj).getAbsolutePath(); + } + else + throw new VarException(file, "File is null !"); + + // here importer can be null so we don't test for it + final SequenceFileImporter imp = importer.getValue(); + final int s = series.getValue().intValue(); + final int r = resolution.getValue().intValue(); + final ROI[] rois = region.getValue(); + final ROI roi = ((rois != null) && (rois.length > 0)) ? rois[0] : null; + final int minZ = minZIndex.getValue().intValue(); + final int maxZ = maxZIndex.getValue().intValue(); + final int minT = minTIndex.getValue().intValue(); + final int maxT = maxTIndex.getValue().intValue(); + final int c = cIndex.getValue().intValue(); + final boolean progress = showProgress.getValue().booleanValue(); + + try + { + sequence.setValue(Loader.loadSequence(imp, path, s, r, + (roi != null) ? roi.getBounds5D().toRectangle2D().getBounds() : null, minZ, maxZ, minT, maxT, c, + false, progress)); + } + catch (Exception e) + { + throw new VarException(importer, e.getMessage()); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("file", file); + inputMap.add("importer", importer); + inputMap.add("series", series); + inputMap.add("resolution", resolution); + inputMap.add("region", region); + inputMap.add("minZ", minZIndex); + inputMap.add("maxZ", maxZIndex); + inputMap.add("minT", minTIndex); + inputMap.add("maxT", maxTIndex); + inputMap.add("cIndex", cIndex); + inputMap.add("showProgress", showProgress); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("sequence", sequence); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/files/SaveMetadata.java b/src/main/java/plugins/tprovoost/sequenceblocks/files/SaveMetadata.java new file mode 100644 index 0000000000000000000000000000000000000000..da349443a7c1a076f753fa90ce8357d351de78aa --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/files/SaveMetadata.java @@ -0,0 +1,51 @@ +package plugins.tprovoost.sequenceblocks.files; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to save Sequence metadata + * + * @author Stephane + */ +public class SaveMetadata extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence sequence = new VarSequence("Sequence", null); + final protected VarBoolean success = new VarBoolean("Success", Boolean.FALSE); + + @Override + public void run() + { + Sequence s = sequence.getValue(); + if (s == null) + throw new VarException(sequence, "Sequence is null"); + + success.setValue(Boolean.valueOf(s.saveXMLData())); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", sequence); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("success", success); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/files/SaveSequence.java b/src/main/java/plugins/tprovoost/sequenceblocks/files/SaveSequence.java new file mode 100644 index 0000000000000000000000000000000000000000..98e0a217d376abab46e8ca183f7d8d76f60cf758 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/files/SaveSequence.java @@ -0,0 +1,98 @@ +package plugins.tprovoost.sequenceblocks.files; + +import java.io.File; + +import icy.file.FileUtil; +import icy.file.ImageFileFormat; +import icy.file.Saver; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarEnum; +import plugins.adufour.vars.lang.VarMutable; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to save a Sequence into a file + * + * @author Stephane + */ +public class SaveSequence extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarMutable f_in = new VarMutable("File", null) + { + @Override + public boolean isAssignableFrom(@SuppressWarnings("rawtypes") Var source) + { + return String.class == source.getType() || File.class == source.getType(); + } + }; + final protected VarBoolean overwriteForce = new VarBoolean("Overwrite", Boolean.TRUE); + final protected VarBoolean multipleFile = new VarBoolean("Multiple file", Boolean.FALSE); + final protected VarSequence sequence = new VarSequence("Sequence", null); + final protected VarEnum<ImageFileFormat> format = new VarEnum<ImageFileFormat>("Format", ImageFileFormat.TIFF); + + @Override + public void run() + { + final Sequence seq = sequence.getValue(); + + if (seq != null) + { + final Object obj = f_in.getValue(); + + if (obj != null) + { + String path; + + if (obj instanceof String) + path = (String) obj; + else + path = ((File) obj).getAbsolutePath(); + + if (FileUtil.isDirectory(path)) + path += FileUtil.separator + FileUtil.getFileName(seq.getOutputFilename(false)); + + // force extension depending file format + path = FileUtil.setExtension(path, "." + format.getValue().getExtensions()[0]); + + // cannot overwrite ?? + if (FileUtil.exists(path) && !overwriteForce.getValue().booleanValue()) + throw new VarException(f_in, + "File already exists. If you want to overwrite, please check the \"overwrite\" field."); + + // save sequence + Saver.save(seq, new File(path), multipleFile.getValue().booleanValue(), false); + } + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("file", f_in); + inputMap.add("sequence", sequence); + inputMap.add("format", format); + inputMap.add("overwrite", overwriteForce); + inputMap.add("multiple file", multipleFile); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/images/AddImage.java b/src/main/java/plugins/tprovoost/sequenceblocks/images/AddImage.java new file mode 100644 index 0000000000000000000000000000000000000000..35c88c4382df3f77107de3bb9941afcc29644ffd --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/images/AddImage.java @@ -0,0 +1,52 @@ +package plugins.tprovoost.sequenceblocks.images; + +import icy.image.IcyBufferedImage; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Add an image to the Sequence. + * + * @author thomasprovoost + */ +public class AddImage extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected Var<IcyBufferedImage> in = new Var<IcyBufferedImage>("Image", IcyBufferedImage.class); + final protected VarSequence varSeq = new VarSequence("Sequence", null); + + @Override + public void run() + { + Sequence s = varSeq.getValue(); + if (s == null) + throw new VarException(varSeq, "Input sequence is null."); + s.addImage(in.getValue()); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSeq); + inputMap.add("image", in); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/images/AsImageArray.java b/src/main/java/plugins/tprovoost/sequenceblocks/images/AsImageArray.java new file mode 100644 index 0000000000000000000000000000000000000000..6179b1a66f700887799fc1cf7dab0f8cc0468865 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/images/AsImageArray.java @@ -0,0 +1,51 @@ +package plugins.tprovoost.sequenceblocks.images; + +import icy.image.IcyBufferedImage; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Returns all images from the Sequence as an image array. + * + * @author thomasprovoost + */ +public class AsImageArray extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarArray<IcyBufferedImage> out = new VarArray<IcyBufferedImage>("Image array", IcyBufferedImage[].class, null); + final protected VarSequence varSeq = new VarSequence("Sequence", null); + + @Override + public void run() + { + Sequence s = varSeq.getValue(); + if (s == null) + throw new VarException(varSeq, "Input sequence is null."); + out.setValue(s.getAllImage().toArray(new IcyBufferedImage[0])); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSeq); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("image array", out); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/images/GetImage.java b/src/main/java/plugins/tprovoost/sequenceblocks/images/GetImage.java new file mode 100644 index 0000000000000000000000000000000000000000..748afec03790b1bf400c205071f10a4999cf8aea --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/images/GetImage.java @@ -0,0 +1,56 @@ +package plugins.tprovoost.sequenceblocks.images; + +import icy.image.IcyBufferedImage; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Get the image at the given [T,Z] position from the Sequence. + * + * @author thomasprovoost + */ +public class GetImage extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence varSeq = new VarSequence("Sequence", null); + final protected VarInteger imgIdxT = new VarInteger("T", -1); + final protected VarInteger imgIdxZ = new VarInteger("Z", -1); + final protected Var<IcyBufferedImage> out = new Var<IcyBufferedImage>("out", IcyBufferedImage.class); + + @Override + public void run() + { + Sequence s = varSeq.getValue(); + if (s == null) + throw new VarException(varSeq, "Input sequence is null."); + out.setValue(s.getImage(imgIdxT.getValue().intValue(), imgIdxZ.getValue().intValue())); + } + + @Override + public void declareInput(final VarList inputMap) + { + inputMap.add("sequence", varSeq); + inputMap.add("Idx T", imgIdxT); + inputMap.add("Idx Z", imgIdxZ); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("out", out); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/images/RemoveImage.java b/src/main/java/plugins/tprovoost/sequenceblocks/images/RemoveImage.java new file mode 100644 index 0000000000000000000000000000000000000000..1380a864c2f5bab815ef5cb69c66b4ff11c2d6a9 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/images/RemoveImage.java @@ -0,0 +1,54 @@ +package plugins.tprovoost.sequenceblocks.images; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Remove an image from the Sequence. + * + * @author thomasprovoost + */ +public class RemoveImage extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + VarSequence varSeq = new VarSequence("Sequence", null); + VarInteger imgIdxT = new VarInteger("T", 0); + VarInteger imgIdxZ = new VarInteger("Z", 0); + + @Override + public void run() + { + Sequence s = varSeq.getValue(); + if (s == null) + throw new VarException(varSeq, "Input sequence is null !"); + + s.removeImage(imgIdxT.getValue().intValue(), imgIdxZ.getValue().intValue()); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSeq); + inputMap.add("Idx T", imgIdxT); + inputMap.add("Idx Z", imgIdxZ); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/images/SetImage.java b/src/main/java/plugins/tprovoost/sequenceblocks/images/SetImage.java new file mode 100644 index 0000000000000000000000000000000000000000..b185d7d1c243fcdf156c856ddf008bf5968a3ee0 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/images/SetImage.java @@ -0,0 +1,57 @@ +package plugins.tprovoost.sequenceblocks.images; + +import icy.image.IcyBufferedImage; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Set an image at the given [T,Z] position from the Sequence. + * + * @author thomasprovoost + */ +public class SetImage extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + Var<IcyBufferedImage> in = new Var<IcyBufferedImage>("Image", IcyBufferedImage.class); + VarSequence varSeq = new VarSequence("Sequence", null); + VarInteger imgIdxT = new VarInteger("T", 0); + VarInteger imgIdxZ = new VarInteger("Z", 0); + + @Override + public void run() + { + Sequence s = varSeq.getValue(); + if (s == null) + throw new VarException(varSeq, "Input sequence is null."); + s.setImage(imgIdxT.getValue().intValue(), imgIdxZ.getValue().intValue(), in.getValue()); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSeq); + inputMap.add("image", in); + inputMap.add("Idx T", imgIdxT); + inputMap.add("Idx Z", imgIdxZ); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/importer/PositionedSequenceFileImporter.java b/src/main/java/plugins/tprovoost/sequenceblocks/importer/PositionedSequenceFileImporter.java new file mode 100644 index 0000000000000000000000000000000000000000..75a25a734560b0e221fe3677d94ec14f70b49e26 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/importer/PositionedSequenceFileImporter.java @@ -0,0 +1,91 @@ +/** + * + */ +package plugins.tprovoost.sequenceblocks.importer; + +import java.awt.Rectangle; +import java.io.IOException; + +import icy.common.exception.UnsupportedFormatException; +import icy.file.SequenceFileImporter; +import icy.sequence.MetaDataUtil; +import ome.xml.meta.OMEXMLMetadata; + +/** + * This class allow to use a {@link SequenceFileImporter} while storing a current position information to make its usage + * more convenient with Protocols. + * + * @author Stephane + */ +public class PositionedSequenceFileImporter +{ + public SequenceFileImporter importer; + protected OMEXMLMetadata metadata; + public int s; + public int t; + public int z; + public int c; + public Rectangle xyRegion; + + public PositionedSequenceFileImporter(SequenceFileImporter importer, OMEXMLMetadata metadata, int s, int t, int z, + int c, Rectangle xyRegion) + { + super(); + + this.importer = importer; + this.xyRegion = xyRegion; + this.metadata = metadata; + this.s = s; + this.t = t; + this.z = z; + this.c = c; + } + + public PositionedSequenceFileImporter(SequenceFileImporter importer) + { + this(importer, null, -1, -1, -1, -1, null); + } + + public PositionedSequenceFileImporter(PositionedSequenceFileImporter positionedImporter) + { + this(positionedImporter.importer, positionedImporter.metadata, positionedImporter.s, positionedImporter.t, + positionedImporter.z, positionedImporter.c, positionedImporter.xyRegion); + } + + public OMEXMLMetadata getMetadata() throws UnsupportedFormatException, IOException + { + // not yet defined --> take it from importer if possible + if ((metadata == null) && (importer.getOpened() != null)) + { + metadata = importer.getOMEXMLMetaData(); + // clean the metadata + MetaDataUtil.clean(metadata); + } + + return metadata; + } + + @Override + public String toString() + { + String result; + + if (importer != null) + result = importer.getClass().getSimpleName(); + else + result = "No importer"; + + if (s != -1) + result += " S=" + s; + if (t != -1) + result += " T=" + t; + if (z != -1) + result += " Z=" + z; + if (c != -1) + result += " C=" + c; + if (xyRegion != null) + result += " XY=" + xyRegion; + + return result; + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterClose.java b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterClose.java new file mode 100644 index 0000000000000000000000000000000000000000..ccaa55b117d14f8adc510e572f5945f6e7bae6e3 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterClose.java @@ -0,0 +1,63 @@ +package plugins.tprovoost.sequenceblocks.importer; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import plugins.adufour.blocks.tools.io.IOBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to close currently opened SequenceFileImporter. + * + * @author Stephane + */ +public class SequenceFileImporterClose extends Plugin implements IOBlock, PluginLibrary, PluginBundled +{ + final protected Var<PositionedSequenceFileImporter> importer; + + public SequenceFileImporterClose() + { + super(); + + importer = new Var<PositionedSequenceFileImporter>("Importer", PositionedSequenceFileImporter.class); + } + + @Override + public void run() + { + final PositionedSequenceFileImporter pi = importer.getValue(); + + if (pi == null) + throw new VarException(importer, "Importer is null !"); + + try + { + pi.importer.close(); + } + catch (Exception e) + { + throw new VarException(importer, e.getMessage()); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("importer", importer); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetImage.java b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetImage.java new file mode 100644 index 0000000000000000000000000000000000000000..3720a15cafe134f661fc1b06283f41292e2f9546 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetImage.java @@ -0,0 +1,119 @@ +package plugins.tprovoost.sequenceblocks.importer; + +import java.awt.Rectangle; + +import icy.file.SequenceFileImporter; +import icy.image.IcyBufferedImage; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import plugins.adufour.blocks.tools.io.IOBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to returns an image from the given parameters and opened SequenceFileImporter. + * + * @author Stephane + */ +public class SequenceFileImporterGetImage extends Plugin implements IOBlock, PluginLibrary, PluginBundled +{ + final protected Var<PositionedSequenceFileImporter> importer; + final protected VarInteger series; + final protected VarInteger resolution; + final protected VarROIArray region; + final protected VarInteger zIndex; + final protected VarInteger tIndex; + final protected VarInteger cIndex; + + final protected Var<IcyBufferedImage> image; + + public SequenceFileImporterGetImage() + { + super(); + + importer = new Var<PositionedSequenceFileImporter>("Importer", PositionedSequenceFileImporter.class); + series = new VarInteger("Series", 0); + resolution = new VarInteger("Resolution (0=full, 1=1/2, ..)", 0); + region = new VarROIArray("XY region (ROI)", null); + zIndex = new VarInteger("Z (slice) index", 0); + tIndex = new VarInteger("T (frame) index", 0); + cIndex = new VarInteger("C (channel) index", -1); + + image = new Var<IcyBufferedImage>("Image", IcyBufferedImage.class); + } + + @Override + public void run() + { + final PositionedSequenceFileImporter pi = importer.getValue(); + + if (pi == null) + throw new VarException(importer, "Importer is null !"); + + final SequenceFileImporter imp = pi.importer; + + if (imp.getOpened() == null) + throw new VarException(importer, "Importer is not opened !"); + + final int res = resolution.getValue().intValue(); + final ROI[] rois = region.getValue(); + + int s = series.getValue().intValue(); + int z = zIndex.getValue().intValue(); + int t = tIndex.getValue().intValue(); + int c = cIndex.getValue().intValue(); + Rectangle rect = ((rois != null) && (rois.length > 0)) ? rois[0].getBounds5D().toRectangle2D().getBounds() + : null; + + // default values ? use internal position if any defined + if ((s == 0) && (pi.s != -1)) + s = pi.s; + if ((z == 0) && (pi.z != -1)) + z = pi.z; + if ((t == 0) && (pi.t != -1)) + t = pi.t; + if ((c == 0) && (pi.c != -1)) + c = pi.c; + if ((rect == null) && (pi.xyRegion != null)) + rect = pi.xyRegion; + + try + { + image.setValue(imp.getImage(s, res, rect, z, t, c)); + } + catch (Exception e) + { + throw new VarException(importer, e.getMessage()); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("importer", importer); + inputMap.add("series", series); + inputMap.add("resolution", resolution); + inputMap.add("region", region); + inputMap.add("zIndex", zIndex); + inputMap.add("tIndex", tIndex); + inputMap.add("cIndex", cIndex); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("image", image); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetMetadata.java b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetMetadata.java new file mode 100644 index 0000000000000000000000000000000000000000..cb20523d043a5223b1b18d31e160d73aad35d1f7 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetMetadata.java @@ -0,0 +1,84 @@ +package plugins.tprovoost.sequenceblocks.importer; + +import icy.file.SequenceFileImporter; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.MetaDataUtil; +import ome.xml.meta.OMEXMLMetadata; +import plugins.adufour.blocks.tools.io.IOBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; +import plugins.tprovoost.sequenceblocks.infos.ReadMetadata; + +/** + * Block to returns the metadata from the specified opened SequenceFileImporter. + * + * @see ReadMetadata + * @author Stephane + */ +public class SequenceFileImporterGetMetadata extends Plugin implements IOBlock, PluginLibrary, PluginBundled +{ + final protected Var<PositionedSequenceFileImporter> importer; + final protected Var<OMEXMLMetadata> metadata; + final protected VarInteger numSeries; + + public SequenceFileImporterGetMetadata() + { + super(); + + importer = new Var<PositionedSequenceFileImporter>("Importer", PositionedSequenceFileImporter.class); + metadata = new Var<OMEXMLMetadata>("Metadata", OMEXMLMetadata.class); + numSeries = new VarInteger("Series number", 1); + } + + @Override + public void run() + { + final PositionedSequenceFileImporter pi = importer.getValue(); + + if (pi == null) + throw new VarException(importer, "Importer is null !"); + + final SequenceFileImporter imp = pi.importer; + + if (imp.getOpened() == null) + throw new VarException(importer, "Importer is not opened !"); + + try + { + final OMEXMLMetadata meta = imp.getOMEXMLMetaData(); + + metadata.setValue(meta); + + if (meta != null) + numSeries.setValue(Integer.valueOf(MetaDataUtil.getNumSeries(meta))); + } + catch (Exception e) + { + throw new VarException(importer, e.getMessage()); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("importer", importer); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("metadata", metadata); + outputMap.add("numSerie", numSeries); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetThumbnail.java b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetThumbnail.java new file mode 100644 index 0000000000000000000000000000000000000000..7303276842548ded54afe8d661314495a7c26825 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetThumbnail.java @@ -0,0 +1,78 @@ +package plugins.tprovoost.sequenceblocks.importer; + +import icy.file.SequenceFileImporter; +import icy.image.IcyBufferedImage; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import plugins.adufour.blocks.tools.io.IOBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to returns a thumbnail from the specified opened SequenceFileImporter. + * + * @author Stephane + */ +public class SequenceFileImporterGetThumbnail extends Plugin implements IOBlock, PluginLibrary, PluginBundled +{ + final protected Var<PositionedSequenceFileImporter> importer; + final protected VarInteger series; + final protected Var<IcyBufferedImage> thumbnail; + + public SequenceFileImporterGetThumbnail() + { + super(); + + importer = new Var<PositionedSequenceFileImporter>("Importer", PositionedSequenceFileImporter.class); + series = new VarInteger("Series", 0); + thumbnail = new Var<IcyBufferedImage>("Thumbnail", IcyBufferedImage.class); + } + + @Override + public void run() + { + final PositionedSequenceFileImporter pi = importer.getValue(); + + if (pi == null) + throw new VarException(importer, "Importer is null !"); + + final SequenceFileImporter imp = pi.importer; + + if (imp.getOpened() == null) + throw new VarException(importer, "Importer is not opened !"); + + final int s = series.getValue().intValue(); + + try + { + thumbnail.setValue(imp.getThumbnail(s)); + } + catch (Exception e) + { + throw new VarException(importer, e.getMessage()); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("importer", importer); + inputMap.add("series", series); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("thumbnail", thumbnail); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetTileSize.java b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetTileSize.java new file mode 100644 index 0000000000000000000000000000000000000000..7fa5e34a9b7ac14f519ce2b3e907c26fe8879d71 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterGetTileSize.java @@ -0,0 +1,81 @@ +package plugins.tprovoost.sequenceblocks.importer; + +import icy.file.SequenceFileImporter; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import plugins.adufour.blocks.tools.io.IOBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to returns the optimal tile size for region reading from the specified opened SequenceFileImporter. + * + * @author Stephane + */ +public class SequenceFileImporterGetTileSize extends Plugin implements IOBlock, PluginLibrary, PluginBundled +{ + final protected Var<PositionedSequenceFileImporter> importer; + final protected VarInteger series; + final protected VarInteger tileW; + final protected VarInteger tileH; + + public SequenceFileImporterGetTileSize() + { + super(); + + importer = new Var<PositionedSequenceFileImporter>("Importer", PositionedSequenceFileImporter.class); + series = new VarInteger("Series", 0); + tileW = new VarInteger("Tile width", 0); + tileH = new VarInteger("Tile height", 0); + } + + @Override + public void run() + { + final PositionedSequenceFileImporter pi = importer.getValue(); + + if (pi == null) + throw new VarException(importer, "Importer is null !"); + + final SequenceFileImporter imp = pi.importer; + + if (imp.getOpened() == null) + throw new VarException(importer, "Importer is not opened !"); + + final int s = series.getValue().intValue(); + + try + { + tileW.setValue(Integer.valueOf(imp.getTileWidth(s))); + tileH.setValue(Integer.valueOf(imp.getTileHeight(s))); + } + catch (Exception e) + { + throw new VarException(importer, e.getMessage()); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("importer", importer); + inputMap.add("series", series); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("tileW", tileW); + outputMap.add("tileH", tileH); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterLoadSequence.java b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterLoadSequence.java new file mode 100644 index 0000000000000000000000000000000000000000..34c8ba2d6a387750d1b97aef4b1300a5f8c6dda8 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterLoadSequence.java @@ -0,0 +1,140 @@ +package plugins.tprovoost.sequenceblocks.importer; + +import java.awt.Rectangle; + +import icy.file.Loader; +import icy.file.SequenceFileImporter; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import ome.xml.meta.OMEXMLMetadata; +import plugins.adufour.blocks.tools.io.IOBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to returns a Sequence from the given parameters and opened SequenceFileImporter. + * + * @author Stephane + */ +public class SequenceFileImporterLoadSequence extends Plugin implements IOBlock, PluginLibrary, PluginBundled +{ + final protected Var<PositionedSequenceFileImporter> importer; + final protected VarInteger series; + final protected VarInteger resolution; + final protected VarROIArray region; + final protected VarInteger minZIndex; + final protected VarInteger maxZIndex; + final protected VarInteger minTIndex; + final protected VarInteger maxTIndex; + final protected VarInteger cIndex; + + final protected VarSequence sequence; + + public SequenceFileImporterLoadSequence() + { + super(); + + importer = new Var<PositionedSequenceFileImporter>("Importer", PositionedSequenceFileImporter.class); + + series = new VarInteger("Series", 0); + resolution = new VarInteger("Resolution (0=full, 1=1/2, ..)", 0); + region = new VarROIArray("XY region (ROI)", null); + minZIndex = new VarInteger("Z min (slice)", -1); + maxZIndex = new VarInteger("Z max (slice)", -1); + minTIndex = new VarInteger("T min (frame)", -1); + maxTIndex = new VarInteger("T max (frame)", -1); + cIndex = new VarInteger("C (channel) index", -1); + + sequence = new VarSequence("Sequence", null); + } + + @Override + public void run() + { + final PositionedSequenceFileImporter pi = importer.getValue(); + + if (pi == null) + throw new VarException(importer, "Importer is null !"); + + final SequenceFileImporter imp = pi.importer; + + if (imp.getOpened() == null) + throw new VarException(importer, "Importer is not opened !"); + + final int res = resolution.getValue().intValue(); + final ROI[] rois = region.getValue(); + + int s = series.getValue().intValue(); + int minZ = minZIndex.getValue().intValue(); + int maxZ = maxZIndex.getValue().intValue(); + int minT = minTIndex.getValue().intValue(); + int maxT = maxTIndex.getValue().intValue(); + int c = cIndex.getValue().intValue(); + Rectangle rect = ((rois != null) && (rois.length > 0)) ? rois[0].getBounds5D().toRectangle2D().getBounds() + : null; + + // default values ? use internal position if any defined + if ((s == 0) && (pi.s != -1)) + s = pi.s; + if ((minZ == -1) && (maxZ == -1) && (pi.z != -1)) + { + minZ = pi.z; + maxZ = pi.z; + } + if ((minT == -1) && (maxT == -1) && (pi.t != -1)) + { + minT = pi.t; + maxT = pi.t; + } + if ((c == 0) && (pi.c != -1)) + c = pi.c; + if ((rect == null) && (pi.xyRegion != null)) + rect = pi.xyRegion; + + try + { + + // get metadata + final OMEXMLMetadata meta = pi.getMetadata(); + + sequence.setValue(Loader.internalLoadSingle(imp, meta, s, res, rect, minZ, maxZ, minT, maxT, c, false, null)); + } + catch (Exception e) + { + throw new VarException(importer, e.getMessage()); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("importer", importer); + inputMap.add("series", series); + inputMap.add("resolution", resolution); + inputMap.add("region", region); + inputMap.add("minZ", minZIndex); + inputMap.add("maxZ", maxZIndex); + inputMap.add("minT", minTIndex); + inputMap.add("maxT", maxTIndex); + inputMap.add("cIndex", cIndex); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("sequence", sequence); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterOpen.java b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterOpen.java new file mode 100644 index 0000000000000000000000000000000000000000..720b9c63b4d5c097cfbe28a86e91cb24b2bb62cf --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/importer/SequenceFileImporterOpen.java @@ -0,0 +1,147 @@ +package plugins.tprovoost.sequenceblocks.importer; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import icy.file.Loader; +import icy.file.SequenceFileImporter; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.util.ClassUtil; +import plugins.adufour.blocks.tools.io.IOBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.gui.model.ValueSelectionModel; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarMutable; +import plugins.adufour.vars.lang.VarString; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to open a file with a given SequenceFileImporter. + * + * @author Stephane + */ +public class SequenceFileImporterOpen extends Plugin implements IOBlock, PluginLibrary, PluginBundled +{ + final static String ID_AUTO = "Automatic"; + + final protected VarString importerName; + final protected Var<PositionedSequenceFileImporter> importer; + final protected VarMutable file; + final protected VarInteger flag; + + // internal + final protected Map<String, SequenceFileImporter> importersMap; + + public SequenceFileImporterOpen() + { + super(); + + final List<String> importersName = new ArrayList<String>(); + final List<SequenceFileImporter> importers = Loader.getSequenceFileImporters(); + + importerName = new VarString("Select importer", "", 1 + importers.size()); + // build importer map + importersMap = new HashMap<String, SequenceFileImporter>(); + + // automatic selection + importersName.add(ID_AUTO); + importersMap.put(ID_AUTO, null); + for (SequenceFileImporter importer : importers) + { + String className = ClassUtil.getBaseClassName(importer.getClass().getName()); + final int ind = className.lastIndexOf('.'); + + // just get final class name without package name + if (ind > -1) + className = className.substring(ind + 1, className.length()); + + importersName.add(className); + importersMap.put(className, importer); + } + + // initialize importer selector field + importerName.setDefaultEditorModel(new ValueSelectionModel<String>( + importersName.toArray(new String[importersName.size()]), importersName.get(0), false)); + + importer = new Var<PositionedSequenceFileImporter>("Importer", PositionedSequenceFileImporter.class); + file = new VarMutable("File", null) + { + @SuppressWarnings("rawtypes") + @Override + public boolean isAssignableFrom(Var source) + { + return (String.class == source.getType()) || (File.class == source.getType()); + } + }; + flag = new VarInteger("Flag", 0); + } + + @SuppressWarnings("resource") + @Override + public void run() + { + final String path; + final Object obj = file.getValue(); + + if (obj != null) + { + if (obj instanceof String) + path = (String) obj; + else + path = ((File) obj).getAbsolutePath(); + } + else + throw new VarException(file, "File is null !"); + + // get selected importer + SequenceFileImporter imp = importersMap.get(importerName.getValue()); + + // automatic selection from input file ? + if (imp == null) + imp = Loader.getSequenceFileImporter(path, true); + + // cannot get importer ? + if (imp == null) + throw new VarException(importer, "Cannot find an importer for file: '" + path + "' !"); + + // set importer + importer.setValue(new PositionedSequenceFileImporter(imp)); + + try + { + // try to open the importer + imp.open(path, flag.getValue().intValue()); + } + catch (Exception e) + { + throw new VarException(importer, e.getMessage()); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("name", importerName); + inputMap.add("file", file); + inputMap.add("flag", flag); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("importer", importer); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/CreateLinearColormap.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/CreateLinearColormap.java new file mode 100644 index 0000000000000000000000000000000000000000..7616d670b2551fcd5204130fdfdbf22202e0562b --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/CreateLinearColormap.java @@ -0,0 +1,48 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.image.colormap.LinearColorMap; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; + +import java.awt.Color; + +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarColor; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to create a linear colormap from a color value + * + * @author Stephane + * @see SetColormap + */ +public class CreateLinearColormap extends Plugin implements SequenceBlock, PluginBundled +{ + private VarColor color = new VarColor("Color", Color.white); + private VarColormap colormap = new VarColormap("Color map", LinearColorMap.gray_); + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("input", color); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("output", colormap); + } + + @Override + public void run() + { + colormap.setValue(new LinearColorMap("color", color.getValue())); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/Dimensions.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/Dimensions.java new file mode 100644 index 0000000000000000000000000000000000000000..3dbc2dff82153ccc62d3547281d0e248b8168d99 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/Dimensions.java @@ -0,0 +1,61 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class Dimensions extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + VarSequence varSeq = new VarSequence("Sequence", null); + VarInteger sizeZ = new VarInteger("Size Z", 1); + VarInteger sizeT = new VarInteger("Size T", 1); + VarInteger sizeC = new VarInteger("Size C", 1); + VarInteger width = new VarInteger("Width", 1); + VarInteger height = new VarInteger("Height", 1); + + @Override + public void run() + { + Sequence s = varSeq.getValue(); + if (s == null) + throw new VarException(varSeq, "Input sequence is null."); + + width.setValue(Integer.valueOf(s.getWidth())); + height.setValue(Integer.valueOf(s.getHeight())); + sizeC.setValue(Integer.valueOf(s.getSizeC())); + sizeZ.setValue(Integer.valueOf(s.getSizeZ())); + sizeT.setValue(Integer.valueOf(s.getSizeT())); + } + + @Override + public void declareInput(final VarList inputMap) + { + inputMap.add("sequence", varSeq); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("width", width); + outputMap.add("height", height); + outputMap.add("size C", sizeC); + outputMap.add("size Z", sizeZ); + outputMap.add("size T", sizeT); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/EzVarColormap.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/EzVarColormap.java new file mode 100644 index 0000000000000000000000000000000000000000..d3fd86c23413c14e645f90e032087fcd3ccc22d3 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/EzVarColormap.java @@ -0,0 +1,19 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.image.colormap.IcyColorMap; +import plugins.adufour.ezplug.EzVar; +import plugins.tprovoost.sequenceblocks.infos.VarColormap.ColormapSelectionModel; + +public class EzVarColormap extends EzVar<IcyColorMap> +{ + /** + * Constructs a new variable that handles colormap data. + * + * @param varName + * the parameter name + */ + public EzVarColormap(String varName, IcyColorMap defaultValue) + { + super(new VarColormap(varName, defaultValue), new ColormapSelectionModel()); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetChannelName.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetChannelName.java new file mode 100644 index 0000000000000000000000000000000000000000..ba5f734027cccd8e2ab694f83b4c793d471de962 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetChannelName.java @@ -0,0 +1,55 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.lang.VarString; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class GetChannelName extends Plugin implements SequenceBlock, PluginBundled +{ + private VarSequence varSequence = new VarSequence("Sequence", null); + private VarInteger varIdx = new VarInteger("Channel", 0); + private VarString varName = new VarString("Name", ""); + + @Override + public void run() + { + Sequence s = varSequence.getValue(); + if (s == null) + throw new VarException(varSequence, "Sequence is null"); + + int index = varIdx.getValue().intValue(); + if (index < 0 || index >= s.getSizeC()) + throw new VarException(varIdx, "Wrong channel index."); + + varName.setValue(s.getChannelName(index)); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + inputMap.add("index", varIdx); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("name", varName); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetChannelsName.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetChannelsName.java new file mode 100644 index 0000000000000000000000000000000000000000..5506b01bcf956881edec07454d70287f18e01ab8 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetChannelsName.java @@ -0,0 +1,61 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; + +import java.util.ArrayList; +import java.util.List; + +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to retrieve all channels name from a given sequence + * + * @author Stephane + * @see GetChannelName + * @see SetChannelsName + */ +public class GetChannelsName extends Plugin implements SequenceBlock, PluginBundled +{ + private VarSequence varSequence = new VarSequence("Sequence", null); + private VarArray<String> varNames = new VarArray<String>("Names", String[].class, new String[0]); + + @Override + public void run() + { + final Sequence s = varSequence.getValue(); + if (s == null) + throw new VarException(varSequence, "Sequence is null"); + + final List<String> names = new ArrayList<String>(); + + for (int c = 0; c < s.getSizeC(); c++) + names.add(s.getChannelName(c)); + + varNames.setValue(names.toArray(new String[names.size()])); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("names", varNames); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetColormap.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetColormap.java new file mode 100644 index 0000000000000000000000000000000000000000..98a564d4f6d2b9ffe6071199647b7e6ed2a6c67e --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetColormap.java @@ -0,0 +1,60 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.image.colormap.LinearColorMap; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.BlocksException; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to retrieve a channel colormap from a given sequence + * + * @author Stephane + * @see SetColormap + */ +public class GetColormap extends Plugin implements SequenceBlock, PluginBundled +{ + private VarSequence sequenceIn = new VarSequence("Sequence", null); + private VarInteger numChannel = new VarInteger("Channel", 0); + private VarColormap colormap = new VarColormap("Color map", LinearColorMap.gray_); + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("input", sequenceIn); + inputMap.add("numChannel", numChannel); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("output", colormap); + } + + @Override + public void run() + { + final Sequence seq = sequenceIn.getValue(); + + if (seq != null) + { + final int ch = numChannel.getValue().intValue(); + + if (ch < seq.getSizeC()) + colormap.setValue(seq.getColorMap(ch)); + else + throw new BlocksException("Block 'Get Colormap': illegal channel number for this sequence !", true); + } + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetColormaps.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetColormaps.java new file mode 100644 index 0000000000000000000000000000000000000000..dcc86d74a15cb9efbce5cb6c060bcce80c2976af --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetColormaps.java @@ -0,0 +1,62 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.image.colormap.IcyColorMap; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; + +import java.util.ArrayList; +import java.util.List; + +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to retrieve all channels colormap from a given sequence + * + * @author Stephane + * @see SetColormaps + */ +public class GetColormaps extends Plugin implements SequenceBlock, PluginBundled +{ + private VarSequence sequenceIn = new VarSequence("Sequence", null); + private VarArray<IcyColorMap> colormaps = new VarArray<IcyColorMap>("Color maps", IcyColorMap[].class, + new IcyColorMap[0]); + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("input", sequenceIn); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("Colormaps", colormaps); + } + + @Override + public void run() + { + final Sequence seq = sequenceIn.getValue(); + if (seq == null) + throw new VarException(sequenceIn, "Sequence is null"); + + final List<IcyColorMap> cms = new ArrayList<IcyColorMap>(); + + for (int c = 0; c < seq.getSizeC(); c++) + cms.add(seq.getColorMap(c)); + + colormaps.setValue(cms.toArray(new IcyColorMap[cms.size()])); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetDataType.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetDataType.java new file mode 100644 index 0000000000000000000000000000000000000000..d47fe2d536199705304b10a7d7c95529846b3040 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetDataType.java @@ -0,0 +1,53 @@ +/** + * + */ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import icy.type.DataType; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarEnum; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Returns the DataType of the Sequence object + * + * @author Stephane + */ +public class GetDataType extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSequence = new VarSequence("Sequence", null); + final protected VarEnum<DataType> type = new VarEnum<DataType>("Data type", DataType.UBYTE); + + @Override + public void run() + { + Sequence s = varSequence.getValue(); + if (s == null) + throw new VarException(varSequence, "Sequence is null"); + type.setValue(s.getDataType_()); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("type", type); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetFileName.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetFileName.java new file mode 100644 index 0000000000000000000000000000000000000000..477a91549d9c19cffc6ad3aa69f178a3ca2b3cc5 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetFileName.java @@ -0,0 +1,69 @@ +/** + * + */ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.file.FileUtil; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.lang.VarString; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Returns the origin filename (from where the sequence has been loaded / saved) + * + * @author Stephane + */ +public class GetFileName extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSequence = new VarSequence("Sequence", null); + final protected VarString filename = new VarString("Filename", ""); + final protected VarBoolean withFolder = new VarBoolean("Folder", Boolean.TRUE); + final protected VarBoolean withExtension = new VarBoolean("Extension", Boolean.TRUE); + + @Override + public void run() + { + Sequence s = varSequence.getValue(); + + if (s == null) + throw new VarException(varSequence, "Sequence is null"); + + String result = s.getFilename(); + + // remove folder information ? + if (!withFolder.getValue().booleanValue()) + result = FileUtil.getFileName(result); + // remove extension ? + if (!withExtension.getValue().booleanValue()) + FileUtil.setExtension(result, ""); + + filename.setValue(result); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + inputMap.add("folder", withFolder); + inputMap.add("extension", withExtension); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("name", filename); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} \ No newline at end of file diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetMetaData.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetMetaData.java new file mode 100644 index 0000000000000000000000000000000000000000..0145c1f401d8fefa77b991faf6701e189b6b7d55 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetMetaData.java @@ -0,0 +1,106 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import java.awt.Rectangle; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import ome.xml.meta.OMEXMLMetadata; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarDouble; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.lang.VarString; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to return metadata information from a Sequence object. + * + * @see ReadMetadata + * @author Stephane + */ +public class GetMetaData extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSequence = new VarSequence("Sequence", null); + final protected Var<OMEXMLMetadata> metaData = new Var<OMEXMLMetadata>("Metadata", OMEXMLMetadata.class); + final protected VarString name = new VarString("Name", ""); + final protected VarInteger seriesIndex = new VarInteger("Series index", 0); + final protected VarDouble pxSizeX = new VarDouble("Pixel Size X (µm)", 1d); + final protected VarDouble pxSizeY = new VarDouble("Pixel Size Y (µm)", 1d); + final protected VarDouble pxSizeZ = new VarDouble("Pixel Size Z (µm)", 1d); + final protected VarDouble timeIntT = new VarDouble("Time interval T (s)", 100d); + final protected VarDouble positionX = new VarDouble("Position X (µm)", 0d); + final protected VarDouble positionY = new VarDouble("Position Y (µm)", 0d); + final protected VarDouble positionZ = new VarDouble("Position Z (µm)", 0d); + final protected VarInteger originResolution = new VarInteger("Resolution", 0); + final protected Var<Rectangle> originRegion = new Var<Rectangle>("Region", new Rectangle()); + final protected VarInteger originZMin = new VarInteger("Z min", -1); + final protected VarInteger originZMax = new VarInteger("Z max", -1); + final protected VarInteger originTMin = new VarInteger("T min", -1); + final protected VarInteger originTMax = new VarInteger("T max", -1); + final protected VarInteger originChannel = new VarInteger("Channel", -1); + + @Override + public void run() + { + Sequence s = varSequence.getValue(); + + if (s == null) + throw new VarException(varSequence, "Sequence is null"); + + metaData.setValue(s.getOMEXMLMetadata()); + name.setValue(s.getName()); + seriesIndex.setValue(Integer.valueOf(s.getSeries())); + pxSizeX.setValue(Double.valueOf(s.getPixelSizeX())); + pxSizeY.setValue(Double.valueOf(s.getPixelSizeY())); + pxSizeZ.setValue(Double.valueOf(s.getPixelSizeZ())); + timeIntT.setValue(Double.valueOf(s.getTimeInterval())); + positionX.setValue(Double.valueOf(s.getPositionX())); + positionY.setValue(Double.valueOf(s.getPositionY())); + positionZ.setValue(Double.valueOf(s.getPositionZ())); + originResolution.setValue(Integer.valueOf(s.getOriginResolution())); + originRegion.setValue(s.getOriginXYRegion()); + originZMin.setValue(Integer.valueOf(s.getOriginZMin())); + originZMax.setValue(Integer.valueOf(s.getOriginZMax())); + originTMin.setValue(Integer.valueOf(s.getOriginTMin())); + originTMax.setValue(Integer.valueOf(s.getOriginTMax())); + originChannel.setValue(Integer.valueOf(s.getOriginChannel())); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("metadata", metaData); + outputMap.add("name", name); + outputMap.add("seriesIndex", seriesIndex); + outputMap.add("Pixel Size X (mm)", pxSizeX); + outputMap.add("Pixel Size Y (mm)", pxSizeY); + outputMap.add("Pixel Size Z (mm)", pxSizeZ); + outputMap.add("Time interval T (ms)", timeIntT); + outputMap.add("positionx", positionX); + outputMap.add("positiony", positionY); + outputMap.add("positionz", positionZ); + outputMap.add("originResolution", originResolution); + outputMap.add("originRegion", originRegion); + outputMap.add("originZMin", originZMin); + outputMap.add("originZMax", originZMax); + outputMap.add("originTMin", originTMin); + outputMap.add("originTMax", originTMax); + outputMap.add("originChannel", originChannel); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetName.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetName.java new file mode 100644 index 0000000000000000000000000000000000000000..c102a40c24970e75a1bdf82c514f1955de652010 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetName.java @@ -0,0 +1,49 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.lang.VarString; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Returns the name of the Sequence object + * + * @author Stephane + */ +public class GetName extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSequence = new VarSequence("Sequence", null); + final protected VarString name = new VarString("Name", ""); + + @Override + public void run() + { + Sequence s = varSequence.getValue(); + if (s == null) + throw new VarException(varSequence, "Sequence is null"); + name.setValue(s.getName()); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("name", name); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetOutputFilename.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetOutputFilename.java new file mode 100644 index 0000000000000000000000000000000000000000..3e9deece814f71e8189f2a742ad60f668014b4b2 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetOutputFilename.java @@ -0,0 +1,64 @@ +/** + * + */ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.file.FileUtil; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.lang.VarString; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Returns the output filename generated from origin filename and internal partitioning information + * + * @author Stephane + */ +public class GetOutputFilename extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSequence = new VarSequence("Sequence", null); + final protected VarString outFilename = new VarString("Output filename", ""); + final protected VarBoolean withFolder = new VarBoolean("Folder", Boolean.TRUE); + final protected VarBoolean withExtension = new VarBoolean("Extension", Boolean.TRUE); + + @Override + public void run() + { + Sequence s = varSequence.getValue(); + if (s == null) + throw new VarException(varSequence, "Sequence is null"); + + String result = s.getOutputFilename(withExtension.getValue().booleanValue()); + + if (!withFolder.getValue().booleanValue()) + result = FileUtil.getFileName(result); + + outFilename.setValue(result); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + inputMap.add("folder", withFolder); + inputMap.add("extension", withExtension); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("outFilename", outFilename); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} \ No newline at end of file diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetResolution.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetResolution.java new file mode 100644 index 0000000000000000000000000000000000000000..aa738a9126e0bd4f5746af5d8b2bf057b0bb9770 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetResolution.java @@ -0,0 +1,65 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarDouble; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to return pixel size and time interval information from a Sequence object. + * + * @see ReadMetadata + * @see GetMetaData + * @author Stephane + */ +public class GetResolution extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSequence = new VarSequence("Sequence", null); + final protected VarDouble pxSizeX = new VarDouble("Pixel Size X (µm)", 1d); + final protected VarDouble pxSizeY = new VarDouble("Pixel Size Y (µm)", 1d); + final protected VarDouble pxSizeZ = new VarDouble("Pixel Size Z (µm)", 1d); + final protected VarDouble timeIntT = new VarDouble("Time interval T (s)", 0.1d); + + @Override + public void run() + { + Sequence s = varSequence.getValue(); + if (s != null) + { + pxSizeX.setValue(Double.valueOf(s.getPixelSizeX())); + pxSizeY.setValue(Double.valueOf(s.getPixelSizeY())); + pxSizeZ.setValue(Double.valueOf(s.getPixelSizeZ())); + timeIntT.setValue(Double.valueOf(s.getTimeInterval())); + } + else + { + throw new VarException(varSequence, "Sequence is null"); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("Pixel Size X (µm)", pxSizeX); + outputMap.add("Pixel Size Y (µm)", pxSizeY); + outputMap.add("Pixel Size Z (µm)", pxSizeZ); + outputMap.add("Time interval T (s)", timeIntT); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetRoisAsRegion.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetRoisAsRegion.java new file mode 100644 index 0000000000000000000000000000000000000000..2ddd6e77724d7081410026336469affdf294b105 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/GetRoisAsRegion.java @@ -0,0 +1,100 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import java.awt.Rectangle; +import java.util.ArrayList; +import java.util.List; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarBoolean; +import plugins.adufour.vars.lang.VarEnum; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.kernel.roi.roi2d.ROI2DRectangle; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to retrieve ROI(s) from a Sequence as 2D Rectangular regions.<br> + * The <i>origin resolution</i> parameter indicate if we want to rescale ROI to the original image resolution in case we + * have a Sequence which represents a sub resolution of the original image. + * + * @author Stephane + */ +public class GetRoisAsRegion extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + public static enum TypeSelection + { + ALL, SELECTED + }; + + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarEnum<TypeSelection> type = new VarEnum<TypeSelection>("ROI(s) to get", TypeSelection.ALL); + final protected VarBoolean originResolution = new VarBoolean("Origin resolution", Boolean.TRUE); + final protected VarROIArray regionsRois = new VarROIArray("Region ROI(s)", null); + + @Override + public void run() + { + final Sequence sequence = inputSequence.getValue(); + if (sequence == null) + throw new VarException(inputSequence, "Input sequence is null."); + + final List<ROI> rois; + final List<ROI2DRectangle> result = new ArrayList<ROI2DRectangle>(); + + switch (type.getValue()) + { + default: + rois = sequence.getROIs(); + break; + case SELECTED: + rois = sequence.getSelectedROIs(); + break; + } + + final boolean scale = originResolution.getValue().booleanValue(); + + // build rectangular ROI(s) + for (ROI roi : rois) + { + // get ROI 2D bounds + Rectangle rect = roi.getBounds5D().toRectangle2D().getBounds(); + + // scale if needed + if (scale) + rect = SequenceUtil.getOriginRectangle(rect, sequence); + + // add to result + result.add(new ROI2DRectangle(rect)); + } + + regionsRois.setValue(result.toArray(new ROI[result.size()])); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("type", type); + inputMap.add("originResolution", originResolution); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("regionsRois", regionsRois); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/ReadMetadata.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/ReadMetadata.java new file mode 100644 index 0000000000000000000000000000000000000000..e492453568e9e0341ce5e4e3af3c63efbfef6b0f --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/ReadMetadata.java @@ -0,0 +1,107 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.MetaDataUtil; +import ome.xml.meta.OMEXMLMetadata; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarDouble; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarString; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; +import plugins.tprovoost.sequenceblocks.files.LoadMetadata; + +/** + * Block to return main informations from a metadata object. + * + * @see LoadMetadata + * @author Stephane + */ +public class ReadMetadata extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected Var<OMEXMLMetadata> metadata = new Var<OMEXMLMetadata>("Metadata", OMEXMLMetadata.class); + final protected VarInteger serie = new VarInteger("Series", 0); + + final protected VarInteger numSerie = new VarInteger("Num serie", 1); + final protected VarString name = new VarString("Name", ""); + final protected VarInteger sizeX = new VarInteger("Size X", 1); + final protected VarInteger sizeY = new VarInteger("Size Y", 1); + final protected VarInteger sizeC = new VarInteger("Size C", 1); + final protected VarInteger sizeZ = new VarInteger("Size Z", 1); + final protected VarInteger sizeT = new VarInteger("Size T", 1); + final protected VarDouble pxSizeX = new VarDouble("Pixel Size X (µm)", 1d); + final protected VarDouble pxSizeY = new VarDouble("Pixel Size Y (µm)", 1d); + final protected VarDouble pxSizeZ = new VarDouble("Pixel Size Z (µm)", 1d); + final protected VarDouble timeIntT = new VarDouble("Time interval T (s)", 100d); + final protected VarDouble positionX = new VarDouble("Position X (µm)", 0d); + final protected VarDouble positionY = new VarDouble("Position Y (µm)", 0d); + final protected VarDouble positionZ = new VarDouble("Position Z (µm)", 0d); + + @Override + public void run() + { + final OMEXMLMetadata meta = metadata.getValue(); + if (meta == null) + throw new VarException(metadata, "Metadata is null !"); + + final int s = serie.getValue().intValue(); + final int numS = MetaDataUtil.getNumSeries(meta); + + numSerie.setValue(Integer.valueOf(numS)); + + if (s >= numS) + throw new VarException(serie, "Serie index must be between 0 and " + (numS - 1)); + + name.setValue(MetaDataUtil.getName(meta, s)); + sizeX.setValue(Integer.valueOf(MetaDataUtil.getSizeX(meta, s))); + sizeY.setValue(Integer.valueOf(MetaDataUtil.getSizeY(meta, s))); + sizeZ.setValue(Integer.valueOf(MetaDataUtil.getSizeZ(meta, s))); + sizeT.setValue(Integer.valueOf(MetaDataUtil.getSizeT(meta, s))); + sizeC.setValue(Integer.valueOf(MetaDataUtil.getSizeC(meta, s))); + pxSizeX.setValue(Double.valueOf(MetaDataUtil.getPixelSizeX(meta, s, pxSizeX.getDefaultValue().doubleValue()))); + pxSizeY.setValue(Double.valueOf(MetaDataUtil.getPixelSizeY(meta, s, pxSizeY.getDefaultValue().doubleValue()))); + pxSizeZ.setValue(Double.valueOf(MetaDataUtil.getPixelSizeZ(meta, s, pxSizeZ.getDefaultValue().doubleValue()))); + timeIntT.setValue( + Double.valueOf(MetaDataUtil.getTimeInterval(meta, s, timeIntT.getDefaultValue().doubleValue()))); + // get position of first plane only for now + positionX.setValue(Double.valueOf(MetaDataUtil.getPositionX(meta, s, 0, 0, 0, 0d))); + positionY.setValue(Double.valueOf(MetaDataUtil.getPositionY(meta, s, 0, 0, 0, 0d))); + positionZ.setValue(Double.valueOf(MetaDataUtil.getPositionZ(meta, s, 0, 0, 0, 0d))); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("Metadata", metadata); + inputMap.add("Serie", serie); + } + + @Override + public void declareOutput(VarList outputMap) + { + outputMap.add("numSerie", numSerie); + outputMap.add("Name", name); + outputMap.add("Size X", sizeX); + outputMap.add("Size Y", sizeY); + outputMap.add("Size C", sizeC); + outputMap.add("Size Z", sizeZ); + outputMap.add("Size T", sizeT); + outputMap.add("Pixel Size X (mm)", pxSizeX); + outputMap.add("Pixel Size Y (mm)", pxSizeY); + outputMap.add("Pixel Size Z (mm)", pxSizeZ); + outputMap.add("Time interval T (ms)", timeIntT); + outputMap.add("positionx", positionX); + outputMap.add("positiony", positionY); + outputMap.add("positionz", positionZ); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} \ No newline at end of file diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetChannelName.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetChannelName.java new file mode 100644 index 0000000000000000000000000000000000000000..2b94357b2ac6bb9d4efe7325543df343145e5d61 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetChannelName.java @@ -0,0 +1,65 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import icy.util.StringUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.lang.VarString; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to set channel name of the specified sequence + * + * @author Stephane + * @see GetChannelsName + * @see SetChannelName + */ +public class SetChannelName extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSequence = new VarSequence("Sequence", null); + final protected VarString varName = new VarString("Name", ""); + final protected VarInteger idx = new VarInteger("Channel", 0); + + @Override + public void run() + { + Sequence s = varSequence.getValue(); + if (s == null) + throw new VarException(varSequence, "Sequence is null"); + + int index = idx.getValue().intValue(); + if (index < 0 || index >= s.getSizeC()) + throw new VarException(idx, "Wrong channel index."); + + String name = varName.getName(); + if (StringUtil.isEmpty(name)) + throw new VarException(varName, "Name cannot be empty"); + + s.setChannelName(index, varName.getValue()); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + inputMap.add("index", idx); + inputMap.add("name", varName); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetChannelsName.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetChannelsName.java new file mode 100644 index 0000000000000000000000000000000000000000..ce421ee89527de3d6832dc3c34518688f9ec77f7 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetChannelsName.java @@ -0,0 +1,58 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to set all channels name of the specified sequence + * + * @author Stephane + * @see GetChannelsName + * @see SetChannelName + */ +public class SetChannelsName extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSequence = new VarSequence("Sequence", null); + final protected VarArray<String> varNames = new VarArray<String>("Names", String[].class, new String[0]); + + @Override + public void run() + { + final Sequence s = varSequence.getValue(); + if (s == null) + throw new VarException(varSequence, "Sequence is null"); + + final String[] names = varNames.getValue(); + if (names == null) + throw new VarException(varNames, "Names is null"); + + for (int c = 0; c < Math.min(s.getSizeC(), names.length); c++) + s.setChannelName(c, names[c]); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + inputMap.add("names", varNames); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetColormap.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetColormap.java new file mode 100644 index 0000000000000000000000000000000000000000..3a7e57c1cd7786371b07acf5e884e00fec5858a7 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetColormap.java @@ -0,0 +1,57 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.image.colormap.IcyColorMap; +import icy.image.colormap.LinearColorMap; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.BlocksException; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +public class SetColormap extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence sequenceIn = new VarSequence("Sequence", null); + final protected VarInteger numChannel = new VarInteger("Channel", 0); + final protected VarColormap colormap = new VarColormap("Color map", LinearColorMap.gray_); + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("input", sequenceIn); + inputMap.add("numChannel", numChannel); + inputMap.add("colormap", colormap); + } + + @Override + public void declareOutput(VarList outputMap) + { + // no output here + } + + @Override + public void run() + { + final Sequence seq = sequenceIn.getValue(); + + if (seq != null) + { + final int ch = numChannel.getValue().intValue(); + final IcyColorMap map = colormap.getValue(); + + if ((ch < seq.getSizeC()) && (map != null)) + seq.setColormap(ch, map, map.isAlpha()); + else + throw new BlocksException("Block 'Set Colormap': illegal channel number for this sequence !", true); + } + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetColormaps.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetColormaps.java new file mode 100644 index 0000000000000000000000000000000000000000..9e0d9e548fb48112eaf9a319d8b32c0d7919ed78 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetColormaps.java @@ -0,0 +1,53 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.image.colormap.IcyColorMap; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +public class SetColormaps extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence sequenceIn = new VarSequence("Input", null); + final protected VarArray<IcyColorMap> colormaps = new VarArray<IcyColorMap>("Color maps", IcyColorMap[].class, + new IcyColorMap[0]); + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("input", sequenceIn); + inputMap.add("colormaps", colormaps); + } + + @Override + public void declareOutput(VarList outputMap) + { + // no output here + } + + @Override + public void run() + { + final Sequence seq = sequenceIn.getValue(); + if (seq == null) + throw new VarException(sequenceIn, "Sequence is null"); + + final IcyColorMap[] cms = colormaps.getValue(); + if (cms == null) + throw new VarException(colormaps, "Color maps is null"); + + for (int c = 0; c < Math.min(seq.getSizeC(), cms.length); c++) + seq.setColormap(c, cms[c], cms[c].isAlpha()); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetName.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetName.java new file mode 100644 index 0000000000000000000000000000000000000000..2cf4be88bac22d6ae353bc140d801201eb931d4f --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetName.java @@ -0,0 +1,53 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.lang.VarString; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class SetName extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSequence = new VarSequence("Sequence", null); + final protected VarString name = new VarString("Name", ""); + + @Override + public void run() + { + Sequence s = varSequence.getValue(); + if (s != null) + { + s.setName(name.getValue()); + } + else + { + throw new VarException(varSequence, "Sequence is null"); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + inputMap.add("name", name); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetResolution.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetResolution.java new file mode 100644 index 0000000000000000000000000000000000000000..e821818efdecc404e913293f558acb0567cf11f1 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/SetResolution.java @@ -0,0 +1,70 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarDouble; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * @author thomasprovoost + */ +public class SetResolution extends Plugin implements SequenceBlock, PluginBundled +{ + final protected VarSequence varSequence = new VarSequence("Sequence", null); + final protected VarDouble pxSizeX = new VarDouble("Pixel Size X (µm)", 1d); + final protected VarDouble pxSizeY = new VarDouble("Pixel Size Y (µm)", 1d); + final protected VarDouble pxSizeZ = new VarDouble("Pixel Size Z (µm)", 1d); + final protected VarDouble timeIntT = new VarDouble("Time interval T (s)", 100d); + + @Override + public void run() + { + Sequence s = varSequence.getValue(); + + if (s != null) + { + double x = pxSizeX.getValue().doubleValue(); + double y = pxSizeY.getValue().doubleValue(); + double z = pxSizeZ.getValue().doubleValue(); + double ti = timeIntT.getValue().doubleValue(); + if (x != -1) + s.setPixelSizeX(x); + if (y != -1) + s.setPixelSizeY(y); + if (z != -1) + s.setPixelSizeZ(z); + if (ti != -1) + s.setTimeInterval(ti); + } else + { + throw new VarException(varSequence, "Sequence is null"); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", varSequence); + inputMap.add("PxSize X (µm)", pxSizeX); + inputMap.add("PxSize Y (µm)", pxSizeY); + inputMap.add("PxSize Z (µm)", pxSizeZ); + inputMap.add("Time interval T (s)", timeIntT); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/infos/VarColormap.java b/src/main/java/plugins/tprovoost/sequenceblocks/infos/VarColormap.java new file mode 100644 index 0000000000000000000000000000000000000000..017f8b950f6b668f493e16b8085eebd77cd6913a --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/infos/VarColormap.java @@ -0,0 +1,90 @@ +package plugins.tprovoost.sequenceblocks.infos; + +import javax.swing.JComboBox; + +import org.w3c.dom.Node; + +import icy.gui.component.renderer.ColormapComboBoxRenderer; +import icy.image.colormap.IcyColorMap; +import icy.image.colormap.LinearColorMap; +import icy.util.XMLUtil; +import plugins.adufour.vars.gui.VarEditor; +import plugins.adufour.vars.gui.model.ValueSelectionModel; +import plugins.adufour.vars.gui.swing.ComboBox; +import plugins.adufour.vars.lang.Var; + +/** + * Define a specific Var type for ColorMap object + * + * @author emilie + */ +public class VarColormap extends Var<IcyColorMap> +{ + public static class ColormapSelectionModel extends ValueSelectionModel<IcyColorMap> + { + public ColormapSelectionModel() + { + super(IcyColorMap.getAllColorMaps(true, true).toArray(new IcyColorMap[0]), LinearColorMap.gray_, false); + } + + @Override + public boolean isValid(IcyColorMap value) + { + return true; + } + } + + public final String ID_NODE = "colormap"; + + /** + * Create a new VarColormap with given name and default value + */ + public VarColormap(String name, IcyColorMap defaultValue) + { + super(name, new ColormapSelectionModel()); + } + + @Override + public VarEditor<IcyColorMap> createVarEditor() + { + // create the var editor (combo box type here) + final ComboBox<IcyColorMap> result = new ComboBox<IcyColorMap>(this); + // get the editor component + final JComboBox combo = result.getEditorComponent(); + // and set a specific renderer + combo.setRenderer(new ColormapComboBoxRenderer(combo)); + + return result; + } + + @Override + public boolean loadFromXML(Node node) + { + try + { + final IcyColorMap map = new IcyColorMap(); + map.loadFromXML(XMLUtil.setElement(node, ID_NODE)); + setValue(map); + + return true; + } + catch (Exception e) + { + return false; + } + } + + @Override + public boolean saveToXML(Node node) throws UnsupportedOperationException + { + try + { + getValue().saveToXML(XMLUtil.setElement(node, ID_NODE)); + return true; + } + catch (Exception e) + { + return false; + } + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceChannelBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceChannelBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..f227dcdf5f39c9831fca6562ccaf1e5788b66547 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceChannelBatch.java @@ -0,0 +1,77 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.lang.Batch; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Simple batch loop to iterate over all C channel from an input Sequence. + * + * @author Stephane + */ +public class SequenceChannelBatch extends Batch implements SequenceBlock, PluginLibrary, PluginBundled +{ + // important to not initialize and create them in getBatchSource() and getBatchElement() + protected VarSequence inputSequence; + protected VarSequence element; + + public SequenceChannelBatch() + { + super(); + } + + @Override + public VarSequence getBatchSource() + { + // initialize variable if needed + if (inputSequence == null) + inputSequence = new VarSequence("Sequence", null); + + return inputSequence; + } + + @Override + public VarSequence getBatchElement() + { + // initialize element if needed + if (element == null) + element = new VarSequence("Channel Sequence", null); + + return element; + } + + @Override + public void initializeLoop() + { + final Sequence value = inputSequence.getValue(); + + if (value == null) + throw new VarException(inputSequence, "No input sequence indicated"); + } + + @Override + public void beforeIteration() + { + // set result in element + element.setValue( + SequenceUtil.extractChannel(inputSequence.getValue(), getIterationCounter().getValue().intValue())); + } + + @Override + public boolean isStopConditionReached() + { + return getIterationCounter().getValue().intValue() >= inputSequence.getValue().getSizeC(); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..782c76cf22a1fcc65214f96af01bd64148f79d4c --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterBatch.java @@ -0,0 +1,70 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import icy.file.SequenceFileImporter; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import plugins.adufour.blocks.lang.Batch; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; +import plugins.tprovoost.sequenceblocks.importer.PositionedSequenceFileImporter; + +/** + * Base abstract class for {@link SequenceFileImporter} batch loop. + * + * @author Stephane + */ +public abstract class SequenceFileImporterBatch extends Batch implements SequenceBlock, PluginLibrary, PluginBundled +{ + // important to not initialize and create them in getBatchSource() and getBatchElement() + protected Var<PositionedSequenceFileImporter> positionedImporter; + protected Var<PositionedSequenceFileImporter> element; + + // internal + protected int limit; + + @Override + public Var<PositionedSequenceFileImporter> getBatchSource() + { + // initialize variable if needed + if (positionedImporter == null) + positionedImporter = new Var<PositionedSequenceFileImporter>("Importer", + PositionedSequenceFileImporter.class); + + return positionedImporter; + } + + @Override + public Var<PositionedSequenceFileImporter> getBatchElement() + { + // initialize element if needed + if (element == null) + element = new Var<PositionedSequenceFileImporter>("Loop importer", PositionedSequenceFileImporter.class); + + return element; + } + + @Override + public void initializeLoop() + { + final PositionedSequenceFileImporter value = positionedImporter.getValue(); + + if (value == null) + throw new VarException(positionedImporter, "Input importer is null !"); + + final SequenceFileImporter imp = value.importer; + + if (imp.getOpened() == null) + throw new VarException(positionedImporter, "Importer is not opened !"); + + // init element with a copy of current positioned importer + element.setValue(new PositionedSequenceFileImporter(value)); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterChannelBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterChannelBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..46640c56371c0c1eade6faae2c6d3a23d531ce35 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterChannelBatch.java @@ -0,0 +1,54 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import icy.file.SequenceFileImporter; +import icy.sequence.MetaDataUtil; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.importer.PositionedSequenceFileImporter; + +/** + * Simple batch loop to iterate over all C channel from specified opened {@link SequenceFileImporter} object. + * + * @author Stephane + */ +public class SequenceFileImporterChannelBatch extends SequenceFileImporterBatch +{ + @Override + public void initializeLoop() + { + super.initializeLoop(); + + final PositionedSequenceFileImporter pi = positionedImporter.getValue(); + + try + { + // can iterate over C dimension ? + if (pi.c == -1) + limit = MetaDataUtil.getSizeC(pi.getMetadata(), (pi.s == -1) ? 0 : pi.s); + else + limit = 1; + } + catch (Exception e) + { + throw new VarException(element, + "Error while initializing SequenceFileImporter channel batch: " + e.getMessage()); + } + } + + @Override + public void beforeIteration() + { + // set current position C + if (positionedImporter.getValue().c == -1) + { + element.getValue().c = getIterationCounter().getValue().intValue(); + // force element changed event so loop get correctly executed + element.valueChanged(element, element.getValue(), element.getValue()); + } + } + + @Override + public boolean isStopConditionReached() + { + return getIterationCounter().getValue().intValue() >= limit; + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterFrameBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterFrameBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..e91d5f4ff98aba478bb7aa82b97957726f288141 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterFrameBatch.java @@ -0,0 +1,54 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import icy.file.SequenceFileImporter; +import icy.sequence.MetaDataUtil; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.importer.PositionedSequenceFileImporter; + +/** + * Simple batch loop to iterate over all T frame from the specified opened {@link SequenceFileImporter} object. + * + * @author Stephane + */ +public class SequenceFileImporterFrameBatch extends SequenceFileImporterBatch +{ + @Override + public void initializeLoop() + { + super.initializeLoop(); + + final PositionedSequenceFileImporter pi = positionedImporter.getValue(); + + try + { + // can iterate over T dimension ? + if (pi.t == -1) + limit = MetaDataUtil.getSizeT(pi.getMetadata(), (pi.s == -1) ? 0 : pi.s); + else + limit = 1; + } + catch (Exception e) + { + throw new VarException(element, + "Error while initializing SequenceFileImporter frame batch: " + e.getMessage()); + } + } + + @Override + public void beforeIteration() + { + // set current position T + if (positionedImporter.getValue().t == -1) + { + element.getValue().t = getIterationCounter().getValue().intValue(); + // force element changed event so loop get correctly executed + element.valueChanged(element, element.getValue(), element.getValue()); + } + } + + @Override + public boolean isStopConditionReached() + { + return getIterationCounter().getValue().intValue() >= limit; + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterRegionBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterRegionBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..0bbd8bb263a02730c16eb1c2aa4fac2fd7dad8cd --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterRegionBatch.java @@ -0,0 +1,137 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; +import java.util.ArrayList; +import java.util.List; + +import icy.file.SequenceFileImporter; +import icy.roi.ROI; +import icy.sequence.MetaDataUtil; +import icy.type.rectangle.Rectangle2DUtil; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.importer.PositionedSequenceFileImporter; + +/** + * Simple batch loop to iterate over a set of XY region defined by ROIs from the specified opened + * {@link SequenceFileImporter} object. + * + * @author Stephane + */ +public class SequenceFileImporterRegionBatch extends SequenceFileImporterBatch +{ + protected VarROIArray rois; + protected VarInteger inputRoisResolution; + protected VarInteger inputRoisMargin; + protected List<Rectangle> regions; + + @Override + public void initializeLoop() + { + super.initializeLoop(); + + final PositionedSequenceFileImporter pi = positionedImporter.getValue(); + + // can iterate over XY dimension ? + if ((pi.xyRegion == null) && (rois.getValue() != null)) + { + final int s = (pi.s == -1) ? 0 : pi.s; + final Rectangle regionMask; + + try + { + // mask for region + regionMask = new Rectangle(0, 0, MetaDataUtil.getSizeX(pi.getMetadata(), s), + MetaDataUtil.getSizeY(pi.getMetadata(), s)); + } + catch (Exception e) + { + throw new VarException(element, + "Error while initializing SequenceFileImporter region batch: " + e.getMessage()); + } + + final double scaleFactor = Math.pow(2, inputRoisResolution.getValue().doubleValue()); + final double margeFactor = 1d + (inputRoisMargin.getValue().doubleValue() / 100d); + + // build 2D regions from ROI + regions = new ArrayList<Rectangle>(); + for (ROI roi : rois.getValue()) + { + Rectangle2D region = roi.getBounds5D().toRectangle2D(); + + // convert to full resolution if needed + if (scaleFactor != 1d) + region = Rectangle2DUtil.getScaledRectangle(region, scaleFactor, false, true); + // apply marge factor if needed + if (margeFactor != 1d) + region = Rectangle2DUtil.getScaledRectangle(region, margeFactor, true, false); + + // use regionMask to limit to image region + regions.add(region.getBounds().intersection(regionMask)); + } + + // set limit + limit = regions.size(); + } + else + limit = 1; + } + + @Override + public void beforeIteration() + { + // set current position XY region + if (positionedImporter.getValue().xyRegion == null) + { + element.getValue().xyRegion = regions.get(getIterationCounter().getValue().intValue()); + // force element changed event so loop get correctly executed + element.valueChanged(element, element.getValue(), element.getValue()); + } + } + + @Override + public void declareInput(VarList inputMap) + { + super.declareInput(inputMap); + + // lazy creation + if (rois == null) + rois = new VarROIArray("XY regions (ROIs)"); + if (inputRoisResolution == null) + inputRoisResolution = new VarInteger("ROIs resolution", 0); + if (inputRoisMargin == null) + inputRoisMargin = new VarInteger("ROIs margin", 20); + + inputMap.add("regions", rois); + inputMap.add("inputResolution", inputRoisResolution); + inputMap.add("inputRoisMarge", inputRoisMargin); + } + + @Override + public void declareLoopVariables(List<Var<?>> loopVariables) + { + // lazy creation + if (rois == null) + rois = new VarROIArray("XY regions (ROIs)"); + if (inputRoisResolution == null) + inputRoisResolution = new VarInteger("ROIs resolution", 0); + if (inputRoisMargin == null) + inputRoisMargin = new VarInteger("ROIs margin", 20); + + loopVariables.add(rois); + loopVariables.add(inputRoisResolution); + loopVariables.add(inputRoisMargin); + + super.declareLoopVariables(loopVariables); + } + + @Override + public boolean isStopConditionReached() + { + return getIterationCounter().getValue().intValue() >= limit; + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterSeriesBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterSeriesBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..255c14ceb98dbccc3ec8b09e5a4db47f420a240f --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterSeriesBatch.java @@ -0,0 +1,48 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import icy.file.SequenceFileImporter; +import icy.sequence.MetaDataUtil; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.importer.PositionedSequenceFileImporter; + +/** + * Simple batch loop to iterate over all series from the specified opened {@link SequenceFileImporter} object. + * + * @author Stephane + */ +public class SequenceFileImporterSeriesBatch extends SequenceFileImporterBatch +{ + @Override + public void initializeLoop() + { + super.initializeLoop(); + + final PositionedSequenceFileImporter pi = positionedImporter.getValue(); + + try + { + // force series iteration as by default series is set to 0 + limit = MetaDataUtil.getNumSeries(pi.getMetadata()); + } + catch (Exception e) + { + throw new VarException(element, + "Error while initializing SequenceFileImporter series batch: " + e.getMessage()); + } + } + + @Override + public void beforeIteration() + { + // set current position S + element.getValue().s = getIterationCounter().getValue().intValue(); + // force element changed event so loop get correctly executed + element.valueChanged(element, element.getValue(), element.getValue()); + } + + @Override + public boolean isStopConditionReached() + { + return getIterationCounter().getValue().intValue() >= limit; + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterSliceBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterSliceBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..061b76de2ce25f577b22617ab6d0e5ec2b1049a7 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterSliceBatch.java @@ -0,0 +1,54 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import icy.file.SequenceFileImporter; +import icy.sequence.MetaDataUtil; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.importer.PositionedSequenceFileImporter; + +/** + * Simple batch loop to iterate over all Z slice from specified opened {@link SequenceFileImporter} object. + * + * @author Stephane + */ +public class SequenceFileImporterSliceBatch extends SequenceFileImporterBatch +{ + @Override + public void initializeLoop() + { + super.initializeLoop(); + + final PositionedSequenceFileImporter pi = positionedImporter.getValue(); + + try + { + // can iterate over Z dimension ? + if (pi.z == -1) + limit = MetaDataUtil.getSizeZ(pi.getMetadata(), (pi.s == -1) ? 0 : pi.s); + else + limit = 1; + } + catch (Exception e) + { + throw new VarException(element, + "Error while initializing SequenceFileImporter slice batch: " + e.getMessage()); + } + } + + @Override + public void beforeIteration() + { + // set current position Z + if (positionedImporter.getValue().z == -1) + { + element.getValue().z = getIterationCounter().getValue().intValue(); + // force element changed event so loop get correctly executed + element.valueChanged(element, element.getValue(), element.getValue()); + } + } + + @Override + public boolean isStopConditionReached() + { + return getIterationCounter().getValue().intValue() >= limit; + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterTileBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterTileBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..5386fb6de960654e2274d0f96aebebc51482b1a6 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFileImporterTileBatch.java @@ -0,0 +1,109 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import java.awt.Rectangle; +import java.util.List; + +import icy.file.SequenceFileImporter; +import icy.image.ImageUtil; +import icy.sequence.MetaDataUtil; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.importer.PositionedSequenceFileImporter; + +/** + * Simple batch loop to iterate over all XY tile from the specified opened {@link SequenceFileImporter} object. + * + * @author Stephane + */ +public class SequenceFileImporterTileBatch extends SequenceFileImporterBatch +{ + protected final VarInteger tileW; + protected final VarInteger tileH; + + protected List<Rectangle> tiles; + + public SequenceFileImporterTileBatch() + { + super(); + + tileW = new VarInteger("Tile width (-1 = auto)", 0); + tileH = new VarInteger("Tile height (-1 = auto)", 0); + } + + @Override + public void initializeLoop() + { + super.initializeLoop(); + + final PositionedSequenceFileImporter pi = positionedImporter.getValue(); + + // can iterate over XY dimension ? + if (pi.xyRegion == null) + { + final SequenceFileImporter imp = pi.importer; + final int s = (pi.s == -1) ? 0 : pi.s; + final int sizeX; + final int sizeY; + int tw; + int th; + + try + { + sizeX = MetaDataUtil.getSizeX(pi.getMetadata(), s); + sizeY = MetaDataUtil.getSizeY(pi.getMetadata(), s); + + tw = tileW.getValue().intValue(); + th = tileH.getValue().intValue(); + // auto ? --> get it from importer + if (tw == -1) + tw = imp.getTileWidth(s); + // auto ? --> get it from importer + if (th == -1) + th = imp.getTileHeight(s); + } + catch (Exception e) + { + throw new VarException(positionedImporter, + "Error while initializing SequenceFileImporter tile batch: " + e.getMessage()); + } + + // any size supported ? --> use 1024 by default + if (tw == -1) + tw = 1024; + // tile loading not supported ? --> use full width + else if (tw == 0) + tw = sizeX; + // any size supported ? --> use 1024 by default + if (th == -1) + th = 1024; + // tile loading not supported ? --> use full height + else if (th == 0) + th = sizeY; + + // get tiles + tiles = ImageUtil.getTileList(sizeX, sizeY, tw, th); + // set limit + limit = tiles.size(); + } + else + limit = 1; + } + + @Override + public void beforeIteration() + { + // set current position XY region + if (positionedImporter.getValue().xyRegion == null) + { + element.getValue().xyRegion = tiles.get(getIterationCounter().getValue().intValue()); + // force element changed event so loop get correctly executed + element.valueChanged(element, element.getValue(), element.getValue()); + } + } + + @Override + public boolean isStopConditionReached() + { + return getIterationCounter().getValue().intValue() >= limit; + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFrameBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFrameBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..d06b0a6c91a7b520f7eb72e5bdeb9e26a14cf6e2 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceFrameBatch.java @@ -0,0 +1,76 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.lang.Batch; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Simple batch loop to iterate over all T frame from an input Sequence. + * + * @author Stephane + */ +public class SequenceFrameBatch extends Batch implements PluginLibrary, PluginBundled +{ + // important to not initialize and create them in getBatchSource() and getBatchElement() + protected VarSequence inputSequence; + protected VarSequence element; + + public SequenceFrameBatch() + { + super(); + } + + @Override + public VarSequence getBatchSource() + { + // initialize variable if needed + if (inputSequence == null) + inputSequence = new VarSequence("Sequence", null); + + return inputSequence; + } + + @Override + public VarSequence getBatchElement() + { + // initialize element if needed + if (element == null) + element = new VarSequence("Channel Sequence", null); + + return element; + } + + @Override + public void initializeLoop() + { + final Sequence value = inputSequence.getValue(); + + if (value == null) + throw new VarException(inputSequence, "No input sequence indicated"); + } + + @Override + public void beforeIteration() + { + // set result in element + element.setValue( + SequenceUtil.extractFrame(inputSequence.getValue(), getIterationCounter().getValue().intValue())); + } + + @Override + public boolean isStopConditionReached() + { + return getIterationCounter().getValue().intValue() >= inputSequence.getValue().getSizeT(); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceRegionBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceRegionBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..548ba91b6ad96f97bda809d1c73ab7538d72fd88 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceRegionBatch.java @@ -0,0 +1,104 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import java.util.List; + +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.lang.Batch; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.Var; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Simple batch loop to iterate over a set of Region (ROIs) from an input Sequence. + * + * @author Stephane + */ +public class SequenceRegionBatch extends Batch implements SequenceBlock, PluginLibrary, PluginBundled +{ + // important to not initialize and create them in getBatchSource() and getBatchElement() + protected VarSequence inputSequence; + protected VarSequence element; + protected final VarROIArray rois; + + public SequenceRegionBatch() + { + super(); + + rois = new VarROIArray("ROI(s)"); + } + + @Override + public VarSequence getBatchSource() + { + // initialize variable if needed + if (inputSequence == null) + inputSequence = new VarSequence("Sequence", null); + + return inputSequence; + } + + @Override + public VarSequence getBatchElement() + { + // initialize element if needed + if (element == null) + element = new VarSequence("Channel Sequence", null); + + return element; + } + + @Override + public void initializeLoop() + { + final Sequence value = inputSequence.getValue(); + + if (value == null) + throw new VarException(inputSequence, "No input sequence indicated"); + + if (rois.getValue() == null) + throw new VarException(rois, "No roi(s) indicated --> no region to iterate over"); + } + + @Override + public void beforeIteration() + { + // set result in element + element.setValue(SequenceUtil.getSubSequence(inputSequence.getValue(), + rois.getValue()[getIterationCounter().getValue().intValue()])); + } + + @Override + public boolean isStopConditionReached() + { + return getIterationCounter().getValue().intValue() >= rois.getValue().length; + } + + @Override + public void declareInput(VarList inputMap) + { + super.declareInput(inputMap); + + inputMap.add("ROIs", rois); + } + + @Override + public void declareLoopVariables(List<Var<?>> loopVariables) + { + super.declareLoopVariables(loopVariables); + + loopVariables.add(rois); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceSliceBatch.java b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceSliceBatch.java new file mode 100644 index 0000000000000000000000000000000000000000..4a0440a7b96052163ea9f147b768379c7330620b --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/loop/SequenceSliceBatch.java @@ -0,0 +1,77 @@ +package plugins.tprovoost.sequenceblocks.loop; + +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.lang.Batch; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Simple batch loop to iterate over all Z slice from an input Sequence. + * + * @author Stephane + */ +public class SequenceSliceBatch extends Batch implements SequenceBlock, PluginLibrary, PluginBundled +{ + // important to not initialize and create them in getBatchSource() and getBatchElement() + protected VarSequence inputSequence; + protected VarSequence element; + + public SequenceSliceBatch() + { + super(); + } + + @Override + public VarSequence getBatchSource() + { + // initialize variable if needed + if (inputSequence == null) + inputSequence = new VarSequence("Sequence", null); + + return inputSequence; + } + + @Override + public VarSequence getBatchElement() + { + // initialize element if needed + if (element == null) + element = new VarSequence("Channel Sequence", null); + + return element; + } + + @Override + public void initializeLoop() + { + final Sequence value = inputSequence.getValue(); + + if (value == null) + throw new VarException(inputSequence, "No input sequence indicated"); + } + + @Override + public void beforeIteration() + { + // set result in element + element.setValue( + SequenceUtil.extractSlice(inputSequence.getValue(), getIterationCounter().getValue().intValue())); + } + + @Override + public boolean isStopConditionReached() + { + return getIterationCounter().getValue().intValue() >= inputSequence.getValue().getSizeZ(); + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/op/AdditiveFillSequence.java b/src/main/java/plugins/tprovoost/sequenceblocks/op/AdditiveFillSequence.java new file mode 100644 index 0000000000000000000000000000000000000000..ec957c70ac0a0a08c7a85c7a221d0a5d52030143 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/op/AdditiveFillSequence.java @@ -0,0 +1,95 @@ +/** + * + */ +package plugins.tprovoost.sequenceblocks.op; + +import icy.image.ImageDataIterator; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import icy.sequence.Sequence; +import icy.sequence.SequenceDataIterator; +import icy.type.DataIterator; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to do additive fill of area inside the ROI regions with the specified value.<br> + * The result of this operation is similar to heatmap production from ROIs. + * + * @author Stephane + */ +public class AdditiveFillSequence extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarROIArray rois = new VarROIArray("Roi(s)"); + + @Override + public void run() + { + final Sequence sequence = inputSequence.getValue(); + if (sequence == null) + throw new VarException(inputSequence, "Input sequence is null."); + + if (rois.getValue() != null) + { + for (ROI roi : rois.getValue()) + doAdditiveFill(sequence, roi, 1d); + + sequence.dataChanged(); + } + } + + public static void doAdditiveFill(Sequence sequence, ROI roi, double value) + { + doAdditiveFill(new SequenceDataIterator(sequence, roi), value); + } + + public static void doAdditiveFill(DataIterator it, double value) + { + it.reset(); + + while (!it.done()) + { + it.set(it.get() + value); + it.next(); + } + + try + { + // not really nice to do that here, but it's to preserve backward compatibility + if (it instanceof SequenceDataIterator) + ((SequenceDataIterator) it).flush(); + else if (it instanceof ImageDataIterator) + ((ImageDataIterator) it).flush(); + } + catch (Throwable t) + { + // ignore + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("rois", rois); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} \ No newline at end of file diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/op/FillInnerSequence.java b/src/main/java/plugins/tprovoost/sequenceblocks/op/FillInnerSequence.java new file mode 100644 index 0000000000000000000000000000000000000000..39c7c63ee2de233e5ddee6c3454eb67caf67e002 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/op/FillInnerSequence.java @@ -0,0 +1,69 @@ +/** + * + */ +package plugins.tprovoost.sequenceblocks.op; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import icy.sequence.Sequence; +import icy.sequence.SequenceDataIterator; +import icy.type.DataIteratorUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarDouble; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to fill area inside the ROI regions with the specified value + * + * @author Stephane + */ +public class FillInnerSequence extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarROIArray rois = new VarROIArray("Roi(s)"); + final protected VarDouble fillValue = new VarDouble("Value", 0d); + + @Override + public void run() + { + final Sequence sequence = inputSequence.getValue(); + if (sequence == null) + throw new VarException(inputSequence, "Input sequence is null."); + + if (rois.getValue() != null) + { + final double value = fillValue.getValue().doubleValue(); + + for (ROI roi : rois.getValue()) + DataIteratorUtil.set(new SequenceDataIterator(sequence, roi), value); + + sequence.dataChanged(); + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("rois", rois); + inputMap.add("value", fillValue); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} \ No newline at end of file diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/op/FillOuterSequence.java b/src/main/java/plugins/tprovoost/sequenceblocks/op/FillOuterSequence.java new file mode 100644 index 0000000000000000000000000000000000000000..7e3faea781fd71a5675b3b2af8afefbbdeebda37 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/op/FillOuterSequence.java @@ -0,0 +1,83 @@ +/** + * + */ +package plugins.tprovoost.sequenceblocks.op; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import icy.roi.ROIUtil; +import icy.sequence.Sequence; +import icy.sequence.SequenceDataIterator; +import icy.type.DataIteratorUtil; +import icy.type.collection.CollectionUtil; +import icy.util.ShapeUtil.BooleanOperator; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarDouble; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.kernel.roi.roi5d.ROI5DStackRectangle; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to fill area outside the ROI regions with the specified value + * + * @author Stephane + */ +public class FillOuterSequence extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarROIArray rois = new VarROIArray("Roi(s)"); + final protected VarDouble fillValue = new VarDouble("Value", 0d); + + @Override + public void run() + { + final Sequence sequence = inputSequence.getValue(); + if (sequence == null) + throw new VarException(inputSequence, "Input sequence is null."); + + if (rois.getValue() != null) + { + try + { + final ROI roiUnion = ROIUtil.merge(CollectionUtil.asList(rois.getValue()), BooleanOperator.OR); + final ROI roiSeq = new ROI5DStackRectangle(sequence.getBounds5D()); + final ROI roi = roiSeq.getSubtraction(roiUnion); + + final double value = fillValue.getValue().doubleValue(); + + DataIteratorUtil.set(new SequenceDataIterator(sequence, roi), value); + + sequence.dataChanged(); + } + catch (UnsupportedOperationException e) + { + throw new VarException(rois, e.getMessage()); + } + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("rois", rois); + inputMap.add("value", fillValue); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} \ No newline at end of file diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveAllRois.java b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveAllRois.java new file mode 100644 index 0000000000000000000000000000000000000000..6ce1c1a3f93ff24a7ce22bb92fabf8f5e050f5f3 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveAllRois.java @@ -0,0 +1,50 @@ +package plugins.tprovoost.sequenceblocks.remove; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to remove all the {@link ROI} from a Sequence + * + * @author Stephane + */ +public class RemoveAllRois extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + + @Override + public void run() + { + final Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + + s.removeAllROI(false); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveChannel.java b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveChannel.java new file mode 100644 index 0000000000000000000000000000000000000000..946b5cbc21e7dfffa7e3c27a32ae1b5a9c9c3342 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveChannel.java @@ -0,0 +1,59 @@ +package plugins.tprovoost.sequenceblocks.remove; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to remove a channel from a Sequence + * + * @author Stephane + */ +public class RemoveChannel extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarInteger channelIdx = new VarInteger("Channel", 0); + + @Override + public void run() + { + Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + if (s.getSizeC() == 1) + throw new VarException(inputSequence, "Cannot remove channel on single channel image"); + + int channel = channelIdx.getValue().intValue(); + if (channel < 0 || channel >= s.getSizeC()) + throw new VarException(channelIdx, "Channel index must be between 0 and " + (s.getSizeC() - 1)); + + SequenceUtil.removeChannel(s, channel); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("channel", channelIdx); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveFrame.java b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveFrame.java new file mode 100644 index 0000000000000000000000000000000000000000..4583bfd0a3ca4801db761ef27456083f5bf5e16b --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveFrame.java @@ -0,0 +1,53 @@ +package plugins.tprovoost.sequenceblocks.remove; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to remove a frame from a Sequence + * + * @author Stephane + */ +public class RemoveFrame extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarInteger frameInd = new VarInteger("Frame", 0); + + @Override + public void run() + { + Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + + SequenceUtil.removeTAndShift(s, frameInd.getValue().intValue()); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("frame", frameInd); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} \ No newline at end of file diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveOverlays.java b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveOverlays.java new file mode 100644 index 0000000000000000000000000000000000000000..78d90d27ef9c2723d56d26ecd3833807357e1b1d --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveOverlays.java @@ -0,0 +1,69 @@ +/** + * + */ +package plugins.tprovoost.sequenceblocks.remove; + +import icy.painter.Overlay; +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to remove one or several {@link Overlay} from a {@link Sequence} + * + * @author Stephane + */ +public class RemoveOverlays extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarArray<Overlay> overlays = new VarArray<Overlay>("Overlay(s)", Overlay[].class, new Overlay[0]); + + @Override + public void run() + { + final Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + + final Overlay[] o = overlays.getValue(); + if (o != null) + { + s.beginUpdate(); + try + { + for (Overlay overlay : o) + s.removeOverlay(overlay); + } + finally + { + s.endUpdate(); + } + } + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("overlay(s)", overlays); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveRois.java b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveRois.java new file mode 100644 index 0000000000000000000000000000000000000000..2866f0d39c92863ae77de550b4a3296bff843ece --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveRois.java @@ -0,0 +1,58 @@ +package plugins.tprovoost.sequenceblocks.remove; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.roi.ROI; +import icy.sequence.Sequence; + +import java.util.Arrays; + +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarROIArray; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to remove one or several {@link ROI} from a Sequence + * + * @author Stephane + */ +public class RemoveRois extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarROIArray rois = new VarROIArray("Roi(s)"); + + @Override + public void run() + { + final Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + + final ROI[] r = rois.getValue(); + if (r != null) + s.removeROIs(Arrays.asList(r), false); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("rois(s)", rois); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} diff --git a/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveSlice.java b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveSlice.java new file mode 100644 index 0000000000000000000000000000000000000000..56fecece3e81d0ca07b1b386f7c6cf953674e677 --- /dev/null +++ b/src/main/java/plugins/tprovoost/sequenceblocks/remove/RemoveSlice.java @@ -0,0 +1,53 @@ +package plugins.tprovoost.sequenceblocks.remove; + +import icy.plugin.abstract_.Plugin; +import icy.plugin.interface_.PluginBundled; +import icy.plugin.interface_.PluginLibrary; +import icy.sequence.Sequence; +import icy.sequence.SequenceUtil; +import plugins.adufour.blocks.tools.sequence.SequenceBlock; +import plugins.adufour.blocks.util.VarList; +import plugins.adufour.vars.lang.VarInteger; +import plugins.adufour.vars.lang.VarSequence; +import plugins.adufour.vars.util.VarException; +import plugins.tprovoost.sequenceblocks.SequenceBlocks; + +/** + * Block to remove a Z slice from a Sequence + * + * @author Stephane + */ +public class RemoveSlice extends Plugin implements SequenceBlock, PluginLibrary, PluginBundled +{ + final protected VarSequence inputSequence = new VarSequence("Sequence", null); + final protected VarInteger sliceInd = new VarInteger("Slice", 0); + + @Override + public void run() + { + Sequence s = inputSequence.getValue(); + if (s == null) + throw new VarException(inputSequence, "Input sequence is null."); + + SequenceUtil.removeZAndShift(s, sliceInd.getValue().intValue()); + } + + @Override + public void declareInput(VarList inputMap) + { + inputMap.add("sequence", inputSequence); + inputMap.add("slice", sliceInd); + } + + @Override + public void declareOutput(VarList outputMap) + { + // + } + + @Override + public String getMainPluginClassName() + { + return SequenceBlocks.class.getName(); + } +} \ No newline at end of file diff --git a/src/main/resources/SequenceBlocks.xml b/src/main/resources/SequenceBlocks.xml new file mode 100644 index 0000000000000000000000000000000000000000..352d4eb38a0aeb6a81adc1c6631cac5464888c03 --- /dev/null +++ b/src/main/resources/SequenceBlocks.xml @@ -0,0 +1,22 @@ +<?xml version='1.0' encoding='ISO-8859-1' standalone='no'?> +<root> +<url><![CDATA[http://www.bioimageanalysis.org/icy/repository/getXMLPluginFile.php?pluginId=182&beta=0]]></url><name>Sequence Blocks</name><version>1.0.0.1</version><required_kernel_version>1.2.5.0</required_kernel_version><kernel_ver>1.2.5.0</kernel_ver><jar_url><![CDATA[http://www.bioimageanalysis.org/icy/repository/getJarFile.php?pluginId=182&beta=0]]></jar_url><icon_url><![CDATA[http://bioimageanalysis.org/icy/image.php?idAttach=1256]]></icon_url><image_url></image_url><description><![CDATA[This plugin allows one to use various basic sequence operations within Blocks.]]></description><classname><![CDATA[plugins.tprovoost.sequenceblocks.SequenceBlocks]]></classname><author><![CDATA[tprovoost - Thomas Provoost]]></author><changelog><![CDATA[- +Version 1.0.0.1 +Date 2012-06-22 15:17:27 + +Added Description to the Blocks. +Corrected Save Sequence block name. + +- +Version 1.0.0.0 +Date 2012-06-21 15:37:19 + +First real version. + +- +Version 0.0.1.0 +Date 2012-06-21 15:00:05 + + + +]]></changelog><dependencies><dependency><classname>plugins.adufour.blocks.Blocks</classname><version>0.0.0.1</version></dependency></dependencies></root> \ No newline at end of file diff --git a/src/main/resources/SequenceBlocks_icon.png b/src/main/resources/SequenceBlocks_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a70e1f10004bbd8666695af79be78770dadbd1b Binary files /dev/null and b/src/main/resources/SequenceBlocks_icon.png differ