= 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 CO,,2,,, CO and H,,2 ,,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 CO,,2,, 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? 1. Which of these produces ATP? 1. What fraction of the gaseous carbon taken up is conserved in acetate or ethanol? 1. How does the utilisation of hydrogen affect ATP production? == Instructions == '''(a)''' Create and load the [[https://mudsharkstatic.brookes.ac.uk/Nottingham2024/WLP_1.spy|WLP model]] as you learned in the previous practical. . Create model using following command: {{{#!python m = ScrumPy.Model('wlp.spy') }}} . An empty model editor will open like in the previous practical. Copy and paste the model description from [[https://mudsharkstatic.brookes.ac.uk/Nottingham2024/WLP_1.spy|WLP model]] into the model editor. '''(b)''' Make sure that you can relate the reactions and metabolites in the model to those in the diagrams and reaction key in lecture 5. '''Note: '''Reaction and metabolite names are actually [[http://metacyc.org|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: {{{#!python >>> essdict = m.EnzSubsets() >>> for subset in essdict: >>> 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. Not covered in this workshop, but ask an instructor if you are interested. '''(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: {{{#!python >>> >>> ems = m.ElModes() >>> ems.Integise() }}} We can now view the net stoichiometry of each elementary mode: {{{#!python >>> 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: {{{#!python >>> 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 12 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'). {{{#!python >>> ATPase ='ADENOSINETRIPHOSPHATASE-RXN' # saving reaction id to a variable, save some typing! >>> ATPEMs = ems.PosFlux(ATPase) # ems that have positive flux through ATPase >>> for em in ATPEMs: reacs = ATPEMs.ReacsOf(em)#the ReacsOf() method returns a dictionary of reactions and their associated weightings if ("CO2_sf_tx" in reacs) and ("CO_s_tx" in reacs): tot = reacs["CO2_sf_tx"] + reacs["CO_s_tx"] print('\n\n') if tot != 0: print('CO and CO2: ', em, reacs[ATPase]/tot) print('ATPase: ', reacs[ATPase], 'CO2_sf_tx', reacs["CO2_sf_tx"], 'CO_s_tx', reacs["CO_s_tx"] ) elif "CO2_sf_tx" in reacs: print('\n\n') print('CO2: ', em, reacs[ATPase]/reacs["CO2_sf_tx"]) print('ATPase: ', reacs[ATPase], 'CO2_sf_tx', reacs["CO2_sf_tx"]) elif "CO_s_tx" in reacs: print('\n\n') print('CO only: ', em, reacs[ATPase]/reacs["CO_s_tx"]) print('ATPase: ', reacs[ATPase], 'CO_s_tx', reacs["CO_s_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').