BMA — Block Model Atelier

Stream-parse block model CSVs. Detect geometry, compute statistics.
GCU
Drop a CSV file here, or click to browse
Supports .csv, .txt, .dat, .zip — streamed, not loaded into memory
no block model needed — add drillholes or point data, then go
synthetic block model + composites + tutorial, generated in your browser

What is this?

BMA is a client-side block model inspector. Drop a CSV (or zipped CSV) exported from Isatis, Vulcan, Surpac, Leapfrog, or any other mining package and get instant summary statistics, geometry detection, and categorical breakdowns — all without uploading anything to a server.

Everything runs in your browser using streaming File API and Web Workers. Files are parsed row by row, never fully loaded into memory, so multi-gigabyte models work fine on modest hardware.

Features

Streaming single-pass parsing Auto-detect delimiters and types XYZ coordinate detection Grid geometry and fill ratio Sub-block model detection Welford's online statistics Approximate quantiles (t-digest) Skewness, kurtosis, CV% Per-column zero/negative filters CDF plots from centroids Categorical value counts Row filter expressions ZIP streaming decompression Preflight column controls

Columns are classified as numeric or categorical automatically. The preflight panel lets you override types, select coordinate axes, enable/disable columns, and set per-column value filters before analysis. Filter expressions use JavaScript syntax on row objects: r.LITO === 'BIF' && r.fe_pct > 30.

Help
FILTER

Add a dataset

Compare a second dataset against your block model — drill-hole composites, a previous estimate, or a check run. It rides through Statistics, CDF, and Swath under its own prefix, held up beside the model. Comparison is statistical and spatial only — no geometry, export, or per-row joins.

Point data a CSV or .dm with X, Y, Z — composites, samples, or another model's block centroids
Drop a file, or click to browse
.csv · .txt · .dat · .zip · .dm
Drillhole set collar + survey + intervals → desurveyed, composited samples
Variables
Functions
Calculated Columns 0
Reference

Row object: r — mutate it to create columns: r.name = expr; (in Aux mode the row object is aux)

Access columns: r.col or r["col name"]

Math: abs sqrt pow log log10 exp min max round floor ceil PI

Helpers: cap(v, hi) · clamp(v, lo, hi) · ifnull(v, d) · ifnum(v, d) · isnum(v) · between(v, lo, hi) · remap(v, map) · fn.round(v, n)

Loops & conditionals: for, if/else, ternary — full JS

String: r.LITO.startsWith("BIF") · r.LITO.includes("x")

Type forcing: r.META.cat.push('name') force categorical · r.META.num.push('name') force numeric

Detected Columns
Write code and click Simulate to detect new columns.
Preview
No preview yet.
Percentiles
Weight
Metrics
Variables
Click column names to add CDF curves
Columns
Tick values to filter the model to them — the header box selects all / none.
Group By
Variables
Groups
Columns 0
Delimiter Other
Quote Ending
Nulls Precision Dec sep
Preview

              
Select a grade variable and click Generate.
Configure settings and click Generate to create swath plots.
Pick two categorical columns and click Generate to cross-tabulate them.
Settings
Confirm
Drillhole consistency report
Filter
Keep rows where
A new version of BMA is available.
e13c0a2
Pack Project
Title
Contents