adaptyv
How to use the Adaptyv Bio Foundry API and Python SDK for protein experiment design, submission, and results retrieval. Use this skill whenever the user…
Particle Image Velocimetry (PIV) analysis with OpenPIV. Use when extracting velocity fields from PIV image pairs, analyzing fluid dynamics or flow visualization experiments, cross-correlating interrogation windows, validating and replacing spurious PIV vectors, or computing
$ npx -y skills add k-dense-ai/claude-scientific-skills --skill openpiv --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/openpivContext preview
The summary Claude sees to decide when to auto-load this skill.
Particle Image Velocimetry (PIV) analysis with OpenPIV. Use when extracting velocity fields from PIV image pairs, analyzing fluid dynamics or flow visualization experiments, cross-correlating interrogation windows, validating and replacing spurious PIV vectors, or computing
name: openpiv description: Particle Image Velocimetry (PIV) analysis with OpenPIV. Use when extracting velocity fields from PIV image pairs, analyzing fluid dynamics or flow visualization experiments, cross-correlating interrogation windows, validating and replacing spurious PIV vectors, or computing vorticity, strain rate, and turbulence statistics from measured velocity fields. license: BSD-3-Clause compatibility: Requires Python 3.10+ with openpiv installed (uv pip install openpiv). numpy, scipy, scikit-image, and matplotlib arrive as dependencies. No network access needed after install. allowed-tools: Read Write Edit Bash metadata: version: "1.1" skill-author: OpenPIV Team tested-against: "openpiv 0.25.4"
OpenPIV (Open Particle Image Velocimetry) analyzes fluid flow from PIV image pairs. It covers preprocessing, cross-correlation, vector validation, outlier replacement, smoothing, and scaling to physical units.
Everything below is verified against **openpiv 0.25.4**. The API moves between releases — check `inspect.signature()` before trusting a snippet against a different version.
Use this skill when working with experimental PIV or flow-visualization image pairs: measuring 2D velocity fields, tuning interrogation-window parameters, validating vectors, or deriving vorticity, strain rate, and turbulence statistics. For *simulating* flow rather than measuring it, use a CFD skill instead.
Install OpenPIV:
uv pip install openpiv # Pin it when the analysis needs to be reproducible -- this is the version every # snippet below was checked against. uv pip install "openpiv==0.25.4"
Run PIV analysis on an image pair:
import numpy as np
from openpiv import tools, pyprocess, validation, filters, scaling
frame_a = tools.imread("image_a.bmp")
frame_b = tools.imread("image_b.bmp")
# Cross-correlate. Returns (u, v, s2n) whenever sig2noise_method is not None.
u, v, s2n = pyprocess.extended_search_area_piv(
frame_a.astype(np.int32),
frame_b.astype(np.int32),
window_size=32,
overlap=12,
dt=0.02,
search_area_size=38,
correlation_method="linear", # required for search_area_size > window_size
sig2noise_method="peak2peak",
)
x, y = pyprocess.get_coordinates(
image_size=frame_a.shape,
search_area_size=38,
overlap=12,
)
# flags is a boolean array: True marks a spurious vector.
flags = validation.sig2noise_val(s2n, threshold=1.05)
u, v = filters.replace_outliers(u, v, flags, method="localmean", max_iter=3, kernel_size=2)
# Scale to physical units, then flip to image coordinates for plotting.
x, y, u, v = scaling.uniform(x, y, u, v, scaling_factor=96.52)
x, y, u, v = tools.transform_coordinates(x, y, u, v)
tools.save("vectors.txt", x, y, u, v, flags)Or use the bundled CLI, which wraps exactly that pipeline:
python skills/openpiv/scripts/runner.py \
--image frame_a.bmp --image frame_b.bmp --output_dir results --verboseParticle Image Velocimetry is an optical method for measuring fluid velocity by tracking illuminated tracer particles between two images.
**Process flow:**
1. Capture an image pair (`frame_a`, `frame_b`) separated by a known time `dt`. 2. Divide the images into interrogation windows. 3. Cross-correlate matching windows to find peak displacement. 4. Validate vectors (signal-to-noise, global range, local median). 5. Replace spurious vectors with interpolated values. 6. Scale pixel displacements to physical units.
**`window_size`** — correlation window in pixels (typically 16–128). Larger windows give better correlation but coarser spatial resolution.
**`overlap`** — pixels shared between adjacent windows (typically 50–75% of `window_size`). Higher overlap raises vector density and cost, but adjacent vectors become correlated rather than independent.
**`search_area_size`** — the window searched in the second frame. Must be ≥ `window_size`; a few pixels larger accommodates larger displacements. Pair an extended search area with `correlation_method="linear"` — the default `"circular"` relies on FFT wrap-around and aliases large displacements into small ones. See `references/advanced_algorithms.md`.
Rules of thumb: keep the largest displacement under about a quarter of `window_size`, and aim for 5–10 particles per window.
`s2n` measures how distinct the correlation peak is. `sig2noise_method` controls how it is computed — `"peak2mean"` (the function default) or `"peak2peak"`. **The two are on different scales**, so a threshold tuned for one is meaningless for the other. Typical `peak2peak` thresholds are 1.05–1.3.
flags = validation.sig2noise_val(s2n, threshold=1.05) # flags is bool: True == spurious. `~flags` selects the good vectors.
Masking lives in `openpiv.preprocess`, **not** in an `openpiv.masking` module. It returns an `(image, mask)` tuple and expects a float image.
from openpiv import preprocess
# method="edges" for dark, sharp-edged objects; "intensity" for high-contrast objects.
frame_a_masked, mask_a = preprocess.dynamic_masking(
frame_a.astype(np.float64), method="intensity", filter_size=7, threshold=0.005
)
frame_b_masked, mask_b = preprocess.dynamic_masking(
frame_b.astype(np.float64), method="intensity", filter_size=7, threshold=0.005
)Feed the **returned image** into the correlation step — it already has the masked region zeroed. Do not multiply the original frame by `mask`: masking is already applied, and for `method="edges"` the mask comes back as `uint8` 0/255 rather than boolean, so multiplying rescales the image by 255.
Multi-pass (window deformation) lives in `openpiv.windef`, driven by a `PIVSettings` dataclass. `pyprocess` has no multi-pass entry point.
import numpy as np f
🔔 Claude Scientific Skills is now Scientific Agent Skills. Same skills, broader compatibility — now works with any AI agent that supports the open Agent Skills standard, not just Claude.
How to use the Adaptyv Bio Foundry API and Python SDK for protein experiment design, submission, and results retrieval. Use this skill whenever the user…
This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting, anomaly detection,…
Plan, execute, and document validation, verification, and transfer of analytical procedures under the governing framework - ICH Q2(R2) and Q14, USP…
Data structure for annotated matrices in single-cell analysis. Use when working with .h5ad files or integrating with the scverse ecosystem. This is the data…
Autonomously improve a real artifact (code, training recipe, agent harness, data pipeline, prompt) against an objective and an evaluator, using Hypothesis Tree…
Infer gene regulatory networks (GRNs) from gene expression data using scalable algorithms (GRNBoost2, GENIE3). Use when analyzing transcriptomics data (bulk…