<?xml version="1.0" encoding="UTF-8" ?><OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"><responseDate>2026-10-13T08:19:29Z</responseDate><request identifier="10.35097/gmfyd8hj8vvzbh20" metadataPrefix="oai_dc" verb="GetRecord">https://www.radar-service.eu/oai/OAIHandler</request><GetRecord><record><header><identifier>10.35097/gmfyd8hj8vvzbh20</identifier><datestamp>2026-10-09T10:54:33Z</datestamp><setSpec>radar4kit</setSpec></header><metadata><oai_dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/"
           xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ https://www.openarchives.org/OAI/2.0/oai_dc.xsd">
   <dc:identifier>https://dx.doi.org/10.35097/gmfyd8hj8vvzbh20</dc:identifier>
   <dc:creator>Eickhoff, Dario</dc:creator>
   <dc:title>FLARE: Fast Lookup-based Acoustic-seismic Reconstruction of Entries</dc:title>
   <dc:publisher>Karlsruhe Institute of Technology</dc:publisher>
   <dc:date>2026</dc:date>
   <dc:subject>Physics</dc:subject>
   <dc:type>dataset</dc:type>
   <dc:subject>Software</dc:subject>
   <dc:rights>info:eu-repo/semantics/openAccess</dc:rights>
   <dc:rights>https://creativecommons.org/licenses/by-sa/4.0/legalcode</dc:rights>
   <dc:description>Fast Lookup-based Acoustic-seismic Reconstruction of Entries for meteoroid/space debris trajectory reconstruction, from event time and&#xD;
location to a sampled posterior, driven by one YAML file per event.&#xD;
&#xD;
Three stages share one code base and can be run separately:&#xD;
&#xD;
| stage | command  | what it does              | typical cost     |&#xD;
|---|-------------------|---------------------------------------------------------------------------------------------------------------|------------------|&#xD;
| 1 | FLARE atmosphere  | fetches the two NCPA G2S hours bracketing the event and interpolates them in time onto the event epoch  | seconds     |&#xD;
| 2 | FLARE lookup  | runs one infraGA 3d prop point source per altitude level and converts the arrivals to memory-mapped .npy  | minutes to hours |&#xD;
| 3 | FLARE mcmc  | emcee inversion for the trajectory, using the store as a Green's-function lookup     | hours            |&#xD;
| 4 | FLARE postprocess | chain -&gt; posterior table, MAP trajectory, per-station residuals, figures      | seconds          |&#xD;
|---|-------------------|---------------------------------------------------------------------------------------------------------------|------------------|&#xD;
FLARE run does all four in order. FLARE check validates a config and reports what already exists on disk.&#xD;
&#xD;
## Install&#xD;
&#xD;
bash:&#xD;
pip install -e ".[mpi,hdf5,plot]"   # drop [mpi] if you only run multiprocessing&#xD;
&#xD;
&#xD;
External tools, expected on PATH or given in the config:&#xD;
&#xD;
- [ncpag2s-clc](https://github.com/chetzer-ncpa/ncpag2s-clc) — the G2S client&#xD;
  (paths.ncpag2s points at ncpag2s.py)&#xD;
- [infraGA/GeoAc](https://github.com/LANL-Seismoacoustics/infraGA) — set&#xD;
  lookup.conda_env if it lives in its own conda environment, and the pipeline&#xD;
  will call it through conda run rather than needing an activated shell.&#xD;
&#xD;
## Quick start for a new event&#xD;
&#xD;
bash:&#xD;
FLARE init -o event.yaml     # template config&#xD;
$EDITOR event.yaml                     # event time/location, picks file, bounds&#xD;
FLARE check      -c event.yaml&#xD;
FLARE atmosphere -c event.yaml&#xD;
FLARE lookup     -c event.yaml&#xD;
mpirun -n 72 FLARE mcmc -c event.yaml&#xD;
FLARE postprocess -c event.yaml&#xD;
&#xD;
&#xD;
Everything lands under `&lt;paths.workdir&gt;/&lt;event.id&gt;/`:&#xD;
&#xD;
&#xD;
atmosphere/   g2s_&lt;date&gt;_&lt;hour&gt;.met (raw hours) and &lt;event.id&gt;.met (blended)&#xD;
lookup_ascii/ infraGA output, &lt;alt&gt;_0_0_traj.dat.arrivals.dat&#xD;
lookup_npy/   &lt;alt&gt;/pts_aug.npy, vals_aug.npy   &lt;- memory mapped by the workers&#xD;
mcmc/         mcmc.h5, mcmc_chain_physical.npy, mcmc_summary.txt, config_used.yaml&#xD;
              mcmc_posterior.csv, mcmc_residuals.csv, mcmc_trajectory.csv,&#xD;
              mcmc_trajectory_ci.csv, mcmc_{corner,trace,residuals}.png&#xD;
logs/         one log per stage, plus forward_errors.log&#xD;
&#xD;
&#xD;
## The config file&#xD;
&#xD;
configs/event_template.yaml is fully commented. The fields that matter for a&#xD;
new event are event, paths, picks.file, and the mcmc.parameters bounds.&#xD;
&#xD;
Resolution knobs. Lookup-table cost scales as&#xD;
n_levels x (az_range / az_step) x (incl_range / incl_step):&#xD;
&#xD;
yaml:&#xD;
lookup:&#xD;
  altitude_min_km: 15&#xD;
  altitude_max_km: 100&#xD;
  altitude_step_km: 1.0             # altitude level separation&#xD;
  azimuth:     {min: -180, max: 180, step: 1.0}&#xD;
  inclination: {min:  -90, max:  90, step: 1.0}&#xD;
&#xD;
&#xD;
Sub-kilometre altitude steps work: the levels are discovered by scanning&#xD;
lookup_npy/, and the forward model brackets each trajectory sample between&#xD;
whichever two levels exist. A finer angular step lets you tighten&#xD;
forward.knn.max_distance_deg, which is the main lever on interpolation error&#xD;
in the arrival times.&#xD;
&#xD;
Parameter bounds are written in physical units. `log10: true` makes the&#xD;
sampler work in the logarithm while the bounds stay readable:&#xD;
&#xD;
yaml:&#xD;
ablation: {min: 2.5e-9, max: 5.0e-8, log10: true}&#xD;
mass:     {min: 300.0,  max: 2500.0, log10: true}&#xD;
&#xD;
&#xD;
Order in mcmc.start.guess is always: lon, lat, height, azimuth, inclination,&#xD;
velocity, time_shift, ablation, spherical_factor, mass.&#xD;
&#xD;
## Running the MCMC&#xD;
&#xD;
mcmc.pool selects mpi (schwimmbad MPIPool, for mpirun),&#xD;
multiprocessing, or serial. With h5py installed the chain is written&#xD;
incrementally to mcmc/mcmc.h5 and re-running the same command resumes&#xD;
where it stopped. Delete the .h5 to start fresh.&#xD;
&#xD;
Convergence: the run stops once `total_steps &gt;= target_tau_multiple * max(tau)`&#xD;
with a finite autocorrelation estimate in every dimension, or at&#xD;
`max_steps`. Walkers whose acceptance fraction falls below&#xD;
`reseed_threshold` are reseeded from the healthy ones.&#xD;
&#xD;
## Post-processing&#xD;
&#xD;
bash:&#xD;
FLARE postprocess -c koblenz.yaml --burn-in 0.3 --draws 500&#xD;
&#xD;
&#xD;
--burn-in takes a fraction (&lt; 1) or a step count. Besides the posterior&#xD;
table it writes the MAP trajectory as CSV and an altitude-binned lat/lon&#xD;
spread over --draws posterior samples and both are ready to feed straight into&#xD;
PyGMT. mcmc_residuals.csv gives observed, predicted and residual per station&#xD;
at the MAP solution, which is usually the fastest way to spot a mis-picked&#xD;
station. Corner and trace plots need matplotlib and corner. Without them&#xD;
the CSVs are still written.&#xD;
&#xD;
## Using the pieces directly&#xD;
&#xD;
The stages are library code, not just CLI:&#xD;
&#xD;
python:&#xD;
from meteor_pipeline.config import load_config&#xD;
from meteor_pipeline.context import ForwardContext&#xD;
from meteor_pipeline.forward import forward_model&#xD;
&#xD;
cfg = load_config("koblenz.yaml")&#xD;
ctx = ForwardContext.from_config(cfg)       # atmosphere + lookup + picks&#xD;
pred = forward_model(ctx, lon=5.5, lat=49.2, height_km=85.0,&#xD;
                     azimuth_deg=50.0, inclination_deg=-15.0,&#xD;
                     velocity_ms=18000.0, time_shift_s=0.0,&#xD;
                     ablation=1.7e-8, spherical_factor=1.0, mass_kg=1000.0)&#xD;
&#xD;
&#xD;
## Tests&#xD;
&#xD;
bash:&#xD;
python tests/test_smoke.py        # or: python -m pytest tests -q&#xD;
&#xD;
&#xD;
The smoke test builds a toy atmosphere and a synthetic straight-ray lookup&#xD;
table, then runs conversion, the forward model, the posterior and a short&#xD;
serial chain. It needs no infraGA, no network, and takes a few seconds.</dc:description>
   <dc:relation>https://publikationen.bibliothek.kit.edu/1000197230</dc:relation>
   <dc:format>application/x-tar</dc:format>
</oai_dc:dc></metadata></record></GetRecord></OAI-PMH>