Bläddra i källkod

Upload files to 'pythonScripts'

Jakob Brakovič 1 månad sedan
förälder
incheckning
589823cbc1
1 ändrade filer med 145 tillägg och 0 borttagningar
  1. 145 0
      pythonScripts/Naredi utezi.py

+ 145 - 0
pythonScripts/Naredi utezi.py

@@ -0,0 +1,145 @@
+import numpy as np
+import matplotlib.pyplot as plt
+import os
+import json
+import cModel
+import runSolver
+import importlib
+
+importlib.reload(cModel)
+importlib.reload(runSolver)
+
+# Load data
+def load_data(modelName, jobDir):
+    Q = runSolver.loadSolutionFromDir(jobDir, True)
+    return Q
+
+def print_lut_keys(Q):
+    lut = Q['lut']
+    # Debug information - removed print statements
+    # print("Available keys in lut:")
+    # for key in lut:
+    #     print(f"Key: {key}, Index: {lut[key]}")
+
+def plot_rbc_to_plasma_ratio(Q):
+    lut = Q['lut']
+    
+    # Debug information - removed print statements
+    # print("Available keys in lut:", lut.keys())
+    
+    # Example keys based on available compartments
+    red_blood_cells_key = 'arterial'
+    plasma_key = 'venous'
+    
+    if red_blood_cells_key not in lut or plasma_key not in lut:
+        raise KeyError(f"Expected keys '{red_blood_cells_key}' or '{plasma_key}' are missing in 'lut'.")
+    
+    fy1 = Q['sol'][:, lut[red_blood_cells_key]]
+    fy = Q['sol'][:, lut[plasma_key]]
+    qy = fy1[1:] / fy[1:]
+    t = Q['t']
+    
+    plt.plot(t[1:], qy)
+    plt.xlabel('Time')
+    plt.ylabel('RBC/Plasma Ratio')
+    plt.title('RBC to Plasma Ratio Over Time')
+    plt.show()
+
+# Parse model and retrieve parameters
+def parse_and_retrieve_parameters(modelFile, parameterFile):
+    model = cModel.model()
+    model.parse(modelFile, parameterFile)
+    # Debug information - removed print statement
+    # print('w(oI) {}'.format(model.getWeight('oralIngestion')))
+    return model
+
+def calculate_derivatives_weights(model, sOut, lut, compartment):
+    """
+    Calculate derivatives and weights for a specific compartment and print sorted results.
+
+    Parameters:
+    - model: An instance of the model object
+    - sOut: Simulation output data
+    - lut: Look-up table (LUT) of compartments
+    - compartment: The compartment for which to calculate derivatives and weights
+    """
+    try:
+        # Compute derivatives for the specified compartment
+        d = model.getDerivatives(sOut, lut[compartment])
+        print(sOut)
+        print(lut[compartment])
+        # Retrieve the LUT for parameter indices and weights
+        lutSE = model.lutSE  # Accessing lutSE as an attribute
+        w = model.getWeights(lutSE)
+        print(lutSE)
+        print(w)
+        print(d)
+        # Ensure the lengths of arrays match
+        if len(lutSE) != len(d) or len(lutSE) != len(w):
+            raise ValueError("Mismatch in lengths of LUT, derivatives, or weights.")
+        
+        # Calculate weighted derivatives
+        s = {x: d[lutSE[x]] * w[lutSE[x]] for x in lutSE}
+        s = dict(sorted(s.items(), key=lambda item: item[1], reverse=True))
+        # Print the results
+        print(f"Top 10 derivatives and weights for compartment '{compartment}':")
+        for p in list(s)[:10]:
+            j = lutSE[p]
+            print(f'{p}: Weighted Derivative = {d[j] * w[j]:.2g} (Derivative = {d[j]:.2g}, Weight = {w[j]:.2g})')
+    
+    except AttributeError as e:
+        print(f"Error accessing model methods or attributes: {e}")
+    
+    except ValueError as e:
+        print(f"Value error: {e}")
+
+
+
+def retrieve_and_calculate_total_mass(model, setup):
+    tscale = runSolver.getScale(setup)
+    
+    # Attempt to retrieve parameters with attribute checking
+    blood_to_plasma_pc_scale = getattr(model, 'bloodToPlasmaPCscale', None)
+    blood_volume = getattr(model, 'bloodVolume', None)
+    
+    # Print debug information
+    if blood_to_plasma_pc_scale is not None:
+        print(f'Blood to Plasma PC Scale: {blood_to_plasma_pc_scale}')
+    else:
+        print('Blood to Plasma PC Scale parameter is missing.')
+    
+    if blood_volume is not None:
+        print(f'Blood Volume: {blood_volume}')
+    else:
+        print('Blood Volume parameter is missing.')
+    
+    return blood_to_plasma_pc_scale, blood_volume
+
+
+
+
+def main():     #PAZI MODEL in PArameter File morta bit ista!!!
+    # Define job directory and model files
+    jobDir = os.path.join(os.path.expanduser('~'), 'Documents', 'Sola', 'IJS', 'PBPK_public', 'cDiazepam1_IVP')
+    modelFile = os.path.join(os.path.expanduser('~'), 'Documents', 'Sola', 'IJS', 'PBPK_public', 'models', 'cDiazepam.json')
+    parameterFile = os.path.join(os.path.expanduser('~'), 'Documents', 'Sola', 'IJS', 'PBPK_public', 'models', 'cDiazepam_parameters.json')
+    
+    # Load data
+    Q = load_data('cDiazepam1_IVP', jobDir)
+    
+    # Plot RBC to Plasma Ratio
+    plot_rbc_to_plasma_ratio(Q)
+    
+    # Parse model and retrieve parameters
+    model = parse_and_retrieve_parameters(modelFile, parameterFile)
+    
+    # Calculate derivatives and weights for 'kidney'
+    compartment = 'kidney'
+    calculate_derivatives_weights(model, Q['sOut'], Q['lut'], compartment)
+    
+    # Retrieve model and calculate total mass
+    setup = Q['setup']
+    retrieve_and_calculate_total_mass(model, setup)
+
+if __name__ == "__main__":
+    main()