## Compucell3D files for ## "3D multi-cell simulation of tumor growth and angiogenesis." ## Shirinifard A, Gens JS, Zaitlen BL, Poplawski NJ, Swat M, Glazier JA. ## PLoS One. 2009 Oct 16;4(10):e7190. ## ## http://www.ncbi.nlm.nih.gov/pubmed/19834621 ## http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2760204/ ## ## Tumor growth and angiogenesis computational model ## Authors: ## Shirinifard A, Gens JS, Zaitlen BL, Poplawski NJ, Swat M, Glazier JA. ## Indiana University, Bloomington ## Computational Platform: ## CompuCell3D CC3D ## ## Foundational Model of Anatomy FMA: ## GO:0001525 angiogenesis ## GO:0045766 activation of angiogenesis ## ## Gene Ontology GO: ## GO:0010573 VEGF production ## GO:0051301 cell division ## GO:0008219 cell death necrosis ## GO:0016049 cell growth ## GO:0071456 "cellular response to hypoxia" "cellular response to hypoxic stress" ## GO:0001666 "response to hypoxia" ## GO:0007067 mitosis ## ## Chemical Entities of Biological Interest ChEBI: ## CHEBI:15379 oxygen dioxygen ## ## Molecular Interactions MI: ## MI:2111 "diffusion coeff" "diffusion coefficient" ## ## Protein Ontology PRO: ## PRO:000017284 VEGF-A ## ## Mammalian Phenotype MA: ## MP:0005039 hypoxia ## ## EMBRACE Ontology for Data and Methods EDAM: ## EDAM:0000950 Biological model ## ## Medical Subject Heading MeSH: ## MeSH:C04:Neoplasms neoplasm ## MeSH:C23.550.589.500 Neovascularization, Pathologic ## MeSH:G09.330.190.751 Neovascularization, Physiologic ## MeSH:E05.599 Models, Theoretical ## MeSH:E05.599.395 Models, Biological ## MeSH:L01.224.160 Computer Simulation ## ## Computational Platform: ## CompuCell3D CC3D ## cellular potts model ## ## HERBS AND JIMS BIG DATA AND COMPUTATIONAL MODEL REPOSITORY ## Indiana University Bloomington ## University of Washington ## ## Three python scripts, delineated by ++++++..., for CC3D are included below; ## angio_growth_08052009_01_45_36.py ## angio_growth_plugins_08052009_01_45_36.py ## angio_growth_steppables_08052009_01_45_36.py ## ##++++++++++++++++++++++++++++++ ##angio_growth_08052009_01_45_36.py ##++++++++++++++++++++++++++++++ #### #### The simulation code is compatible with CompuCell3D ver 3.3.1 #### import sys from os import environ import string sys.path.append(environ["PYTHON_MODULE_PATH"]) # import CompuCellSetup sim,simthread = CompuCellSetup.getCoreSimulationObjects() #Create extra player fields here or add attributes pyAttributeAdder,listAdder=CompuCellSetup.attachListToCells(sim) CompuCellSetup.initializeSimulationObjects(sim,simthread) # ################## ########## PLUGINS ################## # import CompuCell from angio_growth_plugins_08052009_01_45_36 import * changeWatcherRegistry=CompuCellSetup.getChangeWatcherRegistry(sim) stepperRegistry=CompuCellSetup.getStepperRegistry(sim) mitPy=MitosisPyPlugin(sim,changeWatcherRegistry,stepperRegistry) #### seting doubling volumes for normal, hypoxic, ActiveNeovascular, InactiveNeovascular doublingVolumeDict = {1:54,2:54,4:80,6:80} mitPy.setCellDoublingVolume(doublingVolumeDict) # ################## ########## STEPPABLES ################## # from PySteppables import SteppableRegistry steppableRegistry=SteppableRegistry() from angio_growth_steppables_08052009_01_45_36 import * #sim,frequency,areaThresh,nutrientThresh,necroticThresh volumeParamSteppable=VolumeParamSteppable(sim,1,1,5,1) steppableRegistry.registerSteppable(volumeParamSteppable) # ################## ########## COMPUCELL3D LOOPS ################## # CompuCellSetup.mainLoop(sim,simthread,steppableRegistry) ##++++++++++++++++++++++++++++++ ##angio_growth_plugins_08052009_01_45_36.py ##++++++++++++++++++++++++++++++ #### #### The simulation code is compatible with CompuCell3D ver 3.3.1 #### from CompuCell import MitosisSimplePlugin from PyPlugins import * from PySteppables import CellList from CompuCell import NeighborFinderParams import time,sys class MitosisPyPluginBase(StepperPy,Field3DChangeWatcherPy): def __init__(self,_simulator,_changeWatcherRegistry,_stepperRegistry): Field3DChangeWatcherPy.__init__(self,_changeWatcherRegistry) self.simulator=_simulator self.mitosisPlugin=MitosisSimplePlugin() self.mitosisPlugin.setPotts(self.simulator.getPotts()) self.mitosisPlugin.turnOn() self.mitosisPlugin.init(self.changeWatcher.sim) self.counter=0 self.mitosisFlag=0 self.doublingVolumeDict=0 _changeWatcherRegistry.registerPyChangeWatcher(self) _stepperRegistry.registerPyStepper(self) def setPotts(self,potts): self.mitosisPlugin.setPotts(potts) def setDoublingVolume(self,_doublingVolume): self.doublingVolume=_doublingVolume; self.mitosisPlugin.setDoublingVolume(self.doublingVolume) def setCellDoublingVolume(self,_doublingVolumeDict): self.doublingVolumeDict=_doublingVolumeDict; for i in self.doublingVolumeDict.keys(): print self.doublingVolumeDict[i] def field3DChange(self): cell = self.changeWatcher.newCell if cell and self.doublingVolumeDict.has_key(cell.type) and cell.volume>self.doublingVolumeDict[cell.type]: print "Type: ", cell.type, " Doubling Volume: ", self.doublingVolumeDict[cell.type], " Current Volume: ", cell.volume self.setDoublingVolume(self.doublingVolumeDict[cell.type]) self.mitosisPlugin.field3DChange(self.changeWatcher.changePoint,self.changeWatcher.newCell,self.changeWatcher.newCell) self.mitosisFlag=1 def step(self): if self.mitosisFlag: print "ABOUT TO DO MITOSIS" self.mitosisFlag=self.mitosisPlugin.doMitosis() self.childCell=self.mitosisPlugin.getChildCell() self.parentCell=self.mitosisPlugin.getParentCell() self.updateAttributes() self.mitosisFlag=0 def updateAttributes(self): self.childCell.targetVolume=self.parentCell.targetVolume self.childCell.lambdaVolume=self.parentCell.lambdaVolume self.childCell.type=self.parentCell.type class MitosisPyPlugin(MitosisPyPluginBase): def __init__(self , _simulator , _changeWatcherRegistry , _stepperRegistry): MitosisPyPluginBase.__init__(self,_simulator,_changeWatcherRegistry,_stepperRegistry) def updateAttributes(self): ## Mitosis of normal tumor and hypoxic cells if self.parentCell.type==1 or self.parentCell.type==2: self.childCell.type=1 self.childCell.targetVolume=33 self.childCell.lambdaVolume=10 self.childCell.targetSurface=90 self.childCell.lambdaSurface=2 self.parentCell.targetVolume=33 self.parentCell.lambdaVolume=10 self.parentCell.targetSurface=90 self.parentCell.lambdaSurface=2 ## Mitosis of ActiveNeovascular and InactiveNeovascular cells if self.parentCell.type==6 or self.parentCell.type==4: self.childCell.type=4 self.childCell.targetVolume=60 self.childCell.lambdaVolume=13 self.childCell.targetSurface=150 self.childCell.lambdaSurface=3 self.parentCell.targetVolume=60 self.parentCell.lambdaVolume=13 self.parentCell.targetSurface=150 self.parentCell.lambdaSurface=3 ##+++++++++++++++++++++++++ ## angio_growth_steppables_08052009_01_45_36.py ##+++++++++++++++++++++++++ #### #### The simulation code is compatible with CompuCell3D ver 3.3.1 #### from PySteppables import * import CompuCell import sys import time class VolumeParamSteppable(SteppablePy): def __init__(self,_simulator,_frequency=1,_areaThresh=0,_nutrientThresh=0,_necroticThresh=0): SteppablePy.__init__(self,_frequency) self.simulator=_simulator self.inventory=self.simulator.getPotts().getCellInventory() self.cellList=CellList(self.inventory) self.nTrackerPlugin=CompuCell.getNeighborTrackerPlugin() self.areaThresh = _areaThresh self.nutrientThresh = _nutrientThresh self.necroticThresh = _necroticThresh self.fieldNameNeoVascular = 'VEGF2' self.fieldNameNormal = 'Oxygen' #self.output_file = open("CellDiffusionData_08052009_01_45_36.txt",'w') def start(self): for cell in self.cellList: if cell.type==4 or cell.type==5 or cell.type==6: cell.targetVolume=60 cell.lambdaVolume=13.0 cell.targetSurface=150 cell.lambdaSurface=3.0 else: cell.targetVolume=33.0 cell.lambdaVolume=10.0 cell.targetSurface=90.0 cell.lambdaSurface=2 def step(self,mcs): fieldNeoVasc=CompuCell.getConcentrationField(self.simulator,self.fieldNameNeoVascular) fieldMalig=CompuCell.getConcentrationField(self.simulator,self.fieldNameNormal) #print mcs for cell in self.cellList: # Inactive neovascular differentiation if cell.type == 6: totalArea = 0 pt=CompuCell.Point3D() pt.x=int(round(cell.xCM/max(float(cell.volume),0.001))) pt.y=int(round(cell.yCM/max(float(cell.volume),0.001))) pt.z=int(round(cell.zCM/max(float(cell.volume),0.001))) concentration=fieldNeoVasc.get(pt) if concentration>0.5: cellNeighborList=CellNeighborListAuto(self.nTrackerPlugin,cell) for neighborSurfaceData in cellNeighborList: #Check to ensure cell neighbor is not medium if neighborSurfaceData.neighborAddress: if neighborSurfaceData.neighborAddress.type == 5 or neighborSurfaceData.neighborAddress.type == 6 or neighborSurfaceData.neighborAddress.type == 7: #sum up common surface area of cell with its neighbors totalArea+=neighborSurfaceData.commonSurfaceArea #print "concentration: ", concentration," commonSurfaceArea:",neighborSurfaceData.commonSurfaceArea print cell.type,totalArea if totalArea < 70: #Growth rate equation #print cell.type,"##surface area",cell.surface,"##cell volume:",cell.volume,"##cell target volume:",cell.targetVolume,"##common surface area:",totalArea cell.targetVolume+=0.06*concentration/(0.5 + concentration) cell.targetSurface+=0.15*concentration/(0.5 + concentration) #print 0.02*concentration/(0.5 + concentration)+0.04 ## Active neovascular growth if cell.type == 4: totalArea = 0 pt=CompuCell.Point3D() pt.x=int(round(cell.xCM/max(float(cell.volume),0.00000001))) pt.y=int(round(cell.yCM/max(float(cell.volume),0.00000001))) pt.z=int(round(cell.zCM/max(float(cell.volume),0.00000001))) concentration=fieldNeoVasc.get(pt) if concentration>0.5: cellNeighborList=CellNeighborListAuto(self.nTrackerPlugin,cell) for neighborSurfaceData in cellNeighborList: #Check to ensure cell neighbor is not medium if neighborSurfaceData.neighborAddress: if neighborSurfaceData.neighborAddress.type == 5 or neighborSurfaceData.neighborAddress.type == 7 or neighborSurfaceData.neighborAddress.type == 6: #sum up common surface area of cell with its neighbors totalArea+=neighborSurfaceData.commonSurfaceArea #print "concentration: ", concentration," commonSurfaceArea:",neighborSurfaceData.commonSurfaceArea #print cell.type,totalArea if totalArea < 50: #Growth rate equation #print cell.type,"##surface area",cell.surface,"##cell volume:",cell.volume,"##cell target volume:",cell.targetVolume,"##common surface area:",totalArea cell.targetVolume+=0.06*concentration/(0.5 + concentration) cell.targetSurface+=0.15*concentration/(0.5 + concentration) ##print 0.02*concentration/(0.5 + concentration)+0.04 #Malignat and Hypoxic Cells growth if cell.type == 1 or cell.type == 2: #print cell.volume pt=CompuCell.Point3D() pt.x=int(round(cell.xCM/max(float(cell.volume),0.001))) pt.y=int(round(cell.yCM/max(float(cell.volume),0.001))) pt.z=int(round(cell.zCM/max(float(cell.volume),0.001))) #self.output_file.write("%f %f %f " %(cell.xCM/cell.volume, cell.yCM/cell.volume,cell.zCM/cell.volume)) concentration2=fieldMalig.get(pt) #switch to Hypoxic cell type if (concentration2 < self.nutrientThresh and mcs>100): cell.type=2 #switch to Necrotic cell type if (concentration2 < self.necroticThresh and mcs>100): cell.type=3 #set growth rate equation if (mcs>100): cell.targetVolume+=0.04*concentration2/(10+concentration2) cell.targetSurface+=0.12*concentration2/(10+concentration2) #Hypoxic Cells if cell.type == 2: #print " #Hypoxic Volume: ", cell.volume pt=CompuCell.Point3D() pt.x=int(round(cell.xCM/max(float(cell.volume),0.001))) pt.y=int(round(cell.yCM/max(float(cell.volume),0.001))) pt.z=int(round(cell.zCM/max(float(cell.volume),0.001))) concentration3=fieldMalig.get(pt) #switch to Necrotic cell type if (concentration3 < self.necroticThresh and mcs>100): cell.type=3 #switch to Normal cell type if (concentration3 > self.nutrientThresh): cell.type=1 #Necrotic Cells if cell.type == 3: #set growth rate equation cell.targetVolume-=0.5 cell.lambdaSurface=0 #self.output_file.write("\n")