{"id":37061471,"url":"https://github.com/bcliang/gamry-parser","last_synced_at":"2026-01-14T06:58:29.497Z","repository":{"id":45074197,"uuid":"174831518","full_name":"bcliang/gamry-parser","owner":"bcliang","description":"Package for parsing the contents of Gamry EXPLAIN data (DTA) files","archived":false,"fork":false,"pushed_at":"2024-02-29T16:49:45.000Z","size":147,"stargazers_count":10,"open_issues_count":6,"forks_count":10,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-27T08:32:25.880Z","etag":null,"topics":["chronoamperometry","cyclic-voltammetry","eis","electrochemistry","explain","gamry","parser","python"],"latest_commit_sha":null,"homepage":null,"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/bcliang.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-10T14:02:55.000Z","updated_at":"2025-08-17T06:36:30.000Z","dependencies_parsed_at":"2022-08-30T14:41:18.370Z","dependency_job_id":null,"html_url":"https://github.com/bcliang/gamry-parser","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/bcliang/gamry-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcliang%2Fgamry-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcliang%2Fgamry-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcliang%2Fgamry-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcliang%2Fgamry-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bcliang","download_url":"https://codeload.github.com/bcliang/gamry-parser/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bcliang%2Fgamry-parser/sbom","scorecard":{"id":228529,"data":{"date":"2025-08-11","repo":{"name":"github.com/bcliang/gamry-parser","commit":"b2efe0c7b6a589a25f5f65d846686a063233fe41"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 1 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":"Code-Review","score":1,"reason":"Found 1/7 approved changesets -- score normalized to 1","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":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/lint.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/unittest.yml:1","Info: no jobLevel write permissions found"],"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":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/bcliang/gamry-parser/lint.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/lint.yml:9: update your workflow using https://app.stepsecurity.io/secureworkflow/bcliang/gamry-parser/lint.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/lint.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/bcliang/gamry-parser/lint.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/bcliang/gamry-parser/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/bcliang/gamry-parser/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/bcliang/gamry-parser/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/bcliang/gamry-parser/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/bcliang/gamry-parser/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unittest.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/bcliang/gamry-parser/unittest.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/unittest.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/bcliang/gamry-parser/unittest.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/release.yml:17","Warn: pipCommand not pinned by hash: .github/workflows/unittest.yml:19","Warn: pipCommand not pinned by hash: .github/workflows/unittest.yml:20","Warn: pipCommand not pinned by hash: .github/workflows/unittest.yml:29","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of   4 pipCommand dependencies pinned"],"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":"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":"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":"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":"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":"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"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":"Vulnerabilities","score":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2013-22 / GHSA-27x4-j476-jp5f","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-cx63-2mw6-8hw5","Warn: Project is vulnerable to: PYSEC-2022-43012 / GHSA-r9hx-vwmv-q579","Warn: Project is vulnerable to: PYSEC-2020-73"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 28 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-17T04:20:19.941Z","repository_id":45074197,"created_at":"2025-08-17T04:20:19.941Z","updated_at":"2025-08-17T04:20:19.941Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28412478,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T05:26:33.345Z","status":"ssl_error","status_checked_at":"2026-01-14T05:21:57.251Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["chronoamperometry","cyclic-voltammetry","eis","electrochemistry","explain","gamry","parser","python"],"created_at":"2026-01-14T06:58:29.055Z","updated_at":"2026-01-14T06:58:29.483Z","avatar_url":"https://github.com/bcliang.png","language":"Python","readme":"# gamry-parser\n\n[![PyPI](https://img.shields.io/pypi/v/gamry-parser.svg)](https://pypi.org/project/gamry-parser/)\n![PyPI - Python Version](https://img.shields.io/pypi/pyversions/gamry-parser.svg)\n[![PyPI - License](https://img.shields.io/pypi/l/gamry-parser.svg)](./LICENSE)\n\nPython package for parsing the contents of Gamry EXPLAIN data (DTA) files. This package is meant to convert flat-file EXPLAIN data into pandas DataFrames for easy analysis and visualization.\n\n## Getting Started\n\n### Dependencies\n\n* pandas\n\n### Installation\n\n#### Package from PyPi\n\n```bash\n$ pip install gamry-parser\n```\n\n#### Local Installation\n\n1. Check out the latest code:\n```bash\n$ git clone git@github.com:bcliang/gamry-parser.git\n```\n2. Use setuptools to install the package\n```bash\n$ python setup.py install\n```\n\n### Usage\n\nThe provided Usage example loads a CV DTA file two ways, and demonstrates the utility of class properties within the CyclicVoltammetry subclass (`v_range`, `scan_rate`)\n\n```bash\n$ python usage.py\n```\n\n#### GamryParser Example\n\nThe following snippet loads a DTA file and prints to screen: (1) experiment type, (2) # of curves, and (3) a random curve in the form of a pandas DataFrame.\n\n```python\nimport gamry_parser as parser\nimport random\n\nfile = '/enter/the/file/path.dta'\ngp = parser.GamryParser()\ngp.load(filename=file)\n\nprint(\"experiment type: {}\".format(gp.experiment_type))\nprint(\"loaded curves: {}\".format(gp.curve_count))\n\ncurve_index = random.randint(1,gp.curve_count)\nprint(\"showing curve #{}\".format(curve_index))\nprint(gp.curve(curve_index))\n```\n\n#### ChronoAmperometry Example\n\nThe `ChronoAmperometry` class is a subclass of `GamryParser`. Executing the method `get_curve_data()` will return a DataFrame with three columns: (1) `T`, (2) `Vf`, and (3) `Im`\n\nIn the example, the file is expected to be a simple chronoamperometry experiment (single step, no preconditioning); there will only be a single curve of data contained within the file. In addition, note the use of the `to_timestamp` property, which allows the user to request `get_curve_data` to return a DataFrame with a `T` column containing DateTime objects (as opposed to the default: float seconds since start).\n\n```python\nimport gamry_parser as parser\nimport random\n\nfile = '/enter/the/file/path.dta'\nca = parser.ChronoAmperometry(to_timestamp=True)\nca.load(filename=file)\nprint(ca.curve())\n```\n\n#### Demos\n\nA simple demonstration is provided in `usage.py`. \n\n`python usage.py` \n\nipython notebook demonstration scripts are included in the `demo` folder.\n\n- `notebook_gamry_parser.ipynb`: Simple example loading data from ChronoA experiment output. Instead of `gamry_parser.GamryParser()`, the parser could be instantiated with `gamry_parser.ChronoAmperometry()`\n- `notebook_cyclicvoltammetry.ipynb`: Example loading data from a CV (cyclic voltammetry) experiment output. Uses the `gamry_parser.CyclicVoltammetry()` subclass.\n- `notebook_cyclicvoltammetry_peakdetect.ipynb`: Another example that demonstrates loading CV data and detecting peaks in the data using `scipy.signal.find_peaks()`\n- `notebook_potentiostatic_eis.ipynb`: Example loading data from an EIS (electrochemical impedance spectroscopy) experiment. Uses the `gamry_parser.Impedance()` subclass.\n\n#### Additional Examples\n\nSimilar procedure should be followed for using the `gamry_parser.CyclicVoltammetry()`, `gamry_parser.Impedance()`, `gamry_parser.OpenCircuitPotential()`, `gamry_parser.SquareWaveVoltammetry()` and `gamry_parser.VFP600()` parser subclasses. Take a look at `usage.py` and in `tests/` for some additional usage examples.\n\n## Development\n\n### Project Tree\n```\n  .\n  ├── gamry_parser              # source files\n  │   ├── ...          \n  │   ├── chronoa.py            # ChronoAmperometry() experiment parser\n  │   ├── cv.py                 # CyclicVoltammetry() experiment parser\n  │   ├── eispot.py             # Impedance() experiment parser\n  |   ├── gamryparser.py        # GamryParser: generic DTA file parser\n  │   ├── ocp.py                # OpenCircuitPotential() experiment parser\n  │   ├── squarewave.py         # SquareWaveVoltammetry() experiment parser\n  |   └── vfp600.py             # VFP600() parses experiment data generated by the Gamry VFP600 LabView Frontend. \n  ├── tests                     # unit tests and test data\n  |   └── ...\n  ├── setup.py                  # setuptools configuration\n  └── ...                \n```\n\n### Roadmap\n\nDocumentation! Loading of data is straightforward, and hopefully the examples provided in this README provide enough context for any of the subclasses to be used/extended.\n\nIn the future, it would be nice to add support for things like equivalent circuit modeling, though at the moment there are other projects focused specifically on building out models and fitting EIS data (e.g. [kbknudsen/PyEIS](https://github.com/kbknudsen/PyEIS), [ECSHackWeek/impedance.py](https://github.com/ECSHackWeek/impedance.py)).\n\n#### Changelog\n\nSee [`CHANGELOG`](CHANGELOG.md)\n\n### Tests\n\n[![Unit Tests](https://github.com/bcliang/gamry-parser/actions/workflows/unittest.yml/badge.svg)](https://github.com/bcliang/gamry-parser/actions/workflows/unittest.yml)\n\nTests extending `unittest.TestCase` may be found in `/tests/`.\n\nUnit tests are triggered as part of every pull request, but users can run tests locally as well:\n\n```bash\n$ tox\n```\n\nAlternatively, run `pytest` from your virtualenv (use the `-k` flag to filter tests)\n\n```bash\n$ pytest\n$ pytest -v -k \"test_getters\"\n```\n\n### Code Guidelines\n\n[![Lint](https://github.com/bcliang/gamry-parser/actions/workflows/lint.yml/badge.svg)](https://github.com/bcliang/gamry-parser/actions/workflows/lint.yml)\n\n* [GitHub flow](https://guides.github.com/introduction/flow/) for proposing changes (i.e. create a feature branch and submit a PR against the master branch).\n* Coding style: Pycodestyle formatting (PEP8). Linting via `black` is run on each push to github.\n* Tests: maintain \u003e 90% line coverage, per file\n\n### Versioning\n\n[SemVer](http://semver.org/) for versioning.\n1. Matching major version numbers are guaranteed to work together.\n2. Any change to the public API (breaking change) will increase a major version.\n\n### Publishing\n\n[![Publish](https://github.com/bcliang/gamry-parser/actions/workflows/release.yml/badge.svg)](https://github.com/bcliang/gamry-parser/actions/workflows/release.yml)\n\nThe package relies on Github Actions to automatically build and upload artifacts to pypi upon published release. \n\n#### Manual publishing (deprecated)\n\nUse setuptools to build, twine to publish to pypi.\n\n```bash\n$ rm -rf dist\n$ python setup.py build\n$ python setup.py sdist bdist_wheel\n$ twine upload dist/*\n```\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE.md) file for details\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbcliang%2Fgamry-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbcliang%2Fgamry-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbcliang%2Fgamry-parser/lists"}