Hi Cayla,
Here are the updates to the script. Can you see if it works now?
Thanks,
Chuck
#include "biodynamo.h"
// Define a new biology module for E. Coli and S. cerevisiae that includes radiation effects
namespace bdm {
using namespace experimental; // To access experimental features if required
// Create an enum to differentiate between the two species
enum class Species { EColi, SCerevisiae };
// A custom module to simulate the effects of radiation on biological agents
struct RadiationEffect : public BaseBiologyModule {
BDM_STATELESS_BM_HEADER(RadiationEffect, BaseBiologyModule, 1);
Species species_;
RadiationEffect(Species species) : BaseBiologyModule(gAllEventIds), species_(species) {}
// This method is called each timestep and applies radiation damage
void Run(SimObject* so) override {
auto* cell = bdm_static_cast<Cell*>(so);
// Get the radiation level
double radiation_exposure = GetRadiationLevel();
// Define damage thresholds for E. Coli and S. cerevisiae
double damage_threshold_low = (species_ == Species::EColi) ? 0.05 : 0.1;
double damage_threshold_high = (species_ == Species::EColi) ? 0.3 : 0.5;
// Apply damage based on radiation exposure
if (radiation_exposure > damage_threshold_high) {
cell->RemoveFromSimulation();
} else if (radiation_exposure > damage_threshold_low) {
cell->ChangeVolume(-0.02 * cell->GetVolume());
}
}
// Simulate the radiation level based on space environment (SPE/GCR)
double GetRadiationLevel() {
double base_radiation_level = 0.05;
double spe_radiation_level = 0.25;
bool spe_event = (Simulation::GetRandom()->Uniform(0.0, 1.0) < 0.05);
return spe_event ? spe_radiation_level : base_radiation_level;
}
};
// Create the initial population of E. Coli and S. cerevisiae cells
inline int SimulateBiologicalAgentsWithRadiation(int argc, const char** argv) {
Simulation simulation(argc, argv);
for (size_t i = 0; i < 500; ++i) {
Cell* ecoli = new Cell({Simulation::GetRandom()->Uniform(0, 100),
Simulation::GetRandom()->Uniform(0, 100),
Simulation::GetRandom()->Uniform(0, 100)});
ecoli->SetDiameter(2);
ecoli->AddBiologyModule(new RadiationEffect(Species::EColi));
simulation.GetResourceManager()->AddAgent(ecoli);
}
for (size_t i = 0; i < 500; ++i) {
Cell* scerevisiae = new Cell({Simulation::GetRandom()->Uniform(0, 100),
Simulation::GetRandom()->Uniform(0, 100),
Simulation::GetRandom()->Uniform(0, 100)});
scerevisiae->SetDiameter(5);
scerevisiae->AddBiologyModule(new RadiationEffect(Species::SCerevisiae));
simulation.GetResourceManager()->AddAgent(scerevisiae);
}
simulation.GetScheduler()->Simulate(1000);
return 0;
}
} // namespace bdm
BDM_MAIN(bdm::SimulateBiologicalAgentsWithRadiation);