diff gem_flux_distribution.py @ 0:dfeabe31d865 draft default tip

planemo upload for repository https://github.com/AlmaasLab/elixir-galaxy-tools-systemsbiology commit 3f7bec1264a86e1488ee1315dbac0f44675f5171
author iuc
date Fri, 13 Dec 2024 21:34:04 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gem_flux_distribution.py	Fri Dec 13 21:34:04 2024 +0000
@@ -0,0 +1,90 @@
+import argparse
+
+import cobra
+import pandas as pd
+
+
+def __main__():
+    parser = argparse.ArgumentParser(
+        prog="FluxDistribution",
+        description="This program calculates the flux distribution of a GEM",
+        epilog="Adding an epilog, but doubt it's needed.",
+    )
+    parser.add_argument(
+        "-m",
+        "--cb_model_location",
+        dest="cb_model_location",
+        action="store",
+        type=str,
+        default=None,
+        required=True,
+        help="The model to use."
+    )
+    parser.add_argument(
+        "-output",
+        "--output",
+        dest="out_file",
+        action="store",
+        type=str,
+        default=None,
+        required=True,
+        help="The output file."
+    )
+    parser.add_argument(
+        "-u",
+        "--uptake_constraints_file",
+        dest="uptake_constraints_file",
+        action="store",
+        type=str,
+        default=None,
+        required=False,
+        help="File containing new uptake constraits."
+    )
+
+    args = parser.parse_args()
+
+    try:
+        cb_model = cobra.io.read_sbml_model(args.cb_model_location)
+    except Exception as e:
+        raise Exception(
+            "The model could not be read. Ensure "
+            "it is in correct SBML format."
+        ) from e
+
+    if args.uptake_constraints_file is not None\
+            and args.uptake_constraints_file != "None":
+        constraints_df = pd.read_csv(
+            args.uptake_constraints_file,
+            sep=";",
+            header=0,
+            index_col=False
+        )
+        for _, row in constraints_df.iterrows():
+            cb_model.reactions.get_by_id(
+                row["reaction_id"]
+            ).lower_bound = row["lower_bound"]
+            cb_model.reactions.get_by_id(
+                row["reaction_id"]
+            ).upper_bound = row["upper_bound"]
+
+    # do pFBA
+    solution = cobra.flux_analysis.pfba(cb_model)
+
+    # make a dataframe with the reaction names,
+    # reaction ids, and flux distribution
+    flux_distribution = pd.DataFrame(
+        columns=["reaction_name", "reaction_id", "flux"]
+    )
+
+    flux_distribution["reaction_name"] = \
+        [reaction.name for reaction in cb_model.reactions]
+    flux_distribution["reaction_id"] = \
+        [reaction.id for reaction in cb_model.reactions]
+    flux_distribution["flux"] = \
+        [solution.fluxes[reaction.id] for reaction in cb_model.reactions]
+
+    flux_distribution.to_csv(args.out_file, sep=";", index=False)
+
+
+if __name__ == "__main__":
+    __main__()