{"id":37721365,"url":"https://github.com/eparsonnet93/ekpmeasure","last_synced_at":"2026-01-16T13:32:40.896Z","repository":{"id":44848612,"uuid":"339565507","full_name":"eparsonnet93/ekpmeasure","owner":"eparsonnet93","description":"Repository of analysis and computer control code for various experiments. Analysis module is designed to help the researcher wrangle large amounts of meta data","archived":false,"fork":false,"pushed_at":"2022-09-08T14:19:05.000Z","size":9609,"stargazers_count":8,"open_issues_count":0,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-10-27T19:29:59.138Z","etag":null,"topics":["analysis","berkeleynucleonics765","dataset","experimental","keithley-instruments","keithley6221","lakeshore475","meta-data","pypi","tektronix","tektronix3252","tektronix620b","tektronix6604","usb-1208hs"],"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/eparsonnet93.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"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}},"created_at":"2021-02-17T00:06:00.000Z","updated_at":"2025-10-18T18:10:28.000Z","dependencies_parsed_at":"2025-04-12T07:45:48.916Z","dependency_job_id":null,"html_url":"https://github.com/eparsonnet93/ekpmeasure","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/eparsonnet93/ekpmeasure","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eparsonnet93%2Fekpmeasure","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eparsonnet93%2Fekpmeasure/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eparsonnet93%2Fekpmeasure/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eparsonnet93%2Fekpmeasure/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eparsonnet93","download_url":"https://codeload.github.com/eparsonnet93/ekpmeasure/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eparsonnet93%2Fekpmeasure/sbom","scorecard":{"id":378826,"data":{"date":"2025-08-11","repo":{"name":"github.com/eparsonnet93/ekpmeasure","commit":"7feec4c9458c1811851a002026c5dba09a7c851a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2,"checks":[{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":2,"reason":"Found 2/10 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Binary-Artifacts","score":0,"reason":"binaries present in source code","details":["Warn: binary detected: dist/ekpmeasure-0.0.1-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.0.11-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.0.12-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.0.13-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.0.3-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.0.4-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.0.5-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.0.6-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.0.7-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.0.8-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.1.0-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.1.1-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.1.2-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.1.3-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.1.4-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.1.5-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.1.6-py3-none-any.whl:1","Warn: binary detected: dist/ekpmeasure-0.1.7-py3-none-any.whl:1","Warn: binary detected: dist/ekpy-0.1.10-py3-none-any.whl:1","Warn: binary detected: dist/ekpy-0.1.11-py3-none-any.whl:1","Warn: binary detected: dist/ekpy-0.1.12-py3-none-any.whl:1","Warn: binary detected: dist/ekpy-0.1.13-py3-none-any.whl:1","Warn: binary detected: dist/ekpy-0.1.13b0-py3-none-any.whl:1","Warn: binary detected: dist/ekpy-0.1.14-py3-none-any.whl:1","Warn: binary detected: dist/ekpy-0.1.9-py3-none-any.whl:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 22 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T14:55:15.629Z","repository_id":44848612,"created_at":"2025-08-18T14:55:15.629Z","updated_at":"2025-08-18T14:55:15.629Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28479033,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["analysis","berkeleynucleonics765","dataset","experimental","keithley-instruments","keithley6221","lakeshore475","meta-data","pypi","tektronix","tektronix3252","tektronix620b","tektronix6604","usb-1208hs"],"created_at":"2026-01-16T13:32:40.831Z","updated_at":"2026-01-16T13:32:40.885Z","avatar_url":"https://github.com/eparsonnet93.png","language":"Python","funding_links":["https://www.paypal.com/donate/?business=MJ5B7DLKMSHBG\u0026no_recurring=0\u0026currency_code=USD"],"categories":[],"sub_categories":[],"readme":"# Welcome to EKPy \n\n\n[![Documentation Status](https://readthedocs.org/projects/ekpmeasure/badge/?version=latest)](http://ekpmeasure.readthedocs.io/?badge=latest)\n[![PyPI version fury.io](https://badge.fury.io/py/ekpy.svg)](https://pypi.org/project/ekpy/)\n[![PyPI license](https://img.shields.io/pypi/l/ekpy.svg)](https://pypi.org/project/ekpy/)\n[![PyPi Downloads](http://pepy.tech/badge/ekpmeasure)](http://pepy.tech/project/ekpmeasure)\n[![PyPi Downloads](http://pepy.tech/badge/ekpy)](http://pepy.tech/project/ekpy)\n[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/donate/?business=MJ5B7DLKMSHBG\u0026no_recurring=0\u0026currency_code=USD)\n\n[![N|Scheme](https://github.com/eparsonnet93/ekpmeasure/blob/main/imgs/prl2.png)](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.125.067601)\n\nA repository of analysis and computer control code for various experiments. Image above is an example of data **collected** and **analyzed** using this package.\n\n[**See here for introdution videos**](https://www.youtube.com/watch?v=LcwbgeVzw3I)\n\n- [Overview](#overview)\n- [Installation](#installation)\n- [Development](#development)\n- [Important Links](#important-links)\n- [Change Log](#change-log)\n- [Support](#support)\n- [Cite this code](#citation)\n- [Cited by](#cited-by)\n\n# Overview\n\nEKPy (formerly ekpmeasure) is a set of control and analysis code designed to help streamline experiments. The basic idea is that in experimental work we often take data from many different sources, store it in different places, have varying degrees meta data associated with the data (even for a single type of data) and somehow(!) we are supposed to make sense of it all. We like to compare across trials, days, experimental conditions, etc. and it is very difficult to keep track of what data is where, and quickly access it when we need it. Often I find that folks end up copying and pasting raw data between excel spreadsheets and if you're not careful you will quickly lose track of which data came from where. This package's goal is to make this all easier. \n\nYou may not find the experimental control code as helpful as it is relatively specific to my research in condensed matter physics (though electrical engineers or similar may find it very useful) but the analysis code is for everyone. \n\nAt the heart of the analysis is the [Dataset](https://ekpmeasure.readthedocs.io/en/latest/ekpmeasure.analysis.html#ekpmeasure.analysis.core.Dataset) class which is a means of manipulating *meta data alone* in order to locate which actual data you want to analyze. [Datasets](https://ekpmeasure.readthedocs.io/en/latest/ekpmeasure.analysis.html#ekpmeasure.analysis.core.Dataset) don't care about what the real data looks like, and they keep track of where different data is stored so it is easy to select which data you want to look at - only then do you retrieve the data. The real data is returned in a [Data](https://ekpmeasure.readthedocs.io/en/latest/ekpmeasure.analysis.html#ekpmeasure.analysis.core.Data) class which allows you to group by parameters, perform calculations and much more.  \n\nI am always improving this repository and if you have suggestions, I appreciate any feedback and or issues (\u003chttps://github.com/eparsonnet93/ekpmeasure/issues\u003e)\n\nSee [examples](https://github.com/eparsonnet93/ekpmeasure/tree/main/examples) for more. \n\n\n\n---\n# Installation:\n\nIf you plan to use EKPy to control your experiments. You will need to install [NI-VISA](https://www.ni.com/en-us/support/downloads/drivers/download.ni-visa.html#442805) first. \n\nFind the latest build [here](https://pypi.org/project/ekpy/).\n\n```bash\npip install ekpy\n```\n\nor to upgrade to the latest version\n\n```bash\npip install -U ekpy\n```\n\nYou can also access `.whl` or `.tar.gz` files in the `dist/` directory directly for installation. \n\nFor installation issues, please see [Issue Tracker](https://github.com/eparsonnet93/ekpmeasure/issues)\n\nThere are also specific [experiments](https://github.com/eparsonnet93/ekpmeasure/tree/main/src/ekpmeasure/experiments) that can be installed following installation of `ekpy`. Please see the accompanying readme (*e.g.*, [here](https://github.com/eparsonnet93/ekpmeasure/blob/main/src/ekpmeasure/experiments/ferroelectric/_fastPUND/README.md)) for such cases. \n\n---\n# Development\n\nWe welcome new contributors of all experience levels. Please reach out directly (e.parsonnet@berkeley.edu) to inqure about getting involved. \n\n## Important Links\n\n* Official source code repo: https://github.com/eparsonnet93/ekpmeasure\n* Issue tracker: https://github.com/eparsonnet93/ekpmeasure/issues\n\n# Change log\n\n### Version 0.1.14\n\nWith help form Geo!\n\n- Updates to utils to make to improve the function `get_number_and_suffix` + other updates to include additional instruments and fixes.\n\n### Version 0.1.13\n\n- Can now group Data. `data.groupby`\n- Can now remove nans from data. `data.dropna`\n- Improvements to file management in control, saving, and more appropriate trial incrementing in `control.experiment`\n- Functions used in `data.apply` should no longer require the use of iterable data arrays. Please raise an issue if one occurs.\n\n### Version 0.1.12\n\n- Added functionality to `analysis.radiant`\n- Speed increase for `data.get_data()`\n- Minor bugs and other fixes\n\n### Version 0.1.11\n\n- `experiment.print_run_function_args` is gone. It has been replaced with `experiment.show_run_function_help`\n- Added a header of meta data to the default save function for `control.experiment` and started the process of doing away with meta_data `.pkl` files in favor of `.csv` (why did I ever think that was a good idea?)\n\n#### Version 0.1.10\n\n- minor bug fixes and documentation updates\n\n#### Version 0.1.9\n\n- minor bug fixes\n\n#### Version 0.1.8\n\n**2/18/22**\n- bug fixes from 0.1.7 and changed install name to `ekpy`. \n\n#### Version 0.1.6\n\n**1/23/22**\n- added `Data.to_DataFrame()` which allows one to convert `Data` to `pandas.DataFrame`. Each index of `Data` will be a single row in the resulting DataFrame. \n\n\n#### Version 0.1.5\n\n**1/12/22**\n- `merge_Datas` was replaced. The older version is now `concat_Datas` as it was really just concatenation, not merging. Merging now has real meaning, to merge a set of similar data objects on a specified definition key. Please report errors as they arise.\n\n- similary `merge_Datasets` is deprecated. One must use `concat_Datasets`. \n\n\n#### Version 0.1.4\n\n**12/2/21**\n- Added experiments module with `ferroelectric` experiments. This contains both relaxation (`_relaxation`) and switching (`_switching`) experiments. These consist of self contained jupyter notebooks that can be installed by `python -m ekpy.experiments.ferroelectric.\u003cexperiment_name\u003e`. For more see the experiment specific README for [relaxation](https://github.com/eparsonnet93/ekpmeasure/tree/main/src/ekpmeasure/experiments/ferroelectric/_relaxation) or [switching](https://github.com/eparsonnet93/ekpmeasure/tree/main/src/ekpmeasure/experiments/ferroelectric/_switching)\n- Bug fix on `Data.sort`\n\n**11/16/21**\n- `Data.apply` now allows for dropping data. This can be executed by having the function in `.apply` return `'None'`.\n- `data_array_builder.build` now allows one to fix lengths on 1D data by appending nans to make all data arrays the same length.\n- `analysis.plotting.add_legend_element` now allows kwarg fontsize\n\n**11/19/21**\n- `Data` can now be saved. Use `data.to_ekpdat`.\n\t- Can be loaded as `analysis.read_ekpdat`\n\n#### Version 0.1.3\n\n**11/11/21**\n- Minor fixes for deprecations in `control.misc`\n\n#### Version 0.1.2\n\n**11/7/21**\n- Speed improvements to `Dataset.remove_nonexistent_files`\n- `Data` objects can now be sorted by a definition parameter\n\n#### Version 0.1.1\n\n**11/2/21**\n\n- Updates to plotting during experimental control. Now one can simply override the `control.experiment` method `_plot` to define how plotting will take place. Here is a brief example of such an override:\n```python\nfrom ekpy.control import plotting\nfrom ekpy.control import experiment\nimport matplotlib.pyplot as plt\n\nclass exp(experiment):\n\n\t...\n\n\tdef _plot(self, data, scan_params):\n\t\tif hasattr(self, 'fig') and hasattr(self, 'ax'):\n\t\t\tpass\n\t\telse:\n\t\t\tfig, ax = plt.subplots()\n\t\t\tself.fig = fig\n\t\t\tself.ax = ax\n\t\t\t\n\t\tself.ax.scatter(scan_params['frequency'], np.mean(data['R']), color = 'blue')\n\t\tplt.show(self.fig)\n\t\tplotting.update_plot(self.fig)\n\n\t...\n```\n\n#### Version 0.1.0\n\n**10/24/21**\n\n- Dataset class is no longer subclass of `pandas.DataFrame`. This is to limit usage of unsupported functions. \n- Data class updates including sorting and collapsing. \n- One can access data or definition directly as an attribute now `Data.definition`, for example. One can also access pieces of information such as the real data corresponding to `p1` as `Data.p1` or definition keys, *e.g.* `high_voltage` as `Data.high_voltage`\n- Experiment class now saves a backup `.csv` meta data file in addition to the pickle file in order to help with errors related to different pandas versions on various machines. \n\n# Support \n\nCode related issues (e.g. bugs, feature requests) can be created in the\n[issue tracker](https://github.com/eparsonnet93/ekpmeasure/issues)\n\nMaintainer: Eric Parsonnet\n\n# Citation \n\nPlease cite this work following the [CITATION.cff](https://github.com/eparsonnet93/ekpmeasure/blob/main/CITATION.cff) (see [here](https://academia.stackexchange.com/questions/14010/how-do-you-cite-a-github-repository) for more details on how to cite.)\n\n# Cited By\n\n1. E. Parsonnet *et. al.* NonVolatile Electric Field Control of Thermal Magnons in the Absence of an Applied Magnetic Field, *Phys. Rev. Lett* **129**, 087601 (2022).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feparsonnet93%2Fekpmeasure","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feparsonnet93%2Fekpmeasure","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feparsonnet93%2Fekpmeasure/lists"}