From c3407fb1e8beba2532ea9da06fe53b9c1e806e2f Mon Sep 17 00:00:00 2001 From: Nicolas Chiaruttini Date: Thu, 13 Jun 2024 00:04:15 +0200 Subject: [PATCH 1/6] Attempt to split the link between registration plugins and the rest of abba, in preparation for the move to the upstream repo. Still need to move the ui, which is ABBA specific. --- .../aligner/EditLastRegistrationAction.java | 2 +- .../atlas/aligner/MultiSlicePositioner.java | 35 +++++++++---------- .../atlas/aligner/RegisterSliceAction.java | 2 +- .../epfl/biop/atlas/aligner/SliceSources.java | 7 +--- .../aligner/adapter/RegistrationAdapter.java | 12 +++---- ...egisterSlicesDeepSliceAbstractCommand.java | 4 +-- .../gui/bdv/BdvMultislicePositionerView.java | 8 ++--- .../plugin/IABBARegistrationPlugin.java | 12 ------- .../plugin/ExternalRegistrationPlugin.java} | 4 +-- .../plugin/IRegistrationPlugin.java | 9 +++++ .../plugin/RegistrationPluginHelper.java | 20 +++++------ .../plugin/RegistrationTypeProperties.java | 2 +- .../plugin/SimpleRegistrationPlugin.java} | 4 +-- .../plugin/SimpleRegistrationWrapper.java | 22 ++++++------ .../SourceAndConverterRegistration.java | 11 ++---- .../affine/AffineRegistration.java | 6 ++-- ...eTransformedSourceWrapperRegistration.java | 1 - .../affine/Elastix2DAffineRegistration.java | 7 ++-- .../bigwarp/SacBigWarp2DRegistration.java | 6 ++-- .../mirror/MirrorXRegistration.java | 6 ++-- .../spline/Elastix2DSplineRegistration.java | 7 ++-- .../IdentityRegistrationPluginExample.java | 18 ++++------ .../ExternalIdentityRegistrationPlugin.java | 10 ++---- ...ernalSimpleRotationRegistrationPlugin.java | 4 +-- .../py/TestExternalRegistrationPlugin.java | 2 +- 25 files changed, 92 insertions(+), 129 deletions(-) delete mode 100644 src/main/java/ch/epfl/biop/atlas/aligner/plugin/IABBARegistrationPlugin.java rename src/main/java/ch/epfl/biop/{atlas/aligner/plugin/ExternalABBARegistrationPlugin.java => registration/plugin/ExternalRegistrationPlugin.java} (85%) create mode 100644 src/main/java/ch/epfl/biop/registration/plugin/IRegistrationPlugin.java rename src/main/java/ch/epfl/biop/{atlas/aligner => registration}/plugin/RegistrationPluginHelper.java (78%) rename src/main/java/ch/epfl/biop/{atlas/aligner => registration}/plugin/RegistrationTypeProperties.java (94%) rename src/main/java/ch/epfl/biop/{atlas/aligner/plugin/SimpleABBARegistrationPlugin.java => registration/plugin/SimpleRegistrationPlugin.java} (90%) rename src/main/java/ch/epfl/biop/{atlas/aligner => registration}/plugin/SimpleRegistrationWrapper.java (96%) diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/EditLastRegistrationAction.java b/src/main/java/ch/epfl/biop/atlas/aligner/EditLastRegistrationAction.java index 92d23ee5..e823d89f 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/EditLastRegistrationAction.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/EditLastRegistrationAction.java @@ -1,6 +1,6 @@ package ch.epfl.biop.atlas.aligner; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationPluginHelper; +import ch.epfl.biop.registration.plugin.RegistrationPluginHelper; import ch.epfl.biop.sourceandconverter.processor.SourcesIdentity; import ch.epfl.biop.sourceandconverter.processor.SourcesProcessComposer; import ch.epfl.biop.sourceandconverter.processor.SourcesProcessor; diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/MultiSlicePositioner.java b/src/main/java/ch/epfl/biop/atlas/aligner/MultiSlicePositioner.java index b444285e..4d181e0d 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/MultiSlicePositioner.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/MultiSlicePositioner.java @@ -3,9 +3,9 @@ import bdv.viewer.SourceAndConverter; import ch.epfl.biop.atlas.aligner.action.*; import ch.epfl.biop.atlas.aligner.adapter.*; -import ch.epfl.biop.atlas.aligner.plugin.ExternalABBARegistrationPlugin; -import ch.epfl.biop.atlas.aligner.plugin.IABBARegistrationPlugin; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationPluginHelper; +import ch.epfl.biop.registration.plugin.ExternalRegistrationPlugin; +import ch.epfl.biop.registration.plugin.IRegistrationPlugin; +import ch.epfl.biop.registration.plugin.RegistrationPluginHelper; import ch.epfl.biop.atlas.struct.Atlas; import ch.epfl.biop.registration.Registration; import ch.epfl.biop.sourceandconverter.processor.*; @@ -729,16 +729,16 @@ public void registerSelectedSlices(Command command, * to String using the scijava {@link ConvertService}. They need to be strings * to be serialized */ - public void registerSelectedSlices(Class registrationClass, + public void registerSelectedSlices(Class registrationClass, SourcesProcessor preprocessFixed, SourcesProcessor preprocessMoving, Map parameters) { PluginService ps = scijavaCtx.getService(PluginService.class); - Supplier pluginSupplier = + Supplier pluginSupplier = () -> { try { - return (IABBARegistrationPlugin) ps.getPlugin(registrationClass).createInstance(); + return (IRegistrationPlugin) ps.getPlugin(registrationClass).createInstance(); } catch (InstantiableException e) { e.printStackTrace(); return null; @@ -780,7 +780,7 @@ public void registerSelectedSlices(String registrationPluginName, * to String using the scijava {@link ConvertService}. They need to be strings * to be serialized */ - public void registerSelectedSlices(Supplier registrationPluginSupplier, + public void registerSelectedSlices(Supplier registrationPluginSupplier, SourcesProcessor preprocessFixed, SourcesProcessor preprocessMoving, Map parameters) { @@ -797,14 +797,11 @@ public void registerSelectedSlices(Supplier r for (SliceSources slice : getSelectedSlices()) { logger.debug("Starting slice registration for "+slice.getName()); - IABBARegistrationPlugin registration = registrationPluginSupplier.get(); + IRegistrationPlugin registration = registrationPluginSupplier.get(); if (registration!=null) { logger.debug("\t slice registration for "+slice.getName()+"- set context"); registration.setScijavaContext(scijavaCtx); - logger.debug("\t slice registration for "+slice.getName()+"- setSliceInfo"); - registration.setSliceInfo(new SliceInfo(this, slice)); - // Sends parameters to the registration logger.debug("\t slice registration for "+slice.getName()+"- setRegistrationParameters"); registration.setRegistrationParameters(convertToString(scijavaCtx, parameters)); @@ -915,15 +912,15 @@ public Gson getGsonStateSerializer(List serialized_sources) PluginService pluginService = scijavaCtx.getService(PluginService.class); // Creates adapter for all registration plugins - RegistrationAdapter registrationAdapter = new RegistrationAdapter(scijavaCtx, this); - pluginService.getPluginsOfType(IABBARegistrationPlugin.class).forEach(registrationPluginClass -> { - IABBARegistrationPlugin plugin = pluginService.createInstance(registrationPluginClass); + RegistrationAdapter registrationAdapter = new RegistrationAdapter(scijavaCtx); + pluginService.getPluginsOfType(IRegistrationPlugin.class).forEach(registrationPluginClass -> { + IRegistrationPlugin plugin = pluginService.createInstance(registrationPluginClass); factoryRegistrations.registerSubtype(plugin.getClass()); gsonbuilder.registerTypeHierarchyAdapter(plugin.getClass(), registrationAdapter); }); - factoryRegistrations.registerSubtype(ExternalABBARegistrationPlugin.class); - gsonbuilder.registerTypeHierarchyAdapter(ExternalABBARegistrationPlugin.class, registrationAdapter); + factoryRegistrations.registerSubtype(ExternalRegistrationPlugin.class); + gsonbuilder.registerTypeHierarchyAdapter(ExternalRegistrationPlugin.class, registrationAdapter); // For sources processor @@ -1456,7 +1453,7 @@ public SliceInfo(MultiSlicePositioner mp, SliceSources slice) { //---------------------- For PyImageJ extensions - static final Map> externalRegistrationPlugins = new HashMap<>(); + static final Map> externalRegistrationPlugins = new HashMap<>(); /** * Register an external registration plugin, for instance performed by a python function @@ -1464,7 +1461,7 @@ public SliceInfo(MultiSlicePositioner mp, SliceSources slice) { * @param name of the registration plugin * @param pluginSupplier the thing that makes a new plugin of this kind */ - public static void registerRegistrationPlugin(String name, Supplier pluginSupplier) { + public static void registerRegistrationPlugin(String name, Supplier pluginSupplier) { externalRegistrationPlugins.put(name, pluginSupplier); } @@ -1472,7 +1469,7 @@ public static boolean isExternalRegistrationPlugin(String name) { return externalRegistrationPlugins.containsKey(name); } - public static Supplier getExternalRegistrationPluginSupplier(String name) { + public static Supplier getExternalRegistrationPluginSupplier(String name) { return externalRegistrationPlugins.get(name); } diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/RegisterSliceAction.java b/src/main/java/ch/epfl/biop/atlas/aligner/RegisterSliceAction.java index 4ee30cbf..8f4418e6 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/RegisterSliceAction.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/RegisterSliceAction.java @@ -1,7 +1,7 @@ package ch.epfl.biop.atlas.aligner; import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationPluginHelper; +import ch.epfl.biop.registration.plugin.RegistrationPluginHelper; import ch.epfl.biop.registration.Registration; import ch.epfl.biop.sourceandconverter.processor.SourcesProcessor; import org.slf4j.Logger; diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/SliceSources.java b/src/main/java/ch/epfl/biop/atlas/aligner/SliceSources.java index 05cbec9f..f50d5429 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/SliceSources.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/SliceSources.java @@ -15,7 +15,7 @@ import bdv.viewer.Interpolation; import bdv.viewer.Source; import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationPluginHelper; +import ch.epfl.biop.registration.plugin.RegistrationPluginHelper; import ch.epfl.biop.atlas.mouse.allen.ccfv3.command.AllenBrainAdultMouseAtlasCCF2017Command; import ch.epfl.biop.atlas.struct.AtlasHelper; import ch.epfl.biop.atlas.struct.AtlasNode; @@ -61,7 +61,6 @@ import net.imglib2.img.display.imagej.ImageJFunctions; import net.imglib2.position.FunctionRandomAccessible; import net.imglib2.realtransform.AffineTransform3D; -import net.imglib2.realtransform.BoundingBoxEstimation; import net.imglib2.realtransform.InvertibleRealTransform; import net.imglib2.realtransform.InvertibleRealTransformSequence; import net.imglib2.realtransform.RealTransform; @@ -113,10 +112,6 @@ import java.util.concurrent.ForkJoinPool; import java.util.stream.Collectors; -import static net.imglib2.realtransform.BoundingBoxEstimation.Method.CORNERS; -import static net.imglib2.realtransform.BoundingBoxEstimation.Method.FACES; -import static net.imglib2.realtransform.BoundingBoxEstimation.Method.VOLUME; - /** * Class which contains the current registered SourceAndConverter array diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/adapter/RegistrationAdapter.java b/src/main/java/ch/epfl/biop/atlas/aligner/adapter/RegistrationAdapter.java index 550e9789..d4b7fa05 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/adapter/RegistrationAdapter.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/adapter/RegistrationAdapter.java @@ -1,7 +1,7 @@ package ch.epfl.biop.atlas.aligner.adapter; import ch.epfl.biop.atlas.aligner.MultiSlicePositioner; -import ch.epfl.biop.atlas.aligner.plugin.ExternalABBARegistrationPlugin; +import ch.epfl.biop.registration.plugin.ExternalRegistrationPlugin; import ch.epfl.biop.registration.Registration; import com.google.gson.*; import org.scijava.Context; @@ -20,10 +20,8 @@ public class RegistrationAdapter implements JsonSerializer, final Context scijavacontext; - final MultiSlicePositioner msp; - public RegistrationAdapter(Context context, MultiSlicePositioner mp) { + public RegistrationAdapter(Context context) { this.scijavacontext = context; - this.msp = mp; } @Override @@ -32,7 +30,7 @@ public Registration deserialize(JsonElement json, Type typeOfT, JsonDeserializat Registration registration; logger.debug("Fetching registration plugin "+typeOfT.getTypeName()); - if (typeOfT.getTypeName().equals(ExternalABBARegistrationPlugin.class.getName())) { + if (typeOfT.getTypeName().equals(ExternalRegistrationPlugin.class.getName())) { String registrationTypeName = json .getAsJsonObject() .get("external_type") @@ -50,7 +48,7 @@ public Registration deserialize(JsonElement json, Type typeOfT, JsonDeserializat registration.setRegistrationParameters(context.deserialize(json.getAsJsonObject().get("parameters"), Map.class)); return registration; } catch (InstantiableException e) { - msp.errlog.accept("Unrecognized registration plugin "+typeOfT.getTypeName()); + logger.error("Unrecognized registration plugin "+typeOfT.getTypeName()); e.printStackTrace(); return null; } @@ -64,7 +62,7 @@ public JsonElement serialize(Registration registration, Type typeOfSrc, JsonSeri logger.debug("With transform "+registration.getTransform()); logger.debug("And parameters "+registration.getRegistrationParameters()); if (MultiSlicePositioner.isExternalRegistrationPlugin(registration.getRegistrationTypeName())) { - obj.addProperty("type", ExternalABBARegistrationPlugin.class.getSimpleName()); + obj.addProperty("type", ExternalRegistrationPlugin.class.getSimpleName()); obj.addProperty("external_type", registration.getRegistrationTypeName()); } else { obj.addProperty("type", registration.getRegistrationTypeName()); diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesDeepSliceAbstractCommand.java b/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesDeepSliceAbstractCommand.java index d0fbbda6..5d2d588e 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesDeepSliceAbstractCommand.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesDeepSliceAbstractCommand.java @@ -8,7 +8,7 @@ import ch.epfl.biop.atlas.aligner.RegisterSliceAction; import ch.epfl.biop.atlas.aligner.SliceSources; import ch.epfl.biop.atlas.aligner.action.MarkActionSequenceBatchAction; -import ch.epfl.biop.atlas.aligner.plugin.IABBARegistrationPlugin; +import ch.epfl.biop.registration.plugin.IRegistrationPlugin; import ch.epfl.biop.java.utilities.TempDirectory; import ch.epfl.biop.quicknii.QuickNIIExporter; import ch.epfl.biop.quicknii.QuickNIISeries; @@ -392,7 +392,7 @@ protected void affineTransformInPlane(final List slices, double n //logger.debug("Slice QuickNii "+i+" correspond to initial slice "+iSliceSource); - IABBARegistrationPlugin registration = (IABBARegistrationPlugin) + IRegistrationPlugin registration = (IRegistrationPlugin) pluginService.getPlugin(AffineRegistration.class).createInstance(); registration.setScijavaContext(ctx); diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java b/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java index 1702be1c..f9bf5c47 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java @@ -62,8 +62,8 @@ import ch.epfl.biop.atlas.aligner.gui.bdv.card.NavigationPanel; import ch.epfl.biop.atlas.aligner.gui.bdv.card.SliceDefineROICommand; import ch.epfl.biop.atlas.aligner.plugin.ABBACommand; -import ch.epfl.biop.atlas.aligner.plugin.IABBARegistrationPlugin; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationPluginHelper; +import ch.epfl.biop.registration.plugin.IRegistrationPlugin; +import ch.epfl.biop.registration.plugin.RegistrationPluginHelper; import ch.epfl.biop.atlas.struct.AtlasNode; import ch.epfl.biop.bdv.gui.graphicalhandle.GraphicalHandle; import ch.epfl.biop.bdv.gui.graphicalhandle.GraphicalHandleListener; @@ -425,8 +425,8 @@ private void installBdvMenu(int hierarchyLevelsSkipped) { private void installRegistrationPluginUI(int hierarchyLevelsSkipped) { PluginService pluginService = msp.getContext().getService(PluginService.class); - pluginService.getPluginsOfType(IABBARegistrationPlugin.class).forEach(registrationPluginClass -> { - IABBARegistrationPlugin plugin = pluginService.createInstance(registrationPluginClass); + pluginService.getPluginsOfType(IRegistrationPlugin.class).forEach(registrationPluginClass -> { + IRegistrationPlugin plugin = pluginService.createInstance(registrationPluginClass); for (Class commandUI: RegistrationPluginHelper.userInterfaces(plugin)) { logger.info("Registration plugin "+commandUI.getSimpleName()+" discovered"); BdvScijavaHelper.addCommandToBdvHandleMenu(bdvh, msp.getContext(), commandUI, hierarchyLevelsSkipped,"mp", msp); diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/IABBARegistrationPlugin.java b/src/main/java/ch/epfl/biop/atlas/aligner/plugin/IABBARegistrationPlugin.java deleted file mode 100644 index 344ae1b1..00000000 --- a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/IABBARegistrationPlugin.java +++ /dev/null @@ -1,12 +0,0 @@ -package ch.epfl.biop.atlas.aligner.plugin; - -import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.MultiSlicePositioner; -import ch.epfl.biop.registration.Registration; -import org.scijava.plugin.SciJavaPlugin; - -public interface IABBARegistrationPlugin extends SciJavaPlugin, Registration[]> { - - void setSliceInfo(MultiSlicePositioner.SliceInfo sliceInfo); - -} diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/ExternalABBARegistrationPlugin.java b/src/main/java/ch/epfl/biop/registration/plugin/ExternalRegistrationPlugin.java similarity index 85% rename from src/main/java/ch/epfl/biop/atlas/aligner/plugin/ExternalABBARegistrationPlugin.java rename to src/main/java/ch/epfl/biop/registration/plugin/ExternalRegistrationPlugin.java index 95b6bc7e..66adeaf5 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/ExternalABBARegistrationPlugin.java +++ b/src/main/java/ch/epfl/biop/registration/plugin/ExternalRegistrationPlugin.java @@ -1,4 +1,4 @@ -package ch.epfl.biop.atlas.aligner.plugin; +package ch.epfl.biop.registration.plugin; import org.scijava.command.Command; /** @@ -6,7 +6,7 @@ * mostly useful in order to add a plugin from PyImageJ */ @SuppressWarnings("SameReturnValue") -public interface ExternalABBARegistrationPlugin extends IABBARegistrationPlugin { +public interface ExternalRegistrationPlugin extends IRegistrationPlugin { /** * Does the registration required an user input ? diff --git a/src/main/java/ch/epfl/biop/registration/plugin/IRegistrationPlugin.java b/src/main/java/ch/epfl/biop/registration/plugin/IRegistrationPlugin.java new file mode 100644 index 00000000..8d9115d0 --- /dev/null +++ b/src/main/java/ch/epfl/biop/registration/plugin/IRegistrationPlugin.java @@ -0,0 +1,9 @@ +package ch.epfl.biop.registration.plugin; + +import bdv.viewer.SourceAndConverter; +import ch.epfl.biop.registration.Registration; +import org.scijava.plugin.SciJavaPlugin; + +public interface IRegistrationPlugin extends SciJavaPlugin, Registration[]> { + +} diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/RegistrationPluginHelper.java b/src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java similarity index 78% rename from src/main/java/ch/epfl/biop/atlas/aligner/plugin/RegistrationPluginHelper.java rename to src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java index 4ce75b41..c2c00853 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/RegistrationPluginHelper.java +++ b/src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java @@ -1,4 +1,4 @@ -package ch.epfl.biop.atlas.aligner.plugin; +package ch.epfl.biop.registration.plugin; import ch.epfl.biop.registration.Registration; import org.scijava.Context; @@ -20,8 +20,8 @@ public static boolean isManual(Registration reg) { .getAnnotation(RegistrationTypeProperties.class); return annotation.isManual(); } else { - if (reg instanceof ExternalABBARegistrationPlugin) { - return ((ExternalABBARegistrationPlugin) reg).isManual(); + if (reg instanceof ExternalRegistrationPlugin) { + return ((ExternalRegistrationPlugin) reg).isManual(); } else { return false; // Default value if no annotation is present } @@ -38,8 +38,8 @@ public static boolean isEditable(Registration reg) { .getAnnotation(RegistrationTypeProperties.class); return annotation.isEditable(); } else { - if (reg instanceof ExternalABBARegistrationPlugin) { - return ((ExternalABBARegistrationPlugin) reg).isEditable(); + if (reg instanceof ExternalRegistrationPlugin) { + return ((ExternalRegistrationPlugin) reg).isEditable(); } else { return false; // Default value if no annotation is present } @@ -55,8 +55,8 @@ public static Class[] userInterfaces(Registration reg) { .getAnnotation(RegistrationTypeProperties.class); return annotation.userInterface(); } else { - if (reg instanceof ExternalABBARegistrationPlugin) { - return ((ExternalABBARegistrationPlugin) reg).userInterface(); + if (reg instanceof ExternalRegistrationPlugin) { + return ((ExternalRegistrationPlugin) reg).userInterface(); } else { return new Class[0]; // Default value if no annotation is present } @@ -68,16 +68,16 @@ public static Class[] userInterfaces(Registration reg) { * @param queryUIClass the ui class from which the registration is supposed to be found * @return null is nothing is found */ - public static Class registrationFromUI (Context ctx, Class queryUIClass) { + public static Class registrationFromUI (Context ctx, Class queryUIClass) { PluginService pluginService = ctx.getService(PluginService.class); // OK... intellij found this alone, let's hope it works return pluginService - .getPluginsOfType(IABBARegistrationPlugin.class) + .getPluginsOfType(IRegistrationPlugin.class) .stream().map(pluginService::createInstance) .filter(plugin -> Arrays.asList(RegistrationPluginHelper.userInterfaces(plugin)).contains(queryUIClass)) .findFirst() - .map(IABBARegistrationPlugin::getClass) + .map(IRegistrationPlugin::getClass) .orElse(null); } diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/RegistrationTypeProperties.java b/src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java similarity index 94% rename from src/main/java/ch/epfl/biop/atlas/aligner/plugin/RegistrationTypeProperties.java rename to src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java index 74304969..2a105b73 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/RegistrationTypeProperties.java +++ b/src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java @@ -1,4 +1,4 @@ -package ch.epfl.biop.atlas.aligner.plugin; +package ch.epfl.biop.registration.plugin; import org.scijava.command.Command; diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/SimpleABBARegistrationPlugin.java b/src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationPlugin.java similarity index 90% rename from src/main/java/ch/epfl/biop/atlas/aligner/plugin/SimpleABBARegistrationPlugin.java rename to src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationPlugin.java index 8e708172..666b76b0 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/SimpleABBARegistrationPlugin.java +++ b/src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationPlugin.java @@ -1,4 +1,4 @@ -package ch.epfl.biop.atlas.aligner.plugin; +package ch.epfl.biop.registration.plugin; import ij.ImagePlus; import net.imglib2.realtransform.InvertibleRealTransform; @@ -6,7 +6,7 @@ import java.util.Map; @SuppressWarnings("SameReturnValue") -public interface SimpleABBARegistrationPlugin { +public interface SimpleRegistrationPlugin { /** * @return Sampling required for the registration, in micrometer diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/SimpleRegistrationWrapper.java b/src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationWrapper.java similarity index 96% rename from src/main/java/ch/epfl/biop/atlas/aligner/plugin/SimpleRegistrationWrapper.java rename to src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationWrapper.java index 3bc019e3..f73c9e64 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/plugin/SimpleRegistrationWrapper.java +++ b/src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationWrapper.java @@ -1,8 +1,7 @@ -package ch.epfl.biop.atlas.aligner.plugin; +package ch.epfl.biop.registration.plugin; import bdv.util.BoundedRealTransform; import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.MultiSlicePositioner; import ch.epfl.biop.bdv.img.imageplus.ImagePlusHelper; import ch.epfl.biop.java.utilities.roi.types.RealPointList; import ij.ImagePlus; @@ -21,22 +20,26 @@ import sc.fiji.bdvpg.sourceandconverter.transform.SourceResampler; import sc.fiji.persist.ScijavaGsonHelper; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.Arrays; import java.util.stream.Collectors; -public class SimpleRegistrationWrapper implements ExternalABBARegistrationPlugin { +public class SimpleRegistrationWrapper implements ExternalRegistrationPlugin { public String getRegistrationTypeName() { return registrationTypeName; } - public SimpleRegistrationWrapper(String registrationTypeName, final SimpleABBARegistrationPlugin simpleRegistration) { + public SimpleRegistrationWrapper(String registrationTypeName, final SimpleRegistrationPlugin simpleRegistration) { this.registration = simpleRegistration; this.registrationTypeName = registrationTypeName; } final String registrationTypeName; - final SimpleABBARegistrationPlugin registration; + final SimpleRegistrationPlugin registration; Context context; @@ -46,11 +49,6 @@ public SimpleRegistrationWrapper(String registrationTypeName, final SimpleABBARe protected RealTransform rt; - @Override - public void setSliceInfo(MultiSlicePositioner.SliceInfo sliceInfo) { - - } - @Override public boolean isManual() { return false; @@ -204,7 +202,7 @@ public RealPointList getTransformedPtsFixedToMoving(RealPointList pts) { innerRT = ((BoundedRealTransform)rt).getTransform().copy(); } - ArrayList cvtList = new ArrayList<>(); + List cvtList = new ArrayList<>(); for (RealPoint p : pts.ptList) { RealPoint pt3d = new RealPoint(3); diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/SourceAndConverterRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/SourceAndConverterRegistration.java index d6cded50..7837fbf8 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/SourceAndConverterRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/SourceAndConverterRegistration.java @@ -1,8 +1,7 @@ package ch.epfl.biop.registration.sourceandconverter; import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.MultiSlicePositioner; -import ch.epfl.biop.atlas.aligner.plugin.IABBARegistrationPlugin; +import ch.epfl.biop.registration.plugin.IRegistrationPlugin; import org.scijava.Context; import org.scijava.plugin.Parameter; @@ -11,7 +10,7 @@ import java.util.List; import java.util.Map; -abstract public class SourceAndConverterRegistration implements IABBARegistrationPlugin { +abstract public class SourceAndConverterRegistration implements IRegistrationPlugin { protected SourceAndConverter[] fimg; @@ -89,12 +88,6 @@ public void setRegistrationParameters(Map parameters) { this.parameters = parameters; } - protected MultiSlicePositioner.SliceInfo sliceInfo; - - public void setSliceInfo(MultiSlicePositioner.SliceInfo sliceInfo){ - this.sliceInfo = sliceInfo; - } - protected static void addToFlatParameters(List flatParameters, Object... args) { flatParameters.addAll(Arrays.asList(args)); } diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java index cca0508a..9e259508 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java @@ -1,8 +1,8 @@ package ch.epfl.biop.registration.sourceandconverter.affine; import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.plugin.IABBARegistrationPlugin; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationTypeProperties; +import ch.epfl.biop.registration.plugin.IRegistrationPlugin; +import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; import com.google.gson.Gson; import net.imglib2.realtransform.AffineTransform3D; import org.scijava.plugin.Plugin; @@ -13,7 +13,7 @@ * To make an affine transform programmatically conveniently * */ -@Plugin(type = IABBARegistrationPlugin.class) +@Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isManual = false, isEditable = false, diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformedSourceWrapperRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformedSourceWrapperRegistration.java index a96d64ac..b723fbaf 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformedSourceWrapperRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformedSourceWrapperRegistration.java @@ -5,7 +5,6 @@ import sc.fiji.bdvpg.sourceandconverter.SourceAndConverterAndTimeRange; import sc.fiji.bdvpg.sourceandconverter.transform.SourceTransformHelper; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java index 4090d734..79af24ce 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java @@ -2,8 +2,8 @@ import bdv.viewer.SourceAndConverter; import ch.epfl.biop.atlas.aligner.command.RegisterSlicesElastixAffineCommand; -import ch.epfl.biop.atlas.aligner.plugin.IABBARegistrationPlugin; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationTypeProperties; +import ch.epfl.biop.registration.plugin.IRegistrationPlugin; +import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; import ch.epfl.biop.scijava.command.source.register.Elastix2DAffineRegisterCommand; import net.imglib2.realtransform.AffineTransform3D; import org.scijava.command.Command; @@ -22,13 +22,12 @@ * Uses Elastix backend to perform an affine transform registration * */ -@Plugin(type = IABBARegistrationPlugin.class) +@Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isManual = false, isEditable = false, userInterface = { RegisterSlicesElastixAffineCommand.class - //RegistrationElastixAffineRemoteCommand.class }) public class Elastix2DAffineRegistration extends AffineTransformSourceAndConverterRegistration{ diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java index 7eb5e7b3..5289bd72 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java @@ -6,8 +6,8 @@ import bdv.viewer.DisplayMode; import bdv.viewer.SourceAndConverter; import ch.epfl.biop.atlas.aligner.command.RegisterSlicesBigWarpCommand; -import ch.epfl.biop.atlas.aligner.plugin.IABBARegistrationPlugin; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationTypeProperties; +import ch.epfl.biop.registration.plugin.IRegistrationPlugin; +import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; import ch.epfl.biop.registration.sourceandconverter.spline.RealTransformSourceAndConverterRegistration; import ij.gui.WaitForUserDialog; import org.scijava.plugin.Plugin; @@ -21,7 +21,7 @@ import static bdv.util.RealTransformHelper.BigWarpFileFromRealTransform; -@Plugin(type = IABBARegistrationPlugin.class) +@Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isManual = true, isEditable = true, diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java index 71c31fe3..9b600257 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java @@ -1,14 +1,14 @@ package ch.epfl.biop.registration.sourceandconverter.mirror; import ch.epfl.biop.atlas.aligner.command.MirrorDoCommand; -import ch.epfl.biop.atlas.aligner.plugin.IABBARegistrationPlugin; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationTypeProperties; +import ch.epfl.biop.registration.plugin.IRegistrationPlugin; +import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; import ch.epfl.biop.registration.sourceandconverter.spline.RealTransformSourceAndConverterRegistration; import org.scijava.plugin.Plugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@Plugin(type = IABBARegistrationPlugin.class) +@Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isManual = false, isEditable = true, diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java index adca3631..0c31f55b 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java @@ -6,8 +6,8 @@ import bdv.viewer.Interpolation; import bdv.viewer.SourceAndConverter; import ch.epfl.biop.atlas.aligner.command.RegisterSlicesElastixSplineCommand; -import ch.epfl.biop.atlas.aligner.plugin.IABBARegistrationPlugin; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationTypeProperties; +import ch.epfl.biop.registration.plugin.IRegistrationPlugin; +import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; import ch.epfl.biop.scijava.command.source.register.Elastix2DSplineRegisterCommand; import ij.gui.WaitForUserDialog; import jitk.spline.ThinPlateR2LogRSplineKernelTransform; @@ -33,13 +33,12 @@ import static bdv.util.RealTransformHelper.BigWarpFileFromRealTransform; -@Plugin(type = IABBARegistrationPlugin.class) +@Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isManual = false, isEditable = true, userInterface = { RegisterSlicesElastixSplineCommand.class - //RegistrationElastixSplineRemoteCommand.class } ) diff --git a/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationPluginExample.java b/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationPluginExample.java index 29abd2e7..715be6f5 100644 --- a/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationPluginExample.java +++ b/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationPluginExample.java @@ -1,9 +1,8 @@ package ch.epfl.biop.abba.pluginexample; import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.MultiSlicePositioner; -import ch.epfl.biop.atlas.aligner.plugin.IABBARegistrationPlugin; -import ch.epfl.biop.atlas.aligner.plugin.RegistrationTypeProperties; +import ch.epfl.biop.registration.plugin.IRegistrationPlugin; +import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; import ch.epfl.biop.java.utilities.roi.types.RealPointList; import net.imglib2.realtransform.RealTransform; import org.scijava.Context; @@ -21,13 +20,13 @@ * is an array of SourceAndConverter, each element of the array being a single channel. * */ -@Plugin(type = IABBARegistrationPlugin.class) +@Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isEditable = false, isManual = false, userInterface = {IdentityRegistrationCommand.class} ) -public class IdentityRegistrationPluginExample implements IABBARegistrationPlugin{ +public class IdentityRegistrationPluginExample implements IRegistrationPlugin { public static final Consumer defaultLog = (string) -> System.out.println(IdentityRegistrationPluginExample.class.getSimpleName()+":"+string); @@ -59,7 +58,7 @@ public void setScijavaContext(Context context) { /** * Any parameter of a registration method has to be set as a String to String dictionnary - * this same dictionnary needs to be returned in {@link IABBARegistrationPlugin#getRegistrationParameters()} + * this same dictionnary needs to be returned in {@link IRegistrationPlugin#getRegistrationParameters()} * for a correct serialization * @param parameters dictionary of parameters */ @@ -69,7 +68,7 @@ public void setRegistrationParameters(Map parameters) { } /** - * see {@link IABBARegistrationPlugin#setRegistrationParameters(Map)} + * see {@link IRegistrationPlugin#setRegistrationParameters(Map)} * @return the dictionnary containing the parameters for this registration */ @Override @@ -198,11 +197,6 @@ public RealTransform getTransformAsRealTransform() { return null; // unsupported, but in fact in this case } - @Override - public void setSliceInfo(MultiSlicePositioner.SliceInfo sliceInfo) { - // Can be used to retrieve some info about the slice being registered - } - String errorMessage = "No error"; @Override diff --git a/src/test/java/ch/epfl/biop/abba/pluginexample/py/ExternalIdentityRegistrationPlugin.java b/src/test/java/ch/epfl/biop/abba/pluginexample/py/ExternalIdentityRegistrationPlugin.java index 5b0319f3..ee738ced 100644 --- a/src/test/java/ch/epfl/biop/abba/pluginexample/py/ExternalIdentityRegistrationPlugin.java +++ b/src/test/java/ch/epfl/biop/abba/pluginexample/py/ExternalIdentityRegistrationPlugin.java @@ -1,8 +1,7 @@ package ch.epfl.biop.abba.pluginexample.py; import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.MultiSlicePositioner; -import ch.epfl.biop.atlas.aligner.plugin.ExternalABBARegistrationPlugin; +import ch.epfl.biop.registration.plugin.ExternalRegistrationPlugin; import ch.epfl.biop.java.utilities.roi.types.RealPointList; import net.imglib2.realtransform.AffineTransform3D; import net.imglib2.realtransform.RealTransform; @@ -12,7 +11,7 @@ import java.util.HashMap; import java.util.Map; -public class ExternalIdentityRegistrationPlugin implements ExternalABBARegistrationPlugin { +public class ExternalIdentityRegistrationPlugin implements ExternalRegistrationPlugin { Map params = new HashMap<>(); @@ -20,11 +19,6 @@ public String getRegistrationTypeName() { return "PyIdentity"; } - @Override - public void setSliceInfo(MultiSlicePositioner.SliceInfo sliceInfo) { - // Do nothing - } - @Override public boolean isManual() { return false; diff --git a/src/test/java/ch/epfl/biop/abba/pluginexample/py/ExternalSimpleRotationRegistrationPlugin.java b/src/test/java/ch/epfl/biop/abba/pluginexample/py/ExternalSimpleRotationRegistrationPlugin.java index cc2417bd..4eee8114 100644 --- a/src/test/java/ch/epfl/biop/abba/pluginexample/py/ExternalSimpleRotationRegistrationPlugin.java +++ b/src/test/java/ch/epfl/biop/abba/pluginexample/py/ExternalSimpleRotationRegistrationPlugin.java @@ -1,13 +1,13 @@ package ch.epfl.biop.abba.pluginexample.py; -import ch.epfl.biop.atlas.aligner.plugin.SimpleABBARegistrationPlugin; +import ch.epfl.biop.registration.plugin.SimpleRegistrationPlugin; import ij.ImagePlus; import net.imglib2.realtransform.AffineTransform3D; import net.imglib2.realtransform.InvertibleRealTransform; import java.util.Map; -public class ExternalSimpleRotationRegistrationPlugin implements SimpleABBARegistrationPlugin { +public class ExternalSimpleRotationRegistrationPlugin implements SimpleRegistrationPlugin { @Override public double getVoxelSizeInMicron() { diff --git a/src/test/java/ch/epfl/biop/abba/pluginexample/py/TestExternalRegistrationPlugin.java b/src/test/java/ch/epfl/biop/abba/pluginexample/py/TestExternalRegistrationPlugin.java index ec32a2f8..863829d1 100644 --- a/src/test/java/ch/epfl/biop/abba/pluginexample/py/TestExternalRegistrationPlugin.java +++ b/src/test/java/ch/epfl/biop/abba/pluginexample/py/TestExternalRegistrationPlugin.java @@ -6,7 +6,7 @@ import ch.epfl.biop.atlas.aligner.SliceSources; import ch.epfl.biop.atlas.aligner.command.ABBAStartCommand; import ch.epfl.biop.atlas.aligner.gui.bdv.BdvMultislicePositionerView; -import ch.epfl.biop.atlas.aligner.plugin.SimpleRegistrationWrapper; +import ch.epfl.biop.registration.plugin.SimpleRegistrationWrapper; import ch.epfl.biop.atlas.mouse.allen.ccfv3p1.command.AllenBrainAdultMouseAtlasCCF2017v3p1Command; import ch.epfl.biop.atlas.struct.Atlas; import ch.epfl.biop.scijava.command.spimdata.SourceFromImagePlusCommand; From 6eccb599aa43b24ffd794aeaabbda92a743a2a32 Mon Sep 17 00:00:00 2001 From: Nicolas Chiaruttini Date: Thu, 13 Jun 2024 00:05:52 +0200 Subject: [PATCH 2/6] Fix remaining sliceinfo reference --- .../aligner/command/RegisterSlicesDeepSliceAbstractCommand.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesDeepSliceAbstractCommand.java b/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesDeepSliceAbstractCommand.java index 5d2d588e..4d0c09fd 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesDeepSliceAbstractCommand.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesDeepSliceAbstractCommand.java @@ -395,8 +395,6 @@ protected void affineTransformInPlane(final List slices, double n IRegistrationPlugin registration = (IRegistrationPlugin) pluginService.getPlugin(AffineRegistration.class).createInstance(); registration.setScijavaContext(ctx); - - registration.setSliceInfo(new MultiSlicePositioner.SliceInfo(mp, slices.get(iSliceSource))); Map parameters = new HashMap<>(); AffineTransform3D inPlaneTransform = new AffineTransform3D(); From f89d66e0562cda7fa82fccebd3d4b6625d920fa3 Mon Sep 17 00:00:00 2001 From: Nicolas Chiaruttini Date: Thu, 13 Jun 2024 09:39:38 +0200 Subject: [PATCH 3/6] Continue splitting registration ui from registration action. Registration package should be ready to move to upstream repo --- .../atlas/aligner/MultiSlicePositioner.java | 30 ------------- .../aligner/command/MirrorDoCommand.java | 3 +- .../command/RegisterSlicesBigWarpCommand.java | 5 ++- .../RegisterSlicesElastixAffineCommand.java | 3 +- .../RegisterSlicesElastixSplineCommand.java | 3 +- .../gui/bdv/BdvMultislicePositionerView.java | 15 ++----- .../plugin/RegistrationPluginHelper.java | 42 ------------------- .../plugin/RegistrationTypeProperties.java | 4 -- .../affine/AffineRegistration.java | 4 +- .../affine/Elastix2DAffineRegistration.java | 5 +-- .../bigwarp/SacBigWarp2DRegistration.java | 6 +-- .../mirror/MirrorXRegistration.java | 5 +-- .../spline/Elastix2DSplineRegistration.java | 5 +-- .../IdentityRegistrationCommand.java | 6 ++- .../IdentityRegistrationPluginExample.java | 3 +- 15 files changed, 24 insertions(+), 115 deletions(-) diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/MultiSlicePositioner.java b/src/main/java/ch/epfl/biop/atlas/aligner/MultiSlicePositioner.java index 4d181e0d..6331ace2 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/MultiSlicePositioner.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/MultiSlicePositioner.java @@ -690,36 +690,6 @@ public static Map convertToString(Context ctx, Map() - ); - } - - /** - * Main function which triggers registration of the selected slices - * @param command the ui command - * @param preprocessFixed how fixed sources need to be preprocessed before being registered - * @param preprocessMoving how moving sources need to be preprocessed before being registered - * @param parameters parameters used for the registration - all objects will be converted - * to String using the scijava {@link ConvertService}. They need to be strings - * to be serialized - */ - public void registerSelectedSlices(Command command, - SourcesProcessor preprocessFixed, - SourcesProcessor preprocessMoving, - Map parameters) { - registerSelectedSlices(RegistrationPluginHelper.registrationFromUI(scijavaCtx,command.getClass()), - preprocessFixed, - preprocessMoving, - parameters - ); - } - /** * Main function which triggers registration of the selected slices * @param registrationClass the kind of registration which should be started diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/command/MirrorDoCommand.java b/src/main/java/ch/epfl/biop/atlas/aligner/command/MirrorDoCommand.java index b7d5be70..0ff46529 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/command/MirrorDoCommand.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/command/MirrorDoCommand.java @@ -3,6 +3,7 @@ import ch.epfl.biop.atlas.aligner.MultiSlicePositioner; import ch.epfl.biop.atlas.aligner.SliceSources; import ch.epfl.biop.atlas.aligner.action.MarkActionSequenceBatchAction; +import ch.epfl.biop.registration.sourceandconverter.mirror.MirrorXRegistration; import ch.epfl.biop.sourceandconverter.processor.SourcesIdentity; import org.scijava.command.Command; import org.scijava.plugin.Parameter; @@ -38,7 +39,7 @@ public void run() { parameters.put("mirror_side", mirror_side); new MarkActionSequenceBatchAction(mp).runRequest(); - mp.registerSelectedSlices(this, + mp.registerSelectedSlices(MirrorXRegistration.class, new SourcesIdentity(), new SourcesIdentity(), parameters); diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesBigWarpCommand.java b/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesBigWarpCommand.java index f82f2d87..44c29652 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesBigWarpCommand.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesBigWarpCommand.java @@ -1,15 +1,18 @@ package ch.epfl.biop.atlas.aligner.command; +import ch.epfl.biop.registration.sourceandconverter.bigwarp.SacBigWarp2DRegistration; import org.scijava.command.Command; import org.scijava.plugin.Plugin; +import java.util.HashMap; + @Plugin(type = Command.class, menuPath = "Plugins>BIOP>Atlas>Multi Image To Atlas>Align>ABBA - BigWarp Registration", description = "Uses BigWarp for in plane registration of selected slices") public class RegisterSlicesBigWarpCommand extends RegistrationMultiChannelCommand { public void runValidated() { - mp.registerSelectedSlices(this, getFixedFilter(), getMovingFilter()); + mp.registerSelectedSlices(SacBigWarp2DRegistration.class, getFixedFilter(), getMovingFilter(), new HashMap<>()); } } diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesElastixAffineCommand.java b/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesElastixAffineCommand.java index 9f1c5e3f..7d53c4ee 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesElastixAffineCommand.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesElastixAffineCommand.java @@ -1,5 +1,6 @@ package ch.epfl.biop.atlas.aligner.command; +import ch.epfl.biop.registration.sourceandconverter.affine.Elastix2DAffineRegistration; import ch.epfl.biop.scijava.command.source.register.ElastixHelper; import org.scijava.command.Command; import org.scijava.plugin.Parameter; @@ -40,7 +41,7 @@ public void runValidated() { parameters.put("background_offset_value_fixed", background_offset_value_fixed); parameters.put("pxSizeInCurrentUnit", pixel_size_micrometer/1000.0); - mp.registerSelectedSlices(this, + mp.registerSelectedSlices(Elastix2DAffineRegistration.class, getFixedFilter(), getMovingFilter(), parameters); diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesElastixSplineCommand.java b/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesElastixSplineCommand.java index 9d1b026c..f5d4fe28 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesElastixSplineCommand.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/command/RegisterSlicesElastixSplineCommand.java @@ -1,5 +1,6 @@ package ch.epfl.biop.atlas.aligner.command; +import ch.epfl.biop.registration.sourceandconverter.spline.Elastix2DSplineRegistration; import ch.epfl.biop.scijava.command.source.register.ElastixHelper; import org.scijava.command.Command; import org.scijava.plugin.Parameter; @@ -51,7 +52,7 @@ public void runValidated() { parameters.put("background_offset_value_fixed", background_offset_value_fixed); parameters.put("pxSizeInCurrentUnit", pixel_size_micrometer/1000.0); - mp.registerSelectedSlices(this, + mp.registerSelectedSlices(Elastix2DSplineRegistration.class, getFixedFilter(), getMovingFilter(), parameters); diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java b/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java index f9bf5c47..32d54de1 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java @@ -62,8 +62,6 @@ import ch.epfl.biop.atlas.aligner.gui.bdv.card.NavigationPanel; import ch.epfl.biop.atlas.aligner.gui.bdv.card.SliceDefineROICommand; import ch.epfl.biop.atlas.aligner.plugin.ABBACommand; -import ch.epfl.biop.registration.plugin.IRegistrationPlugin; -import ch.epfl.biop.registration.plugin.RegistrationPluginHelper; import ch.epfl.biop.atlas.struct.AtlasNode; import ch.epfl.biop.bdv.gui.graphicalhandle.GraphicalHandle; import ch.epfl.biop.bdv.gui.graphicalhandle.GraphicalHandleListener; @@ -83,7 +81,6 @@ import org.scijava.Context; import org.scijava.MenuPath; import org.scijava.cache.CacheService; -import org.scijava.command.Command; import org.scijava.command.CommandModule; import org.scijava.command.CommandService; import org.scijava.module.Module; @@ -423,15 +420,11 @@ private void installBdvMenu(int hierarchyLevelsSkipped) { } private void installRegistrationPluginUI(int hierarchyLevelsSkipped) { - PluginService pluginService = msp.getContext().getService(PluginService.class); - pluginService.getPluginsOfType(IRegistrationPlugin.class).forEach(registrationPluginClass -> { - IRegistrationPlugin plugin = pluginService.createInstance(registrationPluginClass); - for (Class commandUI: RegistrationPluginHelper.userInterfaces(plugin)) { - logger.info("Registration plugin "+commandUI.getSimpleName()+" discovered"); - BdvScijavaHelper.addCommandToBdvHandleMenu(bdvh, msp.getContext(), commandUI, hierarchyLevelsSkipped,"mp", msp); - } - }); + BdvScijavaHelper.addCommandToBdvHandleMenu(bdvh, msp.getContext(), RegisterSlicesElastixAffineCommand.class, hierarchyLevelsSkipped,"mp", msp); + BdvScijavaHelper.addCommandToBdvHandleMenu(bdvh, msp.getContext(), RegisterSlicesBigWarpCommand.class, hierarchyLevelsSkipped,"mp", msp); + BdvScijavaHelper.addCommandToBdvHandleMenu(bdvh, msp.getContext(), RegisterSlicesElastixSplineCommand.class, hierarchyLevelsSkipped,"mp", msp); + BdvScijavaHelper.addCommandToBdvHandleMenu(bdvh, msp.getContext(), MirrorDoCommand.class, hierarchyLevelsSkipped,"mp", msp); BdvScijavaHelper.addCommandToBdvHandleMenu(bdvh, msp.getContext(), MirrorUndoCommand.class, hierarchyLevelsSkipped,"mp", msp); logger.debug("Installing external registration plugins ui"); diff --git a/src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java b/src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java index c2c00853..7a05a6e7 100644 --- a/src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java +++ b/src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java @@ -1,11 +1,6 @@ package ch.epfl.biop.registration.plugin; import ch.epfl.biop.registration.Registration; -import org.scijava.Context; -import org.scijava.command.Command; -import org.scijava.plugin.PluginService; - -import java.util.Arrays; // Facilitates accessing annotation values public class RegistrationPluginHelper { @@ -45,41 +40,4 @@ public static boolean isEditable(Registration reg) { } } } - - /** - * @return the command class the user has to call in order to start a registration - */ - public static Class[] userInterfaces(Registration reg) { - if (reg.getClass().isAnnotationPresent(RegistrationTypeProperties.class)) { - final RegistrationTypeProperties annotation = reg.getClass() - .getAnnotation(RegistrationTypeProperties.class); - return annotation.userInterface(); - } else { - if (reg instanceof ExternalRegistrationPlugin) { - return ((ExternalRegistrationPlugin) reg).userInterface(); - } else { - return new Class[0]; // Default value if no annotation is present - } - } - } - - /** - * Assumes unicity! Find the registration class from a UI class - * @param queryUIClass the ui class from which the registration is supposed to be found - * @return null is nothing is found - */ - public static Class registrationFromUI (Context ctx, Class queryUIClass) { - PluginService pluginService = ctx.getService(PluginService.class); - - // OK... intellij found this alone, let's hope it works - return pluginService - .getPluginsOfType(IRegistrationPlugin.class) - .stream().map(pluginService::createInstance) - .filter(plugin -> Arrays.asList(RegistrationPluginHelper.userInterfaces(plugin)).contains(queryUIClass)) - .findFirst() - .map(IRegistrationPlugin::getClass) - .orElse(null); - - } - } diff --git a/src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java b/src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java index 2a105b73..2e7c2922 100644 --- a/src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java +++ b/src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java @@ -21,9 +21,5 @@ */ boolean isEditable(); - /** - * @return the command class the user has to call in order to start a registration - */ - Class[] userInterface(); } diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java index 9e259508..f7cae925 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java @@ -16,9 +16,7 @@ @Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isManual = false, - isEditable = false, - userInterface = { - }) + isEditable = false) public class AffineRegistration extends AffineTransformSourceAndConverterRegistration{ diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java index 79af24ce..82fb2240 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java @@ -25,10 +25,7 @@ @Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isManual = false, - isEditable = false, - userInterface = { - RegisterSlicesElastixAffineCommand.class - }) + isEditable = false) public class Elastix2DAffineRegistration extends AffineTransformSourceAndConverterRegistration{ diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java index 5289bd72..ea51bdca 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java @@ -24,12 +24,8 @@ @Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isManual = true, - isEditable = true, - userInterface = { - RegisterSlicesBigWarpCommand.class - } + isEditable = true ) - public class SacBigWarp2DRegistration extends RealTransformSourceAndConverterRegistration { BigWarpLauncher bwl; diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java index 9b600257..46991a00 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java @@ -11,10 +11,7 @@ @Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isManual = false, - isEditable = true, - userInterface = { - MirrorDoCommand.class - } + isEditable = true ) public class MirrorXRegistration extends RealTransformSourceAndConverterRegistration { diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java index 0c31f55b..6acb9855 100644 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java +++ b/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java @@ -36,10 +36,7 @@ @Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isManual = false, - isEditable = true, - userInterface = { - RegisterSlicesElastixSplineCommand.class - } + isEditable = true ) public class Elastix2DSplineRegistration extends RealTransformSourceAndConverterRegistration { diff --git a/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationCommand.java b/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationCommand.java index ee64da1d..74d847b1 100644 --- a/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationCommand.java +++ b/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationCommand.java @@ -6,6 +6,8 @@ import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; +import java.util.HashMap; + @Plugin(type = Command.class, menuPath = "Plugins>BIOP>Atlas>Multi Image To Atlas>Align>[ABBA Dev] - Your Registration Here!") public class IdentityRegistrationCommand implements Command { @@ -14,7 +16,7 @@ public class IdentityRegistrationCommand implements Command { @Override public void run() { - mp.registerSelectedSlices(this, SourcesProcessorHelper.Identity(), - SourcesProcessorHelper.Identity()); + mp.registerSelectedSlices(IdentityRegistrationPluginExample.class, SourcesProcessorHelper.Identity(), + SourcesProcessorHelper.Identity(), new HashMap<>()); } } diff --git a/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationPluginExample.java b/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationPluginExample.java index 715be6f5..0903ebef 100644 --- a/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationPluginExample.java +++ b/src/test/java/ch/epfl/biop/abba/pluginexample/IdentityRegistrationPluginExample.java @@ -23,8 +23,7 @@ @Plugin(type = IRegistrationPlugin.class) @RegistrationTypeProperties( isEditable = false, - isManual = false, - userInterface = {IdentityRegistrationCommand.class} + isManual = false ) public class IdentityRegistrationPluginExample implements IRegistrationPlugin { From c59f5fd7935f02c3e9ec5004f2aa452fa26ca453 Mon Sep 17 00:00:00 2001 From: Nicolas Chiaruttini Date: Thu, 13 Jun 2024 09:48:19 +0200 Subject: [PATCH 4/6] Fix import issue --- .../atlas/aligner/gui/bdv/BdvMultislicePositionerView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java b/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java index 32d54de1..8747fab8 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/gui/bdv/BdvMultislicePositionerView.java @@ -42,13 +42,17 @@ import ch.epfl.biop.atlas.aligner.command.ImportSliceFromSourcesCommand; import ch.epfl.biop.atlas.aligner.command.ImportSlicesFromFilesCommand; import ch.epfl.biop.atlas.aligner.command.ImportSlicesFromQuPathCommand; +import ch.epfl.biop.atlas.aligner.command.MirrorDoCommand; import ch.epfl.biop.atlas.aligner.command.MirrorUndoCommand; import ch.epfl.biop.atlas.aligner.command.RasterSlicesCommand; import ch.epfl.biop.atlas.aligner.command.RasterSlicesDeformationCommand; +import ch.epfl.biop.atlas.aligner.command.RegisterSlicesBigWarpCommand; import ch.epfl.biop.atlas.aligner.command.RegisterSlicesCopyAndApplyCommand; import ch.epfl.biop.atlas.aligner.command.RegisterSlicesDeepSliceWebCommand; import ch.epfl.biop.atlas.aligner.command.RegisterSlicesDeepSliceLocalCommand; import ch.epfl.biop.atlas.aligner.command.RegisterSlicesEditLastCommand; +import ch.epfl.biop.atlas.aligner.command.RegisterSlicesElastixAffineCommand; +import ch.epfl.biop.atlas.aligner.command.RegisterSlicesElastixSplineCommand; import ch.epfl.biop.atlas.aligner.command.RegisterSlicesRemoveLastCommand; import ch.epfl.biop.atlas.aligner.command.RotateSlicesCommand; import ch.epfl.biop.atlas.aligner.command.SetSlicesDisplayRangeCommand; From 66dad82cb33f92d8a5a4cfcfbad719ddaeaa9a6e Mon Sep 17 00:00:00 2001 From: Nicolas Chiaruttini Date: Thu, 13 Jun 2024 16:26:43 +0200 Subject: [PATCH 5/6] Moves registration module to upstream repo bigdataviewer-biop-tools --- pom.xml | 2 +- .../epfl/biop/registration/Registration.java | 171 --------- .../plugin/ExternalRegistrationPlugin.java | 29 -- .../plugin/IRegistrationPlugin.java | 9 - .../plugin/RegistrationPluginHelper.java | 43 --- .../plugin/RegistrationTypeProperties.java | 25 -- .../plugin/SimpleRegistrationPlugin.java | 32 -- .../plugin/SimpleRegistrationWrapper.java | 337 ------------------ .../SourceAndConverterRegistration.java | 95 ----- .../affine/AffineRegistration.java | 62 ---- ...ansformSourceAndConverterRegistration.java | 64 ---- ...eTransformedSourceWrapperRegistration.java | 70 ---- .../affine/CenterZeroRegistration.java | 54 --- .../affine/Elastix2DAffineRegistration.java | 146 -------- .../bigwarp/SacBigWarp2DRegistration.java | 124 ------- .../mirror/MirrorXRegistration.java | 48 --- .../mirror/MirrorXTransform.java | 64 ---- .../mirror/MirrorXTransformAdapter.java | 44 --- .../spline/Elastix2DSplineRegistration.java | 318 ----------------- ...ansformSourceAndConverterRegistration.java | 79 ---- 20 files changed, 1 insertion(+), 1815 deletions(-) delete mode 100644 src/main/java/ch/epfl/biop/registration/Registration.java delete mode 100644 src/main/java/ch/epfl/biop/registration/plugin/ExternalRegistrationPlugin.java delete mode 100644 src/main/java/ch/epfl/biop/registration/plugin/IRegistrationPlugin.java delete mode 100644 src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java delete mode 100644 src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java delete mode 100644 src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationPlugin.java delete mode 100644 src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationWrapper.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/SourceAndConverterRegistration.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformSourceAndConverterRegistration.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformedSourceWrapperRegistration.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/CenterZeroRegistration.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXTransform.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXTransformAdapter.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java delete mode 100644 src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/RealTransformSourceAndConverterRegistration.java diff --git a/pom.xml b/pom.xml index c57caac5..e3b92534 100644 --- a/pom.xml +++ b/pom.xml @@ -109,7 +109,7 @@ 0.10.1 0.7.1 - 0.9.4 + 0.9.5-SNAPSHOT 0.2.6 diff --git a/src/main/java/ch/epfl/biop/registration/Registration.java b/src/main/java/ch/epfl/biop/registration/Registration.java deleted file mode 100644 index adfad215..00000000 --- a/src/main/java/ch/epfl/biop/registration/Registration.java +++ /dev/null @@ -1,171 +0,0 @@ -package ch.epfl.biop.registration; -import ch.epfl.biop.java.utilities.roi.types.RealPointList; -import net.imglib2.realtransform.RealTransform; -import org.scijava.Context; - -import java.util.Map; - -/** - * Most upstream - * @param Type of the image to register ( ImagePlus / SourceAndConverter, what else ? ) - */ - -public interface Registration { - - /** - * Is called just after the Registration object creation to pass - * the current scijava context - * is adopted by all registrations - * @param context - */ - void setScijavaContext(Context context); - - /** - * Is called before registration to pass any extra registration parameter - * argument. Passed as a dictionary of String to preserve serialization - * capability. - * @param parameters dictionary of parameters - */ - void setRegistrationParameters(Map parameters); - - /** - * For serialization and reproducibility - * @return parameters that were used for the registration - */ - Map getRegistrationParameters(); - - /** - * Sets the fixed image - * @param fimg fixed image - */ - void setFixedImage(T fimg); - - /** - * Set the moving image - * @param mimg moving image - */ - void setMovingImage(T mimg); - - /** - * Optional - sets the fixed image mask - * @param fimg_mask fixed image - */ - void setFixedMask(T fimg_mask); - - /** - * Optional - set the moving image mask - * @param mimg_mask moving image - */ - void setMovingMask(T mimg_mask); - - /** - * Sets the state of the registration to not done - * Called when the registration needs to be rerun for real - * instead of just restored - * - */ - void resetRegistration(); - - /** - * Sets the timepoint of the source that should be used for the - * registration. 0 in most cases - * @param timePoint - */ - void setTimePoint(int timePoint); - - /** - * Blocking function which performs the registration - * @return true if the registration was run succesfully - */ - boolean register(); - - /** - * Can be called after register() return false in order to get - * a more meaningful explanation - * @return an error message for a failed registration - */ - default String getExceptionMessage() { - return "Unspecified error"; - } - - /** - * Blocking function which is called when the user wants - * to manually edit the result of the registration - * @return true is the transform is been edited successfully. If not, - * the previous state of the registration is restored thanks to the serialization - * of the transform. An edition cannot occur if the transform has not been set - * before (either via the run method, or via setting the transform via the - * {@link Registration#setTransform(String)} method - */ - boolean edit(); - - /** - * Flag functions which serves to know whether the result of the - * registration is available. Should not be blocking. - * - * @return true if the transform is available - */ - boolean isRegistrationDone(); - - /** - * Function which takes an input moving image, transform it - * according to the result of the registration (transformation), - * and returns it - * @param img should not be modified - * @return the transformed image - */ - T getTransformedImageMovingToFixed(final T img); - - /** - * Reverse transforms a list of points. This function takes a list - * of points given in the fixed coordinates system, inverse transform - * their coordinates according to the result of the registration. - * The points can be mutated - * @param pts points to transform from fixed to moving system coordinates - * @return the transformed points - */ - RealPointList getTransformedPtsFixedToMoving(RealPointList pts); - - /** - * Function called when a registration is cancelled while being processed - */ - void abort(); - - /** - * This function is used to: - * - save the registration into a json file - * - store transiently the state of a registration to cancel the edition of a transform, if needed - * @return a serialized representation of the transform as a String - */ - String getTransform(); - - /** - * Function used to bypass the real registration process (run) - * in order to set directly the result of the registration. - * This is used when: - * - loading a registration from a state file - * - restore if needed a previous transformed state after an edition - * a serialized representation of the transform is sent, leading - * to an immediate registration being done - * isDone should return true after this function is being called - * @param serialized_transform - */ - void setTransform(String serialized_transform); - - /** - * If the transform can be returned as a serializable RealTransform object, - * this can be used to serialize the successive registrations as a - * {@link net.imglib2.realtransform.RealTransformSequence} object, or even, - * if all transformations are invertible, as a {@link net.imglib2.realtransform.InvertibleRealTransformSequence} object - * @return - */ - RealTransform getTransformAsRealTransform(); - - /** - * Used for serialisation - * @return - */ - default String getRegistrationTypeName() { - return this.getClass().getSimpleName(); - } -} diff --git a/src/main/java/ch/epfl/biop/registration/plugin/ExternalRegistrationPlugin.java b/src/main/java/ch/epfl/biop/registration/plugin/ExternalRegistrationPlugin.java deleted file mode 100644 index 66adeaf5..00000000 --- a/src/main/java/ch/epfl/biop/registration/plugin/ExternalRegistrationPlugin.java +++ /dev/null @@ -1,29 +0,0 @@ -package ch.epfl.biop.registration.plugin; -import org.scijava.command.Command; - -/** - * An registration plugin interface without any annotation - useful - * mostly useful in order to add a plugin from PyImageJ - */ -@SuppressWarnings("SameReturnValue") -public interface ExternalRegistrationPlugin extends IRegistrationPlugin { - - /** - * Does the registration required an user input ? - * @return true if some user action is required - */ - boolean isManual(); - - /** - * Can the registration be edited after it has run ? - * Considered a manual task by default - * @return true if the registration can be edited a posteriori - */ - boolean isEditable(); - - /** - * @return the command class the user has to call in order to start a registration - */ - Class[] userInterface(); - -} diff --git a/src/main/java/ch/epfl/biop/registration/plugin/IRegistrationPlugin.java b/src/main/java/ch/epfl/biop/registration/plugin/IRegistrationPlugin.java deleted file mode 100644 index 8d9115d0..00000000 --- a/src/main/java/ch/epfl/biop/registration/plugin/IRegistrationPlugin.java +++ /dev/null @@ -1,9 +0,0 @@ -package ch.epfl.biop.registration.plugin; - -import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.registration.Registration; -import org.scijava.plugin.SciJavaPlugin; - -public interface IRegistrationPlugin extends SciJavaPlugin, Registration[]> { - -} diff --git a/src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java b/src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java deleted file mode 100644 index 7a05a6e7..00000000 --- a/src/main/java/ch/epfl/biop/registration/plugin/RegistrationPluginHelper.java +++ /dev/null @@ -1,43 +0,0 @@ -package ch.epfl.biop.registration.plugin; - -import ch.epfl.biop.registration.Registration; - -// Facilitates accessing annotation values -public class RegistrationPluginHelper { - - /** - * Does the registration required an user input ? - * @return true if user input is required - */ - public static boolean isManual(Registration reg) { - if (reg.getClass().isAnnotationPresent(RegistrationTypeProperties.class)) { - final RegistrationTypeProperties annotation = reg.getClass() - .getAnnotation(RegistrationTypeProperties.class); - return annotation.isManual(); - } else { - if (reg instanceof ExternalRegistrationPlugin) { - return ((ExternalRegistrationPlugin) reg).isManual(); - } else { - return false; // Default value if no annotation is present - } - } - } - - /** - * Can the registration be edited after it has run ? - * Considered a manual task by default - */ - public static boolean isEditable(Registration reg) { - if (reg.getClass().isAnnotationPresent(RegistrationTypeProperties.class)) { - final RegistrationTypeProperties annotation = reg.getClass() - .getAnnotation(RegistrationTypeProperties.class); - return annotation.isEditable(); - } else { - if (reg instanceof ExternalRegistrationPlugin) { - return ((ExternalRegistrationPlugin) reg).isEditable(); - } else { - return false; // Default value if no annotation is present - } - } - } -} diff --git a/src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java b/src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java deleted file mode 100644 index 2e7c2922..00000000 --- a/src/main/java/ch/epfl/biop/registration/plugin/RegistrationTypeProperties.java +++ /dev/null @@ -1,25 +0,0 @@ -package ch.epfl.biop.registration.plugin; - -import org.scijava.command.Command; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface RegistrationTypeProperties { - - /** - * Does the registration required an user input ? - * @return true if the registration requires user input - */ - boolean isManual(); - - /** - * Can the registration be edited after it has run ? - * Considered a manual task by default - * @return true if the registration can be edited a posteriori - */ - boolean isEditable(); - -} - diff --git a/src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationPlugin.java b/src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationPlugin.java deleted file mode 100644 index 666b76b0..00000000 --- a/src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationPlugin.java +++ /dev/null @@ -1,32 +0,0 @@ -package ch.epfl.biop.registration.plugin; - -import ij.ImagePlus; -import net.imglib2.realtransform.InvertibleRealTransform; - -import java.util.Map; - -@SuppressWarnings("SameReturnValue") -public interface SimpleRegistrationPlugin { - - /** - * @return Sampling required for the registration, in micrometer - */ - double getVoxelSizeInMicron(); - - /** - * Is called before registration to pass any extra registration parameter - * argument. Passed as a dictionary of String to preserve serialization - * capability. - * @param parameters dictionary of parameters - */ - void setRegistrationParameters(Map parameters); - - /** - * - * @param fixed image - * @param moving image - * @return the transform, result of the registration, in - * going from fixed to moving coordinates, in pixels - */ - InvertibleRealTransform register(ImagePlus fixed, ImagePlus moving, ImagePlus fixedMask, ImagePlus movingMask); -} diff --git a/src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationWrapper.java b/src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationWrapper.java deleted file mode 100644 index f73c9e64..00000000 --- a/src/main/java/ch/epfl/biop/registration/plugin/SimpleRegistrationWrapper.java +++ /dev/null @@ -1,337 +0,0 @@ -package ch.epfl.biop.registration.plugin; - -import bdv.util.BoundedRealTransform; -import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.bdv.img.imageplus.ImagePlusHelper; -import ch.epfl.biop.java.utilities.roi.types.RealPointList; -import ij.ImagePlus; -import net.imglib2.RealPoint; -import net.imglib2.realtransform.AffineTransform3D; -import net.imglib2.realtransform.InvertibleRealTransform; -import net.imglib2.realtransform.InvertibleRealTransformSequence; -import net.imglib2.realtransform.RealTransform; -import net.imglib2.type.NativeType; -import net.imglib2.type.numeric.NumericType; -import org.scijava.Context; -import org.scijava.command.Command; -import sc.fiji.bdvpg.sourceandconverter.SourceAndConverterHelper; -import sc.fiji.bdvpg.sourceandconverter.importer.EmptySourceAndConverterCreator; -import sc.fiji.bdvpg.sourceandconverter.transform.SourceRealTransformer; -import sc.fiji.bdvpg.sourceandconverter.transform.SourceResampler; -import sc.fiji.persist.ScijavaGsonHelper; - -import java.util.HashMap; -import java.util.List; -import java.util.ArrayList; -import java.util.Map; -import java.util.Arrays; -import java.util.stream.Collectors; - -public class SimpleRegistrationWrapper implements ExternalRegistrationPlugin { - - public String getRegistrationTypeName() { - return registrationTypeName; - } - - public SimpleRegistrationWrapper(String registrationTypeName, final SimpleRegistrationPlugin simpleRegistration) { - this.registration = simpleRegistration; - this.registrationTypeName = registrationTypeName; - } - - final String registrationTypeName; - final SimpleRegistrationPlugin registration; - - Context context; - - Map parameters; - - boolean isDone = false; - - protected RealTransform rt; - - @Override - public boolean isManual() { - return false; - } - - @Override - public boolean isEditable() { - return false; - } - - @Override - public Class[] userInterface() { - return new Class[0]; - } - - @Override - public void setScijavaContext(Context context) { - this.context = context; - } - - @Override - public void setRegistrationParameters(Map parameters) { - this.parameters = parameters; - } - - @Override - public Map getRegistrationParameters() { - return parameters; - } - - ImagePlus fixedImage, movingImage, fixedMask, movingMask; - - @Override - public void setFixedImage(SourceAndConverter[] fimg) { - fixedImage = export("Fixed-", Arrays.asList(fimg), - (Double.parseDouble(parameters.get("px"))), - (Double.parseDouble(parameters.get("py"))), - (Double.parseDouble(parameters.get("sx"))), - (Double.parseDouble(parameters.get("sy"))), - registration.getVoxelSizeInMicron()/1000.0, - 0, - false - ); - } - - @Override - public void setMovingImage(SourceAndConverter[] mimg) { - movingImage = export("Moving-", Arrays.asList(mimg), - (Double.parseDouble(parameters.get("px"))), - (Double.parseDouble(parameters.get("py"))), - (Double.parseDouble(parameters.get("sx"))), - (Double.parseDouble(parameters.get("sy"))), - registration.getVoxelSizeInMicron()/1000.0, - 0, - false - ); - } - - @Override - public void setFixedMask(SourceAndConverter[] fimg_mask) { - fixedMask = export("FixedMask-", Arrays.asList(fimg_mask), - (Double.parseDouble(parameters.get("px"))), - (Double.parseDouble(parameters.get("py"))), - (Double.parseDouble(parameters.get("sx"))), - (Double.parseDouble(parameters.get("sy"))), - registration.getVoxelSizeInMicron()/1000.0, - 0, - false - ); - } - - @Override - public void setMovingMask(SourceAndConverter[] mimg_mask) { - movingMask = export("MovingMask-", Arrays.asList(mimg_mask), - (Double.parseDouble(parameters.get("px"))), - (Double.parseDouble(parameters.get("py"))), - (Double.parseDouble(parameters.get("sx"))), - (Double.parseDouble(parameters.get("sy"))), - registration.getVoxelSizeInMicron()/1000.0, - 0, - false - ); - } - - @Override - public void resetRegistration() { - isDone = false; - } - - @Override - public void setTimePoint(int timePoint) { - // ignored: it's 0 - } - - @Override - public boolean register() { - InvertibleRealTransform inner_rt = registration.register(fixedImage, movingImage, fixedMask, movingMask); - - // This transform is for pixel to pixel coordinates -> we need to convert it to physical space. - // Thus adding an AffineTransform to a sequence - - InvertibleRealTransformSequence irts = new InvertibleRealTransformSequence(); - AffineTransform3D m = new AffineTransform3D(); - - double px = (Double.parseDouble(parameters.get("px"))); - double py = (Double.parseDouble(parameters.get("py"))); - double voxSize = registration.getVoxelSizeInMicron(); - - // We work in millimeters - m.scale(voxSize/1000.0); - m.translate(px, py, 0); - - // The umbrella trick - irts.add(m.inverse()); - irts.add(inner_rt); - irts.add(m); - - rt = irts; - - isDone = true; - return true; // no error handling - } - - @Override - public boolean edit() { - // TODO : find a way to edit an affine transform -> that shouldn't be so complicated - throw new UnsupportedOperationException(); - } - - @Override - public boolean isRegistrationDone() { - return isDone; - } - - @Override - public SourceAndConverter[] getTransformedImageMovingToFixed(SourceAndConverter[] img) { - SourceAndConverter[] out = new SourceAndConverter[img.length]; - SourceRealTransformer srt = new SourceRealTransformer(rt); - for (int idx = 0;idx cvtList = new ArrayList<>(); - - for (RealPoint p : pts.ptList) { - RealPoint pt3d = new RealPoint(3); - pt3d.setPosition(new double[]{p.getDoublePosition(0), p.getDoublePosition(1),0}); - innerRT.apply(pt3d, pt3d); - RealPoint cpt = new RealPoint(pt3d.getDoublePosition(0), pt3d.getDoublePosition(1)); - cvtList.add(cpt); - } - - return new RealPointList(cvtList); - } - - @Override - public void abort() { - - } - - public RealTransform getRealTransform() { - return rt; - } - - public void setRealTransform(RealTransform transform) { - this.rt = transform.copy(); - } - - @Override - final public String getTransform() { - //logger.debug("Serializing transform of class "+rt.getClass().getSimpleName()); - String transform = ScijavaGsonHelper.getGson(context).toJson(rt, RealTransform.class); - //logger.debug("Serialization result = "+transform); - return transform; - } - - @Override - final public void setTransform(String serialized_transform) { - setRealTransform(ScijavaGsonHelper.getGson(context).fromJson(serialized_transform, RealTransform.class)); - isDone = true; - } - - public RealTransform getTransformAsRealTransform() { - return rt.copy(); - } - - - public static & NativeType> ImagePlus export(String name, List> sourceList, - double px, double py, double sx, double sy, - double pixelSizeMillimeter, int timepoint, - boolean interpolate) { - - AffineTransform3D at3D = new AffineTransform3D(); - - SourceAndConverter model = createModelSource(px, py, sx, sy, pixelSizeMillimeter, at3D); - - List> resampledSourceList = sourceList - .stream() - .map(sac -> (SourceAndConverter) (new SourceResampler(sac,model,sac.getSpimSource().getName()+"_ResampledLike_"+model.getSpimSource().getName(), true, false, interpolate,0).get())) - .collect(Collectors.toList()); - - if ((sourceList.size()>1)) { - - Map, Integer> mapMipmap = new HashMap<>(); - sourceList.forEach(src -> { - int mipmapLevel = SourceAndConverterHelper.bestLevel(src, timepoint, pixelSizeMillimeter); - //logger.debug("Mipmap level chosen for source ["+src.getSpimSource().getName()+"] : "+mipmapLevel); - mapMipmap.put(resampledSourceList.get(sourceList.indexOf(src)), mipmapLevel); - }); - - ImagePlus resultImage = ImagePlusHelper.wrap( - resampledSourceList, - mapMipmap, - timepoint, - 1, - 1); - - resultImage.setTitle(name+"-["+px+":"+(px+sx)+" | "+py+":"+(py+sy)+"]"); - ImagePlusHelper.storeExtendedCalibrationToImagePlus(resultImage, at3D.inverse(), "mm", timepoint); - - return resultImage; - - } else { - SourceAndConverter source = resampledSourceList.get(0); - int mipmapLevel = SourceAndConverterHelper.bestLevel(sourceList.get(0), timepoint, pixelSizeMillimeter); - ImagePlus singleChannel = ImagePlusHelper.wrap( - source, - mipmapLevel, - timepoint, - 1, - 1); - singleChannel.setTitle(source.getSpimSource().getName()); - ImagePlusHelper.storeExtendedCalibrationToImagePlus(singleChannel, at3D.inverse(), "mm", timepoint); - - return singleChannel; - } - - } - - - private static SourceAndConverter createModelSource( - double px, double py, - double sx, double sy, - double pixel_size_mm, - AffineTransform3D transform) { - // Origin is in fact the point 0,0,0 of the image - // Get current big dataviewer transformation : source transform and viewer transform - AffineTransform3D at3D = new AffineTransform3D(); // Empty Transform - // viewer transform - // Center on the display center of the viewer ... - at3D.translate(-px, -py, 0); - - at3D.scale(1/pixel_size_mm); - - // Getting an image independent of the view scaling unit (not sure) - long nPx = (long)(sx / pixel_size_mm); - long nPy = (long)(sy / pixel_size_mm); - long nPz = 1; - - // At least a pixel in all directions - if (nPz == 0) nPz = 1; - if (nPx == 0) nPx = 1; - if (nPy == 0) nPy = 1; - - transform.set(at3D); - - return new EmptySourceAndConverterCreator("model", at3D.inverse(), nPx, nPy, nPz).get(); - } - - @Override - public String toString() { - return registrationTypeName; - } - -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/SourceAndConverterRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/SourceAndConverterRegistration.java deleted file mode 100644 index 7837fbf8..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/SourceAndConverterRegistration.java +++ /dev/null @@ -1,95 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter; - -import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.registration.plugin.IRegistrationPlugin; -import org.scijava.Context; -import org.scijava.plugin.Parameter; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -abstract public class SourceAndConverterRegistration implements IRegistrationPlugin { - - protected SourceAndConverter[] fimg; - - protected SourceAndConverter[] mimg; - - protected SourceAndConverter[] fimg_mask; - - protected SourceAndConverter[] mimg_mask; - - protected int timePoint = 0; - - @Parameter - protected Context context; - - @Override - public void setFixedImage(SourceAndConverter[] fimg) { - this.fimg = fimg; - } - - @Override - public void setMovingImage(SourceAndConverter[] mimg) { - this.mimg = mimg; - } - - @Override - public void setFixedMask(SourceAndConverter[] fimg) { - this.fimg_mask = fimg; - } - - @Override - public void setMovingMask(SourceAndConverter[] mimg) { - this.mimg_mask = mimg; - } - - @Override - public void setTimePoint(int timePoint) { - this.timePoint = timePoint; - } - - /** - * Is called just after the Registration object creation to pass - * the current scijava context - * is adopted by all registrations - * @param context - */ - public void setScijavaContext(Context context) { - this.context = context; - } - - protected boolean isDone = false; - - @Override - public boolean isRegistrationDone() { - return isDone; - } - - @Override - public void resetRegistration() { - isDone = false; - } - - protected Map parameters = new HashMap<>(); - - @Override - public Map getRegistrationParameters() { - if (parameters!=null) { - return parameters; - } else { - return new HashMap<>(); - } - } - - @Override - public void setRegistrationParameters(Map parameters) { - this.parameters = parameters; - } - - protected static void addToFlatParameters(List flatParameters, Object... args) { - flatParameters.addAll(Arrays.asList(args)); - } - -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java deleted file mode 100644 index f7cae925..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineRegistration.java +++ /dev/null @@ -1,62 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.affine; - -import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.registration.plugin.IRegistrationPlugin; -import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; -import com.google.gson.Gson; -import net.imglib2.realtransform.AffineTransform3D; -import org.scijava.plugin.Plugin; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * To make an affine transform programmatically conveniently - * - */ -@Plugin(type = IRegistrationPlugin.class) -@RegistrationTypeProperties( - isManual = false, - isEditable = false) - -public class AffineRegistration extends AffineTransformSourceAndConverterRegistration{ - - protected static Logger logger = LoggerFactory.getLogger(AffineRegistration.class); - - @Override - public void setFixedImage(SourceAndConverter[] fimg) { - super.setFixedImage(fimg); - } - - @Override - public void setMovingImage(SourceAndConverter[] mimg) { - super.setMovingImage(mimg); - } - - public static String affineTransform3DToString(AffineTransform3D transform) { - return new Gson().toJson(transform.getRowPackedCopy()); - } - - public static AffineTransform3D stringToAffineTransform3D(String string) { - AffineTransform3D transform3D = new AffineTransform3D(); - double[] matrix = new Gson().fromJson(string, double[].class); - transform3D.set(matrix); - return transform3D; - } - - @Override - public boolean register() { - at3d = stringToAffineTransform3D(parameters.get("transform")); - isDone = true; - return true; - } - - @Override - public void abort() { - - } - - public String toString() { - return "Affine"; - } - -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformSourceAndConverterRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformSourceAndConverterRegistration.java deleted file mode 100644 index baf57aa6..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformSourceAndConverterRegistration.java +++ /dev/null @@ -1,64 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.affine; - -import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.java.utilities.roi.types.RealPointList; -import ch.epfl.biop.registration.sourceandconverter.SourceAndConverterRegistration; -import net.imglib2.RealPoint; -import net.imglib2.realtransform.AffineTransform3D; -import net.imglib2.realtransform.RealTransform; -import sc.fiji.bdvpg.sourceandconverter.SourceAndConverterAndTimeRange; -import sc.fiji.bdvpg.sourceandconverter.transform.SourceTransformHelper; -import sc.fiji.persist.ScijavaGsonHelper; - -import java.util.ArrayList; - -abstract public class AffineTransformSourceAndConverterRegistration extends SourceAndConverterRegistration { - - protected AffineTransform3D at3d = new AffineTransform3D(); - - @SuppressWarnings("CanBeFinal") - public int timePoint = 0; - - @Override - public SourceAndConverter[] getTransformedImageMovingToFixed(SourceAndConverter[] img) { - SourceAndConverter[] out = new SourceAndConverter[img.length]; - for (int idx = 0;idx(img[idx],timePoint)); - } - return out; - } - - @Override - public RealPointList getTransformedPtsFixedToMoving(RealPointList pts) { - ArrayList cvtList = new ArrayList<>(); - for (RealPoint p : pts.ptList) { - RealPoint pt3d = new RealPoint(3); - pt3d.setPosition(new double[]{p.getDoublePosition(0), p.getDoublePosition(1),0}); - at3d.inverse().apply(pt3d, pt3d); - RealPoint cpt = new RealPoint(pt3d.getDoublePosition(0), pt3d.getDoublePosition(1)); - cvtList.add(cpt); - } - return new RealPointList(cvtList); - } - - @Override - public String getTransform() { - return ScijavaGsonHelper.getGson(context).toJson(at3d, AffineTransform3D.class); - } - - @Override - public void setTransform(String serialized_transform) { - at3d = ScijavaGsonHelper.getGson(context).fromJson(serialized_transform, AffineTransform3D.class); - isDone = true; - } - - @Override - public boolean edit() { - // TODO : find a way to edit an affine transform -> that shouldn't be so complicated - throw new UnsupportedOperationException(); - } - - public RealTransform getTransformAsRealTransform() { - return at3d.inverse().copy(); - } -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformedSourceWrapperRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformedSourceWrapperRegistration.java deleted file mode 100644 index b723fbaf..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/AffineTransformedSourceWrapperRegistration.java +++ /dev/null @@ -1,70 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.affine; - -import bdv.viewer.SourceAndConverter; -import net.imglib2.realtransform.AffineTransform3D; -import sc.fiji.bdvpg.sourceandconverter.SourceAndConverterAndTimeRange; -import sc.fiji.bdvpg.sourceandconverter.transform.SourceTransformHelper; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * Fake registration which simply wraps a transform which is used to modify either: - * - the place of the image in the user GUI, or to - * TODO : write a bit more clearly what this does - */ -public class AffineTransformedSourceWrapperRegistration extends AffineTransformSourceAndConverterRegistration { - - Map, SourceAndConverter> alreadyTransformedSources = new ConcurrentHashMap<>(); - - @Override - public boolean register() { - isDone = true; - return true; - } - - /** - * These function are kept in order to avoid serializing many times - * unnecessary affinetransform - * @param at3d_in affine transform - */ - public synchronized void setAffineTransform(AffineTransform3D at3d_in) { - this.at3d = at3d_in; - alreadyTransformedSources.keySet().forEach(sac -> SourceTransformHelper.set(at3d_in, new SourceAndConverterAndTimeRange<>(alreadyTransformedSources.get(sac), timePoint))); - } - - public AffineTransform3D getAffineTransform() { - return at3d.copy(); - } - - /** - * Overriding to actually mutate SourceAndConverter, - * it's the only registration which does that, because - * it's actually not really a registration - * @param img image - * @return mutates the transform - */ - @Override - public SourceAndConverter[] getTransformedImageMovingToFixed(SourceAndConverter[] img) { - - SourceAndConverter[] out = new SourceAndConverter[img.length]; - - for (int idx = 0;idx(out[idx], timePoint)); - } else { - out[idx] = SourceTransformHelper.createNewTransformedSourceAndConverter(at3d, new SourceAndConverterAndTimeRange<>(img[idx], timePoint)); - alreadyTransformedSources.put(img[idx], out[idx]); - } - } - - return out; - } - - @Override - public void abort() { - - } - -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/CenterZeroRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/CenterZeroRegistration.java deleted file mode 100644 index 70eb70dc..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/CenterZeroRegistration.java +++ /dev/null @@ -1,54 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.affine; - -import bdv.viewer.SourceAndConverter; -import net.imglib2.RealPoint; -import net.imglib2.realtransform.AffineTransform3D; -import sc.fiji.bdvpg.sourceandconverter.SourceAndConverterAndTimeRange; -import sc.fiji.bdvpg.sourceandconverter.SourceAndConverterHelper; -import sc.fiji.bdvpg.sourceandconverter.transform.SourceTransformHelper; - -/** - * Fake registration : simply centers the image in order to put its center - * at the origin of the global coordinate system. - */ - -public class CenterZeroRegistration extends AffineTransformSourceAndConverterRegistration { - - @Override - public boolean register() { - - SourceAndConverter sac = mimg[0]; - - RealPoint center = SourceAndConverterHelper.getSourceAndConverterCenterPoint(sac,0); - - at3d = new AffineTransform3D(); - - at3d.translate( - -center.getDoublePosition(0), - -center.getDoublePosition(1), - -center.getDoublePosition(2)); - - isDone = true; - - return true; - } - - /** - * @param img image - * @return transformed images (new source created) - */ - @Override - public SourceAndConverter[] getTransformedImageMovingToFixed(SourceAndConverter[] img) { - SourceAndConverter[] out = new SourceAndConverter[img.length]; - for (int idx = 0;idx(img[idx], timePoint)); - } - return out; - } - - @Override - public void abort() { - // Cannot be aborted - is very fast anyway - } - -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java deleted file mode 100644 index 82fb2240..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/affine/Elastix2DAffineRegistration.java +++ /dev/null @@ -1,146 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.affine; - -import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.command.RegisterSlicesElastixAffineCommand; -import ch.epfl.biop.registration.plugin.IRegistrationPlugin; -import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; -import ch.epfl.biop.scijava.command.source.register.Elastix2DAffineRegisterCommand; -import net.imglib2.realtransform.AffineTransform3D; -import org.scijava.command.Command; -import org.scijava.command.CommandModule; -import org.scijava.command.CommandService; -import org.scijava.plugin.Plugin; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import sc.fiji.bdvpg.sourceandconverter.SourceAndConverterHelper; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.Future; - -/** - * Uses Elastix backend to perform an affine transform registration - * - */ -@Plugin(type = IRegistrationPlugin.class) -@RegistrationTypeProperties( - isManual = false, - isEditable = false) - -public class Elastix2DAffineRegistration extends AffineTransformSourceAndConverterRegistration{ - - - protected static final Logger logger = LoggerFactory.getLogger(Elastix2DAffineRegistration.class); - - @Override - public void setFixedImage(SourceAndConverter[] fimg) { - if (fimg.length==0) { - logger.error("Error, no fixed image set in class "+this.getClass().getSimpleName()); - } - super.setFixedImage(fimg); - } - - @Override - public void setMovingImage(SourceAndConverter[] mimg) { - if (mimg.length==0) { - logger.error("Error, no fixed image set in class "+this.getClass().getSimpleName()); - } - super.setMovingImage(mimg); - } - - Future task; - - @Override - public boolean register() { - try { - Class registrationCommandClass; - // Is it supposed to be done on a server ? - registrationCommandClass = Elastix2DAffineRegisterCommand.class; - - // Registration success flag - boolean success = true; - - // Transforms map into flat String : key1, value1, key2, value2, etc. - // Necessary for CommandService - List flatParameters = new ArrayList<>(parameters.size()*2+4); - - double voxSizeInMm = Double.parseDouble(parameters.get("pxSizeInCurrentUnit")); - - parameters.keySet().forEach(k -> { - flatParameters.add(k); - flatParameters.add(parameters.get(k)); - }); - - addToFlatParameters(flatParameters, - // Fixed image - "sacs_fixed", fimg, - // Moving image - "sacs_moving", mimg, - // No interpolation in resampling - "interpolate", false, - // Start registration with a 4x4 pixel image - "minPixSize",4, - // 100 iteration steps - "maxIterationNumberPerScale",100, - // Do not write anything - "verbose", false, - // Centers centers of mass of both images before starting registration - "automaticTransformInitialization", true, - // Atlas image : a single timepoint - "tpFixed", 0, - // Level 2 for the atlas - "levelFixedSource", SourceAndConverterHelper.bestLevel(fimg[0], timePoint, voxSizeInMm), - // Timepoint moving source (normally 0) - "tpMoving", timePoint, - // Tries to be clever for the moving source sampling - "levelMovingSource", SourceAndConverterHelper.bestLevel(mimg[0], timePoint, voxSizeInMm) - ); - - task = context - .getService(CommandService.class) - .run(registrationCommandClass, false, - flatParameters.toArray(new Object[0]) - ); - - CommandModule module = task.get(); - - if (module.getOutputs().containsKey("success")) { - success = (boolean) module.getOutput("success"); - } - if (success) { - at3d = (AffineTransform3D) module.getOutput("at3D"); - } else { - if (module.getOutputs().containsKey("error")) { - errorMessage = (String) module.getOutput("error"); - } - } - - isDone = true; - return success; - } catch (Exception e) { - errorMessage = e.getMessage(); - e.printStackTrace(); - return false; - } - } - - String errorMessage = ""; - - @Override - public String getExceptionMessage() { - return errorMessage; - } - - @Override - public void abort() { - if (task!=null) { - logger.info(this.getClass().getSimpleName()+": Attempt to interrupt registration..."); - task.cancel(true); - } - } - - public String toString() { - return "Elastix 2D Affine"; - } - -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java deleted file mode 100644 index ea51bdca..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/bigwarp/SacBigWarp2DRegistration.java +++ /dev/null @@ -1,124 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.bigwarp; - -import bdv.gui.TransformTypeSelectDialog; -import bdv.tools.brightness.ConverterSetup; -import bdv.util.BdvHandle; -import bdv.viewer.DisplayMode; -import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.command.RegisterSlicesBigWarpCommand; -import ch.epfl.biop.registration.plugin.IRegistrationPlugin; -import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; -import ch.epfl.biop.registration.sourceandconverter.spline.RealTransformSourceAndConverterRegistration; -import ij.gui.WaitForUserDialog; -import org.scijava.plugin.Plugin; -import sc.fiji.bdvpg.bdv.BdvHandleHelper; -import sc.fiji.bdvpg.services.SourceAndConverterServices; -import sc.fiji.bdvpg.sourceandconverter.register.BigWarpLauncher; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import static bdv.util.RealTransformHelper.BigWarpFileFromRealTransform; - -@Plugin(type = IRegistrationPlugin.class) -@RegistrationTypeProperties( - isManual = true, - isEditable = true -) -public class SacBigWarp2DRegistration extends RealTransformSourceAndConverterRegistration { - - BigWarpLauncher bwl; - - Runnable waitForUser = () -> { - WaitForUserDialog dialog = new WaitForUserDialog("Big Warp registration","Please perform carefully your registration then press ok. Do not forget to press 't' when 4 landmarks are placed."); - dialog.show(); - }; - - public void setWaitForUserMethod(Runnable r) { - waitForUser = r; - } - - @Override - public boolean register() { - { - - List> movingSacs = Arrays.stream(mimg).collect(Collectors.toList()); - - List> fixedSacs = Arrays.stream(fimg).collect(Collectors.toList()); - - List converterSetups = Arrays.stream(mimg).map(src -> SourceAndConverterServices.getSourceAndConverterService().getConverterSetup(src)).collect(Collectors.toList()); - - converterSetups.addAll(Arrays.stream(fimg).map(src -> SourceAndConverterServices.getSourceAndConverterService().getConverterSetup(src)).collect(Collectors.toList())); - - // Launch BigWarp - bwl = new BigWarpLauncher(movingSacs, fixedSacs, "Big Warp", converterSetups); - bwl.set2d(); - bwl.run(); - - // Output bdvh handles -> will be put in the object service - BdvHandle bdvhQ = bwl.getBdvHandleQ(); - BdvHandle bdvhP = bwl.getBdvHandleP(); - - bdvhQ.getViewerPanel().state().setDisplayMode(DisplayMode.FUSED); - bdvhP.getViewerPanel().state().setDisplayMode(DisplayMode.FUSED); - - bdvhP.getViewerPanel().state().setViewerTransform(BdvHandleHelper.getViewerTransformWithNewCenter(bdvhP, new double[]{0,0,0})); - bdvhQ.getViewerPanel().state().setViewerTransform(BdvHandleHelper.getViewerTransformWithNewCenter(bdvhQ, new double[]{0,0,0})); - - SourceAndConverterServices.getBdvDisplayService().pairClosing(bdvhQ,bdvhP); - - bdvhP.getViewerPanel().requestRepaint(); - bdvhQ.getViewerPanel().requestRepaint(); - - bwl.getBigWarp().getLandmarkFrame().repaint(); - - // Restores landmarks if some were already defined - if (rt!=null) { - String bigWarpFile = BigWarpFileFromRealTransform(rt); - if (bigWarpFile!=null) { // If the transform is not a spline, no landmarks are saved, the user has to redo his job - bwl.getBigWarp().loadLandmarks(bigWarpFile); - bwl.getBigWarp().setInLandmarkMode(true); - bwl.getBigWarp().setIsMovingDisplayTransformed(true); - } - } - - waitForUser.run(); - - switch (bwl.getBigWarp().getBwTransform().getTransformType()) { - case (TransformTypeSelectDialog.TPS) : - // Thin plate spline transform - rt = bwl.getBigWarp().getBwTransform().getTransformation(); - break; - default: - // Any other transform, currently Affine 3D - rt = bwl.getBigWarp().getBwTransform().affine3d(); - } - - bwl.getBigWarp().closeAll(); - - isDone = true; - - return true; - - } - } - - @Override - public boolean edit() { - // Just launching again BigWarp - this.register(); - return true; - } - - @Override - public void abort() { - - } - - - public String toString() { - return "Big Warp"; - } - -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java deleted file mode 100644 index 46991a00..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXRegistration.java +++ /dev/null @@ -1,48 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.mirror; - -import ch.epfl.biop.atlas.aligner.command.MirrorDoCommand; -import ch.epfl.biop.registration.plugin.IRegistrationPlugin; -import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; -import ch.epfl.biop.registration.sourceandconverter.spline.RealTransformSourceAndConverterRegistration; -import org.scijava.plugin.Plugin; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -@Plugin(type = IRegistrationPlugin.class) -@RegistrationTypeProperties( - isManual = false, - isEditable = true -) - -public class MirrorXRegistration extends RealTransformSourceAndConverterRegistration { - - protected static Logger logger = LoggerFactory.getLogger(MirrorXRegistration.class); - - @Override - public boolean register() { - String mirrorSide = parameters.get("mirror_side"); - if (mirrorSide.equals("Left")) { - rt = new MirrorXTransform(-1); - } else { - rt = new MirrorXTransform(1); - } - isDone = true; - return true; - } - - @Override - public boolean edit() { - return false; - } - - @Override - public void abort() { - - } - - final public static String MIRROR_X_REGISTRATION_NAME = "Mirror X"; - public String toString() { - return MIRROR_X_REGISTRATION_NAME; - } - -} \ No newline at end of file diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXTransform.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXTransform.java deleted file mode 100644 index 6de805ee..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXTransform.java +++ /dev/null @@ -1,64 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.mirror; - -import net.imglib2.RealLocalizable; -import net.imglib2.RealPositionable; -import net.imglib2.realtransform.AffineTransform3D; -import net.imglib2.realtransform.InvertibleRealTransform; - -public class MirrorXTransform implements InvertibleRealTransform { - - final double xFactor; - - public MirrorXTransform(double xFactor) { - this.xFactor = xFactor; - } - - @Override - public int numSourceDimensions() { - return 3; - } - - @Override - public int numTargetDimensions() { - return 3; - } - - @Override - public void apply(double[] source, double[] target) { - target[0] = source[0]*xFactor>0 ? source[0]:-source[0]; - target[1] = source[1]; - target[2] = source[2]; - } - - @Override - public void apply(RealLocalizable realLocalizable, RealPositionable realPositionable) { - double xPos = realLocalizable.getDoublePosition(0); - realPositionable.setPosition(xPos*xFactor>0 ? xPos:-xPos,0); - realPositionable.setPosition(realLocalizable.getDoublePosition(1),1); - realPositionable.setPosition(realLocalizable.getDoublePosition(2),2); - } - - @Override - public void applyInverse(double[] source, double[] target) { - target[0] = source[0]; - target[1] = source[1]; - target[2] = source[2]; - } - - @Override - public void applyInverse(RealPositionable realPositionable, RealLocalizable realLocalizable) { - realPositionable.setPosition(realLocalizable.getDoublePosition(0),0); - realPositionable.setPosition(realLocalizable.getDoublePosition(1),1); - realPositionable.setPosition(realLocalizable.getDoublePosition(2),2); - } - - @Override - public InvertibleRealTransform inverse() { - return new AffineTransform3D(); - } - - @Override - public InvertibleRealTransform copy() { - return new MirrorXTransform(xFactor); - } -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXTransformAdapter.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXTransformAdapter.java deleted file mode 100644 index 2eb20869..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/mirror/MirrorXTransformAdapter.java +++ /dev/null @@ -1,44 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.mirror; - - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import net.imglib2.realtransform.RealTransform; -import org.scijava.plugin.Plugin; -import sc.fiji.persist.IClassRuntimeAdapter; - -import java.lang.reflect.Type; -@Plugin(type = IClassRuntimeAdapter.class) -public class MirrorXTransformAdapter implements IClassRuntimeAdapter { - @Override - public Class getBaseClass() { - return RealTransform.class; - } - - @Override - public Class getRunTimeClass() { - return MirrorXTransform.class; - } - - @Override - public boolean useCustomAdapter() { - return true; - } - - @Override - public MirrorXTransform deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - JsonObject obj = jsonElement.getAsJsonObject(); - double xFactor = obj.getAsJsonPrimitive("xFactor").getAsDouble(); - return new MirrorXTransform(xFactor); - } - - @Override - public JsonElement serialize(MirrorXTransform transform, Type type, JsonSerializationContext jsonSerializationContext) { - JsonObject obj = new JsonObject(); - obj.addProperty("xFactor", transform.xFactor); - return obj; - } -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java deleted file mode 100644 index 6acb9855..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/Elastix2DSplineRegistration.java +++ /dev/null @@ -1,318 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.spline; - -import bdv.tools.brightness.ConverterSetup; -import bdv.util.BdvHandle; -import bdv.viewer.DisplayMode; -import bdv.viewer.Interpolation; -import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.atlas.aligner.command.RegisterSlicesElastixSplineCommand; -import ch.epfl.biop.registration.plugin.IRegistrationPlugin; -import ch.epfl.biop.registration.plugin.RegistrationTypeProperties; -import ch.epfl.biop.scijava.command.source.register.Elastix2DSplineRegisterCommand; -import ij.gui.WaitForUserDialog; -import jitk.spline.ThinPlateR2LogRSplineKernelTransform; -import net.imglib2.RealPoint; -import net.imglib2.RealRandomAccessible; -import net.imglib2.realtransform.*; -import net.imglib2.realtransform.inverse.WrappedIterativeInvertibleRealTransform; -import net.imglib2.type.numeric.IntegerType; -import org.scijava.command.Command; -import org.scijava.command.CommandModule; -import org.scijava.command.CommandService; -import org.scijava.plugin.Plugin; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import sc.fiji.bdvpg.bdv.BdvHandleHelper; -import sc.fiji.bdvpg.services.SourceAndConverterServices; -import sc.fiji.bdvpg.sourceandconverter.SourceAndConverterHelper; -import sc.fiji.bdvpg.sourceandconverter.register.BigWarpLauncher; - -import java.util.*; -import java.util.concurrent.Future; -import java.util.stream.Collectors; - -import static bdv.util.RealTransformHelper.BigWarpFileFromRealTransform; - -@Plugin(type = IRegistrationPlugin.class) -@RegistrationTypeProperties( - isManual = false, - isEditable = true -) - -public class Elastix2DSplineRegistration extends RealTransformSourceAndConverterRegistration { - - protected static final Logger logger = LoggerFactory.getLogger(Elastix2DSplineRegistration.class); - - Future task; - - @Override - public void setFixedImage(SourceAndConverter[] fimg) { - if (fimg.length==0) { - logger.error("Error, no fixed image set in class "+this.getClass().getSimpleName()); - } - super.setFixedImage(fimg); - } - - @Override - public void setMovingImage(SourceAndConverter[] mimg) { - if (mimg.length==0) { - logger.error("Error, no fixed image set in class "+this.getClass().getSimpleName()); - } - super.setMovingImage(mimg); - } - - @Override - public boolean register() { - try { - boolean success = true; - Class registrationCommandClass; - registrationCommandClass = Elastix2DSplineRegisterCommand.class; - - // Transforms map into flat String : key1, value1, key2, value2, etc. - // Necessary for CommandService - List flatParameters = new ArrayList<>(parameters.size()*2+4); - - double voxSizeInMm = Double.parseDouble(parameters.get("pxSizeInCurrentUnit")); - - parameters.keySet().forEach(k -> { - flatParameters.add(k); - flatParameters.add(parameters.get(k)); - }); - - addToFlatParameters(flatParameters, - // Fixed image - "sacs_fixed",fimg, - // Moving image - "sacs_moving", mimg, - // Interpolation in resampling - "interpolate", true, - // Start registration with a 32x32 pixel image - "minPixSize", 32, - // 100 iteration steps - "maxIterationNumberPerScale",100, - // Do not write anything - "verbose", false, - // Do not center centers of mass of both images before starting registration - "automaticTransformInitialization", false, - // Atlas image : a single timepoint - "tpFixed", 0, - // Level 2 for the atlas - "levelFixedSource", SourceAndConverterHelper.bestLevel(fimg[0], timePoint, voxSizeInMm), - // Timepoint moving source (normally 0) - "tpMoving", timePoint, - // Tries to be clever for the moving source sampling - "levelMovingSource", SourceAndConverterHelper.bestLevel(mimg[0], timePoint, voxSizeInMm) - ); - - task = context - .getService(CommandService.class) - .run(registrationCommandClass, false, - flatParameters.toArray(new Object[0])); - - CommandModule module = task.get(); - - if (module.getOutputs().containsKey("success")) { - success = (boolean) module.getOutput("success"); - } - - if (success) { - rt = (RealTransform) module.getOutput("rt"); - rt = pruneLandMarksOutsideAtlas(rt); - } else { - if (module.getOutputs().containsKey("error")) { - errorMessage = (String) module.getOutput("error"); - } - } - - - isDone = true; - return success; - } catch (Exception e) { - errorMessage = e.getMessage(); - e.printStackTrace(); - return false; - } - } - - String errorMessage = ""; - - @Override - public String getExceptionMessage() { - return errorMessage; - } - - /** - * This function removes the landmarks located outside the atlas, - * meaning where the atlas 3d image value is zero - * 4 landmarks are kept - * @param rt_in the realtransfrom spline to prune - * @return same transform with landmarks pruned - */ - private RealTransform pruneLandMarksOutsideAtlas(RealTransform rt_in) { - - RealTransform input = rt_in; - boolean wrapped2d3d = false; - boolean wrappedInvertible = false; - if (rt_in instanceof Wrapped2DTransformAs3D) { - rt_in = ((Wrapped2DTransformAs3D)rt_in).transform; - wrapped2d3d = true; - } - - if (rt_in instanceof WrappedIterativeInvertibleRealTransform) { - rt_in = ((WrappedIterativeInvertibleRealTransform)rt_in).getTransform(); - wrappedInvertible = true; - } - - if (!(rt_in instanceof ThinplateSplineTransform)) { - System.err.println("Cannot edit the transform : it's not of class thinplatesplinetransform"); - return input; - } else { - if (fimg_mask !=null) { - ThinplateSplineTransform tst = (ThinplateSplineTransform) rt_in; - ThinPlateR2LogRSplineKernelTransform kernel = ThinPlateSplineTransformAdapter.getKernel(tst); - double[][] srcPts = ThinPlateSplineTransformAdapter.getSrcPts(kernel); - double[][] tgtPts = ThinPlateSplineTransformAdapter.getTgtPts(kernel); - int nbLandmarks = kernel.getNumLandmarks(); - int nbDimensions = kernel.getNumDims(); - - List ptsSource = new ArrayList<>(); - List ptsTarget = new ArrayList<>(); - - for (int i = 0; i < nbLandmarks; ++i) { - RealPoint ptSource = new RealPoint(3); - RealPoint ptTarget = new RealPoint(3); - int d; - for (d = 0; d < nbDimensions; ++d) { - ptTarget.setPosition(tgtPts[d][i], d); - } - ptTarget.setPosition(0,2); // 0 position in z - - for (d = 0; d < nbDimensions; ++d) { - ptSource.setPosition(srcPts[d][i], d); - } - ptSource.setPosition(0,2); // 0 position in z - - ptsSource.add(ptSource); - ptsTarget.add(ptTarget); - } - - RealRandomAccessible rawMask = fimg_mask[0].getSpimSource().getInterpolatedSource(timePoint,0, Interpolation.NEARESTNEIGHBOR); - - RealRandomAccessible mask = (RealRandomAccessible) rawMask; - - AffineTransform3D at3D = new AffineTransform3D(); - fimg_mask[0].getSpimSource().getSourceTransform(timePoint,0,at3D); - - List landMarksToKeep = new ArrayList<>(); - for (int i = 0; i < nbLandmarks; ++i) { - at3D.inverse().apply(ptsTarget.get(i), ptsTarget.get(i)); - at3D.inverse().apply(ptsSource.get(i), ptsSource.get(i)); - - if ((mask.getAt(ptsSource.get(i)).getInteger() == 0) && (mask.getAt(ptsTarget.get(i)).getInteger() == 0)) { - - } else { - landMarksToKeep.add(i); - } - } - - if (landMarksToKeep.size()<4) { - // Too many landmarks removed - System.err.println("Too few landmarks after pruning - skip pruning"); - return input; - } - - // Ok, now let's reconstruct the transform - - double[][] srcPtsKept = new double[nbDimensions][landMarksToKeep.size()]; - double[][] tgtPtsKept = new double[nbDimensions][landMarksToKeep.size()]; - - for (int i = 0;i(pruned); - } - - if (wrapped2d3d) { - pruned = new Wrapped2DTransformAs3D((InvertibleRealTransform) pruned); - } - - return pruned; - - } else return input; - } - } - - Runnable waitForUser = () -> { - WaitForUserDialog dialog = new WaitForUserDialog("Choose slice","Please perform carefully your registration then press ok."); - dialog.show(); - }; - - @Override - public boolean edit() { - - List> movingSacs = Arrays.stream(mimg).collect(Collectors.toList()); - - List> fixedSacs = Arrays.stream(fimg).collect(Collectors.toList()); - - List converterSetups = Arrays.stream(mimg).map(src -> SourceAndConverterServices.getSourceAndConverterService().getConverterSetup(src)).collect(Collectors.toList()); - - converterSetups.addAll(Arrays.stream(fimg).map(src -> SourceAndConverterServices.getSourceAndConverterService().getConverterSetup(src)).collect(Collectors.toList())); - - // Launch BigWarp - BigWarpLauncher bwl = new BigWarpLauncher(movingSacs, fixedSacs, "Big Warp", converterSetups); - bwl.set2d(); - bwl.run(); - - // Output bdvh handles -> will be put in the object service - BdvHandle bdvhQ = bwl.getBdvHandleQ(); - BdvHandle bdvhP = bwl.getBdvHandleP(); - - bdvhP.getViewerPanel().state().setViewerTransform(BdvHandleHelper.getViewerTransformWithNewCenter(bdvhP, new double[]{0,0,0})); - bdvhQ.getViewerPanel().state().setViewerTransform(BdvHandleHelper.getViewerTransformWithNewCenter(bdvhQ, new double[]{0,0,0})); - - bdvhQ.getViewerPanel().state().setDisplayMode(DisplayMode.FUSED); - bdvhP.getViewerPanel().state().setDisplayMode(DisplayMode.FUSED); - - SourceAndConverterServices.getBdvDisplayService().pairClosing(bdvhQ,bdvhP); - - bdvhP.getViewerPanel().requestRepaint(); - bdvhQ.getViewerPanel().requestRepaint(); - - bwl.getBigWarp().getLandmarkFrame().repaint(); - - if (rt!=null) { - bwl.getBigWarp().loadLandmarks(BigWarpFileFromRealTransform(rt)); - bwl.getBigWarp().setIsMovingDisplayTransformed(true); - } - - waitForUser.run(); - - rt = bwl.getBigWarp().getBwTransform().getTransformation(); - - bwl.getBigWarp().closeAll(); - - isDone = true; - - return true; - - } - - @Override - public void abort() { - if (task!=null) { - task.cancel(true); - } - } - - public String toString() { - return "Elastix 2D Spline"; - } - -} diff --git a/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/RealTransformSourceAndConverterRegistration.java b/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/RealTransformSourceAndConverterRegistration.java deleted file mode 100644 index 8c7e0f18..00000000 --- a/src/main/java/ch/epfl/biop/registration/sourceandconverter/spline/RealTransformSourceAndConverterRegistration.java +++ /dev/null @@ -1,79 +0,0 @@ -package ch.epfl.biop.registration.sourceandconverter.spline; - -import bdv.util.BoundedRealTransform; -import bdv.viewer.SourceAndConverter; -import ch.epfl.biop.java.utilities.roi.types.RealPointList; -import ch.epfl.biop.registration.sourceandconverter.SourceAndConverterRegistration; -import net.imglib2.RealPoint; -import net.imglib2.realtransform.RealTransform; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import sc.fiji.bdvpg.sourceandconverter.transform.SourceRealTransformer; -import sc.fiji.persist.ScijavaGsonHelper; - -import java.util.ArrayList; - -abstract public class RealTransformSourceAndConverterRegistration extends SourceAndConverterRegistration { - - final static Logger logger = LoggerFactory.getLogger(RealTransformSourceAndConverterRegistration.class); - - protected RealTransform rt; - - @Override - public SourceAndConverter[] getTransformedImageMovingToFixed(SourceAndConverter[] img) { - SourceAndConverter[] out = new SourceAndConverter[img.length]; - SourceRealTransformer srt = new SourceRealTransformer(rt); - for (int idx = 0;idx cvtList = new ArrayList<>(); - for (RealPoint p : pts.ptList) { - RealPoint pt3d = new RealPoint(3); - pt3d.setPosition(new double[]{p.getDoublePosition(0), p.getDoublePosition(1),0}); - innerRT.apply(pt3d, pt3d); - RealPoint cpt = new RealPoint(pt3d.getDoublePosition(0), pt3d.getDoublePosition(1)); - cvtList.add(cpt); - } - - return new RealPointList(cvtList); - } - - public RealTransform getRealTransform() { - return rt; - } - - public void setRealTransform(RealTransform transform) { - this.rt = transform.copy(); - } - - @Override - final public String getTransform() { - //logger.debug("Serializing transform of class "+rt.getClass().getSimpleName()); - String transform = ScijavaGsonHelper.getGson(context).toJson(rt, RealTransform.class); - //logger.debug("Serialization result = "+transform); - return transform; - } - - @Override - final public void setTransform(String serialized_transform) { - setRealTransform(ScijavaGsonHelper.getGson(context).fromJson(serialized_transform, RealTransform.class)); - isDone = true; - } - - public RealTransform getTransformAsRealTransform() { - return rt.copy(); - } - -} From 5ce96c7a9497c9b3802c1dad85f5035ec7881a11 Mon Sep 17 00:00:00 2001 From: Nicolas Chiaruttini Date: Wed, 19 Jun 2024 17:03:32 +0200 Subject: [PATCH 6/6] Updates dependencies Make RegistrationAndSources inner class private --- pom.xml | 4 ++-- src/main/java/ch/epfl/biop/atlas/aligner/SliceSources.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index e3b92534..680e8dc7 100644 --- a/pom.xml +++ b/pom.xml @@ -108,8 +108,8 @@ 0.10.1 - 0.7.1 - 0.9.5-SNAPSHOT + 0.7.2 + 0.10.0 0.2.6 diff --git a/src/main/java/ch/epfl/biop/atlas/aligner/SliceSources.java b/src/main/java/ch/epfl/biop/atlas/aligner/SliceSources.java index f50d5429..5698811d 100644 --- a/src/main/java/ch/epfl/biop/atlas/aligner/SliceSources.java +++ b/src/main/java/ch/epfl/biop/atlas/aligner/SliceSources.java @@ -1822,7 +1822,7 @@ public void popRasterSlice() { registered_sacs = sourcesNonRasterized.pop(); } - public static class RegistrationAndSources { + private static class RegistrationAndSources { final Registration reg; final SourceAndConverter[] sacs;