Differences between revisions 36 and 41 (spanning 5 versions)
Revision 36 as of 2024-12-11 13:40:08
Size: 4955
Editor: mark
Comment:
Revision 41 as of 2024-12-12 09:01:43
Size: 2903
Editor: mark
Comment:
Deletions are marked like this. Additions are marked like this.
Line 11: Line 11:
  1. lp.SetObjective(m.sm.cnames)   1. lp.!SetObjective(m.sm.cnames)
Line 13: Line 13:
  1. lp.SetFixedFlux({"TAG_Exp_tx":-1})
 1. We can now solve te lp:
  1. lp.Sovle()
  1. lp.!SetFixedFlux({"TAG_Exp_tx":-1})
 1. We can now solve the lp:
  1. lp.Solve()
Line 17: Line 17:
  1. sol = lp.GetPrimSol()   1. sol = lp.!GetPrimSol()
Line 21: Line 21:
for r in sol:  . for r in sol:
Line 26: Line 26:
Reaction and metabolite names are derived from [[https://metacyc.org|MetaCyc]] so you can use thses to find out more about individual reactions in the solution. NB: the `_Cyto suffix` is added to differentiate compartmentalisation in the model and is not part of !MetaCyc identifier, and should be removed before searching on !MetaCyc.

 . ''' ''' <<BR>>
Line 27: Line 31:
Part 1 describes how to examine a single lp solution. Now we can move on to exploring multiple solutions and examine how Phaeo can rearange its >>>metabolism in response to increasing TAG demand. The "Analysis" directory contains a simple Python module, LipidScan.py, to facilitate this.
Line 28: Line 33:
=== See Demo ===
The module "!LipidScan.py" contains tNow exaine wo functions. Following is their code:
Having started !ScrumPy and loaded the model as in Part 1, we import the !LipidScan module:
Line 31: Line 35:
'''a. BuildLP ''''''function'''  . >>> import !LipidScan
Line 33: Line 37:
{{{#!python
def BuildLP(m):
        lp = m.GetLP()
        lp.SetObjective(m.sm.cnames)
        lp.SetFluxBounds({"RIBULOSE-BISPHOSPHATE-CARBOXYLASE-RXN_Plas":(0,400.0)})
        if "GLYCEROL_Cyto_tx" in m.sm.cnames:
                lp.SetFluxBounds({"GLYCEROL_Cyto_tx":(0,20)})
        return lp
}}}
'''b. !LipidScan ''''''function'''
(The model must be loaded first)
Line 44: Line 39:
{{{#!python
def LipidScan(m,lp=None,lo=1.0,hi=20.0):
        ds = DataSets.DataSet()
        ranges = numpy.arange(lo,hi)
        if lp == None:
                lp = BuildLP(m)
        for t in ranges:
                lp.SetFixedFlux({"TAG_synthesis_Cyto":t})
                lp.Solve()
                if lp.GetStatusMsg() == "optimal":
                        sol = lp.GetPrimSol()
                        ds.UpdateFromDic(sol)
        ds.SetPlotX("TAG_synthesis_Cyto")
        ds.AddToPlot("RIBULOSE-BISPHOSPHATE-CARBOXYLASE-RXN_Plas")
        return ds
}}}
To use these methods you need to import the "!LipidScan" module. On ScrumPy window execute the following statements.
We can now generate some results:
Line 62: Line 41:
{{{#!python
import sys
sys.path.append('../Analysis')
import LipidScan
}}}
Now the methods in the "!LipidScan" module can be used.
 . >>> res = [[LipidScan|!LipidScan]].LipidScan(m)
Line 69: Line 43:
 a. Generate LP problem where the objective is to minimise total flux. Constrain the maximum Rubisco flux and glycerol transporter flux to 400 and 20 respectively (make use of !SetFluxBounds() function). "res" is a !DataSet, (matrix-like) object that contains 100 lp solutions, for the model, subject to a varying demand for TAG and satisfyng demand for biomass precursors. We are only interested in the reactions that change:
Line 71: Line 45:
{{{#!python
lp = LipidScan.BuildLP(m)
}}}
 . b. Solve this LP repeatedly (using for loop) while increasing flux in TAG synthesis reaction in range between 1 to 20. Save each of the solution in a dataset.
 . >>> chs = !LipidScan.Changers(res)
Line 76: Line 47:
{{{#!python
ds = LipidScan.LipidScan(m, lp=lp)
}}}
 . c. Examine the flux pattern in Rubisco reaction with respect to increasing flux in TAG synthesis. What is the maximum flux in Rubisco reaction?
Commonly, we start by examining the transport processes, which can be conveniently plotted:
Line 81: Line 49:
{{{#!python
ds.SetPlotX("TAG_synthesis_Cyto") #setting x-axis
ds.AddToPlot("RIBULOSE-BISPHOSPHATE-CARBOXYLASE-RXN_Plas")
}}}
 . d. Add inorganic carbon transporters (Hint: “CO2_Cyto_tx” and “HCO3_Cyto_tx”) and organic carbon transporter (“GLYCEROL_Cyto_tx”) to the plot ''' '''
 . e. What is the maximum flux in TAG synthesis? ''' '''
 . >>> res.!SetPlotX("TAG_Exp_tx") >>> for ch in chs:
  . if "_tx" in ch:
   . res.!AddToPlot(ch)
Line 88: Line 53:
4. As you would have noticed TAG synthesis in above example is through mixotrophic mode (i.e model uses light energy and organic carbon, glycerol, for lipid production). This more than is immediately convenient, so we can remove the plasted transporters, to leave only the cytosolic transporters:
Line 90: Line 55:
As you remember from the lecture, ''P. tricornutum'' can grow under phototrophic condition too (i.e in the absence of glycerol). You will simulate the model in autotrophic condition. For this, constrain the flux in glycerol transporter to zero. ''' '''  . >>> res.!RemoveMatchesFromPlot("_Plas")
Line 92: Line 57:
{{{#!python
lp = LipidScan.BuildLP(m)
lp.SetFixedFlux({"GLYCEROL_Cyto_tx":0})
res = LipidScan.LipidScan(m, lp=lp)
}}}
 * Plot reactions as above. Examine the difference in flux patterns.'
 * What is the maximum feasible flux in TAG synthesis under phototrophic condition?
 * Is is higher or lower than that in mixotrophic condition (in question 3)?
At which point an interpretable pattern starts to emerge.
Line 101: Line 59:
5. Find the reactions that are active in mixotrophic condition but not in phototrophic condition?

{{{#!python
from ScrumPy.Util import Set
Set.Complement(ds.cnames,res.cnames)
}}}
Try and identify which pathways these reactions belong to, see the digrams in the previous slides or search on the [[https://metacyc.org|MetaCyc]] website. NB: the `_Cyto suffix` is added to differentiate compartmentalisation in the model and is not part of !MetaCyc identifier, and should be removed before searching on !MetaCyc.

 . ''' '''
Over to you!

Practical 5: Identifying pathways for TAG synthesis in Phaeodactylum tricornutum

Part 1

Here, we will investigate the genome-scale metabolic model of P. tricornutum to identify pathways for TAG synthesis. See Villanova et al (2021). Front. Plant Sci. 12:642199. doi: 10.3389/fpls.2021.642199

  1. Download the archive containing the model from here and extract the files.This will generate a new directory,"srcs", containing two sub-directories: "Model" and "Analysis". Start ScrumPy.

  2. Load the Model:
    1. m = ScrumPy.Model("../Model/Phaeo.spy")

  3. We can now generate a linear programming object:
    1. lp = m.GetLP()
  4. And specify minimising total flux as the objective:
    1. lp.SetObjective(m.sm.cnames)

  5. With the constraint that we must generate 1 mole of TAG:
    1. lp.SetFixedFlux({"TAG_Exp_tx":-1})

  6. We can now solve the lp:
    1. lp.Solve()
  7. And obtain the solution:
    1. sol = lp.GetPrimSol()

Sol is a dictionary, mapping reactions to fluxes, satisfying our constraints and objectives. Examine its properties. e.g. what transport processes are involved?

  • for r in sol:
  • if "_tx" in r:
    • print(r, sol[r])

Reaction and metabolite names are derived from MetaCyc so you can use thses to find out more about individual reactions in the solution. NB: the _Cyto suffix is added to differentiate compartmentalisation in the model and is not part of MetaCyc identifier, and should be removed before searching on MetaCyc.


Part 2 - Constraint Scanning

Part 1 describes how to examine a single lp solution. Now we can move on to exploring multiple solutions and examine how Phaeo can rearange its >>>metabolism in response to increasing TAG demand. The "Analysis" directory contains a simple Python module, LipidScan.py, to facilitate this.

Having started ScrumPy and loaded the model as in Part 1, we import the LipidScan module:

  • >>> import LipidScan

(The model must be loaded first)

We can now generate some results:

"res" is a DataSet, (matrix-like) object that contains 100 lp solutions, for the model, subject to a varying demand for TAG and satisfyng demand for biomass precursors. We are only interested in the reactions that change:

  • >>> chs = LipidScan.Changers(res)

Commonly, we start by examining the transport processes, which can be conveniently plotted:

  • >>> res.!SetPlotX("TAG_Exp_tx") >>> for ch in chs:

    • if "_tx" in ch:
      • res.AddToPlot(ch)

This more than is immediately convenient, so we can remove the plasted transporters, to leave only the cytosolic transporters:

  • >>> res.RemoveMatchesFromPlot("_Plas")

At which point an interpretable pattern starts to emerge.

Over to you!

None: Meetings/Nottingham2024/Prac5 (last edited 2024-12-12 09:03:16 by mark)