{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## GET POWER SPECTRA" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pickle\n", "import xarray as xr\n", "import pandas as pd\n", "import sys, os\n", "\n", "import importlib\n", "import LFP_functions\n", "importlib.reload(LFP_functions)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Disable\n", "def blockPrint():\n", " sys.stdout = open(os.devnull, 'w')\n", "\n", "# Restore\n", "def enablePrint():\n", " sys.stdout = sys.__stdout__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We import the lfps for all sessions and save them on the same dictionaries" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded data for session 1\n", "Loaded data for session 2\n", "Loaded data for session 3\n", "Loaded data for session 4\n", "Loaded data for session 5\n", "Loaded data for session 6\n", "Loaded data for session 7\n", "Loaded data for session 8\n", "Loaded data for session 9\n", "Loaded data for session 10\n", "Loaded data for session 11\n", "Loaded data for session 12\n", "Loaded data for session 13\n", "Loaded data for session 14\n", "Loaded data for session 15\n", "Loaded data for session 16\n" ] } ], "source": [ "import pickle\n", "\n", "# Initialize the dictionaries to store the loaded data\n", "lfps_act = {}\n", "lfps_pas = {}\n", "chans = {}\n", "\n", "\n", "for i in range(1,17):\n", " # Format the file names with the current number\n", " act_file = f'aligned_LFP_area/aligned_lfps_act_en_V1_{i}.pickle'\n", " pas_file = f'aligned_LFP_area/aligned_lfps_pas_en_V1_{i}.pickle'\n", " chan_file = f'channels/chans_V1_{i}.pickle'\n", " \n", " # Open and load the data from the files\n", " with open(act_file, 'rb') as f:\n", " lfps_act[i] = pickle.load(f)\n", " with open(pas_file, 'rb') as f:\n", " lfps_pas[i] = pickle.load(f)\n", " with open(chan_file, 'rb') as f:\n", " chans[i] = pickle.load(f)\n", " print(f'Loaded data for session {i}')\n", "\n", "#open the images file\n", "with open('images.pickle', 'rb') as f:\n", " images = pickle.load(f)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from multitaper import mtspec\n", "\n", "def get_spectra(lfps,pres):\n", " '''\n", " given a dictionary of lfps, return the power spectra in the same format,\n", " where we first have the sessions, then the images, and for each combination there's a 3d xarray\n", " containing the power spectra for each channel and presentation id\n", "\n", " INPUTS:\n", " lfps: a dictionary of lfps, where the first key is the session, the second key is the image, and the value is an xarray\n", " containing the lfp data for that session and image\n", " pres: the image onset for the novel image (1 if it is the first onset, 2 if it is the second, etc)\n", " \n", " OUTPUTS:\n", " lfps_spectra: the dictionary of lfps\n", " '''\n", " blockPrint()\n", " lfps_spectra = {}\n", " for i in lfps.keys():\n", " lfps_spectra[i] = {}\n", " for j in lfps[i].keys():\n", " # we are now inside the aligned lfp of a session i and image j\n", " # we will now create another xarray to store the spectrogram\n", " lfp = lfps[i][j]\n", " lfps_spectra[i][j] = get_powers(lfp,pres)\n", " enablePrint()\n", " return lfps_spectra\n", " \n", "\n", "def get_powers(lfp,pres):\n", " '''\n", " given a lfp for a specific image and session, return the power spectrum for each channel\n", " and presentation id in the form of an xarray\n", "\n", " INPUTS:\n", " lfp: an xarray containing the lfp data for a specific image and session\n", " pres: the image onset for the novel image (1 if it is the first onset, 2 if it is the second, etc)\n", " '''\n", "\n", " #set start and end times\n", " ti, tf = LFP_functions.pres_times(pres)\n", " lfp1 = lfp.sel(time_from_presentation_onset=slice(ti,tf))\n", " #energy normalization for each presentation\n", " for pres in lfp1.presentation_id.values:\n", " lfp1.loc[{'presentation_id':pres}] = LFP_functions.energy_normalization(lfp1.sel(presentation_id=pres))\n", " presentation_ids = lfp1.presentation_id.values.tolist()\n", " channels = lfp1.channel.values.tolist()\n", "\n", "\n", " for i,pres in enumerate(presentation_ids): #for every presentation ID\n", " for j,c in enumerate(channels): #for every channel\n", " #obtain the spectrogram for the current channel and presentation id\n", " _,sigspec,lfpspecs,_=mtspec.spectrogram(lfp_res.isel(channel=j,presentation_id=i).values, 1/500, (tf-ti)-1/500, olap=0, nw=1, kspec=2, fmin=0, fmax=100, iadapt=0)\n", " if i==0 and j==0:\n", " #create the 3d numpy array to store the spectrogram\n", " data = np.zeros((len(channels),len(presentation_ids),sigspec.shape[0]))\n", " dims = ['channel','presentation_id','frequency']\n", " data[j,i,:] = lfpspecs[:,0]\n", "\n", " #create the xarray\n", " da = xr.DataArray(data,\n", " coords=[channels,presentation_ids,sigspec[:,0]],\n", " dims=['channel','presentation_id','frequency'])\n", " return da" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When specifying pres=1, we refer to the first presentation of the images (0-250ms from the onset), whilst with pres=0, we obtain the power spectra of the baseline (250-0ms before the onset)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "spectra_act_1 = get_spectra(lfps_act,1)\n", "spectra_act_0 = get_spectra(lfps_act,0)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "with open('power_spectra/spectra_act_1.pickle', 'wb') as f:\n", " pickle.dump(spectra_act_1, f)\n", "with open('power_spectra/spectra_act_0.pickle', 'wb') as f:\n", " pickle.dump(spectra_act_0, f)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "spectra_pas_1 = get_spectra(lfps_pas,1)\n", "spectra_pas_0 = get_spectra(lfps_pas,0)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "#save the power spectra\n", "with open('power_spectra/spectra_pas_1.pickle', 'wb') as f:\n", " pickle.dump(spectra_pas_1, f)\n", "with open('power_spectra/spectra_pas_0.pickle', 'wb') as f:\n", " pickle.dump(spectra_pas_0, f)\n" ] } ], "metadata": { "kernelspec": { "display_name": "allensdk", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.18" } }, "nbformat": 4, "nbformat_minor": 2 }