{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "99fa49a9",
   "metadata": {},
   "source": [
    "# Notebooks Data Analysis "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9b898c9",
   "metadata": {},
   "source": [
    "## Load Data  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c1280056",
   "metadata": {},
   "outputs": [],
   "source": [
    "## import all necessary packages for the analysis \n",
    "import numpy as np\n",
    "import json\n",
    "import pandas as pd\n",
    "#import matplotlib as plt \n",
    "import matplotlib.pyplot as plt\n",
    "from collections import Counter"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "78741b91",
   "metadata": {},
   "outputs": [],
   "source": [
    "## path to file with data that needs to be analized\n",
    "filepath = \"divided_attention_club_current_data.json\" # please change with current data\n",
    "\n",
    "## read in the json file \n",
    "with open(filepath, \"r\", encoding=\"utf-8\") as f:\n",
    "    data_json = json.load(f)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "75671435",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "You are analizing the data of 32 participants\n"
     ]
    }
   ],
   "source": [
    "## get data from the string at the last index (data is stored there) (0,1,2)-> 2 is last index\n",
    "relevant_data = data_json[2]\n",
    "#print(relevant_data.keys())\n",
    "\n",
    "data = relevant_data['data']\n",
    "#type(data)\n",
    "print('You are analizing the data of ' + str(len(data)) + ' participants')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "118b8c41",
   "metadata": {},
   "outputs": [],
   "source": [
    "# create a pandas dataframe to store all relevant data\n",
    "df_raw = pd.DataFrame(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "318637f0",
   "metadata": {},
   "outputs": [],
   "source": [
    "# to analize the data in the last column (as all relevant data is stord here) -> store data from last colum as a string in a new list\n",
    "all_trials = []\n",
    "\n",
    "for participant in data:\n",
    "    pid = participant[\"participant_id\"]\n",
    "\n",
    "    # JSON-STRING → Python-Liste\n",
    "    trials = json.loads(participant[\"json_data\"])\n",
    "\n",
    "    for trial in trials:\n",
    "        trial[\"participant_id\"] = pid\n",
    "        all_trials.append(trial)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "f4808cfc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['block', 'task', 'rt', 'response', 'trial_type', 'trial_index',\n",
       "       'plugin_version', 'time_elapsed', 'participantIndex', 'participant_id',\n",
       "       'vp_code', 'notif_block2_condition', 'notif_block3_condition',\n",
       "       'block1_symbols', 'block2_symbols', 'block3_symbols',\n",
       "       'notif_block2_animals', 'notif_block3_animals', 'demo_age_range',\n",
       "       'demo_gender', 'demo_german_level', 'demo_education', 'demo_program',\n",
       "       'demo_semester', 'demo_vision', 'demo_handedness', 'demo_screentime',\n",
       "       'which', 'trial_in_block', 'phase', 'symbol', 'correct_key',\n",
       "       'notification_flag', 'notification_sentence', 'key_pressed', 'correct',\n",
       "       'animals_order', 'selected_animals', 'notified_animals', 'hits',\n",
       "       'misses', 'false_alarms', 'correct_rejections'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# convert list of all trials into a dataframe \n",
    "df_raw_trials = pd.DataFrame(all_trials)\n",
    "#df_raw_trials.head()\n",
    "df_raw_trials.columns # shows available columns to access data "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "57bdee86",
   "metadata": {},
   "source": [
    "## Analisiz for the key matching task"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "db5bfc7c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>block</th>\n",
       "      <th>task</th>\n",
       "      <th>rt</th>\n",
       "      <th>response</th>\n",
       "      <th>trial_type</th>\n",
       "      <th>trial_index</th>\n",
       "      <th>plugin_version</th>\n",
       "      <th>time_elapsed</th>\n",
       "      <th>participantIndex</th>\n",
       "      <th>participant_id</th>\n",
       "      <th>...</th>\n",
       "      <th>notification_sentence</th>\n",
       "      <th>key_pressed</th>\n",
       "      <th>correct</th>\n",
       "      <th>animals_order</th>\n",
       "      <th>selected_animals</th>\n",
       "      <th>notified_animals</th>\n",
       "      <th>hits</th>\n",
       "      <th>misses</th>\n",
       "      <th>false_alarms</th>\n",
       "      <th>correct_rejections</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>instructions</td>\n",
       "      <td>NaN</td>\n",
       "      <td>13808.0</td>\n",
       "      <td></td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>1</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>67400</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>3</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>68408</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>1862.0</td>\n",
       "      <td>ArrowUp</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>4</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>70271</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>up</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>5</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>71075</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>NaN</td>\n",
       "      <td>None</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>6</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>72078</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 43 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          block         task       rt response              trial_type  \\\n",
       "1  instructions          NaN  13808.0           html-keyboard-response   \n",
       "3             1  keymatching      NaN     None  html-keyboard-response   \n",
       "4             1  keymatching   1862.0  ArrowUp  html-keyboard-response   \n",
       "5           NaN          NaN      NaN     None  html-keyboard-response   \n",
       "6             1  keymatching      NaN     None  html-keyboard-response   \n",
       "\n",
       "   trial_index plugin_version  time_elapsed  participantIndex participant_id  \\\n",
       "1            1          2.1.0         67400             20266         OTMA27   \n",
       "3            3          2.1.0         68408             20266         OTMA27   \n",
       "4            4          2.1.0         70271             20266         OTMA27   \n",
       "5            5          2.1.0         71075             20266         OTMA27   \n",
       "6            6          2.1.0         72078             20266         OTMA27   \n",
       "\n",
       "   ... notification_sentence key_pressed correct animals_order  \\\n",
       "1  ...                   NaN         NaN     NaN           NaN   \n",
       "3  ...                  None         NaN     NaN           NaN   \n",
       "4  ...                  None          up   False           NaN   \n",
       "5  ...                   NaN         NaN     NaN           NaN   \n",
       "6  ...                  None         NaN     NaN           NaN   \n",
       "\n",
       "  selected_animals notified_animals hits misses false_alarms  \\\n",
       "1              NaN              NaN  NaN    NaN          NaN   \n",
       "3              NaN              NaN  NaN    NaN          NaN   \n",
       "4              NaN              NaN  NaN    NaN          NaN   \n",
       "5              NaN              NaN  NaN    NaN          NaN   \n",
       "6              NaN              NaN  NaN    NaN          NaN   \n",
       "\n",
       "  correct_rejections  \n",
       "1                NaN  \n",
       "3                NaN  \n",
       "4                NaN  \n",
       "5                NaN  \n",
       "6                NaN  \n",
       "\n",
       "[5 rows x 43 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# get data for the key matching task from all parcipants \n",
    "df_raw_key_matching = df_raw_trials[df_raw_trials[\"trial_type\"] == \"html-keyboard-response\"]\n",
    "\n",
    "\n",
    "# tests to check if the correct data is stored \n",
    "#df_raw_key_matching.shape        # (Anzahl Trials, Anzahl Spalten)\n",
    "#df_raw_key_matching.columns      # welche Keys es gibt\n",
    "df_raw_key_matching.head()       # erste 5 Trials\n",
    "#num_rows = len(df_key_matching) \n",
    "#print(num_rows)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "03490641",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>block</th>\n",
       "      <th>task</th>\n",
       "      <th>rt</th>\n",
       "      <th>response</th>\n",
       "      <th>trial_type</th>\n",
       "      <th>trial_index</th>\n",
       "      <th>plugin_version</th>\n",
       "      <th>time_elapsed</th>\n",
       "      <th>participantIndex</th>\n",
       "      <th>participant_id</th>\n",
       "      <th>...</th>\n",
       "      <th>notification_sentence</th>\n",
       "      <th>key_pressed</th>\n",
       "      <th>correct</th>\n",
       "      <th>animals_order</th>\n",
       "      <th>selected_animals</th>\n",
       "      <th>notified_animals</th>\n",
       "      <th>hits</th>\n",
       "      <th>misses</th>\n",
       "      <th>false_alarms</th>\n",
       "      <th>correct_rejections</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>1862.0</td>\n",
       "      <td>ArrowUp</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>4</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>70271</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>up</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>1</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>850.0</td>\n",
       "      <td>ArrowUp</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>7</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>72928</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>up</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>1</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>343.0</td>\n",
       "      <td>ArrowLeft</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>10</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>75082</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>left</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>1</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>642.0</td>\n",
       "      <td>ArrowRight</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>13</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>77548</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>right</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>1</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>386.0</td>\n",
       "      <td>ArrowUp</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>16</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>79745</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>up</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 43 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   block         task      rt    response              trial_type  \\\n",
       "4      1  keymatching  1862.0     ArrowUp  html-keyboard-response   \n",
       "7      1  keymatching   850.0     ArrowUp  html-keyboard-response   \n",
       "10     1  keymatching   343.0   ArrowLeft  html-keyboard-response   \n",
       "13     1  keymatching   642.0  ArrowRight  html-keyboard-response   \n",
       "16     1  keymatching   386.0     ArrowUp  html-keyboard-response   \n",
       "\n",
       "    trial_index plugin_version  time_elapsed  participantIndex participant_id  \\\n",
       "4             4          2.1.0         70271             20266         OTMA27   \n",
       "7             7          2.1.0         72928             20266         OTMA27   \n",
       "10           10          2.1.0         75082             20266         OTMA27   \n",
       "13           13          2.1.0         77548             20266         OTMA27   \n",
       "16           16          2.1.0         79745             20266         OTMA27   \n",
       "\n",
       "    ... notification_sentence key_pressed correct animals_order  \\\n",
       "4   ...                  None          up   False           NaN   \n",
       "7   ...                  None          up   False           NaN   \n",
       "10  ...                  None        left   False           NaN   \n",
       "13  ...                  None       right   False           NaN   \n",
       "16  ...                  None          up   False           NaN   \n",
       "\n",
       "   selected_animals notified_animals hits misses false_alarms  \\\n",
       "4               NaN              NaN  NaN    NaN          NaN   \n",
       "7               NaN              NaN  NaN    NaN          NaN   \n",
       "10              NaN              NaN  NaN    NaN          NaN   \n",
       "13              NaN              NaN  NaN    NaN          NaN   \n",
       "16              NaN              NaN  NaN    NaN          NaN   \n",
       "\n",
       "   correct_rejections  \n",
       "4                 NaN  \n",
       "7                 NaN  \n",
       "10                NaN  \n",
       "13                NaN  \n",
       "16                NaN  \n",
       "\n",
       "[5 rows x 43 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# discard all trials that have no value for response \n",
    "df_key_matching = df_raw_key_matching[(df_raw_key_matching[\"task\"] == \"keymatching\") & (df_raw_key_matching['response'].notnull())]\n",
    "df_key_matching.head() "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a4f2fbda",
   "metadata": {},
   "source": [
    "ANOVA \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "5c10f43c",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_Anova = df_key_matching.copy()\n",
    "\n",
    "def assign_condition(row):\n",
    "    if row[\"block\"] == 1:\n",
    "        return \"none\"\n",
    "    elif row[\"block\"] == 2:\n",
    "        return row[\"notif_block2_condition\"]\n",
    "    elif row[\"block\"] == 3:\n",
    "        return row[\"notif_block3_condition\"]\n",
    "\n",
    "df_Anova[\"condition\"] = df_Anova.apply(assign_condition, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "aafb0190",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "condition\n",
       "none         3062\n",
       "regular      3057\n",
       "irregular    3047\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_Anova[\"condition\"].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "35fb928e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# nur korrekte Trials\n",
    "df_Anova[\"correct\"] = df_Anova[\"response\"] == df_Anova[\"correct_key\"]\n",
    "df_rt = df_Anova[df_Anova[\"correct\"]]\n",
    "\n",
    "# RT > 0 (Sicherheitscheck)\n",
    "df_rt = df_rt[df_rt[\"rt\"] > 0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "4a03a57c",
   "metadata": {},
   "outputs": [],
   "source": [
    "summary = (\n",
    "    df_rt\n",
    "    .groupby([\"participant_id\", \"condition\"])\n",
    "    .agg(mean_rt=(\"rt\", \"mean\"))\n",
    "    .reset_index()\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "d1f59cbc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Series([], dtype: int64)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "summary.head()\n",
    "summary.groupby(\"participant_id\").size()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "ca3fa19b",
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'statsmodels'",
     "output_type": "error",
     "traceback": [
      "\u001b[31m---------------------------------------------------------------------------\u001b[39m",
      "\u001b[31mModuleNotFoundError\u001b[39m                       Traceback (most recent call last)",
      "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[14]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mstatsmodels\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mstats\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01manova\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m AnovaRM\n\u001b[32m      3\u001b[39m anova = AnovaRM(\n\u001b[32m      4\u001b[39m     summary,\n\u001b[32m      5\u001b[39m     depvar=\u001b[33m\"\u001b[39m\u001b[33mmean_rt\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m      6\u001b[39m     subject=\u001b[33m\"\u001b[39m\u001b[33mparticipant_id\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m      7\u001b[39m     within=[\u001b[33m\"\u001b[39m\u001b[33mcondition\u001b[39m\u001b[33m\"\u001b[39m]\n\u001b[32m      8\u001b[39m )\n\u001b[32m     10\u001b[39m res = anova.fit()\n",
      "\u001b[31mModuleNotFoundError\u001b[39m: No module named 'statsmodels'"
     ]
    }
   ],
   "source": [
    "from statsmodels.stats.anova import AnovaRM\n",
    "\n",
    "anova = AnovaRM(\n",
    "    summary,\n",
    "    depvar=\"mean_rt\",\n",
    "    subject=\"participant_id\",\n",
    "    within=[\"condition\"]\n",
    ")\n",
    "\n",
    "res = anova.fit()\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b30060d",
   "metadata": {},
   "source": [
    "more analysis \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "e0ed0fc2",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_key_matching_block1 = df_key_matching[df_key_matching[\"block\"]==1]\n",
    "df_key_matching_block2 = df_key_matching[df_key_matching[\"block\"]==2]\n",
    "df_key_matching_block3 = df_key_matching[df_key_matching[\"block\"]==3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "be9c6899",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>block</th>\n",
       "      <th>task</th>\n",
       "      <th>rt</th>\n",
       "      <th>response</th>\n",
       "      <th>trial_type</th>\n",
       "      <th>trial_index</th>\n",
       "      <th>plugin_version</th>\n",
       "      <th>time_elapsed</th>\n",
       "      <th>participantIndex</th>\n",
       "      <th>participant_id</th>\n",
       "      <th>...</th>\n",
       "      <th>notification_sentence</th>\n",
       "      <th>key_pressed</th>\n",
       "      <th>correct</th>\n",
       "      <th>animals_order</th>\n",
       "      <th>selected_animals</th>\n",
       "      <th>notified_animals</th>\n",
       "      <th>hits</th>\n",
       "      <th>misses</th>\n",
       "      <th>false_alarms</th>\n",
       "      <th>correct_rejections</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>587</th>\n",
       "      <td>3</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>272.0</td>\n",
       "      <td>ArrowRight</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>587</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>601678</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>right</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>590</th>\n",
       "      <td>3</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>162.0</td>\n",
       "      <td>ArrowLeft</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>590</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>603655</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>Die Antilope rennt über die Savanne.</td>\n",
       "      <td>left</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>593</th>\n",
       "      <td>3</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>726.0</td>\n",
       "      <td>ArrowUp</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>593</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>606226</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>up</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>596</th>\n",
       "      <td>3</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>242.0</td>\n",
       "      <td>ArrowLeft</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>596</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>608283</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>None</td>\n",
       "      <td>left</td>\n",
       "      <td>False</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>599</th>\n",
       "      <td>3</td>\n",
       "      <td>keymatching</td>\n",
       "      <td>1168.0</td>\n",
       "      <td>ArrowLeft</td>\n",
       "      <td>html-keyboard-response</td>\n",
       "      <td>599</td>\n",
       "      <td>2.1.0</td>\n",
       "      <td>611265</td>\n",
       "      <td>20266</td>\n",
       "      <td>OTMA27</td>\n",
       "      <td>...</td>\n",
       "      <td>Die Libelle fliegt über das Wasser.</td>\n",
       "      <td>left</td>\n",
       "      <td>True</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 43 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    block         task      rt    response              trial_type  \\\n",
       "587     3  keymatching   272.0  ArrowRight  html-keyboard-response   \n",
       "590     3  keymatching   162.0   ArrowLeft  html-keyboard-response   \n",
       "593     3  keymatching   726.0     ArrowUp  html-keyboard-response   \n",
       "596     3  keymatching   242.0   ArrowLeft  html-keyboard-response   \n",
       "599     3  keymatching  1168.0   ArrowLeft  html-keyboard-response   \n",
       "\n",
       "     trial_index plugin_version  time_elapsed  participantIndex  \\\n",
       "587          587          2.1.0        601678             20266   \n",
       "590          590          2.1.0        603655             20266   \n",
       "593          593          2.1.0        606226             20266   \n",
       "596          596          2.1.0        608283             20266   \n",
       "599          599          2.1.0        611265             20266   \n",
       "\n",
       "    participant_id  ...                 notification_sentence key_pressed  \\\n",
       "587         OTMA27  ...                                  None       right   \n",
       "590         OTMA27  ...  Die Antilope rennt über die Savanne.        left   \n",
       "593         OTMA27  ...                                  None          up   \n",
       "596         OTMA27  ...                                  None        left   \n",
       "599         OTMA27  ...   Die Libelle fliegt über das Wasser.        left   \n",
       "\n",
       "    correct animals_order selected_animals notified_animals hits misses  \\\n",
       "587   False           NaN              NaN              NaN  NaN    NaN   \n",
       "590   False           NaN              NaN              NaN  NaN    NaN   \n",
       "593   False           NaN              NaN              NaN  NaN    NaN   \n",
       "596   False           NaN              NaN              NaN  NaN    NaN   \n",
       "599    True           NaN              NaN              NaN  NaN    NaN   \n",
       "\n",
       "    false_alarms correct_rejections  \n",
       "587          NaN                NaN  \n",
       "590          NaN                NaN  \n",
       "593          NaN                NaN  \n",
       "596          NaN                NaN  \n",
       "599          NaN                NaN  \n",
       "\n",
       "[5 rows x 43 columns]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_key_matching_block3.head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5f102c68",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_filtered_2_IR = df_key_matching_block2[\n",
    "    df_key_matching_block2['notif_block2_condition'] == 'irregular'\n",
    "]\n",
    "\n",
    "df_filtered_2_R = df_key_matching_block2[\n",
    "    df_key_matching_block2['notif_block2_condition'] == 'regular'\n",
    "]\n",
    "\n",
    "df_filtered_3_IR = df_key_matching_block3[\n",
    "    df_key_matching_block3['notif_block2_condition'] == 'irregular'\n",
    "]\n",
    "\n",
    "df_filtered_3_R = df_key_matching_block3[\n",
    "    df_key_matching_block3['notif_block2_condition'] == 'regular'\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "id": "e78c6675",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The amount of correct and false key presses over all participants in block 2 with the irregular case correct\n",
      "True     1425\n",
      "False     475\n",
      "Name: count, dtype: int64\n",
      "The amount of correct and false key presses over all participants in block 2 with the regular case correct\n",
      "True     874\n",
      "False    269\n",
      "Name: count, dtype: int64\n",
      "The amount of correct and false key presses over all participants in block 3 with the irregular case correct\n",
      "True     1371\n",
      "False     543\n",
      "Name: count, dtype: int64\n",
      "The amount of correct and false key presses over all participants in block 3 with the regular case correct\n",
      "True     847\n",
      "False    300\n",
      "Name: count, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "correct_counts_2_IR = df_filtered_2_IR['correct'].value_counts()\n",
    "print('The amount of correct and false key presses over all participants in block 2 with the irregular case ' +str(correct_counts_2_IR))\n",
    "\n",
    "correct_counts_2_R = df_filtered_2_R['correct'].value_counts()\n",
    "print('The amount of correct and false key presses over all participants in block 2 with the regular case ' + str(correct_counts_2_R))\n",
    "\n",
    "correct_counts_3_IR = df_filtered_3_IR['correct'].value_counts()\n",
    "print('The amount of correct and false key presses over all participants in block 3 with the irregular case ' + str(correct_counts_3_IR))\n",
    "\n",
    "correct_counts_3_R = df_filtered_3_R['correct'].value_counts()\n",
    "print('The amount of correct and false key presses over all participants in block 3 with the regular case ' + str(correct_counts_3_R))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "id": "3618fef3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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P8BYPRUA6h/zcO3n4Z9/adG3b19VVlbqtdde0//+7//qgQceMD+HGTNmaNiwYTW+xrn1Si5nrvX09Kyx3+e+7LgQu92utWvXas6cOZo+fbrZXlpaqhMnTtR4DnMtrgZCN3CVZWdnS/ppor6Qfv36ac2aNfruu+/Mb9Wln75x9vHxUa9evSRJgwYN0uzZs7V582bdddddF33fFi1a6OWXX9Y111yj0aNH6/Tp0/r9739fq/72799f1113nTIzMx1u4b6ULl261Lq2vvn4+Khv3776/PPP1bVrV7Vs2fKCtdHR0frTn/6kffv2Odxivnr16mq14eHh+vLLLx3aDh48qAMHDlwydFsslmr/0Hn//ff17bff6oYbbqjNsAAAV4h5uO7mzZunv/3tb5o9e7aGDRumjh07KjIyUl988UW1L5TPFx0drX/+858OX1JXVVXpr3/9a7XamubazZs3q7i4+KLvYbFYZBhGtbn2tddeu6JH24ArRegGnCgnJ8dcYfv48eP6+9//rszMTP3qV7+q8Xbmc+bMmaO1a9eqb9++mj17tgIDA/Xmm2/q/fff17x588xvuBMTE/X222/r3nvv1fTp0/WLX/xCJSUl2rJli+Li4tS3b99qr71gwQL5+flp3LhxKi4u1tSpUy/YjwMHDpjPqT333HP6+uuv9fXXX5vHr7/++ov+o8XVXnjhBd1xxx365S9/qd///vcKDw/XqVOndOjQIb333nvavHmzpJ8+x9dff12DBg3S3LlzFRISolWrVpk/99Kixf8tf5GQkKCHH35Y48aN0/33368jR45o3rx5tfoc4uLilJ6erptuukldu3ZVVlaW5s+fr+uuu845HwAANHPMw/UrICBAM2bM0LRp07Rq1So9/PDDevnllzVo0CANHDhQo0eP1rXXXqsTJ05o//792r17txmqZ86cqffee0/9+vXTzJkz5e3traVLl+r06dOSqs+1s2bN0uzZsxUdHa19+/YpLS3tklf4/f39deedd2r+/Plq3bq1wsPDtWXLFi1btqxOt/QD9cbVK7kBTVFNq6ZarVbj1ltvNRYuXGicPXvWoV41rNK5Z88eY8iQIYbVajVatmxp3HLLLTWuhF1YWGg8+eSTRrt27QwPDw8jODjYGDx4sPHVV18ZhuG4aurPzZ8/35BkzJ49+7LG8fPtYitzX4kLrV7u6+tb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XIurgdANXGXZ2dmS/m/l0Zr069dPa9as0XfffWd+qy799I2zj4+PevXqJUkaNGiQZs+erc2bN1/yJ0NatGihl19+Wddcc41Gjx6t06dP6/e//32dxrBlyxZVVVXphhtuuGhdly5d6vT69cHHx0d9+/bV559/rq5du170d0yjo6P1pz/9Sfv27XO4xXz16tXVasPDw/Xll186tB08eFAHDhy4ZOi2WCzV/qHz/vvv69tvv73kZwkAqB/Mw3U3b948/e1vf9Ps2bM1bNgwdezYUZGRkfriiy+qfaF8vujoaP3zn/90+JK6qqpKf/3rX6vV1jTXbt68WcXFxRd9D4vFIsMwqs21r7322hU92gZcKUI34EQ5OTnmCtvHjx/X3//+d2VmZupXv/pVjbcznzNnzhytXbtWffv21ezZsxUYGKg333xT77//vubNmyer1SpJSkxM1Ntvv617771X06dP1y9+8QuVlJRoy5YtiouLU9++fau99oIFC8zf9ywuLtbUqVMv2I+1a9fq1Vdf1dChQ9W+fXuVl5dr165dWrx4sW644QY9+uijV/gJOdcLL7ygO+64Q7/85S/1+9//XuHh4Tp16pQOHTqk9957T5s3b5b00+f4+uuva9CgQZo7d65CQkK0atUq8+deWrT4v+UvEhIS9PDDD2vcuHG6//77deTIEc2bN++i/3g7Jy4uTunp6brpppvUtWtXZWVlaf78+bruuuuc8wEAQDPHPFy/AgICNGPGDE2bNk2rVq3Sww8/rJdfflmDBg3SwIEDNXr0aF177bU6ceKE9u/fr927d5uheubMmXrvvffUr18/zZw5U97e3lq6dKlOnz4tqfpcO2vWLM2ePVvR0dHat2+f0tLSzM/9Qvz9/XXnnXdq/vz5at26tcLDw7VlyxYtW7bssm/pB+qVq1dyA5qimlZNtVqtxq233mosXLjQOHv2rEO9alilc8+ePcaQIUMMq9VqtGzZ0rjllltqXAm7sLDQePLJJ4127doZHh4eRnBwsDF48GDjq6++MgzDcdXUn5s/f74hyZg9e/YFx7F//37jgQceMNq3b294eXkZXl5exk033WRMnTrVOH78eN0+nFq40Orlvr6+NdZLMsaPH1/jsdzcXOORRx4xrr32WsPDw8No06aN0adPH+MPf/iDQ11OTo7Rv39/w8vLywgMDDTGjBljrFixwpBkfPHFF2ZdVVWVMW/ePKNDhw6Gl5eX0aNHD2Pz5s21Wr28sLDQGDNmjBEcHGz4+PgYd9xxh/HJJ59UO/fcaqx//etfL+NTAwCcwzx8ZWqah88pKSkx2rVrZ0RGRhoVFRWGYRjGF198YcTHxxvBwcGGh4eHYbPZjLvuustYunSpw7mffPKJ0bNnT8PT09Ow2WzG1KlTjeeff96QZK4IbxiGUVpaakybNs0ICwszvL29jejoaCM7O7tWq5cfO3bMuP/++42AgADDz8/PuPvuu42cnJxq515sjEB9sxiGYVzFjA8Ajcbjjz+ut956S8ePH7/o7ekAAKBuYmNjdfjw4Us+nw40ZtxeDgCS5s6dq9DQUHXo0EHFxcVau3atXnvtNT3zzDMEbgAA6sGkSZPUrVs3hYWF6cSJE3rzzTeVmZmpZcuWubprgFMRugFAkoeHh+bPn69jx46poqJCkZGRWrhwoZ588klXdw0AgCahsrJSs2fPVn5+viwWizp37qyVK1fq4YcfdnXXAKfi9nIAAAAAAJykxaVLAAAAAABAXRC6AQAAAABwEkI3AAAAAABOQugGAAAAAMBJWL28lqqqqvTdd9/Jz89PFovF1d0BAKAawzB06tQphYaGqkWLxv29OvMuAKChq+28S+iupe+++05hYWGu7gYAAJd09OhRXXfdda7uxhVh3gUANBaXmncJ3bXk5+cn6acP1N/f38W9AQCguqKiIoWFhZlzVmPGvAsAaOhqO+8Sumvp3K1t/v7+TP4AgAatKdyOzbwLAGgsLjXvNu4HvgAAAAAAaMBcGro//vhjDRkyRKGhobJYLHrnnXcuWDt27FhZLBYtXrzYob20tFQTJkxQ69at5evrq6FDh+rYsWMONYWFhUpISJDVapXValVCQoJOnjxZ/wMCAAAAAOBnXBq6T58+rVtuuUVpaWkXrXvnnXf02WefKTQ0tNqxxMRErVmzRqtXr9bWrVtVXFysuLg4VVZWmjUjRoxQdna21q1bp3Xr1ik7O1sJCQn1Ph4AAAAAAH7Opc90Dxo0SIMGDbpozbfffqsnnnhC69ev1+DBgx2O2e12LVu2TCtXrlT//v0lSRkZGQoLC9PGjRs1cOBA7d+/X+vWrdOnn36qnj17SpJeffVV9e7dWwcOHFDHjh2dMzgAAAAAQLPXoJ/prqqqUkJCgqZOnaqbb7652vGsrCyVl5crNjbWbAsNDVVUVJS2bdsmSdq+fbusVqsZuCWpV69eslqtZk1NSktLVVRU5LABAAAAAHA5GnTofv755+Xu7q6JEyfWeDw/P18tW7ZUQECAQ3tISIjy8/PNmuDg4GrnBgcHmzU1SUlJMZ8Bt1qt/FYoAAAAAOCyNdjQnZWVpRdeeEHp6emX/dMnhmE4nFPT+efXnG/GjBmy2+3mdvTo0cvqAwAAAAAADTZ0f/LJJyooKFC7du3k7u4ud3d3HTlyRJMnT1Z4eLgkyWazqaysTIWFhQ7nFhQUKCQkxKz5/vvvq73+Dz/8YNbUxNPT0/xtUH4jFAAAAABQFw02dCckJOjLL79Udna2uYWGhmrq1Klav369JKl79+7y8PBQZmameV5eXp5ycnLUp08fSVLv3r1lt9u1Y8cOs+azzz6T3W43awAAAAAAcAaXrl5eXFysQ4cOmfu5ubnKzs5WYGCg2rVrp6CgIId6Dw8P2Ww2c8Vxq9WqMWPGaPLkyQoKClJgYKCmTJmiLl26mKuZd+rUSXfffbcee+wxvfzyy5Kkxx9/XHFxcaxcDgAAAABwKpeG7l27dqlv377m/qRJkyRJo0aNUnp6eq1eY9GiRXJ3d1d8fLxKSkrUr18/paeny83Nzax58803NXHiRHOV86FDh17yt8EBAAAAALhSFsMwDFd3ojEoKiqS1WqV3W7n+W4AQIPUlOaqpjQWAEDTVNu5yqVXuuF64dPfd3UXUEuH/zjY1V0AAFwh5t3Gg3kXQH1psAupAQAAAADQ2BG6AQAAAABwEkI3AAAAAABOQugGAAAAAMBJCN0AAAAAADgJoRsAAAAAACchdAMAAAAA4CSEbgAAAAAAnITQDQAAAACAkxC6AQAAAABwEkI3AAAAAABOQugGAACmiooKPfPMM4qIiJC3t7c6dOiguXPnqqqqyqwxDENJSUkKDQ2Vt7e3YmJitHfvXofXKS0t1YQJE9S6dWv5+vpq6NChOnbs2NUeDgAALkfoBgAApueff15Lly5VWlqa9u/fr3nz5mn+/PlKTU01a+bNm6eFCxcqLS1NO3fulM1m04ABA3Tq1CmzJjExUWvWrNHq1au1detWFRcXKy4uTpWVla4YFgAALuPu6g4AAICGY/v27br33ns1ePBgSVJ4eLjeeust7dq1S9JPV7kXL16smTNnatiwYZKkFStWKCQkRKtWrdLYsWNlt9u1bNkyrVy5Uv3795ckZWRkKCwsTBs3btTAgQNdMzgAAFyAK90AAMB0xx13aNOmTTp48KAk6YsvvtDWrVt1zz33SJJyc3OVn5+v2NhY8xxPT09FR0dr27ZtkqSsrCyVl5c71ISGhioqKsqsOV9paamKioocNgAAmgKudAMAANPTTz8tu92um266SW5ubqqsrNRzzz2nBx98UJKUn58vSQoJCXE4LyQkREeOHDFrWrZsqYCAgGo1584/X0pKip599tn6Hg4AAC7HlW4AAGB6++23lZGRoVWrVmn37t1asWKF/vSnP2nFihUOdRaLxWHfMIxqbee7WM2MGTNkt9vN7ejRo1c2EAAAGgiudAMAANPUqVM1ffp0DR8+XJLUpUsXHTlyRCkpKRo1apRsNpukn65mt23b1jyvoKDAvPpts9lUVlamwsJCh6vdBQUF6tOnT43v6+npKU9PT2cNCwAAl+FKNwAAMJ05c0YtWjj+88DNzc38ybCIiAjZbDZlZmaax8vKyrRlyxYzUHfv3l0eHh4ONXl5ecrJyblg6AYAoKniSjcAADANGTJEzz33nNq1a6ebb75Zn3/+uRYuXKhHHnlE0k+3lScmJio5OVmRkZGKjIxUcnKyfHx8NGLECEmS1WrVmDFjNHnyZAUFBSkwMFBTpkxRly5dzNXMAQBoLgjdAADAlJqaqlmzZmncuHEqKChQaGioxo4dq9mzZ5s106ZNU0lJicaNG6fCwkL17NlTGzZskJ+fn1mzaNEiubu7Kz4+XiUlJerXr5/S09Pl5ubmimEBAOAyFsMwDFd3ojEoKiqS1WqV3W6Xv7+/q7tTb8Knv+/qLqCWDv9xsKu7AKCBa0pzVVMay88x7zYezLsALqW2cxXPdAMAAAAA4CSEbgAAAAAAnITQDQAAAACAkxC6AQAAAABwEkI3AAAAAABOQugGAAAAAMBJCN0AAAAAADgJoRsAAAAAACchdAMAAAAA4CSEbgAAAAAAnMSlofvjjz/WkCFDFBoaKovFonfeecc8Vl5erqefflpdunSRr6+vQkNDNXLkSH333XcOr1FaWqoJEyaodevW8vX11dChQ3Xs2DGHmsLCQiUkJMhqtcpqtSohIUEnT568CiMEAAAAADRnLg3dp0+f1i233KK0tLRqx86cOaPdu3dr1qxZ2r17t/7+97/r4MGDGjp0qENdYmKi1qxZo9WrV2vr1q0qLi5WXFycKisrzZoRI0YoOztb69at07p165Sdna2EhASnjw8AAAAA0Ly5u/LNBw0apEGDBtV4zGq1KjMz06EtNTVVv/jFL/TNN9+oXbt2stvtWrZsmVauXKn+/ftLkjIyMhQWFqaNGzdq4MCB2r9/v9atW6dPP/1UPXv2lCS9+uqr6t27tw4cOKCOHTs6d5AAAAAAgGarUT3TbbfbZbFY1KpVK0lSVlaWysvLFRsba9aEhoYqKipK27ZtkyRt375dVqvVDNyS1KtXL1mtVrOmJqWlpSoqKnLYAAAAAAC4HI0mdJ89e1bTp0/XiBEj5O/vL0nKz89Xy5YtFRAQ4FAbEhKi/Px8syY4OLja6wUHB5s1NUlJSTGfAbdarQoLC6vH0QAAAAAAmoNGEbrLy8s1fPhwVVVV6aWXXrpkvWEYslgs5v7P/3yhmvPNmDFDdrvd3I4ePVq3zgMAAAAAmq0GH7rLy8sVHx+v3NxcZWZmmle5Jclms6msrEyFhYUO5xQUFCgkJMSs+f7776u97g8//GDW1MTT01P+/v4OGwAAAAAAl6NBh+5zgfvrr7/Wxo0bFRQU5HC8e/fu8vDwcFhwLS8vTzk5OerTp48kqXfv3rLb7dqxY4dZ89lnn8lut5s1AAAAAAA4g0tXLy8uLtahQ4fM/dzcXGVnZyswMFChoaF64IEHtHv3bq1du1aVlZXmM9iBgYFq2bKlrFarxowZo8mTJysoKEiBgYGaMmWKunTpYq5m3qlTJ91999167LHH9PLLL0uSHn/8ccXFxbFyOQAAAADAqVwaunft2qW+ffua+5MmTZIkjRo1SklJSXr33XclSbfeeqvDeR9++KFiYmIkSYsWLZK7u7vi4+NVUlKifv36KT09XW5ubmb9m2++qYkTJ5qrnA8dOrTG3wYHAAAAAKA+uTR0x8TEyDCMCx6/2LFzvLy8lJqaqtTU1AvWBAYGKiMjo059BAAAAACgrhr0M90AAAAAADRmhG4AAAAAAJyE0A0AAAAAgJMQugEAgCk8PFwWi6XaNn78eEk/rbeSlJSk0NBQeXt7KyYmRnv37nV4jdLSUk2YMEGtW7eWr6+vhg4dqmPHjrliOAAAuByhGwAAmHbu3Km8vDxzy8zMlCT9+te/liTNmzdPCxcuVFpamnbu3CmbzaYBAwbo1KlT5mskJiZqzZo1Wr16tbZu3ari4mLFxcWpsrLSJWMCAMCVCN0AAMDUpk0b2Ww2c1u7dq2uv/56RUdHyzAMLV68WDNnztSwYcMUFRWlFStW6MyZM1q1apUkyW63a9myZVqwYIH69++vbt26KSMjQ3v27NHGjRtdPDoAAK4+QjcAAKhRWVmZMjIy9Mgjj8hisSg3N1f5+fmKjY01azw9PRUdHa1t27ZJkrKyslReXu5QExoaqqioKLMGAIDmxKW/0w0AABqud955RydPntTo0aMlSfn5+ZKkkJAQh7qQkBAdOXLErGnZsqUCAgKq1Zw7vyalpaUqLS0194uKiupjCAAAuBxXugEAQI2WLVumQYMGKTQ01KHdYrE47BuGUa3tfJeqSUlJkdVqNbewsLC6dxwAgAaE0A0AAKo5cuSINm7cqEcffdRss9lsklTtinVBQYF59dtms6msrEyFhYUXrKnJjBkzZLfbze3o0aP1NRQAAFyK0A0AAKpZvny5goODNXjwYLMtIiJCNpvNXNFc+um57y1btqhPnz6SpO7du8vDw8OhJi8vTzk5OWZNTTw9PeXv7++wAQDQFPBMNwAAcFBVVaXly5dr1KhRcnf/v38qWCwWJSYmKjk5WZGRkYqMjFRycrJ8fHw0YsQISZLVatWYMWM0efJkBQUFKTAwUFOmTFGXLl3Uv39/Vw0JAACXIXQDAAAHGzdu1DfffKNHHnmk2rFp06appKRE48aNU2FhoXr27KkNGzbIz8/PrFm0aJHc3d0VHx+vkpIS9evXT+np6XJzc7uawwAAoEGwGIZhuLoTjUFRUZGsVqvsdnuTuuUtfPr7ru4CaunwHwdfughAs9aU5qqmNJafY95tPJh3AVxKbecqnukGAAAAAMBJCN0AAAAAADgJoRsAAAAAACchdAMAAAAA4CSEbgAAAAAAnITQDQAAAACAkxC6AQAAAABwEkI3AAAAAABOQugGAAAAAMBJCN0AAAAAADgJoRsAAAAAACchdAMAAAAA4CSEbgAAAAAAnITQDQAAAACAkxC6AQAAAABwEkI3AAAAAABOQugGAAAAAMBJCN0AAAAAADiJS0P3xx9/rCFDhig0NFQWi0XvvPOOw3HDMJSUlKTQ0FB5e3srJiZGe/fudagpLS3VhAkT1Lp1a/n6+mro0KE6duyYQ01hYaESEhJktVpltVqVkJCgkydPOnl0AAAAAIDmzqWh+/Tp07rllluUlpZW4/F58+Zp4cKFSktL086dO2Wz2TRgwACdOnXKrElMTNSaNWu0evVqbd26VcXFxYqLi1NlZaVZM2LECGVnZ2vdunVat26dsrOzlZCQ4PTxAQAAAACaN3dXvvmgQYM0aNCgGo8ZhqHFixdr5syZGjZsmCRpxYoVCgkJ0apVqzR27FjZ7XYtW7ZMK1euVP/+/SVJGRkZCgsL08aNGzVw4EDt379f69at06effqqePXtKkl599VX17t1bBw4cUMeOHa/OYAEAAAAAzU6DfaY7NzdX+fn5io2NNds8PT0VHR2tbdu2SZKysrJUXl7uUBMaGqqoqCizZvv27bJarWbglqRevXrJarWaNQAAAAAAOINLr3RfTH5+viQpJCTEoT0kJERHjhwxa1q2bKmAgIBqNefOz8/PV3BwcLXXDw4ONmtqUlpaqtLSUnO/qKiobgMBAAAAADRbDfZK9zkWi8Vh3zCMam3nO7+mpvpLvU5KSoq58JrValVYWNhl9hwAAAAA0Nw12NBts9kkqdrV6IKCAvPqt81mU1lZmQoLCy9a8/3331d7/R9++KHaVfSfmzFjhux2u7kdPXr0isYDAEBj8e233+rhhx9WUFCQfHx8dOuttyorK8s8Xl+/LgIAQHPQYEN3RESEbDabMjMzzbaysjJt2bJFffr0kSR1795dHh4eDjV5eXnKyckxa3r37i273a4dO3aYNZ999pnsdrtZUxNPT0/5+/s7bAAANHWFhYW6/fbb5eHhoQ8++ED79u3TggUL1KpVK7Omvn5dBACA5sClz3QXFxfr0KFD5n5ubq6ys7MVGBiodu3aKTExUcnJyYqMjFRkZKSSk5Pl4+OjESNGSJKsVqvGjBmjyZMnKygoSIGBgZoyZYq6dOlirmbeqVMn3X333Xrsscf08ssvS5Ief/xxxcXFsXI5AADnef755xUWFqbly5ebbeHh4eaf6+vXRQAAaC5ceqV7165d6tatm7p16yZJmjRpkrp166bZs2dLkqZNm6bExESNGzdOPXr00LfffqsNGzbIz8/PfI1FixbpvvvuU3x8vG6//Xb5+Pjovffek5ubm1nz5ptvqkuXLoqNjVVsbKy6du2qlStXXt3BAgDQCLz77rvq0aOHfv3rXys4OFjdunXTq6++ah6vr18XAQCguXDple6YmBgZhnHB4xaLRUlJSUpKSrpgjZeXl1JTU5WamnrBmsDAQGVkZFxJVwEAaBb+85//aMmSJZo0aZL++7//Wzt27NDEiRPl6empkSNH1tuvi5yPXw0BADRVDfYnwwAAwNVXVVWlHj16KDk5WZLUrVs37d27V0uWLNHIkSPNuvr4dZGfS0lJ0bPPPnuFvQcAoOFpsAupAQCAq69t27bq3LmzQ1unTp30zTffSKq/Xxc5H78aAgBoqgjdAADAdPvtt+vAgQMObQcPHlT79u0l1d+vi5yPXw0BADRV3F4OAABMTz31lPr06aPk5GTFx8drx44deuWVV/TKK69I+um28vr4dREAAJoLQjcAADDddtttWrNmjWbMmKG5c+cqIiJCixcv1kMPPWTWTJs2TSUlJRo3bpwKCwvVs2fPGn9dxN3dXfHx8SopKVG/fv2Unp7u8OsiAAA0BxbjYsuHw1RUVCSr1Sq73d6kbnkLn/6+q7uAWjr8x8Gu7gKABq4pzVVNaSw/x7zbeDDvAriU2s5VPNMNAAAAAICTELoBAAAAAHASQjcAAAAAAE5C6AYAAAAAwEkI3QAAAAAAOAmhGwAAAAAAJyF0AwAAAADgJIRuAAAAAACchNANAAAAAICTELoBAAAAAHASQjcAAAAAAE5C6AYAAAAAwEkI3QAAAAAAOAmhGwAAAAAAJyF0AwAAAADgJIRuAAAAAACchNANAAAAAICTELoBAAAAAHASQjcAAAAAAE5C6AYAAAAAwEkI3QAAAAAAOAmhGwAAAAAAJyF0AwAAAADgJIRuAAAAAACchNANAAAAAICTELoBAIApKSlJFovFYbPZbOZxwzCUlJSk0NBQeXt7KyYmRnv37nV4jdLSUk2YMEGtW7eWr6+vhg4dqmPHjl3toQAA0CAQugEAgIObb75ZeXl55rZnzx7z2Lx587Rw4UKlpaVp586dstlsGjBggE6dOmXWJCYmas2aNVq9erW2bt2q4uJixcXFqbKy0hXDAQDApRp06K6oqNAzzzyjiIgIeXt7q0OHDpo7d66qqqrMGr5xBwCgfrm7u8tms5lbmzZtJP005y5evFgzZ87UsGHDFBUVpRUrVujMmTNatWqVJMlut2vZsmVasGCB+vfvr27duikjI0N79uzRxo0bXTksAABcokGH7ueff15Lly5VWlqa9u/fr3nz5mn+/PlKTU01a/jGHQCA+vX1118rNDRUERERGj58uP7zn/9IknJzc5Wfn6/Y2Fiz1tPTU9HR0dq2bZskKSsrS+Xl5Q41oaGhioqKMmtqUlpaqqKiIocNAICmoEGH7u3bt+vee+/V4MGDFR4ergceeECxsbHatWuXJL5xBwCgvvXs2VNvvPGG1q9fr1dffVX5+fnq06ePjh8/rvz8fElSSEiIwzkhISHmsfz8fLVs2VIBAQEXrKlJSkqKrFaruYWFhdXzyAAAcI06he4OHTro+PHj1dpPnjypDh06XHGnzrnjjju0adMmHTx4UJL0xRdfaOvWrbrnnnsk8Y07AAD1bdCgQbr//vvVpUsX9e/fX++//74kacWKFWaNxWJxOMcwjGpt57tUzYwZM2S3283t6NGjVzAKAAAajjqF7sOHD9d4a3Zpaam+/fbbK+7UOU8//bQefPBB3XTTTfLw8FC3bt2UmJioBx98UJL4xh0AACfz9fVVly5d9PXXX5urmJ8/fxYUFJhzsc1mU1lZmQoLCy9YUxNPT0/5+/s7bAAANAXul1P87rvvmn9ev369rFaruV9ZWalNmzYpPDy83jr39ttvKyMjQ6tWrdLNN9+s7OxsJSYmKjQ0VKNGjTLrnPWN+6RJk8z9oqIigjcAoNkpLS3V/v379ctf/lIRERGy2WzKzMxUt27dJEllZWXasmWLnn/+eUlS9+7d5eHhoczMTMXHx0uS8vLylJOTo3nz5rlsHAAAuMplhe777rtP0k8h9+ehV5I8PDwUHh6uBQsW1Fvnpk6dqunTp2v48OGSpC5duujIkSNKSUnRqFGjHL5xb9u2rXnehb5x//nV7oKCAvXp0+eC7+3p6SlPT896GwsAAI3BlClTNGTIELVr104FBQX6wx/+oKKiIo0aNUoWi0WJiYlKTk5WZGSkIiMjlZycLB8fH40YMUKSZLVaNWbMGE2ePFlBQUEKDAzUlClTzNvVAQBobi4rdJ/7qa6IiAjt3LlTrVu3dkqnzjlz5oxatHC8A97Nzc2hH3zjDgBA/Tl27JgefPBB/fjjj2rTpo169eqlTz/9VO3bt5ckTZs2TSUlJRo3bpwKCwvVs2dPbdiwQX5+fuZrLFq0SO7u7oqPj1dJSYn69eun9PR0ubm5uWpYAAC4zGWF7nNyc3Prux81GjJkiJ577jm1a9dON998sz7//HMtXLhQjzzyiCTxjTsAAPVs9erVFz1usViUlJSkpKSkC9Z4eXkpNTXV4Sc+AQBoruoUuiVp06ZN2rRpkwoKCswrz+e8/vrrV9wxSUpNTdWsWbM0btw4FRQUKDQ0VGPHjtXs2bPNGr5xBwAAAAA0VBbDMIzLPenZZ5/V3Llz1aNHD7Vt27bagmRr1qyptw42FEVFRbJarbLb7U1qRdXw6e+7uguopcN/HOzqLgBo4JrSXNWUxvJzzLuNB/MugEup7VxVpyvdS5cuVXp6uhISEurcQQAAAAAAmro6/U53WVnZRVf+BgAAAAAAdQzdjz76qFatWlXffQEAAAAAoEmp0+3lZ8+e1SuvvKKNGzeqa9eu8vDwcDi+cOHCeukcAAAAAACNWZ1C95dffqlbb71VkpSTk+Nw7PxF1QAAAAAAaK7qFLo//PDD+u4HAAAAAABNTp2e6QYAAAAAAJdWpyvdffv2veht5Js3b65zhwAAAAAAaCrqFLrPPc99Tnl5ubKzs5WTk6NRo0bVR78AAAAAAGj06hS6Fy1aVGN7UlKSiouLr6hDAAAAAAA0FfX6TPfDDz+s119/vT5fEgAAAACARqteQ/f27dvl5eVVny8JAAAAAECjVafby4cNG+awbxiG8vLytGvXLs2aNateOgYAAAAAQGNXp9BttVod9lu0aKGOHTtq7ty5io2NrZeOAQAAAADQ2NUpdC9fvry++wEAAAAAQJNTp9B9TlZWlvbv3y+LxaLOnTurW7du9dUvAAAAAAAavTqF7oKCAg0fPlwfffSRWrVqJcMwZLfb1bdvX61evVpt2rSp734CAAAAANDo1Gn18gkTJqioqEh79+7ViRMnVFhYqJycHBUVFWnixIn13UcAAAAAABqlOl3pXrdunTZu3KhOnTqZbZ07d9aLL77IQmoAAAAAAPx/dbrSXVVVJQ8Pj2rtHh4eqqqquuJOAQAAAADQFNQpdN9111168skn9d1335lt3377rZ566in169ev3joHAAAAAEBjVqfQnZaWplOnTik8PFzXX3+9brjhBkVEROjUqVNKTU2t7z4CAAAAANAo1Sl0h4WFaffu3Xr//feVmJioiRMn6p///KeysrJ03XXX1XcfAQCAC6SkpMhisSgxMdFsM4z/1979R0V13/kff438GBABBeOM1KnBBFstmli0VtIIWQFrYoyhKTnVNMkekpqi2KlatyxtHJsGGvaIVKx2zVqxUovpSWiTtBoxiWxdTlYktVF0bd3SiD1MSBMygOKAeL9/5OvdjkDUxGH48Xycc8/xfu77ju+PJ8MnLz7zw5DL5VJcXJzCw8OVmpqq+vp6n/u8Xq9yc3M1duxYRUREaNGiRTp79mw/dw8AwMBwXaH7tdde09SpU9Xa2ipJSk9PV25urlauXKlZs2bpc5/7nH7/+9/7pVEAANB/amtrtW3bNk2fPt1nvKioSMXFxdq8ebNqa2tlt9uVnp6utrY2s8bpdKqyslIVFRU6dOiQ2tvbtXDhQnV3d/f3NAAACLjrCt0lJSV6/PHHFRUV1eNadHS0li1bpuLi4hvWHAAA6H/t7e1aunSpnn32WY0ZM8YcNwxDJSUlys/PV2ZmphITE7Vz506dP39eu3fvliR5PB5t375dGzZsUFpammbMmKHy8nIdO3ZMBw4cCNSUAAAImOsK3X/84x/15S9/uc/rGRkZqqur+8RNAQCAwFm+fLnuuecepaWl+Yw3NDTI7Xb7fD2o1WpVSkqKampqJEl1dXXq6uryqYmLi1NiYqJZAwDAcHJd39P9zjvv9PpVYeaDBQfr3Xff/cRNAQCAwKioqNCbb76p2traHtfcbrckyWaz+YzbbDa9/fbbZk1oaKjPDvnlmsv398br9crr9Zrnl9/KBgDAYHddO92f+tSndOzYsT6vv/XWWxo/fvwnbgoAAPS/xsZGfetb31J5ebnCwsL6rLNYLD7nhmH0GLvS1WoKCwsVHR1tHg6H4/qaBwBggLqu0H333XfrySef1IULF3pc6+jo0Lp167Rw4cIb1hwAAOg/dXV1am5uVlJSkoKDgxUcHKzq6mpt2rRJwcHB5g73lTvWzc3N5jW73a7Ozk61tLT0WdObvLw8eTwe82hsbLzBswMAIDCuK3R/73vf0/vvv6/JkyerqKhIv/nNb/Tiiy/qmWee0Wc+8xm9//77ys/P91evAADAj+bNm6djx47p6NGj5jFz5kwtXbpUR48e1aRJk2S321VVVWXe09nZqerqaiUnJ0uSkpKSFBIS4lPT1NSk48ePmzW9sVqtioqK8jkAABgKrus93TabTTU1NfrmN7+pvLw8GYYh6cOXmc2fP19btmz5yN9iAwCAgSsyMlKJiYk+YxEREYqNjTXHnU6nCgoKlJCQoISEBBUUFGjkyJFasmSJpA+/zSQ7O1urV69WbGysYmJitGbNGk2bNq3HB7MBADAcXFfolqSJEyfqd7/7nVpaWnT69GkZhqGEhIQeH5gCAACGnrVr16qjo0M5OTlqaWnR7NmztX//fkVGRpo1GzduVHBwsLKystTR0aF58+aprKxMQUFBAewcAIDAuK6Xl/+jMWPGaNasWfrCF77g18D9t7/9TQ899JBiY2M1cuRI3X777T5fS2YYhlwul+Li4hQeHq7U1FTV19f7PIbX61Vubq7Gjh2riIgILVq0SGfPnvVbzwAADBUHDx5USUmJeW6xWORyudTU1KQLFy6ourq6x+54WFiYSktL9d577+n8+fN66aWX+GA0AMCw9bFDd39oaWnRHXfcoZCQEO3du1cnTpzQhg0bNHr0aLOmqKhIxcXF2rx5s2pra2W325Wenq62tjazxul0qrKyUhUVFTp06JDa29u1cOFCdXd3B2BWAAAAAIDh4rpfXt6fnnnmGTkcDu3YscMcu/nmm80/G4ahkpIS5efnKzMzU5K0c+dO2Ww27d69W8uWLZPH49H27du1a9cu871k5eXlcjgcOnDggObPn9+vcwIAAAAADB8Deqf7xRdf1MyZM/XVr35V48aN04wZM/Tss8+a1xsaGuR2u5WRkWGOWa1WpaSkqKamRtKHX3/S1dXlUxMXF6fExESzBgAAAAAAfxjQofsvf/mLtm7dqoSEBL3yyit64okntHLlSv385z+X9H/fE3rlJ6bbbDbzmtvtVmhoaI/3nf9jTW+8Xq9aW1t9DgAAAAAArseAfnn5pUuXNHPmTBUUFEiSZsyYofr6em3dulUPP/ywWWexWHzuMwyjx9iVrlZTWFio9evXf4LuAQAAAADD3YDe6R4/frymTp3qMzZlyhSdOXNGkmS32yWpx451c3Ozufttt9vV2dmplpaWPmt6k5eXJ4/HYx6NjY2feD4AAAAAgOFlQIfuO+64Q6dOnfIZ+9Of/qSJEydKkuLj42W321VVVWVe7+zsVHV1tZKTkyVJSUlJCgkJ8alpamrS8ePHzZreWK1WRUVF+RwAAAAAAFyPAf3y8m9/+9tKTk5WQUGBsrKydPjwYW3btk3btm2T9OHLyp1OpwoKCpSQkKCEhAQVFBRo5MiRWrJkiSQpOjpa2dnZWr16tWJjYxUTE6M1a9Zo2rRp5qeZAwAAAADgDwM6dM+aNUuVlZXKy8vTD37wA8XHx6ukpERLly41a9auXauOjg7l5OSopaVFs2fP1v79+xUZGWnWbNy4UcHBwcrKylJHR4fmzZunsrIyBQUFBWJaAAAAAIBhwmIYhhHoJgaD1tZWRUdHy+PxDKmXmt/83d8GugVco7/+6J5AtwBggBtKa9VQmss/Yt0dPFh3AVzNta5VA/o93QAAAAAADGaEbgAAAAAA/ITQDQAAAACAnxC6AQAAAADwE0I3AAAAAAB+QugGAAAAAMBPBvT3dAPAYMRXAg0OfB0QAADoD+x0AwAAAADgJ4RuAAAAAAD8hNANAAAAAICfELoBAAAAAPATQjcAAAAAAH5C6AYAAAAAwE8I3QAAAAAA+AmhGwAAmLZu3arp06crKipKUVFRmjNnjvbu3WteNwxDLpdLcXFxCg8PV2pqqurr630ew+v1Kjc3V2PHjlVERIQWLVqks2fP9vdUAAAYEAjdAADANGHCBP3oRz/SkSNHdOTIEf3TP/2T7rvvPjNYFxUVqbi4WJs3b1Ztba3sdrvS09PV1tZmPobT6VRlZaUqKip06NAhtbe3a+HCheru7g7UtAAACBhCNwAAMN177726++67NXnyZE2ePFlPP/20Ro0apTfeeEOGYaikpET5+fnKzMxUYmKidu7cqfPnz2v37t2SJI/Ho+3bt2vDhg1KS0vTjBkzVF5ermPHjunAgQMBnh0AAP2P0A0AAHrV3d2tiooKnTt3TnPmzFFDQ4PcbrcyMjLMGqvVqpSUFNXU1EiS6urq1NXV5VMTFxenxMREswYAgOEkONANAACAgeXYsWOaM2eOLly4oFGjRqmyslJTp041Q7PNZvOpt9lsevvttyVJbrdboaGhGjNmTI8at9vd59/p9Xrl9XrN89bW1hs1HQAAAorQDQAAfHzmM5/R0aNH9cEHH+j555/XI488ourqavO6xWLxqTcMo8fYla5WU1hYqPXr13+yxgEMSzd/97eBbgHX6K8/uifQLQQELy8HAAA+QkNDdeutt2rmzJkqLCzUbbfdph//+Mey2+2S1GPHurm52dz9ttvt6uzsVEtLS581vcnLy5PH4zGPxsbGGzwrAAACg9ANAAA+kmEY8nq9io+Pl91uV1VVlXmts7NT1dXVSk5OliQlJSUpJCTEp6apqUnHjx83a3pjtVrNrym7fAAAMBTw8nIAAGD613/9Vy1YsEAOh0NtbW2qqKjQwYMHtW/fPlksFjmdThUUFCghIUEJCQkqKCjQyJEjtWTJEklSdHS0srOztXr1asXGxiomJkZr1qzRtGnTlJaWFuDZAQDQ/wjdAADA9M477+jrX/+6mpqaFB0drenTp2vfvn1KT0+XJK1du1YdHR3KyclRS0uLZs+erf379ysyMtJ8jI0bNyo4OFhZWVnq6OjQvHnzVFZWpqCgoEBNCwCAgCF0AwAA0/bt2z/yusVikcvlksvl6rMmLCxMpaWlKi0tvcHdAQAw+PCebgAAAAAA/ITQDQAAAACAnxC6AQAAAADwE0I3AAAAAAB+QugGAAAAAMBPCN0AAAAAAPgJoRsAAAAAAD8hdAMAAAAA4CeDKnQXFhbKYrHI6XSaY4ZhyOVyKS4uTuHh4UpNTVV9fb3PfV6vV7m5uRo7dqwiIiK0aNEinT17tp+7BwAAAAAMN4MmdNfW1mrbtm2aPn26z3hRUZGKi4u1efNm1dbWym63Kz09XW1tbWaN0+lUZWWlKioqdOjQIbW3t2vhwoXq7u7u72kAAAAAAIaRQRG629vbtXTpUj377LMaM2aMOW4YhkpKSpSfn6/MzEwlJiZq586dOn/+vHbv3i1J8ng82r59uzZs2KC0tDTNmDFD5eXlOnbsmA4cOBCoKQEAAAAAhoFBEbqXL1+ue+65R2lpaT7jDQ0NcrvdysjIMMesVqtSUlJUU1MjSaqrq1NXV5dPTVxcnBITE80aAAAAAAD8ITjQDVxNRUWF3nzzTdXW1va45na7JUk2m81n3Gaz6e233zZrQkNDfXbIL9dcvr83Xq9XXq/XPG9tbf3YcwAAAAAADE8Deqe7sbFR3/rWt1ReXq6wsLA+6ywWi8+5YRg9xq50tZrCwkJFR0ebh8PhuL7mAQAAAADD3oAO3XV1dWpublZSUpKCg4MVHBys6upqbdq0ScHBweYO95U71s3NzeY1u92uzs5OtbS09FnTm7y8PHk8HvNobGy8wbMDAAAAAAx1Azp0z5s3T8eOHdPRo0fNY+bMmVq6dKmOHj2qSZMmyW63q6qqyryns7NT1dXVSk5OliQlJSUpJCTEp6apqUnHjx83a3pjtVoVFRXlcwAAAAAAcD0G9Hu6IyMjlZiY6DMWERGh2NhYc9zpdKqgoEAJCQlKSEhQQUGBRo4cqSVLlkiSoqOjlZ2drdWrVys2NlYxMTFas2aNpk2b1uOD2QAAAAAAuJEGdOi+FmvXrlVHR4dycnLU0tKi2bNna//+/YqMjDRrNm7cqODgYGVlZamjo0Pz5s1TWVmZgoKCAtg5AAAAAGCoG3Sh++DBgz7nFotFLpdLLperz3vCwsJUWlqq0tJS/zYHAAAAAMA/GNDv6QYAAAAAYDAjdAMAAAAA4CeEbgAAAAAA/ITQDQAAAACAnxC6AQAAAADwE0I3AAAAAAB+QugGAACmwsJCzZo1S5GRkRo3bpwWL16sU6dO+dQYhiGXy6W4uDiFh4crNTVV9fX1PjVer1e5ubkaO3asIiIitGjRIp09e7Y/pwIAwIBA6AYAAKbq6motX75cb7zxhqqqqnTx4kVlZGTo3LlzZk1RUZGKi4u1efNm1dbWym63Kz09XW1tbWaN0+lUZWWlKioqdOjQIbW3t2vhwoXq7u4OxLQAAAiY4EA3AAAABo59+/b5nO/YsUPjxo1TXV2d5s6dK8MwVFJSovz8fGVmZkqSdu7cKZvNpt27d2vZsmXyeDzavn27du3apbS0NElSeXm5HA6HDhw4oPnz5/f7vAAACBR2ugEAQJ88Ho8kKSYmRpLU0NAgt9utjIwMs8ZqtSolJUU1NTWSpLq6OnV1dfnUxMXFKTEx0ay5ktfrVWtrq88BAMBQQOgGAAC9MgxDq1at0pe+9CUlJiZKktxutyTJZrP51NpsNvOa2+1WaGioxowZ02fNlQoLCxUdHW0eDofjRk8HAICAIHQDAIBerVixQm+99ZZ++ctf9rhmsVh8zg3D6DF2pY+qycvLk8fjMY/GxsaP3zgAAAMIoRsAAPSQm5urF198Ua+//romTJhgjtvtdknqsWPd3Nxs7n7b7XZ1dnaqpaWlz5orWa1WRUVF+RwAAAwFhG4AAGAyDEMrVqzQCy+8oNdee03x8fE+1+Pj42W321VVVWWOdXZ2qrq6WsnJyZKkpKQkhYSE+NQ0NTXp+PHjZg0AAMMFn14OAABMy5cv1+7du/Wb3/xGkZGR5o52dHS0wsPDZbFY5HQ6VVBQoISEBCUkJKigoEAjR47UkiVLzNrs7GytXr1asbGxiomJ0Zo1azRt2jTz08wBABguCN0AAMC0detWSVJqaqrP+I4dO/Too49KktauXauOjg7l5OSopaVFs2fP1v79+xUZGWnWb9y4UcHBwcrKylJHR4fmzZunsrIyBQUF9ddUAAAYEAjdAADAZBjGVWssFotcLpdcLlefNWFhYSotLVVpaekN7A4AgMGH93QDAAAAAOAnhG4AAAAAAPyE0A0AAAAAgJ8QugEAAAAA8BNCNwAAAAAAfkLoBgAAAADATwjdAAAAAAD4CaEbAAAAAAA/IXQDAAAAAOAnhG4AAAAAAPyE0A0AAAAAgJ8QugEAAAAA8BNCNwAAAAAAfkLoBgAAAADATwjdAAAAAAD4CaEbAAAAAAA/GdChu7CwULNmzVJkZKTGjRunxYsX69SpUz41hmHI5XIpLi5O4eHhSk1NVX19vU+N1+tVbm6uxo4dq4iICC1atEhnz57tz6kAAAAAAIahAR26q6urtXz5cr3xxhuqqqrSxYsXlZGRoXPnzpk1RUVFKi4u1ubNm1VbWyu73a709HS1tbWZNU6nU5WVlaqoqNChQ4fU3t6uhQsXqru7OxDTAgAAAAAME8GBbuCj7Nu3z+d8x44dGjdunOrq6jR37lwZhqGSkhLl5+crMzNTkrRz507ZbDbt3r1by5Ytk8fj0fbt27Vr1y6lpaVJksrLy+VwOHTgwAHNnz+/3+cFAAAAABgeBvRO95U8Ho8kKSYmRpLU0NAgt9utjIwMs8ZqtSolJUU1NTWSpLq6OnV1dfnUxMXFKTEx0azpjdfrVWtrq88BAAAAAMD1GDSh2zAMrVq1Sl/60peUmJgoSXK73ZIkm83mU2uz2cxrbrdboaGhGjNmTJ81vSksLFR0dLR5OByOGzkdAAAAAMAwMGhC94oVK/TWW2/pl7/8ZY9rFovF59wwjB5jV7paTV5enjwej3k0NjZ+vMYBAAAAAMPWoAjdubm5evHFF/X6669rwoQJ5rjdbpekHjvWzc3N5u633W5XZ2enWlpa+qzpjdVqVVRUlM8BAAAAAMD1GNCh2zAMrVixQi+88IJee+01xcfH+1yPj4+X3W5XVVWVOdbZ2anq6molJydLkpKSkhQSEuJT09TUpOPHj5s1AAAAAAD4w4AO3cuXL1d5ebl2796tyMhIud1uud1udXR0SPrwZeVOp1MFBQWqrKzU8ePH9eijj2rkyJFasmSJJCk6OlrZ2dlavXq1Xn31Vf3hD3/QQw89pGnTppmfZg4AAD70n//5n7r33nsVFxcni8WiX//61z7XDcOQy+VSXFycwsPDlZqaqvr6ep8ar9er3NxcjR07VhEREVq0aJHOnj3bj7MAAGDgGNChe+vWrfJ4PEpNTdX48ePNY8+ePWbN2rVr5XQ6lZOTo5kzZ+pvf/ub9u/fr8jISLNm48aNWrx4sbKysnTHHXdo5MiReumllxQUFBSIaQEAMGCdO3dOt912mzZv3tzr9aKiIhUXF2vz5s2qra2V3W5Xenq62trazBqn06nKykpVVFTo0KFDam9v18KFC9Xd3d1f0wAAYMAY0N/TbRjGVWssFotcLpdcLlefNWFhYSotLVVpaekN7A4AgKFnwYIFWrBgQa/XDMNQSUmJ8vPzlZmZKUnauXOnbDabdu/erWXLlsnj8Wj79u3atWuX+Yqy8vJyORwOHThwQPPnz++3uQAAMBAM6J1uAAAwcDQ0NMjtdisjI8Mcs1qtSklJUU1NjSSprq5OXV1dPjVxcXFKTEw0a3rj9XrV2trqcwAAMBQQugEAwDW5/G0hV377h81mM6+53W6FhoZqzJgxfdb0prCwUNHR0ebhcDhucPcAAAQGoRsAAFwXi8Xic24YRo+xK12tJi8vTx6PxzwaGxtvSK8AAAQaoRsAAFwTu90uST12rJubm83db7vdrs7OTrW0tPRZ0xur1aqoqCifAwCAoYDQDQAArkl8fLzsdruqqqrMsc7OTlVXVys5OVmSlJSUpJCQEJ+apqYmHT9+3KwBAGA4GdCfXg4AAPpXe3u7Tp8+bZ43NDTo6NGjiomJ0ac//Wk5nU4VFBQoISFBCQkJKigo0MiRI7VkyRJJUnR0tLKzs7V69WrFxsYqJiZGa9as0bRp08xPMwcAYDghdAMAANORI0d01113meerVq2SJD3yyCMqKyvT2rVr1dHRoZycHLW0tGj27Nnav3+/IiMjzXs2btyo4OBgZWVlqaOjQ/PmzVNZWZmCgoL6fT4AAAQaoRsAAJhSU1NlGEaf1y0Wi1wul1wuV581YWFhKi0tVWlpqR86BABgcOE93QAAAAAA+AmhGwAAAAAAPyF0AwAAAADgJ4RuAAAAAAD8hNANAAAAAICfELoBAAAAAPATQjcAAAAAAH5C6AYAAAAAwE8I3QAAAAAA+AmhGwAAAAAAPyF0AwAAAADgJ4RuAAAAAAD8hNANAAAAAICfELoBAAAAAPATQjcAAAAAAH5C6AYAAAAAwE8I3QAAAAAA+AmhGwAAAAAAPyF0AwAAAADgJ4RuAAAAAAD8hNANAAAAAICfELoBAAAAAPATQjcAAAAAAH5C6AYAAAAAwE+GVejesmWL4uPjFRYWpqSkJP3+978PdEsAAAxZrLsAAAyj0L1nzx45nU7l5+frD3/4g+68804tWLBAZ86cCXRrAAAMOay7AAB8aNiE7uLiYmVnZ+uxxx7TlClTVFJSIofDoa1btwa6NQAAhhzWXQAAPjQsQndnZ6fq6uqUkZHhM56RkaGampoAdQUAwNDEugsAwP8JDnQD/eHvf/+7uru7ZbPZfMZtNpvcbnev93i9Xnm9XvPc4/FIklpbW/3XaABc8p4PdAu4RkPtv72hjOfV4DAUn1OX52QYRkD7YN3tGz8fBo+h9t/eUMbzavAYas+ra113h0XovsxisficG4bRY+yywsJCrV+/vse4w+HwS2/A1USXBLoDYGgZys+ptrY2RUdHB7oN1l0MakP5ZwQQKEP1eXW1dXdYhO6xY8cqKCiox2/Xm5ube/wW/rK8vDytWrXKPL906ZLef/99xcbG9vk/DBgYWltb5XA41NjYqKioqEC3Awx6PKcGD8Mw1NbWpri4uID2wbo7vPAzArixeE4NHte67g6L0B0aGqqkpCRVVVXp/vvvN8erqqp033339XqP1WqV1Wr1GRs9erQ/28QNFhUVxQ8q4AbiOTU4DIQdbtbd4YmfEcCNxXNqcLiWdXdYhG5JWrVqlb7+9a9r5syZmjNnjrZt26YzZ87oiSeeCHRrAAAMOay7AAB8aNiE7gcffFDvvfeefvCDH6ipqUmJiYn63e9+p4kTJwa6NQAAhhzWXQAAPjRsQrck5eTkKCcnJ9BtwM+sVqvWrVvX42WKAD4enlP4uFh3hwd+RgA3Fs+pocdiBPp7RQAAAAAAGKJGBLoBAAAAAACGKkI3AAAAAAB+QugGAPSprKyMr20CAKCfsO4OTYRuDFgWi+Ujj0cffTTQLQKDxqOPPtrr8+j06dOBbg3AAMG6C9w4rLv4R8Pq08sxuDQ1NZl/3rNnj5588kmdOnXKHAsPD/ep7+rqUkhISL/1Bww2X/7yl7Vjxw6fsZtuuilA3QAYaFh3gRuLdReXsdONActut5tHdHS0LBaLeX7hwgWNHj1azz33nFJTUxUWFqby8nK5XC7dfvvtPo9TUlKim2++2Wdsx44dmjJlisLCwvTZz35WW7Zs6b+JAQFitVp9nld2u10//vGPNW3aNEVERMjhcCgnJ0ft7e19PsYf//hH3XXXXYqMjFRUVJSSkpJ05MgR83pNTY3mzp2r8PBwORwOrVy5UufOneuP6QH4hFh3gRuLdReXEboxqP3Lv/yLVq5cqZMnT2r+/PnXdM+zzz6r/Px8Pf300zp58qQKCgr0/e9/Xzt37vRzt8DAM2LECG3atEnHjx/Xzp079dprr2nt2rV91i9dulQTJkxQbW2t6urq9N3vftfc6Tp27Jjmz5+vzMxMvfXWW9qzZ48OHTqkFStW9Nd0APgZ6y7wybDuDk+8vByDmtPpVGZm5nXd89RTT2nDhg3mffHx8Tpx4oT+/d//XY888og/2gQGhJdfflmjRo0yzxcsWKBf/epX5nl8fLyeeuopffOb3+xzF+rMmTP6zne+o89+9rOSpISEBPPav/3bv2nJkiVyOp3mtU2bNiklJUVbt25VWFiYH2YFoD+x7gLXjnUXlxG6MajNnDnzuurfffddNTY2Kjs7W48//rg5fvHiRUVHR9/o9oAB5a677tLWrVvN84iICL3++usqKCjQiRMn1NraqosXL+rChQs6d+6cIiIiejzGqlWr9Nhjj2nXrl1KS0vTV7/6Vd1yyy2SpLq6Op0+fVq/+MUvzHrDMHTp0iU1NDRoypQp/p8kAL9i3QWuHesuLiN0Y1C78ofTiBEjZBiGz1hXV5f550uXLkn68KVus2fP9qkLCgryU5fAwBAREaFbb73VPH/77bd1991364knntBTTz2lmJgYHTp0SNnZ2T7Pm3/kcrm0ZMkS/fa3v9XevXu1bt06VVRU6P7779elS5e0bNkyrVy5ssd9n/70p/02LwD9h3UXuHasu7iM0I0h5aabbpLb7ZZhGLJYLJKko0ePmtdtNps+9alP6S9/+YuWLl0aoC6BgeHIkSO6ePGiNmzYoBEjPvyIj+eee+6q902ePFmTJ0/Wt7/9bX3ta1/Tjh07dP/99+vzn/+86uvrff4HA8DQxroLXDvW3eGL0I0hJTU1Ve+++66Kior0wAMPaN++fdq7d6+ioqLMGpfLpZUrVyoqKkoLFiyQ1+vVkSNH1NLSolWrVgWwe6B/3XLLLbp48aJKS0t177336r/+67/005/+tM/6jo4Ofec739EDDzyg+Ph4nT17VrW1tfrKV74i6cMPWPriF7+o5cuX6/HHH1dERIROnjypqqoqlZaW9te0APQj1l3g2rHuDl98ejmGlClTpmjLli36yU9+ottuu02HDx/WmjVrfGoee+wx/cd//IfKyso0bdo0paSkqKysTPHx8QHqGgiM22+/XcXFxXrmmWeUmJioX/ziFyosLOyzPigoSO+9954efvhhTZ48WVlZWVqwYIHWr18vSZo+fbqqq6v15z//WXfeeadmzJih73//+xo/fnx/TQlAP2PdBa4d6+7wZTGufCMOAAAAAAC4IdjpBgAAAADATwjdAAAAAAD4CaEbAAAAAAA/IXQDAAAAAOAnhG4AAAAAAPyE0A0AAAAAgJ8QugEAAAAA8BNCNwAAAAAAfkLoBgAAAADATwjdAK7K7XYrNzdXkyZNktVqlcPh0L333qtXX3010K31UFZWptGjRwe6DQAAPjbWXWBoCQ50AwAGtr/+9a+64447NHr0aBUVFWn69Onq6urSK6+8ouXLl+t//ud/rvsxu7q6FBIScs3jAAAMF6y7wNDDTjeAj5STkyOLxaLDhw/rgQce0OTJk/W5z31Oq1at0htvvCFJOnPmjO677z6NGjVKUVFRysrK0jvvvGM+hsvl0u23366f/exn5m/tDcOQxWLRT3/6U913332KiIjQD3/4Q0nSSy+9pKSkJIWFhWnSpElav369Ll68aD7eBx98oG984xuy2WwKCwtTYmKiXn75ZR08eFD//M//LI/HI4vFIovFIpfL1a//XgAAfBKsu8DQw043gD69//772rdvn55++mlFRET0uD569GgZhqHFixcrIiJC1dXVunjxonJycvTggw/q4MGDZu3p06f13HPP6fnnn1dQUJA5vm7dOhUWFmrjxo0KCgrSK6+8ooceekibNm3SnXfeqf/93//VN77xDbP20qVLWrBggdra2lReXq5bbrlFJ06cUFBQkJKTk1VSUqInn3xSp06dkiSNGjXKv/9IAADcIKy7wBBlAEAf/vu//9uQZLzwwgt91uzfv98ICgoyzpw5Y47V19cbkozDhw8bhmEY69atM0JCQozm5mafeyUZTqfTZ+zOO+80CgoKfMZ27dpljB8/3jAMw3jllVeMESNGGKdOneq1nx07dhjR0dHXPEcAAAYK1l1gaGKnG0CfDMOQJFkslj5rTp48KYfDIYfDYY5NnTpVo0eP1smTJzVr1ixJ0sSJE3XTTTf1uH/mzJk+53V1daqtrdXTTz9tjnV3d+vChQs6f/68jh49qgkTJmjy5MmfaG4AAAw0rLvA0EToBtCnhIQEWSwWnTx5UosXL+61xvj/7xG72nhvL5PrbfzSpUtav369MjMze9SGhYUpPDz8OmYAAMDgwboLDE18kBqAPsXExGj+/Pn6yU9+onPnzvW4/sEHH2jq1Kk6c+aMGhsbzfETJ07I4/FoypQp1/13fv7zn9epU6d066239jhGjBih6dOn6+zZs/rTn/7U6/2hoaHq7u6+7r8XAIBAY90FhiZCN4CPtGXLFnV3d+sLX/iCnn/+ef35z3/WyZMntWnTJs2ZM0dpaWmaPn26li5dqjfffFOHDx/Www8/rJSUlB4vYbsWTz75pH7+85/L5XKpvr5eJ0+e1J49e/S9731PkpSSkqK5c+fqK1/5iqqqqtTQ0KC9e/dq3759kqSbb75Z7e3tevXVV/X3v/9d58+fv6H/HgAA+BPrLjD0ELoBfKT4+Hi9+eabuuuuu7R69WolJiYqPT1dr776qrZu3SqLxaJf//rXGjNmjObOnau0tDRNmjRJe/bs+Vh/3/z58/Xyyy+rqqpKs2bN0he/+EUVFxdr4sSJZs3zzz+vWbNm6Wtf+5qmTp2qtWvXmr9lT05O1hNPPKEHH3xQN910k4qKim7IvwMAAP2BdRcYeizG5U9sAAAAAAAANxQ73QAAAAAA+AmhGwAAAAAAPyF0AwAAAADgJ4RuAAAAAAD8hNANAAAAAICfELoBAAAAAPATQjcAAAAAAH5C6AYAAAAAwE8I3QAAAAAA+AmhGwAAAAAAPyF0AwAAAADgJ4RuAAAAAAD85P8BNROSLZoXOTYAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1000x800 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(2, 2, figsize=(10, 8))\n",
    "\n",
    "correct_counts_2_IR.plot(kind='bar', ax=axes[0, 0])\n",
    "axes[0, 0].set_title('Block 2 – Irregular')\n",
    "axes[0, 0].set_ylabel('Count')\n",
    "\n",
    "correct_counts_2_R.plot(kind='bar', ax=axes[0, 1])\n",
    "axes[0, 1].set_title('Block 2 – Regular')\n",
    "\n",
    "correct_counts_3_IR.plot(kind='bar', ax=axes[1, 0])\n",
    "axes[1, 0].set_title('Block 3 – Irregular')\n",
    "axes[1, 0].set_ylabel('Count')\n",
    "\n",
    "correct_counts_3_R.plot(kind='bar', ax=axes[1, 1])\n",
    "axes[1, 1].set_title('Block 3 – Regular')\n",
    "\n",
    "for ax in axes.flat:\n",
    "    ax.set_xlabel('Correct')\n",
    "    ax.set_xticklabels(['True', 'False'], rotation=0)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "113bdb35",
   "metadata": {},
   "source": [
    "## Extras: nicht relevant kann ignoriert werden "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4742d9f5",
   "metadata": {},
   "source": [
    "#### 3. Analisiz of key matching data "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4a69aeb1",
   "metadata": {},
   "source": [
    "3A) get data of one participant in trial form"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "02d465b9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# get data of one participant in trial form using the index (values between 0 and X-1 are possible if len(data)==X)\n",
    "def get_one_par_data (participant_index): \n",
    "    par_data = data[participant_index]['json_data'] #string form of the data\n",
    "    par_data_ts = json.loads(par_data) # trial form of the data\n",
    "    return par_data_ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "cd7780ae",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "878"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "par_1_data = get_one_par_data(1)\n",
    "len(par_1_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "82770aed",
   "metadata": {},
   "outputs": [],
   "source": [
    "#welche Keys sind hinter dem ersten Trial \n",
    "#one_trial = par_1_data[0]\n",
    "#print(one_trial.keys())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b3125ceb",
   "metadata": {},
   "source": [
    "3B) get data for key matching task of one participant "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b73830e2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Counter({'html-keyboard-response': 868,\n",
       "         'call-function': 6,\n",
       "         'survey-html-form': 4})"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 'trial_type' appears as key in all trials of all participants : what are its possible values \n",
    "Counter(t['trial_type'] for t in par_1_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "dce22f4b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "868\n"
     ]
    }
   ],
   "source": [
    "# store all trials that have the value 'html-keyboard-response' for 'trial_type'\n",
    "html_keyboard_trials = [\n",
    "    t for t in par_1_data\n",
    "    if t['trial_type'] == 'html-keyboard-response'\n",
    "]\n",
    "\n",
    "print(len(html_keyboard_trials))\n",
    "\n",
    "# das sind alles Trials in denen eben eingaben mit der Tastatur gemacht wurden und das bedeutet, dass das alle Trials sind in denen \n",
    "# eben das Key matching statt gefunden hat. Das bedeutet ich muss diese Daten nun versuchen in die einzelnen Conditions zu speichern \n",
    "# und dafür muss ich herausfinden, welche Trials zu welcher Condition gehören "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1c584777",
   "metadata": {},
   "outputs": [],
   "source": [
    "def sort_by_condition(key_board_trials):\n",
    "    regular_p = []\n",
    "    irregular_p =[]\n",
    "    no_p = []\n",
    "\n",
    "    for trial in key_board_trials: \n",
    "        if trial['block'] == 1: \n",
    "            no_p. add(trial)\n",
    "\n",
    "        if trial['block'] == 2:\n",
    "            if trial['notif_block2_condition']== 'regular':\n",
    "                regular_p.add(trial)\n",
    "            if trial ['notif_block2_condition']== 'irregular':\n",
    "                irregular_p.add(trial)\n",
    "        if trial['block'] == 3:\n",
    "            if trial['notif_block3_condition']== 'regular':\n",
    "                regular_p.add(trial)\n",
    "            if trial ['notif_block3_condition']== 'irregular':\n",
    "                irregular_p.add(trial)\n",
    "                \n",
    "    return regular_p, irregular_p, no_p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "id": "6d283490",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'rt': None,\n",
       " 'response': None,\n",
       " 'trial_type': 'html-keyboard-response',\n",
       " 'trial_index': 591,\n",
       " 'plugin_version': '2.1.0',\n",
       " 'time_elapsed': 901833,\n",
       " 'participantIndex': 84384,\n",
       " 'participant_id': 'HUMA30',\n",
       " 'vp_code': 'HUMA30',\n",
       " 'notif_block2_condition': 'regular',\n",
       " 'notif_block3_condition': 'irregular',\n",
       " 'block1_symbols': '▲◆●■⬟⬢',\n",
       " 'block2_symbols': '✂︎✉︎☎︎✏︎⌛︎⌂',\n",
       " 'block3_symbols': '☀︎☾☁︎★☂︎⚡︎',\n",
       " 'notif_block2_animals': 'Zebra;Koala;Salamander;Adler;Panda;Känguru;Nilpferd;Frosch;Pinguin;Schwan;Frettchen;Gorilla;Ente;Hamster;Ratte;Giraffe;Löwe;Schimpanse;Affe;Krabbe',\n",
       " 'notif_block3_animals': 'Pferd;Elch;Robbe;Kröte;Walross;Marienkäfer;Luchs;Biber;Eichhörnchen;Kranich;Flamingo;Lachs;Kolibri;Biene;Seelöwe;Schaf;Dachs;Schmetterling;Kaninchen;Marder',\n",
       " 'demo_age_range': '21-24',\n",
       " 'demo_gender': 'weiblich',\n",
       " 'demo_german_level': 'native_or_fluent',\n",
       " 'demo_education': 'stud_bachelor',\n",
       " 'demo_program': 'Cognitive Science',\n",
       " 'demo_semester': 8,\n",
       " 'demo_vision': 'wearing_glasses_or_contacts',\n",
       " 'demo_handedness': 'right',\n",
       " 'demo_screentime': '4to6'}"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# herausfinden welche Daten hinter den Keys stecken: \n",
    "html_keyboard_trials[584]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ae95b1cc",
   "metadata": {},
   "source": [
    "### Extras \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "de3cbf98",
   "metadata": {},
   "outputs": [],
   "source": [
    " #important to understand the key structure \n",
    "#for i, elem in enumerate(final_data_ts):\n",
    "#    print(f\"\\nElement {i} keys:\")\n",
    "#    print(elem.keys())\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "4792e4e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "#hier gehe ich praktisch für jeden participant alle Trials durch um zu sehen welche keys es pro trial gibt \n",
    "# gerade schaue ich mir alle trials von einem Participant an \n",
    "\n",
    "#for trial in final_data_ts: \n",
    "#   print (trial.keys())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cf531643",
   "metadata": {},
   "source": [
    "hier erkennt man, dass man eben diese 4 Einträge hat wie sie auch in der Datenbank angezeigt werden \n",
    "Für jeden Eintrag muss man den letzen key nehmen also den Inhalt den man unter 'json_data' findet. Da ist dann dieser String der eben die ganzen Infos enthält mit respinsetime, den Beschreibungen etc. \n",
    "\n",
    "Was ich jetzt noch machen muss ist praktisch herauszufinden welche Trials die Infos enthalten die wir wirklcih benötigen. \n",
    "Und in welchen Trials die Informationen wie z.b die Beschreibungen des Experiments sind. Weil wenn wir das genau wissen, können wir die Daten entsprechend auch analysieren "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "65c49f2d",
   "metadata": {},
   "outputs": [],
   "source": [
    "key_sets = []\n",
    "\n",
    "for trial in final_data_ts:\n",
    "    key_sets.append(frozenset(trial.keys()))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "51f54936",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Anzahl unterschiedlicher Trial-Strukturen: 8\n"
     ]
    }
   ],
   "source": [
    "# wie viele unterschideliche Trial strukturen gibt es \n",
    "from collections import Counter\n",
    "\n",
    "structure_counts = Counter(key_sets)\n",
    "\n",
    "print(f\"Anzahl unterschiedlicher Trial-Strukturen: {len(structure_counts)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "6b0935df",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Struktur 1 – 1 Trials\n",
      "['block', 'block1_symbols', 'block2_symbols', 'block3_symbols', 'demo_age_range', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_screentime', 'demo_semester', 'demo_vision', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'participantIndex', 'participant_id', 'plugin_version', 'response', 'rt', 'task', 'time_elapsed', 'trial_index', 'trial_type', 'vp_code']\n",
      "\n",
      "Struktur 2 – 3 Trials\n",
      "['block', 'block1_symbols', 'block2_symbols', 'block3_symbols', 'demo_age_range', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_screentime', 'demo_semester', 'demo_vision', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'participantIndex', 'participant_id', 'plugin_version', 'response', 'rt', 'time_elapsed', 'trial_index', 'trial_type', 'vp_code', 'which']\n",
      "\n",
      "Struktur 3 – 6 Trials\n",
      "['block1_symbols', 'block2_symbols', 'block3_symbols', 'demo_age_range', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_screentime', 'demo_semester', 'demo_vision', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'participantIndex', 'participant_id', 'plugin_version', 'time_elapsed', 'trial_index', 'trial_type', 'vp_code']\n",
      "\n",
      "Struktur 4 – 288 Trials\n",
      "['block', 'block1_symbols', 'block2_symbols', 'block3_symbols', 'correct_key', 'demo_age_range', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_screentime', 'demo_semester', 'demo_vision', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'notification_flag', 'notification_sentence', 'participantIndex', 'participant_id', 'phase', 'plugin_version', 'response', 'rt', 'symbol', 'task', 'time_elapsed', 'trial_in_block', 'trial_index', 'trial_type', 'vp_code']\n",
      "\n",
      "Struktur 5 – 288 Trials\n",
      "['block', 'block1_symbols', 'block2_symbols', 'block3_symbols', 'correct', 'correct_key', 'demo_age_range', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_screentime', 'demo_semester', 'demo_vision', 'key_pressed', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'notification_flag', 'notification_sentence', 'participantIndex', 'participant_id', 'phase', 'plugin_version', 'response', 'rt', 'symbol', 'task', 'time_elapsed', 'trial_in_block', 'trial_index', 'trial_type', 'vp_code']\n",
      "\n",
      "Struktur 6 – 288 Trials\n",
      "['block1_symbols', 'block2_symbols', 'block3_symbols', 'demo_age_range', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_screentime', 'demo_semester', 'demo_vision', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'participantIndex', 'participant_id', 'plugin_version', 'response', 'rt', 'time_elapsed', 'trial_index', 'trial_type', 'vp_code']\n",
      "\n",
      "Struktur 7 – 2 Trials\n",
      "['animals_order', 'block', 'block1_symbols', 'block2_symbols', 'block3_symbols', 'correct_rejections', 'demo_age_range', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_screentime', 'demo_semester', 'demo_vision', 'false_alarms', 'hits', 'misses', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'notified_animals', 'participantIndex', 'participant_id', 'plugin_version', 'response', 'rt', 'selected_animals', 'task', 'time_elapsed', 'trial_index', 'trial_type', 'vp_code']\n",
      "\n",
      "Struktur 8 – 2 Trials\n",
      "['block', 'block1_symbols', 'block2_symbols', 'block3_symbols', 'demo_age_range', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_screentime', 'demo_semester', 'demo_vision', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'participantIndex', 'participant_id', 'plugin_version', 'response', 'rt', 'time_elapsed', 'trial_index', 'trial_type', 'vp_code']\n"
     ]
    }
   ],
   "source": [
    "# wie viele Trials gibt es pro struktur \n",
    "for i, (keys, count) in enumerate(structure_counts.items(), 1):\n",
    "    print(f\"\\nStruktur {i} – {count} Trials\")\n",
    "    print(sorted(keys))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8047e277",
   "metadata": {},
   "source": [
    "**Anmerkung zu den Strukturen**\n",
    "\n",
    "*Wo liegen die Daten*\n",
    "&nbsp; &nbsp; \n",
    "1. **Struktur 5**: das sind die Trials ohne Push notification  \n",
    "\n",
    "2. **Struktur 3 und 4**: das sind die Trials mit Push notification. Anhand des keys ('block') kann man erkennen, welche Condition es genau ist.\n",
    "\n",
    "3. **Struktur 6**: das sind die Daten aus der Abfrage zu den Push notifications\n",
    "\n",
    "*Strukturen die wir komplett ignorieren können ( + Vermutungen zum Inhalt)*\n",
    "&nbsp; &nbsp; \n",
    "\n",
    "1. **Struktur 1, 7 und 8**: Ich gehe davon aus, dass das eben einmal der Fragebogen ist, dann die letzte Seite wo wir die VP Stunden abfragen und dann noch die Seite die darüber informiert, dass man das Fenster schließen und das Experiment beenden kann. Das wäre meine Interpretation der Struktur. Ich weiß aber nicht genau was was ist. \n",
    "\n",
    "2. **Struktur 2**: ich gehe davon aus, dass Struktur 2 einfach die Informationen enthält die eben die Erklärungen vor den Einzelnen Blöcken darstellt (weil es eben genau 3 trials gibt die hier dazu passen)\n",
    "\n",
    "-> ich behaupte dass man diese ganzen Teile der Daten ignorieren kann, weil die relevanten Daten also die Symbols etc. auch in den anderen Strings vorkommen, wo die relevanten Daten liegen, deshalb werde ich diese Strukturen im folgenden einfach ausblenden\n",
    "\n",
    "-> Wenn ihr Zeit und Lust habt könnt ihr versuchen noch genauer in diese Strukturen rein zu schauen um zu gucken ob ich eventuell doch eine wichtige Information übersehe. Eine Idee wäre zu gucken, was genau die keys sind die sich zwischen den Trials unterschieden, was haben die oder was haben die nicht was bei den anderen nicht vorhanden oder vorhanden ist. Wenn man das noch macht wäre man sicher sicher aber ich habe das für das erste Übersprungen um Zeit zu sparen \n",
    "\n",
    "*Was muss gemacht werden*\n",
    "&nbsp; &nbsp; \n",
    "1. Die trials die zu den Strukturen 3,4,5 und 6 passen müssen gebündelt und in Listen gespeichert werden und dann muss noch geschaut werden welche keys man wo auslesen muss \n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "f926cecf",
   "metadata": {},
   "outputs": [],
   "source": [
    "# jetzt muss ich die Trials in Vraiablen speichern die zusammengehören \n",
    "\n",
    "# die Trials finden die zu einer bestimmten Struktur gehören und sie in einzelnen Listen speichern sodass man weiß \n",
    "# welche Infos man wo für die Analyse findet \n",
    "\n",
    "#symbol matching data \n",
    "structure_3_target_keys = frozenset(['block', 'block1_symbols', 'block2_symbols', 'block3_symbols', 'correct_key', 'demo_age', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_semester', 'demo_vision', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'notification_flag', 'notification_sentence', 'participantIndex', 'participant_id', 'phase', 'plugin_version', 'response', 'rt', 'stimulus', 'symbol', 'task', 'time_elapsed', 'trial_in_block', 'trial_index', 'trial_type', 'vp_code'])\n",
    "structure_4_target_keys = frozenset(['block', 'block1_symbols', 'block2_symbols', 'block3_symbols', 'correct', 'correct_key', 'demo_age', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_semester', 'demo_vision', 'key_pressed', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'notification_flag', 'notification_sentence', 'participantIndex', 'participant_id', 'phase', 'plugin_version', 'response', 'rt', 'stimulus', 'symbol', 'task', 'time_elapsed', 'trial_in_block', 'trial_index', 'trial_type', 'vp_code'])\n",
    "structure_5_target_keys = frozenset(['block1_symbols', 'block2_symbols', 'block3_symbols', 'demo_age', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_semester', 'demo_vision', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'participantIndex', 'participant_id', 'plugin_version', 'response', 'rt', 'stimulus', 'time_elapsed', 'trial_index', 'trial_type', 'vp_code'])\n",
    "\n",
    "# recognition task data\n",
    "structure_6_target_keys = frozenset(['animals_order', 'block', 'block1_symbols', 'block2_symbols', 'block3_symbols', 'correct_rejections', 'demo_age', 'demo_education', 'demo_gender', 'demo_german_level', 'demo_handedness', 'demo_program', 'demo_semester', 'demo_vision', 'false_alarms', 'hits', 'misses', 'notif_block2_animals', 'notif_block2_condition', 'notif_block3_animals', 'notif_block3_condition', 'notified_animals', 'participantIndex', 'participant_id', 'plugin_version', 'response', 'rt', 'selected_animals', 'task', 'time_elapsed', 'trial_index', 'trial_type', 'vp_code'])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ee342de9",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "cd8582e9",
   "metadata": {},
   "source": [
    "*Anmekrung*\n",
    "\n",
    "ich finde eine Sache etwas komisch \n",
    "Warum wird bei Struktur3 nur correct_key gespeichert aber bei Struktur4 auch korrekt und correct_key (könnte das an der Implementation oder an den Benutzten Pacakges liegen?)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "2aa40db9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# mit dieser methode kann ich alle Trials gruppieren die zu einem Fall gehören \n",
    "def find_target_trials(data, target_structure): \n",
    "    return [t for t in data\n",
    "            if frozenset(t.keys()) == target_structure\n",
    "    ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "3699f348",
   "metadata": {},
   "outputs": [],
   "source": [
    "structure_3_trials = find_target_trials(final_data_, structure_3_target_keys)\n",
    "structure_4_trials = find_target_trials(final_data_, structure_4_target_keys)\n",
    "structure_5_trials = find_target_trials(final_data_, structure_5_target_keys)\n",
    "\n",
    "structure_6_trials = find_target_trials(final_data_, structure_6_target_keys)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "1cc2cad6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "0\n",
      "0\n",
      "0\n"
     ]
    }
   ],
   "source": [
    "# nun sind alle Trials die zu den einzelnen Strukturen gehören herausgefiltert \n",
    "print (len(structure_3_trials))\n",
    "print(len(structure_4_trials))\n",
    "print(len(structure_5_trials))\n",
    "print(len(structure_6_trials))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "7acf9fa9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "0\n",
      "0\n"
     ]
    }
   ],
   "source": [
    "# weitere Interssante Strukturen: \n",
    "\n",
    "correct_key_structure3 = [t['correct_key'] for t in structure_3_trials if t.get('correct_key') is not None]\n",
    "correct_key_structure4 = [t['correct_key'] for t in structure_3_trials if t.get('correct_key') is not None]\n",
    "\n",
    "# was steckt hinter dem key correct was in structure 4 vorkommt baer nicht in 3\n",
    "correct_structure4 = [t['correct'] for t in structure_3_trials if t.get('correct') is not None]\n",
    "\n",
    "# was steckt hinter dem key response\n",
    "\n",
    "\n",
    "\n",
    "print(len(correct_key_structure3))\n",
    "print(len(correct_key_structure4))\n",
    "\n",
    "# warum gibt es hier keine Elemente, was sollte hier gespeichert werden und sind das eventuell Daten die garnicht relevant für uns sind \n",
    "print(len(correct_structure4))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "41bc3f41",
   "metadata": {},
   "outputs": [],
   "source": [
    "correct_key_structure3 = [t['correct_key'] for t in structure_3_trials if t.get('correct_key') is not None]\n",
    "correct_key_structure4 = [t['correct_key'] for t in structure_3_trials if t.get('correct_key') is not None]\n",
    "\n",
    "# was steckt hinter dem key correct was in structure 4 vorkommt baer nicht in 3\n",
    "correct_structure4 = [t['correct'] for t in structure_3_trials if t.get('correct') is not None]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "aca3d8f3",
   "metadata": {},
   "outputs": [],
   "source": [
    "response_structure3 = [t['response'] for t in structure_3_trials if t.get('response') is not None]\n",
    "response_structure4 = [t['response'] for t in structure_3_trials if t.get('response') is not None]\n",
    "\n",
    "# was steckt hinter dem key correct was in structure 4 vorkommt baer nicht in 3\n",
    "#correct_structure4 = [t['correct'] for t in structure_3_trials if t.get('correct') is not None]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a971731e",
   "metadata": {},
   "outputs": [],
   "source": [
    "counterA = 0\n",
    "counterB = 0\n",
    "counterC = 0\n",
    "\n",
    "for t in structure_3_trials[:5]:\n",
    "    print(\"Structure 3 value: \" + str(counterA) + repr(t[\"response\"]))\n",
    "    counterA +=1\n",
    "\n",
    "for t in structure_4_trials[:5]:\n",
    "    print(\"Structure 4 value: \" + str(counterB) + repr(t[\"response\"]))\n",
    "    counterB +=1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "5dcb1b4a",
   "metadata": {},
   "outputs": [],
   "source": [
    "counterA = 0\n",
    "counterB = 0\n",
    "counterC = 0\n",
    "\n",
    "for t in structure_3_trials[:5]:\n",
    "    print(\"Structure 3 value: \" + str(counterA) + repr(t[\"correct_key\"]))\n",
    "    counterA +=1\n",
    "\n",
    "for t in structure_4_trials[:5]:\n",
    "    print(\"Structure 4 value: \" + str(counterB) + repr(t[\"correct_key\"]))\n",
    "    counterB +=1\n",
    "\n",
    "#for t in structure_5_trials[:5]:\n",
    "#    print(\"Structure 5 value: \" + str(counterC) + repr(t[\"correct_key\"]))\n",
    "#    counterC +=1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c49af06",
   "metadata": {},
   "source": [
    "*Anmerkungung sehr sehr wichtig* \n",
    "\n",
    "Wir haben ein großes PROBLEM!!!! \n",
    "\n",
    "die keys werden nicht zufällig gewählt das Muster welche keys die richtigen sind bleibt in beiden Conditions gleich und ich weiß nicht ob das so sein soll. Ist es okay wenn die Symbole sich zwar verändern aber die Tasten reihenfolge gleich bleibt ich weiß nicht ob das das ist, was wir am Ende wollen hier müssten wir eventuell nochmal schauen ob das os passt "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e15ec811",
   "metadata": {},
   "source": [
    "**Idee**\n",
    "\n",
    "wir könnten probieren diese Listen für jeden Participant in einer Datenbank zu speichern, ich glaube das würde die Analyse am Ende dann um einiges vereinfachen weil wir dann eben nur mit einer Datenbank arbeiten wo wir alle Infromationen speichern die wir benötigen "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "a9b0795d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "0\n",
      "0\n"
     ]
    }
   ],
   "source": [
    "# die response times in allen Trials herausfinden für die drei Blöcke \n",
    "\n",
    "rts_structure_3 = [t[\"rt\"] for t in structure_3_trials if t.get(\"rt\") is not None]\n",
    "rts_structure_4 = [t[\"rt\"] for t in structure_4_trials if t.get(\"rt\") is not None]\n",
    "rts_structure_5 = [t[\"rt\"] for t in structure_5_trials if t.get(\"rt\") is not None]\n",
    "\n",
    "print(len(rts_structure_3))\n",
    "print(len(rts_structure_4))\n",
    "print(len(rts_structure_5))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c441dd9d",
   "metadata": {},
   "source": [
    "es ist komisch dass hier keine rt Werte ausgeben werden. ich habe mich gefragt ob die Daten wirklich bei allen erhoben werden und es macht auch kein Sinn, dass die rt Daten bei Struktur 4 vorhanden sind aber nicht bei 3 und 5 das ist für mich irgendwie nicht logisch ich gehe davon aus, dass ich mir einen schlechten Datenpunkt rausgesucht habe, aber das müsste man eventuell ncohmal untersuchen woran das liegt "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "45cfe9e6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "0\n",
      "0\n"
     ]
    }
   ],
   "source": [
    "def check_rt_presence(trials):\n",
    "    return sum(\"rt\" in t for t in trials)\n",
    "\n",
    "print(check_rt_presence(structure_3_trials))\n",
    "print(check_rt_presence(structure_4_trials))\n",
    "print(check_rt_presence(structure_5_trials))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "7f1b8b17",
   "metadata": {},
   "outputs": [],
   "source": [
    "for t in structure_3_trials[:5]:\n",
    "    print(repr(t[\"rt\"]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "5a998bab",
   "metadata": {},
   "outputs": [],
   "source": [
    "for t in structure_5_trials[:5]:\n",
    "    print(repr(t[\"rt\"]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "95abe8a2",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "for t in structure_4_trials[:5]:\n",
    "    print(repr(t[\"rt\"]))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "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.13.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
