Hi, I was trying to use the SMA binding + Lumped Rate Model with Pores to model some chromatography system I needed to model.
I am having some trouble with these questions:
- If my salt concentration is 4 during both load and wash, why do I get that sharp peak of around 20 concentration for my salt?
- No matter what I do with absorption or desorption rate (even increasing and decreasing 100x, the chromatogram of protein 1 stays the exact same). Why is that?
- I have values for length, diameter, porosities, initial concentrations, load, wash, elute concentration etc. and the dispersion, diffusion, binding etc. parameters are unknown which I was trying to do a manual parameter estimation for (trying broad range of values and after getting a reasonable plot, fine-tune with optimisation). I am not getting good results at all, the entire protein is eluting before linear gradient elution even happens. The experimental data I have to work with has a narrow small peak during the end of load and start of wash and then a broad tall peak during elution.
P.S. The concentrations I had were in g/L not mM, I was intending to parameter estimate so that the same numbers can be used as values and the parameters will absorb any conversions that should have happened as I do not have the molecular weight for the protein.
PFA my code:
import numpy as np
from CADETProcess.processModel import ComponentSystem
from CADETProcess.processModel import StericMassAction
from CADETProcess.processModel import Inlet, GeneralRateModel, Outlet, LumpedRateModelWithPores
from CADETProcess.processModel import FlowSheet
from CADETProcess.processModel import Process
component_system = ComponentSystem()
component_system.add_component('Salt')
component_system.add_component('Protein 1')
component_system.add_component('Protein 2')
binding_model = StericMassAction(component_system, name='SMA')
binding_model.is_kinetic = True #False #True
binding_model.adsorption_rate = [0.0, 15000, 3] #[0.0, 30, 3]
binding_model.desorption_rate = [0.0, .015, 15] #[0.0, .5, 15]
binding_model.characteristic_charge = [0.0, 21.0, 7.0] #[0.0, 7.0, 7.0] #
binding_model.steric_factor = [0.0, 5, 50.0] #[0.0, 50.0, 50.0] #
binding_model.capacity = 37.64*3.565 #225.0 #
inlet = Inlet(component_system, name='inlet')
inlet.flow_rate = 1.63333e-8 #2.88e-8
# column = GeneralRateModel(component_system, name='column')
column = LumpedRateModelWithPores(component_system, name='column')
column.binding_model = binding_model
column.length = 0.2 #0.25
column.diameter = 0.005 #0.011286
column.bed_porosity = 0.39 #0.37
column.particle_radius = 2.5e-5 #4.5e-5
column.particle_porosity = 0.64 #0.33
column.axial_dispersion = 2.0e-7
column.film_diffusion = [2.0e-5, 2.0e-7, 2.0e-7]
# column.pore_diffusion = [7e-5, 1e-9, 1e-9]
# column.surface_diffusion = [0.0, 0.0, 0.0]
outlet = Outlet(component_system, name='outlet')
# Flow Sheet
flow_sheet = FlowSheet(component_system)
flow_sheet.add_unit(inlet)
flow_sheet.add_unit(column)
flow_sheet.add_unit(outlet)
flow_sheet.add_connection(inlet, column)
flow_sheet.add_connection(column, outlet)
# Process
process = Process(flow_sheet, 'lwe')
process.cycle_time = 8160 #12000.0
## Create Events and Durations
wash_start = 2160 #4000.0
gradient_start = 3361 #8000.0
concentration_difference = np.array([37.5*3.565, 0.0]) - np.array([3.75*3.565, 0.0])
# concentration_difference = np.array([500, 0.0]) - np.array([70, 0.0])
gradient_duration = process.cycle_time - gradient_start
gradient_slope = concentration_difference/gradient_duration
_ = process.add_event('load', 'flow_sheet.inlet.c', [3.75*3.565, 6.86, 0.16]) #[180.0, 0.1, 0.1]) #
_ = process.add_event('wash', 'flow_sheet.inlet.c', [3.75*3.565, 0.0, 0.0], wash_start) #[70.0, 0.0, 0.0], wash_start) #
_ = process.add_event(
'grad_start',
'flow_sheet.inlet.c',
[[3.75*3.565, gradient_slope[0]], [0, gradient_slope[1]], [0, gradient_slope[1]]],
# [[70.0, gradient_slope[0]], [0, gradient_slope[1]], [0, gradient_slope[1]]],
gradient_start
)
column.c = [3.75*3.565, 0, 0] #[180, 0, 0] #
column.q = [binding_model.capacity, 0, 0] #[3.75, 0, 0] #basetwo-eng-all
Samardeep Sarna
12:53 PM
import numpy as np
from CADETProcess.processModel import ComponentSystem
from CADETProcess.processModel import StericMassAction
from CADETProcess.processModel import Inlet, GeneralRateModel, Outlet, LumpedRateModelWithPores
from CADETProcess.processModel import FlowSheet
from CADETProcess.processModel import Process
component_system = ComponentSystem()
component_system.add_component('Salt')
component_system.add_component('Protein 1')
component_system.add_component('Protein 2')
binding_model = StericMassAction(component_system, name='SMA')
binding_model.is_kinetic = True
binding_model.adsorption_rate = [0.0, 30, 3]
binding_model.desorption_rate = [0.0, .5, 15]
binding_model.characteristic_charge = [0.0, 21.0, 7.0] #[0.0, 7.0, 7.0] #
binding_model.steric_factor = [0.0, 5.0, 50.0] #[0.0, 50.0, 50.0] #
binding_model.capacity = 40 # g/L
inlet = Inlet(component_system, name='inlet')
inlet.flow_rate = 1.6e-8
# column = GeneralRateModel(component_system, name='column')
column = LumpedRateModelWithPores(component_system, name='column')
column.binding_model = binding_model
column.length = 0.2
column.diameter = 0.005
column.bed_porosity = 0.4
column.particle_radius = 2.5e-5
column.particle_porosity = 0.65
column.axial_dispersion = 2.0e-7
column.film_diffusion = [2.0e-5, 2.0e-7, 2.0e-7]
outlet = Outlet(component_system, name='outlet')
# Flow Sheet
flow_sheet = FlowSheet(component_system)
flow_sheet.add_unit(inlet)
flow_sheet.add_unit(column)
flow_sheet.add_unit(outlet)
flow_sheet.add_connection(inlet, column)
flow_sheet.add_connection(column, outlet)
# Process
process = Process(flow_sheet, 'lwe')
process.cycle_time = 8200
## Create Events and Durations
wash_start = 2200
gradient_start = 3300
concentration_difference = np.array([40, 0.0]) - np.array([4, 0.0])
# concentration_difference = np.array([500, 0.0]) - np.array([70, 0.0])
gradient_duration = process.cycle_time - gradient_start
gradient_slope = concentration_difference/gradient_duration
_ = process.add_event('load', 'flow_sheet.inlet.c', [4, 7, 0.2]) #[180.0, 0.1, 0.1]) #
_ = process.add_event('wash', 'flow_sheet.inlet.c', [4, 0.0, 0.0], wash_start) #[70.0, 0.0, 0.0], wash_start) #
_ = process.add_event(
'grad_start',
'flow_sheet.inlet.c',
[[4, gradient_slope[0]], [0, gradient_slope[1]], [0, gradient_slope[1]]],
# [[70.0, gradient_slope[0]], [0, gradient_slope[1]], [0, gradient_slope[1]]],
gradient_start
)
column.c = [4, 0, 0]
column.q = [4, 0, 0] #[binding_model.capacity, 0, 0] #