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