vivarium-ecoli¶
Wiring diagraph of the [Covert lab's Whole-Cell E. coli model][https://github.com/CovertLab/vivarium-ecoli]
In [1]:
import copy
from bigraph_viz import plot_bigraph
save_files = False
plot_settings = {
'dpi': '70',
'port_label_size': '12pt',
'node_label_size': '20pt',
'process_label_size': '20pt',
'label_margin': '0.1',
'undirected_edges': True,
}
if save_files:
plot_settings['out_dir'] = 'out'
plot_settings['file_format'] = 'pdf'
plot_settings['dpi'] = '4000'
E. coli core model¶
In [2]:
ecoli = {
'bulk molecules': {},
'environment': {},
'chromosome structure': {
'_type': 'process',
'inputs': {
'fragmentBases': ['bulk molecules',],
'molecules': ['bulk molecules',],
'active tfs': ['bulk molecules',],
'subunits': ['bulk molecules',],
'amino acids': ['bulk molecules',],
'active replisomes': ['unique molecules', 'active replisome'],
'oriCs': ['unique molecules', 'oriC'],
'chromosome domains': ['unique molecules', 'chromosome domain'],
'active RNAPs': ['unique molecules', 'active RNAP'],
'RNAs': ['unique molecules', 'RNA'],
'active ribosome': ['unique molecules', 'active ribosome'],
'full chromosomes': ['unique molecules', 'full chromosome'],
'promoters': ['unique molecules', 'promoter'],
'DnaA boxes': ['unique molecules', 'DnaA box']
}
},
'metabolism': {
'_type': 'process',
'inputs': {
'metabolites': ['bulk molecules',],
'catalysts': ['bulk molecules',],
'kinetics enzymes': ['bulk molecules',],
'kinetics substrates': ['bulk molecules',],
'amino acids': ['bulk molecules',],
'environment': ['environment',],
# 'polypeptide elongation': ['process state', 'polypeptide elongation'],
'amino acids total': ['bulk molecules',]
}
},
'tf binding': {
'_type': 'process',
'inputs': {
'promoters': ['unique molecules', 'promoter'],
'active tfs': ['bulk molecules',],
'active tfs total': ['bulk molecules',],
'inactive tfs total': ['bulk molecules',],
}
},
'transcript initiation': {
'_type': 'process',
'inputs': {
'environment': ['environment',],
'full chromosomes': ['unique molecules', 'full chromosome'],
'RNAs': ['unique molecules', 'RNA'],
'active RNAPs': ['unique molecules', 'active RNAP'],
'promoters': ['unique molecules', 'promoter'],
'molecules': ['bulk molecules',],
}
},
'transcript elongation': {
'_type': 'process',
'inputs': {
'environment': ['environment',],
'RNAs': ['unique molecules', 'RNA'],
'active RNAPs': ['unique molecules', 'active RNAP'],
'molecules': ['bulk molecules',],
'bulk RNAs': ['bulk molecules',],
'ntps': ['bulk molecules',],
}
},
'rna degradation': {
'_type': 'process',
'inputs': {
'charged trna': ['bulk molecules',],
'bulk RNAs': ['bulk molecules',],
'nmps': ['bulk molecules',],
'fragmentMetabolites': ['bulk molecules',],
'fragmentBases': ['bulk molecules',],
'endoRnases': ['bulk molecules',],
'exoRnases': ['bulk molecules',],
'subunits': ['bulk molecules',],
'molecules': ['bulk molecules',],
'RNAs': ['unique molecules', 'RNA'],
'active ribosome': ['unique molecules', 'active ribosome'],
}
},
'polypeptide initiation': {
'_type': 'process',
'inputs': {
'environment': ['environment',],
'active ribosome': ['unique molecules', 'active ribosome'],
'RNA': ['unique molecules', 'RNA'],
'subunits': ['bulk molecules',]
}
},
'polypeptide elongation': {
'_type': 'process',
'inputs': {
'environment': ['environment',],
'active ribosome': ['unique molecules', 'active ribosome'],
'molecules': ['bulk molecules',],
'monomers': ['bulk molecules',],
'amino acids': ['bulk molecules',],
'ppgpp reaction metabolites': ['bulk molecules',],
'uncharged trna': ['bulk molecules',],
'charged trna': ['bulk molecules',],
'charging molecules': ['bulk molecules',],
'synthetases': ['bulk molecules',],
'subunits': ['bulk molecules',],
# 'polypeptide elongation': ['process state', 'polypeptide elongation'],
'molecules total': ['bulk molecules',],
'amino acids total': ['bulk molecules',],
'charged trna total': ['bulk molecules',],
'uncharged trna total': ['bulk molecules',]
}
},
'complexation': {
'_type': 'process',
'inputs': {
'molecules': ['bulk molecules',],
}
},
'two component system': {
'_type': 'process',
'inputs': {
'molecules': ['bulk molecules',]
}
},
'equilibrium': {
'_type': 'process',
'inputs': {
'molecules': ['bulk molecules',]
}
},
'protein degradation': {
'_type': 'process',
'inputs': {
'metabolites': ['bulk molecules',],
'proteins': ['bulk molecules',]
}
},
'chromosome replication': {
'_type': 'process',
'inputs': {
'replisome trimers': ['bulk molecules',],
'replisome monomers': ['bulk molecules',],
'dntps': ['bulk molecules',],
'ppi': ['bulk molecules',],
'active replisomes': ['unique molecules', 'active replisome'],
'oriCs': ['unique molecules', 'oriC'],
'chromosome domains': ['unique molecules', 'chromosome domain'],
'full chromosomes': ['unique molecules', 'full chromosome'],
'environment': ['environment',]
}
},
'unique molecules': {
'chromosome domain': {},
'full chromosome': {},
'oriC': {},
'active replisome': {},
'RNA': {},
'active ribosome': {},
'DnaA box': {},
'promoter': {},
},
}
E. coli wiring diagram¶
In [3]:
# del ecoli['metabolism']['inputs']['amino acids']
# del ecoli['metabolism']['inputs']['amino acids total']
# del ecoli['metabolism']['inputs']['kinetics enzymes']
# del ecoli['metabolism']['inputs']['kinetics substrates']
node_groups = [[
# ['unique molecules',], ['bulk molecules',], ['environment',],
],
]
plot_settings2 = {
'node_groups': node_groups,
'remove_process_place_edges': True,
'aspect_ratio': 'fill',
'show_port_labels': False,
# 'aspect_ratio': '0.25',
}
# plot_settings['dpi'] = '70'
fig = plot_bigraph(ecoli,
**plot_settings,
**plot_settings2,
size='10,3',
filename='ecoli'
)
fig2 = plot_bigraph(ecoli,
**plot_settings,
**plot_settings2,
size='5,10',
rankdir='RL',
filename='ecoliRL',
)
fig
Writing out/ecoli
Writing out/ecoliRL
Out[3]:
E. coli subsets¶
In [4]:
ecoli_subset1 = {
'chromosome structure': ecoli['chromosome structure'],
# 'metabolism': ecoli['metabolism'],
# 'tf binding': ecoli['tf binding'],
'transcript initiation': ecoli['transcript initiation'],
}
# ecoli subset 2 pulls out only the processes that are connected to bulk, and not to unique
rna_deg = ecoli['rna degradation'].copy()
del rna_deg['inputs']['RNAs']
del rna_deg['inputs']['active ribosome']
ecoli_subset2 = {
'metabolism': ecoli['metabolism'],
'rna degradation': rna_deg,
'protein degradation': ecoli['protein degradation'],
}
plot_settings3 = {
'node_groups': node_groups,
'remove_process_place_edges': True,
}
plot_bigraph(ecoli_subset1,
**plot_settings,
**plot_settings3,
rankdir='RL',
filename='ecoli_subset1')
plot_bigraph(ecoli_subset2,
**plot_settings,
**plot_settings3,
rankdir='LR',
filename='ecoli_subset2')
Writing out/ecoli_subset1
Writing out/ecoli_subset2
Out[4]:
E. coli use cases¶
In [5]:
import copy
ecolin = copy.deepcopy(ecoli)
In [6]:
ecolin.keys()
Out[6]:
dict_keys(['bulk molecules', 'environment', 'chromosome structure', 'metabolism', 'tf binding', 'transcript initiation', 'transcript elongation', 'rna degradation', 'polypeptide initiation', 'polypeptide elongation', 'complexation', 'two component system', 'equilibrium', 'protein degradation', 'chromosome replication', 'unique molecules'])
In [7]:
ecolin['transcript initiation']
Out[7]:
{'_type': 'process',
'inputs': {'environment': ['environment'],
'full chromosomes': ['unique molecules', 'full chromosome'],
'RNAs': ['unique molecules', 'RNA'],
'active RNAPs': ['unique molecules', 'active RNAP'],
'promoters': ['unique molecules', 'promoter'],
'molecules': ['bulk molecules']}}
In [8]:
ecolin['metabolism']['inputs']['environment']
Out[8]:
['environment']
reduced E. coli unknown mechanism¶
In [9]:
ecolin2 = copy.deepcopy(ecolin)
ecoli_subsetX = {
'metabolism': ecolin2['metabolism'].copy(),
'degradation': ecolin2['protein degradation'].copy(),
# 'tf binding': ecolin2['tf binding'].copy(),
'transcription': ecolin2['transcript initiation'].copy(),
'translation': ecolin2['polypeptide initiation'].copy(),
'chromosome replication': ecolin2['chromosome replication'].copy(),
'complexation': ecolin2['complexation'].copy(),
}
# modify
# del ecoli_subsetX['metabolism']['inputs']['environment']
del ecoli_subsetX['metabolism']['inputs']['amino acids']
del ecoli_subsetX['metabolism']['inputs']['amino acids total']
del ecoli_subsetX['metabolism']['inputs']['kinetics enzymes']
del ecoli_subsetX['metabolism']['inputs']['kinetics substrates']
# del ecoli_subsetX['transcription']['inputs']['environment']
# del ecoli_subsetX['translation']['inputs']['environment']
del ecoli_subsetX['transcription']['inputs']['promoters']
del ecoli_subsetX['chromosome replication']['inputs']['full chromosomes']
del ecoli_subsetX['chromosome replication']['inputs']['oriCs']
# put environment up one level
ecoli_subsetX['metabolism']['inputs']['environment'] = ['..', 'environment']
ecoli_subsetX['transcription']['inputs']['environment'] = ['..', 'environment']
ecoli_subsetX['translation']['inputs']['environment'] = ['..', 'environment']
ecoli_subsetX['chromosome replication']['inputs']['environment'] = ['..', 'environment']
cell_id = 'microbe'
unknown_func = 'unknown function'
# add unknown mechanism
ecoli_subsetX[unknown_func] = {
'_type': 'process',
'_inputs': {
'bulk': 'any',
'unique': 'any',
'environment': 'any',
'cell': 'any',
},
'inputs': {
'bulk': ['bulk molecules',],
'unique': ['unique molecules',],
'environment': ['..', 'environment',],
'cell': ['..', cell_id,],
}
}
# nest under 'cell_id'
ecoli_subsetX1 = {cell_id: ecoli_subsetX}
# settings
node_groupsX = [
[[cell_id, unknown_func,],['environment',],[cell_id,],],
[[cell_id, 'unique molecules',],[cell_id, 'bulk molecules',],],
[[cell_id, 'metabolism',],[cell_id, 'transcription',],[cell_id, 'translation',],[cell_id, 'degradation',],],
]
node_border_colors = {
(cell_id, unknown_func,): 'red',
}
plot_settingsX = {
'node_groups': node_groupsX,
'node_border_colors': node_border_colors,
'remove_process_place_edges': True,
'size': '10,10',
'aspect_ratio': 'compress',
# 'rankdir': 'LR',
}
# plot_settings['dpi'] = '500'
plot_bigraph(ecoli_subsetX1,
**plot_settings,
**plot_settingsX,
filename='ecoli_subsetX')
Writing out/ecoli_subsetX
Out[9]:
In [10]:
ecoli1 = {
'biomanufacturing ecoli': {
'_type': 'process',
'_inputs': {
# For gene expression, protein interactions, and metabolite dynamics
'gene expression': 'any',
'protein interactions': 'any',
'metabolite dynamics': 'any',
},
'_outputs': {
#cellular composition, properties such as cell size and growth rate, and higher-order behavior
'cell composition': 'any',
'cell properties': 'any',
'higher order behavior': 'any',
}
}
}
ecoli2 = {
'antimicrobial efficacy ecoli': {
'_type': 'process',
'_inputs': {
# For gene expression, protein interactions, and metabolite dynamics
'gene expression': 'any',
'protein interactions': 'any',
'metabolite dynamics': 'any',
},
'_outputs': {
#cellular composition, properties such as cell size and growth rate, and higher-order behavior
'cell composition': 'any',
'cell properties': 'any',
'higher order behavior': 'any',
}
}
}
plot_settings2['dpi'] = '100'
plot_bigraph(ecoli1, **plot_settings2, filename='ecoli1')
plot_bigraph(ecoli2, **plot_settings2, filename='ecoli2')
Writing out/ecoli1
Writing out/ecoli2
Out[10]:
Antibiotic E. coli COmposite¶
In [11]:
ecoli_antibiotics = {
'antibiotic efficacy ecoli': {
'replication': {
'_type': 'process',
'inputs': {
'chromosomes': ['chromosomes'],
'molecules': ['bulk molecules', 'AAs, NTPs, dNTPs',],
}
},
'transcription': {
'_type': 'process',
'inputs': {
'chromosomes': ['chromosomes'],
'mRNAs': ['bulk molecules', 'mRNAs'],
'molecules': ['bulk molecules', 'AAs, NTPs, dNTPs',],
}
},
'degradation': {
'_type': 'process',
'inputs': {
'molecules': ['bulk molecules', 'AAs, NTPs, dNTPs',],
'metabolites': ['bulk molecules', 'metabolites'],
'proteins': ['bulk molecules', 'proteins'],
}
},
'translation': {
'_type': 'process',
'inputs': {
'mRNAs': ['bulk molecules', 'mRNAs'],
'proteins': ['bulk molecules', 'proteins'],
'molecules': ['bulk molecules', 'AAs, NTPs, dNTPs',],
}
},
'metabolism': {
'_type': 'process',
'inputs': {
'proteins': ['bulk molecules', 'proteins'],
'molecules': ['bulk molecules', 'AAs, NTPs, dNTPs',],
}
},
'antibiotic transport': {
'_type': 'process',
'inputs': {
'antibiotics': ['antibiotics', 'β-Lactams'],
'molecules': ['bulk molecules', 'AAs, NTPs, dNTPs',],
}
},
'antibiotic binding': {
'_type': 'process',
'inputs': {
'antibiotics': ['antibiotics', 'β-Lactams'],
'molecules': ['bulk molecules',],
}
},
'cell wall growth': {
'_type': 'process',
'inputs': {
'antibiotics': ['antibiotics', 'β-Lactams'],
'wall': ['cell wall',],
}
},
'lysis': {
'_type': 'process',
'inputs': {
'wall': ['cell wall',],
}
},
}
}
plot_settingsx = {
'node_border_colors': {
('antibiotic efficacy ecoli', 'cell wall'): 'red',
('antibiotic efficacy ecoli', 'antibiotics'): 'red',
('antibiotic efficacy ecoli', 'antibiotics', 'β-Lactams'): 'red',
('antibiotic efficacy ecoli', 'antibiotic transport'): 'red',
('antibiotic efficacy ecoli', 'antibiotic binding'): 'red',
('antibiotic efficacy ecoli', 'cell wall growth'): 'red',
('antibiotic efficacy ecoli', 'lysis'): 'red',
},
'port_label_size': '12pt',
'node_label_size': '16pt',
'process_label_size': '20pt',
'label_margin': '0.1',
'undirected_edges': True,
'remove_process_place_edges': True,
# 'aspect_ratio': 'fill',
'port_labels': False,
'out_dir': 'out',
'file_format': 'png',
# 'dpi': '2000',
}
# plot_settings['out_dir'] = 'out'
# plot_settings['file_format'] = 'png'
# plot_settings['dpi'] = '5000'
plot_bigraph(ecoli_antibiotics, **plot_settingsx, filename='ecoli_antibiotics')
Writing out/ecoli_antibiotics
Out[11]:
E. coli colony¶
E. coli colony¶
In [12]:
ecoli_schema = {
'_type': 'process',
'inputs': {'uptake': ['..', 'fields'],}}
n_ecoli = 6
ecoli_env = {
# 'environment': {
'cells': {
f'ecoli{n}': ecoli_schema for n in range(1, n_ecoli)
},
'fields': {},
'diffusion': {
'_type': 'process',
'inputs': {
'': ['fields',]
}
},
'mother machine': {
'_type': 'process',
'inputs': {
'': ['cells',]
}
}
# }
}
plot_settings3 = {
'rankdir': 'TB',
'port_labels': False,
'size': '10,10',
'node_groups': [
[['diffusion',], ['mother machine',], ['cells',], ['fields',],],
# [['environment', 'diffusion',], ['environment', 'mother machine',], ['environment', 'cells',], ['environment', 'fields',],],
],
}
plot_bigraph(ecoli_env,
**plot_settings,
**plot_settings3,
filename='ecoli_colony')
Writing out/ecoli_colony
Out[12]:
E. coli with ML components¶
In [13]:
hybrid_ecoli = {
'ML_model': {
'_type': 'process',
'inputs': {
'training_data': ['experimental_data'], # Experimental or simulated data for training
'model_checkpoint': ['model'], # Saved model state for inference or fine-tuning
'hyperparameters': ['parameters'], # Learning rate, architecture, etc.
'mechanistic_predictions': ['mechanistic_outputs'], # Feedback from mechanistic model
},
'outputs': {
'learned_parameters': ['parameters'], # Tuned parameters for mechanistic model
'predictions': ['ml_predictions'], # Forecasted states or outputs
# 'uncertainty_estimates': ['ml_uncertainty'], # Confidence in predictions
}
},
'core_mechanistic_model': {
'_type': 'process',
'inputs': {
'model': ['model'], # Saved model state for inference or fine-tuning
'initial_conditions': ['initial_state'], # Initial biochemical states
'parameters': ['parameters'], # Updated parameters from ML module
},
'outputs': {
'simulation_results': ['mechanistic_outputs'], # Time-series of biochemical states
}
},
'data_integration': {
'_type': 'process',
'inputs': {
'experimental_data': ['experimental_data'], # Direct observations from experiments
'simulation_results': ['mechanistic_outputs'], # Mechanistic model outputs
'ml_predictions': ['ml_predictions'], # ML-generated outputs
},
'outputs': {
'processed_data': ['processed_data'], # Cleaned and formatted dataset
# 'performance_metrics': ['evaluation'], # Model performance comparison
}
}
}
composite_ecoli = {
'ecoli': {
'_type': 'composite',
**hybrid_ecoli,
'inputs': {
'experimental_data': ['experimental_data'],
'model': ['ecoli_model'],
'parameters': ['EcoCyc'],
},
'outputs': {
'predictions': ['predictions'],
},
'bridge': {
'inputs': {
'experimental_data': ['experimental_data'],
'model': ['model'],
'parameters': ['parameters'],
},
'outputs': {
'predictions': ['processed_data'],
}
},
}
}
plot_settings4 = {
'rankdir': 'LR',
'port_labels': False,
'remove_process_place_edges': True,
}
plot_bigraph(composite_ecoli,
# **plot_settings,
**plot_settings4,
filename='ml_ecoli')
Writing out/ml_ecoli
Out[13]:
In [14]:
comp = {
'stochastic transcription': {
'_type': 'process',
'inputs': {
'DNA': ['DNA [counts]'],
'RNA': ['RNA [counts]'],
}
},
'counts to mg/mL': {
'_type': 'process',
'inputs': {
'RNA_counts': ['RNA [counts]'],
'RNA_concs': ['RNA [mg/mL]'],
'volume': ['volume'],
}
},
'deterministic translation': {
'_type': 'process',
'inputs': {
'RNA': ['RNA [mg/mL]'],
'Protein': ['Protein [mg/mL]'],
}
},
'DNA [counts]': {},
'RNA [counts]': {},
'RNA [mg/mL]': {},
'Protein [mg/mL]': {},
'volume': {},
}
plot_settings3 = {
**plot_settings,
'remove_process_place_edges': True,
'rankdir': 'BT',
'port_labels': False,
}
plot_bigraph(comp, **plot_settings3, filename='comp')
Writing out/comp
Out[14]:
In [15]:
comp_div = {
'division': {
'_type': 'process',
'inputs': {
'volume': ['volume'],
'divide': ['..', '..', 'cells'],
}
},
**comp
}
env = {
'fields': {},
'dimensions': {},
'multibody': {
'_type': 'process',
'inputs': {
'cells': ['cells']
}
},
'diffusion': {
'_type': 'process',
'inputs': {
'cells': ['cells'],
'fields': ['fields'],
'dimensions': ['dimensions']
}
}
}
comp_nested = {
'cells': {
'0': comp_div
},
**env
}
plot_settings3 = {
**plot_settings,
'remove_process_place_edges': True,
'port_labels': False,
}
plot_bigraph(comp_nested, **plot_settings3, filename='comp_nested1')
Writing out/comp_nested1
Out[15]:
In [16]:
comp_nested = {
'cells': {
'1': comp_div,
'2': comp_div,
},
**env
}
plot_bigraph(comp_nested, **plot_settings3, filename='comp_nested2')
Writing out/comp_nested2
Out[16]:
In [17]:
# state
cell_struct_state = {
'cell composite': {
'membrane': {
'lipids': {},
'mechanistic transmembrane transport': {
'_type': 'process',
'_outputs': {
'external': 'array'
},
'outputs': {
'transporters': ['transporters'],
'internal': ['..', 'cytoplasm', 'metabolites']
}
}
},
'cytoplasm': {
'mechanistic translation': {
'_type': 'process',
'outputs': {
'p1': ['ribosomal complexes'],
'p2': ['transcript regulation complex', 'transcripts']
}
}
},
'nucleoid': {
'chromosome': {
'genes': {}
},
'ML-based transcription': {
'_type': 'process',
'inputs': {
'genes': ['chromosome', 'genes']
},
'outputs': {
'transcripts': ['..', 'cytoplasm', 'transcript regulation complex', 'transcripts']
}
}
}
}
}
population = {
'population': {
**cell_struct_state,
'cell2': {},
'cell3': {},
'cell4': {},
'...': {},
}
}
plot_bigraph(
population,
dpi='1000',
size='5,4',
aspect_ratio='fill',
label_margin='0.02',
node_border_colors={
('population', 'cell composite', 'membrane', 'mechanistic transmembrane transport'): 'blue',
('population','cell composite', 'cytoplasm', 'mechanistic translation'): 'blue',
('population','cell composite', 'nucleoid', 'ML-based transcription'): 'red',
},
# schema={'cell composite': 'cell'},
# core=core,
port_labels=False,
remove_process_place_edges=True,
out_dir='out',
filename='cell_composite')
Writing out/cell_composite
Out[17]: