private PhysicalObject findPhysicalNode(double[] actualCoord) { PhysicalObject node = null; double distance = Double.MAX_VALUE; for (PhysicalNode pn : ECM.getInstance().physicalNodeList) { if (!pn.isAPhysicalObject()) continue; double[] coordOfPn = pn.getSoNode().getPosition(); double ypn = coordOfPn[1]; // if it is a slice view, we can exclude everyone outside of the slice if (view.representationType == View.OM_SLICE_TYPE || view.representationType == View.EM_SLICE_TYPE) { if (ypn > (view.sliceYPosition + 15) || ypn < (view.sliceYPosition - 15)) { continue; } } double[] mySomaMassLocation = Matrix.mult(view.V, coordOfPn); double[] newCoord = view.getDisplayCoord(mySomaMassLocation); double distancepn = Matrix.distance(newCoord, actualCoord); if (distancepn < distance) { distance = distancepn; node = (PhysicalObject) pn; } } return node; }
public static void main(String[] args) { // 1) Prepare the environment : // get a reference to the extracelular matrix (ECM) ECM ecm = ECM.getInstance(); // add additional PhysicalNodes (for diffusion) int nbOfAdditionalNodes = 100; for (int i = 0; i < nbOfAdditionalNodes; i++) { double[] coord = randomNoise(500, 3); ecm.getPhysicalNodeInstance(coord); } // 2) Create some artificial chemical gradients // horizontal gaussian (peak concentration, peak coordinate, variance) ecm.addArtificialGaussianConcentrationZ(new Substance("A", Color.red), 1, 300, 100); ecm.addArtificialGaussianConcentrationZ(new Substance("B", Color.blue), 1, 00, 100); ecm.addArtificialGaussianConcentrationZ(new Substance("C", Color.green), 1, -300, 100); // horizontal linerar gradient ecm.addArtificialLinearConcentrationZ(new Substance("D", Color.cyan), 1, 300, -300); // vertical gaussian ecm.addArtificialGaussianConcentrationX(new Substance("E", Color.red), 1, 0, 100); ecm.addArtificialGaussianConcentrationX(new Substance("F", Color.green), 1, 300, 100); // 3) Create a 4-uple Cell-SomaElement-PhysicalSphere-SpaceNode at the desired location double[] cellLocation = new double[] {0, 0, 0}; Cell cell = CellFactory.getCellInstance(cellLocation); cell.setColorForAllPhysicalObjects(Param.RED); // 4) Extend an axon from the cell NeuriteElement neurite = cell.getSomaElement().extendNewNeurite(new double[] {0, 0, 1}); neurite.getPhysical().setDiameter(1.0); neurite.getPhysicalCylinder().setDiameter(3); // 5) Put a movementReceptor X_Movement_Module r = new X_Movement_Module(); r.linearDiameterDecrease = 0.01; r.addAttractant("A"); neurite.addLocalBiologyModule(r); // 6) Simulate Scheduler.simulate(); }
public static void main(String[] args) { Param.NEURITE_MAX_LENGTH = 20; double pi = Math.PI; // get a 2.5D ECM ECM ecm = ECM.getInstance(); ECM.setRandomSeed(5L); ecm.setArtificialWallsForCylinders(true); ecm.setArtificialWallsForSpheres(true); ecm.setBoundaries(-10000, 10000, -10000, 10000, -5, 5); // eighteen extra PhysicalNodes : for (int i = 0; i < 12; i++) { double[] loc = concat(randomNoise(600, 2), randomNoise(100, 1)); ecm.getPhysicalNodeInstance(loc); } // set the inter object force X_Adhesive_Force nogo = new X_Adhesive_Force(); nogo.setAttractionRange(3); nogo.setAttractionStrength(5); PhysicalObject.setInterObjectForce(nogo); // generate cells int nbOfCells = 20; int minNbOfNeurites = 4; int maxNbOfNeurites = 8; for (int i = 0; i < nbOfCells; i++) { Color c = Param.X_SOLID_GRAY; double[] cellLocation = new double[] { -200 + ECM.getRandomDouble() * 400, -200 + ECM.getRandomDouble() * 400, -5 + ECM.getRandomDouble() * 10 }; if (i == 0) { c = Param.X_SOLID_RED; cellLocation = new double[] {0, 0, 0}; } Cell cell = CellFactory.getCellInstance(cellLocation); SomaElement soma = cell.getSomaElement(); PhysicalSphere sphere = soma.getPhysicalSphere(); if (i == 0) { cell.setNeuroMLType(Cell.InhibitoryCell); } else { cell.setNeuroMLType(Cell.ExcitatoryCell); } sphere.setColor(c); sphere.setAdherence(100); int nbOfNeurites = minNbOfNeurites + ((int) ((maxNbOfNeurites - minNbOfNeurites) * ECM.getRandomDouble())); for (int j = 0; j < nbOfNeurites; j++) { double angleOfAxon = pi * 2 * ECM.getRandomDouble(); double growthSpeed = 75; double probaToBranch = 0.003; double linearDiameterDecrease = 0.001; NeuriteElement ne; if (j == 0) { ne = cell.getSomaElement().extendNewNeurite(3.0, Math.PI * 0.5, angleOfAxon); ne.setIsAnAxon(true); growthSpeed = 150; probaToBranch = 0.009; linearDiameterDecrease = 0; ne.getPhysicalCylinder().setDiameter(1.5); } else if (j == 1) { ne = cell.getSomaElement() .extendNewNeurite( 3.0, Math.PI * 0.5, angleOfAxon + Math.PI - 0.5 + ECM.getRandomDouble()); ne.setIsAnAxon(false); } else { ne = cell.getSomaElement() .extendNewNeurite(3.0, Math.PI * 0.5, Math.PI * 2 * ECM.getRandomDouble()); ne.setIsAnAxon(false); } X_Bifurcation_Module br = new X_Bifurcation_Module(); br.shift = probaToBranch; ne.addLocalBiologyModule(br); X_Movement_Module mr = new X_Movement_Module(); mr.setRandomness(0.7); mr.setSpeed(growthSpeed); mr.setLinearDiameterDecrease(linearDiameterDecrease); ne.addLocalBiologyModule(mr); } } for (int i = 0; i < 350; i++) { // 350 Scheduler.simulateOneStep(); } TestSynapses.extendExcressencesAndSynapseOnEveryNeuriteElement(0.4); Exporter.saveExport(); }