SysBioChalmers / Human-GEM

The generic genome-scale metabolic model of Homo sapiens
https://sysbiochalmers.github.io/Human-GEM-guide/
Creative Commons Attribution 4.0 International
98 stars 41 forks source link

Transport of Thiamine Di- and Monophosphate Between Cytosol and Mitochondria #783

Closed Devlin-Moyer closed 6 months ago

Devlin-Moyer commented 10 months ago

Current behavior:

I realized that the changes I proposed in #695 would leave SLC25A19 (ENSG00000125454) associated with no reactions, but, as I mentioned in #695, it is known to mediate antiport of thiamine diphosphate (MAM02984m) and thiamine monophosphate (MAM02983m) across the inner mitochondrial membrane. These are all of the existing [c] to [m] transport reactions for thiamine diphosphate and thiamine monophosphate:

ID Reaction
MAR01789 2 H2O [m] + thiamin-PP [c] --> 2 H2O [c] + thiamin-PP [m]
MAR04205 H+ [i] + thiamin-PP [c] --> H+ [m] + thiamin-PP [m]
MAR08747 2 hydroxide [m] + thiamin-PP [c] --> 2 hydroxide [c] + thiamin-PP [m]
MAR01788 H2O [m] + thiamin-P [c] <=> H2O [c] + thiamin-P [m]
MAR08745 hydroxide [c] + thiamin-P [m] <=> hydroxide [m] + thiamin-P [c]

Most of the above reactions have no associated references, and those that do are associated with one or both of these papers.

Expected feature/value/output:

The first paper found that isolated rat liver mitochondria probably transport thiamine diphosphate and thiamine monophosphate across their membranes by exchanging one for the other, but do not mention cotransport with water, hydroxide, or protons, and do not associate this transport with any particular protein or gene.

The second paper found that mitochondria isolated from human cells with mutations in SLC19A2 cannot uptake (unphosphorylated) thiamine, but can still uptake thiamine diphosphate. They did not measure transport of thiamine monophosphate, and do not mention antiport of either metabolite with water, hydroxide, or protons.

SLC25A19 currently seems to be the only human protein known to transport either thiamine di- or monophosphate into or out of mitochondria, and Uniprot cites this paper (specifically figure 6), which concluded that SLC25A19 mediates antiport of thiamine diphosphate with and thiamine monophosphate with each other and with dATP, not cotransport with water, hydroxide, or protons. I think all of the above reactions should be replaced with three reactions: one representing antiport of thiamine diphosphate with thiamine monophosphate, one representing antiport of thiamine diphosphate with dATP, and one representing antiport of thiamine monophosphate with dATP, all associated with SLC25A19.

Proposed changes:

JHL-452b commented 8 months ago

Nice Result! I have checked all the information mentioned here and agree with your proposal.

But I have one doubt. In the current model, there is H2O-mediated reverse transport of thiamine diphosphate (MAM02984m) and thiamine monophosphate (MAM02983m) across the mitochondrial intima, which is basically equivalent to these two mets can freely enter and exit the mitochondria. However, in your proposal, thiamine diphosphate (MAM02984m) and thiamine monophosphate (MAM02983m) cannot freely across the inner mitochondrial membrane. Whether this will cause some simulations to change is unclear.

Devlin-Moyer commented 7 months ago

I did FVA on version 1.18 of Human-GEM, made the proposed changes to the [c] <-> [m] thiamine transport reactions, did FVA again, and found that there were only 2 reactions whose ranges of possible fluxes changed:

Reaction ID Reaction Equation Min Flux w/o Changes Max Flux w/o Changes Min Flux w/Changes Max Flux w/Changes
MAR13027 chloride [m] + hydroxide [c] ⇔ chloride [c] + hydroxide [m] -1000.0 1000.0 0.0 0.0
MAR13077 chloride [c] ⇔ chloride [m] -1000.0 1000.0 0.0 0.0

The only reactions that hydroxide [m] (MAM02147m) participates in are MAR08745, MAR08747, and MAR13027, so removing both MAR08745 and MAR08747 turns MAR13027 into a dead-end. MAR13027 and MAR13077 are the only two reactions that chloride [m] (MAM01442m) participates in, so blocking one blocks the other. I find it likely that there are other ways that chloride can move across the mitochondrial membranes, but since it's already incapable of doing anything in [m], I don't think it's a problem to make these changes to the thiamin (di)phosphate transport reactions and address the fact that these changes make MAR13027 and MAR13077 into dead-ends in a future issue.

No net flux of thiamin-PP between [c] and [m] is possible before making the proposed changes, but net fluxes of up to 2,000 in either direction are possible after making the proposed changes. No net flux of thiamin-P between [c] and [m] is possible with or without the proposed changes; I'm not sure why. It would be ideal if we figured out what's preventing fluxes of thiamin-P into or out of [m], but since that is already a problem, I feel like it's not unreasonable to make the proposed changes to the transport reactions and figure out what else is wrong with Human-GEM's representation of thiamine metabolism later.

Python code I used to generate the results described above ```python import sys from optlang.glpk_interface import Configuration import cobra try: threads = int(sys.argv[1]) except: sys.exit('provide number of threads to use') Configuration() old_model = cobra.io.load_json_model('generic_models/Human-GEMv1.18.json') # do FVA on version 1.18 of Human-GEM old_fva = cobra.flux_analysis.flux_variability_analysis( old_model, processes = threads ).applymap(lambda x: round(x, 3)) # remove existing thiamine-PP and thiamine-P [c] <-> [m] transport reactions new_model = old_model.copy() new_model.remove_reactions([ 'MAR01788', 'MAR01789', 'MAR04205', 'MAR08745', 'MAR08747' ]) # create the three proposed new reactions thpp_c = new_model.metabolites.get_by_id('MAM02984c') thp_c = new_model.metabolites.get_by_id('MAM02983c') datp_c = new_model.metabolites.get_by_id('MAM01642c') thpp_m = new_model.metabolites.get_by_id('MAM02984m') thp_m = new_model.metabolites.get_by_id('MAM02983m') datp_m = new_model.metabolites.get_by_id('MAM01642m') rxn_1 = cobra.Reaction('thp_thpp', lower_bound = -1000, upper_bound = 1000) rxn_1.add_metabolites({thp_c : -1, thpp_m : -1, thp_m : 1, thpp_c : 1}) rxn_2 = cobra.Reaction('datp_thp', lower_bound = -1000, upper_bound = 1000) rxn_2.add_metabolites({datp_c : -1, thp_m : -1, datp_m : 1, thp_c : 1}) rxn_3 = cobra.Reaction('datp_thpp', lower_bound = -1000, upper_bound = 1000) rxn_3.add_metabolites({datp_c : -1, thpp_m : -1, datp_m : 1, thpp_c : 1}) new_model.add_reactions([rxn_1, rxn_2, rxn_3]) import sys from optlang.glpk_interface import Configuration import cobra try: threads = int(sys.argv[1]) except: sys.exit('provide number of threads to use') Configuration() old_model = cobra.io.load_json_model('generic_models/Human-GEMv1.18.json') # do FVA on version 1.18 of Human-GEM old_fva = cobra.flux_analysis.flux_variability_analysis( old_model, processes = threads ).applymap(lambda x: round(x, 3)) # remove existing thiamine-PP and thiamine-P [c] <-> [m] transport reactions new_model = old_model.copy() new_model.remove_reactions(['MAR01788', 'MAR01789', 'MAR08745', 'MAR08747']) # create the three proposed new reactions thpp_c = new_model.metabolites.get_by_id('MAM02984c') thp_c = new_model.metabolites.get_by_id('MAM02983c') datp_c = new_model.metabolites.get_by_id('MAM01642c') thpp_m = new_model.metabolites.get_by_id('MAM02984m') thp_m = new_model.metabolites.get_by_id('MAM02983m') datp_m = new_model.metabolites.get_by_id('MAM01642m') rxn_1 = cobra.Reaction('thp_thpp', lower_bound = -1000, upper_bound = 1000) rxn_1.add_metabolites({thp_c : -1, thpp_m : -1, thp_m : 1, thpp_c : 1}) rxn_2 = cobra.Reaction('datp_thp', lower_bound = -1000, upper_bound = 1000) rxn_2.add_metabolites({datp_c : -1, thp_m : -1, datp_m : 1, thp_c : 1}) rxn_3 = cobra.Reaction('datp_thpp', lower_bound = -1000, upper_bound = 1000) rxn_3.add_metabolites({datp_c : -1, thpp_m : -1, datp_m : 1, thpp_c : 1}) new_model.add_reactions([rxn_1, rxn_2, rxn_3]) new_thp_max = ( new_fva.at['thp_thpp', 'maximum'] - new_fva.at['datp_thp', 'maximum'] ) msg = 'Range of possible net fluxes of thiamine monophosphate from [c] to [m] ' msg += f'went from ({old_thp_min} to {old_thp_max}) to ({new_thp_min} to ' msg += f'{new_thp_max}) after making changes to transport reactions.' print(msg) # identify reactions whose ranges of possible fluxes changed old_fva = old_fva.rename(columns = {'minimum' : 'old_min', 'maximum' : 'old_max'}) new_fva = new_fva.rename(columns = {'minimum' : 'new_min', 'maximum' : 'new_max'}) both_fva = old_fva.merge(new_fva, left_index = True, right_index = True) changed = both_fva[ (both_fva['old_min'] != both_fva['new_min']) | (both_fva['old_max'] != both_fva['new_max']) ] print(f'{len(changed)} reactions\' ranges of possible fluxes changed:') print(changed) ```
Devlin-Moyer commented 6 months ago

Fixed by #815