{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Accessing and sharing data with ONE local mode", "provenance": [] }, "kernelspec": { "name": "python3", "language": "python", "display_name": "Python 3 (ipykernel)" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "Ke27mmuJ_i0R" }, "source": [ "# Releasing data with ONE\n", "ONE can operate in [two modes](./one_modes.html). For very large collections, such as the main IBL\n", "data, it operates in 'remote mode', downloading data from a remote store only as required.\n", "However it can also be used in 'local mode', in which all data files are stored on the user's\n", "local machine. This is simpler, and allows access with no internet connection.\n", "To access data in local mode, a user uses exactly the same commands as in remote mode.\n", "\n", "ONE stores an index of the local filesystem in a couple of parquet files in the root directory,\n", "called 'sessions.pqt' and 'datasets.pqt'.\n", "\n", "The easiest way for data producers to release ONE-standard data is thus to create a directory\n", "containing your data files, collect them all into a .zip file, and put it on a website along\n", "with the index files.\n", "\n", "Users can then download and unzip your data files, and access them using ONE local mode.\n", "\n", "For information about creating and validating ONE-standard data (a.k.a. ALFs) see the [guide on\n", "datasets](./datasets_and_types.html).\n", "\n", "This guide is for releasing data without an Alyx database. If using an Alyx database instance and\n", "wish to share dataset UUIDs with others, see [recording data access](./recording_data_access.html).\n", "\n", "In this tutorial we will show how to create the index files.\n", "\n", "First [install ONE](../one_installation.html):\n", "\n", "```\n", "pip install ONE-api\n", "```\n", "\n", "## Downloading example data\n", "Next we are going to download an example collection of behavioural data files. The following\n", "commands download a zip file from figshare into a cache directory, and unzip it. It is of course\n", "also possible to download and unzip the file manually, in any directory of the users choice.\n", "This should take around a minute.\n", "\n", "The dataset is around 74,000 behaviour files (~218MB) from the beta data release for the [IBL\n", "behaviour paper](https://elifesciences.org/articles/63711). The code in this cell is not important.\n", "\n", "
\n", "Note.\n", "\n", "The zip file is for demonstrating how to prepare data for ONE and therefore doesn't yet contain\n", "index files. Normally when releasing data you would include the index files. It is also not\n", "a complete set of behaviour sessions used in the accompanying paper.\n", "
" ] }, { "cell_type": "code", "metadata": { "id": "XtHUmp7I7lpy" }, "source": [ "from pathlib import Path\n", "\n", "from one.api import One\n", "from one.params import CACHE_DIR_DEFAULT\n", "import requests\n", "from io import BytesIO\n", "import zipfile\n", "\n", "# Data locations:\n", "# The data_url is the location of the remote example dataset. This will be downloaded so we\n", "# have something to build a cache from on our local computer.\n", "data_url = 'https://ndownloader.figshare.com/files/21623715'\n", "\n", "# The cache_dir is the location of the example dataset. By default this will be\n", "# ~/Downloads/ONE/my_example but could be set to anything.\n", "cache_dir = Path(CACHE_DIR_DEFAULT, 'my_example')\n", "\n", "# Download data if not already downloaded\n", "if not (cache_dir.exists() and any(cache_dir.iterdir())):\n", " cache_dir.parent.mkdir(exist_ok=True, parents=True) # Create destination dir\n", " print(f'Downloading data from {data_url.split(\".\", maxsplit=1)[-1]}...')\n", " request = requests.get(data_url) # Download data into memory (~300MB)\n", " with zipfile.ZipFile(BytesIO(request.content)) as zipped:\n", " print(f'Extracting into {cache_dir}...')\n", " zipped.extractall(path=cache_dir.parent) # Decompress into destination dir\n", " Path(cache_dir.parent, 'ibl-behavioral-data-Dec2019').rename(cache_dir) # Rename\n", " cache_dir.joinpath('one_example.py').unlink() # Delete outdated example\n", " del request # Free resources\n" ], "execution_count": 1, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloading data from figshare.com/files/21623715...\n", "Extracting into C:\\Users\\User\\Downloads\\ONE\\my_example...\n" ] } ] }, { "cell_type": "markdown", "metadata": { "id": "Iwd2--7yx10s" }, "source": [ "## Validating your data\n", "Before building the cache tables, you need to organize your data files into directories with a\n", "specific naming convention:\n", "\n", "`lab/Subjects/subject/date/number`\n", "\n", "
\n", "Note.\n", "\n", "If releasing data from a single lab, the `lab/Subjects` directories are not necessary. The\n", "`subject/date/number` structure, however, is always required.\n", "
\n", "\n", "Now let's have a look inside the data directory. For the first recording made from Zador lab\n", "subject `CSH_ZAD_003` on 11 August 2019, the files are in the path\n", "`zadorlab/Subjects/CSH_ZAD_003/2019-08-11/001/alf`.\n" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "GM5QM6O678HX", "outputId": "ac668bdc-c160-40cd-d1f2-45507ba25c65" }, "source": [ "import os\n", "print(os.listdir(cache_dir))\n", "session_path = cache_dir.joinpath('zadorlab/Subjects/CSH_ZAD_003/2019-08-11/001/alf')\n", "print(os.listdir(session_path))" ], "execution_count": 8, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['angelakilab', 'churchlandlab', 'cortexlab', 'danlab', 'datasets.pqt', 'hoferlab', 'mainenlab', 'mrsicflogellab', 'README.txt', 'sessions.pqt', 'wittenlab', 'zadorlab']\n", "['_ibl_trials.choice.npy', '_ibl_trials.contrastLeft.npy', '_ibl_trials.contrastRight.npy', '_ibl_trials.feedbackType.npy', '_ibl_trials.feedback_times.npy', '_ibl_trials.goCueTrigger_times.npy', '_ibl_trials.goCue_times.npy', '_ibl_trials.included.npy', '_ibl_trials.intervals.npy', '_ibl_trials.probabilityLeft.npy', '_ibl_trials.repNum.npy', '_ibl_trials.response_times.npy', '_ibl_trials.rewardVolume.npy', '_ibl_trials.stimOnTrigger_times.npy', '_ibl_trials.stimOn_times.npy']\n" ] } ] }, { "cell_type": "markdown", "source": [ "Within this directory, the datasets are named with standard [ONE file naming conventions](../alf_intro.html).\n", "Files that are not withing the right directory structure or that don't have a valid filename\n", "will not be added to the cache tables. Before building the cache you should check that your\n", "datasets are ALF compliant:" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n" } } }, { "cell_type": "code", "execution_count": 9, "outputs": [], "source": [ "from one.alf.spec import is_valid\n", "assert all(is_valid(x) for x in os.listdir(session_path))" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "metadata": { "id": "p3b_stuRy21_" }, "source": [ "## Generating the cache\n", "Now let's see how you would release data in ONE standard if you are a data producer. Before\n", "zipping and uploading, you need to create the index files, which is done with one line of code.\n", "This should take about 3 minutes for the current behavioral data.\n", "\n", "
\n", "Note.\n", "\n", "The option `hash_files` creates a hash of each file which allows ONE to detect when files have\n", "changed - this is good for dynanmic data stored on an Alyx but is not necessary for release of\n", "zipped data on a website.\n", "
" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "TShKLIL67vxY", "outputId": "d61c9dca-902d-4a73-a2f0-42a055e33a4a" }, "source": [ "print('Building ONE cache from filesystem...')\n", "One.setup(cache_dir, hash_files=False)" ], "execution_count": 3, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Building ONE cache from filesystem...\n" ] }, { "data": { "text/plain": "One (offline, C:\\Users\\User\\Downloads\\ONE\\my_example)" }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ] }, { "cell_type": "markdown", "source": [ "## Checking the cache\n", "Now the files are indexed you can use ONE search and load commands as you would with\n", "remote data. Let's search for all sessions of subject NYU-01, that have behavioral trial data,\n", "then make a plot of reaction time vs. trial number which we obtain by subtracting the time of the\n", "go cue onset from the feedback (i.e. reward or failure) time.\n", "\n", "For more information on listing, searching and loading data see [the API guides](../index.html#basic-usage)" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 6, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "There are 98 behaviour sessions for subject \"NYU-01\"\n" ] }, { "data": { "text/plain": "
", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "one = One(cache_dir=cache_dir)\n", "\n", "# Searching for behaviour experiment by subject\n", "subject = 'NYU-01'\n", "eids = one.search(subject=subject, dataset=['trials.goCue_times', 'trials.feedback_times'])\n", "print(f'There are {len(eids)} behaviour sessions for subject \"{subject}\"')\n", "\n", "# Load the trials object for this session\n", "trials = one.load_object(eids.pop(), 'trials')\n", "\n", "# Make the plot\n", "plt.plot(trials.feedback_times - trials.goCue_times, '.')\n", "plt.ylabel('reaction time / s')\n", "plt.xlabel('trial #');" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "Now to release the data, just zip up the directory and upload to your favourite web hosting\n", "service!\n", "\n", "
\n", "Note.\n", "\n", "If you are using an Alyx database instance, this is not the correct way to release data or generate\n", "cache files as the UUIDs will not match. Instead, generate the cache through the database\n", "`one_cache` management command. If you are using Alyx and wish to share accessed dataset UUIDs\n", "with others, see [recording data access](./recording_data_access.html).\n", "
" ], "metadata": { "collapsed": false } } ] }