<h1 align="center">Virtual Scanner Tabletop Web Games</h3>
<p float="left">
<img title="PyPulseq Badge" src="https://img.shields.io/badge/made%20using-pypulseq-brightgreen" height="15"><img title="Virtual Scanner Badge" src="https://img.shields.io/badge/made%20using-virtual--scanner-blue" height="15">
</p>
<br>
Virtual Scanner Tabletop is an extension to [Virtual Scanner](https://github.com/imr-framework/virtual-scanner/) that comprises of educational games about MRI that can be run by simulation or connected to a real educational MRI scanner. Target audience include high school, college, and post-grad students as well as members of the MR and scientific community at large.
## Quickstart
### Method 1: `pip install`
1. On the command line, make a new virtual environment.
2. `pip install vs-tabletop`
3. cd into the main folder called "vstabletop" (`venv\Lib\site-packages\vstabletop`) and run `app.py`. Click into the link in the program output (examplee: http://127.0.0.1:5000/). Log in as admin using password `123456`.
#### Troubleshooting
(version 1.0.0b5) - You might encounter problems with installing Kiwisolver which requires Visual C++. If you have trouble getting the Visual C++, you can ignore the kiwisolver and perform the following steps:
1. Install vs-tabletop without dependencies: `pip install vs-tabletop==1.0.0b4 --no-deps`
2. After it's installed, find `requirements.txt` in the `vstabletop` folder and remove the `kiwisolver==1.0.1` line
3. Install the rest of the requirements: `pip install -r requirements.txt`
4. Run `app.py` the same way as described above. The games should be able to run normally.
### Method 2: Cloning
1. Clone the repository.
2. Make a virtual environment, activate it, and install everything specified in `requirements.txt`
3. `cd` into the app directory and run `questions.py` to set up the database.
4. Run the app in one of two ways:
(a) Run app.py using Pycharm or other IDE, or on the command line with `python app.py`
(b) On the command line, set the FLASK_APP variable (`set FLASK_APP=app` on Windows, or `export FLASK_APP=app` on non-Windows). Then run the app with: `flask run`
5. Click into the link in the program output (example: http://127.0.0.1:5000/) or copy & paste it into the browser. Log in as admin using password `123456`.
Please provide feedback here after you've tried all the beginner games:smile:: https://forms.gle/HMby4NHcmrTLi5Ai7
## Tabletop Games
The eight tabletop games are grouped into 4 pairs, each containing a "beginner" game and an "advanced" game.
Games 1, 3, 5, 7 are beginner games and the games 2, 4, 6, 8 are advanced games.
| # | Game | Conceptsr |
| --- | ------------- | ------------- |
| 1 | What's in an image? | FOV, resolution, windowing |
| 2 | K-space magiK | projection imaging, k-space |
| 3 | Brains, please! | contrast, T1/T2/PD, TR/TE/FA |
| 4 | Fresh blood | flow imaging |
| 5 | Proton's got moves | M9, precession, RF pulses, signal detection |
| 6 | Relaxation station | T1 and T2 relaxation, FID |
| 7 | Puzzled by projection I | 1D and 2D projection (forward) |
| 8 | Puzzled by projection II | 1D and 2D projection (inverse)|
## Screenshots
Screenshots are in-development previews of the games. They will be updated at the first release.
### Login page
![login](https://user-images.githubusercontent.com/31249056/186200814-f0abacb0-a4ad-490d-9b64-76e72f4bb6a9.png)
### Game navigation
![index](https://user-images.githubusercontent.com/31249056/186200755-38525e6b-4196-49d0-a23d-320a164ff2b4.png)
### Module 1 (beginner): What's in an image?
![game1](https://user-images.githubusercontent.com/31249056/186200870-c4d1a934-bf80-4f34-95e4-698a1fe6dee5.png)
### Module 2 (beginner): Brains, please!
![game3](https://user-images.githubusercontent.com/31249056/186200887-3504892c-3367-4fe4-a222-fc35fb869f8e.png)
### Module 3 (beginner): Proton's got moves
![game5](https://user-images.githubusercontent.com/31249056/186201062-cae3af09-749e-4e0a-a254-b803f7e22772.png)
### Module 4 (beginner): Puzzled by Projection I
![game7](https://user-images.githubusercontent.com/31249056/186201082-00fc2dad-a9b1-4911-8862-99fbd73cccdc.png)
# References
Brain images from the Coursera Neurohacking in R (https://www.kaggle.com/datasets/ilknuricke/neurohackinginrimages) were used in Game 2.
Raw data
{
"_id": null,
"home_page": "https://github.com/imr-framework/vs-tabletop",
"name": "vs-tabletop",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3",
"maintainer_email": "",
"keywords": "",
"author": "imr-framework",
"author_email": "imr.framework2018@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/f7/37/669c2ad29ca1069cfcb1bb52c3d8beb9b98ccf282e21c28d59abb2fd7460/vs-tabletop-1.0.0.tar.gz",
"platform": null,
"description": "<h1 align=\"center\">Virtual Scanner Tabletop Web Games</h3>\r\n<p float=\"left\">\r\n<img title=\"PyPulseq Badge\" src=\"https://img.shields.io/badge/made%20using-pypulseq-brightgreen\" height=\"15\"><img title=\"Virtual Scanner Badge\" src=\"https://img.shields.io/badge/made%20using-virtual--scanner-blue\" height=\"15\">\r\n</p>\r\n<br>\r\n\r\nVirtual Scanner Tabletop is an extension to [Virtual Scanner](https://github.com/imr-framework/virtual-scanner/) that comprises of educational games about MRI that can be run by simulation or connected to a real educational MRI scanner. Target audience include high school, college, and post-grad students as well as members of the MR and scientific community at large. \r\n\r\n## Quickstart\r\n### Method 1: `pip install`\r\n1. On the command line, make a new virtual environment. \r\n2. `pip install vs-tabletop`\r\n3. cd into the main folder called \"vstabletop\" (`venv\\Lib\\site-packages\\vstabletop`) and run `app.py`. Click into the link in the program output (examplee: http://127.0.0.1:5000/). Log in as admin using password `123456`. \r\n#### Troubleshooting \r\n(version 1.0.0b5) - You might encounter problems with installing Kiwisolver which requires Visual C++. If you have trouble getting the Visual C++, you can ignore the kiwisolver and perform the following steps:\r\n1. Install vs-tabletop without dependencies: `pip install vs-tabletop==1.0.0b4 --no-deps`\r\n2. After it's installed, find `requirements.txt` in the `vstabletop` folder and remove the `kiwisolver==1.0.1` line\r\n3. Install the rest of the requirements: `pip install -r requirements.txt`\r\n4. Run `app.py` the same way as described above. The games should be able to run normally.\r\n\r\n### Method 2: Cloning \r\n1. Clone the repository.\r\n2. Make a virtual environment, activate it, and install everything specified in `requirements.txt`\r\n3. `cd` into the app directory and run `questions.py` to set up the database.\r\n4. Run the app in one of two ways:\r\n (a) Run app.py using Pycharm or other IDE, or on the command line with `python app.py`\r\n (b) On the command line, set the FLASK_APP variable (`set FLASK_APP=app` on Windows, or `export FLASK_APP=app` on non-Windows). Then run the app with: `flask run`\r\n5. Click into the link in the program output (example: http://127.0.0.1:5000/) or copy & paste it into the browser. Log in as admin using password `123456`.\r\n\r\nPlease provide feedback here after you've tried all the beginner games:smile:: https://forms.gle/HMby4NHcmrTLi5Ai7\r\n\r\n## Tabletop Games\r\nThe eight tabletop games are grouped into 4 pairs, each containing a \"beginner\" game and an \"advanced\" game. \r\nGames 1, 3, 5, 7 are beginner games and the games 2, 4, 6, 8 are advanced games. \r\n\r\n| # | Game | Conceptsr |\r\n| --- | ------------- | ------------- |\r\n| 1 | What's in an image? | FOV, resolution, windowing |\r\n| 2 | K-space magiK | projection imaging, k-space |\r\n| 3 | Brains, please! | contrast, T1/T2/PD, TR/TE/FA | \r\n| 4 | Fresh blood | flow imaging |\r\n| 5 | Proton's got moves | M9, precession, RF pulses, signal detection | \r\n| 6 | Relaxation station | T1 and T2 relaxation, FID | \r\n| 7 | Puzzled by projection I | 1D and 2D projection (forward) |\r\n| 8 | Puzzled by projection II | 1D and 2D projection (inverse)|\r\n\r\n## Screenshots \r\nScreenshots are in-development previews of the games. They will be updated at the first release. \r\n\r\n### Login page\r\n![login](https://user-images.githubusercontent.com/31249056/186200814-f0abacb0-a4ad-490d-9b64-76e72f4bb6a9.png)\r\n\r\n### Game navigation\r\n![index](https://user-images.githubusercontent.com/31249056/186200755-38525e6b-4196-49d0-a23d-320a164ff2b4.png)\r\n\r\n### Module 1 (beginner): What's in an image?\r\n![game1](https://user-images.githubusercontent.com/31249056/186200870-c4d1a934-bf80-4f34-95e4-698a1fe6dee5.png)\r\n\r\n### Module 2 (beginner): Brains, please!\r\n![game3](https://user-images.githubusercontent.com/31249056/186200887-3504892c-3367-4fe4-a222-fc35fb869f8e.png)\r\n\r\n### Module 3 (beginner): Proton's got moves\r\n![game5](https://user-images.githubusercontent.com/31249056/186201062-cae3af09-749e-4e0a-a254-b803f7e22772.png)\r\n\r\n### Module 4 (beginner): Puzzled by Projection I \r\n![game7](https://user-images.githubusercontent.com/31249056/186201082-00fc2dad-a9b1-4911-8862-99fbd73cccdc.png)\r\n\r\n# References\r\nBrain images from the Coursera Neurohacking in R (https://www.kaggle.com/datasets/ilknuricke/neurohackinginrimages) were used in Game 2.\r\n",
"bugtrack_url": null,
"license": "License :: OSI Approved :: GNU Affero General Public License v3",
"summary": "Virtual Scanner Tabletop Games",
"version": "1.0.0",
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "bc42956f4cc8f529db2f4c8de5ac51f69d7179d79b2faa4bb5111f47db4e5957",
"md5": "dd60a7d2022744fd6d24528a6f6a85e3",
"sha256": "8453cc7c1dd1dfe93fa22f3fe43da79880da29e38bec3e55b761dadc62abc255"
},
"downloads": -1,
"filename": "vs_tabletop-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "dd60a7d2022744fd6d24528a6f6a85e3",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3",
"size": 5173878,
"upload_time": "2023-01-25T19:14:44",
"upload_time_iso_8601": "2023-01-25T19:14:44.141820Z",
"url": "https://files.pythonhosted.org/packages/bc/42/956f4cc8f529db2f4c8de5ac51f69d7179d79b2faa4bb5111f47db4e5957/vs_tabletop-1.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "f737669c2ad29ca1069cfcb1bb52c3d8beb9b98ccf282e21c28d59abb2fd7460",
"md5": "b33119d9da16a708b3f03bad316118d9",
"sha256": "9a02120c3e02986dec37e96ce138dba6c65858316fe02d2bdcfb0d7eaed6ee5f"
},
"downloads": -1,
"filename": "vs-tabletop-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "b33119d9da16a708b3f03bad316118d9",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3",
"size": 4981379,
"upload_time": "2023-01-25T19:14:47",
"upload_time_iso_8601": "2023-01-25T19:14:47.914353Z",
"url": "https://files.pythonhosted.org/packages/f7/37/669c2ad29ca1069cfcb1bb52c3d8beb9b98ccf282e21c28d59abb2fd7460/vs-tabletop-1.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-01-25 19:14:47",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "imr-framework",
"github_project": "vs-tabletop",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "absl-py",
"specs": [
[
"==",
"1.1.0"
]
]
},
{
"name": "astor",
"specs": [
[
"==",
"0.7.1"
]
]
},
{
"name": "astunparse",
"specs": [
[
"==",
"1.6.3"
]
]
},
{
"name": "bidict",
"specs": [
[
"==",
"0.22.0"
]
]
},
{
"name": "cachelib",
"specs": [
[
"==",
"0.9.0"
]
]
},
{
"name": "cachetools",
"specs": [
[
"==",
"5.2.0"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2022.6.15"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"2.1.0"
]
]
},
{
"name": "click",
"specs": [
[
"==",
"8.1.3"
]
]
},
{
"name": "colorama",
"specs": [
[
"==",
"0.4.4"
]
]
},
{
"name": "cycler",
"specs": [
[
"==",
"0.10.0"
]
]
},
{
"name": "dominate",
"specs": [
[
"==",
"2.6.0"
]
]
},
{
"name": "ellipsinator",
"specs": [
[
"==",
"0.2.1"
]
]
},
{
"name": "Flask",
"specs": [
[
"==",
"2.1.2"
]
]
},
{
"name": "Flask-Bootstrap",
"specs": [
[
"==",
"3.3.7.1"
]
]
},
{
"name": "Flask-Login",
"specs": [
[
"==",
"0.6.1"
]
]
},
{
"name": "Flask-Session",
"specs": [
[
"==",
"0.4.0"
]
]
},
{
"name": "Flask-SocketIO",
"specs": [
[
"==",
"5.2.0"
]
]
},
{
"name": "Flask-SQLAlchemy",
"specs": [
[
"==",
"2.5.1"
]
]
},
{
"name": "Flask-WTF",
"specs": [
[
"==",
"1.0.1"
]
]
},
{
"name": "flatbuffers",
"specs": [
[
"==",
"1.12"
]
]
},
{
"name": "fonttools",
"specs": [
[
"==",
"4.33.3"
]
]
},
{
"name": "gast",
"specs": [
[
"==",
"0.2.2"
]
]
},
{
"name": "google-auth",
"specs": [
[
"==",
"2.9.0"
]
]
},
{
"name": "google-auth-oauthlib",
"specs": [
[
"==",
"0.4.6"
]
]
},
{
"name": "google-pasta",
"specs": [
[
"==",
"0.2.0"
]
]
},
{
"name": "greenlet",
"specs": [
[
"==",
"1.1.2"
]
]
},
{
"name": "grpcio",
"specs": [
[
"==",
"1.47.0"
]
]
},
{
"name": "gunicorn",
"specs": [
[
"==",
"20.1.0"
]
]
},
{
"name": "h11",
"specs": [
[
"==",
"0.13.0"
]
]
},
{
"name": "h5py",
"specs": [
[
"==",
"3.7.0"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.3"
]
]
},
{
"name": "imageio",
"specs": [
[
"==",
"2.19.3"
]
]
},
{
"name": "importlib-metadata",
"specs": [
[
"==",
"4.11.4"
]
]
},
{
"name": "itsdangerous",
"specs": [
[
"==",
"2.1.2"
]
]
},
{
"name": "Jinja2",
"specs": [
[
"==",
"3.1.2"
]
]
},
{
"name": "keras",
"specs": [
[
"==",
"2.9.0"
]
]
},
{
"name": "Keras-Applications",
"specs": [
[
"==",
"1.0.8"
]
]
},
{
"name": "Keras-Preprocessing",
"specs": [
[
"==",
"1.1.2"
]
]
},
{
"name": "kiwisolver",
"specs": [
[
"==",
"1.0.1"
]
]
},
{
"name": "libclang",
"specs": [
[
"==",
"14.0.1"
]
]
},
{
"name": "Markdown",
"specs": [
[
"==",
"3.1"
]
]
},
{
"name": "MarkupSafe",
"specs": [
[
"==",
"2.1.1"
]
]
},
{
"name": "matplotlib",
"specs": [
[
"==",
"3.5.2"
]
]
},
{
"name": "mock",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "networkx",
"specs": [
[
"==",
"2.8.4"
]
]
},
{
"name": "nibabel",
"specs": [
[
"==",
"2.4.0"
]
]
},
{
"name": "numpy",
"specs": [
[
"==",
"1.22.4"
]
]
},
{
"name": "numpy-stl",
"specs": [
[
"==",
"2.17.1"
]
]
},
{
"name": "oauthlib",
"specs": [
[
"==",
"3.2.0"
]
]
},
{
"name": "opencv-python",
"specs": [
[
"==",
"4.6.0.66"
]
]
},
{
"name": "opt-einsum",
"specs": [
[
"==",
"3.3.0"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"21.3"
]
]
},
{
"name": "pandas",
"specs": [
[
"==",
"1.4.2"
]
]
},
{
"name": "pbr",
"specs": [
[
"==",
"5.1.3"
]
]
},
{
"name": "phantominator",
"specs": [
[
"==",
"0.6.4"
]
]
},
{
"name": "Pillow",
"specs": [
[
"==",
"9.2.0"
]
]
},
{
"name": "plotly",
"specs": [
[
"==",
"5.9.0"
]
]
},
{
"name": "protobuf",
"specs": [
[
"==",
"3.19.4"
]
]
},
{
"name": "psycopg2",
"specs": [
[
"==",
"2.9.3"
]
]
},
{
"name": "pyasn1",
"specs": [
[
"==",
"0.4.8"
]
]
},
{
"name": "pyasn1-modules",
"specs": [
[
"==",
"0.2.8"
]
]
},
{
"name": "pydicom",
"specs": [
[
"==",
"1.2.2"
]
]
},
{
"name": "pymesh",
"specs": [
[
"==",
"1.0.2"
]
]
},
{
"name": "pyparsing",
"specs": [
[
"==",
"2.3.1"
]
]
},
{
"name": "pypulseq",
"specs": [
[
"==",
"1.3.1.post1"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.8.2"
]
]
},
{
"name": "python-engineio",
"specs": [
[
"==",
"4.3.3"
]
]
},
{
"name": "python-socketio",
"specs": [
[
"==",
"5.7.0"
]
]
},
{
"name": "python-utils",
"specs": [
[
"==",
"3.3.3"
]
]
},
{
"name": "pytz",
"specs": [
[
"==",
"2022.1"
]
]
},
{
"name": "PyWavelets",
"specs": [
[
"==",
"1.3.0"
]
]
},
{
"name": "PyYAML",
"specs": [
[
"==",
"5.1"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.28.1"
]
]
},
{
"name": "requests-oauthlib",
"specs": [
[
"==",
"1.3.1"
]
]
},
{
"name": "rsa",
"specs": [
[
"==",
"4.8"
]
]
},
{
"name": "scikit-image",
"specs": [
[
"==",
"0.19.3"
]
]
},
{
"name": "scipy",
"specs": [
[
"==",
"1.8.1"
]
]
},
{
"name": "selenium",
"specs": [
[
"==",
"3.141.0"
]
]
},
{
"name": "simple-websocket",
"specs": [
[
"==",
"0.5.2"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.16.0"
]
]
},
{
"name": "SQLAlchemy",
"specs": [
[
"==",
"1.4.37"
]
]
},
{
"name": "ssfp",
"specs": [
[
"==",
"1.0.0"
]
]
},
{
"name": "stl-to-voxel",
"specs": [
[
"==",
"0.9.2"
]
]
},
{
"name": "tenacity",
"specs": [
[
"==",
"8.0.1"
]
]
},
{
"name": "tensorboard",
"specs": [
[
"==",
"2.9.1"
]
]
},
{
"name": "tensorboard-data-server",
"specs": [
[
"==",
"0.6.1"
]
]
},
{
"name": "tensorboard-plugin-wit",
"specs": [
[
"==",
"1.8.1"
]
]
},
{
"name": "termcolor",
"specs": [
[
"==",
"1.1.0"
]
]
},
{
"name": "tifffile",
"specs": [
[
"==",
"2022.5.4"
]
]
},
{
"name": "tqdm",
"specs": [
[
"==",
"4.64.0"
]
]
},
{
"name": "typing_extensions",
"specs": [
[
"==",
"4.3.0"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"1.26.9"
]
]
},
{
"name": "virtual-scanner",
"specs": [
[
"==",
"2.0.0.post5"
]
]
},
{
"name": "visitor",
"specs": [
[
"==",
"0.1.3"
]
]
},
{
"name": "Werkzeug",
"specs": [
[
"==",
"2.1.2"
]
]
},
{
"name": "wrapt",
"specs": [
[
"==",
"1.14.1"
]
]
},
{
"name": "wsproto",
"specs": [
[
"==",
"1.1.0"
]
]
},
{
"name": "WTForms",
"specs": [
[
"==",
"3.0.1"
]
]
},
{
"name": "zipp",
"specs": [
[
"==",
"3.8.0"
]
]
}
],
"lcname": "vs-tabletop"
}