From ebe380ccfdcf82a0dce099bac336f3064dfabc70 Mon Sep 17 00:00:00 2001 From: "samira.vandenbogaard" Date: Tue, 30 Jul 2024 17:19:12 +0200 Subject: [PATCH] bugfixes related to pamparametrizer --- Scripts/pam_generation_uniprot_id.py | 8 +++++++- src/PAModelpy/Enzyme.py | 24 ++++++++++++++++++++++++ src/PAModelpy/EnzymeSectors.py | 5 ++++- src/PAModelpy/PAModel.py | 12 ++++++------ 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/Scripts/pam_generation_uniprot_id.py b/Scripts/pam_generation_uniprot_id.py index 7074a25..b68f603 100644 --- a/Scripts/pam_generation_uniprot_id.py +++ b/Scripts/pam_generation_uniprot_id.py @@ -276,7 +276,7 @@ def parse_reaction2protein(enzyme_db: pd.DataFrame, model:cobra.Model) -> dict: # no enzyme information found print('No enzyme information found for reaction: ' + rxn.id) enzyme_id = 'Enzyme_' + rxn.id - gpr_info = parse_gpr_information_for_protein2genes(rxn.gpr, rxn_id) + gpr_info = parse_gpr_information_for_protein2genes(rxn.gpr) rxn2protein[rxn.id] = {enzyme_id: { **kcat_dict, @@ -439,3 +439,9 @@ def filter_sublists(nested_list, target_string): ecoli_pam.change_reaction_bounds('EX_glc__D_e', -10, 0) ecoli_pam.optimize() print(ecoli_pam.objective.value) + import pickle + + with open('path_to_your_pickle_file.pkl', 'wb') as file: + p = pickle.dump(ecoli_pam, file) + with open('path_to_your_pickle_file.pkl', 'rb') as file: + ob = pickle.load(file) diff --git a/src/PAModelpy/Enzyme.py b/src/PAModelpy/Enzyme.py index 62ae1e3..a4cdf0b 100644 --- a/src/PAModelpy/Enzyme.py +++ b/src/PAModelpy/Enzyme.py @@ -380,6 +380,30 @@ def add_enzymes(self, enzymes: DictList): else: self._model.enzymes.append(enzyme) + def __copy__(self) -> "EnzymeComplex": + """Copy the enzyme complex. + + Returns: + PAModelpy.Enzyme.EnzymeComplex: A new enzyme complex that is a copy of the original enzyme. + """ + + cop = copy(super(EnzymeComplex, self)) + return cop + + def __deepcopy__(self, memo: dict) -> "EnzymeComplex": + """Copy the enzyme complex with memo. + + Args: + memo (dict): Automatically passed parameter. + + Returns: + PAModelpy.Enzyme.EnzymeComplex: A new enzyme complex that is a copy of the original enzyme with memo. + """ + + cop = deepcopy(super(EnzymeComplex, self), memo) + return cop + + class EnzymeVariable(Reaction): """EnzymeVariable is a class for holding information regarding the variable representing an enzyme in the model. For each reaction, the enzyme variables are summarized in a CatalyticEvent. diff --git a/src/PAModelpy/EnzymeSectors.py b/src/PAModelpy/EnzymeSectors.py index bb8db70..712ec48 100644 --- a/src/PAModelpy/EnzymeSectors.py +++ b/src/PAModelpy/EnzymeSectors.py @@ -176,7 +176,10 @@ def add(self, model): kcat = dict( (k, v) for k, v in enzyme_dict.items() if k == "f" or k == "b" ) - protein_reaction = enzyme_dict['protein_reaction_association'] + if 'protein_reaction_association' in enzyme_dict.keys(): + protein_reaction = enzyme_dict['protein_reaction_association'] + else: + protein_reaction = enzyme_id # get molar mass of enzyme or replace with default value if "molmass" in enzyme_dict.keys(): diff --git a/src/PAModelpy/PAModel.py b/src/PAModelpy/PAModel.py index 1f5ee13..d7674fb 100644 --- a/src/PAModelpy/PAModel.py +++ b/src/PAModelpy/PAModel.py @@ -999,7 +999,6 @@ def calculate_csc(self, obj_value, mu, mu_ub, mu_lb, mu_ec_f, mu_ec_b): len(self.capacity_sensitivity_coefficients) ] = new_row_LB - print(self.enzymes) for enzyme in self.enzymes: for catalyzing_enzyme in self._get_catalyzing_enzymes_for_enzyme(enzyme): ce = self.enzymes.get_by_id(catalyzing_enzyme) @@ -1168,12 +1167,13 @@ def change_total_protein_constraint(self, p_tot): self.solver.update() def change_sector_parameters( - self, sector, slope: float, intercept: float, lin_rxn_id: str + self, sector, slope: float, intercept: float, lin_rxn_id: str, print_change = False ): - # input in g/gDW - print(f"Changing the slope and intercept of the {sector.id}") - print(f"Changing slope from {sector.slope} to {slope*1e3} mg/gcdw/h") - print(f"Changing intercept from {sector.intercept} to {intercept*1e3} mg/gcdw") + if print_change: + # input in g/gDW + print(f"Changing the slope and intercept of the {sector.id}") + print(f"Changing slope from {sector.slope} to {slope*1e3} mg/gcdw/h") + print(f"Changing intercept from {sector.intercept} to {intercept*1e3} mg/gcdw") prev_intercept = sector.intercept # *1e3 to convert g to mg