diff --git a/pom.xml b/pom.xml index 40ade50..fad5413 100755 --- a/pom.xml +++ b/pom.xml @@ -5,14 +5,14 @@ org.scijava pom-scijava - 29.0.0-beta-2 + 37.0.0 org.morphonets cx3d - 0.0.4-SNAPSHOT + 0.1.0-SNAPSHOT jar cx3d @@ -102,25 +102,19 @@ deploy-to-scijava - 7.0.0 + 0.10.1 + 0.3.0 + 4.2.2-SNAPSHOT - 9a71de9 - f55e46b - 2d8af5b6a0 + 3.1.1 + ${flatlaf.version} - 1.9.22 - 1.4-M1 + 2.4.0 a322110ac4 - 2.2.10 - 3.2.3 - - jitpack.io - https://jitpack.io - scijava.public https://maven.scijava.org/content/groups/public @@ -133,6 +127,10 @@ grneat ${grneat.version} + + com.formdev + flatlaf + sc.iview sciview @@ -142,7 +140,27 @@ ch.qos.logback logback-classic - + + org.apache.logging.log4j + log4j-1.2-api + + + org.biojava + biojava-core + + + org.biojava + biojava-structure + + + org.biojava + biojava-modfinder + + + org.jetbrains.kotlin + kotlin-stdlib + + org.morphonets diff --git a/src/main/java/sc/iview/cx3d/SciViewCX3D.java b/src/main/java/sc/iview/cx3d/SciViewCX3D.java index 73e5586..396a659 100644 --- a/src/main/java/sc/iview/cx3d/SciViewCX3D.java +++ b/src/main/java/sc/iview/cx3d/SciViewCX3D.java @@ -1,9 +1,15 @@ package sc.iview.cx3d; -import graphics.scenery.*; +import graphics.scenery.DefaultNode; +import graphics.scenery.Group; +import graphics.scenery.Node; +import graphics.scenery.Sphere; +import graphics.scenery.Icosphere; +import graphics.scenery.attribute.material.DefaultMaterial; +import graphics.scenery.attribute.material.Material; +import graphics.scenery.primitives.Cylinder; import org.joml.Vector3f; import org.scijava.Context; -import org.scijava.ui.UIService; import sc.iview.SciView; import sc.iview.cx3d.physics.IntracellularSubstance; import sc.iview.cx3d.physics.PhysicalCylinder; @@ -28,7 +34,6 @@ public SciView getSciView() { } private Context context; - private UIService ui; private SciView sciView; private ECM ecm; @@ -45,9 +50,8 @@ public Node getCx3dGroup() { private HashMap scNodes; private HashMap volumes; - public SciViewCX3D(Context context, UIService ui, SciView sciView, ECM ecm) { + public SciViewCX3D(Context context, SciView sciView, ECM ecm) { this.context = context; - this.ui = ui; this.sciView = sciView; this.ecm = ecm; @@ -72,7 +76,7 @@ public void clear() { } public void addNewChemical(Substance substance) { - chemicals.put(substance, new Node()); + chemicals.put(substance, new DefaultNode()); } @@ -86,7 +90,13 @@ public void syncCX3D() { // Loop through all Cylinders paintPhysicalCylinders(); - // Loop through all PhysicalNodes FIXME currently this is done externally + try { + Thread.sleep(10); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + // Loop through all PhysicalNodes FIXME currently this is done externally //paintPhysicalNodes(); } @@ -154,7 +164,7 @@ private void paintPhysicalCylinders() { svCylinder.orientBetweenPoints(myNeuriteDistalEnd, myNeuriteProximalEnd, true, true); } else { svCylinder = Cylinder.betweenPoints(myNeuriteDistalEnd, myNeuriteProximalEnd, (float)aCylinder.getDiameter() * scaleFactor, 1f, 12); - Material mat = new Material(); + Material mat = new DefaultMaterial(); Vector3f col = new Vector3f(c.getRed() / 255.0f, c.getGreen() / 255.0f, c.getBlue() / 255.0f); // mat.setAmbient(new GLVector(0.1f, 0f, 0f)); // mat.setDiffuse(new GLVector(0.8f, 0.7f, 0.7f)); @@ -178,8 +188,8 @@ private void paintPhysicalCylinders() { svSphere.setVisible(true); svSphere.setPosition(myNeuriteProximalEnd); } else { - svSphere = new Sphere((float)aCylinder.getDiameter() * scaleFactor, 12); - Material mat = new Material(); + svSphere = new Sphere((float)aCylinder.getDiameter() * scaleFactor, 12, false); + Material mat = new DefaultMaterial(); Vector3f col = new Vector3f(c.getRed() / 255.0f, c.getGreen() / 255.0f, c.getBlue() / 255.0f); // mat.setAmbient(new GLVector(0.1f, 0f, 0f)); // mat.setDiffuse(new GLVector(0.8f, 0.7f, 0.7f)); @@ -258,9 +268,9 @@ private void paintPhysicalSpheres() { svSphere.setVisible(true); svSphere.setPosition(mySomaMassLocation); } else { - svSphere = new Icosphere(sphereRadius, 2); + svSphere = new Icosphere(sphereRadius, 2, false); svSphere.setVisible(false); - Material mat = new Material(); + Material mat = new DefaultMaterial(); Vector3f col = new Vector3f(c.getRed() / 255.0f, c.getGreen() / 255.0f, c.getBlue() / 255.0f); mat.setAmbient(col); mat.setDiffuse(col); diff --git a/src/main/java/sc/iview/cx3d/commands/DendriteShaftWithSpines.java b/src/main/java/sc/iview/cx3d/commands/DendriteShaftWithSpines.java index c20ddd2..6cd69cb 100644 --- a/src/main/java/sc/iview/cx3d/commands/DendriteShaftWithSpines.java +++ b/src/main/java/sc/iview/cx3d/commands/DendriteShaftWithSpines.java @@ -58,7 +58,7 @@ import sc.iview.cx3d.utilities.ConvertUtils; import static sc.iview.commands.MenuWeights.DEMO; -import static sc.iview.commands.MenuWeights.DEMO_LINES; +import static sc.iview.commands.MenuWeights.DEMO_BASIC_LINES; import static sc.iview.cx3d.utilities.Matrix.randomNoise; /** @@ -69,7 +69,7 @@ @Plugin(type = Command.class, label = "Random Branching", menuRoot = "SciView", // menu = { @Menu(label = "Demo", weight = DEMO), // @Menu(label = "Cx3D", weight = DEMO), // - @Menu(label = "Random Branching", weight = DEMO_LINES) }) + @Menu(label = "Random Branching", weight = DEMO_BASIC_LINES) }) public class DendriteShaftWithSpines implements Command { @Parameter @@ -139,7 +139,7 @@ public void run() { public static void main( String... args ) { SciView sciView = null; try { - sciView = SciView.createSciView(); + sciView = SciView.create(); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/sc/iview/cx3d/commands/GRNBranchingSWC.java b/src/main/java/sc/iview/cx3d/commands/GRNBranchingSWC.java index 4dbe3ac..e950c7f 100644 --- a/src/main/java/sc/iview/cx3d/commands/GRNBranchingSWC.java +++ b/src/main/java/sc/iview/cx3d/commands/GRNBranchingSWC.java @@ -67,7 +67,7 @@ import java.util.function.Predicate; import static sc.iview.commands.MenuWeights.DEMO; -import static sc.iview.commands.MenuWeights.DEMO_LINES; +import static sc.iview.commands.MenuWeights.DEMO_BASIC_LINES; import static sc.iview.cx3d.utilities.Matrix.randomNoise; /** @@ -78,7 +78,7 @@ @Plugin(type = Command.class, label = "Genetically-regulated Branching (SWC output)", menuRoot = "SciView", // menu = { @Menu(label = "Demo", weight = DEMO), // @Menu(label = "Cx3D", weight = DEMO), // - @Menu(label = "Genetically-regulated Branching (SWC output)", weight = DEMO_LINES) }) + @Menu(label = "Genetically-regulated Branching (SWC output)", weight = DEMO_BASIC_LINES) }) public class GRNBranchingSWC implements Command { @Parameter @@ -266,7 +266,7 @@ public static void main( String... args ) { if( useSciview ) { SciView sciView = null; try { - sciView = SciView.createSciView(); + sciView = SciView.create(); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/sc/iview/cx3d/commands/ImgNeuriteChemoAttraction.java b/src/main/java/sc/iview/cx3d/commands/ImgNeuriteChemoAttraction.java index acf48ae..cd430e7 100644 --- a/src/main/java/sc/iview/cx3d/commands/ImgNeuriteChemoAttraction.java +++ b/src/main/java/sc/iview/cx3d/commands/ImgNeuriteChemoAttraction.java @@ -21,25 +21,18 @@ package sc.iview.cx3d.commands; -import cleargl.GLVector; import graphics.scenery.Camera; -import graphics.scenery.Node; import graphics.scenery.volumes.Volume; -import net.imglib2.Interval; -import net.imglib2.RandomAccess; -import net.imglib2.RandomAccessible; -import net.imglib2.RandomAccessibleInterval; +import net.imglib2.*; +import net.imglib2.Cursor; import net.imglib2.converter.Converters; import net.imglib2.img.Img; +import net.imglib2.img.array.ArrayImgs; import net.imglib2.interpolation.randomaccess.NLinearInterpolatorFactory; import net.imglib2.realtransform.RealViews; import net.imglib2.realtransform.Scale3D; -import net.imglib2.type.numeric.ComplexType; -import net.imglib2.type.numeric.RealType; import net.imglib2.type.numeric.integer.UnsignedByteType; import net.imglib2.type.numeric.real.FloatType; -import net.imglib2.view.IntervalView; -import net.imglib2.view.MixedTransformView; import net.imglib2.view.Views; import org.joml.Vector3f; import org.scijava.io.IOService; @@ -56,8 +49,8 @@ import java.awt.*; import java.io.IOException; -import java.util.Arrays; +import static java.lang.Math.max; import static sc.iview.cx3d.utilities.Matrix.*; public class ImgNeuriteChemoAttraction extends AbstractLocalBiologyModule { @@ -79,7 +72,7 @@ public class ImgNeuriteChemoAttraction extends AbstractLocalBiologyModule { private String substanceID; - private double branchingFactor = 0.005; + private double branchingFactor = 0.0003; public ImgNeuriteChemoAttraction(String substanceID) { this.substanceID = substanceID; @@ -132,7 +125,7 @@ public void run() { scalarMult(gradientWeight, normalize(grad)), randomNoise(randomnessWeight,3)); - double speed = 5; + double speed = 50; //newStepDirection[1] = -pos[1] // Bounding positions @@ -181,7 +174,7 @@ public void run() { public static void main(String[] args) throws Exception { ECM ecm = ECM.getInstance(); ECM.setRandomSeed(0L); - Substance attractant = new Substance("A",Color.red); + Substance attractant = new Substance("A", Color.red); // OpService ops = ecm.getSciViewCX3D().getContext().service(OpService.class); // String formula = "255 - 63 * (Math.cos(0.03*p[0]) + Math.sin(0.03*p[1]) + Math.cos(0.3*p[2])) + 127"; @@ -189,22 +182,17 @@ public static void main(String[] args) throws Exception { // ops.image().equation(img, formula); IOService io = ecm.getSciViewCX3D().getContext().service(IOService.class); - RandomAccessibleInterval img = null; - try { - img = (Img) io.open("/home/kharrington/git/morphonets/cx3d/KothapalliEtAl2011_Fig5a_attractantMapMasked_stack.tif"); - } catch (IOException e) { - e.printStackTrace(); - return; - } + long[] dimensions = new long[]{50, 50, 50}; + Img img = createDistanceBasedGradientImage(dimensions, 1f); //img = (RandomAccessibleInterval)(Object)Views.translate(img, new long[]{(long) (img.dimension(0) * -0.5), (long) (img.dimension(1) * -0.5), (long) (img.dimension(2) * -0.5)}); - RandomAccessibleInterval volImg = Converters.convert(img, (a, b) -> b.set((int)(255 * a.getRealDouble())), new UnsignedByteType()); + RandomAccessibleInterval volImg = Converters.convert((RandomAccessibleInterval) img, (a, b) -> b.set((int)(255 * a.getRealDouble())), new UnsignedByteType()); System.out.println("Volume is : " + volImg.dimension(0) + " " + volImg.dimension(1) + " " + volImg.dimension(2)); Volume vol = (Volume)ecm.getSciViewCX3D().getSciView().addVolume(volImg, "circuit", new float[]{1, 10, 1}); - double transformScale = 0.1; + double transformScale = 10; vol.setScale(new Vector3f((float)transformScale, (float)transformScale, (float)transformScale).mul(2)); @@ -212,8 +200,8 @@ public static void main(String[] args) throws Exception { long[] offset = new long[]{(long) (img.dimension(0) * -0.5), (long) (img.dimension(1) * -0.5), (long) (img.dimension(2) * -0.5)}; - //final Scale3D transformScale3D = new Scale3D(transformScale, transformScale, transformScale); - final Scale3D transformScale3D = new Scale3D(1, 1, 1); + final Scale3D transformScale3D = new Scale3D(transformScale, transformScale, transformScale); + //final Scale3D transformScale3D = new Scale3D(1, 1, 1); RandomAccessible concentrationImg = RealViews.affine( Views.interpolate( @@ -252,13 +240,92 @@ public static void main(String[] args) throws Exception { System.out.println("Starting simulation"); Scheduler.simulate(); + System.out.println("Simulation complete"); } - private static void setInterval(IntervalView translate) { + static void setInterval(RandomAccessibleInterval translate) { staticInterval = translate; } - private static void setConcentrationImg(RandomAccessible concentrationImg) { + static void setConcentrationImg(RandomAccessible concentrationImg) { staticConcentrationImg = concentrationImg; } + + static Img createSphericalImage(long[] dimensions, float dotIntensity) { + Img img = ArrayImgs.floats(dimensions); + float radius = (float) Math.min(Math.min(dimensions[0], dimensions[1]), dimensions[2]) / 8f; + + // Calculate sphere centers based on dimensions + int[][] sphereCenters = new int[][]{ + {(int) (dimensions[0] * 0.25), (int) (dimensions[1] * 0.25), (int) (dimensions[2] * 0.25)}, + {(int) (dimensions[0] * 0.75), (int) (dimensions[1] * 0.25), (int) (dimensions[2] * 0.25)}, + {(int) (dimensions[0] * 0.25), (int) (dimensions[1] * 0.75), (int) (dimensions[2] * 0.25)}, + {(int) (dimensions[0] * 0.75), (int) (dimensions[1] * 0.75), (int) (dimensions[2] * 0.25)}, + {(int) (dimensions[0] * 0.25), (int) (dimensions[1] * 0.25), (int) (dimensions[2] * 0.75)}, + {(int) (dimensions[0] * 0.75), (int) (dimensions[1] * 0.25), (int) (dimensions[2] * 0.75)}, + {(int) (dimensions[0] * 0.25), (int) (dimensions[1] * 0.75), (int) (dimensions[2] * 0.75)}, + {(int) (dimensions[0] * 0.75), (int) (dimensions[1] * 0.75), (int) (dimensions[2] * 0.75)} + }; + + // Create the spheres + Cursor cursor = img.cursor(); + while (cursor.hasNext()) { + cursor.fwd(); + int x = cursor.getIntPosition(0); + int y = cursor.getIntPosition(1); + int z = cursor.getIntPosition(2); + + for (int[] center : sphereCenters) { + double distance = Math.sqrt(Math.pow(x - center[0], 2) + Math.pow(y - center[1], 2) + Math.pow(z - center[2], 2)); + if (distance <= radius) { + cursor.get().set(dotIntensity); + break; // This pixel is within at least one sphere, no need to check further + } + } + } + + return img; + } + + static Img createDistanceBasedGradientImage(long[] dimensions, float maxIntensity) { + Img img = ArrayImgs.floats(dimensions); + + // Centers of interest + int[][] centers = new int[][]{ + {(int) (dimensions[0] * 0.25), (int) (dimensions[1] * 0.25), (int) (dimensions[2] * 0.25)}, + {(int) (dimensions[0] * 0.75), (int) (dimensions[1] * 0.25), (int) (dimensions[2] * 0.25)}, + {(int) (dimensions[0] * 0.25), (int) (dimensions[1] * 0.75), (int) (dimensions[2] * 0.25)}, + {(int) (dimensions[0] * 0.75), (int) (dimensions[1] * 0.75), (int) (dimensions[2] * 0.25)}, + {(int) (dimensions[0] * 0.25), (int) (dimensions[1] * 0.25), (int) (dimensions[2] * 0.75)}, + {(int) (dimensions[0] * 0.75), (int) (dimensions[1] * 0.25), (int) (dimensions[2] * 0.75)}, + {(int) (dimensions[0] * 0.25), (int) (dimensions[1] * 0.75), (int) (dimensions[2] * 0.75)}, + {(int) (dimensions[0] * 0.75), (int) (dimensions[1] * 0.75), (int) (dimensions[2] * 0.75)} + }; + + // Iterate over each voxel to compute its intensity based on the nearest center + Cursor cursor = img.cursor(); + while (cursor.hasNext()) { + cursor.fwd(); + int x = cursor.getIntPosition(0); + int y = cursor.getIntPosition(1); + int z = cursor.getIntPosition(2); + + // Compute the distance to the nearest center and derive intensity based on that + double minDistance = Double.MAX_VALUE; + for (int[] center : centers) { + double distance = Math.sqrt(Math.pow(x - center[0], 2) + Math.pow(y - center[1], 2) + Math.pow(z - center[2], 2)); + if (distance < minDistance) { + minDistance = distance; + } + } + + // Adjust the intensity calculation as needed + float intensity = (float) (maxIntensity / (1 + minDistance)); + cursor.get().set(intensity); + } + + return img; + } + + } diff --git a/src/main/java/sc/iview/cx3d/commands/NeuriteChemoAttractionImg.java b/src/main/java/sc/iview/cx3d/commands/NeuriteChemoAttractionImg.java index b01b256..04d1028 100644 --- a/src/main/java/sc/iview/cx3d/commands/NeuriteChemoAttractionImg.java +++ b/src/main/java/sc/iview/cx3d/commands/NeuriteChemoAttractionImg.java @@ -31,8 +31,11 @@ import graphics.scenery.SceneryBase; import io.scif.SCIFIOService; import net.imagej.ImageJService; +import net.imglib2.Cursor; +import net.imglib2.RandomAccess; import net.imglib2.RandomAccessibleInterval; import net.imglib2.img.Img; +import net.imglib2.img.array.ArrayImgs; import net.imglib2.type.numeric.ComplexType; import net.imglib2.type.numeric.RealType; import net.imglib2.type.numeric.real.FloatType; @@ -40,6 +43,7 @@ import org.scijava.Context; import org.scijava.ItemIO; import org.scijava.command.Command; +import org.scijava.command.CommandService; import org.scijava.io.IOService; import org.scijava.plugin.Menu; import org.scijava.plugin.Parameter; @@ -68,18 +72,19 @@ import java.io.IOException; import static sc.iview.commands.MenuWeights.DEMO; -import static sc.iview.commands.MenuWeights.DEMO_LINES; +import static sc.iview.commands.MenuWeights.DEMO_BASIC_LINES; +import static sc.iview.cx3d.commands.ImgNeuriteChemoAttraction.createSphericalImage; import static sc.iview.cx3d.utilities.Matrix.randomNoise; /** - * Random branching demo from Cx3D + * Neurite Chemoattraction using an Img to represent the chemical gradients. * * @author Kyle Harrington */ -@Plugin(type = Command.class, label = "Random Branching", menuRoot = "SciView", // +@Plugin(type = Command.class, label = "Neurite Chemoattraction using Img", menuRoot = "SciView", // menu = { @Menu(label = "Demo", weight = DEMO), // @Menu(label = "Cx3D", weight = DEMO), // - @Menu(label = "Neurite Chemoattraction Img", weight = DEMO_LINES) }) + @Menu(label = "Neurite Chemoattraction using Img", weight = DEMO_BASIC_LINES) }) public class NeuriteChemoAttractionImg implements Command { @Parameter @@ -95,41 +100,10 @@ public class NeuriteChemoAttractionImg implements Command { private Tree tree; @Parameter(label = "Simulation end time") - private float maxTime = 5; + private float maxTime = 1; @Parameter(label = "Environment img") - private RandomAccessibleInterval img; - - public static void main( String... args ) { - SceneryBase.xinitThreads(); - - System.setProperty( "scijava.log.level:sc.iview", "debug" ); - Context context = new Context( ImageJService.class, SciJavaService.class, SCIFIOService.class, ThreadService.class); - - //UIService ui = context.service( UIService.class ); - //if( !ui.isVisible() ) ui.showUI(); - - IOService io = context.service(IOService.class); - Img img = null; - try { - img = (Img) io.open("/home/kharrington/git/cx3d-mvn/fourdots.tif"); - } catch (IOException e) { - e.printStackTrace(); - } - context.service(UIService.class).show(img); - - - // Currently Cx3D demos need to make their own SciView instance - SciViewService sciViewService = context.service( SciViewService.class ); - try { - SciView sciView = sciViewService.getOrCreateActiveSciView(); - } catch (Exception e) { - e.printStackTrace(); - } - -// CommandService commandService = context.service(CommandService.class); -// commandService.run(NeuriteChemoAttractionImg.class,true,new Object[]{}); - } + private RandomAccessibleInterval img; @Override public void run() { @@ -143,6 +117,8 @@ public void run() { ecm.addArtificialImgConcentration(attractant.getId(), img); //ecm.addArtificialGaussianConcentrationZ(attractant, 1.0, 400.0, 160.0); + ImgNeuriteChemoAttraction.setInterval(img); + ImgNeuriteChemoAttraction.setConcentrationImg(img); int nbOfAdditionalNodes = 10; for (int i = 0; i < nbOfAdditionalNodes; i++) { @@ -158,6 +134,7 @@ public void run() { System.out.println("Starting simulation"); Scheduler.simulate(); + System.out.println("Simulation complete"); // This should work for Cx3D trees Tree tree = ConvertUtils.cellToTree(c); @@ -168,6 +145,30 @@ public void run() { Viewer3D recViewer = new Viewer3D(context); recViewer.add(tree); recViewer.show(); + } + + public static void main( String... args ) { + SceneryBase.xinitThreads(); + + System.setProperty( "scijava.log.level:sc.iview", "debug" ); + Context context = new Context( ImageJService.class, SciJavaService.class, SCIFIOService.class, ThreadService.class, SNTService.class); + + // Define the dimensions of the image + long[] dimensions = new long[]{50, 50, 50}; + + Img img = createSphericalImage(dimensions, 255.0f); + + context.service(UIService.class).show(img); + + // Currently Cx3D demos need to make their own SciView instance + SciViewService sciViewService = context.service( SciViewService.class ); + try { + SciView sciView = sciViewService.getOrCreateActiveSciView(); + } catch (Exception e) { + e.printStackTrace(); + } + CommandService commandService = context.service(CommandService.class); + commandService.run(NeuriteChemoAttractionImg.class,true, new Object[]{"img",img}); } } diff --git a/src/main/java/sc/iview/cx3d/commands/RandomBranchingDemo.java b/src/main/java/sc/iview/cx3d/commands/RandomBranchingDemo.java index f78f746..d6dea40 100644 --- a/src/main/java/sc/iview/cx3d/commands/RandomBranchingDemo.java +++ b/src/main/java/sc/iview/cx3d/commands/RandomBranchingDemo.java @@ -29,15 +29,18 @@ package sc.iview.cx3d.commands; import static sc.iview.commands.MenuWeights.DEMO; -import static sc.iview.commands.MenuWeights.DEMO_LINES; +import static sc.iview.commands.MenuWeights.DEMO_BASIC_LINES; import static sc.iview.cx3d.utilities.Matrix.randomNoise; +import io.scif.SCIFIOService; +import net.imagej.ImageJService; import org.scijava.Context; import org.scijava.command.Command; import org.scijava.command.CommandService; import org.scijava.plugin.Menu; import org.scijava.plugin.Parameter; import org.scijava.plugin.Plugin; +import org.scijava.service.SciJavaService; import org.scijava.util.Colors; import graphics.scenery.SceneryBase; @@ -63,7 +66,7 @@ @Plugin(type = Command.class, label = "Random Branching", menuRoot = "SciView", // menu = { @Menu(label = "Demo", weight = DEMO), // @Menu(label = "Cx3D", weight = DEMO), // - @Menu(label = " Random Branching", weight = DEMO_LINES) }) + @Menu(label = " Random Branching", weight = DEMO_BASIC_LINES) }) public class RandomBranchingDemo implements Command { @Parameter @@ -138,7 +141,8 @@ public void run() { public static void main(String... args) { SceneryBase.xinitThreads(); System.setProperty( "scijava.log.level:sc.iview", "debug" ); - final ImageJ ij = new ImageJ(); + Context context = new Context(ImageJService.class, SciJavaService.class, SCIFIOService.class, SNTService.class); + final ImageJ ij = new ImageJ(context); ij.ui().showUI(); final CommandService cmdService = ij.context().getService(CommandService.class); cmdService.run(RandomBranchingDemo.class, true); diff --git a/src/main/java/sc/iview/cx3d/commands/RandomBranchingSWC.java b/src/main/java/sc/iview/cx3d/commands/RandomBranchingSWC.java index 705c995..102008c 100644 --- a/src/main/java/sc/iview/cx3d/commands/RandomBranchingSWC.java +++ b/src/main/java/sc/iview/cx3d/commands/RandomBranchingSWC.java @@ -64,8 +64,7 @@ import java.util.ArrayList; import java.util.List; -import static sc.iview.commands.MenuWeights.DEMO; -import static sc.iview.commands.MenuWeights.DEMO_LINES; +import static sc.iview.commands.MenuWeights.*; import static sc.iview.cx3d.utilities.Matrix.randomNoise; /** @@ -77,7 +76,7 @@ menuRoot = "SciView", // menu = { @Menu(label = "Demo", weight = DEMO), // @Menu(label = "Cx3D", weight = DEMO), // - @Menu(label = "Random Branching (SWC output)", weight = DEMO_LINES) }) + @Menu(label = "Random Branching (SWC output)", weight = DEMO_BASIC_LINES) }) public class RandomBranchingSWC implements Command { @Parameter @@ -217,7 +216,7 @@ public void run() { } - System.exit(0); +// System.exit(0); // tree.merge(realtree); // sntService.initialize(true); // sntService.getPathAndFillManager().clear(); @@ -229,7 +228,7 @@ public static void main( String... args ) { SceneryBase.xinitThreads(); System.setProperty( "scijava.log.level:sc.iview", "debug" ); - Context context = new Context( ImageJService.class, SciJavaService.class, SCIFIOService.class, ThreadService.class); + Context context = new Context( ImageJService.class, SciJavaService.class, SCIFIOService.class, ThreadService.class, SNTService.class); UIService ui = context.service( UIService.class ); if( !ui.isVisible() ) ui.showUI(); diff --git a/src/main/java/sc/iview/cx3d/commands/SNT/GRNeuriteInImg.java b/src/main/java/sc/iview/cx3d/commands/SNT/GRNeuriteInImg.java index ab0e246..7fe1b5b 100644 --- a/src/main/java/sc/iview/cx3d/commands/SNT/GRNeuriteInImg.java +++ b/src/main/java/sc/iview/cx3d/commands/SNT/GRNeuriteInImg.java @@ -87,7 +87,7 @@ import java.util.Map; import static sc.iview.commands.MenuWeights.DEMO; -import static sc.iview.commands.MenuWeights.DEMO_LINES; +import static sc.iview.commands.MenuWeights.DEMO_BASIC_LINES; import static sc.iview.cx3d.commands.FRAChemoAttractionNeurite.gaussianConcentration; import static sc.iview.cx3d.utilities.Matrix.randomNoise; @@ -99,7 +99,7 @@ @Plugin(type = Command.class, label = "Genetically-regulated Neurite in Img (SWC output)", menuRoot = "SciView", // menu = { @Menu(label = "Demo", weight = DEMO), // @Menu(label = "Cx3D", weight = DEMO), // - @Menu(label = "Genetically-regulated Neurite in Img (SWC output)", weight = DEMO_LINES) }) + @Menu(label = "Genetically-regulated Neurite in Img (SWC output)", weight = DEMO_BASIC_LINES) }) public class GRNeuriteInImg implements Command { @Parameter @@ -396,7 +396,7 @@ public static void main( String... args ) { if( useSciview ) { SciView sciView = null; try { - sciView = SciView.createSciView(); + sciView = SciView.create(); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/main/java/sc/iview/cx3d/sciview/Spine.java b/src/main/java/sc/iview/cx3d/sciview/Spine.java index 6f4aaf1..1b2f11a 100644 --- a/src/main/java/sc/iview/cx3d/sciview/Spine.java +++ b/src/main/java/sc/iview/cx3d/sciview/Spine.java @@ -1,17 +1,20 @@ package sc.iview.cx3d.sciview; -import cleargl.GLVector; -import graphics.scenery.Cylinder; -import graphics.scenery.Material; +import graphics.scenery.DefaultNode; +import graphics.scenery.Icosphere; import graphics.scenery.Node; import graphics.scenery.Sphere; +import graphics.scenery.attribute.material.DefaultMaterial; +import graphics.scenery.attribute.material.Material; +import graphics.scenery.primitives.Cylinder; +import org.jetbrains.annotations.NotNull; import org.joml.Vector3f; import sc.iview.cx3d.synapses.Excrescence; import sc.iview.cx3d.synapses.PhysicalSpine; import java.nio.FloatBuffer; -public class Spine extends Node { +public class Spine extends DefaultNode { public static float scaleFactor = 0.01f; public static float neckRadius = 0.01f; @@ -57,10 +60,10 @@ public static Spine createFromExcrescence(Excrescence ex) { Vector3f proximalExEnd = new Vector3f(FloatBuffer.wrap(ex.getProximalEndF())).mul(scaleFactor); spine.neck = Cylinder.betweenPoints(distalExEnd, proximalExEnd, (float)neckRadius, 1f, 5); - spine.head = new Sphere(neckRadius*2,5); + spine.head = new Sphere(neckRadius*2f,5, false); spine.head.setPosition(new Vector3f(distalExEnd)); - Material mat = new Material(); + Material mat = new DefaultMaterial(); mat.setAmbient(new Vector3f(0.0f, 0.6f, 0.1f)); mat.setDiffuse(new Vector3f(0.8f, 0.7f, 0.7f)); mat.setSpecular(new Vector3f(0.05f, 0f, 0f)); diff --git a/src/main/java/sc/iview/cx3d/simulations/ECM.java b/src/main/java/sc/iview/cx3d/simulations/ECM.java index 3b2c257..557f1c1 100644 --- a/src/main/java/sc/iview/cx3d/simulations/ECM.java +++ b/src/main/java/sc/iview/cx3d/simulations/ECM.java @@ -61,6 +61,8 @@ import java.util.Vector; import java.util.concurrent.Semaphore; +import static java.lang.Math.pow; +import static java.lang.Math.sqrt; import static sc.iview.cx3d.utilities.Matrix.add; import static sc.iview.cx3d.utilities.Matrix.randomNoise; @@ -224,8 +226,8 @@ private void configureSciview(Context context) { if (sciviewEnabled) { System.setProperty("scijava.log.level:sc.iview", "debug"); - UIService ui = context.service(UIService.class); - if (!ui.isVisible()) ui.showUI(); + //UIService ui = context.service(UIService.class); + //if (!ui.isVisible()) ui.showUI(); SciViewService sciViewService = context.service(SciViewService.class); SciView sciView = null; @@ -239,7 +241,7 @@ private void configureSciview(Context context) { sciView.getFloor().setVisible(false); - sciViewCX3D = new SciViewCX3D(context, ui, sciView, this); + sciViewCX3D = new SciViewCX3D(context, sciView, this); } } @@ -1158,7 +1160,8 @@ public double[] getGradientArtificialConcentration(String nameOfTheChemical, dou public double getGradientArtificialConcentration(Substance s, double[] position){ - return getValueArtificialConcentration(s.getId(), position); + double[] gradient = getGradientArtificialConcentration(s.getId(), position); + return sqrt(pow(gradient[0],2) + pow(gradient[1], 2) + pow(gradient[2], 2)); }