<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Building a Model
This simple example demonstrates how to create a model, create a reaction, and then add the reaction to the model.
We'll use the '3OAS140' reaction from the STM_1.0 model
Step1:  We need to create metabolites as well. If we were using an existing model, we could use get_by_id to get the apporpriate Metabolite objects instead.
Step2:  Adding metabolites to a reaction requires using a dictionary of the metabolites and their stoichiometric coefficients. A group of metabolites can be added all at once, or they can be added one at a time.
Step3:  The gene_reaction_rule is a boolean representation of the gene requirements for this reaction to be active as described in Schellenberger et al 2011 Nature Protocols 6(9)
Step4:  At this point in time, the model is still empty
Step5:  We will add the reaction to the model, which will also add all associated metabolites and genes
Step6:  We can iterate through the model objects to observe the contents
<ASSISTANT_TASK:>
Python Code:
from cobra import Model, Reaction, Metabolite
# Best practise: SBML compliant IDs
cobra_model = Model('example_cobra_model')
reaction = Reaction('3OAS140')
reaction.name = '3 oxoacyl acyl carrier protein synthase n C140 '
reaction.subsystem = 'Cell Envelope Biosynthesis'
reaction.lower_bound = 0.  # This is the default
reaction.upper_bound = 1000.  # This is the default
reaction.objective_coefficient = 0. # this is the default
Explanation: Building a Model
This simple example demonstrates how to create a model, create a reaction, and then add the reaction to the model.
We'll use the '3OAS140' reaction from the STM_1.0 model:
1.0 malACP[c] + 1.0 h[c] + 1.0 ddcaACP[c] $\rightarrow$ 1.0 co2[c] + 1.0 ACP[c] + 1.0 3omrsACP[c]
First, create the model and reaction.
End of explanation
ACP_c = Metabolite('ACP_c',
                   formula='C11H21N2O7PRS',
                   name='acyl-carrier-protein',
                   compartment='c')
omrsACP_c = Metabolite('3omrsACP_c',
                       formula='C25H45N2O9PRS',
                       name='3-Oxotetradecanoyl-acyl-carrier-protein',
                       compartment='c')
co2_c = Metabolite('co2_c',
                   formula='CO2',
                   name='CO2',
                   compartment='c')
malACP_c = Metabolite('malACP_c',
                      formula='C14H22N2O10PRS',
                      name='Malonyl-acyl-carrier-protein',
                      compartment='c')
h_c = Metabolite('h_c',
                 formula='H',
                 name='H',
                 compartment='c')
ddcaACP_c = Metabolite('ddcaACP_c',
                       formula='C23H43N2O8PRS',
                       name='Dodecanoyl-ACP-n-C120ACP',
                       compartment='c')
Explanation: We need to create metabolites as well. If we were using an existing model, we could use get_by_id to get the apporpriate Metabolite objects instead.
End of explanation
reaction.add_metabolites({malACP_c: -1.0,
                          h_c: -1.0,
                          ddcaACP_c: -1.0,
                          co2_c: 1.0,
                          ACP_c: 1.0,
                          omrsACP_c: 1.0})
reaction.reaction  # This gives a string representation of the reaction
Explanation: Adding metabolites to a reaction requires using a dictionary of the metabolites and their stoichiometric coefficients. A group of metabolites can be added all at once, or they can be added one at a time.
End of explanation
reaction.gene_reaction_rule = '( STM2378 or STM1197 )'
reaction.genes
Explanation: The gene_reaction_rule is a boolean representation of the gene requirements for this reaction to be active as described in Schellenberger et al 2011 Nature Protocols 6(9):1290-307. We will assign the gene reaction rule string, which will automatically create the corresponding gene objects.
End of explanation
print('%i reactions in initial model' % len(cobra_model.reactions))
print('%i metabolites in initial model' % len(cobra_model.metabolites))
print('%i genes in initial model' % len(cobra_model.genes))
Explanation: At this point in time, the model is still empty
End of explanation
cobra_model.add_reaction(reaction)
# Now there are things in the model
print('%i reaction in model' % len(cobra_model.reactions))
print('%i metabolites in model' % len(cobra_model.metabolites))
print('%i genes in model' % len(cobra_model.genes))
Explanation: We will add the reaction to the model, which will also add all associated metabolites and genes
End of explanation
# Iterate through the the objects in the model
print("Reactions")
print("---------")
for x in cobra_model.reactions:
    print("%s : %s" % (x.id, x.reaction))
print("Metabolites")
print("-----------")
for x in cobra_model.metabolites:
    print('%s : %s' % (x.id, x.formula))
print("Genes")
print("-----")
for x in cobra_model.genes:
    reactions_list_str = "{" + ", ".join((i.id for i in x.reactions)) + "}"
    print("%s is associated with reactions: %s" % (x.id, reactions_list_str))
Explanation: We can iterate through the model objects to observe the contents
End of explanation
<END_TASK>