**********************************************
PICSL Histology Annotation Service Quick Start
**********************************************
This quick start shows you how to get started with the PHAS server using a sample dataset.
Prerequisites
=============
* A Linux/MacOS machine with Python3 (or `Docker `_)
* An open port on this machine. We will assume port number **8888**.
Install OpenSlide
-----------------
The `OpenSlide library `_ is required and must be installed sepately from the Python dependencies. This is not required for Docker-based installations.
* On Debian/Ubuntu::
apt-get install -y libopenslide-dev
* On MacOS::
brew install openslide
Install PHAS
============
Three installation options are available in this tutorial:
pip
This is the simplest option and is recommended for most users. PHAS will be installed as a Python package in a virtual environment.
git
This is the recommended option for those who would like to use the bleeding edge version of PHAS or to modify the source code.
Docker
Running PHAS in a Docker container that we provide is a good solution for Windows users. Another advantage of the Docker container is that it is already set up for running PHAS in production mode with the ``nginx`` web server.
Install using ``pip``
---------------------
Create a directory where you will store all the files for your PHAS installation. This directory will contain your configuration, your database, and other important files. In this tutorial we will assume your Linux username is ``foo`` and that your installation directory is ``/home/foo/phas``. This command will create this directory::
# Change to match your username and preferred location
mkdir -p /home/foo/phas
Next, create a virtual environment that will contain PHAS and all the Python modules on which it depends::
cd /home/foo/phas
python3 -m venv .venv
source .venv/bin/activate
Now, install the PHAS package::
pip install phas
Finally, create the instance directory. This directory will contain your PHAS database, configuration scripts, and other important files::
mkdir -p instance
The full path to the instance directory will be ``/home/foo/phas/instance``.
Install using ``git``
---------------------
In this tutorial we will assume your Linux username is ``foo`` and that your installation directory is ``/home/foo/phas``. This command will clone the PHAS repository in this directory::
git clone https://github.com/pyushkevich/histoannot.git /home/foo/phas
Next, enter this directory and create a virtual environment that will contain all the Python modules on which PHAS depends::
cd /home/foo/phas
python3 -m venv .venv
source .venv/bin/activate
Now, install all the PHAS dependencies::
pip install -r phas/requirements.txt
Finally, create the instance directory. This directory will contain your PHAS database, configuration scripts, and other important files::
mkdir -p instance
The full path to the instance directory will be ``/home/foo/phas/instance``.
Install using Docker
--------------------
To run the Docker container, you need to create an instance directory somewhere on your computer. In this tutorial we assume that you created an instance directory called ``/home/foo/phas/instance``. Replace this with the actual name of your instance directory. For example, on Windows, this could be ``C:\Users\foo\phas\instance``.
You also need to point the container to the directory with your histology slides. In this tutorial, we assume that your data are organized in the folder ``/data/archive``, and you should replace this with your own path. Finally, you may want to replace ``8888`` with the port number at which you would like to be able to access the PHAS web application.
To launch the docker container, execute:
.. code-block:: Bash
docker run -d -p 8888:80 --name phas \
-v /data/archive:/data \
-v /home/foo/phas/instance:/instance \
pyushkevich/phas:latest
After running the command above, you should be able to access the web application by pointing your browser to ``http://localhost:8888``. At this point, you should see a login page.
To restart the container (after making changes to your configuration below), you can run:
.. code-block:: bash
docker restart phas
To interact with the application using ``flask ...`` commands (which are introduced below and used to configure users, projects, and tasks) use the following commands:
.. code-block:: bash
docker exec -it phas /bin/bash
source env.sh
Configuration and Launching
===========================
These instructions are slightly different for the native (``pip`` or ``git``) and Docker-based installations.
Setup the Environment
---------------------
* *Skip this step for Docker-based installations.*
Create a shell script ``env.sh`` in the directory ``/home/foo/phas`` with the contents below, modified to fit your installation.
.. code-block:: Bash
#!/bin/bash
source .venv/bin/activate
# Name of the FLASK application
export FLASK_APP=phas
# Path to the instance directory
export FLASK_INSTANCE_PATH=/home/foo/phas/instance
# On Mac, if using homebrew to install openslide, set this to the location of the openslide library
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/opt/homebrew/lib
Before executing the “flask” commands below, run once per terminal session::
source env.sh
Create Flask Configuration File
-------------------------------
In your instance directory (``/home/foo/phas/instance``), create a file ``config.py`` and add the lines below, customizing them for your installation. Replace the secret key `with your own `_.
.. code-block:: Python
# Replace with your own random sequence
SECRET_KEY="cf55754542254a76fbd839970ddd55fee4088ed594511c90ea3976428a851374"
# Name of your server printed on the landing page
HISTOANNOT_PUBLIC_NAME="My Test PHAS Server"
# URL for your PHAS installation
HISTOANNOT_PUBLIC_URL="http://127.0.0.1:8888"
# Optionally, enable a guest user account (comment out if not needed)
HISTOANNOT_GUEST_USER="guest"
Database Creation
-----------------
Run this command to create the sqlite3 database structure for the first time::
flask init-db
Test Your Configuration
-----------------------
If successful, the command below will print the configuration settings you provided above and list the tables in the database (about 20)::
flask info
Start the Web Application
-------------------------
* *Skip this step for Docker-based installations. The web application is launched automatically when you run the Docker container.*
To test-drive PHAS, you can use the command below to launch the web application. However, when in production, you should use ``nginx`` and ``uwsgi`` to launch your application instead, as described in :doc:`production`.
.. code-block:: Bash
flask run --debug --port 8888
You will see this output::
* Serving Flask app 'histoannot'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:8888
Press CTRL+C to quit
Navigate to the URL provided (http://127.0.0.1:8888) and you should see the login page.
Start the Slide Server Process
------------------------------
* *Skip this step for Docker-based installations. The slide server is launched automatically when you run the Docker container.*
In addition to running the main web application with ``flask run``, you need to launch the slide server process, which manages the interface between the web application and the histology images. The server process should be run in a **separate terminal window**.
Open a new terminal window and navigate to the ``/home/foo/phas`` directory::
source env.sh
flask slide-server-run
Creating Users, Projects and Tasks
==================================
Open a separate terminal window or tab so that you can interact with the server while it is running. In the terminal go to your ``/home/foo/phas`` directory and run, as before::
source env.sh
For Docker installations, open a terminal window and run::
docker exec -it phas /bin/bash
source env.sh
Create Admin User Account
-------------------------
Create a user (replace ``testuser`` with your own id) and provide them administrator privileges::
flask users-add -e testuser@gmail.com testuser
flask users-set-site-admin test user
This will print a URL. Navigate to this URL and set up the password for your account. Now you should see the landing page with the message that you have not been added to any projects yet.
* You can click on your username on the top right of the web application to change your profile and manage other users on the server.
Download Sample Dataset
-----------------------
The easiest way to get started with PHAS is to download a sample dataset. It contains some blockface images of brain tissue prior to cryosectioning. Download the dataset ``histoannot_sample_data.zip`` from ``_ and unpack it into a folder separate from your main PHAS install. Let’s suppose you called this folder ``/data/archive/histoannot_sample_data``.
Create a directory where you will keep the json descriptor files used to configure projects and tasks::
mkdir instance/json
Create a json descriptor file for the project you downloaded, called ``instance/json/example_project.json``, with the contents below:
.. code-block:: json
{
"base_url": "/data/archive/histoannot_sample_data",
"disp_name": "Example Project",
"desc": "Example project with some blockface images",
"manifest_mode": "individual_json",
"url_schema": {
"pattern": {
"raw": "{specimen}/raw/{slide_name}.{slide_ext}",
"thumb": "{specimen}/proc/{slide_name}_thumb.png",
"metadata": "{specimen}/proc/{slide_name}_metadata.json"
},
"raw_slide_ext": [ "tiff" ]
}
}
* For Docker installations, ``base-url`` should be relative to the directory ``/data``, which is the path on the container to which you mapped your data directory when calling ``docker run``. For example, if you placed the sample dataset in ``/home/foo/phas/histology_data/histoannot_sample_data``, then ``base_url`` should be set to ``/data/histoannot_sample_data``.
The commands below configure the project and add your username to it as administrator::
flask project-add example instance/json/example_project.json
flask users-set-access-level -p example admin testuser
The commands below import slides from the sample project into the database. You should run this command every time that new slides are added to your data folder::
flask refresh-slides example
If you edit the ``.json`` file later, you need to run the command below for your edits to take effect::
flask project-update example instance/json/example_project.json
Configure Browse and Annotation Tasks
-------------------------------------
If you browse to your PHAS URL, you will see that there is a project with one specimen and four slides. However, you cannot view these slides yet because we have not yet set up any tasks. Tasks are specific ways of interacting with histology images, and they include browsing, annotation, placing boxes for training classifiers, and placing sampling regions.
Each task is specified by creating a json configuration file.
Create file ``instance/json/example_browse.json`` for the browsing task with contents:
.. code-block:: json
{
"restrict-access": false,
"mode": "browse",
"name": "Browse",
"desc": "Browse the slide collection"
}
And create file ``instance/json/example_annot.json`` for the annotation task with contents:
.. code-block:: json
{
"restrict-access": true,
"mode": "annot",
"name": "Anatomical Labeling",
"desc": "Labeling anatomical boundaries and regions"
}
The commands below will intialize these tasks and rebuild the slide index for the tasks::
flask tasks-add example instance/json/example_browse.json
flask tasks-add example instance/json/example_annot.json
flask rebuild-task-slide-index example
You will be able to see the Browse task immediately. To see the Annotation task, go to the “manage users” menu option under your username and give yourself write access to the task. Alternatively, you can use the ``flask users-set-access-level`` command with -t flag to give yourself write access to the newly created task.
Configure a Classification Training Task
----------------------------------------
To create a classifier training task, we first need to create a set of classification labels. Create the file ``instance/json/blockface_labels.json`` with contents:
.. code-block:: json
[
{ "name" : "gray matter", "color" : "#18b497", "description" : "Gray Matter" },
{ "name" : "white matter", "color" : "#2816ba", "description" : "White Matter" },
{ "name" : "background", "color" : "#f97a8a", "description" : "Ice/Background" }
]
Then add this labelset to the server::
flask labelset-add example blockface_tissue_types instance/json/blockface_labels.json
The labelset should be available for editing under the dropdown menus on the project menu in the web interface.
Then create a task descriptor for generating training patches in file ``instance/json/example_training.json`` with contents:
.. code-block:: json
{
"restrict-access": false,
"name": "Tissue Class Training",
"stains": [
"blockface"
],
"dltrain": {
"labelset": "blockface_tissue_types",
"min-size": 128,
"max-size": 128,
"display-patch-size": 128
},
"mode": "dltrain",
"desc": "Training a deep learning classifier to segment blockface images"
}
Then add the task to the server::
flask tasks-add example instance/json/example_training.json
flask rebuild-task-slide-index example
Now the task will be available in the web interface.
Configure a Sampling ROI Task
-----------------------------
A sampling ROI task allows you to define sampling ROIs from which quantitative measures can be derived. To set up this task we also first have to define labels.
Create the file ``instance/json/sampling_labels.json`` with contents:
.. code-block:: json
[
{
"name": "Hipp",
"color": "#ff3300",
"description": "Hipppocampus"
},
{
"name": "PHG",
"color": "#ff6600",
"description": "Parahippocampal Gyrus"
},
{
"name": "FuG",
"color": "#ff6699",
"description": "Fusiform Gyrus"
}
]
And create the task descriptor file ``instance/json/example_sroi.json`` with contents:
.. code-block:: json
{
"restrict-access": false,
"name": "Sampling ROI Placement",
"desc": "Placement of Sampling ROIs for Quantification",
"mode": "sampling",
"sampling": {
"labelset": "blockface_srois"
}
}
Then add the labelset and task to the server::
flask labelset-add example blockface_srois instance/json/sampling_labels.json
flask tasks-add example instance/json/example_sroi.json
flask rebuild-task-slide-index example