Skip to main content

XRF - X-Ray Fluorescence

X-Ray Fluorescence (XRF) spectrometry is used to measure the elemental oxide composition of solid samples. It provides bulk oxide analysis expressed as weight percentages.

Method Overview

PropertyValue
Full NameX-Ray Fluorescence Spectrometry
PurposeMeasures elemental oxide composition of solid samples
Output UnitsWeight percent (%)
SharePoint LocationAnalytical Data > XRF > XRF Data
File FormatCSV

Oxides Measured

OxideElementDescription
CaOCalciumCalcium oxide
MgOMagnesiumMagnesium oxide
Al2O3AluminumAluminum oxide
Fe2O3IronIron(III) oxide
SiO2SiliconSilicon dioxide
Na2OSodiumSodium oxide
K2OPotassiumPotassium oxide
TiO2TitaniumTitanium dioxide
Cr2O3ChromiumChromium(III) oxide
MnOManganeseManganese(II) oxide
SO3SulfurSulfur trioxide
SrOStrontiumStrontium oxide
P2O5PhosphorusPhosphorus pentoxide
ClChlorineChlorine
ZrO2ZirconiumZirconium dioxide
ZnOZincZinc oxide
NiONickelNickel(II) oxide
IIodineIodine
LOI-Loss on Ignition

Instruments

Primus IV (Primary)

The Primus IV is the primary XRF instrument at Brimstone. It uses the pressed pellet method for sample preparation and is prioritized in the data pipeline when duplicate measurements exist.

Batch Methods:

  • SGA Purity V1
  • SGA Purity V2
  • Rock_Primus_IV
  • Pressed Pellet
  • CEM_28MAR2025
  • CEM_28MAR2025_FP

Supermini 200 (Secondary)

The Supermini 200 is the secondary instrument, typically used for rock samples.

Batch Methods:

  • Rock
  • XRF_CEM_011625

Sample Types

TypeDescriptionInstrument
Pressed PelletStandard solid samples prepared as pressed pelletsPrimus IV
RockBulk rock samplesSupermini 200
Liquid/FilterDissolved sample analysis (liquid XRF)Primus IV

Data Pipeline

SharePoint Source

  • Site: Analytical Data
  • Folder: XRF/XRF Data/
  • File Type: CSV

Dagster Assets

The XRF data pipeline consists of the following assets in apps/datasmart/src/datasmart/assets/analytical/xrf.py:

xrf_incremental (sharepoint_multi_asset)
├── xrf_incremental_samples (backend.xrf_incremental_samples)
├── xrf_incremental_data (backend.xrf_incremental_data)
└── xrf_incremental_liquid (backend.xrf_incremental_liquid)

xrf (analytical.xrf)
xrf_liquid (analytical.xrf_liquid)

xrf_simplified (analytical.xrf_simplified)
xrf_simplified_duplicate_ids (analytical.xrf_simplified_duplicate_ids)

xrf_sgs (analytical.xrf_sgs) ← brimstone_us_geochemistry

Asset Descriptions

AssetSchemaDescription
xrf_incremental_samplesbackendSample metadata from raw files
xrf_incremental_databackendMelted oxide values (long format)
xrf_incremental_liquidbackendLiquid XRF oxide values
xrfanalyticalWide format, 1 row per sample with oxide columns
xrf_liquidanalyticalWide format for liquid XRF
xrf_simplifiedanalyticalAveraged replicates, Primus IV prioritized
xrf_simplified_duplicate_idsanalyticalFlagged duplicates for review
xrf_sgsanalyticalSGS external lab data

Database Tables

analytical.xrf

Wide format table with one row per sample.

ColumnTypeDescription
sample_idstringNormalized sample ID
time_createddatetimeFile creation time
CaOfloatCalcium oxide %
MgOfloatMagnesium oxide %
Al2O3floatAluminum oxide %
Fe2O3floatIron oxide %
SiO2floatSilicon dioxide %
Na2OfloatSodium oxide %
K2OfloatPotassium oxide %
TiO2floatTitanium dioxide %
Cr2O3floatChromium oxide %
MnOfloatManganese oxide %
SO3floatSulfur trioxide %
SrOfloatStrontium oxide %
P2O5floatPhosphorus pentoxide %
ClfloatChlorine %
ZrO2floatZirconium dioxide %
ZnOfloatZinc oxide %
NiOfloatNickel oxide %
IfloatIodine %
LOIfloatLoss on ignition %
instrumentstringPrimus IV or Supermini 200
methodstringSample preparation method
original_sample_idstringRaw sample ID before normalization
file_locstringSharePoint file path
file_idstringSharePoint file identifier

analytical.xrf_simplified

Cleaned version with:

  • Averaged replicates
  • Primus IV measurements prioritized
  • LOI = 1.0 values filtered (likely placeholders)
  • Metadata columns removed

File Format Detection

The pipeline automatically detects file format:

Batch Files

  • Method name in first column
  • Multiple samples per file
  • Examples: SGA Purity V1, Pressed Pellet, Rock

Single-Sample Files

  • Metadata key-value pairs in first rows
  • Sample type field present
  • One sample per file

Liquid/Filter Files

  • Sample type = Filter in metadata
  • Uses Liquid conc. column for values

Duplicate Handling

Primus IV Prioritization

When duplicate sample IDs exist, the pipeline applies these rules:

  1. Keep Primus IV: If any measurement is from Primus IV, keep only those
  2. Keep all if no Primus IV: If no Primus IV measurements, keep all
  3. Flag for review: All remaining duplicates go to xrf_simplified_duplicate_ids

LOI Filtering

Rows where LOI = 1.0 exactly are filtered out, as this is typically a default/placeholder value.

Redo File Detection

Files with these patterns in the filename are treated as redo files and prioritized:

  • -Redo
  • -redo
  • _redo
  • redo

Usage Examples

Query Simplified Data

from shared.db.sql import SQL

# Get all simplified XRF data
xrf = SQL.read("SELECT * FROM analytical.xrf_simplified")

# Filter by project team
xrf = SQL.read("""
SELECT * FROM analytical.xrf_simplified
WHERE sample_id LIKE 'P800%'
""")

Join with Other Analytical Data

combined = SQL.read("""
SELECT
x.sample_id,
x.CaO, x.MgO, x.SiO2, x.LOI,
i.Ca, i.Mg, i.Si
FROM analytical.xrf_simplified x
LEFT JOIN analytical.icp_simplified i
ON x.sample_id = i.sample_id
""")

Common Calculations

import pandas as pd
from shared.db.sql import SQL

xrf = SQL.read("SELECT * FROM analytical.xrf_simplified")

# Sum of oxides
oxide_cols = ['CaO', 'MgO', 'Al2O3', 'Fe2O3', 'SiO2', 'Na2O', 'K2O', 'TiO2', 'MnO', 'P2O5', 'LOI']
xrf['oxide_sum'] = xrf[oxide_cols].sum(axis=1)

# Ca/Mg ratio
xrf['ca_mg_ratio'] = xrf['CaO'] / xrf['MgO']

# Silica ratio
xrf['silica_ratio'] = xrf['SiO2'] / (xrf['CaO'] + xrf['MgO'])
AssetDescription
sample_id_crosswalkMaps messy sample IDs to canonical format
leach_crosswalkSpecial mappings for leaching experiment IDs
project_team_mapMaps old process area codes to new project team codes
brimstone_us_geochemistrySGS external lab data source

Troubleshooting

Duplicate Sample IDs

Check the xrf_simplified_duplicate_ids table for samples that need manual review:

duplicates = SQL.read("SELECT * FROM analytical.xrf_simplified_duplicate_ids")

Missing Samples

If a sample is missing from xrf_simplified:

  1. Check if it exists in analytical.xrf (before simplification)
  2. Check if sample ID normalization failed (look for NULL sample_id)
  3. Verify the source file exists in SharePoint

Instrument Verification

To verify which instrument was used for a sample:

SQL.read("""
SELECT sample_id, instrument, method
FROM analytical.xrf
WHERE sample_id = 'P800-001-1-QBND-FM'
""")