From af2bfdada23e02ba89bf20237f80a29995a012c4 Mon Sep 17 00:00:00 2001 From: Stefan Hahmann Date: Thu, 26 Oct 2023 16:36:45 +0200 Subject: [PATCH 1/6] Add a new class HeadlessProjectModel that can hold a Model, SharedBdvData and a SelectionModel * The reasoning behind this new class is to achieve testability of the FitEllipsoidPlugin in a headless way / in a non-graphics supported environment --- .../mamut/fitting/FitEllipsoidPlugin.java | 21 +++++---- .../mamut/fitting/HeadlessProjectModel.java | 46 +++++++++++++++++++ 2 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/mastodon/mamut/fitting/HeadlessProjectModel.java diff --git a/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java b/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java index 1cb614d..122f2e1 100644 --- a/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java +++ b/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java @@ -126,7 +126,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) private final AbstractNamedAction fitSelectedVerticesAction; - private ProjectModel projectModel; + private HeadlessProjectModel headlessProjectModel; public FitEllipsoidPlugin() { @@ -134,9 +134,14 @@ public FitEllipsoidPlugin() } @Override - public void setAppPluginModel( final ProjectModel model ) + public void setAppPluginModel( final ProjectModel projectModel ) { - this.projectModel = model; + this.headlessProjectModel = new HeadlessProjectModel( projectModel ); + } + + void setHeadlessProjectModel( final HeadlessProjectModel headlessProjectModel ) + { + this.headlessProjectModel = headlessProjectModel; } @Override @@ -164,7 +169,7 @@ void fitSelectedVertices() { // TODO: parameters to select which source to act on final int sourceIndex = 0; - final SourceAndConverter< ? > source = projectModel.getSharedBdvData().getSources().get( sourceIndex ); + final SourceAndConverter< ? > source = headlessProjectModel.getSharedBdvData().getSources().get( sourceIndex ); if ( !( source.getSpimSource().getType() instanceof RealType ) ) throw new IllegalArgumentException( "Expected RealType image source" ); process( Cast.unchecked( source ) ); @@ -179,7 +184,7 @@ void fitSelectedVertices() @SuppressWarnings( "unused" ) private < T extends RealType< T > > void process( final SourceAndConverter< T > source ) { - final RefSet< Spot > vertices = projectModel.getSelectionModel().getSelectedVertices(); + final RefSet< Spot > vertices = headlessProjectModel.getSelectionModel().getSelectedVertices(); if ( vertices.isEmpty() ) System.err.println( "no vertex selected" ); @@ -193,7 +198,7 @@ private < T extends RealType< T > > void process( final SourceAndConverter< T > final ArrayList< Spot > threadSafeVertices = asArrayList( vertices ); // NB: RefSet is not thread-safe for iteration. final int totalTasks = vertices.size(); - final ReentrantReadWriteLock.WriteLock writeLock = projectModel.getModel().getGraph().getLock().writeLock(); + final ReentrantReadWriteLock.WriteLock writeLock = headlessProjectModel.getModel().getGraph().getLock().writeLock(); Parallelization.getTaskExecutor().forEach( threadSafeVertices, spot -> { // loop over vertices in parallel using multiple threads @@ -253,7 +258,7 @@ private < T extends RealType< T > > void process( final SourceAndConverter< T > // set undo point if at least one spot was fitted if ( found.get() > 0 ) - projectModel.getModel().setUndoPoint(); + headlessProjectModel.getModel().setUndoPoint(); } private static ArrayList< Spot > asArrayList( final RefSet< Spot > vertices ) @@ -405,7 +410,7 @@ private void showBdvDebugWindow( final SourceAndConverter< ? > source, final dou { final BdvStackSource< FloatType > inputSource = BdvFunctions.show( input, "FloatType input", Bdv.options().sourceTransform( sourceToGlobal ) ); - final ConverterSetups setups = projectModel.getSharedBdvData().getConverterSetups(); + final ConverterSetups setups = headlessProjectModel.getSharedBdvData().getConverterSetups(); final ConverterSetup cs = setups.getConverterSetup( source ); final Bounds bounds = setups.getBounds().getBounds( cs ); inputSource.setDisplayRange( cs.getDisplayRangeMin(), cs.getDisplayRangeMax() ); diff --git a/src/main/java/org/mastodon/mamut/fitting/HeadlessProjectModel.java b/src/main/java/org/mastodon/mamut/fitting/HeadlessProjectModel.java new file mode 100644 index 0000000..b139e1a --- /dev/null +++ b/src/main/java/org/mastodon/mamut/fitting/HeadlessProjectModel.java @@ -0,0 +1,46 @@ +package org.mastodon.mamut.fitting; + +import org.mastodon.mamut.ProjectModel; +import org.mastodon.mamut.model.Link; +import org.mastodon.mamut.model.Model; +import org.mastodon.mamut.model.Spot; +import org.mastodon.model.SelectionModel; +import org.mastodon.views.bdv.SharedBigDataViewerData; + +public class HeadlessProjectModel +{ + private final Model model; + + private final SharedBigDataViewerData sharedBdvData; + + private final SelectionModel< Spot, Link > selectionModel; + + HeadlessProjectModel( + final Model model, final SharedBigDataViewerData sharedBdvData, final SelectionModel< Spot, Link > selectionModel + ) + { + this.model = model; + this.sharedBdvData = sharedBdvData; + this.selectionModel = selectionModel; + } + + public HeadlessProjectModel( final ProjectModel projectModel ) + { + this( projectModel.getModel(), projectModel.getSharedBdvData(), projectModel.getSelectionModel() ); + } + + public Model getModel() + { + return model; + } + + public SharedBigDataViewerData getSharedBdvData() + { + return sharedBdvData; + } + + public SelectionModel< Spot, Link > getSelectionModel() + { + return selectionModel; + } +} From 691faec45b33f5d3f858e7885f300bd335ef4f1a Mon Sep 17 00:00:00 2001 From: Stefan Hahmann Date: Thu, 26 Oct 2023 16:40:13 +0200 Subject: [PATCH 2/6] Let ArtificialData return ProjectModel and headlessProjectModel * This is to allow the class to be used for graphical and non-graphical applications. --- .../mamut/fitting/ArtificialData.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java b/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java index bccf20e..28dce73 100644 --- a/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java +++ b/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java @@ -35,8 +35,11 @@ import org.mastodon.collection.ref.RefObjectHashMap; import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.fitting.ellipsoid.Ellipsoid; +import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; +import org.mastodon.model.DefaultSelectionModel; +import org.mastodon.model.SelectionModel; import org.mastodon.views.bdv.SharedBigDataViewerData; import org.scijava.Context; @@ -56,7 +59,7 @@ import net.imglib2.view.Views; /** - * Renders a grid of ellipsoids in 3D, and wraps the result in a {@link MamutAppModel}. + * Renders a grid of ellipsoids in 3D, and wraps the result in a {@link ProjectModel}. */ public class ArtificialData { @@ -69,12 +72,15 @@ public class ArtificialData private final int numberOfSpots = columns * columns * columns; - private final ProjectModel appModel; + private final Context context; + + private final HeadlessProjectModel headlessProjectModel; private final RefObjectMap< Spot, Ellipsoid > ellipsoids; public ArtificialData( final Context context ) { + this.context = context; final Model model = new Model(); ellipsoids = new RefObjectHashMap<>( model.getGraph().vertices().getRefPool(), numberOfSpots ); final Img< FloatType > image = ArrayImgs.floats( columns * size, columns * size, columns * size ); @@ -91,8 +97,9 @@ public ArtificialData( final Context context ) ellipsoids.put( spot, ellipsoid ); drawSpot( image, interval, ellipsoid ); } - - appModel = wrapAsAppModel( image, model, context ); + SharedBigDataViewerData sharedBDVData = asSharedBdvDataXyz( image ); + SelectionModel< Spot, Link > selectionModel = new DefaultSelectionModel<>( model.getGraph(), model.getGraphIdBimap() ); + headlessProjectModel = new HeadlessProjectModel( model, sharedBDVData, selectionModel ); selectAllVerticies(); } @@ -112,8 +119,8 @@ private static SharedBigDataViewerData asSharedBdvDataXyz( final Img< FloatType private void selectAllVerticies() { - for ( final Spot vertex : appModel.getModel().getGraph().vertices() ) - appModel.getSelectionModel().setSelected( vertex, true ); + for ( final Spot vertex : headlessProjectModel.getModel().getGraph().vertices() ) + headlessProjectModel.getSelectionModel().setSelected( vertex, true ); } private Ellipsoid randomizedEllipsoid( final double[] center ) @@ -167,15 +174,14 @@ private static AffineTransform3D transposed( final AffineTransform3D transform ) return r; } - private static ProjectModel wrapAsAppModel( final Img< FloatType > image, final Model model, final Context context ) + public ProjectModel getAppModel() { - final SharedBigDataViewerData sharedBigDataViewerData = asSharedBdvDataXyz( image ); - return ProjectModel.create( context, model, sharedBigDataViewerData, null ); + return ProjectModel.create( context, headlessProjectModel.getModel(), headlessProjectModel.getSharedBdvData(), null ); } - public ProjectModel getAppModel() + public HeadlessProjectModel getHeadlessProjectModel() { - return appModel; + return headlessProjectModel; } public RefObjectMap< Spot, Ellipsoid> getExpectedEllipsoids() From 5f29d5b6300a1df80ee30e82772d0eff7e8d759e Mon Sep 17 00:00:00 2001 From: Stefan Hahmann Date: Thu, 26 Oct 2023 17:28:13 +0200 Subject: [PATCH 3/6] Use headleass project model instead of normal project model in FitEllipsoidPluginTest --- .../mastodon/mamut/fitting/FitEllipsoidPluginTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java b/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java index ac5199d..689740e 100644 --- a/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java +++ b/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java @@ -35,6 +35,7 @@ import org.junit.Test; import org.mastodon.collection.RefObjectMap; import org.mastodon.mamut.fitting.ellipsoid.Ellipsoid; +import org.mastodon.mamut.model.ModelGraph; import org.mastodon.mamut.model.Spot; import org.scijava.Context; @@ -56,18 +57,20 @@ public void testFitEllipsoidPlugin() { final ArtificialData data = new ArtificialData( new Context() ); final StopWatch watch = StopWatch.createAndStart(); final FitEllipsoidPlugin plugin = new FitEllipsoidPlugin(); - plugin.setAppPluginModel( data.getAppModel() ); + plugin.setHeadlessProjectModel( data.getHeadlessProjectModel() ); plugin.fitSelectedVertices(); System.out.println( watch ); final int success = countCorrectEllipsoids( data ); - assertEquals( "Not all ellipsoids were fitted correctly.", data.getAppModel().getModel().getGraph().vertices().size(), success ); + ModelGraph graph = data.getHeadlessProjectModel().getModel().getGraph(); + assertEquals( "Not all ellipsoids were fitted correctly.", graph.vertices().size(), success ); } private static int countCorrectEllipsoids( final ArtificialData data ) { int success = 0; final RefObjectMap< Spot, Ellipsoid > expectedEllipsoids = data.getExpectedEllipsoids(); - for( final Spot spot : data.getAppModel().getModel().getGraph().vertices() ) { + for ( final Spot spot : data.getHeadlessProjectModel().getModel().getGraph().vertices() ) + { final Ellipsoid actualEllipsoid = asEllipsoid( spot ); final Ellipsoid expectedEllipsoid = expectedEllipsoids.get( spot ); final boolean equal = isEllipsoidEqual( expectedEllipsoid, actualEllipsoid ); From 5d2bebedf88a3f64cf481e4bb62d83d640d73f48 Mon Sep 17 00:00:00 2001 From: Stefan Hahmann Date: Thu, 26 Oct 2023 18:33:13 +0200 Subject: [PATCH 4/6] Extract Interface MinimalProjectModel from HeadlessProjectModel and refactor HeadlessProjectModel to DefaultMinimalProjectModel * Add javadoc for MinimalProjectModel and DefaultMinimalProjectModel --- ...l.java => DefaultMinimalProjectModel.java} | 12 +++++-- .../mamut/fitting/FitEllipsoidPlugin.java | 18 +++++----- .../mamut/fitting/MinimalProjectModel.java | 35 +++++++++++++++++++ .../mamut/fitting/ArtificialData.java | 14 ++++---- 4 files changed, 60 insertions(+), 19 deletions(-) rename src/main/java/org/mastodon/mamut/fitting/{HeadlessProjectModel.java => DefaultMinimalProjectModel.java} (78%) create mode 100644 src/main/java/org/mastodon/mamut/fitting/MinimalProjectModel.java diff --git a/src/main/java/org/mastodon/mamut/fitting/HeadlessProjectModel.java b/src/main/java/org/mastodon/mamut/fitting/DefaultMinimalProjectModel.java similarity index 78% rename from src/main/java/org/mastodon/mamut/fitting/HeadlessProjectModel.java rename to src/main/java/org/mastodon/mamut/fitting/DefaultMinimalProjectModel.java index b139e1a..c758851 100644 --- a/src/main/java/org/mastodon/mamut/fitting/HeadlessProjectModel.java +++ b/src/main/java/org/mastodon/mamut/fitting/DefaultMinimalProjectModel.java @@ -7,7 +7,10 @@ import org.mastodon.model.SelectionModel; import org.mastodon.views.bdv.SharedBigDataViewerData; -public class HeadlessProjectModel +/** + * A default implementation of {@link MinimalProjectModel}. + */ +public class DefaultMinimalProjectModel implements MinimalProjectModel { private final Model model; @@ -15,7 +18,7 @@ public class HeadlessProjectModel private final SelectionModel< Spot, Link > selectionModel; - HeadlessProjectModel( + DefaultMinimalProjectModel( final Model model, final SharedBigDataViewerData sharedBdvData, final SelectionModel< Spot, Link > selectionModel ) { @@ -24,21 +27,24 @@ public class HeadlessProjectModel this.selectionModel = selectionModel; } - public HeadlessProjectModel( final ProjectModel projectModel ) + public DefaultMinimalProjectModel( final ProjectModel projectModel ) { this( projectModel.getModel(), projectModel.getSharedBdvData(), projectModel.getSelectionModel() ); } + @Override public Model getModel() { return model; } + @Override public SharedBigDataViewerData getSharedBdvData() { return sharedBdvData; } + @Override public SelectionModel< Spot, Link > getSelectionModel() { return selectionModel; diff --git a/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java b/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java index 122f2e1..52e611a 100644 --- a/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java +++ b/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java @@ -126,7 +126,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) private final AbstractNamedAction fitSelectedVerticesAction; - private HeadlessProjectModel headlessProjectModel; + private MinimalProjectModel minimalProjectModel; public FitEllipsoidPlugin() { @@ -136,12 +136,12 @@ public FitEllipsoidPlugin() @Override public void setAppPluginModel( final ProjectModel projectModel ) { - this.headlessProjectModel = new HeadlessProjectModel( projectModel ); + this.minimalProjectModel = new DefaultMinimalProjectModel( projectModel ); } - void setHeadlessProjectModel( final HeadlessProjectModel headlessProjectModel ) + void setHeadlessProjectModel( final MinimalProjectModel minimalProjectModel ) { - this.headlessProjectModel = headlessProjectModel; + this.minimalProjectModel = minimalProjectModel; } @Override @@ -169,7 +169,7 @@ void fitSelectedVertices() { // TODO: parameters to select which source to act on final int sourceIndex = 0; - final SourceAndConverter< ? > source = headlessProjectModel.getSharedBdvData().getSources().get( sourceIndex ); + final SourceAndConverter< ? > source = minimalProjectModel.getSharedBdvData().getSources().get( sourceIndex ); if ( !( source.getSpimSource().getType() instanceof RealType ) ) throw new IllegalArgumentException( "Expected RealType image source" ); process( Cast.unchecked( source ) ); @@ -184,7 +184,7 @@ void fitSelectedVertices() @SuppressWarnings( "unused" ) private < T extends RealType< T > > void process( final SourceAndConverter< T > source ) { - final RefSet< Spot > vertices = headlessProjectModel.getSelectionModel().getSelectedVertices(); + final RefSet< Spot > vertices = minimalProjectModel.getSelectionModel().getSelectedVertices(); if ( vertices.isEmpty() ) System.err.println( "no vertex selected" ); @@ -198,7 +198,7 @@ private < T extends RealType< T > > void process( final SourceAndConverter< T > final ArrayList< Spot > threadSafeVertices = asArrayList( vertices ); // NB: RefSet is not thread-safe for iteration. final int totalTasks = vertices.size(); - final ReentrantReadWriteLock.WriteLock writeLock = headlessProjectModel.getModel().getGraph().getLock().writeLock(); + final ReentrantReadWriteLock.WriteLock writeLock = minimalProjectModel.getModel().getGraph().getLock().writeLock(); Parallelization.getTaskExecutor().forEach( threadSafeVertices, spot -> { // loop over vertices in parallel using multiple threads @@ -258,7 +258,7 @@ private < T extends RealType< T > > void process( final SourceAndConverter< T > // set undo point if at least one spot was fitted if ( found.get() > 0 ) - headlessProjectModel.getModel().setUndoPoint(); + minimalProjectModel.getModel().setUndoPoint(); } private static ArrayList< Spot > asArrayList( final RefSet< Spot > vertices ) @@ -410,7 +410,7 @@ private void showBdvDebugWindow( final SourceAndConverter< ? > source, final dou { final BdvStackSource< FloatType > inputSource = BdvFunctions.show( input, "FloatType input", Bdv.options().sourceTransform( sourceToGlobal ) ); - final ConverterSetups setups = headlessProjectModel.getSharedBdvData().getConverterSetups(); + final ConverterSetups setups = minimalProjectModel.getSharedBdvData().getConverterSetups(); final ConverterSetup cs = setups.getConverterSetup( source ); final Bounds bounds = setups.getBounds().getBounds( cs ); inputSource.setDisplayRange( cs.getDisplayRangeMin(), cs.getDisplayRangeMax() ); diff --git a/src/main/java/org/mastodon/mamut/fitting/MinimalProjectModel.java b/src/main/java/org/mastodon/mamut/fitting/MinimalProjectModel.java new file mode 100644 index 0000000..03de4dd --- /dev/null +++ b/src/main/java/org/mastodon/mamut/fitting/MinimalProjectModel.java @@ -0,0 +1,35 @@ +package org.mastodon.mamut.fitting; + +import org.mastodon.mamut.model.Link; +import org.mastodon.mamut.model.Model; +import org.mastodon.mamut.model.Spot; +import org.mastodon.model.SelectionModel; +import org.mastodon.views.bdv.SharedBigDataViewerData; + +/** + * A minimal interface to the data model of a Mastodon project.

+ * This interface facilities testing of the ellipsoid fitting, since it allows to circumvent the fact that the {@link org.mastodon.mamut.ProjectModel} creates GUI components on instantiation.

+ * It contains accessor methods to parts of the {@link org.mastodon.mamut.ProjectModel} that are safe to be used in a headless way. + * + * @author Stefan Hahmann + */ +public interface MinimalProjectModel +{ + /** + * Gets the {@link Model} of the project, i.e. all data tracking related data such as the graph and feature. + * @return the model. + */ + Model getModel(); + + /** + * Gets the {@link SharedBigDataViewerData} of the project, i.e. the image data. + * @return the shared BDV data. + */ + SharedBigDataViewerData getSharedBdvData(); + + /** + * Gets the {@link SelectionModel} of the project, i.e. the selection of spots and links. + * @return the selection model. + */ + SelectionModel< Spot, Link > getSelectionModel(); +} diff --git a/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java b/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java index 28dce73..7fb7388 100644 --- a/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java +++ b/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java @@ -74,7 +74,7 @@ public class ArtificialData private final Context context; - private final HeadlessProjectModel headlessProjectModel; + private final MinimalProjectModel minimalProjectModel; private final RefObjectMap< Spot, Ellipsoid > ellipsoids; @@ -99,7 +99,7 @@ public ArtificialData( final Context context ) } SharedBigDataViewerData sharedBDVData = asSharedBdvDataXyz( image ); SelectionModel< Spot, Link > selectionModel = new DefaultSelectionModel<>( model.getGraph(), model.getGraphIdBimap() ); - headlessProjectModel = new HeadlessProjectModel( model, sharedBDVData, selectionModel ); + minimalProjectModel = new DefaultMinimalProjectModel( model, sharedBDVData, selectionModel ); selectAllVerticies(); } @@ -119,8 +119,8 @@ private static SharedBigDataViewerData asSharedBdvDataXyz( final Img< FloatType private void selectAllVerticies() { - for ( final Spot vertex : headlessProjectModel.getModel().getGraph().vertices() ) - headlessProjectModel.getSelectionModel().setSelected( vertex, true ); + for ( final Spot vertex : minimalProjectModel.getModel().getGraph().vertices() ) + minimalProjectModel.getSelectionModel().setSelected( vertex, true ); } private Ellipsoid randomizedEllipsoid( final double[] center ) @@ -176,12 +176,12 @@ private static AffineTransform3D transposed( final AffineTransform3D transform ) public ProjectModel getAppModel() { - return ProjectModel.create( context, headlessProjectModel.getModel(), headlessProjectModel.getSharedBdvData(), null ); + return ProjectModel.create( context, minimalProjectModel.getModel(), minimalProjectModel.getSharedBdvData(), null ); } - public HeadlessProjectModel getHeadlessProjectModel() + public MinimalProjectModel getHeadlessProjectModel() { - return headlessProjectModel; + return minimalProjectModel; } public RefObjectMap< Spot, Ellipsoid> getExpectedEllipsoids() From 2b03a0dd0c96ea25024b73a93d13bc0e7e7c721e Mon Sep 17 00:00:00 2001 From: Stefan Hahmann Date: Mon, 6 Nov 2023 11:59:11 +0100 Subject: [PATCH 5/6] Remove the interface MinimalProjectModel and rename the DefaultMinimalProjectModel to MinimalProjectModel. * Splitting into implementation and interface is not needed here. (The MinimalProjectModel is for now only meant for testing not part of a plugin API.) --- .../fitting/DefaultMinimalProjectModel.java | 52 ------------------ .../mamut/fitting/FitEllipsoidPlugin.java | 4 +- .../mamut/fitting/MinimalProjectModel.java | 54 ++++++++++++------- .../mamut/fitting/ArtificialData.java | 2 +- .../mamut/fitting/FitEllipsoidPluginTest.java | 2 +- 5 files changed, 40 insertions(+), 74 deletions(-) delete mode 100644 src/main/java/org/mastodon/mamut/fitting/DefaultMinimalProjectModel.java diff --git a/src/main/java/org/mastodon/mamut/fitting/DefaultMinimalProjectModel.java b/src/main/java/org/mastodon/mamut/fitting/DefaultMinimalProjectModel.java deleted file mode 100644 index c758851..0000000 --- a/src/main/java/org/mastodon/mamut/fitting/DefaultMinimalProjectModel.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.mastodon.mamut.fitting; - -import org.mastodon.mamut.ProjectModel; -import org.mastodon.mamut.model.Link; -import org.mastodon.mamut.model.Model; -import org.mastodon.mamut.model.Spot; -import org.mastodon.model.SelectionModel; -import org.mastodon.views.bdv.SharedBigDataViewerData; - -/** - * A default implementation of {@link MinimalProjectModel}. - */ -public class DefaultMinimalProjectModel implements MinimalProjectModel -{ - private final Model model; - - private final SharedBigDataViewerData sharedBdvData; - - private final SelectionModel< Spot, Link > selectionModel; - - DefaultMinimalProjectModel( - final Model model, final SharedBigDataViewerData sharedBdvData, final SelectionModel< Spot, Link > selectionModel - ) - { - this.model = model; - this.sharedBdvData = sharedBdvData; - this.selectionModel = selectionModel; - } - - public DefaultMinimalProjectModel( final ProjectModel projectModel ) - { - this( projectModel.getModel(), projectModel.getSharedBdvData(), projectModel.getSelectionModel() ); - } - - @Override - public Model getModel() - { - return model; - } - - @Override - public SharedBigDataViewerData getSharedBdvData() - { - return sharedBdvData; - } - - @Override - public SelectionModel< Spot, Link > getSelectionModel() - { - return selectionModel; - } -} diff --git a/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java b/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java index 52e611a..5a106b3 100644 --- a/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java +++ b/src/main/java/org/mastodon/mamut/fitting/FitEllipsoidPlugin.java @@ -136,10 +136,10 @@ public FitEllipsoidPlugin() @Override public void setAppPluginModel( final ProjectModel projectModel ) { - this.minimalProjectModel = new DefaultMinimalProjectModel( projectModel ); + this.minimalProjectModel = new MinimalProjectModel( projectModel ); } - void setHeadlessProjectModel( final MinimalProjectModel minimalProjectModel ) + void setMinimalProjectModel( final MinimalProjectModel minimalProjectModel ) { this.minimalProjectModel = minimalProjectModel; } diff --git a/src/main/java/org/mastodon/mamut/fitting/MinimalProjectModel.java b/src/main/java/org/mastodon/mamut/fitting/MinimalProjectModel.java index 03de4dd..ff09ed8 100644 --- a/src/main/java/org/mastodon/mamut/fitting/MinimalProjectModel.java +++ b/src/main/java/org/mastodon/mamut/fitting/MinimalProjectModel.java @@ -1,5 +1,6 @@ package org.mastodon.mamut.fitting; +import org.mastodon.mamut.ProjectModel; import org.mastodon.mamut.model.Link; import org.mastodon.mamut.model.Model; import org.mastodon.mamut.model.Spot; @@ -13,23 +14,40 @@ * * @author Stefan Hahmann */ -public interface MinimalProjectModel +public class MinimalProjectModel { - /** - * Gets the {@link Model} of the project, i.e. all data tracking related data such as the graph and feature. - * @return the model. - */ - Model getModel(); - - /** - * Gets the {@link SharedBigDataViewerData} of the project, i.e. the image data. - * @return the shared BDV data. - */ - SharedBigDataViewerData getSharedBdvData(); - - /** - * Gets the {@link SelectionModel} of the project, i.e. the selection of spots and links. - * @return the selection model. - */ - SelectionModel< Spot, Link > getSelectionModel(); + private final Model model; + + private final SharedBigDataViewerData sharedBdvData; + + private final SelectionModel< Spot, Link > selectionModel; + + MinimalProjectModel( + final Model model, final SharedBigDataViewerData sharedBdvData, final SelectionModel< Spot, Link > selectionModel + ) + { + this.model = model; + this.sharedBdvData = sharedBdvData; + this.selectionModel = selectionModel; + } + + public MinimalProjectModel( final ProjectModel projectModel ) + { + this( projectModel.getModel(), projectModel.getSharedBdvData(), projectModel.getSelectionModel() ); + } + + public Model getModel() + { + return model; + } + + public SharedBigDataViewerData getSharedBdvData() + { + return sharedBdvData; + } + + public SelectionModel< Spot, Link > getSelectionModel() + { + return selectionModel; + } } diff --git a/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java b/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java index 7fb7388..d8a4c07 100644 --- a/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java +++ b/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java @@ -99,7 +99,7 @@ public ArtificialData( final Context context ) } SharedBigDataViewerData sharedBDVData = asSharedBdvDataXyz( image ); SelectionModel< Spot, Link > selectionModel = new DefaultSelectionModel<>( model.getGraph(), model.getGraphIdBimap() ); - minimalProjectModel = new DefaultMinimalProjectModel( model, sharedBDVData, selectionModel ); + minimalProjectModel = new MinimalProjectModel( model, sharedBDVData, selectionModel ); selectAllVerticies(); } diff --git a/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java b/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java index 689740e..8ed0cf7 100644 --- a/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java +++ b/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java @@ -57,7 +57,7 @@ public void testFitEllipsoidPlugin() { final ArtificialData data = new ArtificialData( new Context() ); final StopWatch watch = StopWatch.createAndStart(); final FitEllipsoidPlugin plugin = new FitEllipsoidPlugin(); - plugin.setHeadlessProjectModel( data.getHeadlessProjectModel() ); + plugin.setMinimalProjectModel( data.getHeadlessProjectModel() ); plugin.fitSelectedVertices(); System.out.println( watch ); final int success = countCorrectEllipsoids( data ); From b273841c7b1455cf963a232c5f0270820b0a3339 Mon Sep 17 00:00:00 2001 From: Stefan Hahmann Date: Thu, 30 Nov 2023 11:46:39 +0100 Subject: [PATCH 6/6] Rename method getHeadlessProjectModel to getMinimalProjectModel() in class ArtificialData --- .../java/org/mastodon/mamut/fitting/ArtificialData.java | 2 +- .../org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java b/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java index d8a4c07..82583b5 100644 --- a/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java +++ b/src/test/java/org/mastodon/mamut/fitting/ArtificialData.java @@ -179,7 +179,7 @@ public ProjectModel getAppModel() return ProjectModel.create( context, minimalProjectModel.getModel(), minimalProjectModel.getSharedBdvData(), null ); } - public MinimalProjectModel getHeadlessProjectModel() + public MinimalProjectModel getMinimalProjectModel() { return minimalProjectModel; } diff --git a/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java b/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java index 8ed0cf7..bede6f8 100644 --- a/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java +++ b/src/test/java/org/mastodon/mamut/fitting/FitEllipsoidPluginTest.java @@ -57,11 +57,11 @@ public void testFitEllipsoidPlugin() { final ArtificialData data = new ArtificialData( new Context() ); final StopWatch watch = StopWatch.createAndStart(); final FitEllipsoidPlugin plugin = new FitEllipsoidPlugin(); - plugin.setMinimalProjectModel( data.getHeadlessProjectModel() ); + plugin.setMinimalProjectModel( data.getMinimalProjectModel() ); plugin.fitSelectedVertices(); System.out.println( watch ); final int success = countCorrectEllipsoids( data ); - ModelGraph graph = data.getHeadlessProjectModel().getModel().getGraph(); + ModelGraph graph = data.getMinimalProjectModel().getModel().getGraph(); assertEquals( "Not all ellipsoids were fitted correctly.", graph.vertices().size(), success ); } @@ -69,7 +69,7 @@ private static int countCorrectEllipsoids( final ArtificialData data ) { int success = 0; final RefObjectMap< Spot, Ellipsoid > expectedEllipsoids = data.getExpectedEllipsoids(); - for ( final Spot spot : data.getHeadlessProjectModel().getModel().getGraph().vertices() ) + for ( final Spot spot : data.getMinimalProjectModel().getModel().getGraph().vertices() ) { final Ellipsoid actualEllipsoid = asEllipsoid( spot ); final Ellipsoid expectedEllipsoid = expectedEllipsoids.get( spot );