Isotopic calibration details

The LI-6800 can apply an empirical calibration to the TGA’s isotopic concentrations based on data collected via a CO2 sweep (initiated from The Isotopic Cal page). This section describes how that empirical correction is determined.

Let X be a set of 12CO2 concentrations gathered during a calibration sweep. Y is the corresponding set of isotopologue concentrations (13CO2, or C18O2, or C17O2, and Z the corresponding per mille values (δ13C or δ18O or δ17O).

We assume that at the basis concentration b (the 12CO2 concentration at which the TGA has most recently been spanned) the measurements of X, Y, and Z are all correct.

Figure 12‑57 illustrates an example data set for 13CO2 in which we have made measurements at 10 different CO2 concentrations.

Figure 12‑57. An isotopic calibration data set. + are measurements, and the solid line is the target value of δ13C for all concentrations based on its value at the basis concentration.

Given this Figure 12‑57 data, we can compute what correction (offset) in Y values is required so that the Z value matches the target Zb value. These are plotted in Figure 12‑58.

Figure 12‑58. An isotopic cal: Observed per mille values (+), the assumed constant per mille (red line), and the computed correction for each observed point () and the spline-fit correction function (blue line).

The adjust values are fitted, and that fit function is the source of sample adjustment values (e.g., C13_sa). The reference adjust values are based on the value necessary to make Z = Zb.

The curve fit

The isotopic cal curve is implemented with a spline-like technique. With the data sorted by the independent variable (12CO2). Every three point sequential combination is fit with a 2nd order polynomial. The starting and ending pairs use a first order fit. For example, given a data set

x = [x0, x1, ..., xn], y = [y0, y1, ..., yn]

Polynomial p0 is a 1st order fit of subscripts 0 and 1, p1 a fit of subscripts 1, 2, 3, and so on to pn−2 being a fit of subscripts n-2, n-1, n, and pn−1 a fit of n-1 and n. Linear fits are used on the end pairs that extrapolation past the end points is “safe”.

The correction function f(x) for an arbitrary point x is found by finding the neighboring values xk−1 and xk, and weighting the associated polynomials by the distance to the neighbor:

12‑34

where

12‑35

Adjustments

Once measured, an isotopic calibration will adjust itself on two occasions:

  • On exit from match mode, provided that a stable reading of reference air was obtained during the match. By “stable”, we mean:

    1. The reference air was being sampled long enough to exceed the washout time and the user-specified averaging time, and

    2. At least three successive readings were obtained for which the rate of change of CO2 (absolute value) was below the user specified criteria.

  • A TGA non-zero tank cal was performed, in which new values of span, or span and offset, were obtained and sent to the TGA. Note that this only applies to span calibrations initiated from Calibrating the TGA. If the TGA calibration was for its zero, or done independently of the LI-6800, a new isotopic cal should be measured.

Adjusting for a match

When a stable TGA match occurs at some 12CO2 concentration Cm, the isotopic cal adjustment for each isotope x (C13, O18, and O17) is done according to the following calculations:

12‑36

where Dx (ppm) is the apparent calibration drift in isotope x, Xm is the measured isotopic concentration (ppm) during match, Xe is the expected concentration (ppm), given the target per mille value for X, and fx(Cm) is the current predicted adjustment (ppm) for X at concentration C12m

There are two methods to adjust the isotopic cal (e.g. function fx()) for a non-zero Dx:

Option 1: If one assumes the drift is in the TGA, and the LI-6800 CO2 source is continuing to provide the target per mille value, then the entire isotopic cal curve should shift by vertically Dx, to compensate for the drifting TGA readings. So, for example, at the basis concentration, the curve is no longer going through 0, but is now offset by Dx, since the TGA is now in error.

Option 2: If, on other hand, you assume the drift is in the CO2 source, and not the TGA, then the isotopic cal curve should still go through 0 at the basis concentration, but needs to rotate about that point to capture the behavior going on at concentration Cm.

Option 1 is the default, but Option 2 can be conditionally enabled by checking the Retarget box (Figure 12‑59). The checkbox value for that entry will limit this to within some range of the basis concentration. So, if you trust the TGA and don’t trust your CO2 source, a large value (e.g., 2000) is in order, so that retargeting always occurs.

Figure 12‑59. Post match options for adjusting the isotopic cal curve.

Here’s how the two options are handled by the software:

For Option 1 (no retargeting), the drift value Dx is added to the relevant isotopic cal data. Curve fitting does not need to be re-done, since all the segments of the spline fit have their offsets changed by Dx as well. If the match data point is to be added to the isotopic cal data, (the Add if checkbox; Figure 12‑59), then curve fitting is redone because the number of curve segments has changed. Dx is NOT added to the new point.

For Option 2 (retargeting), no change is made to the isotopic cal data, but the target per mille value is recomputed, and the new isotopic correction refit.

If the match occurs at or below the lower limit (Lower fit limit in Figure 12‑59), then no isotopic correction is done for this match point.

Adjusting for a tank calibration

No attempt is made to adjust an isotopic cal for a zero calibration, so following one of those, the isotopic cal should be redone.

Following a non-zero tank calibration, in which spans/offsets are changed, the isotopic cal adjustment is very straightforward (and automatic). The isotopic cal is adjusted for each isotope based on the old and new values of span and offset. In the LI-7825, the spans and offsets are applied by first subtracting the offset, then multiplying by the span.

12‑37

Given a TGA measurement of y1 made with span s1 offset o1, the value y2 it will have with new span s2 and offset o2 is

12‑38

Following a tank calibration, equation 12‑38 is applied to all values of the current isotopic cal, and the data refit.

File structure

Isotopic calibrations are stored in /home/licor/logs/tga/isocals<serial>, in a format is illustrated in Listing 12‑4. The file is a tab delimited text file, with certain parts of it in json format. The data headers (the line starting with “Elapsed”) and data come from the TGA_stats group (TGA_stats).

Listing 12‑4. Example Isotopic Cal file IC0036.

Copy
Start= 2025-08-13 15:08:21
Unit= LI-7825
S/N= TG25-01057
Basis= 988
Comment= TGA just calibrated     //Your comment entered in starting dialog.
AvgTime= 30                     //The currently set stability criteria.
Stability= 0.2
Timeout= 180
C12 Span= 1.0172029290401823      //The current TGA calibration.
C13 Span= 1.0162836221967664
O18 Span= 1.0084701300925054
O17 Span= 0.9331608051073214
C12 Offset= 0.42998502194008736
C13 Offset= 0.12068877735539418
O18 Offset= 0.027400889754766827
O17 Offset= -0.0014         //(Next line) The IC file in force when this data was collected.
Current cal file= /home/licor/logs/tga/cals/IC0035_TG25-01057_20250804_141506.txt
Current targets= {"CO2_C12": 42.1760232464099, "C12_C13": -49.04699432183557, ...
Reuse targets= 0             //(true or false) This is set in starting dialog.
Elapsed period H2O H2O_sd H2O_slp CO2 CO2_sd CO2_slp ...     //The label line for the subsequent data.
69.5 30 6723.64 88.4985 -593.16 101.489 0.0713552 ...
133.1 30 6144.7 72.6986 -488.106 138.078 0.048188 ...
194.6 30 5707.42 56.8223 -380.992 188.388 0.0437417 ...
254.4 30 5361.44 46.2468 -320.204 255.646 0.053823 ...
314.9 30 5063.33 38.9421 -269.623 345.531 0.0577236 ...
    :
Mod= {"time": "2025-08-13 15:51:23", "at": {"H2O": 1390.128567, ...
Mod= {"time": "2025-08-13 15:54:52", "at": {"H2O": 1630.115327, ...
        :

Match-based mods are illustrated in Listing 12‑5, and TGA-cal based mods in Listing 12‑6 (single span tank) and Listing 12‑7 (multiple span tanks). The mod listings have line breaks added for clarity; in the IC file, the Mod = json packet is all on one line.

Listing 12‑5. Example Match-based log

Copy
Mod= {
        "time": "2025-08-13 16:03:11",
        "at":{
            "H2O": 1957.140447,
            "CO2": 1333.198553,
            "C12": 1312.007183,
            "C13": 14.588932,
            "O17": 1.042508,
            "O18": 5.494842
            },
        "added": true,
        "skipped": false,
        "drift": {
            "C12": 0.01664205,
            "C13": -0.02423778,
            "O17": 0.00247765,
            "O18": 0.02179112
        },
    "newtarget": {}
    }

Listing 12‑6. Example mod for single tank calibration.

Copy
Mod= {
        "time": "2025-08-13 16:05:12",
        "tank": {             //The concentrations of the tank involved
            "CO2": 1000,
            "C12": 984.3714,
            "C13": 10.733,
            "O18": 4.0617,
            "O17": 0.7751
        },
        "spans": {             //The after-cal span values
            "C12": 1.01547588661467,
            "C13": 1.015036453567258,
            "O18": 1.0065982271476381,
            "O17": 0.9310187397087365
        },
        "old_cal": {         //The pre-cal span and offset values
            "Offset_Cal_C12": 0.42998502194008736,
            "Offset_Cal_C13": 0.12068877735539418,
            "Offset_Cal_O18": 0.027400889754766827,
            "Offset_Cal_O17": -0.0014,
            "C12_Span": 1.0172029290401823,
            "C13_Span": 1.0162836221967664,
            "O18_Span": 1.0084701300925054,
            "O17_Span": 0.9331608051073214
        },
    }

Listing 12‑7. Example mod for a multi-tank calibration.

Copy
Mod= {
    "tank": {         //The concentrations of the tanks involved
        "C12": [393.7486, 984.3714],
        "C13": [4.2932, 10.733],
        "O18": [1.6247, 4.0617],
        "O17": [0.3101, 0.7751]
        },
    "spans": {         //The after-cal span values
        "C12": 1.0142605981730008,
        "C13": 1.0200714574984515,
        "O18": 1.0101647887027767,
        "O17": 0.9360440158557572
        },
    "offsets": {     //The after-cal offset values
        "C12": -0.12678988820680573,
        "C13": 0.13310344685336098,
        "O18": 0.03051061831108353,
        "O17": -0.002300580008178793
        },
    "old_cal": {     //The before-cal span and offset values
        "Offset_Cal_C12": 0.42998502194008736,
        "Offset_Cal_C13": 0.12068877735539418,
        "Offset_Cal_O18": 0.027400889754766827,
        "Offset_Cal_O17": -0.0014309238637422318,
        "C12_Span": 1.006548483897545,
        "C13_Span": 1.0171080863955737,
        "O18_Span": 0.9966233462888289,
        "O17_Span": 0.9196155189082111
        },
    "time": "2025-08-04 13:51:24"
    }