Practical 4 Structural Analysis of the Woods_Ljungdahl Pathway

Introduction

The goal of this practical is to use what we have learned so far about structural analysis to extend the analysis of this pathway in Acetobacter woodii that was briefly described in Lecture 5.

The organism is capable of assimilating CO2, CO and H2 in various combinations, but each of these gases can also potentially appear as a product under different circumstances as many of the reactions are potentially reversible. The biotechnological interest is the extent to which this organism (and others that contain this pathway) can be used to capture CO2 and CO emissions. The major product of A woodii is acetate, though ethanol can be formed, and ethanol can be a major product of some WLP organisms.

ATP synthesis is linked to unusual electron-bifurcating redox reactions, and the yield is low as the energy available in the gas-assimilating reactions is low, so the organism survives close to the threshold of life. Calculating the potential pathways and ATP yield is challenging by inspection of the network diagram, so elementary modes is a useful tool in this context.

The questions we therefore want to answer are:

  1. What are the potential routes of gas uptake?
  2. Which of these produces ATP?
  3. What fraction of the gaseous carbon taken up is conserved in acetate or ethanol?
  4. How does the utilisation of hydrogen affect ATP production?

Instructions

(a) Create and load the WLP model as you learned in the previous practical.

(b) Make sure that you can relate the reactions and metabolites in the model to those in the diagrams and reaction key in lecture 4.

Note: Reaction and metabolite names are actually metacyc IDs. This give us the means for maping reactions->enzymes->genes, although this isn't covered in this workshop.

(c) Calculate the enzyme subsets. Check your result against the diagram in the lecture.

Note: m.!EnzSubset() returns a dictionary. It is convenient to view each item in the dictionary using a for loop:

   1 >>> essdict = m.EnzSubsets()
   2 >>> for subset in essdict:
   3 >>>     print(subset, essdict[subset])

Note 2: Reactions not in subsets with any other reaction are considered to be in a subset of size 1

(d) Determine the sets of conserved moieties in the scheme using m.ConsMoieties(). Why do you think that, in the Pi-related conserved set, ATP only has a coefficient of 1 and ADP does not appear at all?

Note: m.ConsMoieties() returns a matrix of rational number (aka fractions). This is not very convenient to view, and we can do two things to make it easier to interpret:

   1 >>> ConsMtx = m.ConsMoieties()
   2 <class 'str'> # this is just an internal diagnostic message - ignore it
   3 >>> ConsMtx.ChangeType(int)  # # change the element type to integer
   4 >>> ConsDict = ConsMtx.ToColDict()  # Make a dictionary in which the column names are keys row contents are values:
   5 >>> for con in ConsDict:
   6         print(con, ConsDict[con])

Although the keys here are also the names of metabolites in teh conserved set, this is only relevant in kinetic models. The whole relationship is encapsulated in in the values of the dictionary.

(e) Calculate the elementary modes of the model using ems = m.ElModes().

Note: m.ElModes() returns a new class of object, with a variety of methods for analysing the elementary modes that we have generated.

Note2: As with subsets, elementary modes are calculate using rational number. It is generally more convenient to convert everything to integer equivalents one the calculation is done:

   1 >>>
   2 >>> ems = m.ElModes()
   3 >>> ems.Integise()

We can now view the net stoichiometry of each elementary mode:

   1 >>> print(ems.Stos())

The output from print(ems.Stos()) will not be conveniently ordered as in the table in the lecture though it should show all the corresponding conversions. The modes can be classified and counted as follows:

(f) Extract the set of modes that consume CO2 by emco2 = ems.Consumes(“x_co2”). The number of these modes is given by len(emco2), and their reactions by the Stos() method as above.

Note: ems.!Consumes(metabolite) generates another instance of the ElModes class, this means that searches can be chained together:

   1 >>> foo2bar = ems.Consumes("foo").Produces("bar") # not with this model though, obvs!

There are a number of other search attributes that should be identifiable using dir()

(g) Partition the modes as in the table (found in pg 13 of the lecture slides) by the gas mixture consumed (for example, elmo2 = ems.Consumes('x_co2').Consumes('x_h2')). Similarly, categorise the modes by different products (method ‘Produces()')

(h) Calculation of ATP stoichiometry for each mode. The ATP formed per C atom assimilated is the rate of the 'ADENOSINETRIPHOSPHATASE-RXN' divided by the net C incorporated, which is the sum of the CO2 and CO transport rates ('CO2_sf_tx' and 'CO_sf_tx').

   1 >>> ATPase ='ADENOSINETRIPHOSPHATASE-RXN' # save some typing!
   2 >>> ATPEMs = ems.PosFlux(ATPase)
   3 >>> for em in ATPEMs:
   4         reacs = ATPEMs.ReacsOf(em)#the ReacsOf() method returns a dictionary of reactions and their associated weightings
   5         if "CO2_sf_tx" in reacs:
   6                 print(em, reacs[ATPase]/reacs["CO2_sf_tx"])

Note: Because CO2 can be produced or consumed, some of these yields will be negative. These can be either be discounted, or eliminated by modifying the above code (left as an excerise).

For modes that consume H2, the amount of ATP per H2 can be found in a similar way ('H2_sf_tx').

None: Meetings/Nottingham2022/Prac4 (last edited 2022-05-04 14:43:04 by yanica)