Skip to main content

ePattern

ePattern is a Python toolkit for electron diffraction pattern simulation, spot detection, and crystal orientation indexing via vector matching.

Features

Simulation

  • Bloch-wave diffraction spot simulation using abTEM
  • HDF5 export with orientation index
  • Configurable tilt ranges and parallel execution

Spot Detection

  • Preprocessing pipeline with multiple noise reduction methods (Gaussian, DoG, Top-Hat, Rolling Ball)
  • Auto-prominence or manual prominence peak detection
  • Sub-pixel centroid refinement
  • Optional coordinate alignment
  • HDF5 export of detected spots

Vector Matching

Geometric Baseline

Direct spot-to-spot comparison between experimental and simulated patterns:

  • Gaussian-weighted position matching (σ configurable)
  • Pearson intensity correlation on matched spots
  • Combined score: 70% position + 30% intensity
  • No training required — works out of the box

DeePattern Encoder

Deep Sets architecture trained with contrastive learning for fast latent-space matching:

  • Per-spot MLP (4 → 128 → 256 → 256) with SiLU, LayerNorm, Dropout
  • Masked pooling: mean + max + attention
  • Global MLP (768 → 512 → 256 → 64) producing a compact latent vector
  • Triplet Loss training with cosine distance
  • ~480× faster than baseline at inference

Both methods support multi-material databases and GPU acceleration.

Order Quantification

  • Cation ordering analysis from superstructure spot intensities
  • Alignment, detection and intensity ratio computation
  • Color-mapped order ratio visualization
  • Install with pip install "epattern[order]"

GUI

  • Integrated Tkinter interface for all features
  • Visual verification of detected spots

Requirements

  • Python 3.11 or higher
  • NVIDIA GPU (optional, for CUDA acceleration)

Installation

CPU only

pip install epattern

GPU (CUDA 12)

pip install torch --index-url https://download.pytorch.org/whl/cu124
pip install "epattern[cuda12]"

GPU (CUDA 11)

pip install torch --index-url https://download.pytorch.org/whl/cu118
pip install "epattern[cuda11]"

Note: Check your CUDA version with nvidia-smi before choosing.

Quick Start

Launch the GUI

epattern

Programmatic Usage

Simulation

from epattern import simulate_diffraction

simulate_diffraction(
    cif_file="structure.cif",
    output_path="simulation.h5",
    detector_size=512,
    camera_length=200,
    pixel_size=14,
    energy=200000,
    thickness=500,
    g_max=1.5,
    sg_max=0.1,
    intensity_threshold=1.5,
    tilt_x_min=-2,
    tilt_x_max=2,
    tilt_x_step=1,
    tilt_y_min=-2,
    tilt_y_max=2,
    tilt_y_step=1,
    tilt_z_min=-2,
    tilt_z_max=2,
    tilt_z_step=1,
    batch_size=10,
    parallel_workers=2,
)

Spot Detection

from epattern import detect_spots

peaks, transforms, settings = detect_spots(
    data_path="path/to/images",
    scan_cols=100,
    output_path="output/detection.h5",
    binning=True,
    align=True,
    auto_prominence=True,
    prominence_min=2.0,
    noise_factor=1.8,
    background_percentile=20.0,
    min_distance=8,
    threshold=3.0,
    max_items=150,
    noise_reduction_methods=[
        {"name": "Gaussian", "params": {"sigma": 1.0}},
    ],
)

Encoder Training

from epattern import train_encoder

# Train DeePattern on simulation databases
model = train_encoder(
    sim_h5_paths=["LMNO.h5", "LFP.h5", "SiO2.h5"],
    output_path="weights/deepattern.pt",
    epochs=100,
    batch_size=256,
    latent_dim=64,
    device="cuda",
)

Vector Matching (Encoder)

from epattern import create_encoder, run_matching

# Load the pre-trained encoder shipped with ePattern
model = create_encoder(use_default_weights=True, device="cuda")

# Or load your own weights
# model = create_encoder(weights_path="weights/deepattern.pt", device="cuda")

# Match experimental patterns against reference databases
results = run_matching(
    query_h5="detection.h5",
    ref_h5_paths=["LMNO.h5", "LFP.h5"],
    method="encoder",
    model=model,
    top_k=5,
    device="cuda",
    output_path="results/matching.csv",
)

# Results is a DataFrame with predicted materials and orientations
print(results[["scan_x", "scan_y", "pred_material_name", "confidence"]])

Vector Matching (Baseline)

from epattern import run_matching

# No model needed — direct geometric comparison
results = run_matching(
    query_h5="detection.h5",
    ref_h5_paths=["LMNO.h5", "LFP.h5"],
    method="baseline",
    sigma_px=3.0,
    top_k=5,
    output_path="results/baseline.csv",
)

Order Quantification

from epattern.order import order_quantification
order_quantification(
    file_path="data/spots.csv",
    output_path="output/",
    columns=["X_scan", "Y_scan", "X_acc", "Y_acc", "Mean"],
    principal_spots_o3=[[100, 200], [150, 250]],
    extra_spots_o3=[[120, 180], [170, 230]],
    radius_limit=15.0,
    x_c_o3=256.0,
    y_c_o3=256.0,
    real_space_image_size=(512, 512),
    custom_colors={"high": "red", "low": "blue"},
)

abTEM Patch

abTEM (≥1.0.9) contains a bug where in-place operations are performed on read-only NumPy arrays during Bloch wave calculations, causing ValueError: output array is read-only.

ePattern includes an automatic patch that fixes this. Apply it once after installing abTEM:

Via the GUI

Click the "Patch abTEM" button on the home page or in the header.

Via Python

from epattern.utils.abtem_patch import apply_abtem_patch

success, message = apply_abtem_patch()
print(message)

The patch modifies abtem/bloch/dynamical.py to insert .copy() calls before in-place operations. A backup of the original file is created automatically. Restart Python after applying.

Changelog

See CHANGELOG.md for version history.

About

This project was developed within the Image & Data Science group of the LRCS laboratory / RS2E network, led by Arnaud Demortière (Director of Research at CNRS). The group develops Deep Learning and AI-based algorithms to analyze diffraction patterns and multispectral imagery for battery materials research.

Authors and Contributors

Author:

  • Liu François

Contributors:

  • Fayçal Adrar
  • Junhao Cao
  • Nicolas Folastre
  • Arnaud Demortière

License

This project is distributed under the Apache License 2.0. See the LICENSE file for details.

Metadata

Release files for epattern 1.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for epattern 1.2.1
File Size Uploaded
epattern-1.2.1.tar.gz 4.2 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for epattern 1.2.1
File Interpreter ABI Platform
epattern-1.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 8.5 MB

Release files / epattern-1.2.1.tar.gz

Download URL epattern-1.2.1.tar.gz
Size 4.2 MB
Tags Source
SHA-256 checksum
How to use checksums
a819f3a7efedfe7d41d6826a569c1407371cf7d28534392bf4188e4bff6f57ae
BLAKE2b-256 checksum
How to use checksums
8f3d25f5b5211fd6b01e1a5e0554d3b419228872031954373b64b6003d31d7b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.3.2 CPython/3.14.3 Windows/11

Release files / epattern-1.2.1-py3-none-any.whl

Download URL epattern-1.2.1-py3-none-any.whl
Size 4.3 MB
Tags Python 3
SHA-256 checksum
How to use checksums
4f5299856e970ad86c52cdd1bbc315bc81c559d297db9f6a321a073292c57c6c
BLAKE2b-256 checksum
How to use checksums
2b4c5dc830ac07014a273545e6cf710a13ac3e0aa08d126d02b3b37ac9b78885
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.3.2 CPython/3.14.3 Windows/11

Release history Release notifications | RSS feed

This release

1.2.1 This release

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page