import cobra
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from matplotlib.cm import ScalarMappable
from matplotlib.colors import Normalize
from matplotlib.ticker import AutoMinorLocator, MultipleLocator
from mmon_gcm.analysing import get_phase_lengths
from mmon_gcm.supermodel import SuperModel
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import OneHotEncoder, StandardScaler
Analysing the results of the constraint scan
sns.set_theme()"ticks")
sns.set_style(= {
palettes "tol_bright": sns.color_palette(
"#4477AA", "#66CCEE", "#228833", "#CCBB44", "#EE6677", "#AA3377", "#BBBBBB"]
[
),"tol_muted": sns.color_palette(
["#332288",
"#88CCEE",
"#44AA99",
"#117733",
"#999933",
"#DDCC77",
"#CC6677",
"#882255",
"#AA4499",
]
),
}"tol_muted"])
sns.set_palette(palettes[
= sns.color_palette()
colours
= {
params "xtick.labelsize": "large",
"ytick.labelsize": "large",
"axes.labelsize": "large",
"axes.titlesize": "x-large",
"font.family": "sans-serif",
"axes.spines.right": False,
"axes.spines.top": False,
"legend.frameon": False,
"savefig.bbox": "tight",
"lines.linewidth": 2.5,
"figure.figsize": [5, 3.75],
"figure.dpi": 150,
} plt.rcParams.update(params)
def get_bounds_in_model(constraints):
= SuperModel(constraints)
super_model = super_model.get_volumes(per_guard_cell=False)
volumes = volumes[0]
closed_volume = volumes[1]
open_volume = super_model.get_osmolarities()
osmolarities = osmolarities[0]
closed_osmolarity = osmolarities[1]
open_osmolarity = super_model.get_photons(150)
photons = photons[0]
gc_photons = super_model.get_atpase_constraint_value(
gc_atpase_upper_bound "ATPase"]
constraints.loc[
)
return {
"V_closed": closed_volume,
"V_open": open_volume,
"Os_closed": closed_osmolarity,
"Os_open": open_osmolarity,
"Photons": gc_photons,
"ATPase": gc_atpase_upper_bound,
}
Importing results and constraints
# import results files
= pd.read_csv(
blue_results "../outputs/constraint_scan/constraint_scan_results_blue.csv", index_col=0
)= pd.read_csv(
white_results "../outputs/constraint_scan/constraint_scan_results_white.csv", index_col=0
)= pd.concat([white_results, blue_results])
scan_results = scan_results.reset_index().drop("index", axis=1)
scan_results # remove solutions which were not feasible
= scan_results[scan_results.isna().any(axis=1)]
infeasible_solutions = scan_results.dropna()
feasible_solutions = feasible_solutions scan_results
len(infeasible_solutions)
2
len(feasible_solutions)
1934
scan_results.shape
(1934, 7101)
# convert any fluxes that are below 10^-6 to 0
= scan_results.mask(abs(scan_results) < 0.000001, other=0) scan_results
# import constraints files
= pd.read_csv(
white_constraints "../outputs/constraint_scan/constraints_df.csv", index_col=0
)"light"] = "white"
white_constraints[= pd.read_csv(
blue_constraints "../outputs/constraint_scan/constraints_df.csv", index_col=0
)"light"] = "blue"
blue_constraints[= pd.concat([white_constraints, blue_constraints])
scan_constraints = scan_constraints.reset_index().drop("index", axis=1)
scan_constraints # remove infeasible constraints combinations
= scan_constraints.loc[feasible_solutions.index]
feasible_scan_constraints = scan_constraints.loc[infeasible_solutions.index]
infeasible_scan_constraints = feasible_scan_constraints
scan_constraints
# Remove maintenance in scan_constraints
#scan_constraints = scan_constraints.drop('Maintenance', axis=1)
scan_constraints.columns
Index(['P_abs', 'T_l', 'A_l', 'V_gc_ind', 'FqFm', 'R_ch', 'R_ch_vol', 'L_air',
'L_epidermis', 'Vac_frac', 'T', 'R', 'N_gcs', 'n', 'm', 'r', 's',
'C_apo', 'A_closed', 'A_open', 'ATPase', 'light'],
dtype='object')
# import constraints that were used in previous paper solutions
= pd.read_csv("../inputs/arabidopsis_parameters.csv", index_col=0)[
default_constraints "Value"
]
= []
paper_constraints = []
index for light in ["white", "blue", "nops"]:
for constraint in ["unconstrained", "constrained"]:
= default_constraints.copy()
constraints if constraint == "unconstrained":
"ATPase"] = 1000
constraints[elif constraint == "constrained":
"ATPase"] = 7.48
constraints["light"] = light
constraints[f"{light}_{constraint}_wt")
index.append(
paper_constraints.append(constraints)= pd.DataFrame(paper_constraints, index=index)
paper_constraints = paper_constraints.iloc[1, :-1]
paper_constraints paper_constraints
P_abs 0.9
T_l 0.00017
A_l 1.0
V_gc_ind 0.0
FqFm 0.9
R_ch 0.069231
R_ch_vol 0.200476
L_air 0.37
L_epidermis 0.15
Vac_frac 0.751
T 296.15
R 0.08205
N_gcs 580000000.0
n 2.5
m 0.8
r 0.0
s 0.0
C_apo 0.02302
A_closed 1.6
A_open 2.75
ATPase 7.48
Name: white_constrained_wt, dtype: object
# import results for previous simulations in paper
= []
paper_solution_files
for light in ["white", "blue", "nops"]:
for constraint in ["unconstrained", "constrained"]:
f"{light}_{constraint}_wt.csv")
paper_solution_files.append(= [
solution_dfs f"../outputs/model_solutions/{file_name}", index_col=0)["fluxes"]
pd.read_csv(for file_name in paper_solution_files
]= pd.concat(solution_dfs, axis=1).T
paper_results = index paper_results.index
# get a reduced get of constraints that are more specific to the guard cell
= pd.DataFrame.from_dict(
scan_gc_constraints list(scan_constraints.apply(get_bounds_in_model, axis=1))
)"Os_dif"] = (
scan_gc_constraints["Os_open"] - scan_gc_constraints["Os_closed"]
scan_gc_constraints[
)= scan_constraints.index
scan_gc_constraints.index scan_gc_constraints.head()
/home/maurice/Sync/GC/mmon-gcm/mmon_gcm/supermodel.py:23: UserWarning: No fba model added to the Supermodel, fine if that's what you want
warnings.warn("No fba model added to the Supermodel, fine if that's what you want")
V_closed | V_open | Os_closed | Os_open | Photons | ATPase | Os_dif | |
---|---|---|---|---|---|---|---|
0 | 0.000157 | 0.000476 | 0.033212 | 0.278138 | 0.107908 | 0.004851 | 0.244926 |
1 | 0.000321 | 0.000738 | 0.067499 | 0.370715 | 0.106820 | 0.000585 | 0.303216 |
2 | 0.000248 | 0.000268 | 0.059662 | 0.070491 | 0.031490 | 0.004505 | 0.010828 |
3 | 0.000134 | 0.000278 | 0.033181 | 0.140030 | 0.013079 | 0.004855 | 0.106849 |
4 | 0.000438 | 0.000786 | 0.107888 | 0.313097 | 0.034626 | 0.011479 | 0.205209 |
= pd.Series(get_bounds_in_model(paper_constraints))
paper_gc_constraints "Os_dif"] = (
paper_gc_constraints["Os_open"] - paper_gc_constraints["Os_closed"]
paper_gc_constraints[
) paper_gc_constraints
/home/maurice/Sync/GC/mmon-gcm/mmon_gcm/supermodel.py:23: UserWarning: No fba model added to the Supermodel, fine if that's what you want
warnings.warn("No fba model added to the Supermodel, fine if that's what you want")
V_closed 0.000220
V_open 0.000254
Os_closed 0.039359
Os_open 0.054922
Photons 0.018372
ATPase 0.004338
Os_dif 0.015563
dtype: float64
7a - What contributes to phloem output?
Set up features for linear regression by
Convert light using onehotencoder
"light"]] scan_constraints[[
light | |
---|---|
0 | white |
1 | white |
2 | white |
3 | white |
4 | white |
... | ... |
1931 | blue |
1932 | blue |
1933 | blue |
1934 | blue |
1935 | blue |
1934 rows × 1 columns
# extract the subject column as a pandas DataFrame
= scan_constraints[["light"]]
light # setting sparse=False means that enc.transform() will return an array
= OneHotEncoder(sparse_output=False)
enc
# fit the encoder to the data
enc.fit(light)
# encode the data
= enc.transform(light)
light_enc = pd.DataFrame(light_enc, columns="light_" + enc.categories_[0], index=scan_constraints.index) # Added index=scan_constraints.index
light_columns = scan_constraints.drop("light", axis=1).join(light_columns)
full_features = scan_gc_constraints.join(light_columns) gc_features
Also create scaled versions of features
= StandardScaler()
scaler
scaler.fit(full_features)= scaler.transform(full_features)
full_features_scaled
scaler.fit(gc_features)= scaler.transform(gc_features) gc_features_scaled
any(axis=1)] full_features[full_features.isna().
P_abs | T_l | A_l | V_gc_ind | FqFm | R_ch | R_ch_vol | L_air | L_epidermis | Vac_frac | ... | n | m | r | s | C_apo | A_closed | A_open | ATPase | light_blue | light_white |
---|
0 rows × 23 columns
Compare full and gc features
= scan_results.Phloem_tx_overall
response #response = scan_results.Photon_tx_gc_3
= LinearRegression()
lm_full
lm_full.fit(full_features, response)= lm_full.predict(full_features)
full_pred print("Mean squared error, MSE = %.5f" % mean_squared_error(response, full_pred))
print("Coefficient of determination, r2 = %.5f" % r2_score(response, full_pred))
= LinearRegression()
lm_gc
lm_gc.fit(gc_features, response)= lm_gc.predict(gc_features)
gc_pred print("Mean squared error, MSE = %.5f" % mean_squared_error(response, gc_pred))
print("Coefficient of determination, r2 = %.5f" % r2_score(response, gc_pred))
Mean squared error, MSE = 0.00040
Coefficient of determination, r2 = 0.99960
Mean squared error, MSE = 0.87829
Coefficient of determination, r2 = 0.12388
So can’t predict phloem output using GC features, but can predict pretty well using the full set
Which features are most important?
=full_features.columns).sort_values(by=0) pd.DataFrame(lm_full.coef_, index
0 | |
---|---|
T_l | -4.514050e-01 |
light_blue | -3.533915e-01 |
C_apo | -1.320172e-03 |
m | -8.770751e-04 |
Vac_frac | -7.229537e-04 |
A_open | -2.302990e-04 |
FqFm | -6.018903e-05 |
n | -5.320860e-05 |
V_gc_ind | -9.982424e-10 |
r | -6.477489e-12 |
N_gcs | -1.186773e-12 |
A_l | -2.997951e-13 |
R | -1.131064e-13 |
s | 1.957373e-11 |
T | 4.679942e-06 |
ATPase | 4.859983e-06 |
A_closed | 1.710221e-04 |
L_epidermis | 2.027958e-04 |
L_air | 2.972018e-04 |
R_ch_vol | 4.995322e-04 |
R_ch | 1.383114e-03 |
light_white | 3.533915e-01 |
P_abs | 1.800514e+01 |
Lots of unimportant features so we can use lasso regression to see which ones we really need
Try different alphas for lasso to see r2
from sklearn.linear_model import Lasso
= np.linspace(0.01, 0.1, 10)
alphas = []
r2s
for alpha in alphas:
= Lasso(alpha=alpha)
lasso
lasso.fit(full_features, response)= lasso.predict(full_features)
lasso_pred
r2s.append(r2_score(response, lasso_pred))
=alphas) pd.Series(r2s, index
0.01 0.962288
0.02 0.850360
0.03 0.663812
0.04 0.402646
0.05 0.116440
0.06 0.111850
0.07 0.106593
0.08 0.100528
0.09 0.093654
0.10 0.085972
dtype: float64
from sklearn.linear_model import Lasso
= np.linspace(0.001, 0.01, 10)
alphas = []
r2s
for alpha in alphas:
= Lasso(alpha=alpha)
lasso
lasso.fit(full_features, response)= lasso.predict(full_features)
lasso_pred
r2s.append(r2_score(response, lasso_pred))
=alphas) pd.Series(r2s, index
0.001 0.999224
0.002 0.998105
0.003 0.996240
0.004 0.993628
0.005 0.990270
0.006 0.986166
0.007 0.981316
0.008 0.975719
0.009 0.969377
0.010 0.962288
dtype: float64
Lets take 0.03 as it’s highest that rounds to 0.999
Lasso with alpha = 0.003
= Lasso(alpha=0.003)
lasso
lasso.fit(full_features, response)= lasso.predict(full_features)
lasso_pred = pd.DataFrame(lasso.coef_, index=full_features.columns).sort_values(by=0)
lass_coefs # display coefficients that aren't 0
abs(lass_coefs.loc[:, 0]) > 0.00001] lass_coefs[
0 | |
---|---|
light_blue | -0.694783 |
T | -0.000436 |
A_open | -0.000309 |
P_abs | 16.894629 |
P_abs and light are by far the largest coefficients
Try scaled as well
from sklearn.linear_model import Lasso
= np.linspace(0.01, 0.1, 10)
alphas = []
r2s
for alpha in alphas:
= Lasso(alpha=alpha)
lasso
lasso.fit(full_features_scaled, response)= lasso.predict(full_features_scaled)
lasso_pred
r2s.append(r2_score(response, lasso_pred))
=alphas) pd.Series(r2s, index
0.01 0.999398
0.02 0.998799
0.03 0.997801
0.04 0.996405
0.05 0.994609
0.06 0.992415
0.07 0.989821
0.08 0.986829
0.09 0.983437
0.10 0.979646
dtype: float64
= Lasso(alpha=0.01)
lasso
lasso.fit(full_features_scaled, response)= lasso.predict(full_features_scaled)
lasso_pred = pd.DataFrame(lasso.coef_, index=full_features.columns).sort_values(by=0)
lass_coefs print(f"r2 score: {r2_score(response, lasso_pred)}")
# display coefficients that aren't 0
abs(lass_coefs.loc[:, 0]) > 0.00001] lass_coefs[
r2 score: 0.9993975321339854
0 | |
---|---|
light_blue | -0.343392 |
P_abs | 0.926581 |
When scaled this is even clearer
def phloemoutput_subfig(ax):
for light, colour in zip(
"white", "blue"], [sns.color_palette()[1], sns.color_palette()[0]]
[
):= scan_constraints[scan_constraints.light == light]
constraints_light_df = scan_results[scan_constraints.light == light]
results_light_df
ax.scatter(
constraints_light_df.P_abs,
results_light_df.Phloem_tx_overall,=light.capitalize(),
label=colour,
color
)
="Light during opening", loc="upper left") # Set loc to "upper left"
ax.legend(title"$P_{abs}$\n(Prop. photons absorbed by leaf)", size="medium")
ax.set_xlabel(
ax.set_ylabel("Phloem output\n(mmol$\cdot$m$^{-2}$leaf$\cdot$h$^{-1}$)", size="medium"
)
11.9, 17)
ax.set_ylim(0.797, 1)
ax.set_xlim("left"].set_bounds(12, 17)
ax.spines["bottom"].set_bounds(0.8, 1)
ax.spines[0.1))
ax.xaxis.set_major_locator(MultipleLocator(# ax.xaxis.set_minor_locator(AutoMinorLocator(2))
1))
ax.yaxis.set_major_locator(MultipleLocator(# ax.yaxis.set_minor_locator(AutoMinorLocator(2))
abs(1 - 0.8) / abs(17 - 12))
ax.set_aspect(
return ax
= plt.subplots()
fig, ax phloemoutput_subfig(ax)
7b - What affects hexose export from the guard cell?
Generate hexose export df
= cobra.io.sbml.read_sbml_model(
four_stage_GC_model "../models/4_stage_GC.xml"
# read model
)
# get total flux across all phases
= {}
net_carbon_dict for metabolite in ["GLC", "FRU", "SUCROSE"]:
= 0
net_metabolite for i, phase_length in enumerate(get_phase_lengths(four_stage_GC_model)):
= i + 1
phase_number = (
net_metabolite
net_metabolite+ scan_results.loc[:, f"{metabolite}_ae_gc_{phase_number}"] * phase_length
)= net_metabolite
net_carbon_dict[metabolite] = pd.DataFrame.from_dict(net_carbon_dict)
net_carbon_df
# correct for fact that sucrose is two hexoses
= (
net_carbon + net_carbon_df.FRU + net_carbon_df.SUCROSE * 2
net_carbon_df.GLC * -1 # mmol.m2-1
) = net_carbon * 10**-3 # moles.m2-1
net_carbon = net_carbon / scan_constraints.N_gcs # moles.gc-1
carbon_per_gc = carbon_per_gc * 10**15 # fmol.gc-1 carbon_per_gc
No objective coefficients in model. Unclear what should be optimized
Fit model to hexose export
= carbon_per_gc
response for features in [full_features, gc_features]:
= LinearRegression()
lm_1
lm_1.fit(features, response)= lm_1.predict(features)
pred print("Mean squared error, MSE = %.2f" % mean_squared_error(response, pred))
print("Coefficient of determination, r2 = %.2f" % r2_score(response, pred))
Mean squared error, MSE = 392.25
Coefficient of determination, r2 = 0.45
Mean squared error, MSE = 118.22
Coefficient of determination, r2 = 0.83
So hexose export can be better predicted using the gc features compared to all the features. Is this because it’s hexose per gc?
= net_carbon
response for features in [full_features, gc_features]:
= LinearRegression()
lm_1
lm_1.fit(features, response)= lm_1.predict(features)
pred print("Mean squared error, MSE = %.2f" % mean_squared_error(response, pred))
print("Coefficient of determination, r2 = %.2f" % r2_score(response, pred))
Mean squared error, MSE = 0.00
Coefficient of determination, r2 = 0.52
Mean squared error, MSE = 0.00
Coefficient of determination, r2 = 1.00
Seems so, as we’re confusing things by introducing the N_gcs division into the response
= net_carbon
response = LinearRegression()
lm_1
lm_1.fit(gc_features, response)= lm_1.predict(gc_features)
pred = pd.DataFrame(lm_1.coef_, index=gc_features.columns).sort_values(by=0)
lm_coefs abs(lm_coefs.loc[:, 0]) > 0.00001] lm_coefs[
0 | |
---|---|
light_blue | -1.381741e+08 |
light_white | -1.381741e+08 |
Os_open | -8.054295e+05 |
V_closed | -1.611919e-02 |
ATPase | 1.462491e-04 |
Photons | 2.354302e-04 |
V_open | 6.360736e-03 |
Os_dif | 8.054295e+05 |
Os_closed | 8.054295e+05 |
Mainly different light colours as well as osmolarity. What if we correct for light colour?
Create a reponse for total photons into the GC, irrespective of blue or white light
= scan_results.loc[:, "Photon_tx_gc_3"]
photon_influx = scan_constraints.loc[:, "light"].apply(
photon_hours lambda x: 12 if x == "white" else 11.5
)= photon_influx * photon_hours total_photons_per_day
= net_carbon
response = np.array([total_photons_per_day]).T
features = LinearRegression()
lm_1
lm_1.fit(features, response)= lm_1.predict(features)
pred print("Mean squared error, MSE = %.6f" % mean_squared_error(response, pred))
print("Coefficient of determination, r2 = %.6f" % r2_score(response, pred))
=["Photons per day"]).sort_values(by=0) pd.DataFrame(lm_1.coef_, index
Mean squared error, MSE = 0.000000
Coefficient of determination, r2 = 0.952128
0 | |
---|---|
Photons per day | 0.000019 |
= net_carbon
response = np.array([total_photons_per_day, gc_features.Os_dif]).T
features = LinearRegression()
lm_1
lm_1.fit(features, response)= lm_1.predict(features)
pred print("Mean squared error, MSE = %.6f" % mean_squared_error(response, pred))
print("Coefficient of determination, r2 = %.6f" % r2_score(response, pred))
=["Photons per day", "Os dif"]).sort_values(by=0) pd.DataFrame(lm_1.coef_, index
Mean squared error, MSE = 0.000000
Coefficient of determination, r2 = 0.997839
0 | |
---|---|
Os dif | -0.000042 |
Photons per day | 0.000020 |
Pretty good R2
= net_carbon
response = np.array(gc_features.ATPase).reshape(-1, 1)
features = LinearRegression()
lm_1
lm_1.fit(features, response)= lm_1.predict(features)
pred print("Mean squared error, MSE = %.6f" % mean_squared_error(response, pred))
print("Coefficient of determination, r2 = %.6f" % r2_score(response, pred))
=["ATPase"]).sort_values(by=0) pd.DataFrame(lm_1.coef_, index
Mean squared error, MSE = 0.000000
Coefficient of determination, r2 = 0.109253
0 | |
---|---|
ATPase | 0.001702 |
ATPase can’t really predict hexose export, at least not by itself
def photons_vs_carbon_export_subfig(ax):
= scan_gc_constraints.Os_dif.max().round(1)
max_os_dif = Normalize(vmin=0, vmax=max_os_dif)
norm = ScalarMappable(norm=norm, cmap=sns.color_palette("crest", as_cmap=True))
mappable
= net_carbon * 10**3
net_carbon_mmol
ax.scatter(
total_photons_per_day,
net_carbon_mmol,=scan_gc_constraints.Os_dif,
c=norm,
norm=10,
s=sns.color_palette("crest", as_cmap=True),
cmap
)
= ax.inset_axes([0.1, 0.93, 0.40, 0.05])
cbaxes = plt.colorbar(
cbar =cbaxes, ticks=[0, max_os_dif], orientation="horizontal"
mappable, cax
)"Osmolarity increase\n(mmol$\cdot$m$^{-2}\cdot$d$^{-1}$)", size=10)
cbar.set_label(
= ax.inset_axes([0.7, 0.15, 0.3, 0.3])
inset_ax
inset_ax.scatter(
total_photons_per_day,
net_carbon_mmol,=scan_gc_constraints.Os_dif,
c=1,
s=sns.color_palette("crest", as_cmap=True),
cmap
)-0.3 / 10, 2])
inset_ax.set_xlim([-0.02 / 5, 0.04])
inset_ax.set_ylim([=10)
inset_ax.tick_params(labelsize"left"].set_bounds(0, 0.04)
inset_ax.spines["bottom"].set_bounds(0, 2)
inset_ax.spines[0.04))
inset_ax.yaxis.set_major_locator(MultipleLocator(2))
inset_ax.yaxis.set_minor_locator(AutoMinorLocator(2))
inset_ax.xaxis.set_major_locator(MultipleLocator(2))
inset_ax.xaxis.set_minor_locator(AutoMinorLocator(
-0.5, 10])
ax.set_xlim([-0.02, 0.15])
ax.set_ylim(["left"].set_bounds(0, 0.15)
ax.spines["bottom"].set_bounds(0, 10)
ax.spines[2))
ax.xaxis.set_major_locator(MultipleLocator(2))
ax.xaxis.set_minor_locator(AutoMinorLocator(0.05))
ax.yaxis.set_major_locator(MultipleLocator(abs(10 - 0) / abs(0.15 - 0))
ax.set_aspect(
ax.set_xlabel("Photons per day into GC\n" + r"(mmol$\cdot$m$^{-2}\cdot$d$^{-1}$)",
="medium",
size
)
ax.set_ylabel("Net hexose export flux from GC\n" + r"(mmol$\cdot$m$^{-2}\cdot$h$^{-1}$)",
="medium",
size
)
return ax
= plt.subplots()
fig, ax photons_vs_carbon_export_subfig(ax)
Are there any solutions where net carbon export are below 0?
< 0).sum() (net_carbon
177
> 0).sum() (net_carbon
1757
== 0).sum() (net_carbon
0
1-((net_carbon < 0).sum())/len(net_carbon)
0.9084798345398138
What’s interesting about them?
< 0] scan_constraints.loc[net_carbon
P_abs | T_l | A_l | V_gc_ind | FqFm | R_ch | R_ch_vol | L_air | L_epidermis | Vac_frac | ... | N_gcs | n | m | r | s | C_apo | A_closed | A_open | ATPase | light | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
3 | 0.880998 | 0.000192 | 1.0 | 8.629192e-13 | 0.866582 | 0.051244 | 0.204472 | 0.309538 | 0.169957 | 0.813726 | ... | 3.851195e+08 | 2.077401 | 0.940848 | 5.747590e-14 | 1.515328e-13 | 0.029770 | 3.399462 | 9.936390 | 12.606738 | white |
30 | 0.977490 | 0.000213 | 1.0 | 8.097892e-13 | 0.849340 | 0.085944 | 0.200220 | 0.228127 | 0.106448 | 0.830654 | ... | 6.380687e+08 | 2.318837 | 0.830687 | 7.864234e-14 | 1.643929e-13 | 0.025288 | 3.333199 | 10.672109 | 11.311688 | white |
35 | 0.856504 | 0.000237 | 1.0 | 1.360312e-12 | 0.860652 | 0.067374 | 0.192203 | 0.258071 | 0.107286 | 0.777399 | ... | 8.423951e+08 | 2.039681 | 0.993173 | 6.491681e-14 | 2.153582e-13 | 0.029056 | 3.839122 | 9.599664 | 13.331786 | white |
45 | 0.930783 | 0.000189 | 1.0 | 1.489148e-12 | 0.888709 | 0.046345 | 0.194218 | 0.231172 | 0.183409 | 0.831117 | ... | 1.105337e+09 | 2.328963 | 0.866898 | 6.554262e-14 | 2.276119e-13 | 0.023463 | 3.689994 | 11.705067 | 7.102036 | white |
64 | 0.859688 | 0.000235 | 1.0 | 3.426082e-12 | 0.791894 | 0.052688 | 0.198979 | 0.230128 | 0.197351 | 0.842065 | ... | 3.647771e+08 | 1.730236 | 0.919254 | 7.408027e-14 | 2.148666e-13 | 0.029782 | 1.697687 | 11.305181 | 13.115608 | white |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1882 | 0.845869 | 0.000172 | 1.0 | 1.048237e-12 | 0.845831 | 0.080705 | 0.199110 | 0.334855 | 0.163015 | 0.764383 | ... | 2.061369e+08 | 1.615056 | 0.959637 | 7.543702e-14 | 2.598267e-13 | 0.027358 | 1.738303 | 9.792686 | 12.376386 | blue |
1910 | 0.891865 | 0.000236 | 1.0 | 1.587349e-12 | 0.841325 | 0.047596 | 0.190368 | 0.187888 | 0.114146 | 0.818767 | ... | 8.062927e+08 | 1.649409 | 0.853218 | 7.850763e-14 | 2.357539e-13 | 0.024782 | 1.406129 | 6.738719 | 13.099119 | blue |
1917 | 0.917349 | 0.000172 | 1.0 | 6.231750e-13 | 0.847565 | 0.047245 | 0.195349 | 0.244040 | 0.192836 | 0.789315 | ... | 9.777013e+08 | 1.535770 | 0.824097 | 5.226121e-14 | 2.318500e-13 | 0.024413 | 1.599696 | 9.447559 | 0.599285 | blue |
1918 | 0.979824 | 0.000215 | 1.0 | 7.663475e-13 | 0.834459 | 0.092777 | 0.203782 | 0.191754 | 0.104075 | 0.832115 | ... | 2.886042e+08 | 2.043540 | 0.833630 | 5.487253e-14 | 1.306311e-13 | 0.031694 | 1.449804 | 8.414919 | 3.970192 | blue |
1926 | 0.884257 | 0.000212 | 1.0 | 9.887656e-13 | 0.794346 | 0.042550 | 0.190401 | 0.318149 | 0.216369 | 0.817676 | ... | 5.898101e+08 | 2.199278 | 0.968034 | 6.179313e-14 | 2.376930e-13 | 0.028122 | 2.487448 | 9.333051 | 11.542919 | blue |
177 rows × 22 columns
< 0] scan_gc_constraints.loc[net_carbon
V_closed | V_open | Os_closed | Os_open | Photons | ATPase | Os_dif | |
---|---|---|---|---|---|---|---|
3 | 0.000134 | 0.000278 | 0.033181 | 0.140030 | 0.013079 | 0.004855 | 0.106849 |
30 | 0.000272 | 0.000640 | 0.063820 | 0.310722 | 0.027134 | 0.007218 | 0.246902 |
35 | 0.000391 | 0.000706 | 0.109738 | 0.371630 | 0.037644 | 0.011231 | 0.261892 |
45 | 0.000519 | 0.001100 | 0.133538 | 0.606216 | 0.055639 | 0.007850 | 0.472678 |
64 | 0.000124 | 0.000384 | 0.020705 | 0.204952 | 0.033219 | 0.004784 | 0.184247 |
... | ... | ... | ... | ... | ... | ... | ... |
1882 | 0.000081 | 0.000206 | 0.013085 | 0.098841 | 0.013994 | 0.002551 | 0.085757 |
1910 | 0.000279 | 0.000617 | 0.040490 | 0.207920 | 0.027690 | 0.010562 | 0.167430 |
1917 | 0.000308 | 0.000709 | 0.044057 | 0.291729 | 0.022555 | 0.000586 | 0.247672 |
1918 | 0.000061 | 0.000171 | 0.010122 | 0.069783 | 0.011858 | 0.001146 | 0.059661 |
1926 | 0.000231 | 0.000480 | 0.050001 | 0.234255 | 0.015845 | 0.006808 | 0.184254 |
177 rows × 7 columns
Ok they are the same just with different light colours. Is it the photon/od_dif ratio?
180, "Photons"] / scan_gc_constraints.loc[180, "Os_dif"] scan_gc_constraints.loc[
0.8286998886406594
"Photons"] / scan_gc_constraints.loc[:, "Os_dif"]).min() (scan_gc_constraints.loc[:,
0.028310817388733575
Yes, it has the lowest photon:od_diff ratio of any combination
At our predicted level of osmolarity and other guard cell parameters, what would FqFm.R_ch need to be for guard cell to act as a sink?
\(e = FqFm \cdot R_{ch} \cdot R_{ch_{vol}}\) <- We want to know e, that is the capacity of guard cell vs mesophyll. Function of efficiency, number of chloroplasts, and valume of chloroplasts
\(P_{gc} = e \cdot v\_prop_{gc} \cdot P\)
\(e = \frac{P_{gc}}{v\_prop_{gc} \cdot P}\)
= 150 * paper_constraints.P_abs
P = P * 10**-3 * 60 * 60 # umolessec-1 -> mmolhr-1 P
= (
V_l * paper_constraints.A_l
paper_constraints.T_l # volume of leaf is area x thickness
) = V_l * 10**3 # (Total leaf volume) m3 -> dm3 = 10**3
V_l
= (
V_gc * paper_constraints.N_gcs
paper_constraints.V_gc_ind # total volume of gc in leaf
)
# volume of meosphyll is leaf that isn't epidermis or air
= V_l * (1 - paper_constraints.L_epidermis) * (1 - paper_constraints.L_air)
V_me
= V_gc / V_me # volume of gc is negligable v_prop_gc
= net_carbon
response = np.array([total_photons_per_day, gc_features.Os_dif]).T
features = LinearRegression()
lm_1
lm_1.fit(features, response)= lm_1.predict(features)
pred print("Mean squared error, MSE = %.6f" % mean_squared_error(response, pred))
print("Coefficient of determination, r2 = %.6f" % r2_score(response, pred))
print(f"Intercept: {lm_1.intercept_}")
=["Photons per day", "Os dif"]).sort_values(by=0) pd.DataFrame(lm_1.coef_, index
Mean squared error, MSE = 0.000000
Coefficient of determination, r2 = 0.997839
Intercept: -2.9943170116709816e-07
0 | |
---|---|
Os dif | -0.000042 |
Photons per day | 0.000020 |
$ C_{net} = -3^{-5}Os_{dif} + 2^{-5}P_{day} - 6.80 ^{-8}$
$ 0 = -3^{-5} + 2^{-5}P_{day} - 6.80 ^{-8}$
$ = P_{day}$
= lm_1.coef_[1]
os_dif_coef = lm_1.coef_[0]
photons_per_day_coef = paper_gc_constraints.Os_dif
os_in_selected_scenarios = lm_1.intercept_ intercept
= (
photons_needed - os_dif_coef * os_in_selected_scenarios
intercept / photons_per_day_coef
) photons_needed
0.01766160051488187
min() / photons_needed total_photons_per_day.
2.1088116678656323
So at that osmolarity for the guard cell to act as sink tissue the total level of photons coming in would have to be 15x lower than we see in any of our scenarios, which will be for blue light
= photons_needed / 11.5 photon_influx
\(e = \frac{P_{gc}}{v\_prop_{gc} \cdot P}\)
= photon_influx / (v_prop_gc * P)
e * 100 e
0.10441977210694658
So the capacity for photosynthesis in the guard cell only needs to be 0.1% of that of the mesophyll to act as a source tissue
What is the range of photosynthetic capacities that we use?
= (scan_constraints.FqFm * scan_constraints.R_ch) * 100
capacity_percentages print(f"High: {capacity_percentages.max()}")
print(f"Low: {capacity_percentages.min()}")
High: 16.086936580407595
Low: 2.773358075436272
7c - So does the ATPase have an effect on starch if not on hexose export very much?
How many solutions utilise starch?
= scan_results.STARCH_p_gc_Linker_1 - scan_results.STARCH_p_gc_Linker_2
starch print(f"{(starch > 0).sum()} or {(starch > 0).sum()/len(starch) * 100:.0f}%")
1892 or 98%
In how many of those solutions is the ATPase constrained?
= (
atpase_constrained abs(scan_gc_constraints.ATPase - scan_results.PROTON_ATPase_c_gc_2) < 0.000001
)& starch > 0).sum() (atpase_constrained
1864
- scan_results.PROTON_ATPase_c_gc_2) < 0.000001).sum() / (starch > 0).sum() ((scan_gc_constraints.ATPase
0.985200845665962
<= 0).sum() (starch
42
& (starch == 0))] scan_gc_constraints[(atpase_constrained
V_closed | V_open | Os_closed | Os_open | Photons | ATPase | Os_dif |
---|
So there is one solution which doesn’t
& starch < 0)] scan_gc_constraints[(atpase_constrained
V_closed | V_open | Os_closed | Os_open | Photons | ATPase | Os_dif |
---|
#(scan_gc_constraints.loc[1685] - scan_gc_constraints.mean()) / scan_gc_constraints.std()
High photons, high ATPase, low osmolarity dif
How many constrained solutions don’t use starch?
& (starch == 0)).sum() (atpase_constrained
0
& (starch == 0))] scan_gc_constraints[(atpase_constrained
V_closed | V_open | Os_closed | Os_open | Photons | ATPase | Os_dif |
---|
#(scan_gc_constraints.loc[1779] - scan_gc_constraints.mean()) / scan_gc_constraints.std()
Osmolarity difference is low, photons are high, atpase is low. Closed osmolarity is high, forcing the use of something else?
Increase per GC allows comparison with literature values
= starch * 10**-3 / scan_constraints.N_gcs * 10**15 # fmol.gc-1 starch_per_gc
= 184 horrer_starch_level
= (
os_increase_per_gc * 10**-3 / scan_constraints.N_gcs * 10**15
scan_gc_constraints.Os_dif
)= (
protons_moved_per_gc * 10**-3 / scan_constraints.N_gcs * 10**15
scan_results.PROTON_ATPase_c_gc_2 )
max() protons_moved_per_gc.
16.983568453252616
def starch_vs_os_subfig(ax):
= 2
dot_size
= Normalize(vmin=0, vmax=15)
norm = ScalarMappable(norm=norm, cmap=sns.color_palette("crest", as_cmap=True))
mappable
0, 600], [0, 600], c="grey", alpha=0.5, clip_on=False, linewidth=1)
ax.plot([
= ax.scatter(
sc
os_increase_per_gc,
starch_per_gc,=dot_size,
s=protons_moved_per_gc,
c=norm,
norm=sns.color_palette("crest", as_cmap=True),
cmap
)
= ax.inset_axes([0.15, 0.93, 0.40, 0.05])
cbaxes = plt.colorbar(mappable, cax=cbaxes, ticks=[0, 15], orientation="horizontal")
cbar "Total H$^{+}$ export\n(fmol$\cdot$GC$^{-1}$)", size=10)
cbar.set_label(
= 600
y_max = -20
y_min = 600
x_max = -20
x_min
ax.set_ylim(y_min, y_max)
ax.set_xlim(x_min, x_max)"left"].set_bounds(0, y_max)
ax.spines["bottom"].set_bounds(0, x_max)
ax.spines[200))
ax.xaxis.set_major_locator(MultipleLocator(2))
ax.xaxis.set_minor_locator(AutoMinorLocator(200))
ax.yaxis.set_major_locator(MultipleLocator(2))
ax.yaxis.set_minor_locator(AutoMinorLocator(1)
ax.set_aspect(
"Osmolarity increase (fmol$\cdot$GC$^{-1}$)", size="medium")
ax.set_xlabel(r"Starch degradation (fmol$\cdot$GC$^{-1}$)", size="medium")
ax.set_ylabel(# ax.hlines(-155, xmin=0.15, xmax=0.99, clip_on=False, linewidth=1, color='.15')
# ax.hlines(
# 184,
# xmin=0,
# xmax=x_max,
# linewidth=1,
# linestyle="--",
# color=sns.color_palette()[6],
# )
# ax.text(
# x_max,
# 175,
# "Horrer et al. (2016)",
# ha="right",
# va="top",
# size="x-small",
# color=sns.color_palette()[6],
# )
# paper_scenarios_colour = sns.color_palette()[2]
# ax.vlines(
# 26.83,
# ymin=0,
# ymax=110,
# linewidth=1,
# linestyle="--",
# color=paper_scenarios_colour,
# )
# ax.text(
# 50,
# 120,
# "Paper\nscenarios",
# ha="center",
# va="bottom",
# size="x-small",
# color=paper_scenarios_colour,
# )
return ax
= plt.subplots(figsize=(6, 4))
fig, ax
starch_vs_os_subfig(ax)
"../outputs/constraint_scan/atpase_vs_starch.svg")
fig.savefig("../outputs/constraint_scan/atpase_vs_starch.png") fig.savefig(
How do starch levels vary with white/blue light?
starch_per_gc
0 452.289024
1 277.547788
2 4.237398
3 167.427081
4 88.409571
...
1931 401.554966
1932 111.326430
1933 269.642074
1934 81.257996
1935 271.281498
Length: 1934, dtype: float64
How is starch used?
What proportion of white light solutions that degrade starch use it for osmoticum?
(
("light"] == "white")
(scan_constraints[& (starch > 0)
& (scan_results.RXN_2141_p_gc_2 > 0)
sum()
)./ ((scan_constraints["light"] == "white") & (starch > 0)).sum() * 100 )
100.0
What proportion of white light solutions that degrade starch use it for energy?
(
("light"] == "white")
(scan_constraints[& (starch > 0)
& (scan_results.MALTODEG_RXN_c_gc_2 > 0)
sum()
)./ ((scan_constraints["light"] == "white") & (starch > 0)).sum() * 100 )
37.379162191192265
In the solutions that use it for energy, what is the average % used for energy?
(
(
(
scan_results[
(
("light"] == "white")
(scan_constraints[& (starch > 0)
& (scan_results.MALTODEG_RXN_c_gc_2 > 0)
)
)
].MALTODEG_RXN_c_gc_2
)/ starch[
("light"] == "white")
(scan_constraints[& (starch > 0)
& (scan_results.MALTODEG_RXN_c_gc_2 > 0)
)
]
)* 100
).mean()
3.390568533696099
What proportion of blue light solutions that degrade starch use it for osmoticum?
(
("light"] == "blue")
(scan_constraints[& (starch > 0)
& (scan_results.RXN_2141_p_gc_2 > 0)
sum()
)./ ((scan_constraints["light"] == "blue") & (starch > 0)).sum() * 100 )
96.98231009365244
"light"] == "blue") & (starch > 0)).sum() - (
((scan_constraints[
("light"] == "blue")
(scan_constraints[& (starch > 0)
& (scan_results.RXN_2141_p_gc_2 > 0)
sum()
). )
29
29 solutions doesn’t
scan_constraints[
("light"] == "blue")
(scan_constraints[& (starch > 0)
& ~(scan_results.RXN_2141_p_gc_2 > 0)
) ]
P_abs | T_l | A_l | V_gc_ind | FqFm | R_ch | R_ch_vol | L_air | L_epidermis | Vac_frac | ... | N_gcs | n | m | r | s | C_apo | A_closed | A_open | ATPase | light | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1017 | 0.982189 | 0.000231 | 1.0 | 1.217851e-12 | 0.806859 | 0.073278 | 0.211816 | 0.312352 | 0.170798 | 0.850346 | ... | 7.505322e+08 | 2.216148 | 0.988893 | 7.629564e-14 | 2.378212e-13 | 0.036241 | 3.213625 | 3.269583 | 5.188912 | blue |
1029 | 0.987023 | 0.000221 | 1.0 | 1.629365e-12 | 0.838141 | 0.096801 | 0.204151 | 0.251819 | 0.217884 | 0.765830 | ... | 3.634520e+08 | 1.950142 | 0.846086 | 7.725629e-14 | 1.043478e-13 | 0.028292 | 2.862462 | 3.198156 | 13.387886 | blue |
1056 | 0.833108 | 0.000195 | 1.0 | 1.641114e-12 | 0.848315 | 0.162755 | 0.206171 | 0.278300 | 0.189228 | 0.863030 | ... | 4.977284e+08 | 1.533894 | 0.896850 | 7.795038e-14 | 1.909829e-13 | 0.034884 | 3.554507 | 3.763593 | 14.205187 | blue |
1101 | 0.986662 | 0.000234 | 1.0 | 4.080272e-12 | 0.833938 | 0.038088 | 0.195959 | 0.208027 | 0.195915 | 0.851504 | ... | 1.080920e+09 | 2.176108 | 0.871806 | 6.374026e-14 | 1.607315e-13 | 0.031215 | 2.021054 | 2.957040 | 13.642663 | blue |
1175 | 0.845082 | 0.000195 | 1.0 | 3.099346e-12 | 0.858672 | 0.105619 | 0.192160 | 0.271365 | 0.122900 | 0.805677 | ... | 1.156622e+09 | 1.676400 | 0.938192 | 7.393047e-14 | 1.742883e-13 | 0.034981 | 3.772808 | 3.898576 | 11.481076 | blue |
1210 | 0.979145 | 0.000175 | 1.0 | 5.704240e-13 | 0.888548 | 0.072428 | 0.191789 | 0.325010 | 0.203983 | 0.860514 | ... | 1.036523e+09 | 1.899936 | 0.859060 | 5.463702e-14 | 1.576704e-13 | 0.028699 | 3.722164 | 4.071019 | 8.231288 | blue |
1241 | 0.964159 | 0.000240 | 1.0 | 3.888226e-12 | 0.849131 | 0.040710 | 0.202661 | 0.308670 | 0.218431 | 0.872428 | ... | 3.693487e+08 | 2.243153 | 0.842068 | 6.859716e-14 | 2.559610e-13 | 0.035843 | 3.687364 | 3.924401 | 16.420545 | blue |
1249 | 0.936919 | 0.000209 | 1.0 | 1.257865e-12 | 0.826065 | 0.170801 | 0.201451 | 0.200907 | 0.221662 | 0.862510 | ... | 2.768268e+08 | 1.579182 | 0.975663 | 7.358545e-14 | 2.629005e-13 | 0.034054 | 2.918035 | 3.666386 | 16.455016 | blue |
1271 | 0.894960 | 0.000226 | 1.0 | 2.625296e-12 | 0.794778 | 0.090898 | 0.192567 | 0.205657 | 0.192150 | 0.771838 | ... | 5.185705e+08 | 1.732175 | 0.982479 | 5.191611e-14 | 2.078991e-13 | 0.033018 | 2.881912 | 3.278714 | 10.054394 | blue |
1347 | 0.937104 | 0.000226 | 1.0 | 2.073399e-12 | 0.877991 | 0.157195 | 0.191900 | 0.227209 | 0.225836 | 0.794047 | ... | 2.618422e+08 | 1.733078 | 0.888186 | 5.059401e-14 | 2.003447e-13 | 0.023230 | 3.869395 | 4.290222 | 12.594885 | blue |
1398 | 0.924224 | 0.000175 | 1.0 | 8.730863e-13 | 0.804098 | 0.113418 | 0.198257 | 0.249691 | 0.188820 | 0.869304 | ... | 2.519070e+08 | 2.475275 | 0.986365 | 5.905248e-14 | 2.007580e-13 | 0.035799 | 3.375259 | 3.767706 | 13.067527 | blue |
1415 | 0.980463 | 0.000186 | 1.0 | 2.216273e-12 | 0.833689 | 0.123501 | 0.191071 | 0.215862 | 0.172692 | 0.880035 | ... | 4.498390e+08 | 1.516520 | 0.868986 | 6.725712e-14 | 2.446887e-13 | 0.029044 | 2.734507 | 3.267102 | 15.278437 | blue |
1447 | 0.936485 | 0.000214 | 1.0 | 1.166534e-12 | 0.804583 | 0.064945 | 0.212629 | 0.306904 | 0.192820 | 0.899093 | ... | 1.006072e+09 | 2.229371 | 0.889104 | 7.800326e-14 | 1.362171e-13 | 0.025047 | 3.167684 | 3.208058 | 2.280317 | blue |
1448 | 0.966670 | 0.000234 | 1.0 | 2.958310e-12 | 0.880085 | 0.164133 | 0.208941 | 0.256087 | 0.185230 | 0.857323 | ... | 2.950038e+08 | 2.331925 | 0.969200 | 6.444187e-14 | 2.834842e-13 | 0.033098 | 2.317668 | 3.042316 | 16.947977 | blue |
1491 | 0.974679 | 0.000208 | 1.0 | 4.076222e-12 | 0.854519 | 0.064982 | 0.193118 | 0.366199 | 0.142774 | 0.786920 | ... | 2.322279e+08 | 2.420792 | 0.998249 | 7.561923e-14 | 1.951285e-13 | 0.028007 | 3.455625 | 3.655766 | 5.111005 | blue |
1493 | 0.963094 | 0.000203 | 1.0 | 1.666351e-12 | 0.804195 | 0.045097 | 0.201921 | 0.242176 | 0.169241 | 0.808959 | ... | 3.329225e+08 | 2.363713 | 0.949282 | 6.266396e-14 | 2.838072e-13 | 0.030682 | 3.007735 | 3.103710 | 5.312710 | blue |
1603 | 0.828798 | 0.000182 | 1.0 | 2.256641e-12 | 0.823090 | 0.156348 | 0.190161 | 0.341647 | 0.136510 | 0.863669 | ... | 1.001502e+09 | 2.262333 | 0.826955 | 5.891340e-14 | 1.276337e-13 | 0.037063 | 1.408121 | 2.911160 | 16.306092 | blue |
1618 | 0.860350 | 0.000239 | 1.0 | 2.638787e-12 | 0.805063 | 0.075918 | 0.202866 | 0.263651 | 0.217483 | 0.822192 | ... | 6.891091e+08 | 1.943550 | 0.962856 | 5.344074e-14 | 2.932053e-13 | 0.023835 | 2.757374 | 2.839959 | 13.055073 | blue |
1643 | 0.976380 | 0.000196 | 1.0 | 2.590073e-12 | 0.880679 | 0.112134 | 0.197380 | 0.199853 | 0.194168 | 0.888156 | ... | 4.143898e+08 | 2.315024 | 0.956130 | 7.757519e-14 | 1.819379e-13 | 0.024353 | 2.559500 | 3.075319 | 11.496986 | blue |
1646 | 0.904437 | 0.000191 | 1.0 | 2.890408e-12 | 0.855971 | 0.090535 | 0.211633 | 0.204026 | 0.171637 | 0.763252 | ... | 6.682905e+08 | 2.352557 | 0.989896 | 6.372475e-14 | 1.918218e-13 | 0.033567 | 3.435310 | 3.815847 | 11.200469 | blue |
1649 | 0.884870 | 0.000204 | 1.0 | 1.979075e-12 | 0.893797 | 0.126563 | 0.192962 | 0.217671 | 0.227905 | 0.830867 | ... | 8.139443e+08 | 1.620203 | 0.873123 | 5.074189e-14 | 1.533827e-13 | 0.031353 | 2.452572 | 2.999165 | 15.016749 | blue |
1667 | 0.899727 | 0.000181 | 1.0 | 1.993103e-12 | 0.800412 | 0.172931 | 0.202179 | 0.349272 | 0.208027 | 0.798485 | ... | 7.670398e+08 | 1.800158 | 0.835565 | 6.995006e-14 | 1.407586e-13 | 0.031113 | 3.087264 | 3.514388 | 7.141256 | blue |
1673 | 0.892106 | 0.000177 | 1.0 | 1.173797e-12 | 0.899135 | 0.163861 | 0.211231 | 0.285542 | 0.130093 | 0.825673 | ... | 5.034766e+08 | 2.221621 | 0.883160 | 6.236762e-14 | 1.911845e-13 | 0.033061 | 2.937788 | 3.420623 | 11.979488 | blue |
1722 | 0.912601 | 0.000213 | 1.0 | 3.929522e-12 | 0.857296 | 0.115738 | 0.199913 | 0.219846 | 0.168834 | 0.820673 | ... | 6.034846e+08 | 1.885533 | 0.834602 | 5.926701e-14 | 1.114504e-13 | 0.026448 | 3.925064 | 4.209788 | 9.645913 | blue |
1796 | 0.960272 | 0.000208 | 1.0 | 1.354988e-12 | 0.818793 | 0.089928 | 0.194593 | 0.186986 | 0.128720 | 0.791661 | ... | 3.166402e+08 | 1.704774 | 0.950659 | 5.391275e-14 | 1.397527e-13 | 0.036585 | 1.860880 | 2.862753 | 14.719912 | blue |
1809 | 0.983844 | 0.000172 | 1.0 | 1.793328e-12 | 0.839484 | 0.139732 | 0.211760 | 0.273304 | 0.175407 | 0.804473 | ... | 3.108818e+08 | 2.147187 | 0.931797 | 7.462592e-14 | 1.418139e-13 | 0.031565 | 2.515386 | 2.979493 | 14.923502 | blue |
1847 | 0.887374 | 0.000177 | 1.0 | 2.454361e-12 | 0.885623 | 0.064367 | 0.204107 | 0.344367 | 0.161916 | 0.755113 | ... | 2.662198e+08 | 2.351035 | 0.805419 | 5.355258e-14 | 2.058304e-13 | 0.028790 | 3.046720 | 3.561324 | 12.764657 | blue |
1854 | 0.961591 | 0.000230 | 1.0 | 3.945766e-12 | 0.869408 | 0.117912 | 0.202073 | 0.199677 | 0.153533 | 0.896697 | ... | 2.634596e+08 | 1.580251 | 0.963299 | 5.448800e-14 | 2.194085e-13 | 0.032646 | 2.411045 | 2.771418 | 15.957472 | blue |
1880 | 0.943448 | 0.000193 | 1.0 | 8.306288e-13 | 0.858448 | 0.095690 | 0.190071 | 0.213188 | 0.205013 | 0.835644 | ... | 2.233424e+08 | 1.547798 | 0.803243 | 7.226665e-14 | 2.676576e-13 | 0.025830 | 3.005475 | 3.303471 | 12.003204 | blue |
29 rows × 22 columns
What proportion of blue light solutions that degrade starch use it for energy?
(
("light"] == "blue")
(scan_constraints[& (starch > 0)
& (scan_results.MALTODEG_RXN_c_gc_2 > 0)
sum()
)./ ((scan_constraints["light"] == "blue") & (starch > 0)).sum() * 100 )
95.52549427679502
("light"] == "blue")
(scan_constraints[& (starch > 0)
& ~(scan_results.MALTODEG_RXN_c_gc_2 > 0)
sum() ).
43
43 solutions that use starch in blue light don’t use the energy pathway
(
(
(
scan_results[
("light"] == "blue")
(scan_constraints[& (starch > 0)
& (scan_results.MALTODEG_RXN_c_gc_2 > 0)
)
].MALTODEG_RXN_c_gc_2
)/ starch[
("light"] == "blue")
(scan_constraints[& (starch > 0)
& (scan_results.MALTODEG_RXN_c_gc_2 > 0)
)
]
)* 100
).mean()
6.917530468681961
Average of 6.9% of starch degraded was used for energy
7d - How does glucose increase during opening vary with starch, and why isn’t it totally linear?
Is sucrose degaded in the cytoplasm in any solutions?
> 0]["RXN_1461_c_gc_2"] > 0).sum() (scan_results[starch
0
No
= scan_results[starch > 0]["RXN_1461_v_gc_2"] > 0.000001
sucrose_degraded_v = scan_results[starch > 0]["RXN_1461_v_gc_2"] < 0.000001
no_sucrose_degraded_v = (
glucose_import_into_vacuole > 0]["GLC_PROTON_rev_cv_gc_2"] > 0.000001
scan_results[starch
)= (
no_glucose_import_into_vacuole > 0]["GLC_PROTON_rev_cv_gc_2"] < 0.000001
scan_results[starch )
= sucrose_degraded_v & glucose_import_into_vacuole
sucrose_deg_and_glc_import = sucrose_degraded_v & no_glucose_import_into_vacuole
sucrose_deg_no_glc_import = no_sucrose_degraded_v & glucose_import_into_vacuole
no_sucrose_deg_glc_import = no_sucrose_degraded_v & no_glucose_import_into_vacuole no_sucrose_deg_no_glc_import
= [
conditions
sucrose_deg_and_glc_import,
sucrose_deg_no_glc_import,
no_sucrose_deg_glc_import,
no_sucrose_deg_no_glc_import,
]= ["+ S.d. + G.i.", "+ S.d - G.i.", "- S.d + G.i.", "- S.d - G.i."] labels
for condition, label in zip(conditions, labels):
print(f"{label}:")
print(
f"Length: {(condition).sum()} ({((condition).sum()/len(scan_constraints[starch > 0]) * 100).round(1)}%)"
)= (
starch_proportion
(> 0][condition].STARCH_p_gc_Linker_1
scan_results[starch / scan_gc_constraints.loc[starch > 0][condition].Os_dif
)* 100
).median()print(f"Starch median % of osmolarity: {starch_proportion}")
= (
starch_proportion
(> 0][condition].STARCH_p_gc_Linker_1
scan_results[starch / scan_gc_constraints.loc[starch > 0][condition].Os_dif
)* 100
).mean()print(f"Starch mean % of osmolarity: {starch_proportion}")
= (
starch_proportion
(> 0][condition].STARCH_p_gc_Linker_1
scan_results[starch / scan_gc_constraints.loc[starch > 0][condition].Os_dif
)* 100
max()
).print(f"Starch max % of osmolarity: {starch_proportion}")
= (
starch_proportion
(> 0][condition].STARCH_p_gc_Linker_1
scan_results[starch / scan_gc_constraints.loc[starch > 0][condition].Os_dif
)* 100
min()
).print(f"Starch min % of osmolarity: {starch_proportion}")
+ S.d. + G.i.:
Length: 1719 (90.9%)
Starch median % of osmolarity: 70.715257356063
Starch mean % of osmolarity: 70.75171038643512
Starch max % of osmolarity: 100.98969258230284
Starch min % of osmolarity: 33.70678055197705
+ S.d - G.i.:
Length: 48 (2.5%)
Starch median % of osmolarity: 42.479873042042186
Starch mean % of osmolarity: 40.49996318207206
Starch max % of osmolarity: 71.26373430673459
Starch min % of osmolarity: 19.421223452295543
- S.d + G.i.:
Length: 12 (0.6%)
Starch median % of osmolarity: 27.90927615890679
Starch mean % of osmolarity: 38.969721275346025
Starch max % of osmolarity: 89.30464909167985
Starch min % of osmolarity: 17.245084430356243
- S.d - G.i.:
Length: 113 (6.0%)
Starch median % of osmolarity: 23.38726473224462
Starch mean % of osmolarity: 26.19498288079809
Starch max % of osmolarity: 88.4285135863311
Starch min % of osmolarity: 0.010864363645033069
= (
glc_increase > 0].GLC_total_pseudolinker_2
scan_results[starch - scan_results[starch > 0].GLC_total_pseudolinker_1
)= glc_increase * 10**-3 / scan_constraints.N_gcs * 10**15 glc_increase_per_gc
def glucose_vs_starch_subfig(ax):
= [0, 600]
x = [0, 600]
y
= 10
size
="grey", alpha=0.5, clip_on=False, linewidth=1)
ax.plot(x, y, c
= [
conditions
sucrose_deg_and_glc_import,
sucrose_deg_no_glc_import,
no_sucrose_deg_glc_import,
no_sucrose_deg_no_glc_import,
]= [
colours 2],
sns.color_palette()[3],
sns.color_palette()[4],
sns.color_palette()[8],
sns.color_palette()[
]= ["+ S.d. + G.i.", "+ S.d - G.i.", "- S.d + G.i.", "- S.d - G.i."]
labels
= glc_increase_per_gc.max()
glucose_increase_max
for condition, colour, label in zip(conditions, colours, labels):
ax.scatter(> 0][condition],
starch_per_gc[starch > 0][condition],
glc_increase_per_gc[starch =colour,
color=size,
s=label,
label=0,
linewidths=False,
clip_on
)
"Starch degradation\n" r"(fmol$\cdot$GC$^{-1}$)", size="medium")
ax.set_xlabel("Increase in glucose (fmol$\cdot$GC$^{-1}$)", size="medium")
ax.set_ylabel(
= glucose_increase_max
y_max = 600
x_max = 200
major_increment None, y_max)
ax.set_ylim(None, x_max)
ax.set_xlim("left"].set_bounds(0, y_max)
ax.spines["bottom"].set_bounds(0, x_max)
ax.spines[
ax.xaxis.set_major_locator(MultipleLocator(major_increment))2))
ax.xaxis.set_minor_locator(AutoMinorLocator(
ax.yaxis.set_major_locator(MultipleLocator(major_increment))2))
ax.yaxis.set_minor_locator(AutoMinorLocator("equal")
ax.set_aspect(
# ax.vlines(
# 184, ymin=0, ymax=570, linewidth=1, linestyle="--", color=sns.color_palette()[6]
# )
# ax.text(
# 184,
# 570,
# "Horrer et al. (2016)",
# ha="center",
# va="bottom",
# size="x-small",
# color=sns.color_palette()[6],
# )
ax.legend(="lower right", bbox_to_anchor=(1, 0), handletextpad=0, fontsize="x-small"
loc
)
return ax
= plt.subplots()
fig, ax
glucose_vs_starch_subfig(ax)
"../outputs/constraint_scan/starch_vs_glucose.svg")
fig.savefig("../outputs/constraint_scan/starch_vs_glucose.png", dpi=300) fig.savefig(
def glucose_vs_starch_subfig(ax):
= [0, 600]
x = [0, 600]
y
= 10
size
="grey", alpha=0.5, clip_on=False, linewidth=1)
ax.plot(x, y, c
= [
conditions
sucrose_deg_and_glc_import,
no_sucrose_deg_glc_import,
no_sucrose_deg_no_glc_import,
sucrose_deg_no_glc_import,
]= [
colours 2],
sns.color_palette()[3],
sns.color_palette()[4],
sns.color_palette()[8],
sns.color_palette()[
]= ["+ Suc deg + Glc import", "- Suc deg + Glc import", "- Suc deg - Glc import", "+ Suc deg - Glc import"]
labels
= glc_increase_per_gc.max()
glucose_increase_max
for condition, colour, label in zip(conditions, colours, labels):
ax.scatter(> 0][condition],
starch_per_gc[starch > 0][condition],
glc_increase_per_gc[starch =colour,
color=size,
s=label,
label=0,
linewidths=False,
clip_on
)
"Starch degradation\n" r"(fmol$\cdot$GC$^{-1}$)", size="medium")
ax.set_xlabel("Increase in glucose (fmol$\cdot$GC$^{-1}$)", size="medium")
ax.set_ylabel(
#y_max = glucose_increase_max
= 600
y_max = 600
x_max = 200
major_increment None, y_max)
ax.set_ylim(None, x_max)
ax.set_xlim("left"].set_bounds(0, y_max)
ax.spines["bottom"].set_bounds(0, x_max)
ax.spines[
ax.xaxis.set_major_locator(MultipleLocator(major_increment))2))
ax.xaxis.set_minor_locator(AutoMinorLocator(
ax.yaxis.set_major_locator(MultipleLocator(major_increment))2))
ax.yaxis.set_minor_locator(AutoMinorLocator("equal")
ax.set_aspect(
# ax.vlines(
# 184, ymin=0, ymax=570, linewidth=1, linestyle="--", color=sns.color_palette()[6]
# )
# ax.text(
# 184,
# 570,
# "Horrer et al. (2016)",
# ha="center",
# va="bottom",
# size="x-small",
# color=sns.color_palette()[6],
# )
ax.legend(="lower right", bbox_to_anchor=(1, 0), handletextpad=0, fontsize='x-small'
loc#prop={'family': 'DejaVu Sans Mono', 'size': 'x-small'},
)
return ax
= plt.subplots()
fig, ax
glucose_vs_starch_subfig(ax)
"../outputs/constraint_scan/starch_vs_glucose.svg")
fig.savefig("../outputs/constraint_scan/starch_vs_glucose.png", dpi=300) fig.savefig(
Combine subfigures
= plt.subplots(2, 2, figsize=(10, 10))
fig, axs
=0.5, wspace=0.35)
plt.subplots_adjust(hspace
0][0])
phloemoutput_subfig(axs[
0][1])
photons_vs_carbon_export_subfig(axs[
1][0])
starch_vs_os_subfig(axs[
1][1])
glucose_vs_starch_subfig(axs[1][1].get_legend().remove()
axs[
for ax, letter in zip(
0][0], axs[0][1], axs[1][0], axs[1][1]], ["A", "B", "C", "D"]
[axs[
):if letter != "D":
-0.4, 1.06, letter, transform=ax.transAxes, size=20, weight="bold")
ax.text(else:
-0.333, 1.06, letter, transform=ax.transAxes, size=20, weight="bold")
ax.text(
fig.savefig("../outputs/constraint_scan/constraint_scan_analysis_plot.svg", transparent=True
)
fig.savefig("../outputs/constraint_scan/constraint_scan_analysis_plot.png", transparent=True
)
Extra analyses not included
What is the ratio of mitochondrial to plastidic ATP synthase?
= plt.subplots(1, 2, figsize=(10, 4))
fig, axs
0].hist(
axs[== "white"]
scan_results.Plastidial_ATP_Synthase_p_gc_2[scan_constraints.light / scan_results.Mitochondrial_ATP_Synthase_m_gc_2[scan_constraints.light == "white"],
=100,
bins
)0].set_title("Opening in white light")
axs[0].set_xlabel("Plastidial ATP Synthase\nMitochondrial ATP Synthase")
axs[1].hist(
axs[
scan_results.Plastidial_ATP_Synthase_p_gc_3/ scan_results.Mitochondrial_ATP_Synthase_m_gc_3,
=100,
bins
)1].set_title("Day in both light types")
axs[1].set_xlabel("Plastidial ATP Synthase\nMitochondrial ATP Synthase") axs[
Text(0.5, 0, 'Plastidial ATP Synthase\nMitochondrial ATP Synthase')
= plt.subplots(1, figsize=(5, 4))
fig, ax
= scan_results.loc[
plastidial_atp_max "Plastidial_ATP_Synthase_p_gc_3", "Plastidial_ATP_Synthase_p_gc_2"]
:, [max(axis=1)
].= scan_results.loc[
mitochondial_atp_max "Mitochondrial_ATP_Synthase_m_gc_3", "Mitochondrial_ATP_Synthase_m_gc_2"]
:, [max(axis=1)
].
for light in ["blue", "white"]:
ax.hist(== light]
plastidial_atp_max[scan_constraints.light / mitochondial_atp_max[scan_constraints.light == light],
="step",
histtype=light,
label
)
"Max plastidial ATP Synthase\nMax mitochondrial ATP Synthase")
ax.set_xlabel(
ax.legend()
= plt.subplots()
fig, ax
0, 0.3], [0, 0.3], c="grey", zorder=0)
ax.plot([=1) ax.scatter(plastidial_atp_max, mitochondial_atp_max, s
/ mitochondial_atp_max).min() (plastidial_atp_max
0.016260605303926066
Almost all starch is used for glucose, and PEP carboxykinase reaction never runs
> 0).sum() (scan_results.PEPCARBOX_RXN_c_gc_2
77
> 0).sum() (scan_results.PEPDEPHOS_RXN_c_gc_2
1237
> 0) & (scan_results.PEPDEPHOS_RXN_c_gc_2 > 0)).sum() ((scan_results.MALTODEG_RXN_c_gc_2
1227
> 0) & (scan_results.PYRUVDEH_RXN_m_gc_2 > 0)).sum() ((scan_results.MALTODEG_RXN_c_gc_2
1227
(> 0)
(scan_results.MALTODEG_RXN_c_gc_2 & (scan_results.ISOCITRATE_DEHYDROGENASE_NAD_RXN_m_gc_2 > 0)
sum() ).
1266
(> 0)].MALTODEG_RXN_c_gc_2 / 2
scan_results[(scan_results.MALTODEG_RXN_c_gc_2 - scan_results[(scan_results.MALTODEG_RXN_c_gc_2 > 0)].PEPDEPHOS_RXN_c_gc_2
=100) ).hist(bins
(> 0)].MALTODEG_RXN_c_gc_2 / 2
scan_results[(scan_results.MALTODEG_RXN_c_gc_2 - scan_results[(scan_results.MALTODEG_RXN_c_gc_2 > 0)].PYRUVDEH_RXN_m_gc_2
=100) ).hist(bins
(> 0)].MALTODEG_RXN_c_gc_2
scan_results[(scan_results.MALTODEG_RXN_c_gc_2 - scan_results[
> 0)
(scan_results.MALTODEG_RXN_c_gc_2
].ISOCITRATE_DEHYDROGENASE_NAD_RXN_m_gc_2 )
0 0.001622
1 0.005446
3 0.001043
4 0.001028
6 0.006612
...
1931 0.003674
1932 0.002604
1933 0.007325
1934 0.002005
1935 0.005452
Length: 1266, dtype: float64
> 0).sum() (scan_results.MAL_total_pseudolinker_2
433
scan_constraints[
(- scan_results.MAL_total_pseudolinker_1)
(scan_results.MAL_total_pseudolinker_2 > 0
) ]
P_abs | T_l | A_l | V_gc_ind | FqFm | R_ch | R_ch_vol | L_air | L_epidermis | Vac_frac | ... | N_gcs | n | m | r | s | C_apo | A_closed | A_open | ATPase | light | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0.923180 | 0.000190 | 1.0 | 1.250880e-12 | 0.889162 | 0.093534 | 0.195869 | 0.337197 | 0.196606 | 0.837767 | ... | 1.064044e+09 | 2.025073 | 0.946228 | 5.400144e-14 | 1.664063e-13 | 0.023524 | 2.500598 | 9.754649 | 0.549826 | white |
6 | 0.912552 | 0.000236 | 1.0 | 2.797833e-12 | 0.791717 | 0.122612 | 0.211564 | 0.203218 | 0.121087 | 0.788955 | ... | 8.580407e+08 | 1.718809 | 0.985739 | 6.484944e-14 | 2.811758e-13 | 0.028334 | 1.156307 | 11.339261 | 2.620532 | white |
7 | 0.811951 | 0.000203 | 1.0 | 1.725438e-12 | 0.862305 | 0.134778 | 0.202345 | 0.342059 | 0.149051 | 0.886573 | ... | 5.641395e+08 | 2.345712 | 0.922066 | 7.661761e-14 | 1.713217e-13 | 0.024734 | 3.836327 | 11.685743 | 0.807819 | white |
13 | 0.868580 | 0.000235 | 1.0 | 2.230336e-12 | 0.813387 | 0.143595 | 0.210389 | 0.231901 | 0.233709 | 0.788520 | ... | 8.827028e+08 | 1.563814 | 0.955703 | 5.755866e-14 | 2.976694e-13 | 0.032311 | 2.576765 | 10.693166 | 4.401374 | white |
28 | 0.905738 | 0.000226 | 1.0 | 2.077161e-12 | 0.858599 | 0.065746 | 0.199877 | 0.232093 | 0.200455 | 0.892994 | ... | 1.832267e+08 | 2.259343 | 0.879945 | 6.486503e-14 | 1.705626e-13 | 0.027999 | 2.573815 | 6.189742 | 0.199106 | white |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1929 | 0.963328 | 0.000213 | 1.0 | 3.549447e-12 | 0.822882 | 0.088125 | 0.207902 | 0.284514 | 0.172490 | 0.882110 | ... | 3.941232e+08 | 1.836419 | 0.800060 | 7.761785e-14 | 1.283119e-13 | 0.025384 | 3.250332 | 8.157482 | 5.580050 | blue |
1930 | 0.878002 | 0.000222 | 1.0 | 2.235053e-12 | 0.861774 | 0.132702 | 0.209615 | 0.209708 | 0.145820 | 0.865507 | ... | 3.784323e+08 | 2.348202 | 0.814245 | 5.768938e-14 | 2.320267e-13 | 0.030561 | 2.664441 | 11.247607 | 3.675367 | blue |
1932 | 0.957473 | 0.000185 | 1.0 | 2.755496e-12 | 0.798181 | 0.097823 | 0.201847 | 0.193194 | 0.138359 | 0.823731 | ... | 6.623405e+08 | 1.889247 | 0.969003 | 6.787495e-14 | 1.566538e-13 | 0.032169 | 1.321999 | 5.766979 | 2.750124 | blue |
1933 | 0.816118 | 0.000174 | 1.0 | 2.957736e-12 | 0.825422 | 0.149150 | 0.200244 | 0.323872 | 0.209562 | 0.830375 | ... | 9.035571e+08 | 1.971395 | 0.971101 | 7.917051e-14 | 2.960270e-13 | 0.031594 | 1.293918 | 7.247967 | 1.492903 | blue |
1935 | 0.953724 | 0.000240 | 1.0 | 1.884973e-12 | 0.894087 | 0.135577 | 0.189014 | 0.241198 | 0.137301 | 0.844829 | ... | 5.504971e+08 | 1.561648 | 0.977668 | 6.731378e-14 | 2.085531e-13 | 0.036108 | 2.326208 | 9.325369 | 4.832752 | blue |
375 rows × 22 columns
#starch[1384]
#(scan_constraints.loc[1384] - scan_constraints.mean()) / scan_constraints.std()
#scan_constraints.loc[1384].ATPase
scan_constraints.mean().ATPase
/tmp/ipykernel_8731/856568451.py:1: FutureWarning: The default value of numeric_only in DataFrame.mean is deprecated. In a future version, it will default to False. In addition, specifying 'numeric_only=None' is deprecated. Select only valid columns or specify the value of numeric_only to silence this warning.
scan_constraints.mean().ATPase
8.53114718372621
#atpase_constrained[1384]
#scan_results.loc[1384].MALTODEG_RXN_c_gc_2 / starch[1384] * 100
#scan_results.loc[1384].RXN_2141_p_gc_2
#scan_results.loc[1384].MALATE_DEH_RXN_m_gc_2
#scan_results.loc[1384].ISOCITRATE_DEHYDROGENASE_NAD_RXN_m_gc_2
#(scan_gc_constraints.loc[1384] - scan_gc_constraints.mean()) / scan_gc_constraints.std()
for i in [i+1 for i in range(4)]:
= f"PALMITATE_c_gc_Linker_{i}"
reaction print(reaction)
print(scan_results.loc[:, reaction].sum())
PALMITATE_c_gc_Linker_1
0.0
PALMITATE_c_gc_Linker_2
0.0
PALMITATE_c_gc_Linker_3
0.0
PALMITATE_c_gc_Linker_4
0.0
filter(like="ATPase", axis=1) scan_results.
PROTON_ATPase_c_me_1 | PROTON_ATPase_c_me_2 | PROTON_ATPase_c_me_3 | PROTON_ATPase_c_me_4 | PROTON_ATPase_c_gc_1 | PROTON_ATPase_c_gc_2 | PROTON_ATPase_c_gc_3 | PROTON_ATPase_c_gc_4 | ATPase_tx_me_1 | ATPase_tx_me_2 | ATPase_tx_me_3 | ATPase_tx_me_4 | ATPase_tx_gc_1 | ATPase_tx_gc_2 | ATPase_tx_gc_3 | ATPase_tx_gc_4 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1.107532 | 3.646232 | 3.763789 | 1.104726 | 0.000025 | 0.004851 | 0.004851 | 0.000025 | 10.025916 | 12.182122 | 12.182122 | 10.025916 | 0.000444 | 0.000973 | 0.000973 | 0.000444 |
1 | 1.271757 | 4.186898 | 4.311376 | 1.268535 | 0.000057 | 0.000585 | 0.000585 | 0.000057 | 10.025916 | 12.468127 | 12.468127 | 10.025916 | 0.000444 | 0.000967 | 0.000967 | 0.000444 |
2 | 1.131079 | 3.723755 | 3.832643 | 1.128600 | 0.000000 | 0.004505 | 0.000000 | 0.000000 | 10.025916 | 12.223283 | 12.223283 | 10.025916 | 0.000444 | 0.000598 | 0.000598 | 0.000444 |
3 | 1.207758 | 3.976199 | 4.097909 | 1.204698 | 0.000583 | 0.004855 | 0.002277 | 0.000583 | 10.025916 | 12.356973 | 12.356973 | 10.025916 | 0.000444 | 0.000508 | 0.000508 | 0.000444 |
4 | 1.260299 | 4.149174 | 4.286096 | 1.257106 | 0.000025 | 0.011479 | 0.007823 | 0.000025 | 10.025916 | 12.448415 | 12.448415 | 10.025916 | 0.000444 | 0.000614 | 0.000614 | 0.000444 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1931 | 1.105102 | 3.315307 | 3.773362 | 1.102419 | 0.000025 | 0.006605 | 0.006605 | 0.000025 | 10.025916 | 10.025916 | 12.273932 | 10.025916 | 0.000444 | 0.000444 | 0.001019 | 0.000444 |
1932 | 1.261907 | 3.785721 | 4.297397 | 1.258843 | 0.000057 | 0.001822 | 0.001822 | 0.000057 | 10.025916 | 10.025916 | 12.558822 | 10.025916 | 0.000444 | 0.000444 | 0.001011 | 0.000444 |
1933 | 1.056017 | 3.168052 | 3.599472 | 1.053454 | 0.000057 | 0.001349 | 0.001349 | 0.000057 | 10.025916 | 10.025916 | 12.183832 | 10.025916 | 0.000444 | 0.000444 | 0.001976 | 0.000444 |
1934 | 1.228512 | 3.685537 | 4.184889 | 1.225530 | 0.000025 | 0.003092 | 0.003092 | 0.000215 | 10.025916 | 10.025916 | 12.498539 | 10.025916 | 0.000444 | 0.000444 | 0.000641 | 0.000444 |
1935 | 1.256399 | 3.769198 | 4.279254 | 1.253349 | 0.000057 | 0.002660 | 0.002660 | 0.000057 | 10.025916 | 10.025916 | 12.549088 | 10.025916 | 0.000444 | 0.000444 | 0.000826 | 0.000444 |
1934 rows × 16 columns
scan_constraints
P_abs | T_l | A_l | V_gc_ind | FqFm | R_ch | R_ch_vol | L_air | L_epidermis | Vac_frac | ... | N_gcs | n | m | r | s | C_apo | A_closed | A_open | ATPase | light | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0.815093 | 0.000194 | 1.0 | 2.262641e-12 | 0.809297 | 0.179970 | 0.191527 | 0.240879 | 0.214860 | 0.858645 | ... | 4.484392e+08 | 1.933548 | 0.992641 | 7.886553e-14 | 1.678654e-13 | 0.033679 | 2.321339 | 11.318979 | 10.816668 | white |
1 | 0.923180 | 0.000190 | 1.0 | 1.250880e-12 | 0.889162 | 0.093534 | 0.195869 | 0.337197 | 0.196606 | 0.837767 | ... | 1.064044e+09 | 2.025073 | 0.946228 | 5.400144e-14 | 1.664063e-13 | 0.023524 | 2.500598 | 9.754649 | 0.549826 | white |
2 | 0.830507 | 0.000220 | 1.0 | 5.035745e-13 | 0.821060 | 0.167889 | 0.204824 | 0.331556 | 0.205674 | 0.816618 | ... | 5.758277e+08 | 2.141889 | 0.972835 | 6.579620e-14 | 2.457118e-13 | 0.034062 | 2.802180 | 3.338120 | 7.823891 | white |
3 | 0.880998 | 0.000192 | 1.0 | 8.629192e-13 | 0.866582 | 0.051244 | 0.204472 | 0.309538 | 0.169957 | 0.813726 | ... | 3.851195e+08 | 2.077401 | 0.940848 | 5.747590e-14 | 1.515328e-13 | 0.029770 | 3.399462 | 9.936390 | 12.606738 | white |
4 | 0.915597 | 0.000220 | 1.0 | 7.391447e-13 | 0.846358 | 0.059969 | 0.193449 | 0.352066 | 0.238671 | 0.810491 | ... | 1.046353e+09 | 2.396012 | 0.817798 | 7.654181e-14 | 1.652973e-13 | 0.028420 | 3.305233 | 7.650706 | 10.970481 | white |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1931 | 0.849808 | 0.000174 | 1.0 | 2.640313e-12 | 0.880585 | 0.134355 | 0.193583 | 0.289995 | 0.213762 | 0.794641 | ... | 4.117855e+08 | 1.711337 | 0.981658 | 6.898412e-14 | 1.062431e-13 | 0.033170 | 1.843784 | 11.521533 | 16.039577 | blue |
1932 | 0.957473 | 0.000185 | 1.0 | 2.755496e-12 | 0.798181 | 0.097823 | 0.201847 | 0.193194 | 0.138359 | 0.823731 | ... | 6.623405e+08 | 1.889247 | 0.969003 | 6.787495e-14 | 1.566538e-13 | 0.032169 | 1.321999 | 5.766979 | 2.750124 | blue |
1933 | 0.816118 | 0.000174 | 1.0 | 2.957736e-12 | 0.825422 | 0.149150 | 0.200244 | 0.323872 | 0.209562 | 0.830375 | ... | 9.035571e+08 | 1.971395 | 0.971101 | 7.917051e-14 | 2.960270e-13 | 0.031594 | 1.293918 | 7.247967 | 1.492903 | blue |
1934 | 0.934550 | 0.000234 | 1.0 | 1.122269e-12 | 0.799613 | 0.047919 | 0.202674 | 0.351210 | 0.192651 | 0.814861 | ... | 1.121745e+09 | 2.313188 | 0.857276 | 6.322405e-14 | 1.450759e-13 | 0.023108 | 2.345988 | 6.138390 | 2.756515 | blue |
1935 | 0.953724 | 0.000240 | 1.0 | 1.884973e-12 | 0.894087 | 0.135577 | 0.189014 | 0.241198 | 0.137301 | 0.844829 | ... | 5.504971e+08 | 1.561648 | 0.977668 | 6.731378e-14 | 2.085531e-13 | 0.036108 | 2.326208 | 9.325369 | 4.832752 | blue |
1934 rows × 22 columns
print(min(scan_constraints.P_abs))
print(min(scan_results.Phloem_tx_overall))
0.8101673308967071
12.675979574938289
print(max(scan_constraints.R_ch_vol))
print(min(scan_constraints.R_ch_vol))
0.2128525606703812
0.1889727321710271