{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "14:03:52 [I] klustakwik KlustaKwik2 version 0.2.6\n" ] } ], "source": [ "import os\n", "import expipe\n", "import pathlib\n", "import numpy as np\n", "import spatial_maps.stats as stats\n", "import septum_mec.analysis.data_processing as dp\n", "import head_direction.head as head\n", "import spatial_maps as sp\n", "import septum_mec.analysis.registration\n", "import speed_cells.speed as spd\n", "import septum_mec.analysis.spikes as spikes\n", "import re\n", "import joblib\n", "import multiprocessing\n", "import shutil\n", "import psutil\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import septum_mec\n", "import scipy.ndimage.measurements\n", "from distutils.dir_util import copy_tree\n", "\n", "from tqdm import tqdm_notebook as tqdm\n", "from tqdm._tqdm_notebook import tqdm_notebook\n", "tqdm_notebook.pandas()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "max_speed = 1, # m/s only used for speed score\n", "min_speed = 0.02, # m/s only used for speed score\n", "position_sampling_rate = 100 # for interpolation\n", "position_low_pass_frequency = 6 # for low pass filtering of position\n", "\n", "box_size = [1.0, 1.0]\n", "bin_size = 0.02\n", "smoothing_low = 0.03\n", "smoothing_high = 0.06" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "project_path = dp.project_path()\n", "\n", "project = expipe.get_project(project_path)\n", "actions = project.actions" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
actionchannel_groupunit_name
01849-060319-31104
11849-060319-31108
21849-060319-3185
31849-060319-3194
41849-060319-3198
\n", "
" ], "text/plain": [ " action channel_group unit_name\n", "0 1849-060319-3 1 104\n", "1 1849-060319-3 1 108\n", "2 1849-060319-3 1 85\n", "3 1849-060319-3 1 94\n", "4 1849-060319-3 1 98" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "identify_neurons = actions['identify-neurons']\n", "units = pd.read_csv(identify_neurons.data_path('all_non_identified_units'))\n", "# units = pd.read_csv(identify_neurons.data_path('units'))\n", "units.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXIAAAD7CAYAAAB37B+tAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAC/9JREFUeJzt3X+IpHd9wPH35u4mq+UMCiJ6WBexfpi/QjjxItZ6YIpNj5KSP4tBDCJK/oiojdf0glAsXEpyghEV8sOTVkHMj/7hcZo/bJPYImISwcThcxo96x8KbSAYDePuXbZ/7BzdXnZ2Zp6dmWc/s+8XBGZmZ/f5fO/Zeee5Z+fZW1pfX0eSVNcVbQ8gSdoZQy5JxRlySSrOkEtScYZckooz5JJUnCGXpOIMuSQVZ8glqbj989jIkSNH1g8dOjSPTU3N6uoqnU6n7TF2xDXsDq5hd6i4hmefffZ/MvP1o543l5AfOnSIhx9+eB6bmpper0e32217jB1xDbuDa9gdKq4hIn45zvM8tSJJxRlySSrOkEtScYZckooz5JJUnCGXpOIMuSQVZ8glqThDLknFGXL9P/21i3tqu9IimMsl+qpj+cA+Vo6fmft2z588NvdtSovCI3JJKs6QS1JxhlySijPkklScIZek4gy5JBVnyCWpOEMuScUZckkqzpBLUnGGXJKKM+SSVJwhl6TiDLkkFWfIJak4Qy5JxRlySSrOkEtScYZckooz5JJUnCGXpOIMuSQVt3+7D0bEAeABYAW4Evgs8BPgNLAOPAPckpkvz3RKSdJQo47IPwA8n5nvAf4C+AJwCjgxeGwJuGG2I0qStjMq5N8E7hjcXgIuAIeBxwaPnQWum81okqRxbHtqJTN/BxARB4EHgRPAXZm5PnjKi8BVozayurpKr9fb4ajz1e/3y818uSZr6Ha7M5pmtK1m3av7YbdxDbvbtiEHiIg3A48AX8zMr0fEP2368EHghVFfo9PptBqIJnq9XrmZL1dtDVvNWm0NW3ENu8MirGGYbU+tRMQbgEeBT2fmA4OHn46Io4Pb1wNPzG48SdIoo47IbwdeC9wREZfOld8KfD4iOkCPjVMukqSWjDpHfisb4b7ce2czjiRpUl4QJEnFGXJJKs6QS1JxhlySijPk2hX6axe3fHwe7/sdtm2pipEXBEnzsHxgHyvHz7Sy7fMnj7WyXWlaPCKXpOIMuSQVZ8glqThDLknFGXJJKs6QS1JxhlySijPkklScIZek4gy5JBVnyCWpOEMuScUZckkqzpBLUnGGXJKKM+SSVJwhl6TiDLkkFWfIJak4Qy5JxRlySSrOkEtScYZckooz5JJUnCGXpOIMufa8/trFmX79brfbyna1d+xvewCpbcsH9rFy/Mzct3v+5LG5b1OLySNySSrOkEtScYZckooz5JJU3Fg/7IyII8CdmXk0Iq4BvgX8dPDhL2XmN2Y1oCRpeyNDHhG3ATcBvx88dBg4lZl3z3IwSdJ4xjm18hxw46b7h4FjEfF4RNwfEQdnM5okaRwjj8gz86GIWNn00A+A+zLzyYj4e+AzwKe2+xqrq6v0er0dDTpv/X6/3MyXa7KGYRevaDaqfI/t1ddDFU0uCHokM1+4dBu4Z9QndDqdcoHo9XrlZr7cIqxh0VXZP4vwvbQIaximybtWvhMR7xzcfh/w5BTnkSRNqMkR+ceAeyJiDfgN8JHpjiRJmsRYIc/M88C1g9tPAe+e4UySpAl4QZAkFWfIJak4Qy5JxRlySSrOkEtScYZckooz5JJUnCGXpOIMuSQVZ8glqThDLknFGXJJKs6QS1JxhlySijPkklScIZek4gy5JBVnyCWpOEMuScUZckkqzpBLUnGGXJKKM+SSVJwhl6TiDLkkFWfIJak4Qy5JxRlySSrOkEtScYZckooz5JJUnCGXpOIMuSQVZ8glqThDLknFGXJJKs6QS1Jx+8d5UkQcAe7MzKMR8TbgNLAOPAPckpkvz25ESdJ2Rh6RR8RtwH3A8uChU8CJzHwPsATcMLvxJEmjjHNq5Tngxk33DwOPDW6fBa6b9lCSpPGNPLWSmQ9FxMqmh5Yyc31w+0XgqlFfY3V1lV6v12zClvT7/dZm/uOVt/JHr7pyx1+n2+1OYRrNUpXXRZuvh2lZhDUMM9Y58stsPh9+EHhh1Cd0Op1yUen1eq3OvHL8TCvbPX/yWCvb3auqvC7afj1MwyKsYZgm71p5OiKODm5fDzwxvXEkSZNqckT+SeDeiOgAPeDB6Y4kSZrEWCHPzPPAtYPb54D3znAmSdIEvCBIkooz5JJUnCGXpOIMuSQVZ8glqThDLknFGXJJKs6QS1JxhlySijPkklScIZek4gy5JBVnyCWpOEMuScUZckkqzpBLUnGGXJKKM+SSVJwhl6TiDLkkFWfIJak4Qy5JxZUIeX/t4ty32e12W9muJE1qf9sDjGP5wD5Wjp+Z+3bPnzw2921K0qRKHJFLkoYz5JJUnCGXpOIMuSQVZ8glqThDLknFGXJJKs6QS1JxhlySijPkklScIZek4gy5JBVnyCWpuMa//TAingJ+O7j7i8z80HRGkiRNolHII2IZWMrMo9MdR5I0qaZH5FcDr46IRwdf4/bM/P70xpIkjatpyF8C7gLuA/4EOBsRkZkXtnry6uoqvV6v4aY2/rWetuxk7qbaXK/mq43vryb6/X6ZWYdZhDUM0zTk54CfZeY6cC4ingfeCPxqqyd3Op2ycao6t2qo8v3V6/XKzDrMIqxhmKbvWrkZuBsgIt4EvAb49bSGkiSNr+kR+f3A6Yj4HrAO3DzstIokabYahTwzV4G/mfIskqQGvCBIkooz5JJUnCGXpOIMuSQVZ8illvTXLu7JbWv6Gv/SLEk7s3xgHyvHz7Sy7fMnj7WyXc2GR+SSVJwhl6TiDLkkFWfIJak4Qy5JxRlySSrOkEtScYZ8G140IU1XW6+pRX8te0HQNtq6YMOLNbSofE3NhkfkklScIZek4gy5JBVnyCWpOEMuScUZckkqzpBLUnGGXNqDJr1AptvtzmgSTYMXBEl7kBfmLBaPyCWpOEMuScUZckkqzpBLUnGGXJKKM+SSVJwhl6TiDLmkhddfu9jaRU3z+NeJvCBI0sJr6wIomM9FUB6RS1JxhlySijPkklScIZek4hr9sDMirgC+CFwN/AH4cGb+bJqDSZLG0/SI/K+B5cx8F3AcuHt6I0mSJtE05H8KfBsgM78PvGNqE0mSJrK0vr4+8SdFxH3AQ5l5dnD/v4C3ZuaFIc//b+CXOxlUkvagt2Tm60c9qekFQb8FDm66f8WwiAOMM4gkqZmmp1b+A/hLgIi4Fvjx1CaSJE2k6RH5I8CfR8R/AkvAh6Y3kiRpEo3OkUuSdg8vCJKk4gy5JBXnr7HdQkQ8xcY7cwB+kZllfgYQEUeAOzPzaES8DTgNrAPPALdk5sttzjeOy9ZwDfAt4KeDD38pM7/R3nTbi4gDwAPACnAl8FngJxTaD0PW8Ctq7Yd9wL1AsPHn/lGgT6H9MAlDfpmIWAaWMvNo27NMKiJuA24Cfj946BRwIjP/PSK+DNzAxg+qd60t1nAYOJWZVa4e/gDwfGbeFBGvA340+K/SfthqDf9Arf3wVwCZ+e6IOAr8IxtvzKi0H8bmqZVXuhp4dUQ8GhHfHby9sorngBs33T8MPDa4fRa4bu4TTW6rNRyLiMcj4v6IODjk83aLbwJ3DG4vAReotx+GraHMfsjMfwU+Mrj7FuAF6u2HsRnyV3oJuAt4Pxt/HftaRJT4m0tmPgSsbXpoKTMvvS3pReCq+U81mS3W8APgbzPzz4CfA59pZbAxZebvMvPFQegeBE5QbD8MWUOp/QCQmRci4qvAPcDXKLYfJmHIX+kc8C+ZuZ6Z54DngTe2PFNTm8//HWTjqKSaRzLzyUu3gWvaHGYcEfFm4N+Af87Mr1NwP2yxhnL7ASAzPwi8nY3z5a/a9KES+2FchvyVbmbw2xwj4k3Aa4BftzpRc08Pzg8CXA880eIsTX0nIt45uP0+4Mntnty2iHgD8Cjw6cx8YPBwqf0wZA3V9sNNEfF3g7svsfE/0x9W2g+TKHHKYM7uB05HxPfY+On2zdv9Hpld7pPAvRHRAXps/DW5mo8B90TEGvAb/u+85251O/Ba4I6IuHSe+Vbg84X2w1Zr+ATwuUL74WHgKxHxOHAA+Dgbf/bVXw9b8spOSSrOUyuSVJwhl6TiDLkkFWfIJak4Qy5JxRlySSrOkEtScYZckor7Xy3zQIQBBWTTAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "units.groupby('action').count().unit_name.hist()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data_loader = dp.Data(\n", " position_sampling_rate=position_sampling_rate, \n", " position_low_pass_frequency=position_low_pass_frequency,\n", " box_size=box_size, bin_size=bin_size\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "first_row = units[units['action'] == '1849-060319-3'].iloc[0]\n", "#first_row = sessions.iloc[50]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/mikkel/.virtualenvs/expipe/lib/python3.6/site-packages/elephant/statistics.py:835: UserWarning: Instantaneous firing rate approximation contains negative values, possibly caused due to machine precision errors.\n", " warnings.warn(\"Instantaneous firing rate approximation contains \"\n" ] }, { "data": { "text/plain": [ "average_rate 3.095328\n", "speed_score -0.063922\n", "out_field_mean_rate 1.837642\n", "in_field_mean_rate 5.122323\n", "max_field_mean_rate 8.882211\n", "max_rate 23.006163\n", "sparsity 0.468122\n", "selectivity 7.306812\n", "interspike_interval_cv 3.970863\n", "burst_event_ratio 0.397921\n", "bursty_spike_ratio 0.676486\n", "gridness -0.459487\n", "border_score 0.078474\n", "information_rate 0.965845\n", "head_mean_ang 5.788704\n", "head_mean_vec_len 0.043321\n", "spacing 0.624971\n", "orientation 22.067900\n", "dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def process(row):\n", " action_id = row['action']\n", " channel_id = row['channel_group']\n", " unit_id = row['unit_name']\n", " \n", " # common values for all units == faster calculations\n", " x, y, t, speed = map(data_loader.tracking(action_id).get, ['x', 'y', 't', 'v'])\n", " ang, ang_t = map(data_loader.head_direction(action_id).get, ['a', 't'])\n", " occupancy_map = data_loader.occupancy(action_id)\n", " xbins, ybins = data_loader.spatial_bins\n", " box_size_, bin_size_ = data_loader.box_size_, data_loader.bin_size_\n", " prob_dist = data_loader.prob_dist(action_id)\n", " \n", " smooth_low_occupancy_map = sp.maps.smooth_map(occupancy_map, bin_size=bin_size_, smoothing=smoothing_low)\n", " smooth_high_occupancy_map = sp.maps.smooth_map(occupancy_map, bin_size=bin_size_, smoothing=smoothing_high)\n", " \n", " spike_times = data_loader.spike_train(action_id, channel_id, unit_id)\n", "\n", " # common\n", " spike_map = sp.maps._spike_map(x, y, t, spike_times, xbins, ybins)\n", "\n", " smooth_low_spike_map = sp.maps.smooth_map(spike_map, bin_size=bin_size_, smoothing=smoothing_low)\n", " smooth_high_spike_map = sp.maps.smooth_map(spike_map, bin_size=bin_size_, smoothing=smoothing_high)\n", "\n", " smooth_low_rate_map = smooth_low_spike_map / smooth_low_occupancy_map\n", " smooth_high_rate_map = smooth_high_spike_map / smooth_high_occupancy_map\n", "\n", " # find fields with laplace\n", " fields_laplace = sp.separate_fields_by_laplace(smooth_high_rate_map)\n", " fields = fields_laplace.copy() # to be cleaned by Ismakov\n", " fields_areas = scipy.ndimage.measurements.sum(\n", " np.ones_like(fields), fields, index=np.arange(fields.max() + 1))\n", " fields_area = fields_areas[fields]\n", " fields[fields_area < 9.0] = 0\n", "\n", " # find fields with Ismakov-method\n", " fields_ismakov, radius = sp.separate_fields_by_distance(smooth_high_rate_map)\n", " fields_ismakov_real = fields_ismakov * bin_size\n", " approved_fields = []\n", "\n", " # remove fields not found by both methods\n", " for point in fields_ismakov:\n", " field_id = fields[tuple(point)]\n", " approved_fields.append(field_id)\n", "\n", " for field_id in np.arange(1, fields.max() + 1):\n", " if not field_id in approved_fields:\n", " fields[fields == field_id] = 0\n", "\n", " # varying statistics\n", " average_rate = len(spike_times) / (t.max() - t.min())\n", "\n", " max_rate = smooth_low_rate_map.max()\n", "\n", " out_field_mean_rate = smooth_low_rate_map[np.where(fields == 0)].mean()\n", " in_field_mean_rate = smooth_low_rate_map[np.where(fields != 0)].mean()\n", " max_field_mean_rate = smooth_low_rate_map[np.where(fields == 1)].mean()\n", "\n", " interspike_interval = np.diff(spike_times)\n", " interspike_interval_cv = interspike_interval.std() / interspike_interval.mean()\n", "\n", " autocorrelogram = sp.autocorrelation(smooth_high_rate_map)\n", " peaks = sp.fields.find_peaks(autocorrelogram)\n", " real_peaks = peaks * bin_size\n", " autocorrelogram_box_size = box_size[0] * autocorrelogram.shape[0] / smooth_high_rate_map.shape[0]\n", " spacing, orientation = sp.spacing_and_orientation(real_peaks, autocorrelogram_box_size)\n", " orientation *= 180 / np.pi\n", "\n", " selectivity = stats.selectivity(smooth_low_rate_map, prob_dist)\n", "\n", " sparsity = stats.sparsity(smooth_low_rate_map, prob_dist)\n", "\n", " gridness = sp.gridness(smooth_high_rate_map)\n", "\n", " border_score = sp.border_score(smooth_high_rate_map, fields_laplace)\n", "\n", " information_rate = stats.information_rate(smooth_high_rate_map, prob_dist)\n", "\n", " single_spikes, bursts, bursty_spikes = spikes.find_bursts(spike_times, threshold=0.01)\n", " burst_event_ratio = np.sum(bursts) / (np.sum(single_spikes) + np.sum(bursts))\n", " bursty_spike_ratio = np.sum(bursty_spikes) / (np.sum(bursty_spikes) + np.sum(single_spikes))\n", " mean_spikes_per_burst = np.sum(bursty_spikes) / np.sum(bursts)\n", "\n", " speed_score = spd.speed_correlation(\n", " speed, t, spike_times, min_speed=min_speed, max_speed=max_speed)\n", "\n", " ang_bin, ang_rate = head.head_direction_rate(spike_times, ang, ang_t)\n", "\n", " head_mean_ang, head_mean_vec_len = head.head_direction_score(ang_bin, ang_rate)\n", "\n", " result = pd.Series({\n", " 'average_rate': average_rate,\n", " 'speed_score': speed_score,\n", " 'out_field_mean_rate': out_field_mean_rate,\n", " 'in_field_mean_rate': in_field_mean_rate,\n", " 'max_field_mean_rate': max_field_mean_rate,\n", " 'max_rate': max_rate,\n", " 'sparsity': sparsity,\n", " 'selectivity': selectivity,\n", " 'interspike_interval_cv': float(interspike_interval_cv),\n", " 'burst_event_ratio': burst_event_ratio,\n", " 'bursty_spike_ratio': bursty_spike_ratio,\n", " 'gridness': gridness,\n", " 'border_score': border_score,\n", " 'information_rate': information_rate,\n", " 'head_mean_ang': head_mean_ang,\n", " 'head_mean_vec_len': head_mean_vec_len,\n", " 'spacing': spacing,\n", " 'orientation': orientation\n", " })\n", " return result\n", " \n", "process(first_row)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "efa60f02cd1b4f1a946f01a7f61c1640", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(IntProgress(value=0, max=1298), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "/home/mikkel/.virtualenvs/expipe/lib/python3.6/site-packages/ipykernel_launcher.py:56: RuntimeWarning: Mean of empty slice.\n", "/home/mikkel/.virtualenvs/expipe/lib/python3.6/site-packages/numpy/core/_methods.py:85: RuntimeWarning: invalid value encountered in double_scalars\n", " ret = ret.dtype.type(ret / rcount)\n", "/home/mikkel/.virtualenvs/expipe/lib/python3.6/site-packages/ipykernel_launcher.py:57: RuntimeWarning: Mean of empty slice.\n", "/home/mikkel/apps/expipe-project/spatial-maps/spatial_maps/stats.py:13: RuntimeWarning: divide by zero encountered in log2\n", " return (np.nansum(np.ravel(tmp_rate_map * np.log2(tmp_rate_map/avg_rate) *\n", "/home/mikkel/apps/expipe-project/spatial-maps/spatial_maps/stats.py:13: RuntimeWarning: invalid value encountered in log2\n", " return (np.nansum(np.ravel(tmp_rate_map * np.log2(tmp_rate_map/avg_rate) *\n", "/home/mikkel/apps/expipe-project/spatial-maps/spatial_maps/stats.py:13: RuntimeWarning: invalid value encountered in multiply\n", " return (np.nansum(np.ravel(tmp_rate_map * np.log2(tmp_rate_map/avg_rate) *\n", "/home/mikkel/.virtualenvs/expipe/lib/python3.6/site-packages/numpy/core/_methods.py:140: RuntimeWarning: Degrees of freedom <= 0 for slice\n", " keepdims=keepdims)\n", "/home/mikkel/.virtualenvs/expipe/lib/python3.6/site-packages/numpy/core/_methods.py:110: RuntimeWarning: invalid value encountered in true_divide\n", " arrmean, rcount, out=arrmean, casting='unsafe', subok=False)\n", "/home/mikkel/.virtualenvs/expipe/lib/python3.6/site-packages/numpy/core/_methods.py:132: RuntimeWarning: invalid value encountered in double_scalars\n", " ret = ret.dtype.type(ret / rcount)\n", "/home/mikkel/.virtualenvs/expipe/lib/python3.6/site-packages/quantities/quantity.py:624: RuntimeWarning: Mean of empty slice.\n", " ret = self.magnitude.mean(axis, dtype, None if out is None else out.magnitude)\n", "/home/mikkel/.virtualenvs/expipe/lib/python3.6/site-packages/ipykernel_launcher.py:82: RuntimeWarning: invalid value encountered in long_scalars\n" ] } ], "source": [ "results = units.merge(\n", " units.progress_apply(process, axis=1), \n", " left_index=True, right_index=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%debug" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "output_path = pathlib.Path(\"output\") / \"calculate-statistics\"\n", "output_path.mkdir(exist_ok=True)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "results.to_csv(output_path / \"results.csv\", index=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Store results in Expipe action" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "statistics_action = project.require_action(\"calculate-statistics\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "statistics_action.data[\"results\"] = \"results.csv\"\n", "copy_tree(output_path, str(statistics_action.data_path()))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "septum_mec.analysis.registration.store_notebook(statistics_action, \"10_calculate_spatial_statistics.ipynb\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }