Hello everyone,
I just learned the CADET-Process recently and feel its powerful ability.
I am currently using reverse phase chromatography to separate an industrial peptide. Mobile phase A is a salt , and mobile phase B is acetonitrile. The adsorption model I plan to use is MobilePhaseModulator and the mass transfer model is LumpedRateMadelWithoutPores.
My current question is whether the MPM adsorption model should model both salt and organic phases with peptides simultaneously. I see that the guidance only considers salt as the first component?
Furthermore, has anyone used the MPM model to simulate reverse phase chromatography examples involving organic phases ?
I was trying to use the Mobile Phase Modulator binding model with component 1 being salt and component 2 being acetonitrile , component 3 and 4 being some peptides.Is it right ?
This is my code, and I am currently considering salt as the first ingredient, which is a modulator. The second component is a polypeptide. The entire process is variable in flow rate and concentration.The process includes load, wash, gradient elution 1, and gradient elution 2. The flow rate for load and wash is 1mL/min, and the flow rate for elution is 0.5mL/min.Running code encountered an error with length mismatch “ValueError: arange: cannot compute length”. Can someone point out the problem? I am extremely grateful.
import numpy as np
import matplotlib.pyplot as plt
from CADETProcess.processModel import ComponentSystem
from CADETProcess.processModel import MobilePhaseModulator
from CADETProcess.processModel import Inlet, LumpedRateModelWithoutPores, Outlet
from CADETProcess.processModel import FlowSheet
from CADETProcess.processModel import Process
from CADETProcess.reference import ReferenceIO
from CADETProcess.comparison import Comparator
import pandas as pd
# Component System
component_system = ComponentSystem()
component_system.add_component('CH3COONH4',molecular_weight = 77.082)
component_system.add_component('liraglutide',molecular_weight = 3751.20)
# Binding Model
binding_model = MobilePhaseModulator(component_system,name='MPM')
binding_model.is_kinetic = True
binding_model.adsorption_rate = [0, 1]
binding_model.desorption_rate = [0, 0.010]
binding_model.capacity = [0, 100]
binding_model.ion_exchange_characteristic = [0, 0.4]
binding_model.hydrophobicity = [0, 0.1]
# Unit Operations
feed = Inlet(component_system, name='feed')
feed.flow_rate = 1.0/(60*1e6)
feed.c = [64, 3.757192,]
eluent = Inlet(component_system, name='eluent')
eluent.flow_rate = 0.5/(60*1e6)
eluent.c = [64, 0,]
column = LumpedRateModelWithoutPores(component_system, name='column')
column.binding_model = binding_model
column.total_porosity = 0.37
column.length = 0.25
column.diameter = 0.0046
column.axial_dispersion = 2e-7
column.solution_recorder.write_solution_bulk = True
column.c = [64, 0]
outlet = Outlet(component_system, name='outlet')
#flow_sheet
flow_sheet = FlowSheet(component_system)
flow_sheet.add_unit(feed)
flow_sheet.add_unit(eluent)
flow_sheet.add_unit(column)
flow_sheet.add_unit(outlet, product_outlet=True)
flow_sheet.add_connection(feed, column)
flow_sheet.add_connection(eluent, column)
flow_sheet.add_connection(column, outlet)
#process
total_time = 5400
t_load_end = 30
t_wash_duration = 570
t_elute1_start = 600
t_elute1_duration = 15*60
t_elute2_start = t_elute1_start + t_elute1_duration
t_elute2_duration = total_time - t_elute2_start
Q1=1.0/(60*1e6)
Q2=0.5/(60*1e6)
process = Process(flow_sheet, 'reverse phase')
process.add_event('wash_off', 'flow_sheet.eluent.flow_rate', 0,time = 0)
process.add_event('load_on', 'flow_sheet.feed.flow_rate', Q1,time = 0)
process.add_event('load_off', 'flow_sheet.feed.flow_rate', 0,time = t_load_end)
process.add_event('wash_on', 'flow_sheet.eluent.flow_rate', Q1,time = t_load_end)
process.add_event('elute1_on', 'flow_sheet.eluent.flow_rate', Q2,time = t_elute1_start)
# process.add_event_dependency('wash_on', ['load_off'])
# process.add_event_dependency('wash_off', ['load_on'])
process.add_event('load_start', 'flow_sheet.feed.c', [64, 3.757192,],indices=[(0, 0), (1, 0)],time = 0)
process.add_event('load_end', 'flow_sheet.feed.c', [64,0],indices=[(0, 0), (1, 0)],time = t_load_end)
process.add_event('elute1_start', 'flow_sheet.eluent.c', [[64,(48-64)/t_elute1_duration ,0,0],[0,0,0,0]], time=t_elute1_start)
process.add_event('elute2_start', 'flow_sheet.eluent.c', [[48,(40-48)/t_elute2_duration ,0,0],[0,0,0,0]], time=t_elute2_start)
_ = process.plot_events()
if __name__ == '__main__':
from CADETProcess.simulator import Cadet
process_simulator = Cadet()
simulation_results = process_simulator.simulate(process)
from CADETProcess.plotting import SecondaryAxis
sec = SecondaryAxis()
sec.components = ['CH3COONH4']
sec.y_label = '$c_{CH3COONH4}(mM)$'
simulation_results.solution.column.inlet.plot(secondary_axis=sec)
simulation_results.solution.column.outlet.plot(secondary_axis=sec)
Hello chenkangnan,
your code was missing the total process time. If you add this line:
process.cycle_time = total_time
after the definition of your events, it will run the simulation without errors.
If you need more input please let us know.
Regarding your modeling question: is your process set up to be sensitive to both changes in salt concentration and acetonitrile concentration? If so, I don’t currently know of an isotherm that is sensitive to two mobile-phase modulators (if one of them isn’t the pH, for which we have the Generalized Ion Exchange — CADET).
Hi ronald.jaepel,
Thank you for your patient reply. The code has successfully run.
The mobile phase A I used is ammonium acetate, and the mobile phase B is acetonitrile. The elution method is gradient elution. In fact, the elution behavior of the target peptide is most affected by the proportion (concentration) of acetonitrile. In that case, should I only consider modeling acetonitrile as a modulator?
Yes, I would try to use the component with the larger influence on elution as the modulator and see how well you can describe your experiments with that setup. If you find discrepancies between the model and your data that can not be captured by having only one mobile phase modulator and you have a model suggestion for an isotherm that would be useful to describe this situation, please feel free to reach out and we will see if we can help you incorporate that isotherm into CADET.
Thank you for your reply. I will first try to model using Cadet’s existing MobilePhaseModulator model. Also, may I ask how to estimate the initial value of parameters?
To characterize a system (i.e. estimate parameter values) you can check out these guides on transport parameters and binding parameters. If you feel stuck or would like to talk about the setup in more detail, feel free to join the Office Hours where the CADET Team takes time to sit down and chat with CADET Users.