{"id":49802091,"url":"https://github.com/peekperformer/resistamet-gui","last_synced_at":"2026-07-01T22:01:30.670Z","repository":{"id":283168082,"uuid":"950889897","full_name":"PEEKPerformer/ResistaMet-GUI","owner":"PEEKPerformer","description":"GUI application for Keithley 2400 Series SourceMeter resistance measurements with real-time data visualization and comprehensive instrument control.","archived":false,"fork":false,"pushed_at":"2026-05-25T20:22:32.000Z","size":6188,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-25T22:29:21.302Z","etag":null,"topics":["data-acquisition","electrical-measurement","keithley","keithley2400","laboratory-software","materials-science","research-tools","resistance-measurement","scientific-computing","scientific-instruments"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/PEEKPerformer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-18T20:51:52.000Z","updated_at":"2026-05-25T20:22:36.000Z","dependencies_parsed_at":null,"dependency_job_id":"7a4971c2-7cbd-47ff-bf69-4aeba9d8d0d4","html_url":"https://github.com/PEEKPerformer/ResistaMet-GUI","commit_stats":null,"previous_names":["peekperformer/resistamet-gui"],"tags_count":19,"template":false,"template_full_name":null,"purl":"pkg:github/PEEKPerformer/ResistaMet-GUI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PEEKPerformer%2FResistaMet-GUI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PEEKPerformer%2FResistaMet-GUI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PEEKPerformer%2FResistaMet-GUI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PEEKPerformer%2FResistaMet-GUI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/PEEKPerformer","download_url":"https://codeload.github.com/PEEKPerformer/ResistaMet-GUI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/PEEKPerformer%2FResistaMet-GUI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35024365,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-acquisition","electrical-measurement","keithley","keithley2400","laboratory-software","materials-science","research-tools","resistance-measurement","scientific-computing","scientific-instruments"],"created_at":"2026-05-12T15:01:44.742Z","updated_at":"2026-07-01T22:01:30.658Z","avatar_url":"https://github.com/PEEKPerformer.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs/logo-dark.png\"\u003e\n    \u003cimg src=\"docs/logo.png\" alt=\"ResistaMet logo\" width=\"120\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n# ResistaMet GUI\n\n[![DOI](https://img.shields.io/badge/DOI-10.5281%2Fzenodo.19919751-blue)](https://doi.org/10.5281/zenodo.19919751)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Docs](https://img.shields.io/badge/docs-bfer.land-blue.svg)](https://bfer.land/ResistaMet-GUI/)\n\nOpen-source graphical interface for electrical characterization with Keithley 2400-family sourcemeters, with ASTM F84-aligned four-point-probe and ASTM F76 van der Pauw analysis built in.\n\n**Version:** 1.13.1\n**Author:** Brenden Ferland\n\n![ResistaMet GUI — Van der Pauw tab, mid-protocol. The sample diagram shows lead wiring for the active F76 geometry; the filmstrip below tracks progress through the four geometries.](docs/screenshots/06_van_der_pauw.png)\n\n\u003cdetails\u003e\n\u003csummary\u003eMore tabs (click to expand)\u003c/summary\u003e\n\n| Tab | Screenshot |\n|-----|-----------|\n| Resistance Measurement | ![Resistance](docs/screenshots/01_resistance.png) |\n| Voltage Source | ![Voltage Source](docs/screenshots/02_voltage_source.png) |\n| Current Source | ![Current Source](docs/screenshots/03_current_source.png) |\n| 4-Point Probe | ![4-Point Probe](docs/screenshots/04_four_point_probe.png) |\n| I-V Sweep | ![I-V Sweep](docs/screenshots/05_iv_sweep.png) |\n| Van der Pauw | ![Van der Pauw](docs/screenshots/06_van_der_pauw.png) |\n\nGenerated reproducibly via `python tools/generate_screenshots.py` — runs headless under Qt's offscreen platform, no instrument required.\n\n\u003c/details\u003e\n\n## Try it now (no instrument required)\n\n```bash\ngit clone https://github.com/PEEKPerformer/ResistaMet-GUI.git\ncd ResistaMet-GUI\npip install -e .\nresistamet-gui --simulate\n```\n\nThis launches the full GUI against an in-package Keithley 2400-family simulator. Every measurement mode works end-to-end with no NI-VISA and no GPIB hardware. The simulator is byte-validated against captured hardware traces — see [`docs/sim_fidelity.md`](docs/sim_fidelity.md).\n\nOptional: `--sim-resistance 1000` (1 kΩ DUT) or `--sim-model 2410` (advertise a different Keithley model).\n\nIf you don't have Python, the latest GitHub release attaches a standalone Windows `.exe` — see [Installation → Windows](https://bfer.land/ResistaMet-GUI/installation/#windows--no-python-required).\n\n## What it does\n\n| Mode | Sources | Measures | Typical use |\n|------|---------|----------|-------------|\n| **Resistance** | Current | Resistance | 2- or 4-wire resistance, long-duration logging |\n| **Voltage Source** | Voltage | Current | Bias stress, chronoamperometry, electrochemistry |\n| **Current Source** | Current | Voltage | Material characterization |\n| **Four-Point Probe** | Current | Voltage | Sheet resistance + resistivity (ASTM F84) |\n| **I-V Sweep** | Voltage *or* Current | Current *or* Voltage | Diode / device curves, hysteresis |\n| **Van der Pauw** | Current | Voltage | Sheet resistance on arbitrary-shape samples (ASTM F76) |\n\nSource/measure envelopes vary by model (2400 / 2401 / 2410 / 2420 / 2425 / 2430 / 2440 / 2450) — see the [per-model table](https://bfer.land/ResistaMet-GUI/installation/#instrument-compatibility) in the docs. Per-reading instrument uncertainty from the Keithley datasheet propagates through every derived quantity (sheet resistance, resistivity, conductivity).\n\n## Statement of need\n\nThe Keithley 2400 family is standard equipment in materials, sensor, and device-physics labs, but no open application covers the combined workflow of long-duration fixed-bias logging, four-point-probe surveys, van der Pauw, I-V sweeps, and 2-/4-wire resistance on the same instrument. ResistaMet GUI fills that gap for researchers who own a Keithley sourcemeter, don't write instrument-control code, and need every mode of that bench workflow in one point-and-click application.\n\n## Installation\n\n```bash\ngit clone https://github.com/PEEKPerformer/ResistaMet-GUI.git\ncd ResistaMet-GUI\npip install -e .\nresistamet-gui              # real instrument (needs VISA backend)\nresistamet-gui --simulate   # in-package simulator, no hardware\n```\n\nFor VISA-backend choice (NI-VISA vs pyvisa-py), Linux Qt runtime packages, and the standalone Windows `.exe` path, see [Installation](https://bfer.land/ResistaMet-GUI/installation/).\n\n## Documentation\n\nFull docs at **[bfer.land/ResistaMet-GUI](https://bfer.land/ResistaMet-GUI/)**:\n\n- [Installation](https://bfer.land/ResistaMet-GUI/installation/) — Python source install, Windows `.exe`, VISA backends, per-model compatibility\n- [Quick Start](https://bfer.land/ResistaMet-GUI/quickstart/) — first-measurement walkthrough + per-mode workflows\n- [Concepts](https://bfer.land/ResistaMet-GUI/concepts/) — SMU glossary (NPLC, compliance, auto-zero, Enhanced R, F84, F76, …)\n- [Settings](https://bfer.land/ResistaMet-GUI/settings/) — Settings dialog reference + defaults\n- [Data Outputs](https://bfer.land/ResistaMet-GUI/outputs/) — CSV / HDF5 / legacy JSON format + every column for every mode\n- [Troubleshooting](https://bfer.land/ResistaMet-GUI/troubleshooting/) — common errors and fixes\n\n## Quick Start\n\n1. Launch and create a user profile\n2. Click **Test Connection** to verify instrument communication (or use `--simulate`)\n3. Enter a sample name\n4. Set source level and compliance — type natural units like `1mA`, `5V`, `100uA`\n5. Click **Start**\n\nLive V/I/R/P readings appear in Wong-palette colors with `± σ` uncertainty; the plot updates in real time; data streams to a single `.csv` with a metadata header.\n\nSee [Quick Start](https://bfer.land/ResistaMet-GUI/quickstart/) for per-mode workflows (4PP multi-spot, delta mode, vdP geometry-by-geometry, I-V sweep).\n\n## Project Structure\n\n- `resistamet_gui/` — application package. Core modules: `calculations.py` + `calculations_vdp.py` (pure F84 / F76 math), `instrument.py` (Keithley VISA wrapper), `workers.py` (QThread measurement loop + vdP state machine), `data_export.py` (CSV / HDF5 / legacy JSON exporters), `accuracy.py` (per-range datasheet specs), `safety.py` (touch-safety check), `_simulator.py` (in-package fake), and `ui/` (main window, dialogs, canvas, widgets).\n- `tests/` — pytest suite. Unit/integration tests for every module, `test_gui_smoke.py` for Qt widget lifecycle, `test_e2e_simulator.py` for end-to-end UI-to-CSV pipeline, `test_workers.py::TestSCPIContract` for per-mode SCPI command assertions, `tests/fakes/` (the fake instrument), `tests/fixtures/scpi_traces*/` (captured hardware traces), `tests/hardware/` (real-instrument tests gated by `RESISTAMET_HARDWARE_ADDR`).\n- `docs/` — mkdocs-material site sources (deployed to GitHub Pages via `.github/workflows/docs.yml`).\n- `scripts/community_capture.py` — self-contained tool for contributors to capture SCPI traces from other 2400-family models.\n\n## Testing\n\n```bash\nQT_QPA_PLATFORM=offscreen pytest tests/ -v                       # unit + integration\nQT_QPA_PLATFORM=offscreen pytest tests/test_e2e_simulator.py -v  # end-to-end via simulator\npytest tests/ -v --ignore=tests/test_gui_smoke.py --ignore=tests/test_e2e_simulator.py  # no Qt\n```\n\nCI runs both invocations on Linux + Windows × Python 3.9-3.12 — see [`.github/workflows/test.yml`](.github/workflows/test.yml).\n\n## Version History\n\nSee [CHANGELOG.md](CHANGELOG.md) for the full version history.\n\n## Citation\n\nIf you use ResistaMet GUI in your research, please cite:\n\n```\nFerland, B. (2026). ResistaMet GUI: An Open-Source Electrical Measurement Suite\nfor Keithley 2400-family Sourcemeters [Software]. Zenodo. https://doi.org/10.5281/zenodo.19919751\n```\n\nThe DOI above is the *concept DOI* and always resolves to the latest archived version. Zenodo also provides a per-version DOI for citing a specific release. A `CITATION.cff` is included in the repository for machine-readable citation metadata.\n\n## Contributing\n\nContributions are welcome. Please see:\n\n- [`CONTRIBUTING.md`](CONTRIBUTING.md) — bug reports, feature requests, development setup, and the cross-model trace contribution path.\n- [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md) — community guidelines.\n- [Issue templates](.github/ISSUE_TEMPLATE) — bug report, feature request, and cross-model SCPI-trace submission.\n\nThe fastest way to help right now is to run [`scripts/community_capture.py`](scripts/community_capture.py) on any Keithley 2400-family instrument other than the 2400 and 2420 already validated in-house — see [Installation → Help validate cross-model fidelity](https://bfer.land/ResistaMet-GUI/installation/#help-validate-cross-model-fidelity).\n\n## License\n\nMIT License — see [`LICENSE.md`](LICENSE.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeekperformer%2Fresistamet-gui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeekperformer%2Fresistamet-gui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeekperformer%2Fresistamet-gui/lists"}