Public
Edited
Jun 20, 2023
1 fork
8 stars
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
function* computeConcentrations(
{
numExecutions,
numIterations,
numCells,
activatorDiffusion,
activatorRemovalRate,
activatorProductionRate,
inhibitorDiffusion,
inhibitorRemovalRate,
substanceCDiffusion,
substanceCRemovalRate,
autocatalysisSaturation,
hormoneLife,
inhibitorConstant,
boundary = "tight"
},
{ activatorX, inhibitorX, substanceCX, sourceDensity }
) {
const dac = 1 - activatorRemovalRate - 2 * activatorDiffusion;
let dbc = 1 - inhibitorRemovalRate - 2 * inhibitorDiffusion;
let hormoneConcentration = 0.5;
let lifeOfInhibitor = 0;
for (let i = 0; i <= numExecutions; i++) {
for (let j = 0; j <= numIterations; j++) {
let activatorLeftCell = activatorX[numCells],
inhibitorLeftCell = inhibitorX[numCells],
substanceCLeftCell = substanceCX[numCells];
activatorX[numCells + 1] = activatorX[1];
inhibitorX[numCells + 1] = inhibitorX[1];
substanceCX[numCells + 1] = substanceCX[1];
let bsa = 0;

for (let k = 0; k <= numCells; k++) {
const activatorConcentration = activatorX[k],
inhibitorConcentration = inhibitorX[k],
substanceCConcentration = substanceCX[k];

const saturatingSelfReinforcement =
sourceDensity[k] *
((activatorConcentration * activatorConcentration) /
(1 +
autocatalysisSaturation *
activatorConcentration *
activatorConcentration) +
0.0000001);

const activatorExchangeWithNeighbor =
activatorDiffusion * (activatorLeftCell + activatorX[k + 1]) +
saturatingSelfReinforcement /
(inhibitorConstant + inhibitorConcentration);

const inhibitorExchangeWithNeighbor =
inhibitorDiffusion * (inhibitorLeftCell + inhibitorX[k + 1]) +
saturatingSelfReinforcement;

activatorX[k] =
activatorConcentration * dac + activatorExchangeWithNeighbor;

inhibitorX[k] =
inhibitorConcentration * dbc + inhibitorExchangeWithNeighbor;

bsa = bsa + hormoneLife * activatorConcentration;

if (substanceCRemovalRate > 0) {
substanceCX[k] =
substanceCConcentration +
substanceCRemovalRate * activatorConcentration -
substanceCRemovalRate * substanceCConcentration +
substanceCDiffusion *
(substanceCLeftCell -
substanceCConcentration +
(substanceCX[k + 1] - substanceCConcentration));
}

activatorLeftCell = activatorConcentration;
inhibitorLeftCell = inhibitorConcentration;
substanceCLeftCell = substanceCConcentration;
}
hormoneConcentration =
hormoneConcentration * (1 - hormoneLife) + bsa / numCells;
lifeOfInhibitor = inhibitorRemovalRate / hormoneConcentration;
dbc = 1 - 2 * inhibitorDiffusion - lifeOfInhibitor;
}

yield {
i,
activatorX,
inhibitorX,
substanceCX
};
}
return true;
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more