diff --git a/package-lock.json b/package-lock.json index 0024980..2640996 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1037,9 +1037,6 @@ "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1056,9 +1053,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1075,9 +1069,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1094,9 +1085,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1113,9 +1101,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1132,9 +1117,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1151,9 +1133,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1170,9 +1149,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1189,9 +1165,6 @@ "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1214,9 +1187,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1239,9 +1209,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1264,9 +1231,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1289,9 +1253,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1314,9 +1275,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1339,9 +1297,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1364,9 +1319,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1690,9 +1642,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1710,9 +1659,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1730,9 +1676,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1750,9 +1693,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1770,9 +1710,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1790,9 +1727,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2004,9 +1938,6 @@ "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2020,9 +1951,6 @@ "cpu": [ "arm" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2036,9 +1964,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2052,9 +1977,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2068,9 +1990,6 @@ "cpu": [ "loong64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2084,9 +2003,6 @@ "cpu": [ "loong64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2100,9 +2016,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2116,9 +2029,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2132,9 +2042,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2148,9 +2055,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2164,9 +2068,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2180,9 +2081,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2196,9 +2094,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2524,9 +2419,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2543,9 +2435,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2562,9 +2451,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2581,9 +2467,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -5020,9 +4903,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5043,9 +4923,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5066,9 +4943,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5089,9 +4963,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ diff --git a/src/content/projects/bullet-matching.mdx b/src/content/projects/bullet-matching.mdx index 196c9e2..960812d 100644 --- a/src/content/projects/bullet-matching.mdx +++ b/src/content/projects/bullet-matching.mdx @@ -22,7 +22,8 @@ When a bullet is fired from a gun, the barrel leaves fine striations on the bull Traditionally, matching a recovered bullet to a particular gun is done by a firearms examiner looking through a comparison microscope and making a judgement call. My dissertation — and the ongoing CSAFE research program it fed into — builds **reproducible, statistical methods** for -doing that matching from high-resolution 3D surface scans. +doing that matching from high-resolution 3D surface scans. See the +[PhD research page](/phd) for a longer write-up of the dissertation itself. The practical artifacts: diff --git a/src/pages/phd.astro b/src/pages/phd.astro new file mode 100644 index 0000000..cc39578 --- /dev/null +++ b/src/pages/phd.astro @@ -0,0 +1,460 @@ +--- +import BaseLayout from '../layouts/BaseLayout.astro'; +import Section from '../components/Section.astro'; +import { Icon } from 'astro-icon/components'; +import { getCollection } from 'astro:content'; + +const phdPubSlugs = new Set([ + 'thesis', + 'bullet-matching-aoas', + 'degraded-lands', +]); + +const allPubs = await getCollection('publications'); +const phdPubs = allPubs + .filter((p) => phdPubSlugs.has(p.id)) + .sort((a, b) => b.data.year - a.data.year); + +const formatAuthors = (authors: readonly string[]) => + authors + .map((a) => (a === 'Eric Hare' ? `${a}` : a)) + .join(', '); + +const stats = [ + { k: '5', v: 'Years', d: '2012 — 2017 at Iowa State.' }, + { k: '2', v: 'R packages', d: 'bulletr and bulletxtrctr.' }, + { k: '1', v: 'ASA award', d: 'Imaging Section Student Paper, 2016.' }, + { k: '3D', v: 'Microns of striation', d: 'Scans resolve sub-micron barrel tool marks.' }, +]; + +const pipeline = [ + { + n: '01', + icon: 'lucide:scan-line', + title: 'Scan', + detail: 'High-resolution 3D surface scans of spent bullets — sub-micron vertical resolution across the land-engraved area.', + }, + { + n: '02', + icon: 'lucide:waves', + title: 'Extract', + detail: 'Isolate land-engraved areas, detrend the bullet curvature, and pull out the 1D striation signature for each land.', + }, + { + n: '03', + icon: 'lucide:git-compare-arrows', + title: 'Align', + detail: 'Pairwise cross-correlation aligns striation signatures between lands, robust to shifts and degradation.', + }, + { + n: '04', + icon: 'lucide:sigma', + title: 'Score', + detail: 'A random-forest model over features of the aligned signatures yields a match probability you can defend in court.', + }, +]; + +const contributions = [ + { + icon: 'lucide:package', + title: 'bulletr', + body: 'Reference R package for reading 3D bullet scans, extracting striations, and scoring matches — the first open, reproducible implementation of the pipeline.', + href: 'https://github.com/erichare/bulletr', + }, + { + icon: 'lucide:package-2', + title: 'bulletxtrctr', + body: 'Feature-extraction toolkit separated from the core package for maintainability and reuse across CSAFE tooling.', + href: 'https://github.com/erichare/bulletxtrctr', + }, + { + icon: 'lucide:book-open-text', + title: 'Methodology', + body: 'Published in the Annals of Applied Statistics and Law, Probability & Risk, with source code released alongside the papers.', + href: 'https://doi.org/10.1214/17-AOAS1080', + }, + { + icon: 'lucide:app-window', + title: 'Web prototype', + body: 'A Shiny app that lets examiners upload scans and step through the matching pipeline interactively.', + href: 'https://labs.omnianalytics.org/bullet-analyzer/', + }, +]; + +const timeline = [ + { y: '2012', t: 'Started the PhD at Iowa State, joining Heike Hofmann and Alicia Carriquiry.' }, + { y: '2014', t: 'First working prototype of the striation-extraction pipeline in R.' }, + { y: '2015', t: 'CSAFE launched; the bullet-matching work became part of its founding research portfolio.' }, + { y: '2016', t: 'ASA Imaging Section Student Paper Award for the automated matching methodology.' }, + { y: '2017', t: 'Thesis defended; primary paper published in the Annals of Applied Statistics.' }, + { y: 'Today', t: 'Still an occasional collaborator on CSAFE\u2019s BulletAnalyzr pipeline and the successor R packages.' }, +]; +--- + + + +
+
+
+ +
+ + +

+ + Iowa State University · 2012 — 2017 · Statistics & Computer Science +

+ +

+ Matching spent bullets to the guns that fired them — + statistically, reproducibly, in code. +

+ +

+ My dissertation replaced a firearms examiner's judgement call through a comparison microscope with + an open, end-to-end statistical pipeline operating on 3D surface scans. The resulting methods, + software, and publications are now part of the + CSAFE research program and have been cited in + the ongoing debate over the scientific foundation of pattern-matching forensic disciplines. +

+ + + + +
+ {stats.map((s) => ( +
+
+ {s.k} +
+
+ {s.v} +
+
{s.d}
+
+ ))} +
+
+
+ + +
+
+
+

+ When a bullet is fired, the barrel leaves fine striations on its surface — tool marks + that are, in principle, characteristic of that barrel. Traditional firearms identification + asks a human examiner to look through a comparison microscope and decide whether two bullets + match. The decision is binary, the rationale is verbal, and the error rate has historically + been opaque. +

+

+ The 2009 NAS report and 2016 PCAST report both singled out + pattern-matching forensic disciplines for lacking empirical foundations. You cannot argue + about error rates on a method until the method is written down precisely enough to run twice. + My dissertation set out to write it down. +

+
+ +
+
+ + +
+
    + {pipeline.map((step) => ( +
  1. + + +

    + {step.title} +

    +

    + {step.detail} +

    +
  2. + ))} +
+ + +
+
+ + + Synthetic striation signature — illustrative + + amplitude × position along land +
+ + + + + + + + + + + + + + + + + + + + + {[110, 220, 330, 450, 560, 680].map((x) => ( + + ))} + + +

+ Two signatures overlaid. Peaks and valleys align where the same barrel feature scored both + bullets — the cross-correlation between them is what the classifier ultimately turns + into a match probability. +

+
+
+ + +
+
+ {contributions.map((c) => ( + +
+ + +
+

+ {c.title} +

+

{c.body}

+
+ ))} +
+
+ + +
+ + +
+ + +
+
    + {timeline.map((t) => ( +
  1. + +

    {t.y}

    +

    {t.t}

    +
  2. + ))} +
+
+ + +
+
+
+

Co-advisor

+

Heike Hofmann

+

+ Professor of Statistics at Iowa State and long-time collaborator on the bullet-matching + methodology and the downstream R tooling. +

+
+
+

Co-advisor

+

Alicia Carriquiry

+

+ Distinguished Professor and founding director of CSAFE — the Center for Statistics and + Applications in Forensic Evidence. +

+
+
+

Research home

+

CSAFE

+

+ NIST Center of Excellence. The bullet-matching work continues there under the + BulletAnalyzr umbrella. +

+
+
+
+ + +
+
+
+
+

+ Still interested? +

+

+ Happy to talk forensic statistics. +

+

+ If you're working on pattern-matching evidence, reproducible pipelines, or the R tooling + around any of it — I still follow this space. +

+ +
+
+
+
+ +