.. _PhysiCell_java_CancerImmune_Initial_java:
Initial.java
============
.. role:: raw-html(raw)
:format: html
.. raw:: html
.. code-block:: console
import ru.biosoft.physicell.core.Model;
import ru.biosoft.physicell.core.PhysiCellUtilities;
import ru.biosoft.physicell.core.InitialCellsArranger;
import ru.biosoft.physicell.core.CellDefinition;
import ru.biosoft.physicell.core.Cell;
import ru.biosoft.physicell.biofvm.VectorUtil;
import ru.biosoft.physicell.core.standard.StandardModels;
import java.util.List;
import java.util.ArrayList;
public class Initial extends InitialCellsArranger
{
@Override
public void arrange(Model model) throws Exception
{
CellDefinition cd = model.getCellDefinition( "cancer cell" );
double cellRadius = cd.phenotype.geometry.radius;
// double cell_spacing = 0.95 * 2.0 * cell_radius;
double tumorRadius = 250;//model.getParameterDouble( "tumor_radius" );// 250.0;
boolean use2D = model.getMicroenvironment().options.simulate2D;
List positions = createSpherePositions( new double[] {750,750, 750}, cellRadius, tumorRadius, use2D );
// System.out.println( "creating " + positions.size() + " closely-packed tumor cells ... " );
double imm_mean = model.getParameterDouble( "tumor_mean_immunogenicity" );
double imm_sd = model.getParameterDouble( "tumor_immunogenicity_standard_deviation" );
for( double[] position : positions )
{
Cell pCell = Cell.createCell( cd, model, position ); // tumor cell
double oncoprotein = Math.max( 0, model.getRNG().NormalRandom( imm_mean, imm_sd ) );
pCell.customData.set( "oncoprotein", oncoprotein );
}
}
private List createSpherePositions(double[] center, double cellRadius, double sphereRadius, boolean use2D)
{
List cells = new ArrayList<>();
int xc = 0, zc = 0;
double xSpacing = cellRadius * Math.sqrt( 3 );
double ySpacing = cellRadius * 2;
double zSpacing = cellRadius * Math.sqrt( 3 );
if( use2D )
{
for( double x = -sphereRadius; x < sphereRadius; x += xSpacing, xc++ )
{
for( double y = -sphereRadius; y < sphereRadius; y += ySpacing )
{
double[] tempPoint = new double[3];
tempPoint[0] = x + ( zc % 2 ) * 0.5 * cellRadius + center[0];
tempPoint[1] = y + ( xc % 2 ) * cellRadius + center[1];
tempPoint[2] = 0;
if( VectorUtil.dist( tempPoint, center ) < sphereRadius )
{
cells.add( tempPoint );
}
}
}
}
else
{
for( double z = -sphereRadius; z < sphereRadius; z += zSpacing, zc++ )
{
for( double x = -sphereRadius; x < sphereRadius; x += xSpacing, xc++ )
{
for( double y = -sphereRadius; y < sphereRadius; y += ySpacing )
{
double[] tempPoint = new double[3];
tempPoint[0] = x + ( zc % 2 ) * 0.5 * cellRadius + center[0];
tempPoint[1] = y + ( xc % 2 ) * cellRadius + center[1];
tempPoint[2] = z + center[2];
if( VectorUtil.dist( tempPoint, center ) < sphereRadius )
{
cells.add( tempPoint );
}
}
}
}
}
return cells;
}
}