PyMedPhys is an open-source Medical Physics python library

Overview

logo

A community effort to develop an open standard library for Medical Physics in Python. We build high quality, transparent software together via peer review and open source distribution. Open code is better science.

online-app build pypi python license

What is PyMedPhys?

PyMedPhys is an open-source Medical Physics python library built by an open community that values and prioritises code sharing, review, improvement, and learning from each other. It is inspired by the collaborative work of our physics peers in astronomy and the Astropy Project. PyMedPhys is available on PyPI and GitHub.

Beta level of development

PyMedPhys is currently within the beta stage of its life-cycle. It will stay in this stage until the version number leaves 0.x.x and enters 1.x.x. While PyMedPhys is in beta stage, no API is guaranteed to be stable from one release to the next. In fact, it is very likely that the entire API will change multiple times before a 1.0.0 release. In practice, this means that upgrading pymedphys to a new version will possibly break any code that was using the old version of pymedphys. We try to be abreast of this by providing details of any breaking changes from one release to the next within the Release Notes.

Community

PyMedPhys has a Discourse community to both help you find your feet using PyMedPhys and to facilitate collaboration and general discussion. Please reach out over there and we'd love to get to know you!

Documentation

The PyMedPhys documentation is split into five categories:

  1. App Users Guide: for those who only wish to use ready-made PyMedPhys tools.
  2. Library Users Guide: for those building their own Python apps, scripts and other tools who wish to incorporate elements of the PyMedPhys library.
  3. CLI Users Guide: for those who wish to use PyMedPhys' ready-made command line interface (e.g. to help automate existing workflows with minimal programming).
  4. Contributors Guide: for those who wish to make new contributions to either the PyMedPhys library or the PyMedPhys app.
  5. General: Material that may apply to any visitor to PyMedPhys.

Our Team

PyMedPhys is what it is today due to its maintainers and contributors, both past and present. Here is our team.

Maintainers

rccc sjs rah

Active contributors

uth uoc hgugm

Past contributors

Comments
  • JOSS paper

    JOSS paper

    Hi All,

    @rembishj has put together a great draft top level paper for citing PyMedPhys. This PR brings in his work. The current authors on the paper are:

    @SimonBiggs, @sjswerdloff, @Matthew-Jennings, @pchlap, and @rembishj. But there have been many others involved in the formation during these early years of PyMedPhys:

    @msobolewski, @JacobMcAloney, @dg1an3, @matthewdeancooper, @kingrpaul, @peterg1t, and @ayalalazaro.

    Given your involvement in being a part of making PyMedPhys what it is today, if you'd like to be involved in the authorship of this paper, let us know in this PR.

    Everyone who is an author, can you please review this PR, make comments, suggestions, and if you're happy with it provide your PR approval.

    Thanks again @rembishj for making the writing of this paper a reality!

    Cheers, Simon

    opened by SimonBiggs 77
  • Interoperability between EGSnrc and PyMedPhys

    Interoperability between EGSnrc and PyMedPhys

    Let's open the discussion on whether EGSnrc itself can be included in the web app. I have no idea where to even start. I'll offer what expertise I have.

    opened by mchamberland 64
  • [MRG] Pinnacle Export Tool

    [MRG] Pinnacle Export Tool

    Imported current version of the Pinnacle to DICOM export tool. In the end I decided to put it straight into its own package, since I wanted to expose it on the CLI from the start, it didn't seem appropriate to have it in labs.

    The next steps are to add some documentation on how to use, as well as add some more automated tests to allow for contributions moving forward. But I'm curious to hear what you think so far!

    opened by pchlap 63
  • User testing WLutz

    User testing WLutz

    Heya @mchamberland,

    Were you keen on testing the whole Wlutz arc method? What vendor/model Linac do you have?

    If you are, I can step you through the current installation process. I am working on simplifying it, but working with you to get it up and running at your site would likely help that process also.

    Cheers, Simon

    opened by SimonBiggs 51
  • Consider a more permissive licence than AGPLv3.

    Consider a more permissive licence than AGPLv3.

    Hi @SimonBiggs and others,

    I think we should seriously consider abandoning the AGPLv3 license applied to pymedphys in favour of a more permissive license. If not MIT, then perhaps LGPL (which I've seen recommended for libraries) or 3- or 4-clause BSD. We can explore options.

    The strong copyleft nature of AGPLv3 - that any derivative work must be released under the same license and that the source must be released alongside the derivative work - is a very strong disincentive to contribute, for at least three reasons:

    1. IP conflicts on either contributed or derivative work
    2. The added workflow burden of compliance (which makes no sense for a library)
    3. Limited commercialisation options for derivative works

    To elaborate:

    • For contributors: EDIT: upon reflection, these are problems with open-source in general, not necessarily AGPLv3.

      • Most of our expected contributors will be employed medical physicists. Both we as maintainers and they as contributors would prefer the ability to make contributions in the natural course of their employment. However, most (all?) institutions have at least partial claim to any IP that their employees produce. By default, an employee may not have the legal right to make open-source contributions during work-hours. Even after-hours contributions are murky if they in any way leverage assets provided by the employer.
      • Some medical physicists, especially those employed by smaller, private institutions, might be able to negotiate terms to make open-source contributions. But this is at the discretion of their employers/IP decision-makers, with any "no"s subtracting from our pool of potentially high-quality contributors. Moreover, many physicists are employed in large, highly-bureaucratic institutions where IP negotiation, although not impossible, is difficult. I'd also suggest that cumbersome, drawn-out negotiations are unlikely to be undertaken without the promise of (financial) reward.
    • For library users:

      • My interpretation is that developers who create larger works that use even small pieces of pymedphys must make the entire source codebase of their larger work freely available. EDIT: it's only to those to whom they distribute the code. It is possible that in some cases, the "aggregate" definition will hold, but as I outlined above, the definition seems rather narrow in scope. This is a severe restriction for a library. The points I made above for contributors apply here as well: users may not have the legal right to propagate the AGPLv3 license and so cannot use the pymedphys library for larger works (which could even be so obscure and specific as to be unsuitable for inclusion into pymedphys). This is surely a majority of potential users.
      • Moreover, even if they do have the legal right, the cost of compliance could be high. There are precise manners in which source code must be made available under AGPLv3, consitutiing yet another disincentive to even use pymedphys.

    As I understand it, the major reasons for having AGPLv3 are that it prevents others from simply packaging up pymedphys and reselling it under a closed offering without properly acknowledging original work (although I think this still remains illegal under other licenses) or expanding the free/open-source codebase. But I personally find neither of these points particularly compelling:

    • If people see fit to package up pymedphys and resell it as a closed version, let them! If they've only provided a non-free version of something that's already freely available, it won't take hold anyway. If they've provided a suite superior enough (e.g. with enough added convenience/functionality) for people to pay for it, they've genuinely added value and should have the option of being compensated for it. Both cases will almost certainly promote the visibility of pymedphys. Plus, I genuinely have faith that most people aren't complete asses and would largely attribute credit where it's due. And I'm still pretty sure this is a legal requirement for alternative licenses anyway. If someone is willing to breach copyright for the other licenses, they are willing to breach any added terms in AGPLv3. So we might have a license that limits contributors and user numbers without achieving what it's designed to achieve anyway...
    • The second point is merely ideology: that more code should be available open-source, and AGPLv3 legally enforces it for any derivative works. I really think this is a mistake. So what if heaps of derivations exist that are closed? I suspect there will be anyway, due to the difficulty of enforcing this particular term. Plus, we may ironically have fewer open-source contributions due to the restrictive nature. The restriction might achieve the opposite of what it intends.

    Also note that QATrack+, pylinac and pydicom are all under the MIT license. Even dicompyler-core, although not the standard MIT licence, has a similarly unrestrictive license. I think we should have strong cause to deviate from this apparent consensus.

    Sure, plenty of other projects have AGPLv3, but they are not medical physics projects that are largely contributed to by medical physicists employed under almost certainly stricter IP arrangements than the typical software developer. I'm not sure how many parallels we can draw between pymedphy and more general open-source projects. Even then, plenty of high quality open source projects have less restrictive licenses (like GitLab, Electron, Atom, AngularJS...)

    Note that most of the above constitutes my (read: a non-lawyer's) interpretation of the situation. I'm certainly open to correction, but I do think I have the general gist.

    On a personal note, I am genuinely concerned about my ability to make contributions going forward. Initial conversations in this regard are not looking good. I actually have to navigate IP for two large, bureaucratic institutions: my hospital AND my university...

    governance 
    opened by Matthew-Jennings 43
  • Docs reorganisation

    Docs reorganisation

    See #1665

    You can see the changes made to the docs by this PR here: https://docs.pymedphys.com/en/docs-reorg/


    Proposed structure (draft):

    • Overview
    • Users Guide
      • Getting started
        • Quick start guide
        • Using the Application
        • Using the CLI
        • Using the Library
      • How-to guides
      • Technical reference
      • Background information
    • Contributors Guide
      • Getting started
        • Your first PR
        • How your PR will be reviewed
        • Joining the team!
      • Tips and tricks
    opened by Matthew-Jennings 42
  • Is anonymised dataset test fails with pydicom 1.2.0

    Is anonymised dataset test fails with pydicom 1.2.0

    @Centrus007, not sure if this is worth addressing. Your most recent tests seem to fail with pydicom 1.2.0, but they pass with 1.2.2.

    Not sure what changed between those pydicom versions. If it is truly a test failure for 1.2.0 we might need to pin pydicom to >= 1.2.2...

    ==================================== FAILURES =====================================
    ___________________________ test_is_anonymised_dataset ____________________________
    
        def test_is_anonymised_dataset():
            ds = pydicom.dcmread(dicom_test_filepath)
        
            assert not is_anonymised_dataset(ds)
        
            ds_anon_manual = ds
            ds_anon_manual.PatientName = "Anonymous"
        
            ds_anon_func = anonymise_dataset(ds, delete_private_tags=False,
                                             copy_dataset=True)
        
            # Patient Name should've been the only non-anonymous value. If not,
            # test data has been changed
            for elem_manual, elem_func in zip(ds_anon_manual, ds_anon_func):
    >           assert elem_manual.value == elem_func.value
    E           assert <Sequence, length 1> == <Sequence, length 1>
    E             At index 0 diff: (300a, 0012) Dose Reference Number               IS: "1"\n(300a, 0013) Dose Reference UID                  UI: 1.2.246.352.71.10.53598612033.424364.20190415095139\n(300a, 0014) Dose Reference Structure Type       CS: 'COORDINATES'\n(300a, 0016) Dose Reference Description          LO: 'Verification'\n(300a, 0018) Dose Reference Point Coordinates    DS: ['20.1344', '-101.595', '102']\n(300a, 0020) Dose Reference Type                 CS: 'ORGAN_AT_RISK'\n(3267, 0010) Private Creator                     LO: 'Varian Medical Systems VISION 3267'\n(3267, 1000) Private tag data                    UN: b'Phantom ' != (300a, 0012) Dose Reference Number               IS: "1"\n(300a, 0013) Dose Reference UID                  UI: 1.2.246.352.71.10.53598612033.424364.20190415095139\n(300a, 0014) Dose Reference Structure Type       CS: 'COORDINATES'\n(300a, 0016) Dose Reference Description          LO: 'Verification'\n(300a, 0018) Dose Reference Point Coordinates    DS: ['20.1344', '-101.595', '102']\n(300a, 0020) Dose Reference Type                 CS: 'ORGAN_AT_RISK'\n(3267, 0010) Private Creator                     LO: 'Varian Medical Systems VISION 3267'\n(3267, 1000) Private tag data                    UN: b'Phantom '
    E             Full diff:
    E             <Sequence, length 1>
    
    tests/test_dicom/test_dicom_anonymise.py:39: AssertionError
    
    bug 
    opened by SimonBiggs 36
  • Gamma Index multiprocessing

    Gamma Index multiprocessing

    Hi,

    I am using the gamma index analysis in my project and need to perform analysis for many 3D dose distributions which is time consuming. Do you plan to implement multiprocessing to gamma_shell script?

    best Jan Gajewski

    enhancement 
    opened by jasqs 33
  • Change the default `global_normalisation` from the maximum value of `dose_reference` to `dose_evaluation`

    Change the default `global_normalisation` from the maximum value of `dose_reference` to `dose_evaluation`

    line 92, and line 253, change "dose_reference" to "dose_evaluation" as the default global_normalisation


    Edit by @SimonBiggs

    See https://github.com/pymedphys/pymedphys/pull/1603#issuecomment-1001118014 for reasoning

    opened by guanfada 32
  • Initial code for a Dicom connect module

    Initial code for a Dicom connect module

    This pull request contains the code for a Dicom connect module. I have been using this code for many different purposes. Whats in here so far is the DicomListener class, which can store Dicom files which are sent to it, and also responds to C-Echo.

    @SimonBiggs Maybe a little more code that you had initially hoped for, but I hope that it is understandable as is. I wanted to have something that works. This code works as a Dicom listener.

    Simon, if you'd like to give a once over as far as the structure of the code goes. If you have any feedback there it would be easier to shift things around before getting in too deep.

    Still to do here is some documentation. Later (in future pull requests) I will add the code for Dicom query and retrieve.

    I hope this sort of thing would be useful for others too. I use this all the time from a number of scripts so it would be great to have this code cleaned up and well tested. Once this is looking good to you Simon perhaps we can identify another contributer to give it a review.

    Looking forward to any and all feedback on this!

    opened by pchlap 32
  • Add option to anonymise DICOM UIDs

    Add option to anonymise DICOM UIDs

    Suggested by @sykesjonr

    Need to create valid UIDs with appropriate linking to maintain compatibility with various commercial systems. Probably best mediated through our planned DICOM study object?

    opened by Matthew-Jennings 32
  • Bump setuptools from 65.5.0 to 65.5.1

    Bump setuptools from 65.5.0 to 65.5.1

    Bumps setuptools from 65.5.0 to 65.5.1.

    Changelog

    Sourced from setuptools's changelog.

    v65.5.1

    Misc ^^^^

    • #3638: Drop a test dependency on the mock package, always use :external+python:py:mod:unittest.mock -- by :user:hroncok
    • #3659: Fixed REDoS vector in package_index.
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies python 
    opened by dependabot[bot] 0
  • Bump wheel from 0.37.1 to 0.38.1

    Bump wheel from 0.37.1 to 0.38.1

    Bumps wheel from 0.37.1 to 0.38.1.

    Changelog

    Sourced from wheel's changelog.

    Release Notes

    UNRELEASED

    • Updated vendored packaging to 22.0

    0.38.4 (2022-11-09)

    • Fixed PKG-INFO conversion in bdist_wheel mangling UTF-8 header values in METADATA (PR by Anderson Bravalheri)

    0.38.3 (2022-11-08)

    • Fixed install failure when used with --no-binary, reported on Ubuntu 20.04, by removing setup_requires from setup.cfg

    0.38.2 (2022-11-05)

    • Fixed regression introduced in v0.38.1 which broke parsing of wheel file names with multiple platform tags

    0.38.1 (2022-11-04)

    • Removed install dependency on setuptools
    • The future-proof fix in 0.36.0 for converting PyPy's SOABI into a abi tag was faulty. Fixed so that future changes in the SOABI will not change the tag.

    0.38.0 (2022-10-21)

    • Dropped support for Python < 3.7
    • Updated vendored packaging to 21.3
    • Replaced all uses of distutils with setuptools
    • The handling of license_files (including glob patterns and default values) is now delegated to setuptools>=57.0.0 (#466). The package dependencies were updated to reflect this change.
    • Fixed potential DoS attack via the WHEEL_INFO_RE regular expression
    • Fixed ValueError: ZIP does not support timestamps before 1980 when using SOURCE_DATE_EPOCH=0 or when on-disk timestamps are earlier than 1980-01-01. Such timestamps are now changed to the minimum value before packaging.

    0.37.1 (2021-12-22)

    • Fixed wheel pack duplicating the WHEEL contents when the build number has changed (#415)
    • Fixed parsing of file names containing commas in RECORD (PR by Hood Chatham)

    0.37.0 (2021-08-09)

    • Added official Python 3.10 support
    • Updated vendored packaging library to v20.9

    ... (truncated)

    Commits
    • 6f1608d Created a new release
    • cf8f5ef Moved news item from PR #484 to its proper place
    • 9ec2016 Removed install dependency on setuptools (#483)
    • 747e1f6 Fixed PyPy SOABI parsing (#484)
    • 7627548 [pre-commit.ci] pre-commit autoupdate (#480)
    • 7b9e8e1 Test on Python 3.11 final
    • a04dfef Updated the pypi-publish action
    • 94bb62c Fixed docs not building due to code style changes
    • d635664 Updated the codecov action to the latest version
    • fcb94cd Updated version to match the release
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies python 
    opened by dependabot[bot] 1
  • Pyoxidizer build issue - any workaround to do this manually since reaching this website is blocked in company's laptop

    Pyoxidizer build issue - any workaround to do this manually since reaching this website is blocked in company's laptop

    downloading https://github.com/indygreg/python-build-standalone/releases/download/20221106/cpython-3.10.8%2B20221106-x86_64-pc-windows-msvc-shared-pgo-full.tar.zst error[PYOXIDIZER_BUILD]: error sending request for url (https://github.com/indygreg/python-build-standalone/releases/download/20221106/cpython-3.10.8%2B20221106-x86_64-pc-windows-msvc-shared-pgo-full.tar.zst): error trying to connect: tcp connect error: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. (os error 10060)

    opened by Datarambler 0
  • Bump qs from 6.5.2 to 6.5.3 in /lib/pymedphys/tests/e2e

    Bump qs from 6.5.2 to 6.5.3 in /lib/pymedphys/tests/e2e

    Bumps qs from 6.5.2 to 6.5.3.

    Changelog

    Sourced from qs's changelog.

    6.5.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Fix] utils.merge: avoid a crash with a null target and a truthy non-array source
    • [Fix] correctly parse nested arrays
    • [Fix] stringify: fix a crash with strictNullHandling and a custom filter/serializeDate (#279)
    • [Fix] utils: merge: fix crash when source is a truthy primitive & no options are provided
    • [Fix] when parseArrays is false, properly handle keys ending in []
    • [Fix] fix for an impossible situation: when the formatter is called with a non-string value
    • [Fix] utils.merge: avoid a crash with a null target and an array source
    • [Refactor] utils: reduce observable [[Get]]s
    • [Refactor] use cached Array.isArray
    • [Refactor] stringify: Avoid arr = arr.concat(...), push to the existing instance (#269)
    • [Refactor] parse: only need to reassign the var once
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] Clean up license text so it’s properly detected as BSD-3-Clause
    • [Docs] Clarify the need for "arrayLimit" option
    • [meta] fix README.md (#399)
    • [meta] add FUNDING.yml
    • [actions] backport actions from main
    • [Tests] always use String(x) over x.toString()
    • [Tests] remove nonexistent tape option
    • [Dev Deps] backport from main
    Commits
    • 298bfa5 v6.5.3
    • ed0f5dc [Fix] parse: ignore __proto__ keys (#428)
    • 691e739 [Robustness] stringify: avoid relying on a global undefined (#427)
    • 1072d57 [readme] remove travis badge; add github actions/codecov badges; update URLs
    • 12ac1c4 [meta] fix README.md (#399)
    • 0338716 [actions] backport actions from main
    • 5639c20 Clean up license text so it’s properly detected as BSD-3-Clause
    • 51b8a0b add FUNDING.yml
    • 45f6759 [Fix] fix for an impossible situation: when the formatter is called with a no...
    • f814a7f [Dev Deps] backport from main
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies javascript 
    opened by dependabot[bot] 0
  • Bump certifi from 2022.9.24 to 2022.12.7

    Bump certifi from 2022.9.24 to 2022.12.7

    Bumps certifi from 2022.9.24 to 2022.12.7.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies python 
    opened by dependabot[bot] 0
Releases(v0.39.3)
  • v0.39.3(Oct 11, 2022)

  • v0.39.2(Oct 6, 2022)

    Bug Fixes

    • Utilise pylibjpeg-libjpeg 1.3.2 or greater (Current libjpeg version for Apple M1 compatibility)
    • pymedphys dicom anonymise now produces DICOM conformant patient names in the anonymised result.
    Source code(tar.gz)
    Source code(zip)
  • v0.39.1(Oct 6, 2022)

  • v0.39.0(Sep 29, 2022)

    New features and enhancements

    • The Gamma tool now utilises the logging module. The quiet parameter for pymedphys.gamma is deprecated but its use is non-breaking (for now).
    • The pymedphys.electronfactors has been added back in to the public API in Pull Request.

    Non-API changing enhancements

    • The dev extra has been reduced and an additional extra all has been added: Pull Request
    Source code(tar.gz)
    Source code(zip)
  • v0.38.0(Feb 11, 2022)

    News around this release

    • Phillip Chlap has joined as a pymedphys Maintainer
    • Thanks to Cedric for reporting and fixing DICOM coordinates bug: Discourse
    • Privacy related bug within the experimental components of pymedphys (not stable) has been fixed. See bug fix notes.

    Bug Fixes

    • Pseudonymise was susceptible to brute-force reversal, mitigated in Pull Request
    • DICOM Coordinates
    • Pinnacle Export Tool
      • Write DICOM files to be more compatible with other software Pull Request
    • Daily Winston-lutz

    New features and enhancements

    • Pinnacle Export Tool
      • A new CLI option is provided to append the patient MRN to the output path for convenience. Thanks crewso for submitting this Pull Request
    Source code(tar.gz)
    Source code(zip)
  • v0.37.1(May 18, 2021)

    Bug fixes

    • Make it so that Mephysto files that have non-unicode characters can still be opened.
    • Varying penumbra and ball bearing diameter within the Monthly WLutz application now accepts floating point numbers as well as numbers smaller than the default.
    • Fixed a bug where Delivery.from_monaco wouldn't be able to load beams where the stop angle of one beam was +180 and the start angle of the subsequent beam was -180 (or visa-versa). The conversion from IEC to bipolar is now handled on a "per-beam" basis. This bug affected the MetersetMap application.

    Non-API changing enhancements

    • The daily WLutz application can now have its bb size configured.
    • Site can now be passed as a URL parameter to the daily WLutz application.
    • Improved error messaging around the configuration of the iView machine alias.
    Source code(tar.gz)
    Source code(zip)
  • v0.37.0(May 6, 2021)

    News around this release

    • Jake Rembish has been undergoing his PhD with the output of his work being contributed to PyMedPhys. This release coincides with the culmination of Jake's PhD and this version will be the one referenced within his dissertation. It has been brilliant to see both Jake and his project grow to be what it is today. Thank you Jake 😊.

    Breaking changes

    • The configuration for the TRF CLI now utilises the centralised config.toml file instead of the prior CSV files.

    New features and enhancements

    • A range of application have been added to and improved on within the PyMedPhys GUI.
      • A Daily WLutz application was added which utilises the air cavity within an iso-cube, combined with morning run-up beams (as arcs) to record the beam position at every gantry angle for each photon beam each morning.
      • A range of configuration improvements, making more applications more widely able to be utilised. Of particular note are Jake's transfer check and weekly check applications which were written as a part of his PhD.
      • A QCL investigator tool, allowing one to produce plots and break downs of numbers of QCLs broken down either by QCL type, or the user who completed them.
      • An extend ct application was added providing the means to duplicate slices superiorly and inferiorly.
      • An application for the viewing of back-end iView jpg images.
      • An application for tweaking the WLutz algorithm options from iView back-end jpg images.
      • A range of fixes and improvements within the WLutz Arc and the MetersetMap applications.
    • The docs are now distributed with the PyMedPhys package. These are accessible by opening http://localhost:8501/docs/index.html after running pymedphys gui. In the future it is intended to make this link more accessible.
    • A range of error messaging has been improved. Of particular benefit to new users is the error message that occurs when a dependency is missing.
    • The ball-bearing finding component of the WLutz algorithm was tweaked to be able to also support the finding of air-cavities within an iso-cube.
    • The testing suite around Mosaiq was built upon and extended across the breadth of PyMedPhys.
    • Fixed a bug which was making pymedphys.Delivery.from_mosaiq non functional.
    • Fixed a bug where some TRF files where not able to be decoded. Thank you LipTeck for the bug report.
    • The pymedphys.trf.identify interface was moved out of beta. See the documentation for this newly stable API over at https://docs.pymedphys.com/lib/ref/trf.html.
    • Improved the robustness of the internal extend ct routines.
    • [Contributor facing only] created pymedphys dev mssql which boots up a docker image of the Developer edition of Microsoft SQL. This is for utilisation by the Mosaiq testing suite.
    • [Contributor facing only] made pymedphys dev tests --cypress automatically include the options -v and -s for displaying the cypress printouts during testing as well as --reruns 5 so that the test automatically reruns on failure in alignment with the CI procedure.
    Source code(tar.gz)
    Source code(zip)
  • v0.36.1(Mar 19, 2021)

    New features and enhancements

    • Added the icom installation option which can be run by calling pip install pymedphys[icom]==0.36.1. This will install only the dependencies needed for the iCom listener.
    Source code(tar.gz)
    Source code(zip)
  • v0.36.0(Mar 19, 2021)

    News around this release

    • We have a new team member, Derek Lane he has undergone swathes of work around improving the long term maintenance of the Mosaiq SQL code. Thank you Derek! 🎉 🎈 🥳.
    • Matt Jennings has rejoined the team, picking up his previous hat of Maintainer, great to have you back Matt 😊.

    Breaking changes

    • The modules pymedphys.electronfactors and pymedphys.wlutz were removed from the public API.
      • There did not appear to be any usage of these modules outside of Cancer Care Associates.
      • The electron factors module can be re-exposed upon request.
      • The Winston Lutz module is undergoing a significant re-work and will be re-exposed in its new form once complete.
    • There have been a range of changes to the previously undocumented Mosaiq database connection and execution API.
    • [Contributor facing only] replaced pymedphys dev tests --pylint with pymedphys dev lint.

    New features and enhancements

    • Added CLI argument for setting the hostname on the DICOM listen server. For example pymedphys dicom listen 7779 --host 127.0.0.1.
    • Added DICOM send functionality to DICOM connect module and made it available on the CLI. For example pymedphys dicom send 127.0.0.1 7779 path\to\dicom\*.dcm
    • A range of application changes and improvements. The PyMedPhys app can be accessed by running pymedphys gui.
    • [Streamlit users only] A CLI command pymedphys streamlit run was added to facilitate utilising the custom PyMedPhys patches on the streamlit server for arbitrary streamlit apps. See https://github.com/pymedphys/pymedphys/issues/1422.
    • [Contributor facing only] Added the following contributor CLI tools/options:
      • pymedphys dev tests --mosaiqdb, to load up the tests that depend on having a Microsoft SQL server running. Thanks to Derek Lane for all of his work building the Mosaiq CI workflow and the first set of Mosaiq tests.
      • pymedphys dev doctests, run doctests.
      • pymedphys dev imports, verify optional import logic by creating a clean Python install and attempting to import all modules.
      • pymedphys dev lint, run pylint.
      • pymedphys dev cypress, load up Cypress for interactively writing and running the end-to-end tests.

    Misc changes

    • Significant work was undergone to improve the documentation layout. Thanks to Matt Jennings for all his work here.
    • How Mosaiq username and passwords are saved has been updated. This will result in these credentials being requested once more.
    Source code(tar.gz)
    Source code(zip)
  • v0.36.0-dev0(Dec 16, 2020)

  • v0.35.0(Dec 14, 2020)

    News around this release

    • PyMedPhys now has a Discourse group at https://pymedphys.discourse.group. The goal for this group is to build a community where we can discuss and collaborate around all things related to PyMedPhys.

    Breaking changes

    • Developer facing only: The --live parameter within pymedphys dev docs has been removed.

    New features and enhancements

    • pymedphys dicom listen stores incoming DICOM objects in a directory hierarchy: PatientID/Study Instance UID/Series Instance UID aligning with the DICOM Q/R hierarchy, and more suitable for use with tools like dicompyler and OnkoDICOM. See PR #1208 for more details.
    This `pymedphys dicom listen` adjustment changes where a 3rd party or in-house
    program would expect to find the DICOM data on the file system compared to the
    previous release.
    
    Please raise an issue on GitHub
    <https://github.com/pymedphys/pymedphys/issues/new> if you believe changes like
    this in the future should be considered a breaking change.
    
    • Documentation now uses the new Jupyter Book tool from the Executable Book Project. Among other things this has enabled:
      • Live running of notebook documentation using Thebe
      • Discourse commenting now available directly within the hosted documentation
      • The ability to utilise the expanded MyST Documentation formatting.
    • Increased docstring coverage of public functions
    • Installation on MacOS (Intel) has been simplified and is now the same as for other platforms, thanks to @termim who has taken on the mantle of maintaining pymssql. See PR pymssql#677 for more details.
    • Streamlit development now supports reloading during development across the whole PyMedPhys library. See PR #1202 for more details.
    • A pre-release binary has been built and CI infrastructure around it has begun being built. Watch this space for a future release where it will be officially distributed. See PR #1192 for more details.
    • Create a __main__.py so that the PyMedPhys CLI can be called using python -m pymedphys.
      • This is to support running the GUI and the tests within the binary.
    • Created a requirements-user.txt, this will allow users to install PyMedPhys from the repo while using the exact dependencies that are being tested within the CI. See PR #1266 for more details.
    • pymedphys dev propagate had the --copies and --pyproject flags added. This allows for subsections of propagate to be undergone instead of the whole procedure.

    Bug fixes

    • CLI initialisation was delayed by unused tensorflow imports
    • Pseudonymisation of Decimal String (e.g. Patient Weight) was failing. See #1244 for more details.
    • Pseudonymisation of Date, Time or DateTime elements with embedded UTC offsets would fail.
    • Improved Mosaiq username and password login. Thank you @nickmenzies for reporting. See PR #1199 for more details.
    • pymedphys gui will use the Python used to run the CLI to boot streamlit as opposed to the streamlit able to be found on the user's PATH. See pymedphys/_gui.py for more details. This is to support booting the GUI within the binary.
    • dateutil dependency was removed for compatibility reasons with Streamlit's cache. This tool was replaced with an equivalent tool within pandas. See pymedphys/_trf/manage/identify.py for more details.
    • A range of fixes for the testing infrastructure for the case where the pymedphys CLI isn't on the user's path.
      • This was to support testing within the binary infrastructure.

    Library structure changes

    • All GUI tools that are labelled experimental are now appropriately located within the experimental part of the library.
    Source code(tar.gz)
    Source code(zip)
    wheels-win_amd64-py36.zip(160.22 MB)
    wheels-win_amd64-py37.zip(160.75 MB)
    wheels-win_amd64-py38.zip(160.77 MB)
  • v0.35.0-dev2(Dec 6, 2020)

  • v0.35.0-dev1(Nov 15, 2020)

  • v0.34.0(Nov 13, 2020)

    News around this release

    • 🚀 Stuart Swerdloff (@sjswerdloff) has agreed to come on board as a maintainer of PyMedPhys. Thank you Stuart! You have been a massive help and encouragement.
    • Created an online PyMedPhys GUI. It is accessible from https://app.pymedphys.com. This is in its early stages and most parts of the online GUI are not optimised for use in this fashion.
      • Of note, its main purpose is to demonstrate the GUI functionality. If you wish to begin using this GUI in your centre install PyMedPhys on your local machine and then start it by calling pymedphys gui within a terminal/command prompt.
      • The online demo GUI should not have sensitive information submitted to it.
    • @matthewdeancooper uploaded his Masters thesis on deep learning auto-segmentation to the docs.
    • PyMedPhys was featured in a talk at the ACPSEM 2020 Summer School. Both the video and slides are available online.

    "Stable" API changes

    (Won't truly be stable until after a 1.0.0 release)

    Breaking changes

    • The parameter fraction_number within pymedphys.Delivery.from_dicom and pymedphys.Delivery.to_dicom has been changed to fraction_group_number.
    • The name of the first argument to pymedphys.Delivery.from_dicom has been changed from dicom_dataset to rtplan. It now also accepts either a pydicom.Dataset or a filepath.
    • A range of files utilised by pymedphys.data_path and related functions that contained the words "mudensity", "mu-density", or "mu_density" have been replaced with "metersetmap".
    • The exceptions that pymedphys.Delivery.from_mosaiq raises when either no entry in Mosaiq is found (NoMosaiqEntries) or multiple entries are found (MultipleMosaiqEntries) now both inherit from ValueError instead of the base Exception class.

    Deprecations

    • All instances of mudensity have been replaced with metersetmap. The mudensity API is still currently available, but it will be removed in a future release.
    • pymedphys.Delivery.from_logfile has been renamed as pymedphys.Delivery.from_trf. The previous name is still temporarily available but it will be removed in a future release.

    New features

    • Added CLI pymedphys dicom listen #1161. This begins a DICOM listener which will store the DICOM files sent to it to disk. It accepts the arguments --port, --aetitle, and --storage_directory. Thanks @pchlap!

    Bug fixes

    • Sometimes a range of DICOM API calls would require the downloading of a baseline DICOM dictionary. This is now distributed with the library.

    GUI changes

    Logistics changes

    • pymedphys gui now boots up a multi application index. This index breaks applications up into five categories, mature, maturing, raw, beta, and experimental.

    Pseudonymise

    • A new pseudonymise application has been created. This allows users to drag and drop DICOM files into the GUI and then download the resulting DICOM file in its pseudonymised form. Thanks @sjswerdloff!

    MetersetMap

    New Features
    • The MetersetMap comparison application (which used to be MU density) is now able to work with a bare bones configuration file which can be used by just dragging and dropping TRF and DICOM files for comparison. See #1117 for details of the configuration file needed.
    • Path configuration now supports expansion of ~ to the users home directory.
    Bug fixes
    • In some cases a patient having a middle name would cause the DICOM file upload method to crash. Thanks @mchamberland for reporting in #1137 and thanks @sjswerdloff for the prompt fix in #1144!

    Experimental applications

    • A new "anonymise monaco" application has been exposed. This allows the back-end Monaco filesystem to be anonymised in such a way that Monaco can still open and work with the contents.
    • A new "dashboard" application has been exposed. This connects to multiple Mosaiq sites and displays the QCLs across each site.
    • A new "electrons" application has been exposed. This reads Monaco back-end files, extract the electron insert shape and then predicts the corresponding insert output factor.
    • A new "iviewdb" application has been exposed. This allows for exploration of the iView database.
    • Work has begun on a new Winston Lutz Arc GUI.

    Configuration changes

    New keys

    • ~/.pymedphys/config.toml should now include a version = 1 entry. This is to support undergoing breaking changes within config.toml but allowing PyMedPhys to still read in old configuration files without issue.
    • For use within the up-coming Winston-Lutz Arc GUI a new key site.export-directories.iviewdb has been created.

    Beta API changes

    • Nil

    Experimental API changes

    Breaking changes

    • Removed pymedphys experimental gui.

    New Features

    • Within pymedphys.experimental.pseudonymisation both pseudonymise and is_valid_strategy_for_keywords were added. pseudonymise provides a convenient simple API for pseudonymisation. See the API docs for more information. Credit to @sjswerdloff for all his work here.

    Developer facing API changes

    • The pymedphys library directory has moved to lib/pymedphys. After this move you will need to rerun poetry install -E dev
    • The development branch of pymedphys has moved from master to main
    • Documentation is now stored within the library, moving from docs to lib/pymedphys/docs
    • Docs can now be built, viewed, and updated with hot-reloading by running poetry run pymedphys dev docs --live.
    • The output directory for the docs building can now be controlled by passing an --output flag to pymedphys dev docs.
    • A new CLI utility that propagates a range of files that depend upon each other files within the repo are "propagated" by calling poetry run pymedphys dev propagate. The files created/updated by this command are lib/pymedphys/_version.py, requirements.txt and requirements-dev.txt, lib/pymedphys/.pylintrc, lib/pymedphys/docs/README.rst, lib/pymedphys/docs/CHANGELOG.md, and the 'extras' field within pyproject.toml.
    • pymedphys dev tests includes simplified flags. --run-only-slow can be undergone with --slow, --run-only-yarn with --cypress, --run-only-pydicom with --pydicom, and --run-only-pylinac with --pylinac.
    • Within cypress end to end testing the custom cy.start command now has a parameter app which refers to the URL app key of the application to be tested http://localhost:8501/?app=${app}.
    Source code(tar.gz)
    Source code(zip)
  • v0.33.0(Sep 8, 2020)

    "Stable" API changes

    (Won't truly be stable until after a 1.0.0 release)

    Installation changes

    • To install pymedphys with all of its user dependencies now the following needs to be run:
    pip install pymedphys[user]
    
    • When pip install pymedphys is called, PyMedPhys will now be installed with minimal/no dependencies.

    Beta API changes

    Nil

    Experimental API changes

    Breaking changes

    • Removed a range of unmaintained experimental package APIs; film, collimation, sinogram, and Profile. The underlying code has not been removed, but they are no longer exposed through the APIs.

    Bug fixes

    • Made it so that import pymedphys.experimental does not raise an ImportError when an optional dependency has not been installed.
    • Fixed a bug where pseudonymisation wouldn't work when in cases of identifying sequences.

    New Features

    Internal Changes

    Source code(tar.gz)
    Source code(zip)
  • v0.32.0(Aug 18, 2020)

    "Stable" API changes

    (Won't truly be stable until after a 1.0.0 release)

    Bug fixes

    • Fixed bug in the PyMedPhys trf decoding logic where leaf pairs 77, 78, 79, and 80 on the Y2 bank were decoded into having the wrong sign.
      • See issue #968 and pull request #970 for more details.

    Breaking changes

    • config.toml has undergone a few breaking changes.
      • See the example for a working config file.
      • See below for a comparison highlighting the key differences.
    # Previous version
    [[site]]
    name = "rccc"
    escan_directory = '\\pdc\Shared\Scanned Documents\RT\PhysChecks\Logfile PDFs'
    
        [[site.linac]]
        name = "2619"
        icom_live_directory = '\\rccc-physicssvr\iComLogFiles\live\192.168.100.200'
    
    
    # New version
    [[site]]
    name = "rccc"
    
        [site.export-directories]
        escan = '\\pdc\Shared\Scanned Documents\RT\PhysChecks\Logfile PDFs'
        anonymised_monaco = 'S:\DataExchange\anonymised-monaco'
        icom_live = '\\rccc-physicssvr\iComLogFiles\live'
    
        [[site.linac]]
        name = "2619"
        ip = '192.168.100.200'
    

    New Features

    • Two new optional keywords were added to pymedphys.dicom.anonymise. These are replacement_strategy and identifying_keywords. This was designed to support alternative anonymisation methods. The API to the anonymise function is being flagged for a rework and simplification for which a breaking change is likely to occur in the near future.
    • Added ability to configure logging via config.toml.

    Data file changes

    Refers to the data files accessible via pymedphys.data_path, pymedphys.zip_data_paths, and pymedphys.zenodo_data_paths.

    • The data file pinnacle_test_data_no_image.zip was removed and its contents were moved into pinnacle_test_data.zip.
    • Data files treatment-record-anonymisation.zip, negative-mu-density.trf, and trf-references-and-baselines.zip were added.

    Beta API changes

    Nil

    Experimental API changes

    New Features

    • Added pseudonymisation as an experimental extension of anonymise.

      • This API is undergoing refinement, however in its current form it is accessible via pymedphys.experimental.pseudonymisation.pseudonymisation_dispatch and pymedphys.experimental.pseudonymisation.get_default_pseudonymisation_keywords. These are designed to be passed to the new keywords replacement_strategy and identifying_keywords within pymedphys.dicom.anonymise.
      • The pseudonymisation strategy uses SHA3_256 hashing for text and UIDs, date shifting for dates, and jittering for Age. The intent is to enable sets of data that are correlated to remain correlated, and to prevent uncorrelated patient/study/series from clashing.
    • Added experimental pseudonymisation CLI. Callable via pymedphys experimental dicom anonymise --pseudo path/to/dicom.dcm

    • Added pymedphys experimental gui. This is a testing ground for new GUIs that are intended to appear within pymedphys gui in the future. The GUIs exposed under this experimental scope are minimally tested.

      • At this point in time, the new GUIs include a GUI index, an electron insert factor prediction tool, and a Monaco anonymisation tool.

    Bug Fixes

    • Pinnacle Export Tool now allows for the trial to be set using the CLI. See issue #973 and pull request #995 for more details.
    • Fixed bug where the dose grid in the Pinnacle Export Tool was only correct when patients were in HFS. See #929 for more details.
    Source code(tar.gz)
    Source code(zip)
  • v0.31.0(Jul 11, 2020)

    "Stable" API changes

    (Won't truly be stable until after a 1.0.0 release)

    Critical bug fixes

    • Fixed bug where pymedphys dicom anonymise and pymedphys.dicom.anonymise would not anonymise nested tags. Thanks @sjswerdloff for finding and fixing #920.

    Breaking changes

    • Removed the --publish option from CLI pymedphys dev docs.
    • Moved pymedphys logfile orchestration to pymedphys trf orchestrate

    New features

    • pymedphys.zenodo_data_paths has a new optional parameter filenames that can be used to only download some files.
    • pymedphys.data_path has a new optional parameter hash_filepath which can be used to provide a custom hash record.
    • Added usage warning to the MU Density GUI.

    Deprecations

    • pymedphys.read_trf has been replaced with pymedphys.trf.read. The old API is still available, but will be removed in a future version.

    Bug fixes

    • Cache data downloads now also retry when a ConnectionResetError occurs.

    Beta API changes

    New features

    • A new pymedphys.beta module created. This is intended to allow a section of the API to be exposed and iterated on but having breaking changes not induce a major version bump (when PyMedPhys goes to v1.0.0+)
    • Added pymedphys.beta.trf.identify to allow the usage of Mosaiq to identify a trf logfile.

    Experimental API changes

    Breaking changes

    • Instances of labs has been changed to experimental. This affects all imports from the labs and the CLI usage.

    Bug fixes

    • Fixed issue with Pinnacle Export Tool crashing when an image is missing from the archive.
    Source code(tar.gz)
    Source code(zip)
  • v0.30.0(Jun 13, 2020)

    Breaking changes

    • Removed the proof of concept pymedphys bundle CLI as well all of its associated code.
    • Removed a range of unused files from the pymedphys.data_path API.
    • The previous install options pip install pymedphys[pytest] and pip install pymedphys[pylint] have been removed and replaced with pip install pymedphys[tests].

    New Features

    • Added a new toolbox for retrieving PTW Quickcheck measurement data and write it to a csv file. pymedphys labs quickcheck to-csv your.quickcheck.ip path/to/output.csv
    • Added pymedphys dev tests to the CLI.
      • Moved all of tests into the pymedphys repo itself. Now the automated testing suite is able to be run from a pypi install.
      • This CLI has options such as --run-only-pydicom, --run-only-slow, and --run-only-pylinac so that upstream tools can run tests on this downstream project.
      • These extra options are directly passed through to pytest. To achieve this, made the pymedphys CLI be able to optionally handle arbitrary commands.
    • Made the Zenodo download tool retry up to four times should the download fail.
    • Added DICOM helpers functionality and updated the Mosaiq helpers as a part of the UTHSCSA TPS/OIS comparison project. Not yet exposed as part of the API. See _mosaiq/helpers.py#L353-L482
    • Added more debugging strings to the iCOM CLI. See these outputs by running pymedphys --debug icom listen external.nss.ip.address your/output/directory
      • These were added to support remotely debugging the iCOM listen software. To see the conversation around debugging that tool see the PyMedPhys forum discussion
    • Format of MU in logging display now rounded to one decimal.

    Dependency changes

    • Now depending on pylibjpeg-libjpeg in order to decode lossless-jpeg files.
    • m2r is no longer used to build the docs.
    • No longer using tox for tests.

    Bug fixes

    • Fixed an issue where the iCOM listener could not handle Machine IDs that were not entirely an integer.
    • Fixed a case where on some Windows environments pymedphys dev docs would not run.
    • Fixed a case where on some Windows environments pymedphys gui would not run.
    • Fixed issue where the pymedphys logfile orchestration CLI would not be able to create an index.json, or a range of the needed directories on its first run.

    Documentation updates

    • Fixed an issue where the displayed CSV files for configuring pymedphys logfile orchestration would actually cause an error due to excess spaces used for display purposes.

    Development changes

    • Removed any file that was larger than 300 kB from the git history bring down clone times to a manageable state.
      • The pre-commit tool now does not allow commits greater than 300 kB.
      • All testing files that were larger than 300 kB have been moved to Zenodo.
    • All tests have been moved from /tests into /pymedphys/tests, running these tests can now be undergone by calling pymedphys dev tests
      • No longer using tox.
    Source code(tar.gz)
    Source code(zip)
  • v0.29.1(May 27, 2020)

  • v0.29.0(May 27, 2020)

  • v0.28.0(May 26, 2020)

    Overview

    This release primarily focused on changes regarding the iCOM listener and the PyMedPhys GUI that utilises these iCOM records.

    Breaking changes

    • Removed the pymedphys icom archive CLI command, this archiving is now built directly into the listener itself.

    New Features

    • The pymedphys icom listener CLI command now will collect the icom stream into beam delivery batches and index them by patient name. This functionality used to be undergone within the pymedphys icom archive CLI, but this functionality has now been merged into the listener. listener.py#L79
    • Should an error occur within pymedphys icom listener CLI it will now pause for 15 minutes and then reattempt a connection.
    • Add in extra sanity checks within the iCOM patient indexing tooling.
    • Added a --debug and --verbose flag to the PyMedPhys CLI which allows users to set the logging level. These logging levels are currently only utilised within the pymedphys icom listen CLI. cli/main.py#L51-L70

    Bug fixes

    • Reduced the buffer size of the iCOM listener. listener.py#L9
    • If either the listener is turned off and then on again, or it is interrupted the next time an iCOM stream socket is opened the Linac appears to send a larger batch containing prior irradiations. The listener code was adjusted to handle these extra bursts. listener.py#L57-L83
    • Made PyMedPhys GUI skip name formatting attempt if the original patient name format was not as expected. mudensity-compare.py#L733-L738
    Source code(tar.gz)
    Source code(zip)
  • v0.27.0(May 15, 2020)

    New Features

    • Added an optional --structures flag to pymedphys dicom merge-contours. This allows you to only compute the merge for those structures named.
    Source code(tar.gz)
    Source code(zip)
  • v0.26.0(May 15, 2020)

    New Features

    Source code(tar.gz)
    Source code(zip)
  • v0.25.1(Apr 30, 2020)

    Dependency Changes

    • Now included psutil as an optional dependency.

    Quality of life improvements

    Development changes

    Source code(tar.gz)
    Source code(zip)
  • v0.25.0(Apr 28, 2020)

    New Features

    • Created the command line tool pymedphys gui which boots the GUI for PyMedPhys within your browser. GUI at this stage is quite minimal.
    • Created a tool to handle a PyMedPhys config file, by default stored within ~/.pymedphys/.config.toml. That config file can have a redirect field to allow configuration to be stored in a different location such as within a git repo, or a network drive.
    • pymedphys.zip_data_paths now has a new optional parameter extract_directory. When this parameter is passed the contents of the zip downloaded zip data will be extracted to the provided directory. For example now the following is possible:
    import pathlib
    import pymedphys
    
    CWD = pathlib.Path.cwd()
    pymedphys.zip_data_paths("mu-density-gui-e2e-data.zip", extract_directory=CWD)
    
    • pymedphys.Delivery.from_dicom() now supports step and shoot and 3DCRT DICOM plan files.
    • Work on pymedphys.Delivery.from_monaco() was undergone with an attempt to support step and shoot plans. This work was preliminary.
    • Created a utility to pretty print patient names
    • Added ground work for e2e testing of pymedphys gui with the cypress tool.
    Source code(tar.gz)
    Source code(zip)
  • v0.24.3(Apr 23, 2020)

  • v0.24.2(Apr 23, 2020)

  • v0.24.1(Apr 22, 2020)

    Bug Fixes

    • Include matplotlib within streamlit bundle. Streamlit requires this but has not labeled it as a dependency.
    • Call yarn from os.system, for some reason on Windows subprocess.check_call could not find yarn on the path, although on Linux this worked fine.
    Source code(tar.gz)
    Source code(zip)
    LibreApp.Setup.exe(118.74 MB)
  • v0.24.0(Apr 22, 2020)

    Breaking Changes

    • If pymedphys.mosaiq.connect is passed a list of length one, it will now return a cursor within a list of length 1 instead of just returning a cursor by itself.

    New Features

    • Added a pymedphys bundle cli function which creates an electron streamlit installation bundle.
    • Added the 'all' fractions option to Delivery.from_dicom which can be used as pymedphys.Delivery.from_dicom(dicom_file, fraction_number='all')
    • Made the iCOM patient archiving only save the data if MU was delivered.
    • Added wlutz mock image generation functions
    • Handle more Monaco tel.1 cases within Delivery.from_monaco
    • get_patient_name added to pymedphys._mosaiq.helpers

    Algorithm Adjustments

    • Wlutz bb finding cost function adjusted
      • Note, wlutz algorithm still not ready for the prime time
    Source code(tar.gz)
    Source code(zip)
Source-o-grapher is a tool built with the aim to investigate software resilience aspects of Open Source Software (OSS) projects.

Source-o-grapher is a tool built with the aim to investigate software resilience aspects of Open Source Software (OSS) projects.

Aristotle University 5 Jun 28, 2022
Open-source library for analyzing the results produced by ABINIT

Package Continuous Integration Documentation About AbiPy is a python library to analyze the results produced by Abinit, an open-source program for the

ABINIT 91 Dec 9, 2022
The FLARE team's open-source library to disassemble Common Intermediate Language (CIL) instructions.

dncil is a Common Intermediate Language (CIL) disassembly library written in Python that supports parsing the header, instructions, and exception hand

MANDIANT 95 Jan 8, 2023
Scripts used in the RayStation medical radiation dosimetry treatment planning system

Med Phys Scripts These are scripts that I, the medical physics assistant at Cookeville Regional Medical Center, wrote for use in our radiation therapy

Kaley White 2 Oct 19, 2022
Python Projects is an Open Source to enhance your python skills

Welcome! ???? Python Project is Open Source to enhance your python skills. You're free to contribute. ?? You just need to give us your scripts written

Tristán 6 Nov 28, 2022
🏆 A ranked list of awesome Python open-source libraries and tools. Updated weekly.

Best-of Python ?? A ranked list of awesome Python open-source libraries & tools. Updated weekly. This curated list contains 230 awesome open-source pr

Machine Learning Tooling 2.7k Jan 3, 2023
sawa (ꦱꦮ) is an open source programming language, an interpreter to be precise, where you can write python code using javanese character.

ꦱꦮ sawa (ꦱꦮ) is an open source programming language, an interpreter to be precise, where you can write python code using javanese character. sawa iku

Rony Lantip 307 Jan 7, 2023
An open-source Python project series where beginners can contribute and practice coding.

Python Mini Projects A collection of easy Python small projects to help you improve your programming skills. Table Of Contents Aim Of The Project Cont

Leah Nguyen 491 Jan 4, 2023
Bionic is Python Framework for crafting beautiful, fast user experiences for web and is free and open source.

Bionic is Python Framework for crafting beautiful, fast user experiences for web and is free and open source. Getting Started This is an example of ho

null 14 Apr 10, 2022
Fisherman is a free open source fishing bot written in python.

Fisherman is a free open source fishing bot written in python.

Pure | Cody 33 Jan 29, 2022
Open source book about making Python packages.

Python packages Tomas Beuzen & Tiffany Timbers Python packages are a core element of the Python programming language and are how you create organized,

Python Packages 169 Jan 6, 2023
Hashcrack - A non-object oriented open source, Software for Windows/Linux made in Python 3

Multi Force This project is a non-object oriented open source, Software for Wind

Radiationbolt 3 Jan 2, 2023
A free and open-source chess improvement app that combines the power of Lichess and Anki.

A free and open-source chess improvement app that combines the power of Lichess and Anki. Chessli Project Activity & Issue Tracking PyPI Build & Healt

null 93 Nov 23, 2022
TickerRain is an open-source web app that stores and analysis Reddit posts in a transparent and semi-interactive manner.

TickerRain is an open-source web app that stores and analysis Reddit posts in a transparent and semi-interactive manner

GonVas 180 Oct 8, 2022
Open source home automation that puts local control and privacy first

Home Assistant Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiast

Home Assistant 57k Jan 2, 2023
Nimbus - Open Source Cloud Computing Software - 100% Apache2 licensed

⚠️ The Nimbus infrastructure project is no longer under development. ⚠️ For more information, please read the news announcement. If you are interested

Nimbus 194 Jun 30, 2022
World's best free and open source ERP.

World's best free and open source ERP.

Frappe 12.5k Jan 7, 2023
An open source server for Super Mario Bros. 35

SMB35 A custom server for Super Mario Bros. 35 This server is highly experimental. Do not expect it to work without flaws.

Yannik Marchand 162 Dec 7, 2022
Backend/API for the Mumble.dev, an open source social media application.

Welcome to the Mumble Api Repository Getting Started If you are trying to use this project for the first time, you can get up and running by following

Dennis Ivy 189 Dec 27, 2022