Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add SlicerNeuropacs Extension #2096

Merged
merged 1 commit into from
Dec 2, 2024
Merged

Add SlicerNeuropacs Extension #2096

merged 1 commit into from
Dec 2, 2024

Conversation

neuropacman
Copy link
Contributor

@neuropacman neuropacman commented Oct 18, 2024

New extension

  • Extension has a reasonable name (not too general, not too narrow, suggests what the extension is for)
  • Repository name is Slicer+ExtensionName
  • Repository is associated with 3d-slicer-extension GitHub topic so that it is listed here. To edit topics, click the settings icon in the right side of "About" section header and enter 3d-slicer-extension in "Topics" and click "Save changes". To learn more about topics, read https://help.github.com/en/articles/about-topics
  • Extension description summarizes in 1-2 sentences what the extension is usable (should be understandable for non-experts)
  • Any known related patents must be mentioned in the extension description.
  • LICENSE.txt is present in the repository root. MIT (https://choosealicense.com/licenses/mit/) or Apache (https://choosealicense.com/licenses/apache-2.0/) license is recommended. If source code license is more restrictive for users than MIT, BSD, Apache, or 3D Slicer license then the name of the used license must be mentioned in the extension description.
  • Extension URL and revision (scmurl, scmrevision) is correct, consider using a branch name (main, release, ...) instead of a specific git hash to avoid re-submitting pull request whenever the extension is updated
  • Extension icon URL is correct (do not use the icon's webpage but the raw data download URL that you get from the download button - it should look something like this: https://raw.githubusercontent.com/user/repo/main/SomeIcon.png)
  • Screenshot URLs (screenshoturls) are correct, contains at least one
  • Homepage URL points to valid webpage containing the following:
    • Extension name
    • Short description: 1-2 sentences, which summarizes what the extension is usable for
    • At least one nice, informative image, that illustrates what the extension can do. It may be a screenshot.
    • Description of contained modules: at one sentence for each module
    • Tutorial: step-by-step description of at least the most typical use case, include a few screenshots, provide download links to sample input data set
    • Publication: link to publication and/or to PubMed reference (if available)
    • License: We suggest you use a permissive license that includes patent and contribution clauses. This will help protect developers and ensure the code remains freely available. We suggest you use the Slicer License or the Apache 2.0. Always mention in your README file the license you have chosen. If you choose a different license, explain why to the extension maintainers. Depending on the license we may not be able to host your work. Read here to learn more about licenses.
    • Content of submitted json file is consistent with the top-level CMakeLists.txt file in the repository (dependencies, etc. are the same)
  • Hide unused features in the repository to reduce noise/irrelevant information:
    • Click Settings and in repository settings uncheck Wiki, Projects, and Discussions (if they are currently not used)
    • Click the settings icon next to About in the top-right corner of the repository main page and uncheck Releases and Packages (if they are currently not used)
  1. My scripted module has a pip dependency "neuropacs". I install neuropacs in the init method if it does not already exist. Please let me know if this needs to be done another way.

  2. To keep track of existing records, I write to a file {slicer.app.temporaryPath}/neuropacs_order_map.json. Just want to make sure this is okay for production environment.

@neuropacman neuropacman changed the title Add "SlicerNeuropacs.json" extension catalog entry file Add SlicerNeuropacs Extension Oct 18, 2024
@pieper
Copy link
Member

pieper commented Oct 19, 2024

Generally this looks good to me.

My scripted module has a pip dependency "neuropacs". I install neuropacs in the init method if it does not already exist. Please let me know if this needs to be done another way.

Where it is now will slow down startup times, so better to wait until the module is entered. Something like this:
https://github.com/ImagingDataCommons/SlicerIDCBrowser/blob/a4904f34b26c8d5bb6ce4f2b9dbd5d09eb674d6c/IDCBrowser/IDCBrowser.py#L73

To keep track of existing records, I write to a file {slicer.app.temporaryPath}/neuropacs_order_map.json. Just want to make sure this is okay for production environment.

That's usually in a place that will get erased on reboot or cleared if it gets full. If these orders are something you think the user will want to persist over time, better to store in qt.QStandardPaths.writableLocation(qt.QStandardPaths.DocumentsLocation) but also give the user a chance to set it someplace of their choice.

@neuropacman
Copy link
Contributor Author

@pieper Thank you for your fast response! I will make the recommended changes.

One more question, when you say "but also give the user a chance to set it someplace of their choice.", how/where can I save this selection within Slicer so this path is restored when the module initializes? Or is this something I would need to store externally?

@pieper
Copy link
Member

pieper commented Oct 20, 2024

how/where can I save this selection within Slicer so this path is restored when the module initializes?

Under the hood we use the QSettings associated with the application so it's saved in an appropriate place on all platforms.

In python you can use slicer.util.settingsValue(key, default) helper is used to specify the key and the default value if it has't previously been stored. You can save with qt.QSettings().setValue(key, value)` when the user changes it. Search the source code and you'll see lots of examples.

@lassoan
Copy link
Contributor

lassoan commented Oct 20, 2024

For semi-persistent storage (content is preserved until a storage space limit is exceeded) can also use the Slicer cache folder:

import slicer

# Get the cache folder path
cache_folder = slicer.mrmlScene.GetCacheManager().GetRemoteCacheDirectory()
print("Cache folder:", cache_folder)

@neuropacman
Copy link
Contributor Author

neuropacman commented Oct 21, 2024

@pieper I have made the recommended changes on my main branch. Please let me know if there is anything else I need to do!

@pieper
Copy link
Member

pieper commented Oct 21, 2024

I think it looks good. Does anyone else want to comment before merging? @lassoan @jcfr

@lassoan
Copy link
Contributor

lassoan commented Oct 21, 2024

I've had a look and found the followings:

It would make sense to fix before making the extension available:

  • I got stuck at the very first step: Obtain an API key - where, how? You can decide not to help users with this, but then you miss an opportunity to find potential users.
  • pip install neuropacs fails on my computer (on Windows):
>>> pip_install('neuropacs')
Collecting neuropacs
  Obtaining dependency information for neuropacs from https://files.pythonhosted.org/packages/01/8f/8c6593bf2d1bfda1301c3e86b854e143bb1f0af4c683d4517d6bdd22f812/neuropacs-1.7.9-py3-none-any.whl.metadata
  Downloading neuropacs-1.7.9-py3-none-any.whl.metadata (2.4 kB)
Collecting cryptography==41.0.1 (from neuropacs)
  Obtaining dependency information for cryptography==41.0.1 from https://files.pythonhosted.org/packages/6a/35/7d7ac1ecd59c88f760584d3b9606ebfd48c5442377d67a8d3081226be424/cryptography-41.0.1-cp37-abi3-win_amd64.whl.metadata
  Downloading cryptography-41.0.1-cp37-abi3-win_amd64.whl.metadata (5.3 kB)
Collecting pycryptodome==3.20.0 (from neuropacs)
  Obtaining dependency information for pycryptodome==3.20.0 from https://files.pythonhosted.org/packages/1f/90/d131c0eb643290230dfa4108b7c2d135122d88b714ad241d77beb4782a76/pycryptodome-3.20.0-cp35-abi3-win_amd64.whl.metadata
  Downloading pycryptodome-3.20.0-cp35-abi3-win_amd64.whl.metadata (3.4 kB)
Collecting requests==2.31.0 (from neuropacs)
  Obtaining dependency information for requests==2.31.0 from https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl.metadata
  Downloading requests-2.31.0-py3-none-any.whl.metadata (4.6 kB)
Collecting rsa==4.9 (from neuropacs)
  Obtaining dependency information for rsa==4.9 from https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl.metadata
  Downloading rsa-4.9-py3-none-any.whl.metadata (4.2 kB)
Collecting urllib3==1.26.6 (from neuropacs)
  Obtaining dependency information for urllib3==1.26.6 from https://files.pythonhosted.org/packages/5f/64/43575537846896abac0b15c3e5ac678d787a4021e906703f1766bfb8ea11/urllib3-1.26.6-py2.py3-none-any.whl.metadata
  Downloading urllib3-1.26.6-py2.py3-none-any.whl.metadata (44 kB)
     -------------------------------------- 44.3/44.3 kB 548.8 kB/s eta 0:00:00
Collecting zipp==3.17.0 (from neuropacs)
  Obtaining dependency information for zipp==3.17.0 from https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl.metadata
  Using cached zipp-3.17.0-py3-none-any.whl.metadata (3.7 kB)
Collecting tqdm==4.66.1 (from neuropacs)
  Obtaining dependency information for tqdm==4.66.1 from https://files.pythonhosted.org/packages/00/e5/f12a80907d0884e6dff9c16d0c0114d81b8cd07dc3ae54c5e962cc83037e/tqdm-4.66.1-py3-none-any.whl.metadata
  Using cached tqdm-4.66.1-py3-none-any.whl.metadata (57 kB)
Requirement already satisfied: cffi>=1.12 in c:\users\andra\appdata\local\slicer.org\slicer 5.7.0-2024-09-24\lib\python\lib\site-packages (from cryptography==41.0.1->neuropacs) (1.16.0)
Requirement already satisfied: charset-normalizer<4,>=2 in c:\users\andra\appdata\local\slicer.org\slicer 5.7.0-2024-09-24\lib\python\lib\site-packages (from requests==2.31.0->neuropacs) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in c:\users\andra\appdata\local\slicer.org\slicer 5.7.0-2024-09-24\lib\python\lib\site-packages (from requests==2.31.0->neuropacs) (3.7)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\andra\appdata\local\slicer.org\slicer 5.7.0-2024-09-24\lib\python\lib\site-packages (from requests==2.31.0->neuropacs) (2024.2.2)
Collecting pyasn1>=0.1.3 (from rsa==4.9->neuropacs)
  Obtaining dependency information for pyasn1>=0.1.3 from https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl.metadata
  Downloading pyasn1-0.6.1-py3-none-any.whl.metadata (8.4 kB)
Requirement already satisfied: colorama in c:\users\andra\appdata\local\slicer.org\slicer 5.7.0-2024-09-24\lib\python\lib\site-packages (from tqdm==4.66.1->neuropacs) (0.4.6)
Requirement already satisfied: pycparser in c:\users\andra\appdata\local\slicer.org\slicer 5.7.0-2024-09-24\lib\python\lib\site-packages (from cffi>=1.12->cryptography==41.0.1->neuropacs) (2.22)
Downloading neuropacs-1.7.9-py3-none-any.whl (12 kB)
Using cached cryptography-41.0.1-cp37-abi3-win_amd64.whl (2.6 MB)
Downloading pycryptodome-3.20.0-cp35-abi3-win_amd64.whl (1.8 MB)
   ---------------------------------------- 1.8/1.8 MB 6.2 MB/s eta 0:00:00
Using cached requests-2.31.0-py3-none-any.whl (62 kB)
Using cached rsa-4.9-py3-none-any.whl (34 kB)
Using cached tqdm-4.66.1-py3-none-any.whl (78 kB)
Downloading urllib3-1.26.6-py2.py3-none-any.whl (138 kB)
   ---------------------------------------- 138.5/138.5 kB 8.0 MB/s eta 0:00:00
Using cached zipp-3.17.0-py3-none-any.whl (7.4 kB)
Downloading pyasn1-0.6.1-py3-none-any.whl (83 kB)
   ---------------------------------------- 83.1/83.1 kB 4.6 MB/s eta 0:00:00
Installing collected packages: zipp, urllib3, tqdm, pycryptodome, pyasn1, rsa, requests, cryptography, neuropacs
  Attempting uninstall: zipp
    Found existing installation: zipp 3.20.2
    Uninstalling zipp-3.20.2:
      Successfully uninstalled zipp-3.20.2
  Attempting uninstall: urllib3
    Found existing installation: urllib3 2.2.1
    Uninstalling urllib3-2.2.1:
      Successfully uninstalled urllib3-2.2.1
  Attempting uninstall: tqdm
    Found existing installation: tqdm 4.66.5
    Uninstalling tqdm-4.66.5:
      Successfully uninstalled tqdm-4.66.5
  Attempting uninstall: requests
    Found existing installation: requests 2.32.3
    Uninstalling requests-2.32.3:
      Successfully uninstalled requests-2.32.3
  Attempting uninstall: cryptography
    Found existing installation: cryptography 42.0.7
    Uninstalling cryptography-42.0.7:
      Successfully uninstalled cryptography-42.0.7
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
importlib-metadata 8.5.0 requires zipp>=3.20, but you have zipp 3.17.0 which is incompatible.
Successfully installed cryptography-41.0.1 neuropacs-1.7.9 pyasn1-0.6.1 pycryptodome-3.20.0 requests-2.31.0 rsa-4.9 tqdm-4.66.1 urllib3-1.26.6 zipp-3.17.0
>>> 

Other improvements to consider:

  • Once your order is completed, the option to download will become availble in PNG, TXT, JSON, or XML format. -> it seems that you just download the file to disk. You can actually load and display PNG, TXT, JSON, or XML files in Slicer, so after downloading it, it could make sense to show them. If space in the module panel is too tight then you can add a custom view layout that consists of a single text viewer widget (see for example how the DICOM module registers the DICOM browser to appear in the view layout) or switch to a single-slice image display for PNG.
  • No need to annoy the user with a popup when he opens the module (file_dialog.getSaveFileName). You can add a ctkPathLineEdit and populate it with your default path. It can even remember recently used paths (https://github.com/lassoan/SlicerDicomPatcher/blob/ff3fd9483b9609a1314ec593bae002540b9cff9e/DicomPatcher.py#L49-L52). If you want to make it a bit more difficult to change a folder then you can use a ctkDirectoryButton.
  • It is not ideal user experience if the user is forced to install Python packages when he just opens the module. It is better if you install the module when it is actually needed.
  • It is good practice to separate the GUI from logic class. Logic class contains all the helper functions that developers would use for batch processing or interfacing with your module.

@lassoan
Copy link
Contributor

lassoan commented Oct 21, 2024

Major blocking issue found: neuropacs Python package pins exact version of all its dependencies!

        'cryptography==41.0.1',
        'pycryptodome==3.20.0',
        'requests==2.31.0',
        'rsa==4.9',
        'urllib3==1.26.6',
        'zipp==3.17.0',
        'tqdm==4.66.1'

https://github.com/neuropacs/neuropacs-py-api/blob/main/setup.py#L15C1-L21C23

This makes it impossible to install most other Python packages and therefore it breaks many other Slicer extensions. I've just tried to install MONAIAuto3DSeg and segmentation failed to start (I think due to zipp version pinned).

A Python application can pin any dependencies it wants, but a Python library cannot do that. A Python library should specify its actual requirements as permissively as possible. It is of course extra work for the maintainer to test with a range of versions of dependencies but this is required if the package is intended to be used along with other Python packages.

@jamesobutler
Copy link
Contributor

For reference I had already gone ahead and written up neuropacs/neuropacs-py-api#18.

@neuropacman
Copy link
Contributor Author

neuropacman commented Oct 22, 2024

Hi @jamesobutler @lassoan @pieper,

Thank you for the extensive feedback.

I have made the following improvements:

  1. Add more descriptive instructions on how to obtain an API key in the README/Wiki.
  2. Loosened restrictions for dependency versions (as well as removed some unnecessary dependencies) for the neuropacs python api (addressed here)
  3. Removed the pip upgrade command - added method "ensure_latest_neuropacs_installed" to install latest version of 'neuropacs' if not already installed. This method pulls the latest version from PyPi and checks against the currently installed version, ensuring we always have the latest version.
  4. Added link to 3D Slicer docs regarding uploading DICOM datasets to the README (this was already included in the Wiki page)
  5. Removed code related to parameter node (not being used)
  6. Display result file in Slicer window after downloading to disk - for displaying txt/json/xml, I simply use a QTextEdit and add this to the main window (let me know if this approach is not ideal, but it seems to work great)
  7. Replace the File Dialog component for choosing the location of the order file with a ctkPathLineEdit in a new "Parameters" widget collapsible button and updated the README/Wiki instructions accordingly.
  8. Moved installation of neuropacs on first usage when validating API key

Please let me know if there is anything else!

Quick question: Will the "Reload and Test" widget view be removed in the prod environment? I do not see how/where it is being rendered.

@pieper
Copy link
Member

pieper commented Oct 22, 2024

Quick question: Will the "Reload and Test" widget view be removed in the prod environment? I do not see how/where it is being rendered.

This is controlled by the Developer Mode setting, so you don't need to worry about it.

@lassoan
Copy link
Contributor

lassoan commented Oct 25, 2024

Thanks for the update. Relaxing the Python requirements should address my main concerns.

I could not actually test the extension, because the instruction for getting an API key just takes me to a "request a demo" form. I would not want to spend time with requesting a demo, waiting for an answer, etc. and I think I'm not alone. There are so many competing solutions, so the if you are confident that your solution is better then I would recommend to set up a demo server with a publicly available API key (or at least an API key that is automatically sent when you register a free account) and let the product speak for itself.

@neuropacman
Copy link
Contributor Author

Hi @lassoan, at this point I am waiting on others within my company to create a process for obtaining an API key. I am not involved with this. I was instructed to create this extension to prepare for the future when we are ready to release our product.

We do not provide any facility for a demo key or anything like this. Although, we do have a dev environment that we use in our own testing that I can provide an API key for so that you can perform testing on your end. Although this dev environment has a different URL that is hard-coded into the extension so I can perhaps create a new branch that uses this test URL you can use. If this is not feasible, you can test on prod but I will give you a key that only has 5 uses.

Let me know what you think.

@lassoan
Copy link
Contributor

lassoan commented Oct 28, 2024

I can spend up to an hour on testing this and give feedback/recommendations if you send me a URL and API key (you can send me to my email). I can modify a .py file to use a custom URL (it helps if you tell me which one and where), no need to create a new branch for that.

@neuropacman
Copy link
Contributor Author

Hi @lassoan. Great. I have just sent you an email. Please let me know if you have any questions/issues during testing.

@neuropacman
Copy link
Contributor Author

Is there an update on this?

@neuropacman
Copy link
Contributor Author

Hi @lassoan @pieper @jamesobutler, please provide an update on this.

@lassoan
Copy link
Contributor

lassoan commented Nov 15, 2024

Thank you for your patience. We are very busy with preparing the new Slicer Stable Release (5.8). I'll try to get back to this today.

@lassoan
Copy link
Contributor

lassoan commented Nov 16, 2024

I've tried to test this. Updated the server URL, entered the API key, clicked Validate, it failed with this error in the Python console:

[Errno 2] No such file or directory: ''
[Python] API key validation failed

I've found where the exception information was discarded and added:

                import traceback
                traceback.print_exc()

After this I retried and got more useful information:

Traceback (most recent call last):
  File "C:/D/SlicerNeuropacs/NeuropacsScriptedModule/NeuropacsScriptedModule.py", line 449, in onValidateKeyButton
    self.loadNeuropacsOrderMapFromFile()
  File "C:/D/SlicerNeuropacs/NeuropacsScriptedModule/NeuropacsScriptedModule.py", line 180, in loadNeuropacsOrderMapFromFile
    with open(self.neuropacsOrderFilePath, "a") as file:
FileNotFoundError: [Errno 2] No such file or directory: ''
[Errno 2] No such file or directory: ''
[Python] API key validation failed

This indicated that when I clicked Validate, it also tried parsed the order file and it silently failed.

I then created a dummy order file (you provided an example in your email, I don't know where interested users would get that information) and tried to set it in the "Order file path". I struggled a lot with this, as clicking ... brings up a folder selector (not a file selector), but then it adds the neuropacs_orders.json suffix. I would recommend to either use a file selector for neuropacs_orders.json or use a folder selector (and later when you start to run the analysis you check if you can find a neuropacs_orders.json file in it).

Then I realized the very specific requirements that are needed for the input file that was in the PDF (from where itnerested users would know this?) and at this point I gave up. If there was a link in the tutorial I would have continues, but I would not like to write an email, wait for a response, download the data set, etc. If you want to interested users to have a chance of trying your system then you would need to make at least a single data set publicly avaialable.

I don't think I can spend more time with this in the next couple of days and even if I could, I don't think my feedback could significantly improve the usefulness of the extension for the community, because too much insider information would be needed even for a first very basic testing (API key, details about input data format, sample data set). However, broad usability of the extension for the community is not a requirement for accepting the extension into the Extensions Index, so I'm OK with getting this integrated.

I @pieper and @jamesobutler don't have any more feedback then we can merge this on Monday.

@pieper
Copy link
Member

pieper commented Nov 17, 2024

I suggest that @neuropacman give it another look based on the feedback from @lassoan. I don't think anyone benefits if the extension is confusing and hard to even test.

@neuropacman
Copy link
Contributor Author

@pieper I agree. I'd like to get it right before it is merged. Sorry for an inconvenience. I have intentionally built this extension under the assumption that users would be aware our product and it's specific input requirements as this is what I was instructed to do. @lassoan I will take your feedback into consideration and reach out again once I am satisfied with everything. Thanks again.

@neuropacman
Copy link
Contributor Author

Hi @lassoan @pieper, I have made the following changes:

  1. I now use a file selector instead of a folder selector. On initially opening the extension, there is a default path with a file "slicer_neuropacs.config" appended. If the user does not change this, the file will be created and this path stored once the user attempts to validate the API key. The user also has the ability to manually input a path into the file selector to create a new file or select any existing .config file they choose (but this can cause a parsing error if the config file already has content that does not match the expected format).

  2. Once the config file is initially created (or if the file is empty - assuming a new file) after validating the API key, the "TEST" user is automatically appended to the config file. It was not the original intention to provide this, and I only suggested it to you during testing so you could see the output functionality. But I think it can be useful for other reasons as well.

  3. I have added a "Request an API key" link that now takes users to our new request form: https://neuropacs.com/api-key-request/. Although, I have built this extension under the assumption that users would have already acquired an API key from other means. So, it is not an issue for us that someone may want to use our extension and not be able to immediately.

As for a our highly specific input requirements, this is again something that we assume the users know before attempting to access the extension. We do not foresee this being an issue.

Unfortunately, we are not currently able to provide a sample dataset.

I hope this is satisfactory.

Please let me know if you plan to re-test everything I will provide another API key for you.

@pieper
Copy link
Member

pieper commented Nov 22, 2024

@neuropacman you have to admit what you describe has utility only to a small subset of people (those who are assumed to already know the input requirements, or assumed to already have an API key). Since it involves some work on our part to evaluate and host extensions it is kind of against our purposes to have an extension where the only utility is to provide access to your paid service.

Does the module provide any other features to the general Slicer user?

@neuropacman
Copy link
Contributor Author

neuropacman commented Nov 22, 2024

@pieper No, the extension does not immediately provide features to a "general Slicer user", as our service requires an API key to operate. Our goal is to provide our users with different mediums of use through extensions/integrations with various PACS and image viewers. However, it is entirely plausible for a "general Slicer user" to discover our extension within Slicer and request an API key to access its functionality.

@jamesobutler
Copy link
Contributor

jamesobutler commented Nov 22, 2024

@pieper I think this falls under the category of an extension that is a portal to commercially licensed functionality.

Slicer Extensions Index Extension URL Commercial Website
FlyWheelConnect https://gitlab.com/flywheel-io/scientific-solutions/app/slicer_flywheel_connect https://flywheel.io/#
Neuropacs in this PR https://github.com/neuropacs/SlicerNeuropacs https://neuropacs.com/

From the terminologies of Free, Freemium and Premium the above 2 extensions seem to fall under the "Premium" category. The service provided may be niche or generic, but is limited in value on the Slicer Extensions Index if the spirit of the Slicer organization factory build machine which builds and distributes the Slicer Extensions Index (funding provided by Kitware) is to provide extensions under a free (and possibly freemium) model. Maybe @jcfr can provide guidance whether the Slicer Extensions Index can be used to distribute "Premium" type extensions or if the commercial entity should be self-distributing their extension instead (distributing a .ZIP, as mentioned here, that their customers can install into Slicer). FlywheelConnect might have been the first "Premium" Slicer extension, where this case of additional Premium extensions may warrant the need for the Slicer organization to define a stance on the issue.

@pieper
Copy link
Member

pieper commented Nov 22, 2024

@jamesobutler it's true that FlyWheel is also a 'Premium' offering, but it's also a somewhat generic tool, something like google drive or a hosted database. In that sense it could help users of either Slicer or FlyWheel to try out the other and use them together if they want. In contrast, Neuropacs seems a little more one-way, which is why I asked what other functionality it might offer.

In any case I don't object to the Premium category, and maybe we should go out of our way to encourage companies to promote their novel analysis tools in this way. Slicer could provide a useful platform to compare and contrast different offerings kind of like how you can install dropbox or google drive on your linux machine and decide which you like better.

It would be great if Slicer users could have the option of paying for services they find useful. The freemium model would be good, so people can easily use it up to a limit for experiments.

@lassoan
Copy link
Contributor

lassoan commented Nov 25, 2024

For me an extension is acceptable if it is:

  • safe (does not degrade the application, does not expose the user to extra risk)
  • non-confusing (name is accurate, does not claim too much, license is clear)
  • useful (justify the cost of nightly builds, investigation of issues, user support, etc.)

Thresholds for the first two are quite clear. Setting a minimum for usefulness is not easy, but for me usefulness criteria is met if the extension is important for a company, because a company using the platform has inherent value that can compensate the costs.

With the introduction of the tiers system we can introduce further incentives to improve usefulness of an extension after it is submitted to the extensions catalog.


Let's discuss all these at the weekly meeting tomorrow.

@lassoan
Copy link
Contributor

lassoan commented Dec 2, 2024

Based on discussion at the weekly developer meeting this extension is accepted into the Extensions Catalog.

@lassoan lassoan merged commit 725cfe9 into Slicer:main Dec 2, 2024
3 checks passed
@jamesobutler
Copy link
Contributor

@neuropacman This extension was integrated into the main branch which is used by the latest Slicer Preview build. You must download the latest Slicer Preview build to get the built version of the extension as extension updates are not built for older Slicer Preview builds.

https://github.com/Slicer/ExtensionsIndex/tree/5.6 is reserved for extensions for the latest Slicer 5.6.x stable. Something to note is that a new Slicer stable will be coming out shortly and the main branch will become the future https://github.com/Slicer/ExtensionsIndex/tree/5.8 branch.

Note

Currently the SlicerNeuroPacs extension is not present in the Slicer Preview build because there are build errors. See https://slicer.cdash.org/index.php?project=SlicerPreview which can be filtered to view the results of your individual extension as well. Reviewing the build results, it appears to be messing up on something related to the extension description.

@lassoan
Copy link
Contributor

lassoan commented Dec 10, 2024

Good catch @jamesobutler. The issue is that the extension name in the CMakeLists.txt file is incorrect:

https://github.com/neuropacs/SlicerNeuropacs/blob/f0b63fada1f82dcbf65b8079c4add4cbaaa9ab2c/CMakeLists.txt#L3

It should be: project(SlicerNeuropacs)

@neuropacman
Copy link
Contributor Author

@lassoan Thank you, I have made this correction.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

4 participants