# Chromatography Transition Analysis in Seeq

## Recommended Posts

• Seeq Team

Chromatography Transition Analysis in Seeq

Many biopharmaceutical companies use Transition Analysis to monitor column integrity. Transition Analysis works by using a step change in the input conductivity signal and tracking the conductivity at the outlet of the column. The output conductivity transition can be analyzed via moment analysis to calculate the height of a theoretical plate (HETP) and the Asymmetry factor as described below.  Step 1: Load Data and Find Transition Periods

In order to perform this analysis in Seeq, we start by loading outlet conductivity and flow rate data for the column: Note: Depending on the density of the conductivity data, many companies find that some filtering of the data needs to be performed to get consistent results when performing the above differential equations. The agilefilter operator in Formula can be helpful to perform this filtering if needed:

\$cond.agileFilter(0.5min)

Once the data is loaded, the next step is to find the transition periods. The transition periods can be found using the Profile Search tool as shown in the screenshot below. Alternate methods using changes in the signal such as a delta or derivative with Value Searches have also been applied. Step 2: Calculate HETP

As the derivatives are a function of volume instead of time, the next step is to calculate the volume using the following formula:

`Volume = \$flow.integral(\$Trans)`

The dC/dV function used in the moment formulas can then be calculated:

`dCdV = runningDelta(\$Cond) / runningDelta(\$vol)`

Using that function, the moments (M0 through M2) can be calculated:

`M0 = (\$dCdV*runningDelta(\$vol)).aggregate(sum(), \$Trans, middleKey())`
`M1 = ((\$vol*\$dCdV)*runningDelta(\$vol)).aggregate(sum(), \$Trans, middleKey())`
`M2 = ((\$dCdV*(\$vol^2))*runningDelta(\$vol)).aggregate(sum(), \$Trans, middleKey())`

The moments are then used to calculate the variance:

`Variance = (\$M2/\$M0) - (\$M1/\$M0)^2`

Finally, the HETP can be calculated:

`HETP = ((columnlength*\$variance)/(\$M1/\$M0)^2)`

In this case, the column length value needs to be inserted in the units desired for HETP (e.g. 52mm). The final result should look like the following screenshot: Alternatively, all of the calculations can be performed in a single Formula in Seeq as shown in the code below:

`\$vol = \$flow.integral(\$Trans)`
`\$dCdV = runningDelta(\$cond) / runningDelta(\$vol)`
`\$M0 = (\$dCdV*runningDelta(\$vol)).aggregate(sum(), \$Trans, middleKey())`
`\$VdCdV = \$vol*\$dCdV`
`\$M1 = (\$VdCdV*runningDelta(\$vol)).aggregate(sum(), \$Trans, middleKey())`
`\$V2dCdV = \$dCdV*\$vol^2`
`\$M2 = (\$V2dCdV*runningDelta(\$vol)).aggregate(sum(), \$Trans, middleKey())`
`\$variance = (\$M2/\$M0) - (\$M1/\$M0)^2 `
`(52mm*\$variance)/((\$M1/\$M0)^2)   //where 52mm is the column length, L`

Step 3: Calculate Asymmetry

Asymmetry is calculated by splitting the dC/dV peak by its max value into a right and left side and comparing the volume change over those sides. This section assumes you have done the calculations to get volume and dC/dV calculated already as performed for HETP in Step 2 above.

The first step for Asymmetry is to determine a minimum threshold for dC/dV to begin and end the peaks. This is often done by calculating a percentage of the difference between the maximum and minimum part of the transition period (e.g. 10%):

`\$min = \$dCdV.aggregate(minValue(), \$Trans, durationKey())  `
`\$max = \$dCdV.aggregate(maxValue(), \$Trans, durationKey())`
`\$min + 0.1*(\$max - \$min)`

The Deviation Search tool can then be used to identify the time when dC/dV is greater than the 10% value obtained above. Next, the maximum point of the dC/dV peaks can be determined by calculating the derivative of dC/dV in the Formula tool:

`\$dCdV.derivative()`

The derivative can then be searched for positive values (greater than 0) with the Value Search tool to identify the increasing part of the dC/dV curve.

Finally, a Composite Condition intersecting the positive dC/dV derivative and the transition values above 10% of the curve will result in the identification of the left side of the dC/dV curve: The right side of the dC/dV curve can then be determined using Composite Condition with the A minus B operator to subtract the positive dC/dV derivative from the transition above 10%: The change in volume can then be calculated by aggregating the delta in volume over each side of the peak using Formula:

`\$Vol.aggregate(delta(), \$LeftSide, middleKey()).aggregate(maxValue(), \$Trans, middleKey())`

Finally, the Asymmetry ratio can be calculated by dividing the volume change of the right side of the peak divided by the volume change of the left side of the peak.

`\$VolRightSide/\$VolLeftSide`

The final view should look similar to the following: Similar to HETP, all of the above formulas for Asymmetry may be calculated in a single formula with the code below:

`\$vol = \$flow.integral(\$Trans)`
`\$dCdV = (runningDelta(\$cond) / runningDelta(\$vol)).agileFilter(4sec)`
` `
`//calculate 10%ile of dCdV`
`\$min = \$dCdV.aggregate(minValue(), \$Trans, durationKey())  `
`\$max = \$dCdV.aggregate(maxValue(), \$Trans, durationKey())`
`\$dCdV10prc = \$min + 0.1*(\$max - \$min)`
` `
`//Deviation search for when dCdV is above the 10%ile`
`\$deviation1 = \$dCdV - \$dCdV10prc`
`\$Above10 = valueSearch(\$deviation1, 1h, isGreaterThan(0), 0min, true, isLessThan(0), 0min, true)`
` `
`//Calculate filtered derivative of dCdV`
`\$dCdVderiv = \$dCdV.derivative() `
` `
`//Value Search for Increasing dCdV (positive filtered derivative of dCdV)`
`\$dCdVup = \$dCdVderiv.validValues().valueSearch(40h, isGreaterThan(0), 30s, isLessThanOrEqualTo(0), 0min)`
` `
`//Composite Conditions to find increasing left side above 10% and right side`
`\$LeftSide = \$Above10.intersect(\$dCdVup)`
`\$RightSide = \$Above10.minus(\$dCdVup)`
` `
`//Find change in volume over left side and right sides, then divide b/a`
`\$VolLeftSide = \$Vol.aggregate(delta(), \$LeftSide, middleKey()).aggregate(maxValue(), \$Trans, middleKey())`
`\$VolRightSide = \$Vol.aggregate(delta(), \$RightSide, middleKey()).aggregate(maxValue(), \$Trans, middleKey())`
` `
`\$VolRightSide/\$VolLeftSide`

Optional Alteration: Multiple Columns

It should be noted that oftentimes the conductivity signals are associated to multiple columns in a chromatography system. The chromatography system may switch between two or three columns all reading on the same signal. In order to track changes in column integrity for each column individually, one must assign the transitions to each column prior to performing the Transition Analysis calculations.

Multiple methods exist for assigning transitions to each column. Most customers generally have another signal(s) that identify which column is used. This may be valve positions or differential pressure across each column. These signals enable a Value Search (e.g. “Open” or “High Differential Pressure”) to then perform a Composite Condition to automatically assign the columns in use with their transitions. Alternatively, if no signals are present to identify the columns, the columns can be assigned manually through the Custom Condition tool or assigned via a counting system if the order of the columns is constant.

An example of Asymmetry calculated for multiple columns is shown below:  Edited by Joe Reckamp