projects / pyroflue

Pyroflue — Emission Factor Analysis

A Python module I built to help a PhD student post-process and visualize flue gas emission data from Buss et al. (2022). The paper runs pyrolysis experiments on seven waste types and produces thousands of raw measurement points; the module handles the full pipeline from raw concentrations to normalized emission factors and publication-ready charts.

The experiment — what was measured and why

Pyrolysis converts organic waste into biochar at high temperature and low oxygen. The process produces a combustible gas that, when burned, releases flue gas pollutants. The paper investigates seven feedstocks: clean wood chip pellets, waste timber, garden waste, two digested sludges, limed sewage sludge, and food waste reject.

The core scientific question is: which feedstocks produce unacceptable emissions, and by how much? To answer it, results must be expressed in a way that is independent of reactor scale and run duration — that is, as emission factors.

1) Measure pollutant concentrations in the flue gas

During each run, instruments continuously sample the exhaust stream and record concentrations for NOₓ, SO₂, CO, CH₄, N₂O, NH₃, HCl, and other species. These are the raw numbers — a ratio telling you how much of the exhaust is a given pollutant at any point in time. This is what Figure 7 of the paper displays.

c  [mg/Nm3]c \;[\mathrm{mg/Nm^3}]

The unit Nm3\mathrm{Nm^3} refers to a normal cubic metre — gas volume corrected to standard temperature and pressure so readings are comparable across different conditions.

2) Convert concentration → mass emission rate

A concentration alone does not tell you how much pollutant is actually leaving the stack — that also depends on how fast the gas is flowing. Multiplying concentration by the volumetric flow rate gives the mass of pollutant emitted per second.

m˙  [mg/s]=c  [mg/Nm3]×V˙  [Nm3/s]\dot{m} \;[\mathrm{mg/s}] = c \;[\mathrm{mg/Nm^3}] \times \dot{V} \;[\mathrm{Nm^3/s}]

Integrating m˙\dot{m} over the full experiment duration gives the total mass of pollutant emitted per run. This is where the bulk of the post-processing work sits: aligning time-series measurements, handling gaps, and accumulating mass across thousands of data points per experiment.

3) Normalize by biochar output → emission factor (Figure 8)

Different runs produce different amounts of biochar depending on feedstock, temperature, and batch size. Dividing total emitted mass by biochar output removes those effects, leaving a number that represents the environmental cost per unit of product — the emission factor.

EF  [gkgchar]=mpollutant  [g]mchar  [kg]EF \;\left[\frac{\mathrm{g}}{\mathrm{kg}_{\mathrm{char}}}\right] = \frac{m_{\mathrm{pollutant}} \;[\mathrm{g}]}{m_{\mathrm{char}} \;[\mathrm{kg}]}

This makes the results directly comparable across feedstocks, reactor scales, and studies. It is also the standard input for life-cycle assessment (LCA) and regulatory benchmarking — for example, comparing pyrolysis emissions against EU waste incineration limits.

What the three plot groups show

The interactive lab app organizes emission factors into three groups, each highlighting a different environmental dimension:

  • Major emissions — CO₂, CH₄, CO, NMVOC, TSP, PIC. These capture overall combustion quality. High CO or unburnt hydrocarbons indicate incomplete combustion; CO₂ dominates but varies with carbon content of the feedstock.
  • Nitrogen emissions — NOₓ, N₂O, NH₃, HCN. Nitrogen-rich feedstocks like sewage sludge stand out clearly here. NOₓ and N₂O are both greenhouse gases and regulated pollutants; their emission factors confirm why sludge requires more stringent flue gas treatment.
  • Acid gases — HCl and SO₂. Chlorine- and sulfur-containing waste produces these; they drive requirements for scrubbers and downstream abatement systems.

The key finding: clean wood and garden waste behave well across all groups; digested and limed sludges consistently produce the highest emission factors, particularly for nitrogen species.