_read_*_qc.pkl / .csv gain a QC_Invalid column and
existing caches are invalidated (CACHE_FORMAT 3), so the next read re-parses
from raw. Rows flagged only Below MDL (OCEC) or Upscale Warning (Xact)
now keep their values instead of being NaN, which also raises those
instruments' yield rates. Pass flag_severity={...} to restore the old
strictness.
RawDataReader('VOC', ...) and RawDataReader('Minion', ...)
now raise KeyError. Read those files with pandas and pass the DataFrame to
the analysis functions (VOC -> voc_potentials).
Feat
xact: classify elements by measurement uncertainty, from the manual
qc: split QC flags into invalidating vs advisory severity
reader: give GRIMM QC, register Q-ACSM as pending, wire Xact/IGAC MDL
remove VOC and Minion from RawDataReader
Fix
deps: make the [docs] extra able to build the docs
tests: make the OCEC text-column check pandas-3 proof, and test the floor
qc: stop Insufficient deleting the head and tail of every read
reader: keep the metadata L1 was discarding; record BC1054's two clocks
time-grid: keep the native grid at the instrument's real period
reader: correct completeness freq, honour mean_freq, find every status column
v0.3.4 (2026-05-29)
Feat
qc: generalize ignored_status_errors whitelist to all status modes
Fix
teom: treat status as 32-bit bitfield (numeric -> bitwise)
smps: treat 'Normal Scan' as OK in Instrument Errors column
Refactor
voc: single source of truth for species; thin the reader
reader: use shared QualityControl.iqr for IGAC ion balance
v0.3.0 (2026-05-21)
BREAKING CHANGE
Build backend switched from setuptools to meson-python. Contributors
building from source now need gfortran in addition to Python deps
(Linux: apt install gfortran; macOS: brew install gcc; Windows:
rtools45). End-user pip install AeroViz is unchanged — pip auto-picks
the prebuilt wheel for the user's platform.
The bundled isrpia2.exe (1.5 MB, 32-bit Windows only) has been
removed. isoropia() now calls the ISORROPIA II Fortran library
natively via an f2py extension; works on macOS (arm64 + x86_64),
Linux x86_64, and Windows AMD64. The path_out parameter is retained
but no longer used.
setup.py and scripts/install_*.{sh,bat} removed (obsolete with
meson-python; pip install AeroViz covers all use cases).
Feat
chemistry: cross-platform ISORROPIA II via native f2py extension.
Same Fortran numerics as the legacy isrpia2.exe (sourced from
GEOS-Chem 14.3.1, original copyright Nenes/Fountoukis/Capps preserved
in THIRD_PARTY_NOTICES.md). ~25x faster on bulk batches (100k rows
in ~0.38 s).
Top-level flat-import API across every sub-namespace:
from AeroViz import reconstruct_mass, improve, mie, merge_psd, ....
Three independent CI jobs: quick (dataProcess, 5 Python versions),
readers (full rawDataReader pipeline, 2 Python versions), and a
release-only wheels job that publishes 4 OS × 5 Python wheels +
sdist to PyPI on tag push.
Fix
chemistry: _basic() previously did df_all.columns = nam_lst,
which positionally renamed input columns. Inputs whose column order
differed from nam_lst were silently mangled. Now: if all required
species are present by name, reorder by name; fall back to the
positional rename otherwise.
chemistry: gas-phase species (NH3 / HNO3 / HCl) now correctly
converted to µmol/m³ via molecular weights instead of going through
convert_mass_to_molar_concentration() (which produces ppm via the
ideal-gas law and was unit-mismatched with the particulate inputs).
Reader test suite was reindexing raw pickles to a 2-year requested
window for one day of fixture data, ballooning pickles to 500+ MB
per instrument. Tight per-instrument date_range + session-scoped
DataFrame cache: 9:42 → 14 s (40x), fixtures dir 7.4 GB → 403 MB.
ISORROPIA II is invoked on macOS/Linux — was a cryptic
Exec format error from the bundled Windows .exe; now just works
natively.
Refactor
Tests reorganised into tests/test_dataprocess/ so changes to
post-processing modules don't trigger reader I/O tests. Markers
(reader, dataprocess, optical, slow) registered for pytest
-m filtering.
Mie engine unification: mie_theory.py deleted, mie.py (formerly
_mie_sd.py) is the sole vectorised Mie kernel.
calculate_mie_efficiencies() now returns a 7-key dict with
Q_ext / Q_sca / Q_abs / g / Q_pr / Q_back / Q_ratio.
v0.1.17 (2025-12-14)
Feat
Implement QCFlagBuilder system for unified QC workflow
Add QCRule dataclass for declarative QC rule definition
Add pre_process.py for unified absorption/scattering coefficient calculation
Unified QC_Flag column for all instrument data quality marking
QC Summary output at end of processing with validation results
Docs
Update QC_Flag handling documentation for all instruments
Clarify QC_Flag only in intermediate files, removed from final output