|
@@ -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()
|