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));
}