Skip to content

Changelog

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

v0.3.3 (2026-05-29)

Fix

  • aps: loud date-format + transpose fallbacks; bin-grid drift tripwire
  • readers: document and log firmware drift in OCEC and TEOM
  • smps: isolate mixed AIM 10.3/11.x folders and add status whitelist

v0.3.2 (2026-05-25)

Feat

  • merge: add EXPERIMENTAL v5 mass-anchored merge (測試中)
  • reader: SMPS/APS return dN/dlogDp; stats via psd_stats + sidecar
  • reader: warn on stray out-of-range timestamps before gridding

Fix

  • optical: improve() accepts single-column df_RH
  • plot: box categorical/float-bin support; escape % in Unit; silence noise
  • plot: use per-column mean in violin scatter
  • examples: correct stale API usage across examples

Refactor

  • merge: share v3/v4 _powerlaw_fit_dN via _core
  • merge: share v1/v2 overlap_fitting + shift_data_process via _core
  • merge: consolidate _merge_data into shared _core.merge_data
  • merge: unify SMPS-APS output, add density_range QC, dedup core

v0.3.1 (2026-05-23)

Feat

  • plot: add interactive timeseries viewer (Plotly)
  • reader: make resampling opt-in via mean_freq
  • reader: make start and end optional
  • reader: time-grid overhaul, df.attrs metadata, and canonical cache

Fix

  • reader: repair Minion's broken time_aware_IQR_QC call

Refactor

  • 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).
  • optical: PyMieScatt-parity additions — angular scattering (scattering_function, scattering_function_sd, phase_matrix, nephelometer_truncation_correction), Aden-Kerker coated-sphere Mie (mie_core_shell, mie_core_shell_sd), iterative RI retrieval (iterative_inversion, iterative_inversion_sd, contour_intersection).
  • 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
  • Update RawDataReader processing flow documentation
  • Simplify Technical Specifications table in instruments index

Refactor

  • Simplify rate calculation and remove deter_key dependency
  • Unify QC output format across all instrument readers

v0.1.16 (2025-02-20)

BREAKING CHANGE

  • Complete overhaul from v0.1.9.0 to v0.1.11

Feat

  • enhance rate calculation to use minimum rates across all determinant keys
  • workflow: add unpublish.yml

Fix

  • repair TEOM parsing and optical scatter key errors
  • improve time handling for instrument data and reporting
  • improve aerosol data processing and quality control
  • improve aerosol data processing and quality control
  • RawDataReader and the ReaderLogger class to better handle different environments and edge cases

Refactor

  • RawDataReader: simplify configuration and unify output handling