saalfeldlab / paintera

GNU General Public License v2.0
99 stars 17 forks source link

3d visualize masks update mesh manager interface #383

Closed hanslovsky closed 4 years ago

hanslovsky commented 4 years ago

This PR is for keeping track of changes more easily than through the CLI before merging back into the original feature branch

hanslovsky commented 4 years ago

This will be ready to be merged soon, and subsequently #377 as well. I refactored the mesh managers quite a bit. After all, we do not need a MeshManager interface anymore because the sources are now responsible for handling events etc and they have full access to all their members, including the mesh managers.

  1. The bulk of the work happens in the AdaptiveResolutionMeshManager, formerly known as AbstractMeshManager with a few adaptations.
  2. The two current mesh managers are MeshManagerWithSingleMesh (manages a single mesh for thresholded sources and similar) and MeshManagerWithAssignmentForSegments (neuron data with fragment-segment assignments) do not implement any interfaces. They both have an AdaptiveResolutionMeshManager member and simply translate user requests into the appropriate format for that manager. This avoids inheritance and the MeshManagerWithSingleMesh can be used for pretty much any source that is a boolean mask.

As far as I can tell, most things work now. I am still testing a few things that I have not used as much while I was working on this feature. In particular, that is

Besides this ongoing testing, I will also go through AdaptiveResolutionMeshManager with @igorpisarev to optimize that class and identify potential bugs/bad design.

hanslovsky commented 4 years ago

Currently, this is not compiling with a cryptic kotlin error:

Error log

``` $ mvn clean package [INFO] Scanning for projects... [INFO] [INFO] ------------------< org.janelia.saalfeldlab:paintera >------------------ [INFO] Building Paintera 0.22.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ paintera --- [INFO] Deleting /home/hanslovskyp/workespace-intellij/paintera/paintera/target [INFO] [INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-rules) @ paintera --- [INFO] Adding ignore: module-info [INFO] Adding ignore: META-INF/versions/*/module-info [INFO] Adding ignore: org.apache.hadoop.yarn.*.package-info [INFO] Adding ignore: org.apache.spark.unused.UnusedStubClass [INFO] Adding ignore: org.hibernate.stat.ConcurrentStatisticsImpl [INFO] Adding ignore: org.junit.runner.Runner [INFO] Adding ignore: module-info [INFO] [INFO] --- build-helper-maven-plugin:3.0.0:regex-property (sanitize-version) @ paintera --- [INFO] [INFO] --- buildnumber-maven-plugin:1.4:create (default) @ paintera --- [INFO] Executing: /bin/sh -c cd '/home/hanslovskyp/workespace-intellij/paintera/paintera' && 'git' 'rev-parse' '--verify' 'HEAD' [INFO] Working directory: /home/hanslovskyp/workespace-intellij/paintera/paintera [INFO] Storing buildNumber: faa0aea8940cc050ef57544e61eee9b713ab8955 at timestamp: 1580412924035 [WARNING] Cannot get the branch information from the git repository: Detecting the current branch failed: fatal: ref HEAD is not a symbolic ref [INFO] Executing: /bin/sh -c cd '/home/hanslovskyp/workespace-intellij/paintera/paintera' && 'git' 'rev-parse' '--verify' 'HEAD' [INFO] Working directory: /home/hanslovskyp/workespace-intellij/paintera/paintera [INFO] Storing buildScmBranch: UNKNOWN [INFO] [INFO] --- scijava-maven-plugin:1.1.0:set-rootdir (set-rootdir) @ paintera --- [INFO] Setting rootdir: /home/hanslovskyp/workespace-intellij/paintera/paintera [INFO] [INFO] --- maven-resources-plugin:3.1.0:copy-resources (copy-readme-md) @ paintera --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] [INFO] --- maven-resources-plugin:3.1.0:copy-resources (copy-img) @ paintera --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 9 resources [INFO] [INFO] --- markdown-page-generator-plugin:2.1.0:generate (readme-md-to-html) @ paintera --- [INFO] Pre-processing markdown files from input directory: markdown [INFO] Process Pegdown extension options [INFO] Pegdown extension TABLES [INFO] Pegdown extension FENCED_CODE_BLOCKS [INFO] Pegdown extension SMARTYPANTS [INFO] Pegdown extension HARDWRAPS [INFO] Pegdown extension STRIKETHROUGH [INFO] Pegdown extension TASKLISTITEMS [INFO] Pegdown extension AUTOLINKS [INFO] Pegdown extension ATXHEADERSPACE [INFO] Pegdown extension options = 2359995 [INFO] Parse Markdown to HTML [INFO] [INFO] --- jacoco-maven-plugin:0.8.4:prepare-agent (jacoco-initialize) @ paintera --- [INFO] argLine set to -javaagent:/home/hanslovskyp/.m2/repository/org/jacoco/org.jacoco.agent/0.8.4/org.jacoco.agent-0.8.4-runtime.jar=destfile=/home/hanslovskyp/workespace-intellij/paintera/paintera/target/jacoco.exec [INFO] [INFO] --- build-helper-maven-plugin:3.0.0:add-source (add-source) @ paintera --- [INFO] Source directory: /home/hanslovskyp/workespace-intellij/paintera/paintera/src/main/kotlin added. [INFO] [INFO] --- build-helper-maven-plugin:3.0.0:add-test-source (add-test-source) @ paintera --- [INFO] Test Source directory: /home/hanslovskyp/workespace-intellij/paintera/paintera/src/test/kotlin added. [INFO] [INFO] --- kotlin-maven-plugin:1.3.50:kapt (kapt) @ paintera --- [ERROR] java.lang.IllegalStateException: SimpleTypeImpl should not be created for error type: ErrorScope{Error scope for class with arguments: org.jetbrains.kotlin.types.IndexedParametersSubstitution@691ad210} [ERROR : MeshGenerator] at org.jetbrains.kotlin.types.SimpleTypeImpl.(KotlinTypeFactory.kt:137) at org.jetbrains.kotlin.types.KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope(KotlinTypeFactory.kt:71) at org.jetbrains.kotlin.types.KotlinTypeFactory.simpleType(KotlinTypeFactory.kt:54) at org.jetbrains.kotlin.types.TypeSubstitutionKt.replace(TypeSubstitution.kt:141) at org.jetbrains.kotlin.types.TypeSubstitutionKt.replace(TypeSubstitution.kt:126) at org.jetbrains.kotlin.types.TypeSubstitutionKt.replace$default(TypeSubstitution.kt:118) at org.jetbrains.kotlin.kapt3.KaptAnonymousTypeTransformer.convertPossiblyAnonymousType(KaptAnonymousTypeTransformer.kt:64) at org.jetbrains.kotlin.kapt3.KaptAnonymousTypeTransformer.convertPossiblyAnonymousType(KaptAnonymousTypeTransformer.kt:61) at org.jetbrains.kotlin.kapt3.KaptAnonymousTypeTransformer.transformAnonymousType(KaptAnonymousTypeTransformer.kt:24) at org.jetbrains.kotlin.resolve.DescriptorResolver.transformAnonymousTypeIfNeeded(DescriptorResolver.java:1023) at org.jetbrains.kotlin.resolve.VariableTypeAndInitializerResolver$resolveTypeNullable$1.invoke(VariableTypeAndInitializerResolver.kt:94) at org.jetbrains.kotlin.resolve.VariableTypeAndInitializerResolver$resolveTypeNullable$1.invoke(VariableTypeAndInitializerResolver.kt:26) at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:346) at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:402) at org.jetbrains.kotlin.types.DeferredType.getDelegate(DeferredType.java:78) at org.jetbrains.kotlin.types.WrappedType.getAnnotations(KotlinType.kt:79) at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:105) at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.doForceResolveAllContents(ForceResolveUtil.java:92) at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:41) at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:51) at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:46) at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor.doForceResolveAllContents(LazyClassDescriptor.java:556) at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor.lambda$new$4(LazyClassDescriptor.java:215) at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:346) at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor.forceResolveAllContents(LazyClassDescriptor.java:544) at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.doForceResolveAllContents(ForceResolveUtil.java:75) at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:41) at org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension$doAnalysis$1.invoke(PartialAnalysisHandlerExtension.kt:68) at org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension$doAnalysis$1.invoke(PartialAnalysisHandlerExtension.kt:34) at org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension.doForEachDeclaration(PartialAnalysisHandlerExtension.kt:121) at org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension.doForEachDeclaration(PartialAnalysisHandlerExtension.kt:135) at org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension.doAnalysis(PartialAnalysisHandlerExtension.kt:63) at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.doAnalysis(Kapt3Extension.kt:146) at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:104) at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:81) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:555) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:82) at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:107) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:546) at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:177) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:164) at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:54) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:84) at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:42) at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:104) at org.jetbrains.kotlin.maven.KotlinCompileMojoBase.execCompiler(KotlinCompileMojoBase.java:237) at org.jetbrains.kotlin.maven.K2JVMCompileMojo.execCompiler(K2JVMCompileMojo.java:237) at org.jetbrains.kotlin.maven.kapt.KaptJVMCompilerMojo.execCompiler(KaptJVMCompilerMojo.java:152) at org.jetbrains.kotlin.maven.kapt.KaptJVMCompilerMojo.execCompiler(KaptJVMCompilerMojo.java:44) at org.jetbrains.kotlin.maven.KotlinCompileMojoBase.execute(KotlinCompileMojoBase.java:220) at org.jetbrains.kotlin.maven.K2JVMCompileMojo.execute(K2JVMCompileMojo.java:222) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289) at org.apache.maven.cli.MavenCli.main(MavenCli.java:193) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347) [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 15.026 s [INFO] Finished at: 2020-01-30T14:35:33-05:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.jetbrains.kotlin:kotlin-maven-plugin:1.3.50:kapt (kapt) on project paintera: Compilation failure [ERROR] java.lang.IllegalStateException: SimpleTypeImpl should not be created for error type: ErrorScope{Error scope for class with arguments: org.jetbrains.kotlin.types.IndexedParametersSubstitution@691ad210} [ERROR] [ERROR : MeshGenerator] [ERROR] at org.jetbrains.kotlin.types.SimpleTypeImpl.(KotlinTypeFactory.kt:137) [ERROR] at org.jetbrains.kotlin.types.KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope(KotlinTypeFactory.kt:71) [ERROR] at org.jetbrains.kotlin.types.KotlinTypeFactory.simpleType(KotlinTypeFactory.kt:54) [ERROR] at org.jetbrains.kotlin.types.TypeSubstitutionKt.replace(TypeSubstitution.kt:141) [ERROR] at org.jetbrains.kotlin.types.TypeSubstitutionKt.replace(TypeSubstitution.kt:126) [ERROR] at org.jetbrains.kotlin.types.TypeSubstitutionKt.replace$default(TypeSubstitution.kt:118) [ERROR] at org.jetbrains.kotlin.kapt3.KaptAnonymousTypeTransformer.convertPossiblyAnonymousType(KaptAnonymousTypeTransformer.kt:64) [ERROR] at org.jetbrains.kotlin.kapt3.KaptAnonymousTypeTransformer.convertPossiblyAnonymousType(KaptAnonymousTypeTransformer.kt:61) [ERROR] at org.jetbrains.kotlin.kapt3.KaptAnonymousTypeTransformer.transformAnonymousType(KaptAnonymousTypeTransformer.kt:24) [ERROR] at org.jetbrains.kotlin.resolve.DescriptorResolver.transformAnonymousTypeIfNeeded(DescriptorResolver.java:1023) [ERROR] at org.jetbrains.kotlin.resolve.VariableTypeAndInitializerResolver$resolveTypeNullable$1.invoke(VariableTypeAndInitializerResolver.kt:94) [ERROR] at org.jetbrains.kotlin.resolve.VariableTypeAndInitializerResolver$resolveTypeNullable$1.invoke(VariableTypeAndInitializerResolver.kt:26) [ERROR] at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:346) [ERROR] at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:402) [ERROR] at org.jetbrains.kotlin.types.DeferredType.getDelegate(DeferredType.java:78) [ERROR] at org.jetbrains.kotlin.types.WrappedType.getAnnotations(KotlinType.kt:79) [ERROR] at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:105) [ERROR] at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.doForceResolveAllContents(ForceResolveUtil.java:92) [ERROR] at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:41) [ERROR] at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:51) [ERROR] at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:46) [ERROR] at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor.doForceResolveAllContents(LazyClassDescriptor.java:556) [ERROR] at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor.lambda$new$4(LazyClassDescriptor.java:215) [ERROR] at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:346) [ERROR] at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor.forceResolveAllContents(LazyClassDescriptor.java:544) [ERROR] at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.doForceResolveAllContents(ForceResolveUtil.java:75) [ERROR] at org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil.forceResolveAllContents(ForceResolveUtil.java:41) [ERROR] at org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension$doAnalysis$1.invoke(PartialAnalysisHandlerExtension.kt:68) [ERROR] at org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension$doAnalysis$1.invoke(PartialAnalysisHandlerExtension.kt:34) [ERROR] at org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension.doForEachDeclaration(PartialAnalysisHandlerExtension.kt:121) [ERROR] at org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension.doForEachDeclaration(PartialAnalysisHandlerExtension.kt:135) [ERROR] at org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension.doAnalysis(PartialAnalysisHandlerExtension.kt:63) [ERROR] at org.jetbrains.kotlin.kapt3.AbstractKapt3Extension.doAnalysis(Kapt3Extension.kt:146) [ERROR] at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:104) [ERROR] at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:81) [ERROR] at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:555) [ERROR] at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:82) [ERROR] at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:107) [ERROR] at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:546) [ERROR] at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:177) [ERROR] at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:164) [ERROR] at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:54) [ERROR] at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:84) [ERROR] at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:42) [ERROR] at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:104) [ERROR] at org.jetbrains.kotlin.maven.KotlinCompileMojoBase.execCompiler(KotlinCompileMojoBase.java:237) [ERROR] at org.jetbrains.kotlin.maven.K2JVMCompileMojo.execCompiler(K2JVMCompileMojo.java:237) [ERROR] at org.jetbrains.kotlin.maven.kapt.KaptJVMCompilerMojo.execCompiler(KaptJVMCompilerMojo.java:152) [ERROR] at org.jetbrains.kotlin.maven.kapt.KaptJVMCompilerMojo.execCompiler(KaptJVMCompilerMojo.java:44) [ERROR] at org.jetbrains.kotlin.maven.KotlinCompileMojoBase.execute(KotlinCompileMojoBase.java:220) [ERROR] at org.jetbrains.kotlin.maven.K2JVMCompileMojo.execute(K2JVMCompileMojo.java:222) [ERROR] at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:137) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:210) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:156) [ERROR] at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:148) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:117) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:81) [ERROR] at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:56) [ERROR] at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) [ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:305) [ERROR] at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:192) [ERROR] at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:105) [ERROR] at org.apache.maven.cli.MavenCli.execute(MavenCli.java:957) [ERROR] at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:289) [ERROR] at org.apache.maven.cli.MavenCli.main(MavenCli.java:193) [ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [ERROR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [ERROR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) [ERROR] at java.lang.reflect.Method.invoke(Method.java:498) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:282) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:225) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:406) [ERROR] at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:347) [ERROR] [ERROR] [ERROR] -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException ```

This is the bisect:

1be0d52bd55851941b180001bb0367d88042d836 is the first bad commit
commit 1be0d52bd55851941b180001bb0367d88042d836
Author: Philipp Hanslovsky <hanslovskyp@janelia.hhmi.org>
Date:   Wed Jan 29 09:37:31 2020 -0500

    Simplify mesh management

 .../saalfeldlab/paintera/meshes/MeshExporter.java  |  14 +-
 .../saalfeldlab/paintera/meshes/MeshGenerator.java |  11 +-
 .../paintera/meshes/MeshGeneratorJobManager.java   |  11 +-
 .../paintera/state/IntersectingSourceState.java    |   9 +-
 .../paintera/state/ThresholdingSourceState.java    |   7 +-
 .../paintera/meshes/managed/GetBlockListFor.kt     |   7 +
 .../paintera/meshes/managed/GetMeshFor.kt          |  56 ++++++++
 .../paintera/meshes/managed/MeshManagerSettings.kt |  48 +++++++
 .../paintera/meshes/managed/MeshManagerStore.kt    |  15 +-
 .../MeshManagerWithAssignmentForSegments.kt        |   2 -
 .../meshes/managed/MeshManagerWithSingleMesh.kt    |   2 -
 .../adaptive/AdaptiveResolutionMeshManager.kt      | 152 +++++----------------
 12 files changed, 176 insertions(+), 158 deletions(-)
 create mode 100644 src/main/kotlin/org/janelia/saalfeldlab/paintera/meshes/managed/GetBlockListFor.kt
 create mode 100644 src/main/kotlin/org/janelia/saalfeldlab/paintera/meshes/managed/GetMeshFor.kt
 create mode 100644 src/main/kotlin/org/janelia/saalfeldlab/paintera/meshes/managed/MeshManagerSettings.kt
$ git bisect log
git bisect start
# bad: [faa0aea8940cc050ef57544e61eee9b713ab8955] Fix formatting
git bisect bad faa0aea8940cc050ef57544e61eee9b713ab8955
# bad: [faa0aea8940cc050ef57544e61eee9b713ab8955] Fix formatting
git bisect bad faa0aea8940cc050ef57544e61eee9b713ab8955
# good: [ca781c521aab60a3e5f06ca51bfbf608fc74ffb0] Remove interruption check from marching cubes
git bisect good ca781c521aab60a3e5f06ca51bfbf608fc74ffb0
# bad: [e91acd000c44f4668eb1e8a145843c39d0408802] Release resources when appropriate
git bisect bad e91acd000c44f4668eb1e8a145843c39d0408802
# good: [063441db4b56df85b1a225b9487c7bd2017b8cd4] Bind enable/disable toggle of intersecting state meshes to label state meshes
git bisect good 063441db4b56df85b1a225b9487c7bd2017b8cd4
# good: [3e71aef75b033fdaa1456d57b613f9af5011a75b] Pass isEnabled only as an argument for MeshSettingsNode.createTitledPane
git bisect good 3e71aef75b033fdaa1456d57b613f9af5011a75b
# good: [8ed9044483634149f05779ca4591779af3e82bd4] Re-establish mesh export button
git bisect good 8ed9044483634149f05779ca4591779af3e82bd4
# bad: [1be0d52bd55851941b180001bb0367d88042d836] Simplify mesh management
git bisect bad 1be0d52bd55851941b180001bb0367d88042d836
# first bad commit: [1be0d52bd55851941b180001bb0367d88042d836] Simplify mesh management
hanslovsky commented 4 years ago

The issue seems to be AdaptiveResolutionMeshManager.meshesAndViewerEnabledListenersInterruptGeneratorMap

private val meshesAndViewerEnabledListenersInterruptGeneratorMap = mutableMapOf<MeshGenerator<ObjectKey>, ChangeListener<Boolean>>()

introduced in 1be0d52bd55851941b180001bb0367d88042d836 Strangely, this works:

private val meshesAndViewerEnabledListenersInterruptGeneratorMap: MutableMap<MeshGenerator<ObjectKey>, ChangeListener<Boolean>> = mutableMapOf()
hanslovsky commented 4 years ago

Selecting all ids is still slow (I am testing on lauritzen block 3 with my quasi-isotropic predictions). It is not finding the ids that is slow (that takes in the order of 0.1 seconds). I will move binding/unbinding settings onto a separate non-UI thread again.

hanslovsky commented 4 years ago

I fixed updating the meshes on merge/detach actions. A remaining issue is updating the meshes after painting: The label block lookup seems to generate incorrect blocks at lower resolutions but it works fine for the first two scale levels in my CREMI example. After committing the canvas, everything looks fine for all scale levels, so it may be an issue with the MaskedSource. I will have to investigate if and what I changed there.

hanslovsky commented 4 years ago

There may be an issue with synchronization/locking:

   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.janelia.saalfeldlab.paintera.meshes.managed.adaptive.AdaptiveResolutionMeshManager.cancelAndUpdate(AdaptiveResolutionMeshManager.kt:229)
        - waiting to lock <0x000000069454b118> (a org.janelia.saalfeldlab.paintera.meshes.managed.adaptive.AdaptiveResolutionMeshManager)
        at org.janelia.saalfeldlab.paintera.meshes.managed.MeshManagerWithAssignmentForSegments$managerCancelAndUpdate$1.invalidated(MeshManagerWithAssignmentForSegments.kt:130)
        at com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:349)
        at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:81)
        at javafx.beans.property.IntegerPropertyBase.fireValueChangedEvent(IntegerPropertyBase.java:106)
        at javafx.beans.property.IntegerPropertyBase.markInvalid(IntegerPropertyBase.java:113)
        at javafx.beans.property.IntegerPropertyBase.bind(IntegerPropertyBase.java:204)
        at org.janelia.saalfeldlab.paintera.meshes.MeshSettings.bindTo(MeshSettings.kt:187)
        at org.janelia.saalfeldlab.paintera.meshes.managed.MeshManagerWithAssignmentForSegments.setupGeneratorState(MeshManagerWithAssignmentForSegments.kt:207)
        - locked <0x000000069454a128> (a org.janelia.saalfeldlab.paintera.meshes.managed.MeshManagerWithAssignmentForSegments)
        at org.janelia.saalfeldlab.paintera.meshes.managed.MeshManagerWithAssignmentForSegments.createMeshFor(MeshManagerWithAssignmentForSegments.kt:199)
        - locked <0x000000069454a128> (a org.janelia.saalfeldlab.paintera.meshes.managed.MeshManagerWithAssignmentForSegments)
        at org.janelia.saalfeldlab.paintera.meshes.managed.MeshManagerWithAssignmentForSegments.access$createMeshFor(MeshManagerWithAssignmentForSegments.kt:50)
        at org.janelia.saalfeldlab.paintera.meshes.managed.MeshManagerWithAssignmentForSegments$setMeshesToSelection$task$1.invoke(MeshManagerWithAssignmentForSegments.kt:178)
        at org.janelia.saalfeldlab.paintera.meshes.managed.MeshManagerWithAssignmentForSegments$setMeshesToSelection$task$1.invoke(MeshManagerWithAssignmentForSegments.kt:50)
        at org.janelia.saalfeldlab.paintera.meshes.managed.MeshManagerWithAssignmentForSegments$CancelableTask.run(MeshManagerWithAssignmentForSegments.kt:70)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
igorpisarev commented 4 years ago

@hanslovsky Looks like a deadlock, is there a second thread that owns the lock <0x000000069454b118> and perhaps wants to acquire <0x000000069454a128>?

hanslovsky commented 4 years ago

Thanks @igorpisarev

I have multiple ExecutorServices for binding/unbinding (setting up) the mesh generator states because they get set up in part in the AdaptiveResolutionMeshManager and in part in the mesh manager that wraps it, e.g. MeshManagerWithAssignmentForSegments. I am currently re-writing this to only set up the states inside the AdaptiveResolutionMeshManager, which will make threading and locking simpler.

hanslovsky commented 4 years ago

I will go ahead and merge/squash this into the original 3d-visualize-masks branch and continue there.

hanslovsky commented 4 years ago

I will not delete this branch for now so we can keep the commit history for a while. Eventually, this branch should be deleted.