Commit db6d85c9 authored by lucas_miranda's avatar lucas_miranda
Browse files

Implemented get_angles method

parent d59239c5
......@@ -39,16 +39,34 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"#Which angles to compute?\n",
"bp_dict = {'B_Nose':['B_Left_ear','B_Right_ear'],\n",
" 'B_Left_ear':['B_Nose','B_Right_ear','B_Center','B_Left_flank'],\n",
" 'B_Right_ear':['B_Nose','B_Left_ear','B_Center','B_Right_flank'],\n",
" 'B_Center':['B_Left_ear','B_Right_ear','B_Left_flank','B_Right_flank','B_Tail_base'],\n",
" 'B_Left_flank':['B_Left_ear','B_Center','B_Tail_base'],\n",
" 'B_Right_flank':['B_Right_ear','B_Center','B_Tail_base'],\n",
" 'B_Tail_base':['B_Center','B_Left_flank','B_Right_flank']}"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"DLC_social_1 = get_coordinates(path='../../Desktop/DLC_social_1/',#Path where to find the required files\n",
" p=16, #Number of processes used for parallelization\n",
" smooth_alpha=0.1, #Alpha value for exponentially weighted smoothing\n",
" distances=['B_Center','B_Nose','B_Left_ear','B_Right_ear','B_Left_flank',\n",
" 'B_Right_flank','B_Tail_base'],\n",
" smooth_alpha=0, #Alpha value for exponentially weighted smoothing\n",
" distances=False,#['B_Center','B_Nose','B_Left_ear','B_Right_ear','B_Left_flank',\n",
" #'B_Right_flank','B_Tail_base'],\n",
" ego=False,\n",
" angles=True,\n",
" connectivity=bp_dict,\n",
" arena='circular', #Type of arena used in the experiments\n",
" arena_dims=[380], #Dimensions of the arena. Just one if it's circular\n",
" video_format='.mp4',\n",
......@@ -58,76 +76,65 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 43,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Loading and smoothing trajectories...\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 47/47 [00:37<00:00, 1.26it/s]\n",
" 0%| | 0/47 [00:00<?, ?it/s]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Computing distance based coordinates...\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"100%|██████████| 47/47 [03:33<00:00, 4.53s/it]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Done!\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n"
"Loading and smoothing trajectories...\n",
"Done!\n",
"CPU times: user 2.3 s, sys: 565 ms, total: 2.87 s\n",
"Wall time: 3.21 s\n"
]
}
],
"source": [
"%%time\n",
"DLC_social_1_coords = DLC_social_1.run(verbose=True)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 47,
"metadata": {
"scrolled": true
},
"outputs": [],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 13.9 s, sys: 82.5 ms, total: 14 s\n",
"Wall time: 14 s\n"
]
},
{
"data": {
"text/plain": [
"'coords'"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"test = DLC_social_1_coords.get_coords(center=True, polar=False)"
"%%time\n",
"test = DLC_social_1_coords.get_coords(center=True, polar=False)\n",
"test._type"
]
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Lfq3q6urdebMGUkfbay2bt2q9957T5L0y1/+UuPGjdPJkyf9eJmANa666ir96le/0uuvv64RI0ZI+qhjN2zYMD399NOZgC7kwgsv1NixY/XAAw+ora1NktTW1qZ58+bpvPPOU+/evdXY2KhnnnlGHR0dSqVSmj17dpcZ/4Wk1+mamhrV19frqaeekiT98Y9/1JQpU7pMJIS/2HVCFydPntT48eMzX6dSKT344IMaNGhQwZ8577zztHr1aj388MP653/+Z3Xr1k19+vTRokWLdM0110iSfvjDH2rRokVauXKlzpw5o7//+7/XlVde2WXmcK76+no9/vjjuuuuu7R8+XI9+OCD+s53viPHcdS9e3etWLFC/fr18+/FAxbo06ePPvOZz+j06dNdZtx/5Stf0cMPP6yrrrqq5O+YO3eufvjDH6q5uVnV1dXq6OjQDTfcoOnTp0uS/vZv/1bf//73NWHCBHV2dmro0KG6//77S/7er33ta2ppadGyZcv0yCOPaMGCBRo7dqw6Ojp00003ady4cTp48GD5Lx4FVTnFDrYCAIDYo7JHSe+//76+/e1v5/3eoEGDuhxHB2C+u+++W3v37s37vccee0yf/exnQx4RgkZlDwCA5ZigBwCA5axt41dVPR/1EIBYcJzRUQ+hJNZnwJ1C6zOVPQAAliPsAQCwHGEPAIDlCHsAACxH2AMAYDnCHgAAyxH2AABYztrz7AEAIbvI52s2HOH6Cn4h7AEA5fM74Av9boK/IpG08d9++221tLRIknbv3q0RI0aopaVFLS0t+vd//3dJ0vLlyzVp0iQ1Nzdr165dUQwTAJDPRaPP/hf230RZQq/sf/SjH2nTpk3q06ePJGnPnj267bbbdPvtt2ees3v3br3++utau3atjhw5ounTp2v9+vVhDxUAzBRE6BWqnE0L2PR4qPQ9CT3sBw4cqGXLlum+++6TJLW2tmrv3r16+eWXdfHFF+uBBx7Qjh071NjYqKqqKtXV1amzs1PHjh3T+eefH/ZwASB6YQSuaaFeykWjCXwPQm/jjxo1St27n93HuPzyy3XffffpmWee0YABA/T444+rra1NNTU1mef069dPJ06cCHuoABAtWtfF8d64FvmpdzfeeKMuvfTSzL/37Nmjmpoatbe3Z57T3t6u2traqIYIAOEi5N3jfXIl8rC/4447MhPwtm3b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\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfsAAAFoCAYAAABQeVI/AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO2debBW5X3HvxdQEC7G0RorrVDiDAFXiowmCga3EimLhHvDBXltxXUSnWokbpHFDWgF0wpGa6yOXiEaYBg1rTZqpA6IikSkgLSJElAhpA0l4V6FC7ynf+B5Oe+5Z3n25ZzfZ+Yd5V3Pe95zz+f5/p7lNARBEIAgCIIgiMLSxfYGEARBEAShF5I9QRAEQRQckj1BEARBFBySPUEQBEEUHJI9QRAEQRQckj1BEARBFBySPUEQBEEUHJI9UeOTTz7BoEGDMG7cOIwbNw5jxoxBc3Mz1q5dm/vanTt34vbbb8eYMWMwduxYNDc349VXX5XanvXr12PGjBlS70EQZeKqq67CU089Vfv3li1b8NWvfhUPPvhg7b7f//73OO2007Bnz57U9zl48CCefPJJfOtb38K4ceMwatQoPPDAA+jo6JDavqlTp2LXrl1S70GIQbIn6ujRoweef/55PP/883jxxRdx5ZVX4o477sh8za5du9DS0oKvfe1reOGFF/DCCy/g3nvvxfTp07Fq1Srhbfn1r3+NnTt3Cr+eIMrG+eefj7fffrv279dffx0XXHABXnvttdp9b731FoYMGYLevXunvs+sWbPw3nvv4amnnsLzzz+PpUuXYsuWLfjBD34gtX0y5wNCjm62N4Bwm927d+P444/PfM7ixYsxZMgQXHbZZbX7Bg4ciIceeghHH300AODDDz/E/fffj927d+PgwYOoVCpoamrC22+/jR/+8Ic46aST8Ktf/QoHDhzA3XffjT59+uChhx7Cnj17cMcdd2DOnDn4xS9+gUceeQT79+9Hjx49cNttt+Ev//IvsWDBAqxbtw6/+93v8NWvfhXz5s3Tuk8IwlXOP/98PPzww6hWq+jSpQtef/113Hzzzfje976Hbdu2oW/fvli9ejVGjBiR+h6ffPIJXnzxRaxcuRKNjY0AgJ49e+Luu+/GL3/5SwBAR0cH5s2bhzVr1uDgwYM45ZRTcNddd6GxsREXXnghxo8fj9WrV2PHjh0YN24cbrrpplpo+Ju/+Rs89thj6NKlC+655x7s2LED+/fvx1//9V/j+uuvxyeffILLL78cJ598Mj799FO0trbiy1/+svZ9V3gCgviCjz/+OBg4cGAwduzYYOzYscGIESOCU089NVixYkXm66677rrgmWeeSX18//79wahRo4INGzYEQRAEf/zjH4NLL700eO+994K33norGDRoULBp06YgCILgX/7lX4LLL788CIIgWLZsWXDttdcGQRAEW7ZsCUaPHh3s2rUrCIIg+O///u/gvPPOC9rb24OHHnooGDlyZLB//37pfUAQvnPRRRcFmzZtCnbv3h2cd955wcGDB4Pp06cHTz75ZBAEQXDhhRcGv/71r1Nf//LLLwcTJkzI/IwFCxYEc+fODarVahAEQTB//vxg5syZQRAEwQUXXBDMnTs3CIIg+O1vfxucfvrpwbZt24IgCIIBAwYEv//974MgCIJKpRK89tprQRAEwd69e4NKpRL867/+a/Dxxx8HAwYMCNasWSO8D4jOULIn6gjL+CFvvvkmvvvd7+KFF17ASSedlPiahoYGBBmXWPjNb36Dbdu24c4776zdt3fvXmzatAknn3wy+vTpg0GDBgEATjnlFCxfvrzTe6xatQq/+93v8Ld/+7d1n7tt2zYAwODBg9GtGx3OBBGW8o877jice+656NKlCy644AIsWrQIF198MRoaGnDyySenvr5Lly6oVquZn7FixQrs2bMHb775JgBg//79OO6442qPX3TRRQCAE044Accddxz+8Ic/1J0/PvvsM6xZswZ/+MMf8E//9E+1+zZv3owzzjgD3bp1w+DBg4X3AdEZOjsSmZx77rno27cv/vM//zNV9oMHD8a6deswZcqUuvufffZZfP755zj33HPRu3fvukbE//7v/6J3795Yt24devToUbs/reFQrVbx9a9/Hf/4j/9Yu2/Hjh348pe/jFdeeQU9e/aU/aoEUQjOP/98LF26FN27d69J9+tf/zruuuuu3BI+AJxxxhn46KOP0NbWVivjA4cG4U6fPh0PPfQQqtUq7rzzTnzjG98AALS3t2Pfvn2153bv3r32/0l/09VqFUEQ4Nlnn8VRRx0F4NDYn+7du+P//u//cOSRR1LjXTE0QI/IZMuWLfj0009ryTuJiRMn4p133sELL7xQ+6PesGEDHnro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\n",
"text/plain": [
"<Figure size 576x396 with 2 Axes>"
]
......@@ -137,35 +144,59 @@
}
],
"source": [
"test.plot_heatmaps(['B_Center', 'W_Center'], i=1)"
"test.plot_heatmaps(['B_Center', 'W_Center'], i=2)"
]
},
{
"cell_type": "code",
"execution_count": 17,
"execution_count": 22,
"metadata": {},
"outputs": [],
"outputs": [
{
"ename": "ValueError",
"evalue": "Distances not computed. Read the documentation for more details",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<timed exec>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n",
"\u001b[0;32m~/PycharmProjects/acrona/source/classes.py\u001b[0m in \u001b[0;36mget_distances\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 315\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mtable_dict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdistances\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtyp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"dist\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 316\u001b[0m raise ValueError(\n\u001b[0;32m--> 317\u001b[0;31m \u001b[0;34m\"Distances not computed. Read the documentation for more details\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 318\u001b[0m )\n\u001b[1;32m 319\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: Distances not computed. Read the documentation for more details"
]
}
],
"source": [
"%%time\n",
"test = DLC_social_1_coords.get_distances()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 40.5 ms, sys: 21.3 ms, total: 61.8 ms\n",
"Wall time: 61.2 ms\n"
]
},
{
"data": {
"text/plain": [
"'dist'"
"'angles'"
]
},
"execution_count": 18,
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"test = DLC_social_1_coords.get_angles(degrees=True)\n",
"test._type"
]
},
......@@ -182,14 +213,36 @@
"metadata": {},
"outputs": [],
"source": [
"#Which angles to compute?\n",
"bp_net = {'B_Nose':['B_Left_ear','B_Right_ear'],\n",
" 'B_Left_ear':['B_Nose','B_Right_ear','B_Center','B_Left_flank'],\n",
" 'B_Right_ear':['B_Nose','B_Left_ear','B_Center','B_Right_flank'],\n",
" 'B_Center':['B_Left_ear','B_Right_ear','B_Left_flank','B_Right_flank','B_Tail_base'],\n",
" 'B_Left_flank':['B_Left_ear','B_Center','B_Tail_base'],\n",
" 'B_Right_flank':['B_Right_ear','B_Center','B_Tail_base'],\n",
" 'B_Tail_base':['B_Center','B_Left_flank','B_Right_flank']}"
"import numpy as np\n",
"from numpy.core.umath_tests import inner1d\n",
"\n",
"def angle(a,b,c, degrees=False):\n",
"\n",
" ba = a - b\n",
" bc = c - b\n",
"\n",
" cosine_angle = inner1d(ba, bc) / (np.linalg.norm(ba, axis=1) * np.linalg.norm(bc, axis=1))\n",
" angle = np.arccos(cosine_angle)\n",
" \n",
" if degrees:\n",
" return np.degrees(angle)\n",
" \n",
" return angle"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def angle_trio(array, degrees=False):\n",
" \n",
" a, b, c = array\n",
" \n",
" return np.array([angle(a, b, c, degrees=degrees),\n",
" angle(a, c, b, degrees=degrees),\n",
" angle(b, a, c, degrees=degrees)])"
]
},
{
......@@ -198,8 +251,42 @@
"metadata": {},
"outputs": [],
"source": [
"import networkx as nx\n",
"bp_net = nx.Graph(bp_net)"
"def table_dict_angles(connectivity, table_dict, degrees=False):\n",
" '''\n",
" \n",
" Computes all the angles between adjacent bodypart trios per video and per frame in the data.\n",
" Parameters:\n",
" connectivity (dictionary): dict stating to which bodyparts each bodypart is connected;\n",
" table_dict (dict of dataframes): tables loaded from the data;\n",
" degrees (bool): Flag stating if the result should be in degrees. Radians if False.\n",
" draw (bool): Draws a simple connectivity graph if True. False by default.\n",
" \n",
" Output:\n",
" angle_dict (dictionary): dict containing angle dataframes per video\n",
" \n",
" '''\n",
" \n",
" bp_net = nx.Graph(connectivity)\n",
" cliques = nx.enumerate_all_cliques(bp_net)\n",
" cliques = [i for i in cliques if len(i) == 3]\n",
" \n",
" angle_dict = {}\n",
" for key,tab in table_dict.items():\n",
" \n",
" dats = []\n",
" for clique in cliques:\n",
" dat = pd.DataFrame(angle_trio(np.array(tab[clique]).reshape(3,tab.shape[0],2), degrees=degrees)).T\n",
" \n",
" orders = [[0,1,2],[0,2,1],[1,0,2]]\n",
" dat.columns = [tuple(clique[i] for i in order) for order in orders]\n",
" \n",
" dats.append(dat)\n",
" \n",
" dats = pd.concat(dats, axis=1)\n",
" \n",
" angle_dict[key] = dats\n",
" \n",
" return angle_dict"
]
},
{
......@@ -208,7 +295,7 @@
"metadata": {},
"outputs": [],
"source": [
"nx.draw(bp_net, with_labels=True)"
"example = DLC_social_1_coords.get_coords(center=False, polar=False)"
]
},
{
......@@ -217,8 +304,8 @@
"metadata": {},
"outputs": [],
"source": [
"all_cliques = nx.enumerate_all_cliques(bp_net)\n",
"all_cliques = [i for i in all_cliques if len(i) == 3]"
"%%time\n",
"table_dict_angles(bp_dict, example, degrees=True)"
]
},
{
......@@ -227,25 +314,24 @@
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"ba = a - b\n",
"bc = c - b\n",
"\n",
"a = np.array([32.49, -39.96])\n",
"b = np.array([31.39, -39.28])\n",
"c = np.array([31.14, -38.09])\n",
"print(ba)\n",
"print(bc)\n",
"\n",
"dots = []\n",
"for a in range(len(ba)):\n",
" dots.append(np.dot(ba[a], bc[a]))\n",
" \n",
"print(dots)\n",
"\n",
"def angle(a,b,c, degrees=False):\n",
"from numpy.core.umath_tests import inner1d\n",
"\n",
" ba = a - b\n",
" bc = c - b\n",
"cosine_angle = inner1d(ba, bc)\n",
"print(np.linalg.norm(ba, axis=1))\n",
"\n",
" cosine_angle = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc))\n",
" angle = np.arccos(cosine_angle)\n",
" \n",
" if degrees:\n",
" return np.degrees(angle)\n",
" \n",
" return angle"
"print(cosine_angle)"
]
},
{
......@@ -254,13 +340,8 @@
"metadata": {},
"outputs": [],
"source": [
"def angle_trio(array, degrees=False):\n",
" \n",
" a, b, c = array[:,0], array[:,1], array[:,2]\n",
" \n",
" return np.array([angle(a, b, c, degrees=degrees),\n",
" angle(a, c, b, degrees=degrees),\n",
" angle(b, a, c, degrees=degrees)])"
"%%time\n",
"angle_trio(np.array([a[0], b[0], c[0]]), degrees=True)"
]
},
{
......@@ -269,7 +350,8 @@
"metadata": {},
"outputs": [],
"source": [
"example = DLC_social_1_coords.get_coords(center=False, polar=False)['Day2Test13DLC']"
"%%time\n",
"angle_trio([a, b, c], degrees=False).shape"
]
},
{
......@@ -278,8 +360,7 @@
"metadata": {},
"outputs": [],
"source": [
"%%time\n",
"angle_trio(a, b, c, degrees=True)"
"np.array([a, b, c]).shape"
]
},
{
......@@ -297,7 +378,47 @@
"metadata": {},
"outputs": [],
"source": [
"angle_trio(np.array(example[all_cliques[0]]).reshape(14999,3,2))"
"example[all_cliques[0]]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%%time\n",
"dats = []\n",
"for clique in all_cliques:\n",
" dats.append(pd.DataFrame(angle_trio(np.array(example[clique]).reshape(3,14999,2), degrees=True)))\n",
"dats = pd.concat(dats).T"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"dats"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"plt.plot(dats.iloc[:,0])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"example"
]
},
{
......
%% Cell type:code id: tags:
``` python
%load_ext autoreload
%autoreload 2
import warnings
warnings.filterwarnings("ignore")
```
%% Cell type:code id: tags:
``` python
from source.utils import *
from source.classes import *
import pickle
import matplotlib.pyplot as plt
import pandas as pd
from collections import defaultdict
```
%% Cell type:code id: tags:
``` python
with open('../../Desktop/DLC_social_1/DLC_social_1_exp_conditions.pickle', 'rb') as handle:
Treatment_dict = pickle.load(handle)
```
%% Cell type:code id: tags:
``` python
#Which angles to compute?
bp_dict = {'B_Nose':['B_Left_ear','B_Right_ear'],
'B_Left_ear':['B_Nose','B_Right_ear','B_Center','B_Left_flank'],
'B_Right_ear':['B_Nose','B_Left_ear','B_Center','B_Right_flank'],
'B_Center':['B_Left_ear','B_Right_ear','B_Left_flank','B_Right_flank','B_Tail_base'],
'B_Left_flank':['B_Left_ear','B_Center','B_Tail_base'],
'B_Right_flank':['B_Right_ear','B_Center','B_Tail_base'],
'B_Tail_base':['B_Center','B_Left_flank','B_Right_flank']}
```
%% Cell type:code id: tags:
``` python
DLC_social_1 = get_coordinates(path='../../Desktop/DLC_social_1/',#Path where to find the required files
p=16, #Number of processes used for parallelization
smooth_alpha=0.1, #Alpha value for exponentially weighted smoothing
distances=['B_Center','B_Nose','B_Left_ear','B_Right_ear','B_Left_flank',
'B_Right_flank','B_Tail_base'],
smooth_alpha=0, #Alpha value for exponentially weighted smoothing
distances=False,#['B_Center','B_Nose','B_Left_ear','B_Right_ear','B_Left_flank',
#'B_Right_flank','B_Tail_base'],
ego=False,
angles=True,
connectivity=bp_dict,
arena='circular', #Type of arena used in the experiments
arena_dims=[380], #Dimensions of the arena. Just one if it's circular
video_format='.mp4',
table_format='.h5',
exp_conditions=Treatment_dict)
```
%% Cell type:code id: tags:
``` python
%%time
DLC_social_1_coords = DLC_social_1.run(verbose=True)
```
%%%% Output: stream
Loading and smoothing trajectories...
%%%% Output: stream
100%|██████████| 47/47 [00:37<00:00, 1.26it/s]
0%| | 0/47 [00:00<?, ?it/s]
%%%% Output: stream
Computing distance based coordinates...
%%%% Output: stream
100%|██████████| 47/47 [03:33<00:00, 4.53s/it]
%%%% Output: stream
Done!
%%%% Output: stream
CPU times: user 2.3 s, sys: 565 ms, total: 2.87 s
Wall time: 3.21 s
%% Cell type:code id: tags:
``` python
%%time
test = DLC_social_1_coords.get_coords(center=True, polar=False)
test._type
```
%%%% Output: stream
CPU times: user 13.9 s, sys: 82.5 ms, total: 14 s
Wall time: 14 s
%%%% Output: execute_result
'coords'
%% Cell type:code id: tags:
``` python
test.plot_heatmaps(['B_Center', 'W_Center'], i=1)
test.plot_heatmaps(['B_Center', 'W_Center'], i=2)
```
%%%% Output: display_data
%% Cell type:code id: tags:
``` python
%%time
test = DLC_social_1_coords.get_distances()
```
%%%% Output: error
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<timed exec> in <module>
~/PycharmProjects/acrona/source/classes.py in get_distances(self)
315 return table_dict(self.distances, typ="dist")
316 raise ValueError(
--> 317 "Distances not computed. Read the documentation for more details"
318 )
319
ValueError: Distances not computed. Read the documentation for more details
%% Cell type:code id: tags:
``` python
%%time
test = DLC_social_1_coords.get_angles(degrees=True)
test._type
```
%%%% Output: stream
CPU times: user 40.5 ms, sys: 21.3 ms, total: 61.8 ms
Wall time: 61.2 ms
%%%% Output: execute_result
'dist'
'angles'
%% Cell type:markdown id: tags:
# Angle computing draft
%% Cell type:code id: tags:
``` python
#Which angles to compute?
bp_net = {'B_Nose':['B_Left_ear','B_Right_ear'],
'B_Left_ear':['B_Nose','B_Right_ear','B_Center','B_Left_flank'],
'B_Right_ear':['B_Nose','B_Left_ear','B_Center','B_Right_flank'],
'B_Center':['B_Left_ear','B_Right_ear','B_Left_flank','B_Right_flank','B_Tail_base'],
'B_Left_flank':['B_Left_ear','B_Center','B_Tail_base'],
'B_Right_flank':['B_Right_ear','B_Center','B_Tail_base'],
'B_Tail_base':['B_Center','B_Left_flank','B_Right_flank']}
import numpy as np
from numpy.core.umath_tests import inner1d
def angle(a,b,c, degrees=False):
ba = a - b
bc = c - b
cosine_angle = inner1d(ba, bc) / (np.linalg.norm(ba, axis=1) * np.linalg.norm(bc, axis=1))
angle = np.arccos(cosine_angle)
if degrees:
return np.degrees(angle)
return angle
```
%% Cell type:code id: tags:
``` python
import networkx as nx
bp_net = nx.Graph(bp_net)
def angle_trio(array, degrees=False):
a, b, c = array
return np.array([angle(a, b, c, degrees=degrees),
angle(a, c, b, degrees=degrees),
angle(b, a, c, degrees=degrees)])
```
%% Cell type:code id: tags:
``` python
nx.draw(bp_net, with_labels=True)
def table_dict_angles(connectivity, table_dict, degrees=False):
'''
Computes all the angles between adjacent bodypart trios per video and per frame in the data.
Parameters:
connectivity (dictionary): dict stating to which bodyparts each bodypart is connected;
table_dict (dict of dataframes): tables loaded from the data;
degrees (bool): Flag stating if the result should be in degrees. Radians if False.
draw (bool): Draws a simple connectivity graph if True. False by default.
Output:
angle_dict (dictionary): dict containing angle dataframes per video
'''