From a4c73115aae490fb4b7f6e437940e4bd21c198bd Mon Sep 17 00:00:00 2001 From: gianthk Date: Wed, 22 Nov 2023 12:03:16 +0300 Subject: [PATCH] install and astra tomopy venv instructions --- README.md | 21 ++++++--- alrecon/__init__.py | 2 +- docs/pictures/alrecon_imagej.png | Bin 0 -> 64894 bytes envs/alrecon-astra.yml | 20 +++++++++ alrecon.yml => envs/alrecon-base.yml | 3 -- envs/install_alrecon_in_tomopy_dev_env.md | 51 ++++++++++++++++++++++ imagej_macros/FolderOpener_virtual.ijm | 5 +++ pyproject.toml | 10 ++--- 8 files changed, 95 insertions(+), 17 deletions(-) create mode 100644 docs/pictures/alrecon_imagej.png create mode 100644 envs/alrecon-astra.yml rename alrecon.yml => envs/alrecon-base.yml (86%) create mode 100644 envs/install_alrecon_in_tomopy_dev_env.md create mode 100644 imagej_macros/FolderOpener_virtual.ijm diff --git a/README.md b/README.md index 6b4a82d..355698c 100644 --- a/README.md +++ b/README.md @@ -21,15 +21,17 @@ git clone https://github.com/gianthk/alrecon.git 2. Navigate to the repository and create a virtual environment with all necessary dependencies: ```commandline cd alrecon -conda env create --file alrecon.yml -conda activate alrecon +conda env create --file envs/alrecon-base.yml +conda activate alrecon-base ``` > [!NOTE] -> If you already have a destination virtual environment for alrecon, you can install manually the requirements listed in file [alrecon.yml](alrecon.yml). +> If you already have a destination virtual environment for alrecon, you can install manually the requirements listed in file [alrecon.yml](envs/alrecon-base.yml). + +> [!NOTE] +> To use TomoPy with CUDA features, install TomoPy from conda following [these instructions](https://tomopy.readthedocs.io/en/stable/install.html). 3. Build the `alrecon` app: ```commandline -cd alrecon pip install -e . ``` @@ -64,10 +66,17 @@ You can take a look at [solara's documnetation](https://solara.dev/api) for more ## Integration with Google Sheets - `Alrecon` allows you to keep a consistent log of all reconstruction jobs on an online master Google spreadsheet. - The integration uses [gspread](https://docs.gspread.org/en/v5.12.0/), a Python API for Google Sheets. -- You will need to setup your Google account, enable Google Sheets API, and create a Secret Key for accessing your online master. Follow [these instructions](https://www.youtube.com/watch?v=hyUw-koO2DA) to setup the integration with Google Sheets. +- You will need to setup your Google Cloud account, enable [Google Sheets API](https://developers.google.com/sheets/api/guides/concepts), and create a Secret Key with read/write permission to your online master Google sheet. Follow [these instructions](https://www.youtube.com/watch?v=hyUw-koO2DA) to setup the integration with Google Sheets API. ## Use with [napari](https://napari.org/stable/) -napari is a pure Python powerfull viewer for multi-dimensional images. Until now, alrecon supports napari only when [running the app through Jupyter](#run-al-recon-within-jupyter). +[napari](https://napari.org/stable/) is a pure Python powerfull viewer for multi-dimensional images. Until now, alrecon supports napari only when [running the app through Jupyter](#run-al-recon-within-jupyter). + +## Setup [ImageJ](https://imagej.net/software/fiji/) launcher +To launch [ImageJ](https://imagej.net/software/fiji/) from the alrecon web app follow these steps: +1. Modify the path to your ImageJ executable in the alrecon general settings +![alrecon imagej executable path setting](docs/pictures/alrecon_imagej.png) + +2. Copy the [FolderOpener_virtual.ijm](/imagej_macros/FolderOpener_virtual.ijm) ImageJ macro contained in `/alrecon/imagej_macros/` to the plugin folder of your ImageJ installation. On Linux this is something like `/opt/Fiji.app/macros/`. ## Acknowledgements This work was performed within the [BEATS](https://beats-sesame.eu/) project and has received funding from the EU’s H2020 framework programme for research and innovation under grant agreement n° [822535](https://cordis.europa.eu/project/id/822535). \ No newline at end of file diff --git a/alrecon/__init__.py b/alrecon/__init__.py index 2bf6027..3c5392b 100644 --- a/alrecon/__init__.py +++ b/alrecon/__init__.py @@ -1,4 +1,4 @@ """Al-recon. Everyone can reconstruct""" __title__ = "Al-recon" -__version__ = "0.3.1" +__version__ = "0.3.2" __description__ = "Computed Tomography reconstruction web applicatoin. Built with solara." diff --git a/docs/pictures/alrecon_imagej.png b/docs/pictures/alrecon_imagej.png new file mode 100644 index 0000000000000000000000000000000000000000..f186c203e57eea12cbc178be5f883a5bf4c96c98 GIT binary patch literal 64894 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 literal 0 HcmV?d00001 diff --git a/envs/alrecon-astra.yml b/envs/alrecon-astra.yml new file mode 100644 index 0000000..08603c7 --- /dev/null +++ b/envs/alrecon-astra.yml @@ -0,0 +1,20 @@ +name: alrecon +channels: + - conda-forge +dependencies: + - python=3.8 + - astra-toolbox::astra-toolbox + - tomopy + - plotly::plotly + - dxchange + - pandas + - tifffile + - pip + - pip: + - pypng + - matplotlib + - gspread + - gspread-dataframe + - oauth2client + - solara + - napari \ No newline at end of file diff --git a/alrecon.yml b/envs/alrecon-base.yml similarity index 86% rename from alrecon.yml rename to envs/alrecon-base.yml index 24bc724..d3ceb5f 100644 --- a/alrecon.yml +++ b/envs/alrecon-base.yml @@ -1,20 +1,17 @@ name: alrecon channels: - conda-forge - - defaults dependencies: - python>=3.8 - tomopy - dxchange - pip - pip: - - numpy - pandas - tifffile - pypng - plotly - matplotlib - - numexpr - gspread - gspread-dataframe - oauth2client diff --git a/envs/install_alrecon_in_tomopy_dev_env.md b/envs/install_alrecon_in_tomopy_dev_env.md new file mode 100644 index 0000000..bdb6a1d --- /dev/null +++ b/envs/install_alrecon_in_tomopy_dev_env.md @@ -0,0 +1,51 @@ +## the following commands were used to create a virtual environment for alrecon with full GPU functionalities using astra-toolbox and tomopy +```commandline +conda create --name tomopy python=3.8 +conda activate tomopy +conda install -c astra-toolbox astra-toolbox +conda install -c conda-forge tomopy +conda install dxchange pandas tifffile +conda install -c conda-forge dxchange pandas tifffile +pip install pypng matplotlib gspread gspread-dataframe oauth2client +pip install solara +``` + +--- +## the following is an attempt to install tomopy and alrecon in development mode in a virtual environment with the astra-toolbox + +### 1. clone the TomoPy GitHub repository +### 2. create virtual env +```commandline +conda env create -f /tomopy/envs/linux-cuda.yml --name alrecon python=3.8 +conda activate alrecon +``` + +### 3. install astra-toolbox +```commandline +conda install -c astra-toolbox astra-toolbox +``` + +### 4. build TomoPy +```commandline +cd tomopy/ +pip install . --no-deps +mkdir build +cd build +cmake .. -GNinja -DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX -DCMAKE_INSTALL_LIBDIR=lib +cmake --build . +cmake --install . +``` + +### 5. Clone the alrecon GitHub repository +### 6. Install the alrecon dependencies +```commandline +cd alrecon/ +conda install -c plotly plotly +conda install pandas tifffile +pip install pypng matplotlib gspread gspread-dataframe oauth2client +pip install solara +``` +### 7. Build alrecon +```commandline +pip install -e . +``` diff --git a/imagej_macros/FolderOpener_virtual.ijm b/imagej_macros/FolderOpener_virtual.ijm new file mode 100644 index 0000000..9ad0125 --- /dev/null +++ b/imagej_macros/FolderOpener_virtual.ijm @@ -0,0 +1,5 @@ +filelist = getArgument() +print("Importing .TIFF sequence:") +print(filelist) +run("Image Sequence...", "open=" + filelist + " sort use"); +print("Done.") \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 5de0f65..3fd8ce6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,23 +25,17 @@ classifiers = [ "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", "Topic :: Scientific/Engineering", "Topic :: Utilities", ] requires-python = ">=3.8" dynamic = ["version", "description"] dependencies = [ + "tomopy", "pathlib", -# "logging", -# "random", -# "time", -# "math", - "numpy", "solara", "plotly", "dxchange", - "tomopy", "pyyaml", "numpy", "tifffile", @@ -50,6 +44,8 @@ dependencies = [ [project.optional-dependencies] all = [ + "pandas", + "astra-toolbox::astra-toolbox", "gspread", "gspread_dataframe", "oauth2client",