diff --git a/talks/introduction/example_project/myscript.py b/talks/introduction/example_project/myscript.py new file mode 100644 index 0000000000000000000000000000000000000000..3b768e3f0f9e01019ec53b555ddbcacb3fa1174f --- /dev/null +++ b/talks/introduction/example_project/myscript.py @@ -0,0 +1,47 @@ +#!/usr/bin/env fslpython + +# That first line up there ensures that your +# script will be executed in the fslpython +# environment. If you are writing a general +# Python script, you should use this line +# instead: #!/usr/bin/env python + + +# In Python, we need to "import" libraries +# (called modules) before we can use them. +import sys +import nibabel as nib + +# Python uses indentation instead of braces +# for all of its control structures - if +# while, and for statements, functions and +# classes, and so on and so forth. +# +# The standard convention for indentation +# is four spaces. Please don't use tab +# characters! +def main(): + + # We can get to our command + # line arguments via sys.argv + fpath = sys.argv[1] + + # We can use nibabel to load + # NIFTI images (and other + # neuroimaging data formats) + img = nib.load(fpath) + data = img.get_data() + + # Now we're working with a + # numpy array. + nzmean = data[data != 0].mean() + + print('mean:', nzmean) + + sys.exit(0) + + +# This bit is the Python equivalent of +# "int main()" in a C or C++ program. +if __name__ == '__main__': + main() diff --git a/talks/introduction/pytreat_intro.ipynb b/talks/introduction/pytreat_intro.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..270b2b264db137fb6bb4101c1dd00a3bd2b0eb42 --- /dev/null +++ b/talks/introduction/pytreat_intro.ipynb @@ -0,0 +1,610 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Welcome to the WIN PyTreat 2018!\n", + "\n", + "\n", + "Program: https://docs.google.com/document/d/10CwLEhUi-YiwfC2F40QCVm6eEVwKiaXkfTKz67xWAfM/edit?usp=sharing\n", + "\n", + "\n", + "__Get your laptop ready!__\n", + "\n", + "__Make sure you have FSL 5.0.10 installed and working!__\n", + "\n", + "__Open this page in your web browser!__\n", + "\n", + "https://git.fmrib.ox.ac.uk/fsl/pytreat-2018-practicals/tree/master/talks/introduction/pytreat_intro.ipynb\n", + "\n", + "\n", + "## Overview\n", + "\n", + "\n", + "* [Python in a nutshell](#python-in-a-nutshell)\n", + "* [`fslpython`](#fslpython)\n", + "* [Running Python scripts](#running-python-scripts)\n", + "* [Interactive Python: IPython](#interactive-python-ipython)\n", + "* [Python editors](#python-editors)\n", + "* [Python in your browser: Jupyter Notebook](#python-in-your-browser-jupyter-notebook)\n", + "* [Git](#git)\n", + "* [The PyTreat practicals](#the-pytreat-practicals)\n", + "\n", + "\n", + "<a class=\"anchor\" id=\"python-in-a-nutshell\"></a>\n", + "## Python in a nutshell\n", + "\n", + "\n", + "### Pros\n", + "\n", + "\n", + "* _Flexible_ Feel free to use functions, classes, objects, modules and\n", + " packages. Or don't - it's up to you!\n", + "\n", + "* _Fast_ If you do things right (in other words, if you use `numpy`)\n", + "\n", + "* _Dynamically typed_ No need to declare your variables, or specify their\n", + " types." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = 'Great, I am _so_ sick of writing \"char *a;\"!'\n", + "print(a)\n", + "\n", + "a = 12345\n", + "print('a is now an number!', a)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* _Intuitive syntax_ How do I run some code for each of the elements in my\n", + " list?" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "a = [1, 2, 3, 4, 5]\n", + "\n", + "for elem in a:\n", + " print(elem)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cons\n", + "\n", + "* _Dynamically typed_ Easier to make mistakes, harder to catch them\n", + "\n", + "* _No compiler_ See above\n", + "\n", + "* _Slow_ if you don't do things the right way\n", + "\n", + "* _Python 2 is not the same as Python 3_ But there's an easy solution: Forget\n", + " that Python 2 exists.\n", + "\n", + "* _Hard to manage different versions of python_ But we have a solution for\n", + " you: `fslpython`.\n", + "\n", + "\n", + "<a class=\"anchor\" id=\"fslpython\"></a>\n", + "## `fslpython`\n", + "\n", + "\n", + "FSL 5.0.10 and newer comes with its own version of Python, bundled with nearly\n", + "all of the scientific libraries that you are likely to need.\n", + "\n", + "\n", + "So if you use `fslpython` for all of your development, you can be sure that it\n", + "will work in FSL!\n", + "\n", + "\n", + "> `fslpython` is based on _conda_ and, in FSL 5.0.10, is Python version\n", + "> 3.5.2. You can read more about conda [here](https://conda.io/docs/).\n", + "\n", + "\n", + "<a class=\"anchor\" id=\"running-python-scripts\"></a>\n", + "## Running Python scripts\n", + "\n", + "\n", + "Here's a basic Python script:\n", + "\n", + "\n", + "> ```\n", + "> #!/usr/bin/env fslpython\n", + ">\n", + "> # That first line up there ensures that your\n", + "> # script will be executed in the fslpython\n", + "> # environment. If you are writing a general\n", + "> # Python script, you should use this line\n", + "> # instead: #!/usr/bin/env python\n", + ">\n", + ">\n", + "> # In Python, we need to \"import\" libraries\n", + "> # (called modules) before we can use them.\n", + "> import sys\n", + "> import nibabel as nib\n", + ">\n", + "> # Python uses indentation instead of braces\n", + "> # for all of its control structures - if\n", + "> # while, and for statements, functions and\n", + "> # classes, and so on and so forth.\n", + "> #\n", + "> # The standard convention for indentation\n", + "> # is four spaces. Please don't use tab\n", + "> # characters!\n", + "> def main():\n", + ">\n", + "> # We can get to our command\n", + "> # line arguments via sys.argv\n", + "> fpath = sys.argv[1]\n", + ">\n", + "> # We can use nibabel to load\n", + "> # NIFTI images (and other\n", + "> # neuroimaging data formats)\n", + "> img = nib.load(fpath)\n", + "> data = img.get_data()\n", + ">\n", + "> # Now we're working with a\n", + "> # numpy array.\n", + "> nzmean = data[data != 0].mean()\n", + ">\n", + "> print('mean:', nzmean)\n", + ">\n", + "> sys.exit(0)\n", + ">\n", + ">\n", + "> # This bit is the Python equivalent of\n", + "> # \"int main()\" in a C or C++ program.\n", + "> if __name__ == '__main__':\n", + "> main()\n", + "> ```\n", + "\n", + "\n", + "__Exercise__ Save the above code to a file called `script.py`, then run this\n", + "in a terminal (replace `/path/to/some/image.nii.gz` with a path to some image\n", + "on your computer):\n", + "\n", + "\n", + "> ```\n", + "> chmod a+x script.py\n", + "> ./script.py /path/to/some/image.nii.gz\n", + "> ```\n", + "\n", + "\n", + "<a class=\"anchor\" id=\"interactive-python-ipython\"></a>\n", + "## Interactive Python: IPython\n", + "\n", + "\n", + "Python is an [_interpreted\n", + "language_](https://en.wikipedia.org/wiki/Interpreted_language), like MATLAB. So\n", + "you can either write your code into a file, and then run that file, or you can\n", + "type code directly into a Python interpreter.\n", + "\n", + "\n", + "Python has a standard interpreter built-in - run `fslpython` in a terminal,\n", + "and see what happens (use CTRL+D to exit).\n", + "\n", + "\n", + "__But__ there is another interpreter called [`ipython`](https://ipython.org/)\n", + "which is vastly superior to the standard Python interpreter. Use `ipython`\n", + "instead! It is already installed in `fslpython`, but we just need to create a\n", + "link to it - do this now in a terminal:\n", + "\n", + "\n", + "> ```\n", + "> # You might need to \"sudo\" this\n", + "> # if your version of FSL needs\n", + "> # admin privileges to modify.\n", + "> ln -s $FSLDIR/fslpython/envs/fslpython/bin/ipython $FSLDIR/bin/fslipython\n", + "> ```\n", + "\n", + "\n", + "Now if you want to do some interactive work, you can use `fslipython` in a\n", + "terminal.\n", + "\n", + "\n", + "__Exercise__ Do it now! Start `fslipython`, then copy/paste this code into the\n", + "prompt!\n", + "\n", + "\n", + "> ```\n", + "> # this line is not python - it is\n", + "> # specific to ipython/jupyter notebook\n", + "> %matplotlib\n", + ">\n", + "> import numpy as np\n", + ">\n", + "> x = np.concatenate(([0.25, 0.75], np.arange(0.1, 1.0, 0.1)))\n", + "> y = np.concatenate(([0.75, 0.75], -np.sin(np.linspace(np.pi / 4, 3 * np.pi / 4, 9))))\n", + ">\n", + "> import matplotlib.pyplot as plt\n", + ">\n", + "> fig = plt.figure()\n", + "> ax = fig.add_subplot(111)\n", + ">\n", + "> ax.scatter(x, y)\n", + "> ```\n", + "\n", + "\n", + "<a class=\"anchor\" id=\"python-editors\"></a>\n", + "## Python editors\n", + "\n", + "\n", + "> Summary:\n", + "> - Make your tab key insert four spaces. Don't use tab characters in Python\n", + "> code.\n", + ">\n", + "> - Use [Spyder](https://pythonhosted.org/spyder/) if you want a MATLAB-like\n", + "> envionment (focus on analysis, rather than coding).\n", + ">\n", + "> - Use [PyCharm](https://www.jetbrains.com/pycharm/) if you want an IDE-like\n", + "> environment (focus on coding, rather than analysis).\n", + ">\n", + "> - Use [Atom](https://atom.io/) or [VS Code](https://code.visualstudio.com/)\n", + "> if you like using the latest and greatest.\n", + ">\n", + "> - If you like your existing editor, use it. But you will be better off if\n", + "> you can integrate it with `fslpython`, [pylint](https://www.pylint.org/)\n", + "> and [pyflakes](https://github.com/PyCQA/pyflakes).\n", + "\n", + "\n", + "You can use any text editor that you want to edit Python files. But the one\n", + "golden rule that you must follow, no matter what editor you use:\n", + "\n", + "\n", + "__Configure your tab key to insert four spaces. Don't use tab characters in\n", + "Python code!__\n", + "\n", + "\n", + "This is the [standard\n", + "convention](https://www.python.org/dev/peps/pep-0008/#indentation) for Python\n", + "code. If you deviate from this convention, and somebody else needs to work\n", + "with your code, they will be angry at you!\n", + "\n", + "\n", + "Now, with that out of the way, there are several good Python editors available\n", + "to you. If you are getting started with Python, we recommend\n", + "[PyCharm](https://www.jetbrains.com/pycharm/) or\n", + "[Spyder](https://pythonhosted.org/spyder/).\n", + "\n", + "\n", + "If you are used to MATLAB, and you do a lot of experimenting or interactive\n", + "work, then you might like Spyder. If you spend most of your time writing code\n", + "rather than experimenting, then go with PyCharm.\n", + "\n", + "\n", + "### Spyder\n", + "\n", + "\n", + "Spyder is a MATLAB-like environment for Python. It has a code editor and an\n", + "interactive IPython prompt. You can inspect variables that are in your\n", + "workspace, plot data, and so on and so forth.\n", + "\n", + "\n", + "Beyond that, Spyder is fairly simple - it does not have much in the way of\n", + "project management tools, or integration with version control (i.e. `git`).\n", + "\n", + "\n", + "Spyder can be installed directly into `fslpython`:\n", + "\n", + "\n", + "> ```\n", + "> # If your FSL installation requires\n", + "> # administrative privileges to modify,\n", + "> # you will need to prefix these\n", + "> # commands with sudo.\n", + "> $FSLDIR/fslpython/bin/conda install -n fslpython -y spyder\n", + "> ln -s $FSLDIR/fslpython/envs/fslpython/bin/spyder $FSLDIR/bin/fslspyder\n", + "> ```\n", + "\n", + "\n", + "Now to run Spyder, you can just type:\n", + "\n", + "\n", + "> ```\n", + "> fslspyder &\n", + "> ```\n", + "\n", + "\n", + "Now you need to make sure that Spyder is using the `fslpython` environment to\n", + "run your code.\n", + "\n", + "\n", + "1. Go to _python_ (the menu) > _Preferences_ > Python Interpreter\n", + "2. Make sure that _Use the following Python interpreter_ is selected\n", + "3. Make sure that the path is `$FSLDIR/fslpython/envs/fslpython/bin/python`\n", + " (for your specific value of `$FSLDIR`).\n", + "\n", + "\n", + "Type the following into the console to test that everything is working:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.plot([1, 2, 3], [4, 5, 6])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### PyCharm\n", + "\n", + "\n", + "PyCharm is a general-purpose Python development environment. Unlike Spyder, it\n", + "does not have an integrated console or variable explorer. But it has more\n", + "tools to help you write code, and better file management/version control\n", + "integration.\n", + "\n", + "\n", + "And it is also easy to install - simply download the Community edition from\n", + "the [home page](https://www.jetbrains.com/pycharm/). Then, if you are on a\n", + "mac, double-click the `.dmg` file, and drag PyCharm into your `/Applications/`\n", + "folder. Then double-click on PyCharm to start it.\n", + "\n", + "\n", + "Once you have chosen a theme, you will be asked if you would like to create a\n", + "_Launcher script_ - do this, because you will then be able to open files from\n", + "the terminal by typing `charm [filename]`.\n", + "\n", + "\n", + "Now you will be presented with a _Welcome to PyCharm_ window. __Before doing\n", + "anything else__, click on the _Configure_ button down in the bottom right, and\n", + "choose _Preferences_. Then in the _Project Interpreter_ section:\n", + "\n", + "\n", + "1. Click on the gear button and choose _Add local..._\n", + "2. Choose _Existing environment_\n", + "3. Click on the _..._ button, and navigate to\n", + " `$FSLDIR/fslpython/envs/fslpython/bin/python`.\n", + "\n", + "\n", + "### Other options\n", + "\n", + "\n", + "Emacs is capable of being used as a fully-fledged Python IDE, if you have the\n", + "time and patience to configure it.\n", + "\n", + "If you are the fashionable sort, try one of these:\n", + "\n", + "- [Visual Studio Code](https://code.visualstudio.com/)\n", + "- [Atom](https://atom.io/)\n", + "\n", + "\n", + "<a class=\"anchor\" id=\"python-in-your-browser-jupyter-notebook\"></a>\n", + "## Python in your browser: Jupyter Notebook\n", + "\n", + "\n", + "It is possible to do your Python-based development and experimentation inside\n", + "your web browser, thanks to the [Jupyter project](https://jupyter.org/).\n", + "\n", + "\n", + "Jupyter works in the following way:\n", + "\n", + "1. You start a Juptyer web server on your computer. This web server provides\n", + " the environment in which your Python code is executed.\n", + "\n", + "2. You open https://localhost:8888 (or similar) in a web browser - this opens\n", + " a connection to the (locally running) web server.\n", + "\n", + "3. You start a \"Notebook\" (Jupyter's version of a file), and start typing.\n", + " You can put text, LaTeX, and of course Python code into a notebook.\n", + "\n", + "4. All of the code that you write gets sent to the web server and\n", + " executed. Then the results get sent back to the web browser, and displayed\n", + " in your notebook - magic!\n", + "\n", + "\n", + "All of the PyTreat practicals are written in a Jupyter notebook. Some of the\n", + "talks are too - you're looking at a Jupyter Notebook right now!\n", + "\n", + "\n", + "So you're going to need to install Jupyter to get the most out of the\n", + "practicals that we have prepared for you.\n", + "\n", + "\n", + "__Exercise__ Install Jupyter into `fslpython` - run these commands in a\n", + "terminal:\n", + "\n", + "\n", + "> ```\n", + "> # Remember to prefix with sudo if your\n", + "> # FSL install needs admin to modify.\n", + "> $FSLDIR/fslpython/bin/conda install -n fslpython -y jupyter\n", + "> ln -s $FSLDIR/fslpython/envs/fslpython/bin/jupyter $FSLDIR/bin/fsljupyter\n", + "> ```\n", + "\n", + "\n", + "<a class=\"anchor\" id=\"git\"></a>\n", + "## Git\n", + "\n", + "\n", + "All the cool kids these days use [git](https://git-scm.com/) to\n", + "collaboratively work on their Python code.\n", + "\n", + "\n", + "Git is different from CVS and SVN in that it is _distributed_. In CVS and SVN,\n", + "there is only one central repository. You check out a copy of the source from\n", + "the repository, make some changes, and then commit those changes back to the\n", + "central repository.\n", + "\n", + "\n", + "In git, there are multiple repositories. There is usually one repository which\n", + "acts as the central one, but you will _clone_ (or _fork_) that central\n", + "repository to create your own full copy of the repository.\n", + "\n", + "\n", + "Then, you can make changes and commit them in your own repository. And at any\n", + "point, you can push your changes back to the central repository.\n", + "\n", + "\n", + "### WIN's gitlab server\n", + "\n", + "\n", + "https://git.fmrib.ox.ac.uk/\n", + "\n", + "\n", + "If you have a FMRIB account, then you also have a Gitlab account. Gitlab is a\n", + "git server that you can use to store your \"central\" git repository. Gitlab is\n", + "very similar to https://www.github.com, but it is managed by WIN, and your\n", + "code is not publicly visible (although it can be if you want). Gitlab backs\n", + "up your code automatically, and has a nice web interface.\n", + "\n", + "You can have up to 10 projects on your gitlab account - talk to the FMRIB IT\n", + "people if you need more.\n", + "\n", + "\n", + "### Using git and gitlab\n", + "\n", + "\n", + "> We need to go through a couple of intiial configuration steps before\n", + "> proceeding. You only need to do this once (for each computer that you use).\n", + ">\n", + "> First, run these commands to configure git on your system.\n", + ">\n", + "> ```\n", + "> git config --global user.name \"Your name\"\n", + "> git config --global user.email \"Your email address\"\n", + "> ```\n", + ">\n", + "> Now you need to create a SSH key pair, so your computer can talk to the\n", + "> gitlab server without you having to log in. Don't be scared - there are\n", + "> detailed instructions on doing this at\n", + "> https://git.fmrib.ox.ac.uk/help/ssh/README.md - follow the instructions\n", + "> under the section entitled __Generating a new SSH key pair__.\n", + "\n", + "\n", + "Working with git and gitlab generally involves these steps:\n", + "\n", + "1. Add new files to your local repository, or make changes to existing files.\n", + "2. Run `git add` on the new/changed files to _stage_ them.\n", + "3. Run `git commit` to commit all staged changes to your local repository.\n", + "4. Run `git push` to push those changes to your gitlab repository.\n", + "\n", + "\n", + "When you start working on a new project (or if you have an existing project\n", + "that you want to put into git):\n", + "\n", + "\n", + "__1. Create a project directory__\n", + "\n", + "Or navigate to your existing project directory.\n", + "\n", + "\n", + "__2. Turn the directory into a git repository__\n", + "\n", + "> ```\n", + "> cd path/to/super/cool/project\n", + "> git init\n", + "> ```\n", + "\n", + "\n", + "__3. Add your files to git__\n", + "\n", + "If you want to add all of the files in your project directory into git, type\n", + "this:\n", + "\n", + "> ```\n", + "> git add .\n", + "> ```\n", + "\n", + "\n", + "Otherwise, if you only want certain files in git, then `git add` them one by\n", + "one (or with standard bash file patterns).\n", + "\n", + "You should avoid putting large binary files or data files into git - it works\n", + "best with source code. Talk to the FMRIB IT people if you really need to store\n", + "large files in git, as they can help you with this.\n", + "\n", + "\n", + "__4. Commit your changes__\n", + "\n", + "\n", + "> ```\n", + "> git commit -m \"A useful message describing the changes you are committing.\"\n", + "> ```\n", + "\n", + "\n", + "__5. Create a repository for your project on gitlab__\n", + "\n", + "\n", + "Log in to gitlab (https://git.fmrib.ox.ac.uk/), then click on the _+_ button\n", + "towards the top right, and select _New project_. Give the project a name and\n", + "choose its visiblity (note that _Public_ means your project will be visible to\n", + "the world).\n", + "\n", + "\n", + "Now, follow the instructions under __Existing Git repository__ to \"link\" your\n", + "local project repository to the one on gitlab.\n", + "\n", + "\n", + "__6. Develop your super cool project!__\n", + "\n", + "\n", + "Now you can get to work! Whenever you make changes to your code that you want\n", + "saved, follow the `git add`, `git commit`, `git push` steps described above.\n", + "\n", + "\n", + "For example, let's say we have added a new file called `cool_module.py`. To\n", + "get this into git, we would do the following:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "git add cool_module.py\n", + "git commit -m \"Added cool module. It's super cool\"\n", + "git push origin master" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "<a class=\"anchor\" id=\"the-pytreat-practicals\"></a>\n", + "## The PyTreat practicals\n", + "\n", + "\n", + "All of the practicals for PyTreat are hosted in a git repository at:\n", + "\n", + "\n", + "https://git.fmrib.ox.ac.uk/fsl/pytreat-2018-practicals\n", + "\n", + "\n", + "So let's go get them!\n", + "\n", + "\n", + "> ```\n", + "> git clone git@git.fmrib.ox.ac.uk:fsl/pytreat-2018-practicals.git\n", + "> cd pytreat-2018-practicals\n", + "> fsljupyter notebook\n", + "> ```" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/talks/introduction/pytreat_intro.md b/talks/introduction/pytreat_intro.md new file mode 100644 index 0000000000000000000000000000000000000000..cc9c4fce4d121ee0f4a8d698a813d2c369019246 --- /dev/null +++ b/talks/introduction/pytreat_intro.md @@ -0,0 +1,565 @@ +# Welcome to the WIN PyTreat 2018! + + +Program: https://docs.google.com/document/d/10CwLEhUi-YiwfC2F40QCVm6eEVwKiaXkfTKz67xWAfM/edit?usp=sharing + + +__Get your laptop ready!__ + +__Make sure you have FSL 5.0.10 installed and working!__ + +__Open this page in your web browser!__ + +https://git.fmrib.ox.ac.uk/fsl/pytreat-2018-practicals/tree/master/talks/introduction/pytreat_intro.ipynb + + +## Overview + + +* [Python in a nutshell](#python-in-a-nutshell) +* [`fslpython`](#fslpython) +* [Running Python scripts](#running-python-scripts) +* [Interactive Python: IPython](#interactive-python-ipython) +* [Python editors](#python-editors) +* [Python in your browser: Jupyter Notebook](#python-in-your-browser-jupyter-notebook) +* [Git](#git) +* [The PyTreat practicals](#the-pytreat-practicals) + + +<a class="anchor" id="python-in-a-nutshell"></a> +## Python in a nutshell + + +### Pros + + +* _Flexible_ Feel free to use functions, classes, objects, modules and + packages. Or don't - it's up to you! + +* _Fast_ If you do things right (in other words, if you use `numpy`) + +* _Dynamically typed_ No need to declare your variables, or specify their + types. + + +``` +a = 'Great, I am _so_ sick of writing "char *a;"!' +print(a) + +a = 12345 +print('a is now an number!', a) +``` + + +* _Intuitive syntax_ How do I run some code for each of the elements in my + list? + + +``` +a = [1, 2, 3, 4, 5] + +for elem in a: + print(elem) +``` + + +### Cons + +* _Dynamically typed_ Easier to make mistakes, harder to catch them + +* _No compiler_ See above + +* _Slow_ if you don't do things the right way + +* _Python 2 is not the same as Python 3_ But there's an easy solution: Forget + that Python 2 exists. + +* _Hard to manage different versions of python_ But we have a solution for + you: `fslpython`. + + +<a class="anchor" id="fslpython"></a> +## `fslpython` + + +FSL 5.0.10 and newer comes with its own version of Python, bundled with nearly +all of the scientific libraries that you are likely to need. + + +So if you use `fslpython` for all of your development, you can be sure that it +will work in FSL! + + +> `fslpython` is based on _conda_ and, in FSL 5.0.10, is Python version +> 3.5.2. You can read more about conda [here](https://conda.io/docs/). + + +<a class="anchor" id="running-python-scripts"></a> +## Running Python scripts + + +Here's a basic Python script: + + +> ``` +> #!/usr/bin/env fslpython +> +> # That first line up there ensures that your +> # script will be executed in the fslpython +> # environment. If you are writing a general +> # Python script, you should use this line +> # instead: #!/usr/bin/env python +> +> +> # In Python, we need to "import" libraries +> # (called modules) before we can use them. +> import sys +> import nibabel as nib +> +> # Python uses indentation instead of braces +> # for all of its control structures - if +> # while, and for statements, functions and +> # classes, and so on and so forth. +> # +> # The standard convention for indentation +> # is four spaces. Please don't use tab +> # characters! +> def main(): +> +> # We can get to our command +> # line arguments via sys.argv +> fpath = sys.argv[1] +> +> # We can use nibabel to load +> # NIFTI images (and other +> # neuroimaging data formats) +> img = nib.load(fpath) +> data = img.get_data() +> +> # Now we're working with a +> # numpy array. +> nzmean = data[data != 0].mean() +> +> print('mean:', nzmean) +> +> sys.exit(0) +> +> +> # This bit is the Python equivalent of +> # "int main()" in a C or C++ program. +> if __name__ == '__main__': +> main() +> ``` + + +__Exercise__ Save the above code to a file called `script.py`, then run this +in a terminal (replace `/path/to/some/image.nii.gz` with a path to some image +on your computer): + + +> ``` +> chmod a+x script.py +> ./script.py /path/to/some/image.nii.gz +> ``` + + +<a class="anchor" id="interactive-python-ipython"></a> +## Interactive Python: IPython + + +Python is an [_interpreted +language_](https://en.wikipedia.org/wiki/Interpreted_language), like MATLAB. So +you can either write your code into a file, and then run that file, or you can +type code directly into a Python interpreter. + + +Python has a standard interpreter built-in - run `fslpython` in a terminal, +and see what happens (use CTRL+D to exit). + + +__But__ there is another interpreter called [`ipython`](https://ipython.org/) +which is vastly superior to the standard Python interpreter. Use `ipython` +instead! It is already installed in `fslpython`, but we just need to create a +link to it - do this now in a terminal: + + +> ``` +> # You might need to "sudo" this +> # if your version of FSL needs +> # admin privileges to modify. +> ln -s $FSLDIR/fslpython/envs/fslpython/bin/ipython $FSLDIR/bin/fslipython +> ``` + + +Now if you want to do some interactive work, you can use `fslipython` in a +terminal. + + +__Exercise__ Do it now! Start `fslipython`, then copy/paste this code into the +prompt! + + +> ``` +> # this line is not python - it is +> # specific to ipython/jupyter notebook +> %matplotlib +> +> import numpy as np +> +> x = np.concatenate(([0.25, 0.75], np.arange(0.1, 1.0, 0.1))) +> y = np.concatenate(([0.75, 0.75], -np.sin(np.linspace(np.pi / 4, 3 * np.pi / 4, 9)))) +> +> import matplotlib.pyplot as plt +> +> fig = plt.figure() +> ax = fig.add_subplot(111) +> +> ax.scatter(x, y) +> ``` + + +<a class="anchor" id="python-editors"></a> +## Python editors + + +> Summary: +> - Make your tab key insert four spaces. Don't use tab characters in Python +> code. +> +> - Use [Spyder](https://pythonhosted.org/spyder/) if you want a MATLAB-like +> envionment (focus on analysis, rather than coding). +> +> - Use [PyCharm](https://www.jetbrains.com/pycharm/) if you want an IDE-like +> environment (focus on coding, rather than analysis). +> +> - Use [Atom](https://atom.io/) or [VS Code](https://code.visualstudio.com/) +> if you like using the latest and greatest. +> +> - If you like your existing editor, use it. But you will be better off if +> you can integrate it with `fslpython`, [pylint](https://www.pylint.org/) +> and [pyflakes](https://github.com/PyCQA/pyflakes). + + +You can use any text editor that you want to edit Python files. But the one +golden rule that you must follow, no matter what editor you use: + + +__Configure your tab key to insert four spaces. Don't use tab characters in +Python code!__ + + +This is the [standard +convention](https://www.python.org/dev/peps/pep-0008/#indentation) for Python +code. If you deviate from this convention, and somebody else needs to work +with your code, they will be angry at you! + + +Now, with that out of the way, there are several good Python editors available +to you. If you are getting started with Python, we recommend +[PyCharm](https://www.jetbrains.com/pycharm/) or +[Spyder](https://pythonhosted.org/spyder/). + + +If you are used to MATLAB, and you do a lot of experimenting or interactive +work, then you might like Spyder. If you spend most of your time writing code +rather than experimenting, then go with PyCharm. + + +### Spyder + + +Spyder is a MATLAB-like environment for Python. It has a code editor and an +interactive IPython prompt. You can inspect variables that are in your +workspace, plot data, and so on and so forth. + + +Beyond that, Spyder is fairly simple - it does not have much in the way of +project management tools, or integration with version control (i.e. `git`). + + +Spyder can be installed directly into `fslpython`: + + +> ``` +> # If your FSL installation requires +> # administrative privileges to modify, +> # you will need to prefix these +> # commands with sudo. +> $FSLDIR/fslpython/bin/conda install -n fslpython -y spyder +> ln -s $FSLDIR/fslpython/envs/fslpython/bin/spyder $FSLDIR/bin/fslspyder +> ``` + + +Now to run Spyder, you can just type: + + +> ``` +> fslspyder & +> ``` + + +Now you need to make sure that Spyder is using the `fslpython` environment to +run your code. + + +1. Go to _python_ (the menu) > _Preferences_ > Python Interpreter +2. Make sure that _Use the following Python interpreter_ is selected +3. Make sure that the path is `$FSLDIR/fslpython/envs/fslpython/bin/python` + (for your specific value of `$FSLDIR`). + + +Type the following into the console to test that everything is working: + + +``` +import matplotlib.pyplot as plt +plt.plot([1, 2, 3], [4, 5, 6]) +``` + + +### PyCharm + + +PyCharm is a general-purpose Python development environment. Unlike Spyder, it +does not have an integrated console or variable explorer. But it has more +tools to help you write code, and better file management/version control +integration. + + +And it is also easy to install - simply download the Community edition from +the [home page](https://www.jetbrains.com/pycharm/). Then, if you are on a +mac, double-click the `.dmg` file, and drag PyCharm into your `/Applications/` +folder. Then double-click on PyCharm to start it. + + +Once you have chosen a theme, you will be asked if you would like to create a +_Launcher script_ - do this, because you will then be able to open files from +the terminal by typing `charm [filename]`. + + +Now you will be presented with a _Welcome to PyCharm_ window. __Before doing +anything else__, click on the _Configure_ button down in the bottom right, and +choose _Preferences_. Then in the _Project Interpreter_ section: + + +1. Click on the gear button and choose _Add local..._ +2. Choose _Existing environment_ +3. Click on the _..._ button, and navigate to + `$FSLDIR/fslpython/envs/fslpython/bin/python`. + + +### Other options + + +Emacs is capable of being used as a fully-fledged Python IDE, if you have the +time and patience to configure it. + +If you are the fashionable sort, try one of these: + +- [Visual Studio Code](https://code.visualstudio.com/) +- [Atom](https://atom.io/) + + +<a class="anchor" id="python-in-your-browser-jupyter-notebook"></a> +## Python in your browser: Jupyter Notebook + + +It is possible to do your Python-based development and experimentation inside +your web browser, thanks to the [Jupyter project](https://jupyter.org/). + + +Jupyter works in the following way: + +1. You start a Juptyer web server on your computer. This web server provides + the environment in which your Python code is executed. + +2. You open https://localhost:8888 (or similar) in a web browser - this opens + a connection to the (locally running) web server. + +3. You start a "Notebook" (Jupyter's version of a file), and start typing. + You can put text, LaTeX, and of course Python code into a notebook. + +4. All of the code that you write gets sent to the web server and + executed. Then the results get sent back to the web browser, and displayed + in your notebook - magic! + + +All of the PyTreat practicals are written in a Jupyter notebook. Some of the +talks are too - you're looking at a Jupyter Notebook right now! + + +So you're going to need to install Jupyter to get the most out of the +practicals that we have prepared for you. + + +__Exercise__ Install Jupyter into `fslpython` - run these commands in a +terminal: + + +> ``` +> # Remember to prefix with sudo if your +> # FSL install needs admin to modify. +> $FSLDIR/fslpython/bin/conda install -n fslpython -y jupyter +> ln -s $FSLDIR/fslpython/envs/fslpython/bin/jupyter $FSLDIR/bin/fsljupyter +> ``` + + +<a class="anchor" id="git"></a> +## Git + + +All the cool kids these days use [git](https://git-scm.com/) to +collaboratively work on their Python code. + + +Git is different from CVS and SVN in that it is _distributed_. In CVS and SVN, +there is only one central repository. You check out a copy of the source from +the repository, make some changes, and then commit those changes back to the +central repository. + + +In git, there are multiple repositories. There is usually one repository which +acts as the central one, but you will _clone_ (or _fork_) that central +repository to create your own full copy of the repository. + + +Then, you can make changes and commit them in your own repository. And at any +point, you can push your changes back to the central repository. + + +### WIN's gitlab server + + +https://git.fmrib.ox.ac.uk/ + + +If you have a FMRIB account, then you also have a Gitlab account. Gitlab is a +git server that you can use to store your "central" git repository. Gitlab is +very similar to https://www.github.com, but it is managed by WIN, and your +code is not publicly visible (although it can be if you want). Gitlab backs +up your code automatically, and has a nice web interface. + +You can have up to 10 projects on your gitlab account - talk to the FMRIB IT +people if you need more. + + +### Using git and gitlab + + +> We need to go through a couple of intiial configuration steps before +> proceeding. You only need to do this once (for each computer that you use). +> +> First, run these commands to configure git on your system. +> +> ``` +> git config --global user.name "Your name" +> git config --global user.email "Your email address" +> ``` +> +> Now you need to create a SSH key pair, so your computer can talk to the +> gitlab server without you having to log in. Don't be scared - there are +> detailed instructions on doing this at +> https://git.fmrib.ox.ac.uk/help/ssh/README.md - follow the instructions +> under the section entitled __Generating a new SSH key pair__. + + +Working with git and gitlab generally involves these steps: + +1. Add new files to your local repository, or make changes to existing files. +2. Run `git add` on the new/changed files to _stage_ them. +3. Run `git commit` to commit all staged changes to your local repository. +4. Run `git push` to push those changes to your gitlab repository. + + +When you start working on a new project (or if you have an existing project +that you want to put into git): + + +__1. Create a project directory__ + +Or navigate to your existing project directory. + + +__2. Turn the directory into a git repository__ + +> ``` +> cd path/to/super/cool/project +> git init +> ``` + + +__3. Add your files to git__ + +If you want to add all of the files in your project directory into git, type +this: + +> ``` +> git add . +> ``` + + +Otherwise, if you only want certain files in git, then `git add` them one by +one (or with standard bash file patterns). + +You should avoid putting large binary files or data files into git - it works +best with source code. Talk to the FMRIB IT people if you really need to store +large files in git, as they can help you with this. + + +__4. Commit your changes__ + + +> ``` +> git commit -m "A useful message describing the changes you are committing." +> ``` + + +__5. Create a repository for your project on gitlab__ + + +Log in to gitlab (https://git.fmrib.ox.ac.uk/), then click on the _+_ button +towards the top right, and select _New project_. Give the project a name and +choose its visiblity (note that _Public_ means your project will be visible to +the world). + + +Now, follow the instructions under __Existing Git repository__ to "link" your +local project repository to the one on gitlab. + + +__6. Develop your super cool project!__ + + +Now you can get to work! Whenever you make changes to your code that you want +saved, follow the `git add`, `git commit`, `git push` steps described above. + + +For example, let's say we have added a new file called `cool_module.py`. To +get this into git, we would do the following: + + +``` +git add cool_module.py +git commit -m "Added cool module. It's super cool" +git push origin master +``` + + +<a class="anchor" id="the-pytreat-practicals"></a> +## The PyTreat practicals + + +All of the practicals for PyTreat are hosted in a git repository at: + + +https://git.fmrib.ox.ac.uk/fsl/pytreat-2018-practicals + + +So let's go get them! + + +> ``` +> git clone git@git.fmrib.ox.ac.uk:fsl/pytreat-2018-practicals.git +> cd pytreat-2018-practicals +> fsljupyter notebook +> ```