diff --git a/contarg/normgrid.py b/contarg/normgrid.py index dcccfc3..ac0566c 100644 --- a/contarg/normgrid.py +++ b/contarg/normgrid.py @@ -40,6 +40,7 @@ from mixedvines.copula import GaussianCopula from scipy.stats import norm from scipy import stats +import bids GII_PATTERN = ['sub-{subject}[/ses-{session}]/{datatype|anat}/sub-{subject}[_ses-{session}][_task-{task}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_run-{run}][_hemi-{hemi}][_space-{space}][_den-{density}][_desc-{desc}][_part-{part}]_{suffix}{extension<.nii|.nii.gz|.surf.gii|.shape.gii>}'] @@ -452,6 +453,8 @@ def load_surfaces(subject, layout, anat_dir, overwrite=False): anat_dir = Path(anat_dir) anat_out_dir = anat_dir / f'sub-{subject}/anat' anat_out_dir.mkdir(exist_ok=True, parents=True) + if isinstance(layout,str): + layout = bids.BIDSLayout( database_path=layout) # transform surface to fsLR tmpsurfaces = {} for H in ['L', 'R']: @@ -463,13 +466,14 @@ def load_surfaces(subject, layout, anat_dir, overwrite=False): datatype='anat', hemi=H, suffix=surface, + space=None, extension='.surf.gii' )[0].path current_sphere = layout.get( subject=subject, datatype='anat', space='fsLR', - desc='reg', + desc='msmsulc', hemi=H, suffix='sphere', extension='.surf.gii' @@ -678,7 +682,7 @@ def calc_stimgrid(subject, src_surf_dir, surf_info_dir, raise ValueError("Must pass a layout if fmriprep is True") if anat_dir is None: raise ValueError("Must pass an anat_dir if ") - surfaces = load_surfaces(subject=subject, layout=layout, anat_dir=anat_dir) + surfaces = load_surfaces(subject=subject, layout=layout, overwrite=overwrite, anat_dir=anat_dir) else: surfaces = load_liston_surfs(subject, src_surf_dir) @@ -1225,6 +1229,8 @@ def run_clusters(subject, concat_nii, clust_outdir, src_surf_dir, refroi='bilateralfullSGCsphere', stimroi='expandedcoleBA46', out_prefix='', + layout=None, + anat_dir=None, overwrite=False): """ subject : str @@ -1247,6 +1253,10 @@ def run_clusters(subject, concat_nii, clust_outdir, src_surf_dir, name of the roi where stimulation will be delivered out_prefix : str string preprended to output files + layout : bids.layout.layout.BIDSLayout | str + The layout object or a path to a saved bids layout + anat_dir : Pathlib path | str + Upper level directory under which new surfaces will be saved if needed. Files will be saved to anat_dir / f'sub-{subject}/anat' overwrite : bool Should files be overwritten """ @@ -1273,7 +1283,13 @@ def run_clusters(subject, concat_nii, clust_outdir, src_surf_dir, if not outputs_present or overwrite: # load surfaces - if surf_source == 'liston': + if surf_source == 'fmriprep': + if layout is None: + raise ValueError("Must pass a layout if fmriprep is True") + if anat_dir is None: + raise ValueError("Must pass an anat_dir if ") + surfaces = load_surfaces(subject=subject, layout=layout, anat_dir=anat_dir, overwrite=overwrite) + elif surf_source == 'liston': surfaces = load_liston_surfs(subject, src_surf_dir) else: raise NotImplementedError @@ -1508,4 +1524,4 @@ def make_uncert_surfaces(subject, src_surf_dir, uncert_dir, overwrite=False, fmr ] subprocess.run(create_cifti_cmd, check=True) cifti_outs.append(cifti_out) - return cifti_outs \ No newline at end of file + return cifti_outs diff --git a/notebooks/02_fmriprep_prep_normgrid_targeting.ipynb b/notebooks/02_fmriprep_prep_normgrid_targeting.ipynb new file mode 100644 index 0000000..dc0ed6e --- /dev/null +++ b/notebooks/02_fmriprep_prep_normgrid_targeting.ipynb @@ -0,0 +1,2837 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "7e2f7ed6-0931-427d-99bd-b6f86b9145a8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_3333497/1980680932.py:2: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html\n", + " from pkg_resources import resource_filename\n", + "/tmp/ipykernel_3333497/1980680932.py:8: DeprecationWarning: \n", + "Pyarrow will become a required dependency of pandas in the next major release of pandas (pandas 3.0),\n", + "(to allow more performant data types, such as the Arrow string type, and better interoperability with other libraries)\n", + "but was not found to be installed on your system.\n", + "If this would cause problems for you,\n", + "please provide us feedback at https://github.com/pandas-dev/pandas/issues/54466\n", + " \n", + " import pandas as pd\n" + ] + } + ], + "source": [ + "from pathlib import Path\n", + "from pkg_resources import resource_filename\n", + "from joblib import Parallel, delayed\n", + "from joblib.externals.loky import set_loky_pickler\n", + "from pathos.pools import ParallelPool\n", + "import bids\n", + "import numpy as np\n", + "import pandas as pd\n", + "from contarg.normgrid import (\n", + " get_prob_vine,\n", + " setup_uncert_sims,\n", + " run_clusters,\n", + " calc_stimgrid,\n", + " make_uncert_sims,\n", + " make_uncert_surfaces \n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "34d9f2ae-09a2-41b7-8045-a86c472b5a9d", + "metadata": {}, + "outputs": [], + "source": [ + "#calc_stimgrid??" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "c2262a91-7255-40b3-8066-f34035b3e7ff", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['NDARINV1285PMCK', 'NDARINV1EECRFPM', 'NDARINV1EZ26N40', 'NDARINV1H7JEJW1', 'NDARINV2484CB0H', 'NDARINV2BW6G83G', 'NDARINV52XG9LJ3', 'NDARINV6UU2L6YJ', 'NDARINV7A5RDHVW', 'NDARINV7BTZH7L2', 'NDARINV7TV9UT40', 'NDARINV85UUUHN0', 'NDARINVC25XBH2T', 'NDARINVCVZ70012', 'NDARINVD5FWJDCY', 'NDARINVEN1P5RFL', 'NDARINVFPFM6B57', 'NDARINVG8VWC1TN', 'NDARINVGH5DHURH', 'NDARINVLMU4CC2J', 'NDARINVN394NEWK', 'NDARINVP9Y862GP', 'NDARINVPE5JBKJ3', 'NDARINVRZL7PGK1', 'NDARINVU3CF21GV', 'NDARINVU7WWPJ0M', 'NDARINVV104HFJY', 'NDARINVWFN7K4C5', 'NDARINVWP2U8M5Y', 'NDARINVX7KKFJ5E', 'NDARINVXTMW4PWB', 'NDARINVXZRDA6CJ', 'NDARINVYKVPYY2M']\n" + ] + } + ], + "source": [ + "plot=True\n", + "magne_min_percentile = 99.9\n", + "uncertainty_fwhm = 2\n", + "nbootstraps = 100\n", + "block_length = 45\n", + "pairwise_sig_thresh = 0.1\n", + "sw_thresh = 2\n", + "mt_thresh = 60\n", + "make_plots=True\n", + "stimroi = \"expandedcoleBA46\"\n", + "refroi= \"bilateralfullSGCsphere\"\n", + "min_angle_motor_thresh = 30\n", + "maxMT=80\n", + "dist_std=2\n", + "scalp_res = 2\n", + "angle_std=2.5\n", + "distancetoscalp=2\n", + "overwrite = False\n", + "\n", + "\n", + "subjects = []\n", + "sessions = [1,2]\n", + "smoothings = [2.55]\n", + "fd_thresh = 0.3\n", + "\n", + "outdir = Path('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2')\n", + "outdir.mkdir(exist_ok=True)\n", + "anat_dir = outdir / 'anat_preproc'\n", + "\n", + "jobids = {}\n", + "\n", + "fmriprep_root = Path('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/')\n", + "bidslayout = bids.BIDSLayout(fmriprep_root,validate=False)\n", + "if len(subjects) < 1:\n", + " subjects = bidslayout.get_subjects()\n", + "print(subjects)\n", + "#print(bidslayout)" + ] + }, + { + "cell_type": "markdown", + "id": "a0089238-1966-4e9a-8c85-7b2313d7e8a7", + "metadata": {}, + "source": [ + "# Run Headmodel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b10d24f5-0e8e-4e58-961e-2b22805a9a63", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# build headmodels" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "90af862c-9020-46ab-b305-1794aa7173de", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "using T1w and T2w for NDARINV1285PMCK\n", + "using T1w and T2w for NDARINV1EECRFPM\n", + "using T1w and T2w for NDARINV1H7JEJW1\n", + "using T1w and T2w for NDARINV52XG9LJ3\n", + "using T1w and T2w for NDARINV6UU2L6YJ\n", + "using T1w and T2w for NDARINV7BTZH7L2\n", + "using T1w and T2w for NDARINV7TV9UT40\n", + "using T1w and T2w for NDARINV85UUUHN0\n", + "using T1w and T2w for NDARINVC25XBH2T\n", + "using T1w and T2w for NDARINVCVZ70012\n", + "using T1w and T2w for NDARINVD5FWJDCY\n", + "using T1w and T2w for NDARINVFPFM6B57\n", + "using T1w and T2w for NDARINVG8VWC1TN\n", + "using T1w and T2w for NDARINVGH5DHURH\n", + "using T1w and T2w for NDARINVLMU4CC2J\n", + "using T1w and T2w for NDARINVN394NEWK\n", + "using T1w and T2w for NDARINVP9Y862GP\n", + "using T1w and T2w for NDARINVPE5JBKJ3\n", + "using T1w and T2w for NDARINVRZL7PGK1\n", + "using T1w and T2w for NDARINVV104HFJY\n", + "using T1w and T2w for NDARINVWFN7K4C5\n", + "using T1w and T2w for NDARINVWP2U8M5Y\n", + "using T1w and T2w for NDARINVX7KKFJ5E\n", + "using T1w and T2w for NDARINVXZRDA6CJ\n", + "using T1w and T2w for NDARINVYKVPYY2M\n" + ] + } + ], + "source": [ + "cmds = []\n", + "for hmsub in subjects:\n", + " for session in bidslayout.get_sessions(subject=hmsub):\n", + " #print(session)\n", + " #find T1w and T2w preproc\n", + " filesT1w = bidslayout.get(subject=hmsub,\n", + " session=session,\n", + " extension=\".nii.gz\",\n", + " suffix=\"T1w\",\n", + " desc=\"preproc\",\n", + " space=None)\n", + " #print(filesT1w)\n", + " filesT2w = bidslayout.get(subject=hmsub,\n", + " session=session,\n", + " extension=\".nii.gz\",\n", + " suffix=\"T2w\",\n", + " desc=\"preproc\",\n", + " space=None)\n", + " #print(filesT2w)\n", + " if len(filesT2w) < 1:\n", + " continue # This will skip only T1w since the surfaces are bad.\n", + " ses_out_dir = anat_dir /f'sub-{hmsub}'\n", + " ses_out_dir.mkdir(exist_ok=True, parents=True)\n", + " #proced_anat_dir = liston_root / f'sub-{hmsub}/anat'\n", + " # Will assume the first is the correct.\n", + " t1w_path = Path(filesT1w[0].path)\n", + " #t2w_path = proced_anat_dir / 'T1w/T2w_acpc_dc_restore.nii.gz'\n", + " hm_outdir = ses_out_dir / f\"HeadModel/m2m_{hmsub}\"\n", + " #if not hm_outdir.exists():\n", + " print(hm_outdir)\n", + " cmd = [\n", + " \"contarg\",\n", + " \"tans\",\n", + " \"headmodel\",\n", + " \"--t1\",\n", + " t1w_path.as_posix(),\n", + " \"--out-dir\",\n", + " ses_out_dir.as_posix(),\n", + " \"--subject\",\n", + " hmsub\n", + " ]\n", + " cmds.append(' '.join(cmd))\n", + " #print(cmds)\n", + " else :\n", + " print(f'using T1w and T2w for {hmsub}')\n", + " ses_out_dir = anat_dir /f'sub-{hmsub}'\n", + " ses_out_dir.mkdir(exist_ok=True, parents=True)\n", + " #proced_anat_dir = liston_root / f'sub-{hmsub}/anat'\n", + " t1w_path = Path(filesT1w[0].path)\n", + " t2w_path = Path(filesT2w[0].path)\n", + " hm_outdir = ses_out_dir / f\"HeadModel/m2m_{hmsub}\"\n", + " #if not hm_outdir.exists():\n", + " #print(hm_outdir)\n", + " cmd = [\n", + " \"contarg\",\n", + " \"tans\",\n", + " \"headmodel\",\n", + " \"--t1\",\n", + " t1w_path.as_posix(),\n", + " \"--t2\",\n", + " t2w_path.as_posix(),\n", + " \"--out-dir\",\n", + " ses_out_dir.as_posix(),\n", + " \"--subject\",\n", + " hmsub\n", + " ]\n", + " cmds.append(' '.join(cmd))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d1eabbc6-b471-40e3-959c-5f9d729c0c3a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25\n", + "contarg tans headmodel --t1 /data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINVYKVPYY2M/ses-4yearfollowupyarm1/anat/sub-NDARINVYKVPYY2M_ses-4yearfollowupyarm1_desc-preproc_T1w.nii.gz --t2 /data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINVYKVPYY2M/ses-4yearfollowupyarm1/anat/sub-NDARINVYKVPYY2M_ses-4yearfollowupyarm1_run-24_desc-preproc_T2w.nii.gz --out-dir /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVYKVPYY2M --subject NDARINVYKVPYY2M\n" + ] + } + ], + "source": [ + "print(len(cmds))\n", + "print(cmds[24])" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "986ee8dc-1ad3-4fd3-ba0a-16ee350d47b7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "swarm_cmd_dir = anat_dir/'swarm/swarm_cmds'\n", + "swarm_cmd_dir.mkdir(exist_ok=True, parents=True)\n", + "swarm_log_dir = anat_dir/'swarm/swarm_log'\n", + "swarm_log_dir.mkdir(exist_ok=True, parents=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bd531196-6fda-46ca-9378-700a3993e452", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['19529867']\n" + ] + } + ], + "source": [ + "if len(cmds) > 0:\n", + " swarm_cmd_file = swarm_cmd_dir / 'headmodels'\n", + " \n", + " swarm_cmd_file.write_text('\\n'.join(cmds))\n", + " run_name = 'headmodels'\n", + " jobids[run_name] = ! swarm -f {swarm_cmd_file} -g 80 -t 22 --module matlab,freesurfer/6,fsl,simnibs/4.0,connectome-workbench,ANTs --time 12:00:00 --logdir {swarm_log_dir} --job-name {run_name} --partition norm\n", + " print(jobids[run_name])" + ] + }, + { + "cell_type": "markdown", + "id": "652a4133-03d2-4a61-9b5b-1d07500e9588", + "metadata": {}, + "source": [ + "# Run simulations for each point on the gyral lip" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "6052fac2-a499-4493-bd7d-71d153f8d0da", + "metadata": {}, + "outputs": [], + "source": [ + "import nibabel as nib\n", + "a = nib.load('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1285PMCK/ses-4yearfollowupyarm1/anat/sub-NDARINV1285PMCK_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sphere.surf.gii')\n", + "b = nib.load('/home/zugmana2/.cache/templateflow/tpl-fsLR/tpl-fsLR_hemi-L_den-32k_sphere.surf.gii')\n", + "c = nib.load('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1285PMCK/ses-4yearfollowupyarm1/anat/sub-NDARINV1285PMCK_ses-4yearfollowupyarm1_run-4_hemi-L_midthickness.surf.gii')" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c1fef3ff-326c-430f-827c-1969a7e4cf9c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(135760, 3)\n", + "(32492, 3)\n", + "(32492, 3)\n" + ] + } + ], + "source": [ + "print(a.agg_data()[0].shape)\n", + "print(b.agg_data()[0].shape)\n", + "print(c.agg_data()[0].shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "844e34c8-228c-4bc6-b885-f3fd03ec64e5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1285PMCK/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1EECRFPM/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1H7JEJW1/HeadModel\n", + "sub-NDARINV1H7JEJW1 failed with value error:\n", + "Scalp triangles are not arranged systematically\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV52XG9LJ3/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV6UU2L6YJ/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV7BTZH7L2/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV7TV9UT40/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV85UUUHN0/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVC25XBH2T/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVD5FWJDCY/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVFPFM6B57/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVG8VWC1TN/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVGH5DHURH/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVLMU4CC2J/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVN394NEWK/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVP9Y862GP/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVPE5JBKJ3/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVRZL7PGK1/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVV104HFJY/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVWFN7K4C5/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVWP2U8M5Y/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVX7KKFJ5E/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVXZRDA6CJ/HeadModel\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVYKVPYY2M/HeadModel\n" + ] + } + ], + "source": [ + "#anat_dir\n", + "\n", + "for hmsub in subjects:\n", + " #if hmsub in [\"NDARINVU7WWPJ0M\"]:#\"NDARINV1H7JEJW1\"]:#,\"NDARINV2484CB0H\",\"NDARINV2BW6G83G\",\"NDARINV7BTZH7L2\",\"NDARINV85UUUHN0\",\"NDARINVV104HFJY\"]:\n", + " # continue\n", + " for session in bidslayout.get_sessions(subject=hmsub):\n", + " #print(session)\n", + " if not Path(anat_dir / f'sub-{hmsub}').exists():\n", + " continue\n", + " filesT1w = bidslayout.get(subject=hmsub,\n", + " session=session,\n", + " extension=\".nii.gz\",\n", + " suffix=\"T1w\",\n", + " desc=\"preproc\",\n", + " space=None)\n", + " fmriprepanat = filesT1w[0].dirname\n", + " #print(fmriprepanat)\n", + " src_surf_dir = ''\n", + " surf_info_dir = ''\n", + " grid_out_dir = anat_dir / f'sub-{hmsub}/SearchGrid'\n", + " grid_out_dir.mkdir(exist_ok=True, parents=True)\n", + " grid_out = grid_out_dir / 'SearchGrid.npy'\n", + " grid_out_figs = grid_out_dir / 'figures'\n", + " grid_out_figs.mkdir(exist_ok=True, parents=True)\n", + " \n", + " headmodel_dir = anat_dir /f'sub-{hmsub}/HeadModel'\n", + " sim_out_dir = anat_dir / f'sub-{hmsub}/Simulation'\n", + " # The anat dir here is the fmriprep anat?\n", + " \n", + " print(headmodel_dir)\n", + " try:\n", + " #stimgrid = calc_stimgrid(subject, src_surf_dir, surf_info_dir, headmodel_dir, grid_out_dir, make_plots=True, overwrite=True)\n", + " stimgrid = calc_stimgrid(hmsub, src_surf_dir, surf_info_dir,\n", + " headmodel_dir,\n", + " grid_out_dir, make_plots=True, stimroi=\"expandedcoleBA46\",\n", + " refroi= \"bilateralfullSGCsphere\", overwrite=True, fmriprep=True,\n", + " layout=bidslayout, anat_dir=fmriprepanat)\n", + " \n", + " except ValueError as e:\n", + " print(f\"sub-{hmsub} failed with value error:\")\n", + " print(e)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "75b37f37-6385-499e-9b3c-62412bf27ea8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NDARINV1285PMCK\n", + "NDARINV1EECRFPM\n", + "NDARINV1H7JEJW1\n", + "NDARINV52XG9LJ3\n", + "NDARINV6UU2L6YJ\n", + "NDARINV7BTZH7L2\n", + "NDARINV7TV9UT40\n", + "NDARINV85UUUHN0\n", + "NDARINVC25XBH2T\n", + "NDARINVCVZ70012\n", + "NDARINVD5FWJDCY\n", + "NDARINVFPFM6B57\n", + "NDARINVG8VWC1TN\n", + "NDARINVGH5DHURH\n", + "NDARINVLMU4CC2J\n", + "NDARINVN394NEWK\n", + "NDARINVP9Y862GP\n", + "NDARINVPE5JBKJ3\n", + "NDARINVRZL7PGK1\n", + "NDARINVV104HFJY\n", + "NDARINVWFN7K4C5\n", + "NDARINVWP2U8M5Y\n", + "NDARINVX7KKFJ5E\n", + "NDARINVXZRDA6CJ\n", + "NDARINVYKVPYY2M\n" + ] + } + ], + "source": [ + "cmds = []\n", + "\n", + "for hmsub in subjects:\n", + " #if hmsub in [\"NDARINV1H7JEJW1\",\"NDARINV2484CB0H\",\"NDARINV2BW6G83G\",\"NDARINV7BTZH7L2\",\"NDARINV85UUUHN0\",\"NDARINVV104HFJY\"]:\n", + " # continue\n", + " for session in bidslayout.get_sessions(subject=hmsub):\n", + " #print(session)\n", + " if not Path(anat_dir / f'sub-{hmsub}').exists():\n", + " continue\n", + " print(hmsub)\n", + " filesT1w = bidslayout.get(subject=hmsub,\n", + " session=session,\n", + " extension=\".nii.gz\",\n", + " suffix=\"T1w\",\n", + " desc=\"preproc\",\n", + " space=None)\n", + " fmriprepanat = filesT1w[0].dirname\n", + " #print(fmriprepanat)\n", + " src_surf_dir = Path('')\n", + " surf_info_dir = Path('')\n", + " headmodel_dir = anat_dir /f'sub-{hmsub}/HeadModel'\n", + " searchgrid_dir = anat_dir /f'sub-{hmsub}/SearchGrid'\n", + " out_dir = anat_dir /f'sub-{hmsub}/Simulation'\n", + " cmd = [\n", + " 'contarg',\n", + " 'normgrid',\n", + " 'sim-gyral-lip',\n", + " '--headmodel-dir',\n", + " headmodel_dir.as_posix(),\n", + " '--searchgrid-dir',\n", + " searchgrid_dir.as_posix(),\n", + " '--out-dir',\n", + " out_dir.as_posix(),\n", + " '--src-surf-dir',\n", + " src_surf_dir.as_posix(),\n", + " '--fmriprep-dir',\n", + " Path(fmriprep_root).as_posix(),\n", + " '--bids-dir',\n", + " Path(fmriprep_root).as_posix(),\n", + " '--anat-dir',\n", + " fmriprepanat,\n", + " '--surf_src',\n", + " 'fmriprep',\n", + " '--njobs',\n", + " \"20\"\n", + " ]\n", + " cmds.append(' '.join(cmd))\n", + " \"\"\"\n", + "for subject in subjects:\n", + " headmodel_dir = anat_dir /f'sub-{subject}/HeadModel'\n", + " searchgrid_dir = anat_dir /f'sub-{subject}/SearchGrid'\n", + " out_dir = anat_dir /f'sub-{subject}/Simulation'\n", + " src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k/'\n", + "\n", + " cmd = [\n", + " 'contarg',\n", + " 'normgrid',\n", + " 'sim-gyral-lip',\n", + " '--headmodel-dir',\n", + " headmodel_dir.as_posix(),\n", + " '--searchgrid-dir',\n", + " searchgrid_dir.as_posix(),\n", + " '--out-dir',\n", + " out_dir.as_posix(),\n", + " '--src-surf-dir',\n", + " src_surf_dir.as_posix(),\n", + " '--njobs',\n", + " \"20\"\n", + " ]\n", + " cmds.append(' '.join(cmd))\n", + " \n", + " --headmodel-dir PATH Path to HeadModel directory. [required]\n", + " --searchgrid-dir PATH Path to SearchGrid directory. [required]\n", + " --out-dir PATH Path to write to. [required]\n", + " --src-surf-dir PATH Path in which to find subject surfaces. [required]\n", + " --coil TEXT Name of the coil if it's one of the ones that comes\n", + " with simnibs, othewise the path to it. [default:\n", + " MagVenture_MCF-B65.ccd]\n", + " --distancetoscalp FLOAT Distance in mm from the coil to the scalp.\n", + " Default=2. [default: 2]\n", + " --njobs INTEGER Number of jobs to run in parallel to find targets\n", + " [default: 1]\n", + " --surf_src TEXT flag to indicate where data is coming from, options\n", + " are liston or fmriprep [default: liston]\n", + " --bids-dir PATH Bids directory\n", + " --fmriprep-dir PATH FMRIPREP directory\n", + " --anat-dir PATH contarg anat outputs directory\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "dd13eddf-5c28-46a4-9365-51810d63a6ab", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25\n", + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc\n" + ] + } + ], + "source": [ + "print(len(cmds))\n", + "print(anat_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "ccade262-d623-4e38-a5ca-35e955283301", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#liston_dir = Path('/data/EDB/TMSpilot/liston/')\n", + "outdir = Path('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2')\n", + "swarm_cmd_dir = outdir /'swarm/swarm_cmds'\n", + "swarm_cmd_dir.mkdir(exist_ok=True, parents=True)\n", + "swarm_log_dir = outdir/'swarm/swarm_log'\n", + "swarm_log_dir.mkdir(exist_ok=True, parents=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "9ebd1de8-cdf2-43f4-837a-257719eb8d48", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['19577584']\n" + ] + } + ], + "source": [ + "if len(cmds) > 0:\n", + " swarm_cmd_file = swarm_cmd_dir / 'gyral_opts'\n", + " swarm_cmd_file.write_text('\\n'.join(cmds))\n", + " run_name = 'gyral_opts'\n", + " jobid = ! swarm -f {swarm_cmd_file} -g 200 -t 22 --gres=lscratch:100 --module matlab,freesurfer/6.0,fsl,simnibs/4.0,connectome-workbench,openblas --time 4:00:00 --logdir {swarm_log_dir} --job-name {run_name} --partition quick,norm\n", + " print(jobid)" + ] + }, + { + "cell_type": "markdown", + "id": "a0ff5b14-d601-46fe-b20a-4c3f74de7561", + "metadata": {}, + "source": [ + "# Run simulations for positional uncertainty\n", + "requires gyral lip simulations to be finished before running" + ] + }, + { + "cell_type": "markdown", + "id": "f0883adb-d1fe-4ae4-8e26-d96e6b797ff5", + "metadata": {}, + "source": [ + "## set up dataframes with parameters for uncertainty runs" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "4a0393a2-fe42-4a7f-83a3-e5cb658218b9", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "coil='MagVenture_MCF-B65.ccd'\n", + "\n", + "if not Path(coil).exists():\n", + " simnibs_coil_dir = Path(resource_filename('simnibs', 'resources/coil_models'))\n", + " coil_path = simnibs_coil_dir / f'Drakaki_BrainStim_2022/{coil}'\n", + " if not coil_path.exists():\n", + " coil_path = simnibs_coil_dir / f'legacy_and_other/{coil}'\n", + " if not coil_path.exists():\n", + " raise FileNotFoundError(f\"Could not find coil ({coil}) in {simnibs_coil_dir}.\")\n", + "else:\n", + " coil_path = Path(coil)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0c7058bf-1d14-4a7d-85c1-8a81c4f1c022", + "metadata": {}, + "outputs": [], + "source": [ + "nsims = 1000\n", + "uncert_deviations_path = anat_dir / f'uncert_deviations{nsims}.npy'\n", + "if not uncert_deviations_path.exists():\n", + " uncert_deviations = make_uncert_sims(5, nsims, dist_std, angle_std)\n", + " np.save(uncert_deviations_path, uncert_deviations)\n", + "vine = get_prob_vine(4, dist_std, angle_std)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8f332b9f-92e2-4eca-91d2-c39f0368abbf", + "metadata": {}, + "outputs": [], + "source": [ + "jobs = []\n", + "all_subjects = []\n", + "for subject in subjects:\n", + " if not Path(anat_dir / f'sub-{subject}').exists():\n", + " continue\n", + " if subject in [\"NDARINV1H7JEJW1\",\"NDARINV1285PMCK\"]:#subject failed previos step\n", + " continue\n", + " sim_dir = Path(anat_dir / f'sub-{subject}/Simulation/simulation-00')\n", + " if not sim_dir.exists():\n", + " sim_dir = Path(anat_dir / f'sub-{subject}/Simulation/simulation-01')\n", + " if not sim_dir.exists():\n", + " print(f\"{sim_dir} not found, skipping\")\n", + " headmodel_dir = anat_dir / f'sub-{subject}/HeadModel'\n", + " jobs.append(delayed(setup_uncert_sims)(headmodel_dir, sim_dir, dist_std=dist_std, angle_std=angle_std, outname=f'uncert{nsims}', uncert_deviations_path=uncert_deviations_path))\n", + " all_subjects.append(subject)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "5a3e2e0b-31d0-46cd-a149-b923b6fab5d0", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=8)]: Using backend LokyBackend with 8 concurrent workers.\n", + "[Parallel(n_jobs=8)]: Done 2 tasks | elapsed: 4.3min\n", + "[Parallel(n_jobs=8)]: Done 11 out of 23 | elapsed: 11.4min remaining: 12.4min\n", + "[Parallel(n_jobs=8)]: Done 14 out of 23 | elapsed: 13.3min remaining: 8.6min\n", + "[Parallel(n_jobs=8)]: Done 17 out of 23 | elapsed: 15.5min remaining: 5.5min\n", + "[Parallel(n_jobs=8)]: Done 20 out of 23 | elapsed: 16.6min remaining: 2.5min\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calculating settings for 162 simulations.\n", + "0, 25, 50, 75, 100, 125, 150, Calculating settings for 114 simulations.\n", + "0, 25, 50, 75, 100, Calculating settings for 97 simulations.\n", + "0, 25, 50, 75, Calculating settings for 118 simulations.\n", + "0, 25, 50, 75, 100, Calculating settings for 112 simulations.\n", + "0, 25, 50, 75, 100, Calculating settings for 77 simulations.\n", + "0, 25, 50, 75, Calculating settings for 91 simulations.\n", + "0, 25, 50, 75, Calculating settings for 115 simulations.\n", + "0, 25, 50, 75, 100, " + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=8)]: Done 23 out of 23 | elapsed: 21.0min finished\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calculating settings for 112 simulations.\n", + "0, 25, 50, 75, 100, Calculating settings for 93 simulations.\n", + "0, 25, 50, 75, Calculating settings for 109 simulations.\n", + "0, 25, 50, 75, 100, Calculating settings for 147 simulations.\n", + "0, 25, 50, 75, 100, 125, Calculating settings for 105 simulations.\n", + "0, 25, 50, 75, 100, Calculating settings for 95 simulations.\n", + "0, 25, 50, 75, Calculating settings for 70 simulations.\n", + "0, 25, 50, Calculating settings for 155 simulations.\n", + "0, 25, 50, 75, 100, 125, 150, Calculating settings for 134 simulations.\n", + "0, 25, 50, 75, 100, 125, Calculating settings for 126 simulations.\n", + "0, 25, 50, 75, 100, 125, Calculating settings for 99 simulations.\n", + "0, 25, 50, 75, Calculating settings for 141 simulations.\n", + "0, 25, 50, 75, 100, 125, Calculating settings for 134 simulations.\n", + "0, 25, 50, 75, 100, 125, Calculating settings for 116 simulations.\n", + "0, 25, 50, 75, 100, Calculating settings for 137 simulations.\n", + "0, 25, 50, 75, 100, 125, " + ] + } + ], + "source": [ + "all_settings = Parallel(n_jobs=8, verbose=10)(jobs)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "958bc544-e98f-49b8-a983-9763506b916a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "23\n", + "23\n" + ] + } + ], + "source": [ + "print(len(all_settings))\n", + "print(len(all_subjects))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "d26ea3c0-524b-4556-b9c0-8c64244c13b0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NDARINV1EECRFPM has oix center cix \\\n", + "0 0 [-59.6645, 48.8108, 65.4391] NaN \n", + "1 0 [-57.14508056640625, 48.943519592285156, 62.20... 166280.0 \n", + "2 0 [-56.566673278808594, 44.78573226928711, 64.92... 169021.0 \n", + "3 0 [-57.16236114501953, 46.82191467285156, 63.221... 167199.0 \n", + "4 0 [-56.64214324951172, 46.57911682128906, 64.068... 168133.0 \n", + "... ... ... ... \n", + "162157 161 [-63.86248779296875, 48.108909606933594, 50.14... 155731.0 \n", + "162158 161 [-62.770912170410156, 50.33123016357422, 51.04... 156603.0 \n", + "162159 161 [-61.93158721923828, 50.98860168457031, 52.269... 157478.0 \n", + "162160 161 [-63.70738983154297, 47.38672637939453, 51.106... 156591.0 \n", + "162161 161 [-61.50745391845703, 47.72914123535156, 55.422... 160082.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.3066, 0.5304, 0.7903], [0.6214, 0.7405, -... 0.000000 0.000000 \n", + "1 [[-0.3533399998179084, 0.5275280005724606, 0.7... -1.783079 2.478372 \n", + "2 [[-0.36327742461186485, 0.519009492950002, 0.7... 2.104476 2.520936 \n", + "3 [[-0.2753754495428369, 0.5741451699118195, 0.7... -2.972169 0.191529 \n", + "4 [[-0.29561989526232846, 0.5377645545817886, 0.... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "162157 [[0.3466580001169175, 0.34302495025738855, 0.8... 1.368470 1.713300 \n", + "162158 [[0.3117378731474612, 0.2941331363597761, 0.90... -2.114465 -1.682370 \n", + "162159 [[0.3567559712490657, 0.37537312049016247, 0.8... 1.253506 3.879072 \n", + "162160 [[0.29424838335297593, 0.2609651749978714, 0.9... -2.716497 -3.846848 \n", + "162161 [[0.375410808947153, 0.2768916921511343, 0.884... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.3066, 0.5304, 0.7903, -59.6645], [0.6214,... -59.6645 \n", + "1 1.448785 [[-0.3533399998179084, 0.5275280005724606, 0.7... -59.6645 \n", + "2 2.351961 [[-0.36327742461186485, 0.519009492950002, 0.7... -59.6645 \n", + "3 -3.267025 [[-0.2753754495428369, 0.5741451699118195, 0.7... -59.6645 \n", + "4 -0.716621 [[-0.29561989526232846, 0.5377645545817886, 0.... -59.6645 \n", + "... ... ... ... \n", + "162157 0.585902 [[0.3466580001169175, 0.34302495025738855, 0.8... -66.2734 \n", + "162158 2.258948 [[0.3117378731474612, 0.2941331363597761, 0.90... -66.2734 \n", + "162159 0.270795 [[0.3567559712490657, 0.37537312049016247, 0.8... -66.2734 \n", + "162160 3.095022 [[0.29424838335297593, 0.2609651749978714, 0.9... -66.2734 \n", + "162161 -1.794639 [[0.375410808947153, 0.2768916921511343, 0.884... -66.2734 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 48.8108 65.4391 0.000000 0.000811 0.026338 \n", + "1 48.8108 65.4391 4.098515 0.000040 0.001294 \n", + "2 48.8108 65.4391 5.104871 0.000008 0.000275 \n", + "3 48.8108 65.4391 3.890369 0.000026 0.000832 \n", + "4 48.8108 65.4391 3.999240 0.000104 0.003372 \n", + "... ... ... ... ... ... \n", + "162157 49.2815 53.3302 4.166928 0.000061 0.002002 \n", + "162158 49.2815 53.3302 4.314376 0.000029 0.000958 \n", + "162159 49.2815 53.3302 4.784443 0.000012 0.000398 \n", + "162160 49.2815 53.3302 3.888490 0.000010 0.000315 \n", + "162161 49.2815 53.3302 5.431717 0.000009 0.000307 \n", + "\n", + "[162162 rows x 14 columns]\n", + "NDARINV52XG9LJ3 has oix center cix \\\n", + "0 0 [-63.5883, 61.9171, 3.7192] NaN \n", + "1 0 [-60.67216491699219, 61.92171859741211, 1.2474... 147652.0 \n", + "2 0 [-61.22608947753906, 57.75939178466797, 4.9326... 151082.0 \n", + "3 0 [-61.59557342529297, 59.49550247192383, 1.9066... 148507.0 \n", + "4 0 [-60.571746826171875, 59.363624572753906, 4.38... 150226.0 \n", + "... ... ... ... \n", + "112107 111 [-58.85870361328125, 64.72299194335938, 2.0122... 148526.0 \n", + "112108 111 [-57.564056396484375, 66.67041778564453, 2.576... 149386.0 \n", + "112109 111 [-56.423397064208984, 67.8088150024414, 3.5719... 150264.0 \n", + "112110 111 [-58.899375915527344, 63.52437973022461, 3.184... 150245.0 \n", + "112111 111 [-56.22779083251953, 64.0632553100586, 7.75354... 153748.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[0.545, 0.1648, 0.8221], [0.7826, -0.4518, -0... 0.000000 0.000000 \n", + "1 [[0.536250734945414, 0.21381297826117826, 0.81... -1.783079 2.478372 \n", + "2 [[0.5268505428358888, 0.22212953380800204, 0.8... 2.104476 2.520936 \n", + "3 [[0.5904077521288172, 0.14440940299537294, 0.7... -2.972169 0.191529 \n", + "4 [[0.553384159031828, 0.15525780617940219, 0.81... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "112107 [[0.5588310099585257, 0.2173950251050807, 0.80... 1.368470 1.713300 \n", + "112108 [[0.5187350477493606, 0.17706520966977868, 0.8... -2.114465 -1.682370 \n", + "112109 [[0.573353518135063, 0.2470660568830527, 0.781... 1.253506 3.879072 \n", + "112110 [[0.49667410054042693, 0.14841546502987157, 0.... -2.716497 -3.846848 \n", + "112111 [[0.5723411559153463, 0.14593884625433529, 0.8... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[0.545, 0.1648, 0.8221, -63.5883], [0.7826, -... -63.5883 \n", + "1 1.448785 [[0.536250734945414, 0.21381297826117826, 0.81... -63.5883 \n", + "2 2.351961 [[0.5268505428358888, 0.22212953380800204, 0.8... -63.5883 \n", + "3 -3.267025 [[0.5904077521288172, 0.14440940299537294, 0.7... -63.5883 \n", + "4 -0.716621 [[0.553384159031828, 0.15525780617940219, 0.81... -63.5883 \n", + "... ... ... ... \n", + "112107 0.585902 [[0.5588310099585257, 0.2173950251050807, 0.80... -60.6377 \n", + "112108 2.258948 [[0.5187350477493606, 0.17706520966977868, 0.8... -60.6377 \n", + "112109 0.270795 [[0.573353518135063, 0.2470660568830527, 0.781... -60.6377 \n", + "112110 3.095022 [[0.49667410054042693, 0.14841546502987157, 0.... -60.6377 \n", + "112111 -1.794639 [[0.5723411559153463, 0.14593884625433529, 0.8... -60.6377 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 61.9171 3.7192 0.000000 0.000811 0.019783 \n", + "1 61.9171 3.7192 3.822761 0.000052 0.001277 \n", + "2 61.9171 3.7192 4.933466 0.000010 0.000256 \n", + "3 61.9171 3.7192 3.622223 0.000033 0.000804 \n", + "4 61.9171 3.7192 4.008129 0.000103 0.002511 \n", + "... ... ... ... ... ... \n", + "112107 66.2367 5.2371 3.981952 0.000074 0.002048 \n", + "112108 66.2367 5.2371 4.088542 0.000037 0.001030 \n", + "112109 66.2367 5.2371 4.796306 0.000012 0.000333 \n", + "112110 66.2367 5.2371 3.819977 0.000010 0.000286 \n", + "112111 66.2367 5.2371 5.523009 0.000008 0.000230 \n", + "\n", + "[112112 rows x 14 columns]\n", + "NDARINV6UU2L6YJ has oix center cix \\\n", + "0 0 [-55.0776, 64.0425, 38.4577] NaN \n", + "1 0 [-51.62065505981445, 63.898475646972656, 35.86... 157834.0 \n", + "2 0 [-52.13868713378906, 59.807777404785156, 38.95... 161149.0 \n", + "3 0 [-52.65003204345703, 61.29975891113281, 36.423... 158649.0 \n", + "4 0 [-51.94268798828125, 61.25259017944336, 37.914... 160304.0 \n", + "... ... ... ... \n", + "77072 76 [-59.0831298828125, 51.63714599609375, 34.2138... 156995.0 \n", + "77073 76 [-58.10251235961914, 53.0352783203125, 34.7768... 157793.0 \n", + "77074 76 [-57.1251335144043, 54.440921783447266, 35.213... 157797.0 \n", + "77075 76 [-59.17585372924805, 50.56381607055664, 34.884... 157781.0 \n", + "77076 76 [-56.277870178222656, 50.92948913574219, 38.81... 161113.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.6155, -0.0641, 0.7855], [-0.6334, 0.6334,... 0.000000 0.000000 \n", + "1 [[-0.6177643492423861, -0.11359319816105688, 0... -1.783079 2.478372 \n", + "2 [[-0.6107368280329457, -0.12396927831436007, 0... 2.104476 2.520936 \n", + "3 [[-0.6533841961354642, -0.032905690478316194, ... -2.972169 0.191529 \n", + "4 [[-0.6212703187992598, -0.052768728633816424, ... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "77072 [[-0.157883794719595, 0.5506867431300104, 0.81... 1.368470 1.713300 \n", + "77073 [[-0.13232495420336984, 0.4999644685853678, 0.... -2.114465 -1.682370 \n", + "77074 [[-0.181058848595379, 0.5731081716949935, 0.79... 1.253506 3.879072 \n", + "77075 [[-0.11191211694669904, 0.4705219161555717, 0.... -2.716497 -3.846848 \n", + "77076 [[-0.08635170678924034, 0.5457419419832339, 0.... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.6155, -0.0641, 0.7855, -55.0776], [-0.633... -55.0776 \n", + "1 1.448785 [[-0.6177643492423861, -0.11359319816105688, 0... -55.0776 \n", + "2 2.351961 [[-0.6107368280329457, -0.12396927831436007, 0... -55.0776 \n", + "3 -3.267025 [[-0.6533841961354642, -0.032905690478316194, ... -55.0776 \n", + "4 -0.716621 [[-0.6212703187992598, -0.052768728633816424, ... -55.0776 \n", + "... ... ... ... \n", + "77072 0.585902 [[-0.157883794719595, 0.5506867431300104, 0.81... -61.4136 \n", + "77073 2.258948 [[-0.13232495420336984, 0.4999644685853678, 0.... -61.4136 \n", + "77074 0.270795 [[-0.181058848595379, 0.5731081716949935, 0.79... -61.4136 \n", + "77075 3.095022 [[-0.11191211694669904, 0.4705219161555717, 0.... -61.4136 \n", + "77076 -1.794639 [[-0.08635170678924034, 0.5457419419832339, 0.... -61.4136 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 64.0425 38.4577 0.000000 0.000811 0.033436 \n", + "1 64.0425 38.4577 4.325256 0.000031 0.001294 \n", + "2 64.0425 38.4577 5.178197 0.000008 0.000317 \n", + "3 64.0425 38.4577 4.189656 0.000019 0.000780 \n", + "4 64.0425 38.4577 4.231616 0.000082 0.003371 \n", + "... ... ... ... ... ... \n", + "77072 52.9104 37.3364 4.099077 0.000066 0.002363 \n", + "77073 52.9104 37.3364 4.186888 0.000034 0.001208 \n", + "77074 52.9104 37.3364 5.024041 0.000009 0.000327 \n", + "77075 52.9104 37.3364 4.065275 0.000008 0.000291 \n", + "77076 52.9104 37.3364 5.698414 0.000006 0.000233 \n", + "\n", + "[77077 rows x 14 columns]\n", + "NDARINV7BTZH7L2 has oix center cix \\\n", + "0 0 [-63.0557, 53.8226, 21.3594] NaN \n", + "1 0 [-59.84674835205078, 53.14579391479492, 18.619... 167946.0 \n", + "2 0 [-60.436912536621094, 49.138160705566406, 22.3... 170449.0 \n", + "3 0 [-60.70621871948242, 51.257362365722656, 19.41... 168784.0 \n", + "4 0 [-60.480224609375, 50.29388427734375, 20.93957... 169618.0 \n", + "... ... ... ... \n", + "70065 69 [-58.189735412597656, 56.56522750854492, 16.97... 166287.0 \n", + "70066 69 [-56.808929443359375, 57.53749465942383, 18.26... 167133.0 \n", + "70067 69 [-55.68553161621094, 58.241905212402344, 19.52... 168814.0 \n", + "70068 69 [-58.18131637573242, 55.32769012451172, 18.901... 167955.0 \n", + "70069 69 [-55.91937255859375, 55.66120910644531, 23.124... 171338.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.6185, 0.151, 0.7711], [-0.4874, 0.696, -0... 0.000000 0.000000 \n", + "1 [[-0.6308993773662435, 0.10251049028525937, 0.... -1.783079 2.478372 \n", + "2 [[-0.6261788856924314, 0.09142324171814305, 0.... 2.104476 2.520936 \n", + "3 [[-0.6490221279303334, 0.18583118031034496, 0.... -2.972169 0.191529 \n", + "4 [[-0.6217941568831757, 0.1627862364572067, 0.7... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "70065 [[0.5765878865319104, 0.29687695741385295, 0.7... 1.368470 1.713300 \n", + "70066 [[0.5514589004038934, 0.24576598108293202, 0.7... -2.114465 -1.682370 \n", + "70067 [[0.5814491235901537, 0.3303430630883094, 0.74... 1.253506 3.879072 \n", + "70068 [[0.5390404864381221, 0.21146430135213481, 0.8... -2.716497 -3.846848 \n", + "70069 [[0.6073053546852648, 0.23063049300283786, 0.7... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.6185, 0.151, 0.7711, -63.0557], [-0.4874,... -63.0557 \n", + "1 1.448785 [[-0.6308993773662435, 0.10251049028525937, 0.... -63.0557 \n", + "2 2.351961 [[-0.6261788856924314, 0.09142324171814305, 0.... -63.0557 \n", + "3 -3.267025 [[-0.6490221279303334, 0.18583118031034496, 0.... -63.0557 \n", + "4 -0.716621 [[-0.6217941568831757, 0.1627862364572067, 0.7... -63.0557 \n", + "... ... ... ... \n", + "70065 0.585902 [[0.5765878865319104, 0.29687695741385295, 0.7... -60.3060 \n", + "70066 2.258948 [[0.5514589004038934, 0.24576598108293202, 0.7... -60.3060 \n", + "70067 0.270795 [[0.5814491235901537, 0.3303430630883094, 0.74... -60.3060 \n", + "70068 3.095022 [[0.5390404864381221, 0.21146430135213481, 0.8... -60.3060 \n", + "70069 -1.794639 [[0.6073053546852648, 0.23063049300283786, 0.7... -60.3060 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 53.8226 21.3594 0.000000 0.000811 0.032268 \n", + "1 53.8226 21.3594 4.273715 0.000033 0.001320 \n", + "2 53.8226 21.3594 5.466067 0.000005 0.000209 \n", + "3 53.8226 21.3594 3.986222 0.000023 0.000927 \n", + "4 53.8226 21.3594 4.388754 0.000069 0.002746 \n", + "... ... ... ... ... ... \n", + "70065 58.2920 20.6210 4.551915 0.000040 0.001525 \n", + "70066 58.2920 20.6210 4.282756 0.000030 0.001149 \n", + "70067 58.2920 20.6210 4.750083 0.000013 0.000481 \n", + "70068 58.2920 20.6210 4.031959 0.000008 0.000317 \n", + "70069 58.2920 20.6210 5.694872 0.000007 0.000247 \n", + "\n", + "[70070 rows x 14 columns]\n", + "NDARINV7TV9UT40 has oix center cix \\\n", + "0 0 [-58.0803, 61.342, 39.4377] NaN \n", + "1 0 [-55.47929382324219, 60.90793228149414, 36.597... 171334.0 \n", + "2 0 [-55.66157913208008, 57.22248840332031, 40.140... 173940.0 \n", + "3 0 [-56.1126594543457, 58.54913330078125, 37.8451... 172194.0 \n", + "4 0 [-55.352291107177734, 58.359291076660156, 39.5... 173948.0 \n", + "... ... ... ... \n", + "126121 125 [-66.78866577148438, 36.716617584228516, 35.26... 170380.0 \n", + "126122 125 [-65.54777526855469, 38.49137496948242, 36.289... 170385.0 \n", + "126123 125 [-64.92562103271484, 39.184288024902344, 37.36... 172124.0 \n", + "126124 125 [-66.87403106689453, 35.563629150390625, 36.07... 171239.0 \n", + "126125 125 [-64.1861343383789, 36.47634506225586, 40.5339... 174753.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.3437, -0.4798, 0.8073], [-0.8995, -0.0787... 0.000000 0.000000 \n", + "1 [[-0.30788657256979457, -0.5141705703082757, 0... -1.783079 2.478372 \n", + "2 [[-0.2953899720171969, -0.5155234968628002, 0.... 2.104476 2.520936 \n", + "3 [[-0.39248106780972, -0.4889772742674574, 0.77... -2.972169 0.191529 \n", + "4 [[-0.35609180372981153, -0.47686403064992333, ... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "126121 [[-0.3266995223086558, 0.412275518560226, 0.85... 1.368470 1.713300 \n", + "126122 [[-0.2811228813540938, 0.37510375414230107, 0.... -2.114465 -1.682370 \n", + "126123 [[-0.3579107242099534, 0.42403687903193904, 0.... 1.253506 3.879072 \n", + "126124 [[-0.2496520457554663, 0.355841419410058, 0.90... -2.716497 -3.846848 \n", + "126125 [[-0.2586799468872813, 0.436299783589858, 0.86... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.3437, -0.4798, 0.8073, -58.0803], [-0.899... -58.0803 \n", + "1 1.448785 [[-0.30788657256979457, -0.5141705703082757, 0... -58.0803 \n", + "2 2.351961 [[-0.2953899720171969, -0.5155234968628002, 0.... -58.0803 \n", + "3 -3.267025 [[-0.39248106780972, -0.4889772742674574, 0.77... -58.0803 \n", + "4 -0.716621 [[-0.35609180372981153, -0.47686403064992333, ... -58.0803 \n", + "... ... ... ... \n", + "126121 0.585902 [[-0.3266995223086558, 0.412275518560226, 0.85... -68.7378 \n", + "126122 2.258948 [[-0.2811228813540938, 0.37510375414230107, 0.... -68.7378 \n", + "126123 0.270795 [[-0.3579107242099534, 0.42403687903193904, 0.... -68.7378 \n", + "126124 3.095022 [[-0.2496520457554663, 0.355841419410058, 0.90... -68.7378 \n", + "126125 -1.794639 [[-0.2586799468872813, 0.436299783589858, 0.86... -68.7378 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 61.3420 39.4377 0.000000 0.000811 0.022192 \n", + "1 61.3420 39.4377 3.875486 0.000050 0.001362 \n", + "2 61.3420 39.4377 4.828470 0.000012 0.000326 \n", + "3 61.3420 39.4377 3.769326 0.000029 0.000787 \n", + "4 61.3420 39.4377 4.044686 0.000099 0.002715 \n", + "... ... ... ... ... ... \n", + "126121 37.5544 38.0272 3.480924 0.000118 0.002311 \n", + "126122 37.5544 38.0272 3.751441 0.000052 0.001013 \n", + "126123 37.5544 38.0272 4.198162 0.000024 0.000461 \n", + "126124 37.5544 38.0272 3.356375 0.000016 0.000306 \n", + "126125 37.5544 38.0272 5.306938 0.000011 0.000218 \n", + "\n", + "[126126 rows x 14 columns]\n", + "NDARINV85UUUHN0 has oix center cix \\\n", + "0 0 [-64.7563, 54.4609, 16.8148] NaN \n", + "1 0 [-61.080135345458984, 55.149417877197266, 14.6... 157209.0 \n", + "2 0 [-61.16949462890625, 50.63739776611328, 17.642... 159857.0 \n", + "3 0 [-61.84938430786133, 51.7058219909668, 15.0052... 157195.0 \n", + "4 0 [-60.846656799316406, 52.33299255371094, 17.19... 159864.0 \n", + "... ... ... ... \n", + "147142 146 [-64.6067123413086, 49.79582595825195, 9.77850... 152791.0 \n", + "147143 146 [-63.53483200073242, 51.79081344604492, 10.690... 153657.0 \n", + "147144 146 [-62.550960540771484, 52.912513732910156, 12.0... 154553.0 \n", + "147145 146 [-64.73201751708984, 48.54029083251953, 10.565... 153643.0 \n", + "147146 146 [-62.23527145385742, 49.650596618652344, 15.70... 158075.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[0.4196, 0.1431, 0.8964], [0.7421, -0.6227, -... 0.000000 0.000000 \n", + "1 [[0.42149497280278697, 0.19212867915771206, 0.... -1.783079 2.478372 \n", + "2 [[0.41334820167285086, 0.20231848846120884, 0.... 2.104476 2.520936 \n", + "3 [[0.46430893685683267, 0.11237202586789272, 0.... -2.972169 0.191529 \n", + "4 [[0.42650585405620095, 0.13190376137316798, 0.... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "147142 [[-0.12428718949818815, 0.4533480472889929, 0.... 1.368470 1.713300 \n", + "147143 [[-0.09968699388021522, 0.3979244285340061, 0.... -2.114465 -1.682370 \n", + "147144 [[-0.14711467944771617, 0.4787257394470334, 0.... 1.253506 3.879072 \n", + "147145 [[-0.07986606125566408, 0.36578386256855683, 0... -2.716497 -3.846848 \n", + "147146 [[-0.05269844198298061, 0.44466311402221, 0.89... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[0.4196, 0.1431, 0.8964, -64.7563], [0.7421, ... -64.7563 \n", + "1 1.448785 [[0.42149497280278697, 0.19212867915771206, 0.... -64.7563 \n", + "2 2.351961 [[0.41334820167285086, 0.20231848846120884, 0.... -64.7563 \n", + "3 -3.267025 [[0.46430893685683267, 0.11237202586789272, 0.... -64.7563 \n", + "4 -0.716621 [[0.42650585405620095, 0.13190376137316798, 0.... -64.7563 \n", + "... ... ... ... \n", + "147142 0.585902 [[-0.12428718949818815, 0.4533480472889929, 0.... -67.1768 \n", + "147143 2.258948 [[-0.09968699388021522, 0.3979244285340061, 0.... -67.1768 \n", + "147144 0.270795 [[-0.14711467944771617, 0.4787257394470334, 0.... -67.1768 \n", + "147145 3.095022 [[-0.07986606125566408, 0.36578386256855683, 0... -67.1768 \n", + "147146 -1.794639 [[-0.05269844198298061, 0.44466311402221, 0.89... -67.1768 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 54.4609 16.8148 0.000000 0.000811 0.034840 \n", + "1 54.4609 16.8148 4.312286 0.000032 0.001367 \n", + "2 54.4609 16.8148 5.307518 0.000006 0.000279 \n", + "3 54.4609 16.8148 4.394897 0.000015 0.000652 \n", + "4 54.4609 16.8148 4.467775 0.000063 0.002717 \n", + "... ... ... ... ... ... \n", + "147142 51.0136 12.6453 4.038172 0.000070 0.002246 \n", + "147143 51.0136 12.6453 4.205648 0.000033 0.001058 \n", + "147144 51.0136 12.6453 5.036235 0.000009 0.000288 \n", + "147145 51.0136 12.6453 4.051889 0.000008 0.000264 \n", + "147146 51.0136 12.6453 5.967929 0.000004 0.000141 \n", + "\n", + "[147147 rows x 14 columns]\n", + "NDARINVC25XBH2T has oix center cix \\\n", + "0 0 [-56.881, 69.399, 56.59] NaN \n", + "1 0 [-53.542659759521484, 68.90642547607422, 54.27... 167122.0 \n", + "2 0 [-53.565738677978516, 65.10769653320312, 57.26... 169694.0 \n", + "3 0 [-54.278900146484375, 66.73150634765625, 54.82... 167111.0 \n", + "4 0 [-53.430747985839844, 67.00933837890625, 56.17... 168838.0 \n", + "... ... ... ... \n", + "97092 96 [-57.41849136352539, 75.71595001220703, 23.749... 142843.0 \n", + "97093 96 [-56.391971588134766, 77.07243347167969, 25.18... 143581.0 \n", + "97094 96 [-55.76744079589844, 77.78033447265625, 26.159... 144330.0 \n", + "97095 96 [-57.92708969116211, 74.55653381347656, 25.181... 143571.0 \n", + "97096 96 [-56.519859313964844, 75.43577575683594, 30.09... 147248.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[0.3495, -0.4319, 0.83145], [-0.15903, -0.901... 0.000000 0.000000 \n", + "1 [[0.392463062363972, -0.40700744310178283, 0.8... -1.783079 2.478372 \n", + "2 [[0.3970753147938418, -0.3952170585517391, 0.8... 2.104476 2.520936 \n", + "3 [[0.3457125265246914, -0.4823174222283325, 0.8... -2.972169 0.191529 \n", + "4 [[0.3433888791086352, -0.4431536983224783, 0.8... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "97092 [[-0.2861082944015352, 0.4508279440407697, 0.8... 1.368470 1.713300 \n", + "97093 [[-0.22351179018104197, 0.44190727710467986, 0... -2.114465 -1.682370 \n", + "97094 [[-0.3224618548726622, 0.4455505980236814, 0.8... 1.253506 3.879072 \n", + "97095 [[-0.1840716570517379, 0.44022921534105924, 0.... -2.716497 -3.846848 \n", + "97096 [[-0.23352764829534217, 0.5001475470216799, 0.... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[0.3495, -0.4319, 0.83145, -56.881], [-0.1590... -56.8810 \n", + "1 1.448785 [[0.392463062363972, -0.40700744310178283, 0.8... -56.8810 \n", + "2 2.351961 [[0.3970753147938418, -0.3952170585517391, 0.8... -56.8810 \n", + "3 -3.267025 [[0.3457125265246914, -0.4823174222283325, 0.8... -56.8810 \n", + "4 -0.716621 [[0.3433888791086352, -0.4431536983224783, 0.8... -56.8810 \n", + "... ... ... ... \n", + "97092 0.585902 [[-0.2861082944015352, 0.4508279440407697, 0.8... -60.6004 \n", + "97093 2.258948 [[-0.22351179018104197, 0.44190727710467986, 0... -60.6004 \n", + "97094 0.270795 [[-0.3224618548726622, 0.4455505980236814, 0.8... -60.6004 \n", + "97095 3.095022 [[-0.1840716570517379, 0.44022921534105924, 0.... -60.6004 \n", + "97096 -1.794639 [[-0.23352764829534217, 0.5001475470216799, 0.... -60.6004 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 69.3990 56.5900 0.000000 0.000811 0.030796 \n", + "1 69.3990 56.5900 4.092068 0.000040 0.001523 \n", + "2 69.3990 56.5900 5.465001 0.000005 0.000200 \n", + "3 69.3990 56.5900 4.124640 0.000020 0.000769 \n", + "4 69.3990 56.5900 4.217595 0.000083 0.003151 \n", + "... ... ... ... ... ... \n", + "97092 77.5748 26.1769 4.412707 0.000047 0.002034 \n", + "97093 77.5748 26.1769 4.353346 0.000028 0.001215 \n", + "97094 77.5748 26.1769 4.837359 0.000011 0.000494 \n", + "97095 77.5748 26.1769 4.153024 0.000007 0.000320 \n", + "97096 77.5748 26.1769 6.049989 0.000004 0.000167 \n", + "\n", + "[97097 rows x 14 columns]\n", + "NDARINVCVZ70012 has oix center cix \\\n", + "0 0 [-57.826, 39.808, 36.005] NaN \n", + "1 0 [-55.69038391113281, 40.2592658996582, 33.4487... 169838.0 \n", + "2 0 [-55.22361373901367, 35.988059997558594, 36.75... 173333.0 \n", + "3 0 [-55.79140090942383, 38.05485153198242, 34.423... 170698.0 \n", + "4 0 [-55.16109085083008, 37.49332046508789, 35.967... 172443.0 \n", + "... ... ... ... \n", + "134129 133 [-54.12907409667969, 49.31024932861328, 27.793... 164725.0 \n", + "134130 133 [-52.69438934326172, 50.91455841064453, 29.363... 166436.0 \n", + "134131 133 [-51.70750427246094, 52.01993942260742, 30.187... 167313.0 \n", + "134132 133 [-54.09624481201172, 48.05234146118164, 29.464... 166424.0 \n", + "134133 133 [-52.26604080200195, 48.5004997253418, 33.4312... 170742.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[0.29639, 0.53643, 0.79019], [0.9363, 5.7332e... 0.000000 0.000000 \n", + "1 [[0.263105694696183, 0.5715579473780054, 0.777... -1.783079 2.478372 \n", + "2 [[0.25040927052026185, 0.5737956025631156, 0.7... 2.104476 2.520936 \n", + "3 [[0.3478475076658886, 0.5408618121008569, 0.76... -2.972169 0.191529 \n", + "4 [[0.30888453213135436, 0.5326393112242191, 0.7... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "134129 [[-0.08638200636800317, -0.6177342646929319, 0... 1.368470 1.713300 \n", + "134130 [[-0.09602699918678811, -0.5635513443909606, 0... -2.114465 -1.682370 \n", + "134131 [[-0.07065055549099344, -0.6454021385833969, 0... 1.253506 3.879072 \n", + "134132 [[-0.10677016775098043, -0.530142313056943, 0.... -2.716497 -3.846848 \n", + "134133 [[-0.1529977333381777, -0.589973281021218, 0.7... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[0.29639, 0.53643, 0.79019, -57.826], [0.9363... -57.8260 \n", + "1 1.448785 [[0.263105694696183, 0.5715579473780054, 0.777... -57.8260 \n", + "2 2.351961 [[0.25040927052026185, 0.5737956025631156, 0.7... -57.8260 \n", + "3 -3.267025 [[0.3478475076658886, 0.5408618121008569, 0.76... -57.8260 \n", + "4 -0.716621 [[0.30888453213135436, 0.5326393112242191, 0.7... -57.8260 \n", + "... ... ... ... \n", + "134129 0.585902 [[-0.08638200636800317, -0.6177342646929319, 0... -55.9106 \n", + "134130 2.258948 [[-0.09602699918678811, -0.5635513443909606, 0... -55.9106 \n", + "134131 0.270795 [[-0.07065055549099344, -0.6454021385833969, 0... -55.9106 \n", + "134132 3.095022 [[-0.10677016775098043, -0.530142313056943, 0.... -55.9106 \n", + "134133 -1.794639 [[-0.1529977333381777, -0.589973281021218, 0.7... -55.9106 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 39.8080 36.0050 0.000000 0.000811 0.013201 \n", + "1 39.8080 36.0050 3.361362 0.000079 0.001290 \n", + "2 39.8080 36.0050 4.682486 0.000014 0.000231 \n", + "3 39.8080 36.0050 3.116826 0.000050 0.000821 \n", + "4 39.8080 36.0050 3.529997 0.000161 0.002629 \n", + "... ... ... ... ... ... \n", + "134129 50.5288 31.1566 3.996305 0.000073 0.001484 \n", + "134130 50.5288 31.1566 3.702630 0.000054 0.001102 \n", + "134131 50.5288 31.1566 4.563816 0.000016 0.000321 \n", + "134132 50.5288 31.1566 3.505613 0.000014 0.000280 \n", + "134133 50.5288 31.1566 4.750883 0.000022 0.000455 \n", + "\n", + "[134134 rows x 14 columns]\n", + "NDARINVD5FWJDCY has oix center cix \\\n", + "0 0 [-69.951, 46.446, 48.594] NaN \n", + "1 0 [-66.21532440185547, 46.579002380371094, 46.63... 161644.0 \n", + "2 0 [-66.88736724853516, 42.231266021728516, 48.95... 164110.0 \n", + "3 0 [-66.80896759033203, 44.382110595703125, 47.10... 162469.0 \n", + "4 0 [-66.4138412475586, 44.07982635498047, 48.3773... 163302.0 \n", + "... ... ... ... \n", + "155150 154 [-61.922428131103516, 45.11355972290039, 56.78... 170907.0 \n", + "155151 154 [-61.07673645019531, 46.34739685058594, 57.503... 171765.0 \n", + "155152 154 [-60.10601806640625, 47.6866455078125, 58.1515... 171768.0 \n", + "155153 154 [-62.079708099365234, 43.44512939453125, 57.48... 171754.0 \n", + "155154 154 [-59.152217864990234, 43.82108688354492, 61.86... 175272.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.32583, 0.31013, 0.89312], [0.08315, 0.950... 0.000000 0.000000 \n", + "1 [[-0.36758494047760476, 0.2834526294810643, 0.... -1.783079 2.478372 \n", + "2 [[-0.37129591936059203, 0.27106392581581185, 0... 2.104476 2.520936 \n", + "3 [[-0.32650242440163024, 0.363403235631775, 0.8... -2.972169 0.191529 \n", + "4 [[-0.32058617174101767, 0.3220674709400002, 0.... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "155150 [[-0.3006044927998944, 0.5003432147742644, 0.8... 1.368470 1.713300 \n", + "155151 [[-0.2680637924428256, 0.45470250078058305, 0.... -2.114465 -1.682370 \n", + "155152 [[-0.3264082875899449, 0.518386180227395, 0.79... 1.253506 3.879072 \n", + "155153 [[-0.24361512447354614, 0.42926366563442286, 0... -2.716497 -3.846848 \n", + "155154 [[-0.23023764461466031, 0.5085055945893865, 0.... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.32583, 0.31013, 0.89312, -69.951], [0.083... -69.9510 \n", + "1 1.448785 [[-0.36758494047760476, 0.2834526294810643, 0.... -69.9510 \n", + "2 2.351961 [[-0.37129591936059203, 0.27106392581581185, 0... -69.9510 \n", + "3 -3.267025 [[-0.32650242440163024, 0.363403235631775, 0.8... -69.9510 \n", + "4 -0.716621 [[-0.32058617174101767, 0.3220674709400002, 0.... -69.9510 \n", + "... ... ... ... \n", + "155150 0.585902 [[-0.3006044927998944, 0.5003432147742644, 0.8... -63.7718 \n", + "155151 2.258948 [[-0.2680637924428256, 0.45470250078058305, 0.... -63.7718 \n", + "155152 0.270795 [[-0.3264082875899449, 0.518386180227395, 0.79... -63.7718 \n", + "155153 3.095022 [[-0.24361512447354614, 0.42926366563442286, 0... -63.7718 \n", + "155154 -1.794639 [[-0.23023764461466031, 0.5085055945893865, 0.... -63.7718 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 46.4460 48.5940 0.000000 0.000811 0.033434 \n", + "1 46.4460 48.5940 4.222220 0.000035 0.001444 \n", + "2 46.4460 48.5940 5.223318 0.000007 0.000299 \n", + "3 46.4460 48.5940 4.044120 0.000022 0.000906 \n", + "4 46.4460 48.5940 4.261127 0.000079 0.003267 \n", + "... ... ... ... ... ... \n", + "155150 45.7088 59.7513 3.544971 0.000112 0.002380 \n", + "155151 45.7088 59.7513 3.567008 0.000061 0.001306 \n", + "155152 45.7088 59.7513 4.461944 0.000018 0.000378 \n", + "155153 45.7088 59.7513 3.620709 0.000012 0.000265 \n", + "155154 45.7088 59.7513 5.418165 0.000010 0.000204 \n", + "\n", + "[155155 rows x 14 columns]\n", + "NDARINVFPFM6B57 has oix center cix \\\n", + "0 0 [-63.3921, 43.7904, 42.5867] NaN \n", + "1 0 [-60.275978088378906, 44.0895881652832, 39.922... 153809.0 \n", + "2 0 [-60.837059020996094, 39.856441497802734, 43.2... 156298.0 \n", + "3 0 [-61.476009368896484, 41.29152297973633, 40.64... 153796.0 \n", + "4 0 [-60.67450714111328, 41.25227737426758, 42.687... 155458.0 \n", + "... ... ... ... \n", + "91086 90 [-61.646766662597656, 39.23716354370117, 42.33... 155452.0 \n", + "91087 90 [-60.56926345825195, 40.77375030517578, 43.186... 156302.0 \n", + "91088 90 [-59.128841400146484, 41.76068115234375, 44.87... 157123.0 \n", + "91089 90 [-61.72475051879883, 37.82756042480469, 43.391... 156289.0 \n", + "91090 90 [-59.00542449951172, 38.90346145629883, 47.663... 159627.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.5266, -0.2755, 0.8043], [-0.8411, 0.3061,... 0.000000 0.000000 \n", + "1 [[-0.5087870816944573, -0.32195961319675775, 0... -1.783079 2.478372 \n", + "2 [[-0.49811625294006606, -0.3284563285528077, 0... 2.104476 2.520936 \n", + "3 [[-0.5742409427864789, -0.26341278531659246, 0... -2.972169 0.191529 \n", + "4 [[-0.536503206152998, -0.26761336979248557, 0.... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "91086 [[0.15307405011563735, -0.5921086915855766, 0.... 1.368470 1.713300 \n", + "91087 [[0.12090366630596532, -0.5463743039025131, 0.... -2.114465 -1.682370 \n", + "91088 [[0.1793822416332585, -0.6110244242606514, 0.7... 1.253506 3.879072 \n", + "91089 [[0.0967907489270915, -0.5201758682016285, 0.8... -2.716497 -3.846848 \n", + "91090 [[0.08064607504985884, -0.5941347466340986, 0.... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.5266, -0.2755, 0.8043, -63.3921], [-0.841... -63.3921 \n", + "1 1.448785 [[-0.5087870816944573, -0.32195961319675775, 0... -63.3921 \n", + "2 2.351961 [[-0.49811625294006606, -0.3284563285528077, 0... -63.3921 \n", + "3 -3.267025 [[-0.5742409427864789, -0.26341278531659246, 0... -63.3921 \n", + "4 -0.716621 [[-0.536503206152998, -0.26761336979248557, 0.... -63.3921 \n", + "... ... ... ... \n", + "91086 0.585902 [[0.15307405011563735, -0.5921086915855766, 0.... -63.3526 \n", + "91087 2.258948 [[0.12090366630596532, -0.5463743039025131, 0.... -63.3526 \n", + "91088 0.270795 [[0.1793822416332585, -0.6110244242606514, 0.7... -63.3526 \n", + "91089 3.095022 [[0.0967907489270915, -0.5201758682016285, 0.8... -63.3526 \n", + "91090 -1.794639 [[0.08064607504985884, -0.5941347466340986, 0.... -63.3526 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 43.7904 42.5867 0.000000 0.000811 0.020002 \n", + "1 43.7904 42.5867 4.110957 0.000039 0.000970 \n", + "2 43.7904 42.5867 4.743391 0.000013 0.000326 \n", + "3 43.7904 42.5867 3.701295 0.000031 0.000756 \n", + "4 43.7904 42.5867 3.719893 0.000136 0.003353 \n", + "... ... ... ... ... ... \n", + "91086 40.4355 45.6094 3.883053 0.000082 0.002090 \n", + "91087 40.4355 45.6094 3.705717 0.000054 0.001384 \n", + "91088 40.4355 45.6094 4.487447 0.000017 0.000441 \n", + "91089 40.4355 45.6094 3.790775 0.000011 0.000272 \n", + "91090 40.4355 45.6094 5.046423 0.000016 0.000399 \n", + "\n", + "[91091 rows x 14 columns]\n", + "NDARINVG8VWC1TN has oix center cix \\\n", + "0 0 [-62.3431, 61.3864, 27.9895] NaN \n", + "1 0 [-58.773155212402344, 60.907649993896484, 27.1... 132012.0 \n", + "2 0 [-60.58707046508789, 56.51607894897461, 30.078... 134432.0 \n", + "3 0 [-59.63804626464844, 58.708824157714844, 26.60... 132001.0 \n", + "4 0 [-59.013465881347656, 58.95311737060547, 29.44... 134437.0 \n", + "... ... ... ... \n", + "118113 117 [-59.3734130859375, 58.43128967285156, 28.4436... 133610.0 \n", + "118114 117 [-58.32990646362305, 60.715877532958984, 30.30... 135259.0 \n", + "118115 117 [-57.80036926269531, 61.74820327758789, 30.721... 136091.0 \n", + "118116 117 [-60.520816802978516, 56.80813980102539, 29.50... 135244.0 \n", + "118117 117 [-58.008941650390625, 58.77994155883789, 35.11... 139393.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.4005, 0.1652, 0.9013], [-0.5914, 0.7047, ... 0.000000 0.000000 \n", + "1 [[-0.41394696729377467, 0.11696591929696208, 0... -1.783079 2.478372 \n", + "2 [[-0.4082690670781122, 0.10579535394119649, 0.... 2.104476 2.520936 \n", + "3 [[-0.43780361004015383, 0.2005764840591358, 0.... -2.972169 0.191529 \n", + "4 [[-0.4047407871362903, 0.17704077876308708, 0.... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "118113 [[-0.4377833828766056, -0.027900258485515382, ... 1.368470 1.713300 \n", + "118114 [[-0.3890629570606774, 0.012844941365824434, 0... -2.114465 -1.682370 \n", + "118115 [[-0.4576925134044394, -0.05837981662694773, 0... 1.253506 3.879072 \n", + "118116 [[-0.3618882149273739, 0.04143295047194588, 0.... -2.716497 -3.846848 \n", + "118117 [[-0.44389845837898156, 0.04477747454834076, 0... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.4005, 0.1652, 0.9013, -62.3431], [-0.5914... -62.3431 \n", + "1 1.448785 [[-0.41394696729377467, 0.11696591929696208, 0... -62.3431 \n", + "2 2.351961 [[-0.4082690670781122, 0.10579535394119649, 0.... -62.3431 \n", + "3 -3.267025 [[-0.43780361004015383, 0.2005764840591358, 0.... -62.3431 \n", + "4 -0.716621 [[-0.4047407871362903, 0.17704077876308708, 0.... -62.3431 \n", + "... ... ... ... \n", + "118113 0.585902 [[-0.4377833828766056, -0.027900258485515382, ... -62.4050 \n", + "118114 2.258948 [[-0.3890629570606774, 0.012844941365824434, 0... -62.4050 \n", + "118115 0.270795 [[-0.4576925134044394, -0.05837981662694773, 0... -62.4050 \n", + "118116 3.095022 [[-0.3618882149273739, 0.04143295047194588, 0.... -62.4050 \n", + "118117 -1.794639 [[-0.44389845837898156, 0.04477747454834076, 0... -62.4050 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 61.3864 27.9895 0.000000 0.000811 0.026038 \n", + "1 61.3864 27.9895 3.688403 0.000059 0.001907 \n", + "2 61.3864 27.9895 5.582796 0.000004 0.000143 \n", + "3 61.3864 27.9895 4.051419 0.000022 0.000701 \n", + "4 61.3864 27.9895 4.374285 0.000070 0.002252 \n", + "... ... ... ... ... ... \n", + "118113 60.1030 31.6390 4.711174 0.000033 0.001379 \n", + "118114 60.1030 31.6390 4.330482 0.000029 0.001187 \n", + "118115 60.1030 31.6390 4.975116 0.000010 0.000398 \n", + "118116 60.1030 31.6390 4.354288 0.000006 0.000246 \n", + "118117 60.1030 31.6390 5.758729 0.000006 0.000245 \n", + "\n", + "[118118 rows x 14 columns]\n", + "NDARINVGH5DHURH has oix center cix \\\n", + "0 0 [-59.1245, 62.5945, 3.7624] NaN \n", + "1 0 [-55.98100662231445, 62.031524658203125, 1.300... 142812.0 \n", + "2 0 [-56.297332763671875, 58.30006790161133, 4.875... 145203.0 \n", + "3 0 [-56.76666259765625, 60.04454803466797, 1.9725... 142801.0 \n", + "4 0 [-56.12310791015625, 59.57132339477539, 3.7107... 144397.0 \n", + "... ... ... ... \n", + "105100 104 [-54.35078811645508, 41.61690902709961, 19.584... 158905.0 \n", + "105101 104 [-52.30815887451172, 43.972591400146484, 21.28... 159786.0 \n", + "105102 104 [-52.06658172607422, 44.2878303527832, 21.5949... 160710.0 \n", + "105103 104 [-53.8953742980957, 40.11646270751953, 20.7244... 158897.0 \n", + "105104 104 [-50.957523345947266, 41.64773178100586, 23.83... 162537.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.2158, -0.5306, 0.8197], [-0.8508, -0.3097... 0.000000 0.000000 \n", + "1 [[-0.1725603489328664, -0.555161201182169, 0.8... -1.783079 2.478372 \n", + "2 [[-0.1601280577442379, -0.5532789863440024, 0.... 2.104476 2.520936 \n", + "3 [[-0.2607097478469875, -0.5522681027561849, 0.... -2.972169 0.191529 \n", + "4 [[-0.22852412203626504, -0.5309185744046262, 0... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "105100 [[0.6528653841843514, -0.2712315538610663, 0.7... 1.368470 1.713300 \n", + "105101 [[0.6077411666646503, -0.25154079727460676, 0.... -2.114465 -1.682370 \n", + "105102 [[0.680275607008729, -0.2718109172859487, 0.68... 1.253506 3.879072 \n", + "105103 [[0.5772872903732786, -0.2440033805845026, 0.7... -2.716497 -3.846848 \n", + "105104 [[0.6019720899279388, -0.31685947613222937, 0.... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.2158, -0.5306, 0.8197, -59.1245], [-0.850... -59.1245 \n", + "1 1.448785 [[-0.1725603489328664, -0.555161201182169, 0.8... -59.1245 \n", + "2 2.351961 [[-0.1601280577442379, -0.5532789863440024, 0.... -59.1245 \n", + "3 -3.267025 [[-0.2607097478469875, -0.5522681027561849, 0.... -59.1245 \n", + "4 -0.716621 [[-0.22852412203626504, -0.5309185744046262, 0... -59.1245 \n", + "... ... ... ... \n", + "105100 0.585902 [[0.6528653841843514, -0.2712315538610663, 0.7... -55.7623 \n", + "105101 2.258948 [[0.6077411666646503, -0.25154079727460676, 0.... -55.7623 \n", + "105102 0.270795 [[0.680275607008729, -0.2718109172859487, 0.68... -55.7623 \n", + "105103 3.095022 [[0.5772872903732786, -0.2440033805845026, 0.7... -55.7623 \n", + "105104 -1.794639 [[0.6019720899279388, -0.31685947613222937, 0.... -55.7623 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 62.5945 3.7624 0.000000 0.000811 0.027214 \n", + "1 62.5945 3.7624 4.031999 0.000043 0.001430 \n", + "2 62.5945 3.7624 5.260638 0.000007 0.000232 \n", + "3 62.5945 3.7624 3.907072 0.000025 0.000845 \n", + "4 62.5945 3.7624 4.260355 0.000079 0.002661 \n", + "... ... ... ... ... ... \n", + "105100 42.3965 23.5376 4.269446 0.000055 0.001958 \n", + "105101 42.3965 23.5376 4.416203 0.000026 0.000935 \n", + "105102 42.3965 23.5376 4.583616 0.000015 0.000549 \n", + "105103 42.3965 23.5376 4.074040 0.000008 0.000286 \n", + "105104 42.3965 23.5376 4.871721 0.000019 0.000688 \n", + "\n", + "[105105 rows x 14 columns]\n", + "NDARINVLMU4CC2J has oix center cix \\\n", + "0 0 [-52.6784, 82.8375, 8.0428] NaN \n", + "1 0 [-49.20951461791992, 81.64541625976562, 6.0292... 127539.0 \n", + "2 0 [-50.6502685546875, 78.5008773803711, 9.343349... 129809.0 \n", + "3 0 [-50.376888275146484, 79.87271118164062, 6.496... 127531.0 \n", + "4 0 [-50.058624267578125, 79.62256622314453, 8.358... 129045.0 \n", + "... ... ... ... \n", + "93088 92 [-52.13837432861328, 71.16165161132812, 20.112... 138357.0 \n", + "93089 92 [-50.77805709838867, 72.28972625732422, 21.298... 139154.0 \n", + "93090 92 [-49.94216537475586, 72.7117919921875, 22.5293... 139949.0 \n", + "93091 92 [-52.30549621582031, 70.23683166503906, 21.130... 139145.0 \n", + "93092 92 [-50.13808822631836, 70.10277557373047, 26.163... 143225.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.3575, 0.5231, 0.7737], [-0.1392, 0.7893, ... 0.000000 0.000000 \n", + "1 [[-0.392522061263046, 0.487797176396502, 0.779... -1.783079 2.478372 \n", + "2 [[-0.39331890929391194, 0.4764538547990481, 0.... 2.104476 2.520936 \n", + "3 [[-0.37062198109760774, 0.5650100725210121, 0.... -2.972169 0.191529 \n", + "4 [[-0.35510932589450844, 0.5343305679216059, 0.... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "93088 [[-0.6246933437141113, -0.06905085735849971, 0... 1.368470 1.713300 \n", + "93089 [[-0.5822079143186405, -0.029918794755140782, ... -2.114465 -1.682370 \n", + "93090 [[-0.6415220267910168, -0.0987393096902093, 0.... 1.253506 3.879072 \n", + "93091 [[-0.5580062682587023, -0.0021199410856433216,... -2.716497 -3.846848 \n", + "93092 [[-0.6300189964585571, 0.003771925072901717, 0... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.3575, 0.5231, 0.7737, -52.6784], [-0.1392... -52.6784 \n", + "1 1.448785 [[-0.392522061263046, 0.487797176396502, 0.779... -52.6784 \n", + "2 2.351961 [[-0.39331890929391194, 0.4764538547990481, 0.... -52.6784 \n", + "3 -3.267025 [[-0.37062198109760774, 0.5650100725210121, 0.... -52.6784 \n", + "4 -0.716621 [[-0.35510932589450844, 0.5343305679216059, 0.... -52.6784 \n", + "... ... ... ... \n", + "93088 0.585902 [[-0.6246933437141113, -0.06905085735849971, 0... -54.7160 \n", + "93089 2.258948 [[-0.5822079143186405, -0.029918794755140782, ... -54.7160 \n", + "93090 0.270795 [[-0.6415220267910168, -0.0987393096902093, 0.... -54.7160 \n", + "93091 3.095022 [[-0.5580062682587023, -0.0021199410856433216,... -54.7160 \n", + "93092 -1.794639 [[-0.6300189964585571, 0.003771925072901717, 0... -54.7160 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 82.8375 8.0428 0.000000 0.000811 0.030166 \n", + "1 82.8375 8.0428 4.184328 0.000036 0.001356 \n", + "2 82.8375 8.0428 4.960952 0.000010 0.000377 \n", + "3 82.8375 8.0428 4.059442 0.000022 0.000805 \n", + "4 82.8375 8.0428 4.159137 0.000088 0.003281 \n", + "... ... ... ... ... ... \n", + "93088 72.7670 23.3340 4.426874 0.000046 0.001912 \n", + "93089 72.7670 23.3340 4.458578 0.000025 0.001033 \n", + "93090 72.7670 23.3340 4.841487 0.000011 0.000470 \n", + "93091 72.7670 23.3340 4.131489 0.000008 0.000312 \n", + "93092 72.7670 23.3340 6.005157 0.000004 0.000171 \n", + "\n", + "[93093 rows x 14 columns]\n", + "NDARINVN394NEWK has oix center cix \\\n", + "0 0 [-59.209, 46.2399, 47.6297] NaN \n", + "1 0 [-56.68651580810547, 46.333396911621094, 44.92... 158500.0 \n", + "2 0 [-56.88196563720703, 42.192718505859375, 48.77... 161788.0 \n", + "3 0 [-57.0465202331543, 44.3641357421875, 45.62504... 159305.0 \n", + "4 0 [-56.35646438598633, 43.839725494384766, 47.83... 160963.0 \n", + "... ... ... ... \n", + "99094 98 [-55.890655517578125, 58.8313102722168, 31.267... 147342.0 \n", + "99095 98 [-55.00838851928711, 60.27366256713867, 32.962... 148967.0 \n", + "99096 98 [-54.02595901489258, 61.6850471496582, 33.4995... 149752.0 \n", + "99097 98 [-56.141727447509766, 57.94533157348633, 32.01... 148136.0 \n", + "99098 98 [-54.32496643066406, 58.448631286621094, 36.76... 152124.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[0.4849, -0.1534, 0.861], [0.3218, -0.8841, -... 0.000000 0.000000 \n", + "1 [[0.5102230711749558, -0.11095583286993406, 0.... -1.783079 2.478372 \n", + "2 [[0.508284256831998, -0.09824611692768637, 0.8... 2.104476 2.520936 \n", + "3 [[0.5074813468350948, -0.2005386234914619, 0.8... -2.972169 0.191529 \n", + "4 [[0.48526624130307955, -0.16637749851051756, 0... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "99094 [[0.321414979195166, 0.40350226543482903, 0.85... 1.368470 1.713300 \n", + "99095 [[0.31867258738050014, 0.34199586831687284, 0.... -2.114465 -1.682370 \n", + "99096 [[0.3123804644026865, 0.4379613670520007, 0.84... 1.253506 3.879072 \n", + "99097 [[0.32129344858579845, 0.303486465436888, 0.89... -2.716497 -3.846848 \n", + "99098 [[0.37825067954368813, 0.3577372581398418, 0.8... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[0.4849, -0.1534, 0.861, -59.209], [0.3218, -... -59.2090 \n", + "1 1.448785 [[0.5102230711749558, -0.11095583286993406, 0.... -59.2090 \n", + "2 2.351961 [[0.508284256831998, -0.09824611692768637, 0.8... -59.2090 \n", + "3 -3.267025 [[0.5074813468350948, -0.2005386234914619, 0.8... -59.2090 \n", + "4 -0.716621 [[0.48526624130307955, -0.16637749851051756, 0... -59.2090 \n", + "... ... ... ... \n", + "99094 0.585902 [[0.321414979195166, 0.40350226543482903, 0.85... -58.4737 \n", + "99095 2.258948 [[0.31867258738050014, 0.34199586831687284, 0.... -58.4737 \n", + "99096 0.270795 [[0.3123804644026865, 0.4379613670520007, 0.84... -58.4737 \n", + "99097 3.095022 [[0.32129344858579845, 0.303486465436888, 0.89... -58.4737 \n", + "99098 -1.794639 [[0.37825067954368813, 0.3577372581398418, 0.8... -58.4737 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 46.2399 47.6297 0.000000 0.000811 0.019614 \n", + "1 46.2399 47.6297 3.699080 0.000059 0.001422 \n", + "2 46.2399 47.6297 4.806700 0.000012 0.000296 \n", + "3 46.2399 47.6297 3.494775 0.000037 0.000892 \n", + "4 46.2399 47.6297 3.733881 0.000134 0.003246 \n", + "... ... ... ... ... ... \n", + "99094 60.0014 33.6479 3.702669 0.000097 0.002043 \n", + "99095 60.0014 33.6479 3.542930 0.000063 0.001322 \n", + "99096 60.0014 33.6479 4.758053 0.000013 0.000266 \n", + "99097 60.0014 33.6479 3.513128 0.000014 0.000288 \n", + "99098 60.0014 33.6479 5.418702 0.000010 0.000202 \n", + "\n", + "[99099 rows x 14 columns]\n", + "NDARINVP9Y862GP has oix center cix \\\n", + "0 0 [-69.5686, 55.03, -4.9961] NaN \n", + "1 0 [-65.85631561279297, 54.493309020996094, -7.09... 127519.0 \n", + "2 0 [-66.60552978515625, 50.43335723876953, -3.946... 130010.0 \n", + "3 0 [-66.35929870605469, 52.20730972290039, -6.086... 128343.0 \n", + "4 0 [-65.86355590820312, 52.9727668762207, -4.3019... 130019.0 \n", + "... ... ... ... \n", + "116111 115 [-56.105045318603516, 68.63279724121094, 3.686... 136882.0 \n", + "116112 115 [-55.217323303222656, 69.86650085449219, 4.628... 137745.0 \n", + "116113 115 [-54.838134765625, 70.36963653564453, 5.047612... 138602.0 \n", + "116114 115 [-56.51890182495117, 66.95982360839844, 4.5791... 137734.0 \n", + "116115 115 [-54.11939239501953, 67.15702056884766, 9.8323... 142022.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.283, 0.2654, 0.9217], [-0.2437, 0.9095, -... 0.000000 0.000000 \n", + "1 [[-0.31550807298167, 0.2272891338715829, 0.921... -1.783079 2.478372 \n", + "2 [[-0.3150230222017321, 0.21455736024220431, 0.... 2.104476 2.520936 \n", + "3 [[-0.3021985592754171, 0.3145605072742719, 0.8... -2.972169 0.191529 \n", + "4 [[-0.2819018154195187, 0.2781461497594758, 0.9... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "116111 [[0.43522778825416714, -0.41701624823025435, 0... 1.368470 1.713300 \n", + "116112 [[0.3793335144749983, -0.403069447017168, 0.83... -2.114465 -1.682370 \n", + "116113 [[0.468826460122146, -0.41451040762083624, 0.7... 1.253506 3.879072 \n", + "116114 [[0.3429747543581386, -0.3984789155742984, 0.8... -2.716497 -3.846848 \n", + "116115 [[0.37916751874873134, -0.4637321961850506, 0.... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.283, 0.2654, 0.9217, -69.5686], [-0.2437,... -69.5686 \n", + "1 1.448785 [[-0.31550807298167, 0.2272891338715829, 0.921... -69.5686 \n", + "2 2.351961 [[-0.3150230222017321, 0.21455736024220431, 0.... -69.5686 \n", + "3 -3.267025 [[-0.3021985592754171, 0.3145605072742719, 0.8... -69.5686 \n", + "4 -0.716621 [[-0.2819018154195187, 0.2781461497594758, 0.9... -69.5686 \n", + "... ... ... ... \n", + "116111 0.585902 [[0.43522778825416714, -0.41701624823025435, 0... -59.0550 \n", + "116112 2.258948 [[0.3793335144749983, -0.403069447017168, 0.83... -59.0550 \n", + "116113 0.270795 [[0.468826460122146, -0.41451040762083624, 0.7... -59.0550 \n", + "116114 3.095022 [[0.3429747543581386, -0.3984789155742984, 0.8... -59.0550 \n", + "116115 -1.794639 [[0.37916751874873134, -0.4637321961850506, 0.... -59.0550 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 55.030 -4.9961 0.000000 0.000811 0.037225 \n", + "1 55.030 -4.9961 4.298350 0.000032 0.001483 \n", + "2 55.030 -4.9961 5.568708 0.000005 0.000209 \n", + "3 55.030 -4.9961 4.410868 0.000015 0.000685 \n", + "4 55.030 -4.9961 4.294345 0.000076 0.003510 \n", + "... ... ... ... ... ... \n", + "116111 69.669 6.4394 4.165678 0.000061 0.002239 \n", + "116112 69.669 6.4394 4.248153 0.000031 0.001149 \n", + "116113 69.669 6.4394 4.495544 0.000017 0.000622 \n", + "116114 69.669 6.4394 4.151149 0.000007 0.000271 \n", + "116115 69.669 6.4394 6.494810 0.000002 0.000070 \n", + "\n", + "[116116 rows x 14 columns]\n", + "NDARINVPE5JBKJ3 has oix center cix \\\n", + "0 0 [-60.41, 52.415, -9.1937] NaN \n", + "1 0 [-56.45014572143555, 51.714900970458984, -10.8... 132854.0 \n", + "2 0 [-58.98322677612305, 47.539764404296875, -7.07... 136482.0 \n", + "3 0 [-57.797630310058594, 49.17549514770508, -10.1... 133731.0 \n", + "4 0 [-57.45721435546875, 49.9767951965332, -8.4375... 135550.0 \n", + "... ... ... ... \n", + "114109 113 [-48.63732147216797, 65.937255859375, -20.5774... 124135.0 \n", + "114110 113 [-47.524803161621094, 67.46318054199219, -18.7... 125896.0 \n", + "114111 113 [-47.026832580566406, 68.06746673583984, -17.7... 126769.0 \n", + "114112 113 [-49.74432373046875, 64.36167907714844, -18.71... 125884.0 \n", + "114113 113 [-48.027748107910156, 65.3177261352539, -13.62... 130219.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[0.48197, 0.18975, 0.85539], [0.87583, -0.076... 0.000000 0.000000 \n", + "1 [[0.45699896811244545, 0.23307455684282177, 0.... -1.783079 2.478372 \n", + "2 [[0.4454636414182688, 0.23688897310516746, 0.8... 2.104476 2.520936 \n", + "3 [[0.5307219989742911, 0.19124766035764043, 0.8... -2.972169 0.191529 \n", + "4 [[0.4929682487039345, 0.1844351019278315, 0.85... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "114109 [[-0.260794453262264, 0.5071915860268839, 0.82... 1.368470 1.713300 \n", + "114110 [[-0.19791803662842145, 0.4984859623422623, 0.... -2.114465 -1.682370 \n", + "114111 [[-0.2974392440303683, 0.5020042934191382, 0.8... 1.253506 3.879072 \n", + "114112 [[-0.15832148229668763, 0.49665342644783045, 0... -2.716497 -3.846848 \n", + "114113 [[-0.20756112300454946, 0.5546651536644791, 0.... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[0.48197, 0.18975, 0.85539, -60.41], [0.87583... -60.4100 \n", + "1 1.448785 [[0.45699896811244545, 0.23307455684282177, 0.... -60.4100 \n", + "2 2.351961 [[0.4454636414182688, 0.23688897310516746, 0.8... -60.4100 \n", + "3 -3.267025 [[0.5307219989742911, 0.19124766035764043, 0.8... -60.4100 \n", + "4 -0.716621 [[0.4929682487039345, 0.1844351019278315, 0.85... -60.4100 \n", + "... ... ... ... \n", + "114109 0.585902 [[-0.260794453262264, 0.5071915860268839, 0.82... -51.8439 \n", + "114110 2.258948 [[-0.19791803662842145, 0.4984859623422623, 0.... -51.8439 \n", + "114111 0.270795 [[-0.2974392440303683, 0.5020042934191382, 0.8... -51.8439 \n", + "114112 3.095022 [[-0.15832148229668763, 0.49665342644783045, 0... -51.8439 \n", + "114113 -1.794639 [[-0.20756112300454946, 0.5546651536644791, 0.... -51.8439 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 52.4150 -9.1937 0.000000 0.000811 0.034096 \n", + "1 52.4150 -9.1937 4.333207 0.000031 0.001308 \n", + "2 52.4150 -9.1937 5.502597 0.000005 0.000210 \n", + "3 52.4150 -9.1937 4.266829 0.000017 0.000733 \n", + "4 52.4150 -9.1937 3.903283 0.000114 0.004800 \n", + "... ... ... ... ... ... \n", + "114109 67.9225 -17.8961 4.627421 0.000037 0.001587 \n", + "114110 67.9225 -17.8961 4.428741 0.000026 0.001112 \n", + "114111 67.9225 -17.8961 4.822179 0.000012 0.000501 \n", + "114112 67.9225 -17.8961 4.213110 0.000007 0.000298 \n", + "114113 67.9225 -17.8961 6.291000 0.000003 0.000115 \n", + "\n", + "[114114 rows x 14 columns]\n", + "NDARINVRZL7PGK1 has oix center cix \\\n", + "0 0 [-65.1829, 71.5777, 38.7109] NaN \n", + "1 0 [-61.554443359375, 71.09318542480469, 36.67283... 158125.0 \n", + "2 0 [-61.943050384521484, 67.27620697021484, 40.11... 161364.0 \n", + "3 0 [-62.155113220214844, 69.20413970947266, 37.31... 158936.0 \n", + "4 0 [-61.7021598815918, 69.322265625, 38.789749145... 160563.0 \n", + "... ... ... ... \n", + "115110 114 [-50.19028854370117, 89.17684173583984, 40.040... 161452.0 \n", + "115111 114 [-48.876529693603516, 90.36591339111328, 41.08... 162270.0 \n", + "115112 114 [-47.59385299682617, 91.44293975830078, 42.102... 163107.0 \n", + "115113 114 [-50.68428039550781, 87.8391342163086, 41.2571... 162258.0 \n", + "115114 114 [-48.05012512207031, 88.2455062866211, 45.9767... 166439.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.1257, 0.4389, 0.8897], [0.3941, 0.8451, -... 0.000000 0.000000 \n", + "1 [[-0.1746516235277982, 0.42880276180714516, 0.... -1.783079 2.478372 \n", + "2 [[-0.18235337755618716, 0.41867556731007954, 0... 2.104476 2.520936 \n", + "3 [[-0.10885832197353099, 0.488054051685382, 0.8... -2.972169 0.191529 \n", + "4 [[-0.11673227719156916, 0.4480543805338343, 0.... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "115110 [[-0.10593924145939189, 0.6628544681074391, 0.... 1.368470 1.713300 \n", + "115111 [[-0.06631488374789817, 0.6235573866805372, 0.... -2.114465 -1.682370 \n", + "115112 [[-0.13573610570717096, 0.6777871361350449, 0.... 1.253506 3.879072 \n", + "115113 [[-0.03818483920629166, 0.6012193506853472, 0.... -2.716497 -3.846848 \n", + "115114 [[-0.033305666839484556, 0.6704332376748783, 0... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.1257, 0.4389, 0.8897, -65.1829], [0.3941,... -65.1829 \n", + "1 1.448785 [[-0.1746516235277982, 0.42880276180714516, 0.... -65.1829 \n", + "2 2.351961 [[-0.18235337755618716, 0.41867556731007954, 0... -65.1829 \n", + "3 -3.267025 [[-0.10885832197353099, 0.488054051685382, 0.8... -65.1829 \n", + "4 -0.716621 [[-0.11673227719156916, 0.4480543805338343, 0.... -65.1829 \n", + "... ... ... ... \n", + "115110 0.585902 [[-0.10593924145939189, 0.6628544681074391, 0.... -52.3600 \n", + "115111 2.258948 [[-0.06631488374789817, 0.6235573866805372, 0.... -52.3600 \n", + "115112 0.270795 [[-0.13573610570717096, 0.6777871361350449, 0.... -52.3600 \n", + "115113 3.095022 [[-0.03818483920629166, 0.6012193506853472, 0.... -52.3600 \n", + "115114 -1.794639 [[-0.033305666839484556, 0.6704332376748783, 0... -52.3600 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 71.5777 38.7109 0.000000 0.000811 0.032940 \n", + "1 71.5777 38.7109 4.189768 0.000036 0.001472 \n", + "2 71.5777 38.7109 5.565030 0.000005 0.000186 \n", + "3 71.5777 38.7109 4.091985 0.000021 0.000851 \n", + "4 71.5777 38.7109 4.148343 0.000089 0.003623 \n", + "... ... ... ... ... ... \n", + "115110 91.1020 43.5320 4.539022 0.000041 0.001661 \n", + "115111 91.1020 43.5320 4.322117 0.000029 0.001182 \n", + "115112 91.1020 43.5320 4.987641 0.000010 0.000387 \n", + "115113 91.1020 43.5320 4.316155 0.000006 0.000253 \n", + "115114 91.1020 43.5320 5.719398 0.000006 0.000256 \n", + "\n", + "[115115 rows x 14 columns]\n", + "NDARINVV104HFJY has oix center cix \\\n", + "0 0 [-53.1592, 75.0409, 41.046] NaN \n", + "1 0 [-49.849998474121094, 74.46646881103516, 38.23... 158354.0 \n", + "2 0 [-50.36957931518555, 70.46871948242188, 41.649... 160897.0 \n", + "3 0 [-50.92906188964844, 72.1788558959961, 38.8545... 159208.0 \n", + "4 0 [-49.8411750793457, 72.10435485839844, 41.0504... 160904.0 \n", + "... ... ... ... \n", + "112107 111 [-56.00297164916992, 71.28333282470703, 27.466... 149406.0 \n", + "112108 111 [-54.79312515258789, 72.63391876220703, 28.470... 150195.0 \n", + "112109 111 [-53.39525604248047, 74.25018310546875, 29.886... 150995.0 \n", + "112110 111 [-56.25319290161133, 70.1806869506836, 28.3929... 150185.0 \n", + "112111 111 [-54.041229248046875, 70.56340789794922, 33.48... 154197.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[0.5575, -0.25, 0.7917], [0.3013, -0.8277, -0... 0.000000 0.000000 \n", + "1 [[0.5815977438252592, -0.20633962357015312, 0.... -1.783079 2.478372 \n", + "2 [[0.5797617030931077, -0.19411329568619226, 0.... 2.104476 2.520936 \n", + "3 [[0.5785507877140087, -0.293396150989168, 0.76... -2.972169 0.191529 \n", + "4 [[0.557779696424934, -0.262536637106825, 0.787... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "112107 [[-0.08444073545441035, -0.5843132698413608, 0... 1.368470 1.713300 \n", + "112108 [[-0.10986085729431126, -0.5312994257103292, 0... -2.114465 -1.682370 \n", + "112109 [[-0.06078964430475246, -0.6093033417323106, 0... 1.253506 3.879072 \n", + "112110 [[-0.12969770331160937, -0.4997186815550618, 0... -2.716497 -3.846848 \n", + "112111 [[-0.15600851677019367, -0.5697831486383149, 0... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[0.5575, -0.25, 0.7917, -53.1592], [0.3013, -... -53.1592 \n", + "1 1.448785 [[0.5815977438252592, -0.20633962357015312, 0.... -53.1592 \n", + "2 2.351961 [[0.5797617030931077, -0.19411329568619226, 0.... -53.1592 \n", + "3 -3.267025 [[0.5785507877140087, -0.293396150989168, 0.76... -53.1592 \n", + "4 -0.716621 [[0.557779696424934, -0.262536637106825, 0.787... -53.1592 \n", + "... ... ... ... \n", + "112107 0.585902 [[-0.08444073545441035, -0.5843132698413608, 0... -58.4664 \n", + "112108 2.258948 [[-0.10986085729431126, -0.5312994257103292, 0... -58.4664 \n", + "112109 0.270795 [[-0.06078964430475246, -0.6093033417323106, 0... -58.4664 \n", + "112110 3.095022 [[-0.12969770331160937, -0.4997186815550618, 0... -58.4664 \n", + "112111 -1.794639 [[-0.15600851677019367, -0.5697831486383149, 0... -58.4664 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 75.0409 41.0460 0.000000 0.000811 0.031265 \n", + "1 75.0409 41.0460 4.379502 0.000030 0.001140 \n", + "2 75.0409 41.0460 5.389935 0.000006 0.000224 \n", + "3 75.0409 41.0460 4.238760 0.000018 0.000693 \n", + "4 75.0409 41.0460 4.430870 0.000066 0.002540 \n", + "... ... ... ... ... ... \n", + "112107 72.8691 30.6834 4.350906 0.000050 0.001770 \n", + "112108 72.8691 30.6834 4.294829 0.000030 0.001053 \n", + "112109 72.8691 30.6834 5.315845 0.000006 0.000219 \n", + "112110 72.8691 30.6834 4.167988 0.000007 0.000256 \n", + "112111 72.8691 30.6834 5.721551 0.000006 0.000220 \n", + "\n", + "[112112 rows x 14 columns]\n", + "NDARINVWFN7K4C5 has oix center cix \\\n", + "0 0 [-54.7741, 60.4686, 45.8924] NaN \n", + "1 0 [-51.87803649902344, 59.75006866455078, 42.827... 157842.0 \n", + "2 0 [-52.006134033203125, 56.273582458496094, 46.1... 160483.0 \n", + "3 0 [-52.46922302246094, 57.60073471069336, 43.916... 157831.0 \n", + "4 0 [-51.73854446411133, 57.33285903930664, 45.519... 159589.0 \n", + "... ... ... ... \n", + "109104 108 [-58.64472198486328, 56.02832794189453, 29.710... 146301.0 \n", + "109105 108 [-57.59733581542969, 57.354427337646484, 30.90... 147095.0 \n", + "109106 108 [-56.55595397949219, 58.55030822753906, 32.080... 147911.0 \n", + "109107 108 [-58.986568450927734, 54.816429138183594, 30.5... 147087.0 \n", + "109108 108 [-56.6973991394043, 55.60675811767578, 36.2505... 151905.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.5276, -0.3281, 0.7836], [-0.844, 0.3072, ... 0.000000 0.000000 \n", + "1 [[-0.5085675202801023, -0.3737593161106011, 0.... -1.783079 2.478372 \n", + "2 [[-0.49777826843219747, -0.3801868459529448, 0... 2.104476 2.520936 \n", + "3 [[-0.575234714413775, -0.3157514105520683, 0.7... -2.972169 0.191529 \n", + "4 [[-0.5376586342980713, -0.32027487346450956, 0... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "109104 [[0.3296145346594696, -0.40054324744399383, 0.... 1.368470 1.713300 \n", + "109105 [[0.27132335037369065, -0.38224172576481746, 0... -2.114465 -1.682370 \n", + "109106 [[0.3649326654614401, -0.4005376597002301, 0.8... 1.253506 3.879072 \n", + "109107 [[0.2336604405496496, -0.3750374147035491, 0.8... -2.716497 -3.846848 \n", + "109108 [[0.2711168707817625, -0.44424752008480956, 0.... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.5276, -0.3281, 0.7836, -54.7741], [-0.844... -54.7741 \n", + "1 1.448785 [[-0.5085675202801023, -0.3737593161106011, 0.... -54.7741 \n", + "2 2.351961 [[-0.49777826843219747, -0.3801868459529448, 0... -54.7741 \n", + "3 -3.267025 [[-0.575234714413775, -0.3157514105520683, 0.7... -54.7741 \n", + "4 -0.716621 [[-0.5376586342980713, -0.32027487346450956, 0... -54.7741 \n", + "... ... ... ... \n", + "109104 0.585902 [[0.3296145346594696, -0.40054324744399383, 0.... -61.4440 \n", + "109105 2.258948 [[0.27132335037369065, -0.38224172576481746, 0... -61.4440 \n", + "109106 0.270795 [[0.3649326654614401, -0.4005376597002301, 0.8... -61.4440 \n", + "109107 3.095022 [[0.2336604405496496, -0.3750374147035491, 0.8... -61.4440 \n", + "109108 -1.794639 [[0.2711168707817625, -0.44424752008480956, 0.... -61.4440 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 60.4686 45.8924 0.000000 0.000811 0.033226 \n", + "1 60.4686 45.8924 4.277490 0.000033 0.001353 \n", + "2 60.4686 45.8924 5.031014 0.000009 0.000381 \n", + "3 60.4686 45.8924 4.176217 0.000019 0.000786 \n", + "4 60.4686 45.8924 4.380263 0.000070 0.002854 \n", + "... ... ... ... ... ... \n", + "109104 57.5760 32.6390 4.336806 0.000051 0.002025 \n", + "109105 57.5760 32.6390 4.226137 0.000032 0.001276 \n", + "109106 57.5760 32.6390 5.015445 0.000009 0.000364 \n", + "109107 57.5760 32.6390 4.234073 0.000007 0.000269 \n", + "109108 57.5760 32.6390 6.281010 0.000003 0.000107 \n", + "\n", + "[109109 rows x 14 columns]\n", + "NDARINVWP2U8M5Y has oix center cix \\\n", + "0 0 [-44.1346, 85.7338, 34.3992] NaN \n", + "1 0 [-41.051055908203125, 83.9020004272461, 32.528... 147266.0 \n", + "2 0 [-42.16895294189453, 81.10774230957031, 35.854... 149622.0 \n", + "3 0 [-42.35529327392578, 82.38092041015625, 32.878... 147255.0 \n", + "4 0 [-41.53334045410156, 82.39210510253906, 34.984... 148833.0 \n", + "... ... ... ... \n", + "134129 133 [-51.71185302734375, 72.26509094238281, 29.041... 144135.0 \n", + "134130 133 [-49.99384307861328, 73.92390441894531, 30.888... 145661.0 \n", + "134131 133 [-49.83697509765625, 73.95758819580078, 31.353... 146441.0 \n", + "134132 133 [-52.02019500732422, 71.55414581298828, 30.373... 145654.0 \n", + "134133 133 [-49.641380310058594, 71.76616668701172, 35.04... 148787.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[0.6522, -0.2927, 0.6992], [0.431, -0.6156, -... 0.000000 0.000000 \n", + "1 [[0.6663594335205366, -0.24490849344683868, 0.... -1.783079 2.478372 \n", + "2 [[0.6623623840957059, -0.2346806686476995, 0.7... 2.104476 2.520936 \n", + "3 [[0.6795116919389206, -0.3225508430064222, 0.6... -2.972169 0.191529 \n", + "4 [[0.6547558442072275, -0.3036026176002032, 0.6... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "134129 [[-0.6005166027877633, -0.06572909758332172, 0... 1.368470 1.713300 \n", + "134130 [[-0.5593894505490763, -0.022792806371517153, ... -2.114465 -1.682370 \n", + "134131 [[-0.6161141618766945, -0.09704607224108677, 0... 1.253506 3.879072 \n", + "134132 [[-0.5363225166420361, 0.00704588498638254, 0.... -2.716497 -3.846848 \n", + "134133 [[-0.6098470640376165, 0.0065660455686516106, ... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[0.6522, -0.2927, 0.6992, -44.1346], [0.431, ... -44.1346 \n", + "1 1.448785 [[0.6663594335205366, -0.24490849344683868, 0.... -44.1346 \n", + "2 2.351961 [[0.6623623840957059, -0.2346806686476995, 0.7... -44.1346 \n", + "3 -3.267025 [[0.6795116919389206, -0.3225508430064222, 0.6... -44.1346 \n", + "4 -0.716621 [[0.6547558442072275, -0.3036026176002032, 0.6... -44.1346 \n", + "... ... ... ... \n", + "134129 0.585902 [[-0.6005166027877633, -0.06572909758332172, 0... -53.6350 \n", + "134130 2.258948 [[-0.5593894505490763, -0.022792806371517153, ... -53.6350 \n", + "134131 0.270795 [[-0.6161141618766945, -0.09704607224108677, 0... -53.6350 \n", + "134132 3.095022 [[-0.5363225166420361, 0.00704588498638254, 0.... -53.6350 \n", + "134133 -1.794639 [[-0.6098470640376165, 0.0065660455686516106, ... -53.6350 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 85.7338 34.3992 0.000000 0.000811 0.029235 \n", + "1 85.7338 34.3992 4.045358 0.000042 0.001516 \n", + "2 85.7338 34.3992 5.232655 0.000007 0.000259 \n", + "3 85.7338 34.3992 4.088949 0.000021 0.000757 \n", + "4 85.7338 34.3992 4.275088 0.000078 0.002814 \n", + "... ... ... ... ... ... \n", + "134129 74.5140 32.1590 4.297963 0.000053 0.001614 \n", + "134130 74.5140 32.1590 3.901226 0.000045 0.001357 \n", + "134131 74.5140 32.1590 3.922219 0.000031 0.000943 \n", + "134132 74.5140 32.1590 3.815229 0.000010 0.000313 \n", + "134133 74.5140 32.1590 5.641250 0.000007 0.000213 \n", + "\n", + "[134134 rows x 14 columns]\n", + "NDARINVX7KKFJ5E has oix center cix \\\n", + "0 0 [-61.195, 72.102, 34.046] NaN \n", + "1 0 [-57.75506591796875, 71.42161560058594, 31.316... 164471.0 \n", + "2 0 [-58.518375396728516, 67.94869232177734, 34.99... 167732.0 \n", + "3 0 [-58.877994537353516, 68.89497375488281, 32.08... 165286.0 \n", + "4 0 [-58.03015899658203, 69.22926330566406, 34.100... 166913.0 \n", + "... ... ... ... \n", + "95090 94 [-50.199729919433594, 83.74888610839844, 33.34... 166166.0 \n", + "95091 94 [-49.39254379272461, 84.58185577392578, 34.340... 166975.0 \n", + "95092 94 [-48.368919372558594, 85.31884765625, 36.03697... 168650.0 \n", + "95093 94 [-50.856781005859375, 82.26449584960938, 34.58... 166963.0 \n", + "95094 94 [-49.36382293701172, 82.62004852294922, 39.134... 171128.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[0.27106, -0.45801, 0.84661], [-0.15672, -0.8... 0.000000 0.000000 \n", + "1 [[0.3151790632097112, -0.43445531003266, 0.843... -1.783079 2.478372 \n", + "2 [[0.3198845413946867, -0.42289012397325837, 0.... 2.104476 2.520936 \n", + "3 [[0.2676973882783292, -0.5077936380964412, 0.8... -2.972169 0.191529 \n", + "4 [[0.26486757016321827, -0.4689911555997701, 0.... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "95090 [[-0.05200705024393791, -0.6348882557008474, 0... 1.368470 1.713300 \n", + "95091 [[-0.08813678387367375, -0.5884707230181496, 0... -2.114465 -1.682370 \n", + "95092 [[-0.0234177499586261, -0.6548789497558778, 0.... 1.253506 3.879072 \n", + "95093 [[-0.11402623709964474, -0.5613757334734674, 0... -2.716497 -3.846848 \n", + "95094 [[-0.12473721034547514, -0.6317908850746701, 0... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[0.27106, -0.45801, 0.84661, -61.195], [-0.15... -61.195 \n", + "1 1.448785 [[0.3151790632097112, -0.43445531003266, 0.843... -61.195 \n", + "2 2.351961 [[0.3198845413946867, -0.42289012397325837, 0.... -61.195 \n", + "3 -3.267025 [[0.2676973882783292, -0.5077936380964412, 0.8... -61.195 \n", + "4 -0.716621 [[0.26486757016321827, -0.4689911555997701, 0.... -61.195 \n", + "... ... ... ... \n", + "95090 0.585902 [[-0.05200705024393791, -0.6348882557008474, 0... -53.222 \n", + "95091 2.258948 [[-0.08813678387367375, -0.5884707230181496, 0... -53.222 \n", + "95092 0.270795 [[-0.0234177499586261, -0.6548789497558778, 0.... -53.222 \n", + "95093 3.095022 [[-0.11402623709964474, -0.5613757334734674, 0... -53.222 \n", + "95094 -1.794639 [[-0.12473721034547514, -0.6317908850746701, 0... -53.222 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 72.102 34.046 0.000000 0.000811 0.037422 \n", + "1 72.102 34.046 4.443412 0.000028 0.001272 \n", + "2 72.102 34.046 5.031751 0.000009 0.000428 \n", + "3 72.102 34.046 4.415359 0.000015 0.000685 \n", + "4 72.102 34.046 4.274549 0.000078 0.003604 \n", + "... ... ... ... ... ... \n", + "95090 85.423 36.080 4.407919 0.000047 0.001792 \n", + "95091 85.423 36.080 4.289137 0.000030 0.001141 \n", + "95092 85.423 36.080 4.854389 0.000011 0.000424 \n", + "95093 85.423 36.080 4.219200 0.000007 0.000261 \n", + "95094 85.423 36.080 5.663365 0.000007 0.000258 \n", + "\n", + "[95095 rows x 14 columns]\n", + "NDARINVXZRDA6CJ has oix center cix \\\n", + "0 0 [-70.0326, 51.0654, 38.7255] NaN \n", + "1 0 [-66.98963165283203, 50.70511245727539, 35.703... 171347.0 \n", + "2 0 [-67.05046081542969, 46.72609329223633, 38.711... 173895.0 \n", + "3 0 [-67.59457397460938, 48.34980010986328, 36.624... 171337.0 \n", + "4 0 [-66.48811340332031, 48.99663543701172, 38.350... 173051.0 \n", + "... ... ... ... \n", + "141136 140 [-70.91657257080078, 55.608463287353516, 17.84... 156068.0 \n", + "141137 140 [-69.93290710449219, 57.579078674316406, 19.45... 157641.0 \n", + "141138 140 [-69.14832305908203, 58.87629318237305, 20.483... 158435.0 \n", + "141139 140 [-71.13438415527344, 54.380287170410156, 18.75... 156838.0 \n", + "141140 140 [-69.8419189453125, 55.18022918701172, 24.1981... 161564.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[-0.4891, 0.2334, 0.8404], [-0.1626, 0.9222, ... 0.000000 0.000000 \n", + "1 [[-0.5205088899568986, 0.19548334177316726, 0.... -1.783079 2.478372 \n", + "2 [[-0.5207336307599502, 0.18264185265857902, 0.... 2.104476 2.520936 \n", + "3 [[-0.5029163082026582, 0.2834062265144172, 0.8... -2.972169 0.191529 \n", + "4 [[-0.487285238091784, 0.2462559945652736, 0.83... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "141136 [[0.3796483983870911, 0.006004877838023952, 0.... 1.368470 1.713300 \n", + "141137 [[0.32888623874251866, -0.034178508516657574, ... -2.114465 -1.682370 \n", + "141138 [[0.4007778434047783, 0.03628586708352445, 0.9... 1.253506 3.879072 \n", + "141139 [[0.30062204471685183, -0.06241519259190779, 0... -2.716497 -3.846848 \n", + "141140 [[0.3847241321505975, -0.06670768941872009, 0.... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[-0.4891, 0.2334, 0.8404, -70.0326], [-0.1626... -70.0326 \n", + "1 1.448785 [[-0.5205088899568986, 0.19548334177316726, 0.... -70.0326 \n", + "2 2.351961 [[-0.5207336307599502, 0.18264185265857902, 0.... -70.0326 \n", + "3 -3.267025 [[-0.5029163082026582, 0.2834062265144172, 0.8... -70.0326 \n", + "4 -0.716621 [[-0.487285238091784, 0.2462559945652736, 0.83... -70.0326 \n", + "... ... ... ... \n", + "141136 0.585902 [[0.3796483983870911, 0.006004877838023952, 0.... -74.3020 \n", + "141137 2.258948 [[0.32888623874251866, -0.034178508516657574, ... -74.3020 \n", + "141138 0.270795 [[0.4007778434047783, 0.03628586708352445, 0.9... -74.3020 \n", + "141139 3.095022 [[0.30062204471685183, -0.06241519259190779, 0... -74.3020 \n", + "141140 -1.794639 [[0.3847241321505975, -0.06670768941872009, 0.... -74.3020 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 51.0654 38.7255 0.000000 0.000811 0.030820 \n", + "1 51.0654 38.7255 4.303958 0.000032 0.001220 \n", + "2 51.0654 38.7255 5.265256 0.000007 0.000261 \n", + "3 51.0654 38.7255 4.211200 0.000018 0.000703 \n", + "4 51.0654 38.7255 4.121131 0.000092 0.003487 \n", + "... ... ... ... ... ... \n", + "141136 56.9800 20.4580 4.493351 0.000043 0.002091 \n", + "141137 56.9800 20.4580 4.523505 0.000023 0.001131 \n", + "141138 56.9800 20.4580 5.491535 0.000005 0.000239 \n", + "141139 56.9800 20.4580 4.436365 0.000005 0.000265 \n", + "141140 56.9800 20.4580 6.092623 0.000004 0.000176 \n", + "\n", + "[141141 rows x 14 columns]\n", + "NDARINVYKVPYY2M has oix center cix \\\n", + "0 0 [-53.0341, 70.0569, 48.4405] NaN \n", + "1 0 [-49.661903381347656, 69.92536926269531, 45.59... 182816.0 \n", + "2 0 [-50.250423431396484, 65.38700866699219, 48.99... 186436.0 \n", + "3 0 [-50.749298095703125, 67.29743194580078, 46.05... 182805.0 \n", + "4 0 [-50.07480239868164, 66.82832336425781, 47.879... 184621.0 \n", + "... ... ... ... \n", + "137132 136 [-48.43462371826172, 69.59649658203125, 48.302... 185533.0 \n", + "137133 136 [-46.80242156982422, 70.82971954345703, 49.537... 186459.0 \n", + "137134 136 [-45.48686599731445, 72.30079650878906, 50.547... 187372.0 \n", + "137135 136 [-48.602210998535156, 67.90916442871094, 49.38... 186445.0 \n", + "137136 136 [-45.68300247192383, 68.73126983642578, 53.314... 190094.0 \n", + "\n", + " mat yaw pitch \\\n", + "0 [[0.6201, -0.0778, 0.7807], [0.4502, -0.7797, ... 0.000000 0.000000 \n", + "1 [[0.63459891761608, -0.030593679454726286, 0.7... -1.783079 2.478372 \n", + "2 [[0.6304316661711333, -0.018719440761372788, 0... 2.104476 2.520936 \n", + "3 [[0.6486735414028257, -0.1180064713116708, 0.7... -2.972169 0.191529 \n", + "4 [[0.6228135477720997, -0.09027968905793698, 0.... 0.354985 -0.249741 \n", + "... ... ... ... \n", + "137132 [[0.6083791694530556, -0.25471478570658024, 0.... 1.368470 1.713300 \n", + "137133 [[0.5550538402745693, -0.2519396025736635, 0.7... -2.114465 -1.682370 \n", + "137134 [[0.6381954346586415, -0.2456198411002155, 0.7... 1.253506 3.879072 \n", + "137135 [[0.5208751237551087, -0.2547920153632713, 0.8... -2.716497 -3.846848 \n", + "137136 [[0.5656777505643479, -0.3128684376615137, 0.7... 1.850396 -1.724261 \n", + "\n", + " roll matsimnibs origx \\\n", + "0 0.000000 [[0.6201, -0.0778, 0.7807, -53.0341], [0.4502,... -53.0341 \n", + "1 1.448785 [[0.63459891761608, -0.030593679454726286, 0.7... -53.0341 \n", + "2 2.351961 [[0.6304316661711333, -0.018719440761372788, 0... -53.0341 \n", + "3 -3.267025 [[0.6486735414028257, -0.1180064713116708, 0.7... -53.0341 \n", + "4 -0.716621 [[0.6228135477720997, -0.09027968905793698, 0.... -53.0341 \n", + "... ... ... ... \n", + "137132 0.585902 [[0.6083791694530556, -0.25471478570658024, 0.... -50.4989 \n", + "137133 2.258948 [[0.5550538402745693, -0.2519396025736635, 0.7... -50.4989 \n", + "137134 0.270795 [[0.6381954346586415, -0.2456198411002155, 0.7... -50.4989 \n", + "137135 3.095022 [[0.5208751237551087, -0.2547920153632713, 0.8... -50.4989 \n", + "137136 -1.794639 [[0.5656777505643479, -0.3128684376615137, 0.7... -50.4989 \n", + "\n", + " origy origz sdist prob normed_prob \n", + "0 70.0569 48.4405 0.000000 0.000811 0.033136 \n", + "1 70.0569 48.4405 4.414716 0.000028 0.001163 \n", + "2 70.0569 48.4405 5.464535 0.000005 0.000215 \n", + "3 70.0569 48.4405 4.302448 0.000017 0.000686 \n", + "4 70.0569 48.4405 4.415394 0.000067 0.002739 \n", + "... ... ... ... ... ... \n", + "137132 71.0865 51.8830 4.393705 0.000048 0.002113 \n", + "137133 71.0865 51.8830 4.385249 0.000027 0.001194 \n", + "137134 71.0865 51.8830 5.327147 0.000006 0.000270 \n", + "137135 71.0865 51.8830 4.465749 0.000005 0.000232 \n", + "137136 71.0865 51.8830 5.548825 0.000008 0.000352 \n", + "\n", + "[137137 rows x 14 columns]\n" + ] + } + ], + "source": [ + "cmds = []\n", + "for (subject, settings_path) in zip(all_subjects, all_settings):\n", + " settings = pd.read_pickle(settings_path)\n", + " #print(f'{subject} has {settings}')\n", + " if not Path(anat_dir / f'sub-{subject}').exists():\n", + " continue\n", + " if subject in [\"NDARINV1H7JEJW1\",\"NDARINV1285PMCK\"]:#subject failed previos step\n", + " continue\n", + " for oix in sorted(settings.oix.unique()):\n", + " sim_dir = Path(anat_dir / f'sub-{subject}/Simulation/simulation-00')\n", + " if not sim_dir.exists():\n", + " sim_dir = Path(anat_dir / f'sub-{subject}/Simulation/simulation-01')\n", + " if not sim_dir.exists():\n", + " print(f\"{sim_dir} not found, skipping\")\n", + " \n", + " HeadModel_dir = anat_dir / f'sub-{subject}/HeadModel'\n", + " try:\n", + " m2m_dir = sorted(HeadModel_dir.glob('m2m*'))[0]\n", + " except IndexError:\n", + " raise FileNotFoundError(f\"No m2m directory found in {HeadModel_dir}\")\n", + " headmesh_path = m2m_dir / f'{subject}.msh'\n", + " \n", + " uncert_dir = settings_path.parent\n", + " uncert_out = uncert_dir / f'oix-{oix:04d}_stat-abovethreshactprobs_magnE.nii.gz'\n", + " if not uncert_out.exists() or overwrite:\n", + " cmd = [\n", + " 'contarg',\n", + " 'normgrid',\n", + " 'sim-uncert',\n", + " '--headmesh-path',\n", + " headmesh_path.as_posix(),\n", + " '--settings-path',\n", + " settings_path.as_posix(),\n", + " '--ix',\n", + " f'{oix}',\n", + " '--coil-path',\n", + " coil_path.as_posix(),\n", + " '--tmp-dir',\n", + " f'/lscratch/$SLURM_JOB_ID/uncertsim-{oix}',\n", + " '--out-dir',\n", + " settings_path.parent.as_posix(),\n", + " '--njobs',\n", + " f'20',\n", + " '--thresh-type=mt',\n", + " f'--min-thresh={mt_thresh}',\n", + " f'--max-thresh={maxMT}',\n", + " f'--max-mt={maxMT}',\n", + " ]\n", + " cmds.append(' '.join(cmd))" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "8ba4a4a9", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'contarg normgrid sim-uncert --headmesh-path /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1EECRFPM/HeadModel/m2m_NDARINV1EECRFPM/NDARINV1EECRFPM.msh --settings-path /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1EECRFPM/Simulation/simulation-00/uncert1000/settings.pkl.gz --ix 22 --coil-path /vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/simnibs/resources/coil_models/Drakaki_BrainStim_2022/MagVenture_MCF-B65.ccd --tmp-dir /lscratch/$SLURM_JOB_ID/uncertsim-22 --out-dir /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1EECRFPM/Simulation/simulation-00/uncert1000 --njobs 20 --thresh-type=mt --min-thresh=60 --max-thresh=80 --max-mt=80'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cmds[22]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "0ef05c25", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "2659" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(cmds)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "9f035e6b-c51a-4efb-a695-68bff117e5d8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['19610522']\n" + ] + } + ], + "source": [ + "# deal with 1000 job swarm limit\n", + "# Use while loop instead.\n", + "\n", + "if len(cmds) > 0:\n", + " swarm_cmd_file = swarm_cmd_dir / 'uncert_sims'\n", + " swarm_cmd_file.write_text('\\n'.join(cmds[:1000]))\n", + " run_name = 'uncert_sims'\n", + " jobid = ! swarm -f {swarm_cmd_file} -g 100 -t 22 --gres=lscratch:400 --module matlab,freesurfer/6.0,fsl,simnibs/4.0,connectome-workbench,openblas --time 8:00:00 --logdir {swarm_log_dir} --job-name {run_name} --partition norm\n", + " print(jobid)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "1a5edf06-3ff2-434a-a75c-483444a6a713", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['19610544']\n" + ] + } + ], + "source": [ + "if len(cmds) > 1000:\n", + " swarm_cmd_file = swarm_cmd_dir / 'uncert_sims'\n", + " swarm_cmd_file.write_text('\\n'.join(cmds[1000:]))\n", + " run_name = 'uncert_sims'\n", + " jobid = ! swarm -f {swarm_cmd_file} -g 100 -t 22 --gres=lscratch:400 --module matlab,freesurfer/6.0,fsl,simnibs/4.0,connectome-workbench,openblas --time 8:00:00 --logdir {swarm_log_dir} --job-name {run_name} --partition norm\n", + " print(jobid)" + ] + }, + { + "cell_type": "markdown", + "id": "9b57c689-33ae-4bd2-b11c-66b2b18f1e15", + "metadata": {}, + "source": [ + "## Here's code for restarting failues\n", + "For currently unknown reasons, some jobs run slowly and time out. When rerun, those jobs complete without issue." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c5d9f671-ba69-42ab-9846-bb2a560a41d7", + "metadata": {}, + "outputs": [], + "source": [ + "to_restart = [\n", + " cmds[428],\n", + " cmds[209],\n", + " cmds[185],\n", + " cmds[181],\n", + " cmds[137],\n", + " cmds[114],\n", + " cmds[45],\n", + " cmds[41],\n", + " cmds[35],\n", + "]\n", + "to_restart" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cda6f022-8f12-4a8c-8a39-238d142dac5a", + "metadata": {}, + "outputs": [], + "source": [ + "if len(to_restart) > 0:\n", + " swarm_cmd_file = swarm_cmd_dir / 'retart_uncert_sims'\n", + " swarm_cmd_file.write_text('\\n'.join(to_restart))\n", + " run_name = 'restart_uncert_sims'\n", + " jobid = ! swarm -f {swarm_cmd_file} -g 100 -t 22 --gres=lscratch:400 --module matlab,freesurfer/6.0,fsl,simnibs/4.0,connectome-workbench,openblas --time 4:00:00 --logdir {swarm_log_dir} --job-name {run_name} --partition quick,norm\n", + " print(jobid)" + ] + }, + { + "cell_type": "markdown", + "id": "d482d059", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + " # Create surfaces from uncertainty sims" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "48ddce63", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "all_settings = []\n", + "all_subjects = []\n", + "for subject in subjects:\n", + " if not Path(anat_dir / f'sub-{subject}').exists():\n", + " continue\n", + " if subject in [\"NDARINV1H7JEJW1\",\"NDARINV1285PMCK\"]:#subject failed previos step\n", + " continue\n", + " sim_dir = Path(anat_dir / f'sub-{subject}/Simulation/simulation-00')\n", + " if not sim_dir.exists():\n", + " sim_dir = Path(anat_dir / f'sub-{subject}/Simulation/simulation-01')\n", + " if not sim_dir.exists():\n", + " print(f\"{sim_dir} not found, skipping\")\n", + " uncert_dir = sim_dir / f'uncert{nsims}'\n", + " settings_path = uncert_dir / 'settings.pkl.gz'\n", + " all_settings.append(settings_path)\n", + " all_subjects.append(subject)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "510cfd66-0711-4f71-989a-b3a74863804c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "23\n", + "23\n" + ] + } + ], + "source": [ + "print(len(all_settings))\n", + "print(len(all_subjects))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "33df4aba-5b6c-48dd-bdcf-4d649d0bde5e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NDARINV1EECRFPM\n", + "NDARINV52XG9LJ3\n", + "NDARINV6UU2L6YJ\n", + "NDARINV7BTZH7L2\n", + "NDARINV7TV9UT40\n", + "NDARINV85UUUHN0\n", + "NDARINVC25XBH2T\n", + "NDARINVCVZ70012\n", + "NDARINVD5FWJDCY\n", + "NDARINVFPFM6B57\n", + "NDARINVG8VWC1TN\n", + "NDARINVGH5DHURH\n", + "NDARINVLMU4CC2J\n", + "NDARINVN394NEWK\n", + "NDARINVP9Y862GP\n", + "NDARINVPE5JBKJ3\n", + "NDARINVRZL7PGK1\n", + "NDARINVV104HFJY\n", + "NDARINVWFN7K4C5\n", + "NDARINVWP2U8M5Y\n", + "NDARINVX7KKFJ5E\n", + "NDARINVXZRDA6CJ\n", + "NDARINVYKVPYY2M\n" + ] + } + ], + "source": [ + "for (subject, settings_path) in zip(all_subjects, all_settings):\n", + " print(subject)\n", + " if not Path(anat_dir / f'sub-{subject}').exists():\n", + " continue\n", + " if subject in [\"NDARINV1H7JEJW1\",\"NDARINV1285PMCK\"]:#subject failed previos step\n", + " continue\n", + " outfile = f'/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-{subject}/Simulation/simulation-00/uncert1000/sub-{subject}_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'\n", + " #print(Path(outfile))\n", + " if Path(outfile).is_file():\n", + " print('this exists')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "2d2b89b2", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 70.6 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 69.3 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 56.5 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 49.4 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 49.5 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 37.5 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 31.7 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 33.3 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 27.2 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 29.5 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 31.0 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 23.8 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 57.1 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 59.2 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 42.6 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 68.0 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 66.3 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 52.8 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 44.3 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 43.5 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 32.8 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0058_stat-mean_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0093_stat-mean_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0132_stat-mean_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0133_stat-mean_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-mean_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0058_stat-mean_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-mean_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0093_stat-mean_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-mean_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0132_stat-mean_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-mean_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0133_stat-mean_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 62.8 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0058_stat-std_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0093_stat-std_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0132_stat-std_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0133_stat-std_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-std_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0058_stat-std_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-std_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0093_stat-std_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-std_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0132_stat-std_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-std_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0133_stat-std_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 59.0 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0058_stat-abovethreshactprobs_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0093_stat-abovethreshactprobs_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0132_stat-abovethreshactprobs_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m Dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0133_stat-abovethreshactprobs_magnE.nii.gz grid differs from first one!\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-abovethreshactprobs_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0058_stat-abovethreshactprobs_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-abovethreshactprobs_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0093_stat-abovethreshactprobs_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-abovethreshactprobs_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0132_stat-abovethreshactprobs_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0000_stat-abovethreshactprobs_magnE.nii.gz grid mismatch with /vf/users/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVCVZ70012/Simulation/simulation-00/uncert1000/oix-0133_stat-abovethreshactprobs_magnE.nii.gz\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 45.4 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 70.1 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 74.6 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 55.3 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 39.4 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 38.6 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 32.5 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 51.1 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 52.6 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 40.5 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 45.0 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 46.9 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 36.4 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 40.4 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 41.5 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 32.0 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 45.0 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 45.0 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 38.0 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 57.7 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 56.4 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 48.1 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 52.2 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 50.8 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 39.4 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 52.8 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 52.7 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 40.3 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 36.1 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 36.1 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 27.8 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 26.2 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 25.7 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 20.7 s\n", + "++ 3dTcat: AFNI version=AFNI_24.0.07 (Feb 15 2024) [64-bit]\n", + "\u001b[7m** FATAL ERROR:\u001b[0m Can't open dataset /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVWP2U8M5Y/Simulation/simulation-00/uncert1000/*mean_magnE.nii.gz\n", + "** Program compile date = Feb 15 2024\n" + ] + }, + { + "ename": "CalledProcessError", + "evalue": "Command '['3dTcat', '-overwrite', '-prefix', PosixPath('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVWP2U8M5Y/Simulation/simulation-00/uncert1000/sub-NDARINVWP2U8M5Y_desc-magnEmean_stat.nii.gz'), '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVWP2U8M5Y/Simulation/simulation-00/uncert1000/*mean_magnE.nii.gz']' returned non-zero exit status 1.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mCalledProcessError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[12], line 21\u001b[0m\n\u001b[1;32m 18\u001b[0m uncert_dir \u001b[38;5;241m=\u001b[39m settings_path\u001b[38;5;241m.\u001b[39mparent\n\u001b[1;32m 19\u001b[0m jobs\u001b[38;5;241m.\u001b[39mappend(delayed(make_uncert_surfaces)(subject, Path(fmriprepanat), uncert_dir, overwrite\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m, fmriprep\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[1;32m 20\u001b[0m anat_dir\u001b[38;5;241m=\u001b[39mPath(fmriprepanat)))\n\u001b[0;32m---> 21\u001b[0m \u001b[43mmake_uncert_surfaces\u001b[49m\u001b[43m(\u001b[49m\u001b[43msubject\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mPath\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfmriprepanat\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43muncert_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moverwrite\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfmriprep\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 22\u001b[0m \u001b[43m \u001b[49m\u001b[43mlayout\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbidslayout\u001b[49m\u001b[43m,\u001b[49m\u001b[43manat_dir\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mPath\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfmriprepanat\u001b[49m\u001b[43m)\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/vf/users/ENIGMA-MDD/code/contarg/contarg/normgrid.py:1432\u001b[0m, in \u001b[0;36mmake_uncert_surfaces\u001b[0;34m(subject, src_surf_dir, uncert_dir, overwrite, fmriprep, layout, anat_dir)\u001b[0m\n\u001b[1;32m 1424\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m catted_means\u001b[38;5;241m.\u001b[39mexists() \u001b[38;5;129;01mor\u001b[39;00m overwrite:\n\u001b[1;32m 1425\u001b[0m cmd \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 1426\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m3dTcat\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 1427\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m-overwrite\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1430\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00muncert_dir\u001b[38;5;241m.\u001b[39mas_posix()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/*mean_magnE.nii.gz\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1431\u001b[0m ]\n\u001b[0;32m-> 1432\u001b[0m \u001b[43msubprocess\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcmd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcheck\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 1434\u001b[0m catted_stds \u001b[38;5;241m=\u001b[39m uncert_dir \u001b[38;5;241m/\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msub-\u001b[39m\u001b[38;5;132;01m{\u001b[39;00msubject\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m_desc-magnEstd_stat.nii.gz\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1435\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m catted_stds\u001b[38;5;241m.\u001b[39mexists() \u001b[38;5;129;01mor\u001b[39;00m overwrite:\n", + "File \u001b[0;32m/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/subprocess.py:528\u001b[0m, in \u001b[0;36mrun\u001b[0;34m(input, capture_output, timeout, check, *popenargs, **kwargs)\u001b[0m\n\u001b[1;32m 526\u001b[0m retcode \u001b[38;5;241m=\u001b[39m process\u001b[38;5;241m.\u001b[39mpoll()\n\u001b[1;32m 527\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m check \u001b[38;5;129;01mand\u001b[39;00m retcode:\n\u001b[0;32m--> 528\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m CalledProcessError(retcode, process\u001b[38;5;241m.\u001b[39margs,\n\u001b[1;32m 529\u001b[0m output\u001b[38;5;241m=\u001b[39mstdout, stderr\u001b[38;5;241m=\u001b[39mstderr)\n\u001b[1;32m 530\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m CompletedProcess(process\u001b[38;5;241m.\u001b[39margs, retcode, stdout, stderr)\n", + "\u001b[0;31mCalledProcessError\u001b[0m: Command '['3dTcat', '-overwrite', '-prefix', PosixPath('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVWP2U8M5Y/Simulation/simulation-00/uncert1000/sub-NDARINVWP2U8M5Y_desc-magnEmean_stat.nii.gz'), '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVWP2U8M5Y/Simulation/simulation-00/uncert1000/*mean_magnE.nii.gz']' returned non-zero exit status 1." + ] + } + ], + "source": [ + "\n", + "jobs = []\n", + "for (subject, settings_path) in zip(all_subjects, all_settings):\n", + " if not Path(anat_dir / f'sub-{subject}').exists():\n", + " continue\n", + " if subject in [\"NDARINV1H7JEJW1\",\"NDARINV1285PMCK\"]:#subject failed previos step\n", + " continue\n", + " outfile = f'/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-{subject}/Simulation/simulation-00/uncert1000/sub-{subject}_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'\n", + " if Path(outfile).exists():\n", + " continue\n", + " filesT1w = bidslayout.get(subject=subject,\n", + " #session=session,\n", + " extension=\".nii.gz\",\n", + " suffix=\"T1w\",\n", + " desc=\"preproc\",\n", + " space=None)\n", + " fmriprepanat = filesT1w[0].dirname\n", + " #src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k/'\n", + " uncert_dir = settings_path.parent\n", + " jobs.append(delayed(make_uncert_surfaces)(subject, Path(fmriprepanat), uncert_dir, overwrite=True, fmriprep=True,\n", + " anat_dir=Path(fmriprepanat)))\n", + " print(subject)\n", + " make_uncert_surfaces(subject, Path(fmriprepanat), uncert_dir, overwrite=True, fmriprep=True,\n", + " layout=bidslayout,anat_dir=Path(fmriprepanat))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "11427a3e-6e25-4e81-ab27-da3f594a6963", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVWP2U8M5Y/Simulation/simulation-00/uncert1000\n" + ] + } + ], + "source": [ + "print(uncert_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "cfd9b913", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "#Parallel(n_jobs=10, verbose=10)(jobs)#PArallel not working with bidslayout. I'll just for loop.\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "f7a03ef7-64be-4f5d-86f0-bce215da0d7d", + "metadata": {}, + "source": [ + "# Run repdist clustering on time series so we can get stats for each position\n", + "\n", + "This can be run in parallel with the gyral lip and uncertainty simulations above " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "945f7717-4510-470a-9e21-1471ea791e91", + "metadata": {}, + "outputs": [], + "source": [ + "layout = '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/layout'\n", + "#bidslayout.save('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/layout')\n", + "#layout2 = bids.BIDSLayout( database_path=layout)\n", + "#layout2.files" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e44bf5c2-e36a-418f-bc0d-3ab00d429344", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "NDARINV1285PMCK\n", + "NDARINV1EECRFPM\n", + "NDARINV1EZ26N40\n", + "NDARINV1H7JEJW1\n", + "NDARINV2484CB0H\n", + "NDARINV2BW6G83G\n", + "NDARINV52XG9LJ3\n", + "NDARINV6UU2L6YJ\n", + "NDARINV7A5RDHVW\n", + "NDARINV7BTZH7L2\n", + "NDARINV7TV9UT40\n", + "NDARINV85UUUHN0\n", + "NDARINVC25XBH2T\n", + "NDARINVCVZ70012\n", + "NDARINVD5FWJDCY\n", + "NDARINVEN1P5RFL\n", + "NDARINVFPFM6B57\n", + "NDARINVG8VWC1TN\n", + "NDARINVGH5DHURH\n", + "NDARINVLMU4CC2J\n", + "NDARINVN394NEWK\n", + "NDARINVP9Y862GP\n", + "NDARINVPE5JBKJ3\n", + "NDARINVRZL7PGK1\n", + "NDARINVU3CF21GV\n", + "NDARINVU7WWPJ0M\n", + "NDARINVV104HFJY\n", + "NDARINVWFN7K4C5\n", + "NDARINVWP2U8M5Y\n", + "NDARINVX7KKFJ5E\n", + "NDARINVXTMW4PWB\n", + "NDARINVXZRDA6CJ\n", + "NDARINVYKVPYY2M\n" + ] + } + ], + "source": [ + "jobs = []\n", + "clusts = []\n", + "outdir = Path('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/')\n", + "smoothings = ['2.55']\n", + "for subj in subjects: \n", + " print(subj)\n", + " for session in bidslayout.get_sessions(subject=subj):\n", + " for smoothing in smoothings:\n", + " subj_func_outdir = outdir / f'func_preproc/sub-{subj}/'\n", + " ses_func_outdir = subj_func_outdir / f'ses-{session}'\n", + " clust_outdir = ses_func_outdir / 'cluster'\n", + " #lrest_dir = liston_root / f'sub-{subject}/func/rest'\n", + " #concat_nii = lrest_dir / f'session_{session}/concatenated/Rest_session-{session}_OCME+MEICA+MGTR_Concatenated+SubcortRegression+SpatialSmoothing{smoothing}.dtseries.nii'\n", + " #src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k'\n", + " filesT1w = bidslayout.get(subject=subj,\n", + " #session=session,\n", + " extension=\".nii.gz\",\n", + " suffix=\"T1w\",\n", + " desc=\"preproc\",\n", + " space=None)\n", + " fmriprepanat = filesT1w[0].dirname\n", + " list_nii = bidslayout.get(subject=subj,\n", + " session=session,\n", + " #run='all',\n", + " extension=\".dtseries.nii\",\n", + " suffix=\"bold\",\n", + " desc=\"AROMA\",\n", + " #acquisition=\"MBSE\",\n", + " #space=\"fsLR\",\n", + " regex_search=True,\n", + " invalid_filters=\"allow\",\n", + " return_type='filename')\n", + " concat_nii = [l for l in list_nii if \"all\" in l]\n", + " if len(concat_nii) == 0:\n", + " continue\n", + " #print(concat_nii)\n", + " #run_clusters(\n", + " # subj,\n", + " # Path(concat_nii[0]),\n", + " # clust_outdir,\n", + " # Path(fmriprepanat),\n", + " # surf_source='fmriprep',\n", + " # out_prefix=f'sub-{subj}_ses-{session}_smoothing-{smoothing}_',\n", + " # overwrite=True,\n", + " # layout=bidslayout,\n", + " # anat_dir=Path(fmriprepanat)\n", + " #)\n", + " jobs.append(delayed(run_clusters)(\n", + " subj,\n", + " Path(concat_nii[0]),\n", + " clust_outdir,\n", + " Path(fmriprepanat),\n", + " surf_source='fmriprep',\n", + " out_prefix=f'sub-{subj}_ses-{session}_smoothing-{smoothing}_',\n", + " overwrite=True,\n", + " layout=layout,\n", + " anat_dir=Path(fmriprepanat)\n", + " ))\n", + " clusts.append(dict(\n", + " subject = subj,\n", + " session = session,\n", + " smoothing = smoothing\n", + " ))\n", + "\n", + "\n", + "#subject, concat_nii, clust_outdir, src_surf_dir,\n", + "# surf_source='liston',\n", + "# maxrepdist=0.2,\n", + "# medial_wall=None,\n", + "# refroi='bilateralfullSGCsphere',\n", + "# stimroi='expandedcoleBA46',\n", + "# out_prefix='',\n", + "# layout=None,\n", + "# anat_dir=None,\n", + "# overwrite=False" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5b9cba6c-0a5b-4c5a-b5f8-243ea35e9f32", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=20)]: Using backend LokyBackend with 20 concurrent workers.\n", + "/vf/users/ENIGMA-MDD/code/contarg/contarg/clustering.py:112: UserWarning: the number of connected components of the connectivity matrix is 2 > 1. Completing it to avoid stopping the tree early.\n", + " connectivity, n_connected_components = _fix_connectivity(X_for_connected_components, connectivity, affinity='euclidean')\n", + "[Parallel(n_jobs=20)]: Done 2 out of 29 | elapsed: 21.9min remaining: 295.6min\n", + "[Parallel(n_jobs=20)]: Done 5 out of 29 | elapsed: 25.6min remaining: 123.1min\n", + "[Parallel(n_jobs=20)]: Done 8 out of 29 | elapsed: 26.3min remaining: 69.1min\n", + "[Parallel(n_jobs=20)]: Done 11 out of 29 | elapsed: 27.1min remaining: 44.3min\n", + "[Parallel(n_jobs=20)]: Done 14 out of 29 | elapsed: 28.3min remaining: 30.3min\n", + "[Parallel(n_jobs=20)]: Done 17 out of 29 | elapsed: 36.6min remaining: 25.9min\n", + "[Parallel(n_jobs=20)]: Done 20 out of 29 | elapsed: 40.3min remaining: 18.2min\n", + "[Parallel(n_jobs=20)]: Done 23 out of 29 | elapsed: 44.6min remaining: 11.6min\n", + "[Parallel(n_jobs=20)]: Done 26 out of 29 | elapsed: 49.4min remaining: 5.7min\n", + "[Parallel(n_jobs=20)]: Done 29 out of 29 | elapsed: 52.8min finished\n" + ] + } + ], + "source": [ + "clustreses = Parallel(n_jobs=20, verbose=10)(jobs)\n", + "# Parallel won't work with pybids.\n", + "# One solution is to save and load in the functions... need more time to implement." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a6e4cddc-49da-4022-92ba-a965f844aeb1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/03_fmriprep_generate_and_evaluate_targets.ipynb b/notebooks/03_fmriprep_generate_and_evaluate_targets.ipynb new file mode 100644 index 0000000..c8813bd --- /dev/null +++ b/notebooks/03_fmriprep_generate_and_evaluate_targets.ipynb @@ -0,0 +1,9596 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "bdbb4d11-94fa-4ee3-9665-4b4ad94a4e7d", + "metadata": {}, + "source": [ + "# import things" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "4c4380f0-b1c7-4175-a513-60235566c327", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# from pkg_resources import resource_filename\n", + "from pathlib import Path\n", + "import pandas as pd\n", + "import numpy as np\n", + "import nibabel as nb\n", + "from nibabel import cifti2 as ci\n", + "from contarg.normgrid import load_liston_surfs, Surface, load_surfaces \n", + "from contarg.stimgrid import run_opt_and_save_outputs\n", + "from contarg.utils import graph_from_triangles, get_stimroi_path, surf_data_from_cifti, load_timeseries, SurfROI, cross_spearman, replace_cifti_data\n", + "# from contarg.utils import get_stimroi_path, get_refroi_path, graph_from_triangles, , new_cifti_like, surf_data_from_cifti, cross_spearman, load_timeseries, find_bids_files, add_censor_columns, select_confounds, make_rel_symlink\n", + "from scipy import stats\n", + "from scipy.spatial.distance import pdist, cdist\n", + "from statsmodels.stats import weightstats\n", + "from matplotlib import pyplot as plt\n", + "import seaborn as sns\n", + "import networkx as nx\n", + "from simnibs import opt_struct\n", + "from simnibs.utils.nnav import brainsight\n", + "from joblib import Parallel, delayed\n", + "import templateflow\n", + "import subprocess\n", + "from contarg.normgrid import get_prob_vine, setup_uncert_sims\n", + "# from contarg.utils import new_cifti_like\n", + "from contarg.stimgrid import angle_between\n", + "import bids\n", + "\n", + "%matplotlib inline\n", + "\n", + "# from sklearn.cluster import AgglomerativeClustering\n", + "\n", + "pd.set_option(\"display.max_rows\", 200)\n", + "pd.set_option(\"display.max_columns\", 200)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2f675f35-3685-4814-8701-c4ce1dfb7ae6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "maxMT=80\n", + "distancetoscalp=2\n", + "uncert_n = 1000\n", + "min_mt_thresh = 50\n", + "smoothing=5\n", + "#subjects = ['24563', '24573', '24704', '24718', '24740', '24742', '24546']\n", + "subjects = []\n", + "pairwise_sig_thresh=0.1\n", + "outdir = Path('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2')\n", + "#liston_root = Path('/data/EDB/TMSpilot/liston')\n", + "stimroi=\"expandedcoleBA46\"\n", + "\n", + "acceptable_zangle = [(45,135), (225, 315)]\n", + "\n", + "anat_dir = outdir / 'anat_preproc'\n", + "func_dir = outdir / 'func_preproc'\n", + "fmriprep_root = Path('/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/')\n", + "bidslayout = bids.BIDSLayout(fmriprep_root,validate=False)\n", + "if len(subjects) < 1:\n", + " subjects = bidslayout.get_subjects()" + ] + }, + { + "cell_type": "markdown", + "id": "2619ef70-43ba-412a-bd01-fa700bc98483", + "metadata": {}, + "source": [ + "```\n", + "for each subject \n", + " load surfaces \n", + " load mean map \n", + " load std map\n", + " load pos_list\n", + " convert maps to Pct motor threshold \n", + " get set of above threshold vertices for each position \n", + " for each session \n", + " load time series \n", + " load functional clusters \n", + " (eventually, load personalized network assignments) \n", + " for each position \n", + " get connectivities\n", + "``` \n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "35995517-9123-48f3-bd25-6d58fb26d281", + "metadata": {}, + "source": [ + "# Find Comprehensive targets" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6f355878-b144-441f-bf43-2258dfe967fc", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "pl_cols = [\n", + " 'cx', 'cy', 'cz',\n", + " 'nx', 'ny', 'nz', \n", + " 'bx', 'by', 'bz', \n", + " 'bxv', 'byv', 'bzv','z_angle',\n", + " 's_idx', 's_x', 's_y', 's_z',\n", + " ]" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "ea888fd5-17d5-431d-8dfc-3c93b97be7f0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1285PMCK/Simulation/simulation-00/uncert1000\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINV1EZ26N40\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1H7JEJW1/Simulation\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINV2484CB0H\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINV2BW6G83G\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINV7A5RDHVW\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/vf/users/ENIGMA-MDD/code/contarg/contarg/utils.py:1113: RuntimeWarning: divide by zero encountered in divide\n", + " ts = rs * np.sqrt((n - 2) / ((rs + 1.0) * (1.0 - rs)))\n", + "/tmp/ipykernel_2407754/3079377499.py:236: RuntimeWarning: divide by zero encountered in arctanh\n", + " vert_rep_zs = np.arctanh(vert_rep_corr)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/statsmodels/stats/weightstats.py:140: RuntimeWarning: invalid value encountered in subtract\n", + " return self.data - self.mean\n", + "/tmp/ipykernel_2407754/3079377499.py:246: RuntimeWarning: divide by zero encountered in divide\n", + " ts = rs * np.sqrt((n - 2) / ((rs + 1.0) * (1.0 - rs)))\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in arctanh\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/statsmodels/stats/weightstats.py:140: RuntimeWarning: invalid value encountered in subtract\n", + " return self.data - self.mean\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in arctanh\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/statsmodels/stats/weightstats.py:140: RuntimeWarning: invalid value encountered in subtract\n", + " return self.data - self.mean\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in arctanh\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/statsmodels/stats/weightstats.py:140: RuntimeWarning: invalid value encountered in subtract\n", + " return self.data - self.mean\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in arctanh\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in arctanh\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/statsmodels/stats/weightstats.py:140: RuntimeWarning: invalid value encountered in subtract\n", + " return self.data - self.mean\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in arctanh\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/statsmodels/stats/weightstats.py:140: RuntimeWarning: invalid value encountered in subtract\n", + " return self.data - self.mean\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in arctanh\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/statsmodels/stats/weightstats.py:140: RuntimeWarning: invalid value encountered in subtract\n", + " return self.data - self.mean\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in arctanh\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/statsmodels/stats/weightstats.py:140: RuntimeWarning: invalid value encountered in subtract\n", + " return self.data - self.mean\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINVEN1P5RFL\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINVU3CF21GV\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINVU7WWPJ0M\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/vf/users/ENIGMA-MDD/code/contarg/contarg/utils.py:1113: RuntimeWarning: divide by zero encountered in divide\n", + " ts = rs * np.sqrt((n - 2) / ((rs + 1.0) * (1.0 - rs)))\n", + "/tmp/ipykernel_2407754/3079377499.py:236: RuntimeWarning: divide by zero encountered in arctanh\n", + " vert_rep_zs = np.arctanh(vert_rep_corr)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/statsmodels/stats/weightstats.py:140: RuntimeWarning: invalid value encountered in subtract\n", + " return self.data - self.mean\n", + "/tmp/ipykernel_2407754/3079377499.py:246: RuntimeWarning: divide by zero encountered in divide\n", + " ts = rs * np.sqrt((n - 2) / ((rs + 1.0) * (1.0 - rs)))\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/pandas/core/arraylike.py:399: RuntimeWarning: divide by zero encountered in arctanh\n", + " result = getattr(ufunc, method)(*inputs, **kwargs)\n", + "/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/statsmodels/stats/weightstats.py:140: RuntimeWarning: invalid value encountered in subtract\n", + " return self.data - self.mean\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVWP2U8M5Y/Simulation/simulation-00/uncert1000/sub-NDARINVWP2U8M5Y_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVX7KKFJ5E/Simulation/simulation-00/uncert1000/sub-NDARINVX7KKFJ5E_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINVXTMW4PWB\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVXZRDA6CJ/Simulation/simulation-00/uncert1000/sub-NDARINVXZRDA6CJ_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINVYKVPYY2M/Simulation/simulation-00/uncert1000/sub-NDARINVYKVPYY2M_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii\n" + ] + } + ], + "source": [ + "stim_stats = []\n", + "min_mt = []\n", + "for subject in subjects:\n", + " for session in bidslayout.get_sessions(subject=subject):\n", + " #print(session)\n", + " if not Path(anat_dir / f'sub-{subject}').exists():\n", + " print(f'file not found: {anat_dir}/{subject}')\n", + " continue\n", + " filesT1w = bidslayout.get(subject=subject,\n", + " session=session,\n", + " extension=\".nii.gz\",\n", + " suffix=\"T1w\",\n", + " desc=\"preproc\",\n", + " space=None)\n", + " \n", + " ##\n", + " #src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k/'\n", + " fmriprepanat = filesT1w[0].dirname\n", + " fmriprepanat = Path(fmriprepanat)\n", + " headmodel_dir = anat_dir /f'sub-{subject}/HeadModel'\n", + " sim_out_dir = anat_dir / f'sub-{subject}/Simulation'\n", + " if len(sorted(sim_out_dir.glob('simulation-*'))) < 1:\n", + " print(f'file not found: {sim_out_dir}')\n", + " continue\n", + " sim_dir = sorted(sim_out_dir.glob('simulation-*'))[-1]\n", + " \n", + " uncert_dir = sim_dir / f'uncert{uncert_n}'\n", + " if not uncert_dir.exists():\n", + " #raise FileNotFoundError(uncert_dir)\n", + " # insteado of throwing an erro let's just skip\n", + " print(f'file not found: {uncert_dir}')\n", + " continue\n", + " surfaces = load_surfaces(subject, bidslayout, fmriprepanat)\n", + "\n", + " scalp_path = headmodel_dir / f'm2m_{subject}/Skin.surf.gii'\n", + " scalp_points, scalp_triangles = nb.load(scalp_path).agg_data()\n", + " scalp_G = graph_from_triangles(scalp_triangles)\n", + " scalp = Surface(scalp_path, scalp_points, scalp_triangles, scalp_G, np.arange(len(scalp_points)).astype(int))\n", + " \n", + " stimroi_mask = get_stimroi_path(stimroi, cifti=True)\n", + " stim_roi = SurfROI(surfaces.l.midthickness.path, 'left', roi=stimroi_mask)\n", + " # load mean map\n", + " magne_path = uncert_dir / f'sub-{subject}_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii'\n", + " if not magne_path.exists():\n", + " #raise FileNotFoundError(uncert_dir)\n", + " # insteado of throwing an erro let's just skip\n", + " print(f'file not found: {magne_path}')\n", + " continue\n", + " magne_img = ci.load(magne_path)\n", + " all_magne = magne_img.get_fdata()\n", + " l_magne = surf_data_from_cifti(all_magne, magne_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + " all_magne = all_magne.T\n", + " l_mt = (l_magne / all_magne.max(0)) * maxMT\n", + " l_percentile = np.argsort(np.argsort(l_magne, axis=None), axis=None).reshape(l_magne.shape)\n", + " l_percentile = (l_percentile / (np.product(l_magne.shape) - 1)) * 100\n", + " \n", + " #load std map\n", + " std_path = uncert_dir / f'sub-{subject}_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii'\n", + " std_img = ci.load(std_path)\n", + " all_std = std_img.get_fdata()\n", + " l_std = surf_data_from_cifti(all_std, std_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + " all_std = all_std.T\n", + " l_mt_std = (l_std / all_magne.max(0)) * maxMT\n", + " \n", + " #load prob map\n", + " ap_path = uncert_dir / f'sub-{subject}_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'\n", + " ap_img = ci.load(ap_path)\n", + " all_ap = ap_img.get_fdata()\n", + " l_ap = surf_data_from_cifti(all_ap, ap_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + " all_ap = all_ap.T\n", + " \n", + " # load va map\n", + " # Create va map from fmriprep outputs\n", + " #va_path = src_surf_dir / f'sub-{subject}.midthickness_va.32k_fs_LR.dscalar.nii'\n", + " if not Path(fmriprepanat / f'sub-{subject}.midthickness_va.32k_fs_LR.dscalar.nii').exists():\n", + " va_imgs = []\n", + " for hemi in ['L','R']:\n", + " Surf = bidslayout.get(subject=subject,\n", + " session=session,\n", + " extension=\".surf.gii\",\n", + " suffix=\"midthickness\",\n", + " hemi=hemi,\n", + " #desc=\"preproc\",\n", + " space=None)\n", + " Surf = Surf[0].path\n", + " metric = Surf.replace('midthickness','midthickness_va')\n", + " metric = metric.replace('surf.gii','shape.gii')\n", + " Sphere = bidslayout.get(subject=subject,\n", + " session=session,\n", + " extension=\".surf.gii\",\n", + " suffix=\"sphere\",\n", + " hemi=hemi,\n", + " desc=None,\n", + " space=None)\n", + " TargetSphere = bidslayout.get(subject=subject,\n", + " session=session,\n", + " extension=\".surf.gii\",\n", + " suffix=\"sphere\",\n", + " hemi=hemi,\n", + " desc=\"msmsulc\",\n", + " space='fsLR')\n", + " \n", + " cmds1 = ['wb_command',\n", + " '-surface-vertex-areas',\n", + " Surf,\n", + " metric ]\n", + " \n", + " va_pathgii = metric.replace(f'_hemi-{hemi}_midthickness',f'_hemi-{hemi}_space-fsLR_desc-msmsulc')\n", + " subprocess.run(cmds1)\n", + " \n", + " cmds2 = ['wb_command',\n", + " '-metric-resample',\n", + " metric,\n", + " Sphere[0].path,\n", + " TargetSphere[0].path,\n", + " 'BARYCENTRIC',\n", + " va_pathgii]\n", + " subprocess.run(cmds2)\n", + " # convert metric to nifti\n", + " #va_path = va_pathgii.replace('surf.gii','metric.nii')\n", + " #cmds3 = ['wb_command', \n", + " # '-metric-convert',\n", + " # '-to-nifti',\n", + " # va_pathgii,\n", + " # va_path ]\n", + " #subprocess.run(cmds3) \n", + " va_imgs = va_imgs + [va_pathgii]\n", + " #va_img = nb.load(va_path)\n", + " #print(va_img.get_fdata().shape)\n", + " va_path2 = va_pathgii.replace(f'hemi-{hemi}','hemi-LR')\n", + " va_path2 = va_path2.replace('shape.gii','dscalar.nii')\n", + " cmds4 = ['wb_command',\n", + " '-cifti-create-dense-scalar',\n", + " '-left-metric',\n", + " va_imgs[0],\n", + " '-right-metric',\n", + " va_imgs[1],\n", + " va_path2]\n", + " subprocess.run(cmds4)\n", + " va_path = va_path2\n", + " va_img = ci.load(va_path)\n", + " all_va = va_img.get_fdata()\n", + " l_va = surf_data_from_cifti(all_va, va_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + " \n", + " # find vals significantly above minimum\n", + " zvals = np.zeros(l_mt.shape)\n", + " zvals[l_mt != 0] = (l_mt[l_mt != 0] - min_mt_thresh) / l_mt_std[l_mt != 0]\n", + " # zdist = stats.norm()\n", + " # pvals = zdist.sf(zvals)\n", + " # sigs = pvals < 0.5\n", + " sigs = l_ap > 0\n", + " \n", + " zvals = zvals.T\n", + " sigs = sigs.T\n", + " \n", + " pos_list = pd.read_pickle(sim_dir / f'sub-{subject}_simulations.pkl.gz')\n", + " \n", + " # find ids for everything significantly above minimum\n", + " pos_iidxs = []\n", + " for (pos_ix, zval, sig) in zip(pos_list.pos_ix.values, zvals, sigs):\n", + " pos_mt = l_mt[:, pos_ix]\n", + " pos_mt_std = l_mt_std[:, pos_ix]\n", + " pos_ap = l_ap[:, pos_ix]\n", + " \n", + " vert = sig.nonzero()[0]\n", + " \n", + " rows = [dict(idx=ivert,\n", + " pos_ix=pos_ix,\n", + " actprob=iap,\n", + " magne=imagne,\n", + " std=istd,\n", + " percentile=ipct,\n", + " motor_threshold=imt,\n", + " motor_threshold_std=imtstd,\n", + " mt_zval=izval,\n", + " vertex_area=iva\n", + " )\n", + " for ivert, iap, imagne,istd, ipct, imt, imtstd, izval, iva\n", + " in zip(\n", + " vert,\n", + " pos_ap[vert],\n", + " l_magne[vert, pos_ix],\n", + " l_std[vert, pos_ix],\n", + " l_percentile[vert, pos_ix],\n", + " pos_mt[vert],\n", + " pos_mt_std[vert],\n", + " zval[vert],\n", + " l_va[vert, 0]\n", + " )]\n", + " pos_iidxs.extend(rows)\n", + " pos_iidxs = pd.DataFrame(pos_iidxs)\n", + " pos_iidxs['in_stim'] = pos_iidxs.idx.isin(stim_roi.idxs)\n", + " minmt_row = dict(\n", + " subject=subject,\n", + " min_mt=pos_iidxs.motor_threshold.min()\n", + " )\n", + " min_mt.append(minmt_row)\n", + " t = min_mt_thresh\n", + " m = -0.9 / (t - 80)\n", + " b = 1 - (m * 80)\n", + " 80 * m + b\n", + " pos_iidxs['mt_weight'] = pos_iidxs.motor_threshold * m + b\n", + " pos_iidxs['weighted_in_stim'] = pos_iidxs.in_stim * pos_iidxs.actprob\n", + " iidxs = pos_iidxs.loc[:, ['idx']].drop_duplicates().reset_index(drop=True)\n", + " \n", + " for smoothing in [2.55]:\n", + " # I've only run with this smoothing. MAy need to change...\n", + " # load functional data\n", + " #lrest_dir = liston_root / f'sub-{subject}/func/rest'\n", + " #concat_nii = lrest_dir / f'session_{session}/concatenated/Rest_session-{session}_OCME+MEICA+MGTR_Concatenated+SubcortRegression+SpatialSmoothing{smoothing}.dtseries.nii'\n", + " func = bidslayout.get(subject=subject,\n", + " session=session,\n", + " extension=\".dtseries.nii\",\n", + " suffix=\"bold\",\n", + " #hemi=hemi,\n", + " #run = None,\n", + " desc='AROMA',\n", + " space='fsLR',\n", + " regex_search=True,\n", + " invalid_filters=\"allow\",\n", + " return_type='filename')\n", + " concat_nii = [l for l in func if \"all\" in l]\n", + " timeseries = concat_nii\n", + " lts_data, rts_data, ts_data = load_timeseries(timeseries)\n", + " clust_dir = func_dir / f'sub-{subject}/ses-{session}/cluster'\n", + " dstim_clusters = pd.read_pickle(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_dstimclusters.pkl.gz')\n", + " dstim_verts = pd.read_pickle(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_dstimverts.pkl.gz')\n", + " ref_clusters = pd.read_pickle(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_refclusters.pkl.gz')\n", + " ref_repts = np.load(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_refrepts.npz.npy')\n", + " ref_ts = np.load(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_refts.npz.npy')\n", + " \n", + " \n", + " # get vertex wise correlations for intensity eval\n", + " vert_rep_corr, _, _ = cross_spearman(lts_data[iidxs.idx.values], np.array(list(ref_clusters.repts.values)),\n", + " alpha=pairwise_sig_thresh, method='fdr_bh')\n", + " vert_rep_zs = np.arctanh(vert_rep_corr)\n", + " vert_rep_ds = weightstats.DescrStatsW(vert_rep_zs.T, weights=ref_clusters.nvert.values)\n", + " vert_rep_mean = np.tanh(vert_rep_ds.mean)\n", + " vert_rep_t, vert_rep_p = vert_rep_ds.ztest_mean()\n", + " iidxs['vert_rep_mean'] = vert_rep_mean\n", + " iidxs['vert_rep_avet'] = vert_rep_t\n", + " iidxs['vert_rep_avep'] = vert_rep_p\n", + " \n", + " n = ref_repts.shape[1]\n", + " rs = vert_rep_mean\n", + " ts = rs * np.sqrt((n - 2) / ((rs + 1.0) * (1.0 - rs)))\n", + " iidxs['vert_rep_rp'] = stats.t.sf(np.abs(ts), n - 2) * 2\n", + " \n", + " # get cluster stats\n", + " iidxs_tsc = iidxs.merge(dstim_verts, how='left', on='idx')\n", + " \n", + " pos_iidxs_tsc = pos_iidxs.merge(iidxs_tsc, how='left', on='idx')\n", + "\n", + " for pos_ix, df in pos_iidxs_tsc.groupby('pos_ix'):\n", + " rep_zs = np.arctanh(df.vert_rep_mean)\n", + " weights = df['actprob'].values\n", + " #print(df.columns)\n", + " if weights.sum() < 1:\n", + " continue\n", + " \n", + " rep_ds = weightstats.DescrStatsW(rep_zs.T, weights=weights)\n", + " rep_mean = np.tanh(rep_ds.mean)\n", + " rep_std = np.tanh(rep_ds.std)\n", + " rep_t, _ = rep_ds.ztest_mean()\n", + " if rep_std == 0:\n", + " continue\n", + " rep_va_ds = weightstats.DescrStatsW(rep_zs.T, weights=weights * df.vertex_area.values)\n", + " rep_va_mean = np.tanh(rep_va_ds.mean)\n", + " \n", + " rep_neg = rep_zs < 0\n", + " rn_ds = weightstats.DescrStatsW(rep_neg.T, weights=weights) \n", + " in_stim_ds = weightstats.DescrStatsW(df.in_stim.values, weights=weights)\n", + " rn_va_ds = weightstats.DescrStatsW(rep_neg.T , weights=weights * df.vertex_area) \n", + " in_stim_va_ds = weightstats.DescrStatsW(df.in_stim.values , weights=weights * df.vertex_area)\n", + " mt_ds = weightstats.DescrStatsW(df.motor_threshold.values, weights=weights)\n", + " row = dict(\n", + " subject=subject,\n", + " session=session,\n", + " smoothing=smoothing,\n", + " pos_ix=pos_ix,\n", + " n = len(df),\n", + " weighted_n = weights.sum(),\n", + " area = df.vertex_area.sum(),\n", + " weighted_area = (df.vertex_area * weights).sum(),\n", + " prop_neg=rn_ds.mean,\n", + " prop_va_neg=rn_va_ds.mean,\n", + " rep_mean=rep_mean,\n", + " rep_va_mean = rep_va_mean,\n", + " rep_std=rep_std,\n", + " rep_t=rep_t,\n", + " in_stim=in_stim_ds.mean,\n", + " in_stim_va=in_stim_va_ds.mean,\n", + " mt=mt_ds.mean,\n", + " mt_std=mt_ds.std,\n", + " )\n", + " row.update(pos_list.loc[pos_list.pos_ix == pos_ix, pl_cols].iloc[0].to_dict())\n", + " stim_stats.append(row)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "bd86b2cc-19c6-4a3c-9df2-2b52312de9a3", + "metadata": {}, + "outputs": [], + "source": [ + "stim_stats_rev = pd.DataFrame(stim_stats)\n", + " \n", + "stim_stats_rev['rep_r_rank'] = (\n", + " stim_stats_rev\n", + " .sort_values(['in_stim'], ascending=False)\n", + " .groupby(['subject', 'session', 'smoothing',])\n", + " .rep_mean\n", + " .transform('rank', method='first', ascending=True)\n", + ")\n", + "stim_stats_rev['rep_rva_rank'] = (\n", + " stim_stats_rev\n", + " .sort_values(['in_stim'], ascending=False)\n", + " .groupby(['subject', 'session', 'smoothing',])\n", + " .rep_va_mean\n", + " .transform('rank', method='first', ascending=True)\n", + ")\n", + "#print(stim_stats_rev)" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "98c4b6a3-ee52-46ed-ac90-1db4abf8bb5a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ses_comp_cols = [\n", + " 'subject',\n", + " 'smoothing',\n", + " 'pos_ix',\n", + " 'weighted_n',\n", + " 'area',\n", + " 'weighted_area',\n", + " 'rep_r_rank',\n", + " 'rep_rva_rank',\n", + " 'rep_mean',\n", + " 'rep_va_mean',\n", + " 'rep_std',\n", + " 'rep_t',\n", + " 'prop_neg',\n", + " 'prop_va_neg',\n", + " 'in_stim',\n", + " 'in_stim_va',\n", + " 'bx',\n", + " 'by',\n", + " 'bz',\n", + " 's_x',\n", + " 's_y',\n", + " 's_z',\n", + " 'z_angle'\n", + "]" + ] + }, + { + "cell_type": "markdown", + "id": "cd48cc07", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## This is the output you need for targeting" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "13392859", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjectsmoothingpos_ixweighted_nareaweighted_arearep_r_rankrep_rva_rankrep_meanrep_va_meanrep_stdrep_tprop_negprop_va_negin_stimin_stim_vabxbybzs_xs_ys_zz_angle
356NDARINV7BTZH7L22.555178.121399776.724119124.9547141.01.0-0.015450-0.0136170.044897-4.5771260.6278880.6063270.4397720.460128-55.437856.033234.4877-37.58031146.60008223.091337263.756150
1536NDARINVN394NEWK2.555046.593468427.39883929.6721171.01.00.0060420.0070680.0256811.5881520.5258970.4964110.4761800.481801-57.166449.857249.6356-39.55200643.57339543.853828305.560377
762NDARINVC25XBH2T2.5568193.383194998.481409127.7792311.01.0-0.049811-0.0451220.071278-9.6843830.7643640.7431350.3716570.375230-51.207675.128060.8984-35.28041565.28196051.10645711.108381
232NDARINV52XG9LJ32.5570127.596868717.14739690.2927251.01.0-0.015143-0.0147490.027359-6.2265000.7448270.7265460.4769440.527729-50.952068.681018.6960-40.88093261.3213889.805667308.984993
1392NDARINVGH5DHURH2.55104224.679562860.223602153.9197961.01.00.0165370.0164360.0260809.4821320.2620820.2696780.2184140.196228-55.762342.396523.5376-43.41405935.96946010.431504277.744711
1407NDARINVLMU4CC2J2.5514149.134230606.964919106.7057331.01.0-0.004894-0.0055290.023753-2.5072120.6469620.6727530.2875730.282233-42.202077.445039.6640-34.76873871.28594230.228001267.032627
480NDARINV7TV9UT402.5559195.283969891.000514141.9136761.01.0-0.001121-0.0035080.044620-0.3499780.5060990.5306240.4328190.432457-59.777357.855639.2945-43.13938553.45333531.822931152.109717
959NDARINVD5FWJDCY2.5535138.094506592.99425396.2202961.01.0-0.029913-0.0302060.038578-9.0770730.7328120.7270800.2589170.259983-42.622067.372672.8881-32.77892359.36063059.191315278.771919
869NDARINVCVZ700122.557974.362221445.68795451.2540333.01.0-0.018889-0.0240990.048061-3.3640000.7072820.7435390.0461610.047883-40.183069.228033.1180-33.22079155.60334025.881628145.955745
1643NDARINVP9Y862GP2.5558224.554444857.585045166.4390421.01.0-0.007778-0.0067420.019070-6.0975210.6684060.6593000.4717430.485202-53.469768.478417.7134-39.81349961.9292496.183051291.246063
\n", + "
" + ], + "text/plain": [ + " subject smoothing pos_ix weighted_n area \\\n", + "356 NDARINV7BTZH7L2 2.55 5 178.121399 776.724119 \n", + "1536 NDARINVN394NEWK 2.55 50 46.593468 427.398839 \n", + "762 NDARINVC25XBH2T 2.55 68 193.383194 998.481409 \n", + "232 NDARINV52XG9LJ3 2.55 70 127.596868 717.147396 \n", + "1392 NDARINVGH5DHURH 2.55 104 224.679562 860.223602 \n", + "1407 NDARINVLMU4CC2J 2.55 14 149.134230 606.964919 \n", + "480 NDARINV7TV9UT40 2.55 59 195.283969 891.000514 \n", + "959 NDARINVD5FWJDCY 2.55 35 138.094506 592.994253 \n", + "869 NDARINVCVZ70012 2.55 79 74.362221 445.687954 \n", + "1643 NDARINVP9Y862GP 2.55 58 224.554444 857.585045 \n", + "\n", + " weighted_area rep_r_rank rep_rva_rank rep_mean rep_va_mean \\\n", + "356 124.954714 1.0 1.0 -0.015450 -0.013617 \n", + "1536 29.672117 1.0 1.0 0.006042 0.007068 \n", + "762 127.779231 1.0 1.0 -0.049811 -0.045122 \n", + "232 90.292725 1.0 1.0 -0.015143 -0.014749 \n", + "1392 153.919796 1.0 1.0 0.016537 0.016436 \n", + "1407 106.705733 1.0 1.0 -0.004894 -0.005529 \n", + "480 141.913676 1.0 1.0 -0.001121 -0.003508 \n", + "959 96.220296 1.0 1.0 -0.029913 -0.030206 \n", + "869 51.254033 3.0 1.0 -0.018889 -0.024099 \n", + "1643 166.439042 1.0 1.0 -0.007778 -0.006742 \n", + "\n", + " rep_std rep_t prop_neg prop_va_neg in_stim in_stim_va \\\n", + "356 0.044897 -4.577126 0.627888 0.606327 0.439772 0.460128 \n", + "1536 0.025681 1.588152 0.525897 0.496411 0.476180 0.481801 \n", + "762 0.071278 -9.684383 0.764364 0.743135 0.371657 0.375230 \n", + "232 0.027359 -6.226500 0.744827 0.726546 0.476944 0.527729 \n", + "1392 0.026080 9.482132 0.262082 0.269678 0.218414 0.196228 \n", + "1407 0.023753 -2.507212 0.646962 0.672753 0.287573 0.282233 \n", + "480 0.044620 -0.349978 0.506099 0.530624 0.432819 0.432457 \n", + "959 0.038578 -9.077073 0.732812 0.727080 0.258917 0.259983 \n", + "869 0.048061 -3.364000 0.707282 0.743539 0.046161 0.047883 \n", + "1643 0.019070 -6.097521 0.668406 0.659300 0.471743 0.485202 \n", + "\n", + " bx by bz s_x s_y s_z z_angle \n", + "356 -55.4378 56.0332 34.4877 -37.580311 46.600082 23.091337 263.756150 \n", + "1536 -57.1664 49.8572 49.6356 -39.552006 43.573395 43.853828 305.560377 \n", + "762 -51.2076 75.1280 60.8984 -35.280415 65.281960 51.106457 11.108381 \n", + "232 -50.9520 68.6810 18.6960 -40.880932 61.321388 9.805667 308.984993 \n", + "1392 -55.7623 42.3965 23.5376 -43.414059 35.969460 10.431504 277.744711 \n", + "1407 -42.2020 77.4450 39.6640 -34.768738 71.285942 30.228001 267.032627 \n", + "480 -59.7773 57.8556 39.2945 -43.139385 53.453335 31.822931 152.109717 \n", + "959 -42.6220 67.3726 72.8881 -32.778923 59.360630 59.191315 278.771919 \n", + "869 -40.1830 69.2280 33.1180 -33.220791 55.603340 25.881628 145.955745 \n", + "1643 -53.4697 68.4784 17.7134 -39.813499 61.929249 6.183051 291.246063 " + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "stim_stats_rev.sort_values('rep_rva_rank').loc[:, ses_comp_cols].head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bb978bba", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "def get_optmat(row):\n", + " opt_top = np.vstack([row.bxv, row.byv, row.bzv, np.array([row.bx, row.by, row.bz])]).T\n", + " opt = np.vstack([opt_top, np.array([[0,0,0,1]])])\n", + " return opt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f3675c7", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "for subject in subjects:\n", + " src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k/'\n", + " headmodel_dir = anat_dir /f'sub-{subject}/HeadModel'\n", + " sim_out_dir = anat_dir / f'sub-{subject}/Simulation'\n", + " sim_dir = sorted(sim_out_dir.glob('simulation-*'))[-1]\n", + " for session in [1]:\n", + " for smoothing in [2.55]:\n", + " bs_targ_path = sim_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_brainsighttarget.txt'\n", + " bs = brainsight()\n", + " row = stim_stats_rev.query('subject == @subject & session == @session & smoothing == @smoothing & rep_rva_rank == 1').iloc[0]\n", + " optmat = get_optmat(row)\n", + " bs.write(optmat, bs_targ_path.as_posix(), overwrite=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5e11c2ab", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "outputs": [], + "source": [ + "_ = [print(foo) for foo in bs_targ_path.read_text().split('\\n')]" + ] + }, + { + "cell_type": "markdown", + "id": "abb070e3", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, + "source": [ + "## The rest of this code is for comparing sessions" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5dd38f5c-7d1e-4da6-856e-2ef61b40a74f", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ss1 = stim_stats_rev.loc[stim_stats_rev.session == 1, ses_comp_cols]\n", + "ss2 = stim_stats_rev.loc[stim_stats_rev.session == 2, ses_comp_cols]\n", + "ssw = ss1.merge(ss2, how='inner', on=['subject', 'smoothing', 'pos_ix',], suffixes=['_1', '_2'])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "2feb031c-38bd-48d8-bf28-418745993ea6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjectsmoothingpos_ixrep_r_rank_1rep_r_rank_2rep_rva_rank_1rep_rva_rank_2rep_mean_1rep_mean_2rep_va_mean_1rep_va_mean_2weighted_n_1weighted_n_2prop_neg_1prop_neg_2prop_va_neg_1prop_va_neg_2z_angle_1
834245462.55491.01.01.01.0-0.153627-0.099110-0.150259-0.09644390.26460990.2646090.8130480.8262540.8097060.816855341.347198
6245632.5569.01.07.01.0-0.026205-0.028267-0.026295-0.028103143.554607143.5546070.6859490.6368300.6854310.62829555.665885
110245632.551101.028.01.044.0-0.030118-0.012977-0.029036-0.01150079.35105779.3510570.7501390.5232270.7390290.50579813.141882
137245732.5511.02.01.01.0-0.086049-0.074195-0.086039-0.075414105.767901105.7679010.8406130.7896580.8474460.793742171.833490
311247042.55565.01.05.01.0-0.000430-0.0128130.004571-0.003350182.039188182.0391880.5207230.5052190.4882030.479083271.655977
313247042.55581.03.01.03.0-0.007824-0.009493-0.002284-0.000029176.749444176.7494440.5691650.4850130.5353440.45703882.234834
401247182.55332.01.02.01.0-0.155749-0.122443-0.156866-0.12311969.09930669.0993060.9558370.9715590.9499120.968991175.962639
443247182.55751.07.01.06.0-0.155920-0.117319-0.159410-0.11901968.10015368.1001530.9673530.9752620.9716960.978046147.830744
532247402.55331.01.01.01.0-0.119020-0.119953-0.123068-0.12506862.66235362.6623530.8637930.7408000.8720370.751627291.505734
662247422.55381.01.01.01.0-0.184116-0.169984-0.181546-0.167757104.660188104.6601880.8585630.8511310.8623160.854587115.600904
\n", + "
" + ], + "text/plain": [ + " subject smoothing pos_ix rep_r_rank_1 rep_r_rank_2 rep_rva_rank_1 \\\n", + "834 24546 2.55 49 1.0 1.0 1.0 \n", + "6 24563 2.55 6 9.0 1.0 7.0 \n", + "110 24563 2.55 110 1.0 28.0 1.0 \n", + "137 24573 2.55 1 1.0 2.0 1.0 \n", + "311 24704 2.55 56 5.0 1.0 5.0 \n", + "313 24704 2.55 58 1.0 3.0 1.0 \n", + "401 24718 2.55 33 2.0 1.0 2.0 \n", + "443 24718 2.55 75 1.0 7.0 1.0 \n", + "532 24740 2.55 33 1.0 1.0 1.0 \n", + "662 24742 2.55 38 1.0 1.0 1.0 \n", + "\n", + " rep_rva_rank_2 rep_mean_1 rep_mean_2 rep_va_mean_1 rep_va_mean_2 \\\n", + "834 1.0 -0.153627 -0.099110 -0.150259 -0.096443 \n", + "6 1.0 -0.026205 -0.028267 -0.026295 -0.028103 \n", + "110 44.0 -0.030118 -0.012977 -0.029036 -0.011500 \n", + "137 1.0 -0.086049 -0.074195 -0.086039 -0.075414 \n", + "311 1.0 -0.000430 -0.012813 0.004571 -0.003350 \n", + "313 3.0 -0.007824 -0.009493 -0.002284 -0.000029 \n", + "401 1.0 -0.155749 -0.122443 -0.156866 -0.123119 \n", + "443 6.0 -0.155920 -0.117319 -0.159410 -0.119019 \n", + "532 1.0 -0.119020 -0.119953 -0.123068 -0.125068 \n", + "662 1.0 -0.184116 -0.169984 -0.181546 -0.167757 \n", + "\n", + " weighted_n_1 weighted_n_2 prop_neg_1 prop_neg_2 prop_va_neg_1 \\\n", + "834 90.264609 90.264609 0.813048 0.826254 0.809706 \n", + "6 143.554607 143.554607 0.685949 0.636830 0.685431 \n", + "110 79.351057 79.351057 0.750139 0.523227 0.739029 \n", + "137 105.767901 105.767901 0.840613 0.789658 0.847446 \n", + "311 182.039188 182.039188 0.520723 0.505219 0.488203 \n", + "313 176.749444 176.749444 0.569165 0.485013 0.535344 \n", + "401 69.099306 69.099306 0.955837 0.971559 0.949912 \n", + "443 68.100153 68.100153 0.967353 0.975262 0.971696 \n", + "532 62.662353 62.662353 0.863793 0.740800 0.872037 \n", + "662 104.660188 104.660188 0.858563 0.851131 0.862316 \n", + "\n", + " prop_va_neg_2 z_angle_1 \n", + "834 0.816855 341.347198 \n", + "6 0.628295 55.665885 \n", + "110 0.505798 13.141882 \n", + "137 0.793742 171.833490 \n", + "311 0.479083 271.655977 \n", + "313 0.457038 82.234834 \n", + "401 0.968991 175.962639 \n", + "443 0.978046 147.830744 \n", + "532 0.751627 291.505734 \n", + "662 0.854587 115.600904 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "check_cols = ['subject', 'smoothing', 'pos_ix',\n", + " 'rep_r_rank_1', 'rep_r_rank_2',\n", + " 'rep_rva_rank_1', 'rep_rva_rank_2',\n", + " 'rep_mean_1', 'rep_mean_2',\n", + " 'rep_va_mean_1', 'rep_va_mean_2',\n", + " 'weighted_n_1', 'weighted_n_2',\n", + " 'prop_neg_1', 'prop_neg_2',\n", + " 'prop_va_neg_1', 'prop_va_neg_2',\n", + " 'z_angle_1'\n", + " ]\n", + "ssw.query(\"rep_rva_rank_1 == 1 | rep_rva_rank_2 == 1\").sort_values(['subject', 'smoothing']).loc[:, check_cols]" + ] + }, + { + "cell_type": "markdown", + "id": "8f0bee47-1ca4-4def-abea-80ccee3f47d7", + "metadata": {}, + "source": [ + "# Find Restricted targets" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "3a2e6870-47f0-471a-b5a1-79458da24cac", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "vert_thresh = 0\n" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "id": "48d4a66b-511b-4a6a-a014-5a4368e1dd15", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def make_va_sort_func(va):\n", + " return lambda x: va[np.array(list(x)).astype(int)].sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "6519f73a-4da9-49dd-853a-b5090f4711c6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(150908, 1)" + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "e5b20fcd-a458-49f2-9ad3-aca6af4d7517", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1285PMCK/Simulation/simulation-00/uncert1000\n", + "['wb_command', '-metric-resample', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-L_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-L_sphere.surf.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sphere.surf.gii', 'BARYCENTRIC', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sulc.shape.gii']\n", + "['wb_command', '-metric-resample', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-R_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-R_sphere.surf.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sphere.surf.gii', 'BARYCENTRIC', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sulc.shape.gii']\n", + "['wb_command', '-cifti-create-dense-scalar', '-left-metric', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sulc.shape.gii', '-right-metric', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV1EECRFPM/ses-4yearfollowupyarm1/anat/sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_hemi-LR_space-fsLR_desc-msmsulc_sulc.dscalar.nii']\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINV1EZ26N40\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1H7JEJW1/Simulation\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINV2484CB0H\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINV2BW6G83G\n", + "['wb_command', '-metric-resample', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-L_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-L_sphere.surf.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sphere.surf.gii', 'BARYCENTRIC', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sulc.shape.gii']\n", + "['wb_command', '-metric-resample', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-R_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-R_sphere.surf.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sphere.surf.gii', 'BARYCENTRIC', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sulc.shape.gii']\n", + "['wb_command', '-cifti-create-dense-scalar', '-left-metric', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sulc.shape.gii', '-right-metric', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV52XG9LJ3/ses-4yearfollowupyarm1/anat/sub-NDARINV52XG9LJ3_ses-4yearfollowupyarm1_run-4_hemi-LR_space-fsLR_desc-msmsulc_sulc.dscalar.nii']\n", + "['wb_command', '-metric-resample', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-L_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-L_sphere.surf.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sphere.surf.gii', 'BARYCENTRIC', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sulc.shape.gii']\n", + "['wb_command', '-metric-resample', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-R_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-R_sphere.surf.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sphere.surf.gii', 'BARYCENTRIC', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sulc.shape.gii']\n", + "['wb_command', '-cifti-create-dense-scalar', '-left-metric', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sulc.shape.gii', '-right-metric', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV6UU2L6YJ/ses-4yearfollowupyarm1/anat/sub-NDARINV6UU2L6YJ_ses-4yearfollowupyarm1_run-4_hemi-LR_space-fsLR_desc-msmsulc_sulc.dscalar.nii']\n", + "file not found: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/NDARINV7A5RDHVW\n", + "['wb_command', '-metric-resample', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-L_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-L_sphere.surf.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sphere.surf.gii', 'BARYCENTRIC', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sulc.shape.gii']\n", + "['wb_command', '-metric-resample', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-R_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-R_sphere.surf.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sphere.surf.gii', 'BARYCENTRIC', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sulc.shape.gii']\n", + "['wb_command', '-cifti-create-dense-scalar', '-left-metric', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-L_space-fsLR_desc-msmsulc_sulc.shape.gii', '-right-metric', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-R_space-fsLR_desc-msmsulc_sulc.shape.gii', '/data/ENIGMA-MDD/BIDS/ABCD/derivatives/fmriprep-23-2-2/sub-NDARINV7BTZH7L2/ses-4yearfollowupyarm1/anat/sub-NDARINV7BTZH7L2_ses-4yearfollowupyarm1_run-4_hemi-LR_space-fsLR_desc-msmsulc_sulc.dscalar.nii']\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[110], line 33\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mfile not found: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00muncert_dir\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 32\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m\n\u001b[0;32m---> 33\u001b[0m surfaces \u001b[38;5;241m=\u001b[39m \u001b[43mload_surfaces\u001b[49m\u001b[43m(\u001b[49m\u001b[43msubject\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbidslayout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfmriprepanat\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 34\u001b[0m scalp_path \u001b[38;5;241m=\u001b[39m headmodel_dir \u001b[38;5;241m/\u001b[39m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mm2m_\u001b[39m\u001b[38;5;132;01m{\u001b[39;00msubject\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m/Skin.surf.gii\u001b[39m\u001b[38;5;124m'\u001b[39m\n\u001b[1;32m 35\u001b[0m scalp_points, scalp_triangles \u001b[38;5;241m=\u001b[39m nb\u001b[38;5;241m.\u001b[39mload(scalp_path)\u001b[38;5;241m.\u001b[39magg_data()\n", + "File \u001b[0;32m/vf/users/ENIGMA-MDD/code/contarg/contarg/normgrid.py:505\u001b[0m, in \u001b[0;36mload_surfaces\u001b[0;34m(subject, layout, anat_dir, overwrite)\u001b[0m\n\u001b[1;32m 503\u001b[0m res \u001b[38;5;241m=\u001b[39m surfresample\u001b[38;5;241m.\u001b[39mrun(cwd \u001b[38;5;241m=\u001b[39m anat_out_dir)\n\u001b[1;32m 504\u001b[0m points, triangles \u001b[38;5;241m=\u001b[39m nb\u001b[38;5;241m.\u001b[39mload(new_surface)\u001b[38;5;241m.\u001b[39magg_data()\n\u001b[0;32m--> 505\u001b[0m G \u001b[38;5;241m=\u001b[39m \u001b[43mgraph_from_triangles\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtriangles\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 506\u001b[0m surf \u001b[38;5;241m=\u001b[39m Surface(new_surface, points, triangles, G, np\u001b[38;5;241m.\u001b[39marange(\u001b[38;5;28mlen\u001b[39m(points))\u001b[38;5;241m.\u001b[39mastype(\u001b[38;5;28mint\u001b[39m))\n\u001b[1;32m 507\u001b[0m ns[surface]\u001b[38;5;241m=\u001b[39msurf\n", + "File \u001b[0;32m/vf/users/ENIGMA-MDD/code/contarg/contarg/utils.py:1188\u001b[0m, in \u001b[0;36mgraph_from_triangles\u001b[0;34m(triangles)\u001b[0m\n\u001b[1;32m 1186\u001b[0m pairs \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mvstack([triangles[:,[\u001b[38;5;241m0\u001b[39m,\u001b[38;5;241m1\u001b[39m]], triangles[:,[\u001b[38;5;241m0\u001b[39m,\u001b[38;5;241m2\u001b[39m]], triangles[:,[\u001b[38;5;241m1\u001b[39m,\u001b[38;5;241m2\u001b[39m]]])\n\u001b[1;32m 1187\u001b[0m G \u001b[38;5;241m=\u001b[39m nx\u001b[38;5;241m.\u001b[39mGraph()\n\u001b[0;32m-> 1188\u001b[0m \u001b[43mG\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43madd_edges_from\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpairs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1189\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m G\n", + "File \u001b[0;32m/vf/users/ENIGMA-MDD/code/contargenv/lib/python3.9/site-packages/networkx/classes/graph.py:1021\u001b[0m, in \u001b[0;36mGraph.add_edges_from\u001b[0;34m(self, ebunch_to_add, **attr)\u001b[0m\n\u001b[1;32m 1019\u001b[0m u, v, dd \u001b[38;5;241m=\u001b[39m e\n\u001b[1;32m 1020\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m ne \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m2\u001b[39m:\n\u001b[0;32m-> 1021\u001b[0m u, v \u001b[38;5;241m=\u001b[39m e\n\u001b[1;32m 1022\u001b[0m dd \u001b[38;5;241m=\u001b[39m {} \u001b[38;5;66;03m# doesn't need edge_attr_dict_factory\u001b[39;00m\n\u001b[1;32m 1023\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "bgsva_peaks = []\n", + "all_scores = []\n", + "for subject in subjects:\n", + " for session in bidslayout.get_sessions(subject=subject):\n", + " #print(session)\n", + " if not Path(anat_dir / f'sub-{subject}').exists():\n", + " print(f'file not found: {anat_dir}/{subject}')\n", + " continue\n", + " filesT1w = bidslayout.get(subject=subject,\n", + " session=session,\n", + " extension=\".nii.gz\",\n", + " suffix=\"T1w\",\n", + " desc=\"preproc\",\n", + " space=None)\n", + " \n", + " ##\n", + " #src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k/'\n", + " fmriprepanat = filesT1w[0].dirname\n", + " fmriprepanat = Path(fmriprepanat)\n", + " headmodel_dir = anat_dir /f'sub-{subject}/HeadModel'\n", + " sim_out_dir = anat_dir / f'sub-{subject}/Simulation'\n", + " if len(sorted(sim_out_dir.glob('simulation-*'))) < 1:\n", + " print(f'file not found: {sim_out_dir}')\n", + " continue\n", + " sim_dir = sorted(sim_out_dir.glob('simulation-*'))[-1]\n", + " \n", + " uncert_dir = sim_dir / f'uncert{uncert_n}'\n", + " if not uncert_dir.exists():\n", + " #raise FileNotFoundError(uncert_dir)\n", + " # insteado of throwing an erro let's just skip\n", + " print(f'file not found: {uncert_dir}')\n", + " continue\n", + " surfaces = load_surfaces(subject, bidslayout, fmriprepanat)\n", + " scalp_path = headmodel_dir / f'm2m_{subject}/Skin.surf.gii'\n", + " scalp_points, scalp_triangles = nb.load(scalp_path).agg_data()\n", + " scalp_G = graph_from_triangles(scalp_triangles)\n", + " scalp = Surface(scalp_path, scalp_points, scalp_triangles, scalp_G, np.arange(len(scalp_points)).astype(int))\n", + "\n", + " stimroi_mask = get_stimroi_path(stimroi, cifti=True)\n", + " stim_roi = SurfROI(surfaces.l.midthickness.path, 'left', roi=stimroi_mask)\n", + "\n", + " #sulc_nii = src_surf_dir.parent.parent/f'MNINonLinear/fsaverage_LR32k/sub-{subject}.sulc.32k_fs_LR.dscalar.nii'\n", + " # This is the same as area above. Where we don't have this file for fmriprep so need to make it.\n", + " sulc_imgs = []\n", + " for hemi in ['L','R']:\n", + " Surf = bidslayout.get(subject=subject,\n", + " session=session,\n", + " extension=\".shape.gii\",\n", + " suffix=\"sulc\",\n", + " hemi=hemi,\n", + " #desc=\"preproc\",\n", + " space=None)\n", + " Surf = Surf[0].path\n", + " #metric = Surf.replace('midthickness','midthickness_va')\n", + " #metric = metric.replace('surf.gii','shape.gii')\n", + " sulc_pathgii = Surf.replace(f'_hemi-{hemi}_',f'_hemi-{hemi}_space-fsLR_desc-msmsulc_')\n", + " Sphere = bidslayout.get(subject=subject,\n", + " session=session,\n", + " extension=\".surf.gii\",\n", + " suffix=\"sphere\",\n", + " hemi=hemi,\n", + " desc=None,\n", + " space=None)\n", + " TargetSphere = bidslayout.get(subject=subject,\n", + " session=session,\n", + " extension=\".surf.gii\",\n", + " suffix=\"sphere\",\n", + " hemi=hemi,\n", + " desc=\"msmsulc\",\n", + " space='fsLR')\n", + " \n", + " \n", + " cmds2 = ['wb_command',\n", + " '-metric-resample',\n", + " Surf,\n", + " Sphere[0].path,\n", + " TargetSphere[0].path,\n", + " 'BARYCENTRIC',\n", + " sulc_pathgii]\n", + " print(cmds2)\n", + " subprocess.run(cmds2)\n", + " sulc_imgs = sulc_imgs + [sulc_pathgii]\n", + " sulc_path2 = sulc_pathgii.replace(f'hemi-{hemi}','hemi-LR')\n", + " sulc_path2 = sulc_path2.replace('shape.gii','dscalar.nii')\n", + " cmds4 = ['wb_command',\n", + " '-cifti-create-dense-scalar',\n", + " '-left-metric',\n", + " sulc_imgs[0],\n", + " '-right-metric',\n", + " sulc_imgs[1],\n", + " sulc_path2]\n", + " subprocess.run(cmds4)\n", + " print(cmds4)\n", + " sulc = nb.load(sulc_path2)\n", + " sulc_dat = sulc.get_fdata()\n", + " l_sulc = surf_data_from_cifti(sulc_dat, sulc.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT').squeeze()\n", + " #sub-NDARINV1EECRFPM_ses-4yearfollowupyarm1_run-4_LR_space-fsLR_desc-msmsulc_va.dscalar.nii\n", + " va_path = fmriprepanat / f'sub-{subject}_ses-{session}_run-{filesT1w[0].entities[\"run\"]}_LR_space-fsLR_desc-msmsulc_va.dscalar.nii'\n", + " va_img = ci.load(va_path)\n", + " all_va = va_img.get_fdata()\n", + " l_va = surf_data_from_cifti(all_va, va_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + "\n", + " pos_list = pd.read_pickle(sim_dir / f'sub-{subject}_simulations.pkl.gz')\n", + " for smoothing in [2.55]:\n", + " # load functional data\n", + " func = bidslayout.get(subject=subject,\n", + " session=session,\n", + " extension=\".dtseries.nii\",\n", + " suffix=\"bold\",\n", + " #hemi=hemi,\n", + " #run = None,\n", + " desc='AROMA',\n", + " space='fsLR',\n", + " regex_search=True,\n", + " invalid_filters=\"allow\",\n", + " return_type='filename')\n", + " concat_nii = [l for l in func if \"all\" in l] \n", + " timeseries = concat_nii\n", + " lts_data, rts_data, ts_data = load_timeseries(timeseries)\n", + " \n", + " # load clusters\n", + " clust_dir = func_dir / f'sub-{subject}/ses-{session}/cluster'\n", + " dstim_clusters = pd.read_pickle(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_dstimclusters.pkl.gz')\n", + " dstim_verts = pd.read_pickle(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_dstimverts.pkl.gz')\n", + " ref_clusters = pd.read_pickle(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_refclusters.pkl.gz')\n", + " ref_repts = np.load(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_refrepts.npz.npy')\n", + " ref_ts = np.load(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_refts.npz.npy')\n", + " \n", + " \n", + " # get vertex wise correlations for intensity eval\n", + " vert_rep_corr, _, _ = cross_spearman(lts_data[stim_roi.idxs], np.array(list(ref_clusters.repts.values)),\n", + " alpha=pairwise_sig_thresh, method='fdr_bh')\n", + " vert_rep_zs = np.arctanh(vert_rep_corr)\n", + " vert_rep_ds = weightstats.DescrStatsW(vert_rep_zs.T, weights=ref_clusters.nvert.values)\n", + " vert_rep_mean = np.tanh(vert_rep_ds.mean)\n", + " \n", + " vert_rep_t, vert_rep_p = vert_rep_ds.ztest_mean()\n", + " # iidxs['vert_rep_mean'] = vert_rep_mean\n", + " # iidxs['vert_rep_avet'] = vert_rep_t\n", + " # iidxs['vert_rep_avep'] = vert_rep_p\n", + " \n", + " \n", + " neg_G = stim_roi._G.subgraph(stim_roi.idxs[vert_rep_mean < vert_thresh]).copy()\n", + " comp_info = []\n", + " for ccid, cc in enumerate(sorted(nx.connected_components(neg_G), key=make_va_sort_func(l_va), reverse=True)):\n", + " cc = np.array(list(cc))\n", + " gyral_nodes = cc[l_sulc[cc] > 0]\n", + " gyral_G = neg_G.subgraph(gyral_nodes).copy()\n", + " if len(gyral_G) > 0:\n", + " biggest_gyral_subset = max(nx.connected_components(gyral_G), key=make_va_sort_func(l_va)) \n", + " #pos_iidxs['in_bgs'] = pos_iidxs.idx.isin(biggest_gyral_subset)\n", + " if ccid == 0:\n", + " # find the peak gyral value that's not on the edge of cluster\n", + " # we'll get an optimal simnibs target for this\n", + " bgs_vert_rep_means = vert_rep_mean[np.array([sri in biggest_gyral_subset for sri in stim_roi.idxs])]\n", + " bgs_peak_idxs = np.array(list(biggest_gyral_subset))[np.argsort(bgs_vert_rep_means)]\n", + " bgs_vert_rep_means = sorted(bgs_vert_rep_means)\n", + " surrounded_peak_found = False\n", + " for bgs_idx, bgs_vrm in zip(bgs_peak_idxs, bgs_vert_rep_means):\n", + " surrounded = (vert_rep_mean[np.array([sri in list(stim_roi._G.neighbors(bgs_idx))for sri in stim_roi.idxs])] < vert_thresh).all()\n", + " if surrounded:\n", + " surrounded_peak_found = True\n", + " coord = stim_roi.coords[stim_roi.idxs == bgs_idx][0]\n", + " row=dict(\n", + " subject=subject,\n", + " session=session,\n", + " smoothing=smoothing,\n", + " surrounded=True,\n", + " x=coord[0],\n", + " y=coord[1],\n", + " z=coord[2],\n", + " clust_size=len(cc),\n", + " clust_area=l_va[np.array(list(cc)).astype(int)].sum(),\n", + " peak_val=bgs_vrm,\n", + " peak_idx=bgs_idx,\n", + " )\n", + " break\n", + " # If none of the gyral points are surrounded, just take the biggest\n", + " if not surrounded_peak_found:\n", + " coord = stim_roi.coords[stim_roi.idxs == bgs_peak_idxs[0]][0]\n", + " row=dict(\n", + " subject=subject,\n", + " session=session,\n", + " smoothing=smoothing,\n", + " surounded=False,\n", + " x=coord[0],\n", + " y=coord[1],\n", + " z=coord[2],\n", + " clust_size=len(cc),\n", + " clust_area=l_va[np.array(list(cc)).astype(int)].sum(),\n", + " peak_val=bgs_vrm,\n", + " peak_idx=bgs_idx,\n", + " )\n", + " bgsva_peaks.append(row)\n", + " else:\n", + " continue\n", + "\n", + " \n", + "bgsva_peaks = pd.DataFrame(bgsva_peaks)" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "bea8e272-bba3-4f52-840a-57ca83b45c5d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " subject session smoothing surrounded x \\\n", + "0 NDARINV1EECRFPM 4yearfollowupyarm1 2.55 True -35.348530 \n", + "1 NDARINV52XG9LJ3 4yearfollowupyarm1 2.55 True -38.019196 \n", + "2 NDARINV6UU2L6YJ 4yearfollowupyarm1 2.55 True -38.080048 \n", + "3 NDARINV7BTZH7L2 4yearfollowupyarm1 2.55 True -34.848186 \n", + "\n", + " y z clust_size clust_area peak_val peak_idx \n", + "0 53.684776 59.794136 75 57.502322 -0.040241 29628 \n", + "1 63.080399 -8.416976 137 104.038115 -0.035335 18601 \n", + "2 67.952011 30.401476 293 228.632842 -0.043258 29470 \n", + "3 43.097267 16.825150 216 163.186899 -0.101031 18547 \n" + ] + } + ], + "source": [ + "bgsva_peaks = pd.DataFrame(bgsva_peaks)\n", + "print(bgsva_peaks.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "59f85c3a-39a3-417e-ab00-9edfe9ea21ef", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjectsessionsmoothingsurroundedxyzclust_sizeclust_areapeak_valpeak_idx
0NDARINV1EECRFPM4yearfollowupyarm12.55True-35.34853053.68477659.7941367557.502322-0.04024129628
1NDARINV52XG9LJ34yearfollowupyarm12.55True-38.01919663.080399-8.416976137104.038115-0.03533518601
2NDARINV6UU2L6YJ4yearfollowupyarm12.55True-38.08004867.95201130.401476293228.632842-0.04325829470
3NDARINV7BTZH7L24yearfollowupyarm12.55True-34.84818643.09726716.825150216163.186899-0.10103118547
\n", + "
" + ], + "text/plain": [ + " subject session smoothing surrounded x \\\n", + "0 NDARINV1EECRFPM 4yearfollowupyarm1 2.55 True -35.348530 \n", + "1 NDARINV52XG9LJ3 4yearfollowupyarm1 2.55 True -38.019196 \n", + "2 NDARINV6UU2L6YJ 4yearfollowupyarm1 2.55 True -38.080048 \n", + "3 NDARINV7BTZH7L2 4yearfollowupyarm1 2.55 True -34.848186 \n", + "\n", + " y z clust_size clust_area peak_val peak_idx \n", + "0 53.684776 59.794136 75 57.502322 -0.040241 29628 \n", + "1 63.080399 -8.416976 137 104.038115 -0.035335 18601 \n", + "2 67.952011 30.401476 293 228.632842 -0.043258 29470 \n", + "3 43.097267 16.825150 216 163.186899 -0.101031 18547 " + ] + }, + "execution_count": 113, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bgsva_peaks.sort_values(['subject', 'session'])" + ] + }, + { + "cell_type": "markdown", + "id": "edd1dd8b-c861-480e-99be-88940324f8d0", + "metadata": {}, + "source": [ + "## Run optimizations to find stimulator locations for cortical targets " + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "id": "bca1f47d-c368-44f2-af00-d981068d2078", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bgs_peaks = bgsva_peaks" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "6a374a17-398d-4c83-9325-056fa9aa0a11", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bgs_peaks = bgs_peaks.sort_values(['subject', 'x', 'y', 'z'])\n", + "bgs_peaks.sort_values(['subject', 'smoothing', 'session'])\n", + "bgs_peaks['dup'] = bgs_peaks.loc[:, ['subject', 'x', 'y', 'z']].duplicated()\n", + "bgs_peaks['peak_ix'] = range(len(bgs_peaks))" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "id": "4b5a9fe1-86eb-4cec-a31c-e1487c2fc939", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "jobs = []\n", + "opt_dirs = []\n", + "for subject, df in bgs_peaks.groupby('subject'):\n", + " headmodel_dir = anat_dir /f'sub-{subject}/HeadModel'\n", + " sim_out_dir = anat_dir / f'sub-{subject}/Simulation'\n", + "\n", + " coil='MagVenture_MCF-B65.ccd'\n", + " try:\n", + " m2m_dir = sorted(headmodel_dir.glob('m2m*'))[0]\n", + " except IndexError:\n", + " raise FileNotFoundError(f\"No m2m directory found in {headmodel_dir}\")\n", + " skinsurf_path = m2m_dir / 'Skin.surf.gii'\n", + " subject = '_'.join(m2m_dir.parts[-1].split('_')[1:])\n", + " headmesh_path = m2m_dir / f'{subject}.msh'\n", + "\n", + " if not Path(coil).exists():\n", + " simnibs_coil_dir = Path('/data/ENIGMA-MDD/code/simnibs/simnibs/resources/coil_models')\n", + " coil_path = simnibs_coil_dir / f'Drakaki_BrainStim_2022/{coil}'\n", + " if not coil_path.exists():\n", + " coil_path = simnibs_coil_dir / f'legacy_and_other/{coil}'\n", + " if not coil_path.exists():\n", + " raise FileNotFoundError(f\"Could not find coil ({coil}) in {simnibs_coil_dir}.\")\n", + " else:\n", + " coil_path = Path(coil)\n", + " sim_run_n = 0\n", + " sim_dir = sim_out_dir / f'alternate_targeting-00'\n", + "\n", + " #sim_dir = sim_out_dir / f'alternate_targeting-{sim_run_n:02d}'\n", + " # while sim_dir.exists():\n", + " # sim_run_n += 1\n", + " # sim_dir = sim_out_dir / f'alternate_targeting-{sim_run_n:02d}'\n", + " \n", + " sim_dir.mkdir(exist_ok=True)\n", + " for ix, row in df.iterrows():\n", + " # run opt if it's not a duplicate\n", + " if not row.dup:\n", + " poso_outdir = sim_dir / f'opt-{row.peak_ix:04d}'\n", + " \n", + " assert poso_outdir.parent.exists()\n", + " if poso_outdir.exists():\n", + " raise ValueError(f\"Output directory {poso_outdir} exists, Simnibs won't run.\")\n", + " o = opt_struct.TMSoptimize()\n", + " o.fnamehead = headmesh_path.as_posix()\n", + " o.pathfem = poso_outdir.as_posix()\n", + " o.fnamecoil = coil_path.as_posix()\n", + " o.target = np.array([row.x, row.y, row.z])\n", + " o.target_size = 2\n", + " o.distance = distancetoscalp\n", + " o.method='ADM'\n", + " # o.map_to_vol = True\n", + " # o.map_to_surf = True\n", + " # o.fields = 'eE'\n", + " o.angle_resolution = 5\n", + " o.spatial_resolution = 2\n", + " o.solver_options='paradiso'\n", + " o.open_in_gmsh=False\n", + " jobs.append(delayed(run_opt_and_save_outputs)(o))\n", + " opt_dirs.append(poso_outdir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48a6d52c-5fc5-481c-8047-6fabe6559bb5", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=20)]: Using backend LokyBackend with 20 concurrent workers.\n", + "[ simnibs ]INFO: Running simulations in the directory: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV7BTZH7L2/Simulation/alternate_targeting-00/opt-0003\n", + "[ simnibs ]INFO: Running simulations in the directory: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV52XG9LJ3/Simulation/alternate_targeting-00/opt-0001\n", + "[ simnibs ]INFO: Running simulations in the directory: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1EECRFPM/Simulation/alternate_targeting-00/opt-0000\n", + "[ simnibs ]INFO: Running simulations in the directory: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV6UU2L6YJ/Simulation/alternate_targeting-00/opt-0002\n", + "[ simnibs ]INFO: Head Mesh: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV7BTZH7L2/HeadModel/m2m_NDARINV7BTZH7L2/NDARINV7BTZH7L2.msh\n", + "[ simnibs ]INFO: Subject Path: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV7BTZH7L2/HeadModel/m2m_NDARINV7BTZH7L2\n", + "[ simnibs ]INFO: Simulation Folder: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV7BTZH7L2/Simulation/alternate_targeting-00/opt-0003\n", + "[ simnibs ]INFO: Head Mesh: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1EECRFPM/HeadModel/m2m_NDARINV1EECRFPM/NDARINV1EECRFPM.msh\n", + "[ simnibs ]INFO: Subject Path: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1EECRFPM/HeadModel/m2m_NDARINV1EECRFPM\n", + "[ simnibs ]INFO: Simulation Folder: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1EECRFPM/Simulation/alternate_targeting-00/opt-0000\n", + "[ simnibs ]INFO: Head Mesh: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV52XG9LJ3/HeadModel/m2m_NDARINV52XG9LJ3/NDARINV52XG9LJ3.msh\n", + "[ simnibs ]INFO: Subject Path: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV52XG9LJ3/HeadModel/m2m_NDARINV52XG9LJ3\n", + "[ simnibs ]INFO: Simulation Folder: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV52XG9LJ3/Simulation/alternate_targeting-00/opt-0001\n", + "[ simnibs ]INFO: Head Mesh: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV6UU2L6YJ/HeadModel/m2m_NDARINV6UU2L6YJ/NDARINV6UU2L6YJ.msh\n", + "[ simnibs ]INFO: Subject Path: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV6UU2L6YJ/HeadModel/m2m_NDARINV6UU2L6YJ\n", + "[ simnibs ]INFO: Simulation Folder: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV6UU2L6YJ/Simulation/alternate_targeting-00/opt-0002\n", + "[ simnibs ]INFO: Subject Folder: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV7BTZH7L2/HeadModel/m2m_NDARINV7BTZH7L2\n", + "Mesh file name: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV7BTZH7L2/HeadModel/m2m_NDARINV7BTZH7L2/NDARINV7BTZH7L2.msh\n", + "Coil file: /data/ENIGMA-MDD/code/simnibs/simnibs/resources/coil_models/Drakaki_BrainStim_2022/MagVenture_MCF-B65.ccd\n", + "Target: [-34.8482 43.0973 16.8251]\n", + "Target Direction: None\n", + "Centre position: [-34.8482 43.0973 16.8251]\n", + "Reference y: None\n", + "Coil distance: 2\n", + "Search radius: 20\n", + "Spatial resolution: 2\n", + "Search angle: 360\n", + "Angle resolution: 5\n", + "method: ADM\n", + "[ simnibs ]INFO: Subject Folder: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV6UU2L6YJ/HeadModel/m2m_NDARINV6UU2L6YJ\n", + "Mesh file name: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV6UU2L6YJ/HeadModel/m2m_NDARINV6UU2L6YJ/NDARINV6UU2L6YJ.msh\n", + "Coil file: /data/ENIGMA-MDD/code/simnibs/simnibs/resources/coil_models/Drakaki_BrainStim_2022/MagVenture_MCF-B65.ccd\n", + "Target: [-38.08 67.952 30.4015]\n", + "Target Direction: None\n", + "Centre position: [-38.08 67.952 30.4015]\n", + "Reference y: None\n", + "Coil distance: 2\n", + "Search radius: 20\n", + "Spatial resolution: 2\n", + "Search angle: 360\n", + "Angle resolution: 5\n", + "method: ADM\n", + "[ simnibs ]INFO: Subject Folder: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1EECRFPM/HeadModel/m2m_NDARINV1EECRFPM\n", + "Mesh file name: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV1EECRFPM/HeadModel/m2m_NDARINV1EECRFPM/NDARINV1EECRFPM.msh\n", + "Coil file: /data/ENIGMA-MDD/code/simnibs/simnibs/resources/coil_models/Drakaki_BrainStim_2022/MagVenture_MCF-B65.ccd\n", + "Target: [-35.3485 53.6848 59.7941]\n", + "Target Direction: None\n", + "Centre position: [-35.3485 53.6848 59.7941]\n", + "Reference y: None\n", + "Coil distance: 2\n", + "Search radius: 20\n", + "Spatial resolution: 2\n", + "Search angle: 360\n", + "Angle resolution: 5\n", + "method: ADM\n", + "[ simnibs ]INFO: Subject Folder: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV52XG9LJ3/HeadModel/m2m_NDARINV52XG9LJ3\n", + "Mesh file name: /data/ENIGMA-MDD/BIDS/ABCD/derivatives/contarg_fmriprep_23-2/anat_preproc/sub-NDARINV52XG9LJ3/HeadModel/m2m_NDARINV52XG9LJ3/NDARINV52XG9LJ3.msh\n", + "Coil file: /data/ENIGMA-MDD/code/simnibs/simnibs/resources/coil_models/Drakaki_BrainStim_2022/MagVenture_MCF-B65.ccd\n", + "Target: [-38.0192 63.0804 -8.417 ]\n", + "Target Direction: None\n", + "Centre position: [-38.0192 63.0804 -8.417 ]\n", + "Reference y: None\n", + "Coil distance: 2\n", + "Search radius: 20\n", + "Spatial resolution: 2\n", + "Search angle: 360\n", + "Angle resolution: 5\n", + "method: ADM\n", + "[ simnibs ]INFO: Using isotropic conductivities\n", + "[ simnibs ]INFO: Using isotropic conductivities\n", + "[ simnibs ]INFO: Using isotropic conductivities\n", + "[ simnibs ]INFO: Using isotropic conductivities\n", + "[ simnibs ]INFO: Searching 21960 positions\n", + "[ simnibs ]INFO: Searching 21960 positions\n", + "[ simnibs ]INFO: Searching 21672 positions\n", + "[ simnibs ]INFO: Searching 21960 positions\n", + "[ simnibs ]INFO: Assembling FEM Matrix\n", + "[ simnibs ]INFO: Assembling FEM Matrix\n", + "[ simnibs ]INFO: Assembling FEM Matrix\n", + "[ simnibs ]INFO: Assembling FEM Matrix\n", + "[ simnibs ]INFO: 11.71s to assemble FEM matrix\n", + "[ simnibs ]INFO: 11.99s to assemble FEM matrix\n", + "[ simnibs ]INFO: 13.24s to assemble FEM matrix\n", + "[ simnibs ]INFO: Using solver options: paradiso\n", + "[ simnibs ]INFO: Using solver options: paradiso\n", + "[ simnibs ]INFO: Preparing the KSP\n", + "[ simnibs ]INFO: Preparing the KSP\n", + "[ simnibs ]INFO: Time to prepare the KSP: 0.64s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: 14.33s to assemble FEM matrix\n", + "[ simnibs ]INFO: Time to prepare the KSP: 0.68s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Using solver options: paradiso\n", + "[ simnibs ]INFO: Preparing the KSP\n", + "[ simnibs ]INFO: Time to prepare the KSP: 0.74s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Using solver options: paradiso\n", + "[ simnibs ]INFO: Preparing the KSP\n", + "[ simnibs ]INFO: Time to prepare the KSP: 0.80s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Number of iterations: 115 Residual Norm: 1.47e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 10.81s\n", + "[ simnibs ]INFO: Number of iterations: 184 Residual Norm: 3.19e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 16.63s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Number of iterations: 165 Residual Norm: 4.41e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 17.19s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Number of iterations: 177 Residual Norm: 3.04e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 19.61s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Number of iterations: 135 Residual Norm: 1.75e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 12.70s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Number of iterations: 179 Residual Norm: 3.34e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 16.10s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Number of iterations: 172 Residual Norm: 4.56e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 17.74s\n", + "[ simnibs ]INFO: Number of iterations: 142 Residual Norm: 1.39e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 13.57s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Running ADM\n", + "[ simnibs ]INFO: Number of iterations: 183 Residual Norm: 3.53e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 20.20s\n", + "[ simnibs ]INFO: Number of iterations: 180 Residual Norm: 3.38e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 16.24s\n", + "[ simnibs ]INFO: Solving system 1 of 1\n", + "[ simnibs ]INFO: Running PETSc with KSP: gmres PC: ilu\n", + "[ simnibs ]INFO: Running ADM\n", + "[ simnibs ]INFO: Number of iterations: 167 Residual Norm: 3.91e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 16.66s\n", + "[ simnibs ]INFO: Running ADM\n", + "[ simnibs ]INFO: Number of iterations: 191 Residual Norm: 2.90e-08\n", + "[ simnibs ]INFO: KSP Converged with reason: 2\n", + "[ simnibs ]INFO: Time to solve system: 19.14s\n", + "[ simnibs ]INFO: Running ADM\n", + "[ simnibs ]INFO: H-primary time: 88.23s\n", + "[ simnibs ]INFO: H-primary time: 78.35s\n", + "[ simnibs ]INFO: H-primary time: 97.62s\n" + ] + } + ], + "source": [ + "print(len(jobs), flush=True)\n", + "Parallel(n_jobs=20, verbose=10)(jobs)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "1b1ebd84-a065-4506-9a9b-1ead85533f21", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bgs_peaks['out_dir'] = opt_dirs" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "6dfad42e-92e9-4e24-94ba-08e92f7894c1", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bgs_peaks.to_pickle('bgs_peaks.pkl.gz')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "012a3b90-fdd8-4476-a7bb-763d44719434", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bgs_peaks = pd.read_pickle('bgs_peaks.pkl.gz')\n" + ] + }, + { + "cell_type": "markdown", + "id": "544ff061-361f-4bc5-ab7f-ca0f48a66790", + "metadata": {}, + "source": [ + "### Convert outputs to surfaces" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "970f4761-23ec-47a9-bc4f-557e95aacb25", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "coil_name = coil.split('.')[0]\n", + "outstats = []\n", + "for ix, row in bgs_peaks.iterrows():\n", + " subject = row.subject\n", + " vol_outdir = row.out_dir / 'subject_volumes'\n", + " target_path = vol_outdir / f'{subject}_TMS_1-0001_{coil_name}_Target.nii.gz'\n", + " magn_path = vol_outdir / f'{subject}_TMS_1-0001_{coil_name}_magnE.nii.gz'\n", + " norm_path = vol_outdir / f'{subject}_TMS_1-0001_{coil_name}_E.nii.gz'\n", + " optmat_path = row.out_dir / f'{subject}_TMS_optimize_{coil_name}_optmat.npy'\n", + " irow = dict(\n", + " target_path=target_path,\n", + " target_path_exist=target_path.exists(),\n", + " magn_path=magn_path,\n", + " magn_path_exist=magn_path.exists(),\n", + " norm_path=norm_path,\n", + " norm_path_exist=norm_path.exists(),\n", + " optmat_path=optmat_path,\n", + " optmat_path_exist=optmat_path.exists()\n", + " )\n", + " if optmat_path.exists():\n", + " optmat = np.load(optmat_path)\n", + " irow['bx'] = optmat[0,3]\n", + " irow['by'] = optmat[1,3]\n", + " irow['bz'] = optmat[2,3]\n", + " irow['bxv'] = optmat[:-1, 0]\n", + " irow['byv'] = optmat[:-1, 1]\n", + " irow['bzv'] = optmat[:-1, 2]\n", + " outstats.append(irow)\n", + "outstats = pd.DataFrame(outstats)\n", + "bgs_peak_stats = pd.concat([bgs_peaks.reset_index(drop=True), outstats], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "a720df3e-7417-4dde-93f3-1a0015026b5b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "medial_wall = {}\n", + "medial_wall['l'] = templateflow.api.get(template='fsLR', density='32k', desc='nomedialwall', hemi='L')\n", + "medial_wall['r'] = templateflow.api.get(template='fsLR', density='32k', desc='nomedialwall', hemi='R')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "53051803-afe8-4562-a2b1-a151f01cbc03", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866028582 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.6 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866028902 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.8 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866029227 (866 million) bytes long!\n", + "++ elapsed time = 3.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866029543 (866 million) bytes long!\n", + "++ elapsed time = 3.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866029859 (866 million) bytes long!\n", + "++ elapsed time = 3.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866030175 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.6 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866030498 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866030826 (866 million) bytes long!\n", + "++ elapsed time = 3.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866031145 (866 million) bytes long!\n", + "++ elapsed time = 3.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866031464 (866 million) bytes long!\n", + "++ elapsed time = 3.8 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866031783 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.6 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866032106 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.8 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866032434 (866 million) bytes long!\n", + "++ elapsed time = 3.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866032753 (866 million) bytes long!\n", + "++ elapsed time = 3.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866033072 (866 million) bytes long!\n", + "++ elapsed time = 3.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866033391 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.8 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866033711 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.8 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866034036 (866 million) bytes long!\n", + "++ elapsed time = 4.1 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866034352 (866 million) bytes long!\n", + "++ elapsed time = 4.1 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866034668 (866 million) bytes long!\n", + "++ elapsed time = 4.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866034984 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.8 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866035304 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.8 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866035629 (866 million) bytes long!\n", + "++ elapsed time = 4.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866035945 (866 million) bytes long!\n", + "++ elapsed time = 4.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866036261 (866 million) bytes long!\n", + "++ elapsed time = 4.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866036577 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.7 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866036897 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.8 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866037222 (866 million) bytes long!\n", + "++ elapsed time = 4.1 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866037538 (866 million) bytes long!\n", + "++ elapsed time = 4.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866037854 (866 million) bytes long!\n", + "++ elapsed time = 4.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866038170 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.8 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866038490 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.8 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866038815 (866 million) bytes long!\n", + "++ elapsed time = 4.1 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866039131 (866 million) bytes long!\n", + "++ elapsed time = 4.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866039447 (866 million) bytes long!\n", + "++ elapsed time = 4.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866039763 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.1 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866040086 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.4 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866040414 (866 million) bytes long!\n", + "++ elapsed time = 3.1 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866040733 (866 million) bytes long!\n", + "++ elapsed time = 3.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866041052 (866 million) bytes long!\n", + "++ elapsed time = 3.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866041371 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866041691 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.4 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866042016 (866 million) bytes long!\n", + "++ elapsed time = 3.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866042332 (866 million) bytes long!\n", + "++ elapsed time = 2.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866042648 (866 million) bytes long!\n", + "++ elapsed time = 2.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866042964 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.3 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866043284 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 0.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866043609 (866 million) bytes long!\n", + "++ elapsed time = 2.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866043925 (866 million) bytes long!\n", + "++ elapsed time = 2.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866044241 (866 million) bytes long!\n", + "++ elapsed time = 2.0 s\n" + ] + } + ], + "source": [ + "for subject, df in bgs_peak_stats.groupby('subject'):\n", + " src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k/'\n", + " surfaces = load_liston_surfs(subject,src_surf_dir)\n", + " sim_dir = df.iloc[0].out_dir.parent\n", + " # concat magnE\n", + " catted = sim_dir / f\"sub-{subject}_desc-magnE_stat.nii.gz\"\n", + " if not catted.exists():\n", + " cmd = [\n", + " \"3dTcat\",\n", + " \"-overwrite\",\n", + " \"-prefix\",\n", + " catted,\n", + " f\"{sim_dir.as_posix()}/opt-*/subject_volumes/*_magnE.nii.gz\"\n", + " ]\n", + " subprocess.run(cmd, check=True)\n", + " # concat target\n", + " catted = sim_dir / f\"sub-{subject}_desc-target_stat.nii.gz\"\n", + " if not catted.exists():\n", + " cmd = [\n", + " \"3dTcat\",\n", + " \"-DAFNI_GLOB_SELECTORS=YES\",\n", + " \"-overwrite\",\n", + " \"-prefix\",\n", + " catted,\n", + " f\"{sim_dir.as_posix()}/opt-*/subject_volumes/*_Target.nii.gz[0]\"\n", + " ]\n", + " subprocess.run(cmd, check=True)\n", + " # concat evec\n", + " catted = sim_dir / f\"sub-{subject}_desc-Ei_stat.nii.gz\"\n", + " if not catted.exists():\n", + " cmd = [\n", + " \"3dTcat\",\n", + " \"-DAFNI_GLOB_SELECTORS=YES\",\n", + " \"-overwrite\",\n", + " \"-prefix\",\n", + " catted,\n", + " f\"{sim_dir.as_posix()}/opt-*/subject_volumes/*_E.nii.gz[0]\"\n", + " ]\n", + " subprocess.run(cmd, check=True)\n", + "\n", + " catted = sim_dir / f\"sub-{subject}_desc-Ej_stat.nii.gz\"\n", + " if not catted.exists():\n", + " cmd = [\n", + " \"3dTcat\",\n", + " \"-DAFNI_GLOB_SELECTORS=YES\",\n", + " \"-overwrite\",\n", + " \"-prefix\",\n", + " catted,\n", + " f\"{sim_dir.as_posix()}/opt-*/subject_volumes/*_E.nii.gz[1]\"\n", + " ]\n", + " subprocess.run(cmd, check=True)\n", + "\n", + " catted = sim_dir / f\"sub-{subject}_desc-Ek_stat.nii.gz\"\n", + " if not catted.exists():\n", + " cmd = [\n", + " \"3dTcat\",\n", + " \"-DAFNI_GLOB_SELECTORS=YES\",\n", + " \"-overwrite\",\n", + " \"-prefix\",\n", + " catted,\n", + " f\"{sim_dir.as_posix()}/opt-*/subject_volumes/*_E.nii.gz[2]\"\n", + " ]\n", + " subprocess.run(cmd, check=True)\n", + "\n", + " consolidated_paths = [sim_dir / f\"sub-{subject}_desc-{metric}_stat.nii.gz\" for metric in ['magnE', 'Ei', 'Ej', 'Ek', 'target']]\n", + " for metric_path in consolidated_paths:\n", + " cifti_out = metric_path.as_posix().replace(\".nii.gz\", \".dtseries.nii\").replace(\"_desc-\", \"_space-fsLR_den-32k_desc-\")\n", + " if not Path(cifti_out).exists():\n", + " l_out_gifti = metric_path.as_posix().replace(\".nii.gz\", \".shape.gii\").replace(\"_desc-\", \"_hemi-L_space-fsLR_den-32k_desc-\")\n", + " l_v2s_cmd = [\n", + " 'wb_command',\n", + " '-volume-to-surface-mapping',\n", + " metric_path.as_posix(),\n", + " surfaces.l.midthickness.path,\n", + " l_out_gifti,\n", + " '-ribbon-constrained',\n", + " surfaces.l.white.path,\n", + " surfaces.l.pial.path,\n", + " ]\n", + " subprocess.run(l_v2s_cmd, check=True)\n", + "\n", + " l_metricmask_cmd = [\n", + " 'wb_command',\n", + " '-metric-mask',\n", + " l_out_gifti,\n", + " medial_wall['l'],\n", + " l_out_gifti\n", + " ]\n", + " subprocess.run(l_metricmask_cmd, check=True)\n", + "\n", + "\n", + " r_out_gifti = metric_path.as_posix().replace(\".nii.gz\", \".shape.gii\").replace(\"_desc-\", \"_hemi-R_space-fsLR_den-32k_desc-\")\n", + " r_v2s_cmd = [\n", + " 'wb_command',\n", + " '-volume-to-surface-mapping',\n", + " metric_path.as_posix(),\n", + " surfaces.r.midthickness.path,\n", + " r_out_gifti,\n", + " '-ribbon-constrained',\n", + " surfaces.r.white.path,\n", + " surfaces.r.pial.path,\n", + " ]\n", + " subprocess.run(r_v2s_cmd, check=True)\n", + "\n", + " r_metricmask_cmd = [\n", + " 'wb_command',\n", + " '-metric-mask',\n", + " r_out_gifti,\n", + " medial_wall['r'],\n", + " r_out_gifti\n", + " ]\n", + " subprocess.run(r_metricmask_cmd, check=True)\n", + "\n", + " create_cifti_cmd = [\n", + " 'wb_command',\n", + " '-cifti-create-dense-timeseries',\n", + " cifti_out,\n", + " '-left-metric',\n", + " l_out_gifti,\n", + " '-roi-left',\n", + " medial_wall['l'],\n", + " '-right-metric',\n", + " r_out_gifti,\n", + " '-roi-right',\n", + " medial_wall['r'],\n", + " ]\n", + " subprocess.run(create_cifti_cmd, check=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "66ec70dc-b99d-4b39-ab41-f895c741d865", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjectsessionsmoothingsurroundedxyzclust_sizeclust_areapeak_valpeak_idxduppeak_ixout_dirtarget_pathtarget_path_existmagn_pathmagn_path_existnorm_pathnorm_path_existoptmat_pathoptmat_path_existbxbybzbxvbyvbzv
30245462.02.55True-43.70575029.62326417.478905430.01456.145457-0.17275318491.0False2.0/data/EDB/TMSpilot/derivatives/contarg_liston/...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
28245461.02.55True-42.79394932.5621831.802103449.01528.671366-0.42659211680.0False3.0/data/EDB/TMSpilot/derivatives/contarg_liston/...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
0245631.02.55True-49.70037133.9024354.797913197.0778.371342-0.09210411628.0False12.0/data/EDB/TMSpilot/derivatives/contarg_liston/.../data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-60.627038.162123.2218[-0.5808, -0.2221, -0.7832][0.3102, 0.8291, -0.4652][0.7527, -0.5131, -0.4126]
2245632.02.55True-31.75648950.2974599.358648442.01668.665725-0.17057727869.0False15.0/data/EDB/TMSpilot/derivatives/contarg_liston/.../data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-63.477543.11046.5662[-0.3851, -0.2188, -0.8966][0.4306, 0.8166, -0.3843][0.8163, -0.5341, -0.2202]
4245731.02.55True-49.58886728.18038010.502846449.01529.054625-0.24922118782.0False16.0/data/EDB/TMSpilot/derivatives/contarg_liston/.../data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-69.148336.468918.9200[0.3311, 0.3169, 0.8888][-0.2699, -0.8707, 0.411][0.9042, -0.376, -0.2027]
6245732.02.55True-45.19562136.95193920.256920377.01297.729352-0.23170830093.0False18.0/data/EDB/TMSpilot/derivatives/contarg_liston/.../data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-61.368633.311629.3624[0.2624, 0.9028, -0.3406][0.5319, 0.1592, 0.8317][0.8051, -0.3994, -0.4384]
8247041.02.55True-45.10438521.69463015.98293071.0204.576727-0.09763518819.0False21.0/data/EDB/TMSpilot/derivatives/contarg_liston/.../data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-61.926042.301017.5520[-0.060215, 0.37979, -0.92311][0.49493, 0.81446, 0.30281][0.86684, -0.43864, -0.23701]
10247042.02.55True-41.28785334.67087214.712914380.01241.553549-0.26882318831.0False23.0/data/EDB/TMSpilot/derivatives/contarg_liston/.../data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-60.967238.128818.2612[0.5034, 0.8607, 0.0767][0.2512, -0.2306, 0.9401][0.8268, -0.4539, -0.3322]
14247182.02.55True-47.98239531.66705913.200858489.01783.647283-0.16692918829.0False25.0/data/EDB/TMSpilot/derivatives/contarg_liston/...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
12247181.02.55True-47.63040928.73361816.150019431.01601.702150-0.23096518871.0False26.0/data/EDB/TMSpilot/derivatives/contarg_liston/.../data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-58.492150.729711.4069[-0.314, 0.0, -0.9494][0.564, 0.8044, -0.1865][0.7637, -0.5941, -0.2526]
20247401.02.55True-49.49755128.4966818.542181348.01074.800241-0.26174018872.0False32.0/data/EDB/TMSpilot/derivatives/contarg_liston/...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22247402.02.55True-44.00366231.0623466.935799310.0959.633921-0.34227118831.0False34.0/data/EDB/TMSpilot/derivatives/contarg_liston/...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
26247422.02.55True-42.95192338.8635337.580543375.01347.351563-0.32543218399.0False36.0/data/EDB/TMSpilot/derivatives/contarg_liston/...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
24247421.02.55True-39.38139040.1248405.175869346.01229.848826-0.34835618401.0False38.0/data/EDB/TMSpilot/derivatives/contarg_liston/...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-57.618050.95907.9948[0.023561, 0.38272, -0.92356][0.68931, 0.66289, 0.29228][0.72409, -0.64351, -0.24819]
3NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-48.813260.673914.1050[-0.4216, -0.065, -0.9045][0.585, 0.7427, -0.326][0.6929, -0.6665, -0.2751]
5NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-58.724348.476730.0104[0.2646, 0.8058, -0.5298][0.5989, 0.2933, 0.7452][0.7558, -0.5145, -0.405]
7NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-61.102038.280025.3440[-0.58523, -0.52341, -0.61932][0.033511, 0.7475, -0.66341][0.81018, -0.409, -0.41992]
9NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-61.863639.634922.2807[0.1028, 0.6926, -0.7139][0.5067, 0.5812, 0.6368][0.856, -0.4272, -0.2912]
11NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-59.592240.913117.4935[0.5244, 0.8365, 0.1591][0.2034, -0.3045, 0.9306][0.8268, -0.4557, -0.3298]
13NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True/data/EDB/TMSpilot/derivatives/contarg_liston/...True-57.487253.64037.5623[0.1344, 0.5135, -0.8475][0.635, 0.612, 0.4715][0.7608, -0.6015, -0.2438]
\n", + "
" + ], + "text/plain": [ + " subject session smoothing surrounded x y z \\\n", + "30 24546 2.0 2.55 True -43.705750 29.623264 17.478905 \n", + "28 24546 1.0 2.55 True -42.793949 32.562183 1.802103 \n", + "0 24563 1.0 2.55 True -49.700371 33.902435 4.797913 \n", + "2 24563 2.0 2.55 True -31.756489 50.297459 9.358648 \n", + "4 24573 1.0 2.55 True -49.588867 28.180380 10.502846 \n", + "6 24573 2.0 2.55 True -45.195621 36.951939 20.256920 \n", + "8 24704 1.0 2.55 True -45.104385 21.694630 15.982930 \n", + "10 24704 2.0 2.55 True -41.287853 34.670872 14.712914 \n", + "14 24718 2.0 2.55 True -47.982395 31.667059 13.200858 \n", + "12 24718 1.0 2.55 True -47.630409 28.733618 16.150019 \n", + "20 24740 1.0 2.55 True -49.497551 28.496681 8.542181 \n", + "22 24740 2.0 2.55 True -44.003662 31.062346 6.935799 \n", + "26 24742 2.0 2.55 True -42.951923 38.863533 7.580543 \n", + "24 24742 1.0 2.55 True -39.381390 40.124840 5.175869 \n", + "1 NaN NaN NaN NaN NaN NaN NaN \n", + "3 NaN NaN NaN NaN NaN NaN NaN \n", + "5 NaN NaN NaN NaN NaN NaN NaN \n", + "7 NaN NaN NaN NaN NaN NaN NaN \n", + "9 NaN NaN NaN NaN NaN NaN NaN \n", + "11 NaN NaN NaN NaN NaN NaN NaN \n", + "13 NaN NaN NaN NaN NaN NaN NaN \n", + "\n", + " clust_size clust_area peak_val peak_idx dup peak_ix \\\n", + "30 430.0 1456.145457 -0.172753 18491.0 False 2.0 \n", + "28 449.0 1528.671366 -0.426592 11680.0 False 3.0 \n", + "0 197.0 778.371342 -0.092104 11628.0 False 12.0 \n", + "2 442.0 1668.665725 -0.170577 27869.0 False 15.0 \n", + "4 449.0 1529.054625 -0.249221 18782.0 False 16.0 \n", + "6 377.0 1297.729352 -0.231708 30093.0 False 18.0 \n", + "8 71.0 204.576727 -0.097635 18819.0 False 21.0 \n", + "10 380.0 1241.553549 -0.268823 18831.0 False 23.0 \n", + "14 489.0 1783.647283 -0.166929 18829.0 False 25.0 \n", + "12 431.0 1601.702150 -0.230965 18871.0 False 26.0 \n", + "20 348.0 1074.800241 -0.261740 18872.0 False 32.0 \n", + "22 310.0 959.633921 -0.342271 18831.0 False 34.0 \n", + "26 375.0 1347.351563 -0.325432 18399.0 False 36.0 \n", + "24 346.0 1229.848826 -0.348356 18401.0 False 38.0 \n", + "1 NaN NaN NaN NaN NaN NaN \n", + "3 NaN NaN NaN NaN NaN NaN \n", + "5 NaN NaN NaN NaN NaN NaN \n", + "7 NaN NaN NaN NaN NaN NaN \n", + "9 NaN NaN NaN NaN NaN NaN \n", + "11 NaN NaN NaN NaN NaN NaN \n", + "13 NaN NaN NaN NaN NaN NaN \n", + "\n", + " out_dir \\\n", + "30 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "28 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "0 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "2 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "4 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "6 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "8 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "10 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "14 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "12 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "20 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "22 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "26 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "24 /data/EDB/TMSpilot/derivatives/contarg_liston/... \n", + "1 NaN \n", + "3 NaN \n", + "5 NaN \n", + "7 NaN \n", + "9 NaN \n", + "11 NaN \n", + "13 NaN \n", + "\n", + " target_path target_path_exist \\\n", + "30 NaN NaN \n", + "28 NaN NaN \n", + "0 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "2 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "4 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "6 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "8 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "10 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "14 NaN NaN \n", + "12 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "20 NaN NaN \n", + "22 NaN NaN \n", + "26 NaN NaN \n", + "24 NaN NaN \n", + "1 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "3 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "5 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "7 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "9 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "11 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "13 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "\n", + " magn_path magn_path_exist \\\n", + "30 NaN NaN \n", + "28 NaN NaN \n", + "0 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "2 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "4 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "6 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "8 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "10 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "14 NaN NaN \n", + "12 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "20 NaN NaN \n", + "22 NaN NaN \n", + "26 NaN NaN \n", + "24 NaN NaN \n", + "1 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "3 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "5 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "7 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "9 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "11 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "13 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "\n", + " norm_path norm_path_exist \\\n", + "30 NaN NaN \n", + "28 NaN NaN \n", + "0 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "2 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "4 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "6 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "8 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "10 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "14 NaN NaN \n", + "12 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "20 NaN NaN \n", + "22 NaN NaN \n", + "26 NaN NaN \n", + "24 NaN NaN \n", + "1 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "3 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "5 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "7 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "9 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "11 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "13 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "\n", + " optmat_path optmat_path_exist \\\n", + "30 NaN NaN \n", + "28 NaN NaN \n", + "0 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "2 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "4 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "6 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "8 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "10 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "14 NaN NaN \n", + "12 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "20 NaN NaN \n", + "22 NaN NaN \n", + "26 NaN NaN \n", + "24 NaN NaN \n", + "1 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "3 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "5 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "7 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "9 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "11 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "13 /data/EDB/TMSpilot/derivatives/contarg_liston/... True \n", + "\n", + " bx by bz bxv \\\n", + "30 NaN NaN NaN NaN \n", + "28 NaN NaN NaN NaN \n", + "0 -60.6270 38.1621 23.2218 [-0.5808, -0.2221, -0.7832] \n", + "2 -63.4775 43.1104 6.5662 [-0.3851, -0.2188, -0.8966] \n", + "4 -69.1483 36.4689 18.9200 [0.3311, 0.3169, 0.8888] \n", + "6 -61.3686 33.3116 29.3624 [0.2624, 0.9028, -0.3406] \n", + "8 -61.9260 42.3010 17.5520 [-0.060215, 0.37979, -0.92311] \n", + "10 -60.9672 38.1288 18.2612 [0.5034, 0.8607, 0.0767] \n", + "14 NaN NaN NaN NaN \n", + "12 -58.4921 50.7297 11.4069 [-0.314, 0.0, -0.9494] \n", + "20 NaN NaN NaN NaN \n", + "22 NaN NaN NaN NaN \n", + "26 NaN NaN NaN NaN \n", + "24 NaN NaN NaN NaN \n", + "1 -57.6180 50.9590 7.9948 [0.023561, 0.38272, -0.92356] \n", + "3 -48.8132 60.6739 14.1050 [-0.4216, -0.065, -0.9045] \n", + "5 -58.7243 48.4767 30.0104 [0.2646, 0.8058, -0.5298] \n", + "7 -61.1020 38.2800 25.3440 [-0.58523, -0.52341, -0.61932] \n", + "9 -61.8636 39.6349 22.2807 [0.1028, 0.6926, -0.7139] \n", + "11 -59.5922 40.9131 17.4935 [0.5244, 0.8365, 0.1591] \n", + "13 -57.4872 53.6403 7.5623 [0.1344, 0.5135, -0.8475] \n", + "\n", + " byv bzv \n", + "30 NaN NaN \n", + "28 NaN NaN \n", + "0 [0.3102, 0.8291, -0.4652] [0.7527, -0.5131, -0.4126] \n", + "2 [0.4306, 0.8166, -0.3843] [0.8163, -0.5341, -0.2202] \n", + "4 [-0.2699, -0.8707, 0.411] [0.9042, -0.376, -0.2027] \n", + "6 [0.5319, 0.1592, 0.8317] [0.8051, -0.3994, -0.4384] \n", + "8 [0.49493, 0.81446, 0.30281] [0.86684, -0.43864, -0.23701] \n", + "10 [0.2512, -0.2306, 0.9401] [0.8268, -0.4539, -0.3322] \n", + "14 NaN NaN \n", + "12 [0.564, 0.8044, -0.1865] [0.7637, -0.5941, -0.2526] \n", + "20 NaN NaN \n", + "22 NaN NaN \n", + "26 NaN NaN \n", + "24 NaN NaN \n", + "1 [0.68931, 0.66289, 0.29228] [0.72409, -0.64351, -0.24819] \n", + "3 [0.585, 0.7427, -0.326] [0.6929, -0.6665, -0.2751] \n", + "5 [0.5989, 0.2933, 0.7452] [0.7558, -0.5145, -0.405] \n", + "7 [0.033511, 0.7475, -0.66341] [0.81018, -0.409, -0.41992] \n", + "9 [0.5067, 0.5812, 0.6368] [0.856, -0.4272, -0.2912] \n", + "11 [0.2034, -0.3045, 0.9306] [0.8268, -0.4557, -0.3298] \n", + "13 [0.635, 0.612, 0.4715] [0.7608, -0.6015, -0.2438] " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bgs_peak_stats" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "fc5d971d-eb69-4c6c-97d6-c2519997a0b4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "cifti_outs = []\n", + "cifti_idxs = []\n", + "for subject, df in bgs_peak_stats.groupby('subject'):\n", + " sim_dir = df.iloc[0].out_dir.parent\n", + " cifti_out = sim_dir / f'sub-{subject}_space-fsLR_den-32k_desc-magnE_stat.dtseries.nii'\n", + " assert cifti_out.exists()\n", + " map_idx = -1\n", + " for ix,row in df.iterrows():\n", + " if not row.dup:\n", + " map_idx += 1\n", + "\n", + " cifti_outs.append(cifti_out)\n", + " cifti_idxs.append(map_idx)\n", + "bgs_peak_stats['magnE_path'] = cifti_outs\n", + "bgs_peak_stats['magnE_idx'] = cifti_idxs" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "d24e3e93-4c9a-4a0c-a427-a45912fceec7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "sn_xs = []\n", + "sn_ys = []\n", + "sn_zs = []\n", + "s_idxses = []\n", + "current_subject = None\n", + "for ix, row in bgs_peak_stats.iterrows():\n", + " subject = row.subject\n", + " if current_subject != subject:\n", + " src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k/'\n", + " surfaces = load_liston_surfs(subject, src_surf_dir)\n", + " \n", + " targets_path = anat_dir / f'sub-{subject}/Simulation/alternate_targeting-00/sub-{subject}_space-fsLR_den-32k_desc-target_stat.dtseries.nii'\n", + " targets_img = ci.load(targets_path)\n", + " targets = targets_img.get_fdata()\n", + " l_targets = surf_data_from_cifti(targets, targets_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT').T\n", + " sn_idxs = np.array([np.nonzero([lt == lt.max()])[1] for lt in l_targets]).squeeze()\n", + " sn_idxs = sn_idxs.reshape(-1,1)\n", + " sn_targets = np.array([surfaces.l.midthickness.points[lt == lt.max()] for lt in l_targets]).squeeze()\n", + " sn_targets = sn_targets.reshape(-1,3)\n", + " current_subject = subject\n", + " s_idxses.append(sn_idxs[row.magnE_idx, 0])\n", + " sn_xs.append(sn_targets[row.magnE_idx, 0])\n", + " sn_ys.append(sn_targets[row.magnE_idx, 1])\n", + " sn_zs.append(sn_targets[row.magnE_idx, 2]) \n", + "\n", + "bgs_peak_stats['s_idx'] = s_idxses\n", + "bgs_peak_stats['s_x'] = sn_xs\n", + "bgs_peak_stats['s_y'] = sn_ys\n", + "bgs_peak_stats['s_z'] = sn_zs\n", + "bgs_peak_stats['miss'] = ~((bgs_peak_stats.x == bgs_peak_stats.s_x) & (bgs_peak_stats.y == bgs_peak_stats.s_y) & (bgs_peak_stats.z == bgs_peak_stats.s_z))\n", + "bgs_peak_stats['z_angle'] = np.array([angle_between(sy, [0, 1]) for sy in bgs_peak_stats.byv.str[1:]])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 238, + "id": "67d789d6-5120-44cb-99b7-e692ca1d63f6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "for subject, df in bgs_peak_stats.groupby('subject'):\n", + " sim_dir = anat_dir / f'sub-{subject}/Simulation/alternate_targeting-00'\n", + " tmp = df.loc[~df.dup].copy()\n", + " tmp['index'] = tmp.magnE_idx\n", + " tmp = tmp.set_index('index')\n", + " tmp.index.name=None\n", + " tmp.to_pickle(sim_dir / f'sub-{subject}_simulations.pkl.gz')" + ] + }, + { + "cell_type": "markdown", + "id": "f687dcb4-1ac3-4d61-844a-7d316d82181b", + "metadata": {}, + "source": [ + "## Run positional uncertainty sims for Restricted targets" + ] + }, + { + "cell_type": "code", + "execution_count": 239, + "id": "ad4c37dd-231f-4bf0-a2c4-23f7b261b875", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "dist_std = 2\n", + "angle_std = 2.5" + ] + }, + { + "cell_type": "code", + "execution_count": 240, + "id": "25adcef0-e421-4c52-bdf4-def94f31ca2d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "anat_dir = Path('/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/')\n", + "\n", + "\n", + "coil='MagVenture_MCF-B65.ccd'\n", + "\n", + "if not Path(coil).exists():\n", + " simnibs_coil_dir = Path(resource_filename('simnibs', 'resources/coil_models'))\n", + " coil_path = simnibs_coil_dir / f'Drakaki_BrainStim_2022/{coil}'\n", + " if not coil_path.exists():\n", + " coil_path = simnibs_coil_dir / f'legacy_and_other/{coil}'\n", + " if not coil_path.exists():\n", + " raise FileNotFoundError(f\"Could not find coil ({coil}) in {simnibs_coil_dir}.\")\n", + "else:\n", + " coil_path = Path(coil)\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 241, + "id": "17b9257a-2dfb-4872-97fd-e1f73c0bdd46", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "nsims = 1000\n", + "uncert_deviations_path = anat_dir / f'uncert_deviations{nsims}.npy'\n", + "if not uncert_deviations_path.exists():\n", + " uncert_deviations = make_uncert_sims(5, nsims, dist_std, angle_std)\n", + " np.save(uncert_deviations_path, uncert_deviations)\n", + "vine = get_prob_vine(4, dist_std, angle_std)" + ] + }, + { + "cell_type": "code", + "execution_count": 242, + "id": "12bafe92-f9e2-453d-a5df-0990e4da8016", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "jobs = []\n", + "for subject in subjects:\n", + " sim_dir = Path(anat_dir / f'sub-{subject}/Simulation/alternate_targeting-00')\n", + " headmodel_dir = anat_dir / f'sub-{subject}/HeadModel'\n", + " jobs.append(delayed(setup_uncert_sims)(headmodel_dir, sim_dir, dist_std=dist_std, angle_std=angle_std, outname=f'uncert{nsims}', uncert_deviations_path=uncert_deviations_path, overwrite=True))\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 244, + "id": "424385d4-654b-4d44-b5c7-d523572941dd", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=8)]: Using backend LokyBackend with 8 concurrent workers.\n", + "[Parallel(n_jobs=8)]: Done 3 out of 10 | elapsed: 23.7s remaining: 55.4s\n", + "[Parallel(n_jobs=8)]: Done 5 out of 10 | elapsed: 26.4s remaining: 26.4s\n", + "[Parallel(n_jobs=8)]: Done 7 out of 10 | elapsed: 27.1s remaining: 11.6s\n", + "[Parallel(n_jobs=8)]: Done 10 out of 10 | elapsed: 39.3s finished\n" + ] + } + ], + "source": [ + "all_settings = Parallel(n_jobs=8, verbose=10)(jobs)" + ] + }, + { + "cell_type": "code", + "execution_count": 245, + "id": "b3619adb-717d-40ce-86dd-d8dced3bcbdd", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Calculating settings for 3 simulations.\n", + "0, Calculating settings for 4 simulations.\n", + "0, Calculating settings for 4 simulations.\n", + "0, Calculating settings for 4 simulations.\n", + "0, Calculating settings for 4 simulations.\n", + "0, Calculating settings for 4 simulations.\n", + "0, Calculating settings for 2 simulations.\n", + "0, Calculating settings for 4 simulations.\n", + "0, Calculating settings for 3 simulations.\n", + "0, Calculating settings for 4 simulations.\n", + "0, " + ] + } + ], + "source": [ + "overwrite=True" + ] + }, + { + "cell_type": "code", + "execution_count": 247, + "id": "80007597-163f-46da-a271-e6baef2530b2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "cmds = []\n", + "for (subject, settings_path) in zip(subjects, all_settings):\n", + " settings = pd.read_pickle(settings_path)\n", + " settings = pd.read_pickle(settings_path)\n", + " sim_dir = anat_dir / f'sub-{subject}/Simulation/alternate_targeting-00'\n", + " df = pd.read_pickle(sim_dir / f'sub-{subject}_simulations.pkl.gz')\n", + " settings['oix'] = settings.oix.replace({oix:mix for oix, mix in zip(settings.oix.unique(), df.magnE_idx.unique())})\n", + " settings.to_pickle(settings_path)\n", + " for oix in sorted(settings.oix.unique()):\n", + " sim_dir = Path(anat_dir / f'sub-{subject}/Simulation/alternate_targeting-00')\n", + " \n", + " HeadModel_dir = anat_dir / f'sub-{subject}/HeadModel'\n", + " try:\n", + " m2m_dir = sorted(HeadModel_dir.glob('m2m*'))[0]\n", + " except IndexError:\n", + " raise FileNotFoundError(f\"No m2m directory found in {HeadModel_dir}\")\n", + " headmesh_path = m2m_dir / f'{subject}.msh'\n", + " \n", + " uncert_dir = settings_path.parent\n", + " uncert_out = uncert_dir / f'oix-{oix:04d}_stat-abovethreshactprobs_magnE.nii.gz'\n", + " if not uncert_out.exists() or overwrite:\n", + " cmd = [\n", + " 'contarg',\n", + " 'normgrid',\n", + " 'sim-uncert',\n", + " '--headmesh-path',\n", + " headmesh_path.as_posix(),\n", + " '--settings-path',\n", + " settings_path.as_posix(),\n", + " '--ix',\n", + " f'{oix}',\n", + " '--coil-path',\n", + " coil_path.as_posix(),\n", + " '--tmp-dir',\n", + " f'/lscratch/$SLURM_JOB_ID/uncertsim-{oix}',\n", + " '--out-dir',\n", + " settings_path.parent.as_posix(),\n", + " '--njobs',\n", + " f'20'\n", + " ]\n", + " cmds.append(' '.join(cmd))" + ] + }, + { + "cell_type": "code", + "execution_count": 248, + "id": "85df9290-2221-48d0-a7a8-317f50ae998e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "liston_dir = Path('/data/EDB/TMSpilot/liston/')\n", + "swarm_cmd_dir = liston_dir/'swarm/swarm_cmds'\n", + "swarm_cmd_dir.mkdir(exist_ok=True, parents=True)\n", + "swarm_log_dir = liston_dir/'swarm/swarm_log'\n", + "swarm_log_dir.mkdir(exist_ok=True, parents=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 249, + "id": "dec721dd-3e99-4ad8-a51e-ff2c832d773c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['13462406']\n" + ] + } + ], + "source": [ + "if len(cmds) > 0:\n", + " swarm_cmd_file = swarm_cmd_dir / 'uncert_sims'\n", + " swarm_cmd_file.write_text('\\n'.join(cmds))\n", + " run_name = 'uncert_sims'\n", + " jobid = ! swarm -f {swarm_cmd_file} -g 100 -t 22 --gres=lscratch:400 --module matlab,freesurfer/6.0,fsl,simnibs/4.0,connectome-workbench,openblas --time 3:00:00 --logdir {swarm_log_dir} --job-name {run_name} --partition norm\n", + " print(jobid)" + ] + }, + { + "cell_type": "code", + "execution_count": 397, + "id": "de322fd0-e47d-4e36-a1da-fdf8095ee4fb", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def make_uncert_surfaces(subject, src_surf_dir, uncert_dir, overwrite=False):\n", + " \n", + " surfaces = load_liston_surfs(subject, src_surf_dir)\n", + "\n", + " medial_wall = {}\n", + " medial_wall['l'] = templateflow.api.get(template='fsLR', density='32k', desc='nomedialwall', hemi='L')\n", + " medial_wall['r'] = templateflow.api.get(template='fsLR', density='32k', desc='nomedialwall', hemi='R')\n", + " \n", + " catted_means = uncert_dir / f\"sub-{subject}_desc-magnEmean_stat.nii.gz\"\n", + " if not catted_means.exists() or overwrite:\n", + " cmd = [\n", + " \"3dTcat\",\n", + " \"-overwrite\",\n", + " \"-prefix\",\n", + " catted_means,\n", + " f\"{uncert_dir.as_posix()}/*mean_magnE.nii.gz\"\n", + " ]\n", + " subprocess.run(cmd, check=True)\n", + " \n", + " catted_stds = uncert_dir / f\"sub-{subject}_desc-magnEstd_stat.nii.gz\"\n", + " if not catted_stds.exists() or overwrite:\n", + " cmd = [\n", + " \"3dTcat\",\n", + " \"-overwrite\",\n", + " \"-prefix\",\n", + " catted_stds,\n", + " f\"{uncert_dir.as_posix()}/*std_magnE.nii.gz\"\n", + " ]\n", + " subprocess.run(cmd, check=True)\n", + " \n", + " catted_counts = uncert_dir / f\"sub-{subject}_desc-abovethreshactprobs_stat.nii.gz\"\n", + " if not catted_counts.exists() or overwrite:\n", + " cmd = [\n", + " \"3dTcat\",\n", + " \"-overwrite\",\n", + " \"-prefix\",\n", + " catted_counts,\n", + " f\"{uncert_dir.as_posix()}/*abovethreshactprobs_magnE.nii.gz\"\n", + " ]\n", + " subprocess.run(cmd, check=True)\n", + " \n", + " cifti_outs = [] \n", + " for metric_path in [catted_means, catted_stds, catted_counts]:\n", + " cifti_out = metric_path.as_posix().replace(\".nii.gz\", \".dtseries.nii\").replace(\"_desc-\", \"_space-fsLR_den-32k_desc-\")\n", + " if not Path(cifti_out).exists() or overwrite:\n", + " l_out_gifti = metric_path.as_posix().replace(\".nii.gz\", \".shape.gii\").replace(\"_desc-\", \"_hemi-L_space-fsLR_den-32k_desc-\")\n", + " l_v2s_cmd = [\n", + " 'wb_command',\n", + " '-volume-to-surface-mapping',\n", + " metric_path.as_posix(),\n", + " surfaces.l.midthickness.path,\n", + " l_out_gifti,\n", + " '-ribbon-constrained',\n", + " surfaces.l.white.path,\n", + " surfaces.l.pial.path,\n", + " ]\n", + " subprocess.run(l_v2s_cmd, check=True)\n", + "\n", + " l_metricmask_cmd = [\n", + " 'wb_command',\n", + " '-metric-mask',\n", + " l_out_gifti,\n", + " medial_wall['l'],\n", + " l_out_gifti\n", + " ]\n", + " subprocess.run(l_metricmask_cmd, check=True)\n", + "\n", + "\n", + " r_out_gifti = metric_path.as_posix().replace(\".nii.gz\", \".shape.gii\").replace(\"_desc-\", \"_hemi-R_space-fsLR_den-32k_desc-\")\n", + " r_v2s_cmd = [\n", + " 'wb_command',\n", + " '-volume-to-surface-mapping',\n", + " metric_path.as_posix(),\n", + " surfaces.r.midthickness.path,\n", + " r_out_gifti,\n", + " '-ribbon-constrained',\n", + " surfaces.r.white.path,\n", + " surfaces.r.pial.path,\n", + " ]\n", + " subprocess.run(r_v2s_cmd, check=True)\n", + "\n", + " r_metricmask_cmd = [\n", + " 'wb_command',\n", + " '-metric-mask',\n", + " r_out_gifti,\n", + " medial_wall['r'],\n", + " r_out_gifti\n", + " ]\n", + " subprocess.run(r_metricmask_cmd, check=True)\n", + "\n", + " create_cifti_cmd = [\n", + " 'wb_command',\n", + " '-cifti-create-dense-timeseries',\n", + " cifti_out,\n", + " '-left-metric',\n", + " l_out_gifti,\n", + " '-roi-left',\n", + " medial_wall['l'],\n", + " '-right-metric',\n", + " r_out_gifti,\n", + " '-roi-right',\n", + " medial_wall['r'],\n", + " ]\n", + " subprocess.run(create_cifti_cmd, check=True)\n", + " cifti_outs.append(cifti_out)\n", + " return cifti_outs" + ] + }, + { + "cell_type": "code", + "execution_count": 398, + "id": "603670e8-e170-4e1e-9e51-81a0b74adb76", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "\n", + "jobs = []\n", + "for (subject, settings_path) in zip(subjects, all_settings):\n", + " src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k/'\n", + " uncert_dir = settings_path.parent\n", + " jobs.append(delayed(make_uncert_surfaces)(subject, src_surf_dir, uncert_dir, overwrite=True))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 399, + "id": "5630846c-3f67-43c9-a88b-85af2196f6a6", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Parallel(n_jobs=20)]: Using backend LokyBackend with 20 concurrent workers.\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866057943 (866 million) bytes long!\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866058271 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866058602 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866058930 (866 million) bytes long!\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866059261 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866059589 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866059917 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866060245 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866060573 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866060901 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.5 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866061232 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.3 s\n", + "++ elapsed time = 2.4 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866061558 (866 million) bytes long!\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866061884 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866062213 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866062542 (866 million) bytes long!\n", + "++ elapsed time = 3.1 s\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866062868 (866 million) bytes long!\n", + "++ elapsed time = 3.2 s\n", + "++ elapsed time = 3.2 s\n", + "++ elapsed time = 3.2 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866063194 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.9 s\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866063520 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866063846 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866064172 (866 million) bytes long!\n", + "++ elapsed time = 1.5 s\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866064501 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 1.0 s\n", + "++ elapsed time = 2.2 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866064854 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.3 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866065207 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866065563 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.9 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866065919 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.9 s\n", + "++ elapsed time = 1.5 s\n", + "++ elapsed time = 3.1 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866066272 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866066628 (866 million) bytes long!\n", + "++ elapsed time = 1.5 s\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 3.1 s\n", + "++ elapsed time = 3.1 s\n", + "++ elapsed time = 3.1 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866066981 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866067334 (866 million) bytes long!\n", + "++ 3dTcat: AFNI version=AFNI_23.3.09 (Nov 22 2023) [64-bit]\n", + "++ WARNING: file /home/nielsond/.afni.log is now 866067687 (866 million) bytes long!\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "\u001b[7m*+ WARNING:\u001b[0m Set TR of output dataset to 1.0 s\n", + "++ elapsed time = 2.1 s\n", + "++ elapsed time = 2.1 s\n", + "++ elapsed time = 2.1 s\n", + "++ elapsed time = 2.0 s\n", + "++ elapsed time = 2.2 s\n", + "++ elapsed time = 2.1 s\n", + "++ elapsed time = 2.1 s\n", + "[Parallel(n_jobs=20)]: Done 3 out of 10 | elapsed: 16.9min remaining: 39.4min\n", + "[Parallel(n_jobs=20)]: Done 5 out of 10 | elapsed: 17.4min remaining: 17.4min\n", + "[Parallel(n_jobs=20)]: Done 7 out of 10 | elapsed: 18.3min remaining: 7.9min\n", + "[Parallel(n_jobs=20)]: Done 10 out of 10 | elapsed: 19.6min finished\n" + ] + }, + { + "data": { + "text/plain": [ + "[['/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24563/Simulation/alternate_targeting-00/uncert1000/sub-24563_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24563/Simulation/alternate_targeting-00/uncert1000/sub-24563_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24563/Simulation/alternate_targeting-00/uncert1000/sub-24563_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'],\n", + " ['/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24573/Simulation/alternate_targeting-00/uncert1000/sub-24573_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24573/Simulation/alternate_targeting-00/uncert1000/sub-24573_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24573/Simulation/alternate_targeting-00/uncert1000/sub-24573_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'],\n", + " ['/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24704/Simulation/alternate_targeting-00/uncert1000/sub-24704_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24704/Simulation/alternate_targeting-00/uncert1000/sub-24704_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24704/Simulation/alternate_targeting-00/uncert1000/sub-24704_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'],\n", + " ['/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24718/Simulation/alternate_targeting-00/uncert1000/sub-24718_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24718/Simulation/alternate_targeting-00/uncert1000/sub-24718_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24718/Simulation/alternate_targeting-00/uncert1000/sub-24718_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'],\n", + " ['/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-247183/Simulation/alternate_targeting-00/uncert1000/sub-247183_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-247183/Simulation/alternate_targeting-00/uncert1000/sub-247183_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-247183/Simulation/alternate_targeting-00/uncert1000/sub-247183_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'],\n", + " ['/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24740/Simulation/alternate_targeting-00/uncert1000/sub-24740_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24740/Simulation/alternate_targeting-00/uncert1000/sub-24740_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24740/Simulation/alternate_targeting-00/uncert1000/sub-24740_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'],\n", + " ['/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24742/Simulation/alternate_targeting-00/uncert1000/sub-24742_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24742/Simulation/alternate_targeting-00/uncert1000/sub-24742_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24742/Simulation/alternate_targeting-00/uncert1000/sub-24742_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'],\n", + " ['/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24546/Simulation/alternate_targeting-00/uncert1000/sub-24546_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24546/Simulation/alternate_targeting-00/uncert1000/sub-24546_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-24546/Simulation/alternate_targeting-00/uncert1000/sub-24546_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'],\n", + " ['/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-245461/Simulation/alternate_targeting-00/uncert1000/sub-245461_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-245461/Simulation/alternate_targeting-00/uncert1000/sub-245461_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-245461/Simulation/alternate_targeting-00/uncert1000/sub-245461_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'],\n", + " ['/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-245462/Simulation/alternate_targeting-00/uncert1000/sub-245462_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-245462/Simulation/alternate_targeting-00/uncert1000/sub-245462_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii',\n", + " '/data/EDB/TMSpilot/derivatives/contarg_liston/anat_preproc/sub-245462/Simulation/alternate_targeting-00/uncert1000/sub-245462_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii']]" + ] + }, + "execution_count": 399, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Parallel(n_jobs=20, verbose=10)(jobs)" + ] + }, + { + "cell_type": "markdown", + "id": "c6659ea6-7908-473a-bcd7-6a766375f00a", + "metadata": { + "tags": [] + }, + "source": [ + "### Get stats on each location" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "65fe859e-b8f7-4915-b58b-93cef772b1bd", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "alt_pl_cols = [\n", + "'bx', 'by', 'bz', \n", + "'bxv', 'byv', 'bzv','z_angle',\n", + "'s_idx', 's_x', 's_y', 's_z','s_idx'\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "a3d64c4b-d689-4db8-95be-5f76be284bd0", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "alt_stim_stats = []\n", + "min_mt = []\n", + "for subject in subjects:\n", + " src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k/'\n", + " headmodel_dir = anat_dir /f'sub-{subject}/HeadModel'\n", + " sim_out_dir = anat_dir / f'sub-{subject}/Simulation'\n", + " sim_dir = sorted(sim_out_dir.glob('alternate_targeting-*'))[-1]\n", + "\n", + " uncert_dir = sim_dir / f'uncert{uncert_n}'\n", + " if not uncert_dir.exists():\n", + " raise FileNotFoundError(uncert_dir)\n", + "\n", + " # load surfaces\n", + " surfaces = load_liston_surfs(subject, src_surf_dir)\n", + "\n", + " scalp_path = headmodel_dir / f'm2m_{subject}/Skin.surf.gii'\n", + " scalp_points, scalp_triangles = nb.load(scalp_path).agg_data()\n", + " scalp_G = graph_from_triangles(scalp_triangles)\n", + " scalp = Surface(scalp_path, scalp_points, scalp_triangles, scalp_G, np.arange(len(scalp_points)).astype(int))\n", + "\n", + " stimroi_mask = get_stimroi_path(stimroi, cifti=True)\n", + " stim_roi = SurfROI(surfaces.l.midthickness.path, 'left', roi=stimroi_mask)\n", + " \n", + " # load mean map\n", + " magne_path = uncert_dir / f'sub-{subject}_space-fsLR_den-32k_desc-magnEmean_stat.dtseries.nii'\n", + " magne_img = ci.load(magne_path)\n", + " all_magne = magne_img.get_fdata()\n", + " l_magne = surf_data_from_cifti(all_magne, magne_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + " all_magne = all_magne.T\n", + " l_mt = (l_magne / all_magne.max(0)) * maxMT\n", + " l_percentile = np.argsort(np.argsort(l_magne, axis=None), axis=None).reshape(l_magne.shape)\n", + " l_percentile = (l_percentile / (np.product(l_magne.shape) - 1)) * 100\n", + "\n", + " #load std map\n", + " std_path = uncert_dir / f'sub-{subject}_space-fsLR_den-32k_desc-magnEstd_stat.dtseries.nii'\n", + " std_img = ci.load(std_path)\n", + " all_std = std_img.get_fdata()\n", + " l_std = surf_data_from_cifti(all_std, std_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + " all_std = all_std.T\n", + " l_mt_std = (l_std / all_magne.max(0)) * maxMT\n", + " \n", + " #load prob map\n", + " ap_path = uncert_dir / f'sub-{subject}_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'\n", + " ap_img = ci.load(ap_path)\n", + " all_ap = ap_img.get_fdata()\n", + " l_ap = surf_data_from_cifti(all_ap, ap_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + " all_ap = all_ap.T\n", + "\n", + " # load va map\n", + " va_path = src_surf_dir / f'sub-{subject}.midthickness_va.32k_fs_LR.dscalar.nii'\n", + " va_img = ci.load(va_path)\n", + " all_va = va_img.get_fdata()\n", + " l_va = surf_data_from_cifti(all_va, va_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + " \n", + " # find vals significantly above minimum\n", + " zvals = np.zeros(l_mt.shape)\n", + " zvals[l_mt != 0] = (l_mt[l_mt != 0] - min_mt_thresh) / l_mt_std[l_mt != 0]\n", + " # zdist = stats.norm()\n", + " # pvals = zdist.sf(zvals)\n", + " # sigs = pvals < 0.5\n", + " sigs = l_ap > 0\n", + "\n", + " zvals = zvals.T\n", + " sigs = sigs.T\n", + " \n", + " pos_list = pd.read_pickle(sim_dir / f'sub-{subject}_simulations.pkl.gz')\n", + " pos_list['pos_ix'] = pos_list.magnE_idx\n", + " \n", + " # find ids for everything significantly above minimum\n", + " pos_iidxs = []\n", + " for (pos_ix, zval, sig) in zip(pos_list.pos_ix.values, zvals, sigs):\n", + " pos_mt = l_mt[:, pos_ix]\n", + " pos_mt_std = l_mt_std[:, pos_ix]\n", + " pos_ap = l_ap[:, pos_ix]\n", + " \n", + " vert = sig.nonzero()[0]\n", + "\n", + " rows = [dict(idx=ivert,\n", + " pos_ix=pos_ix,\n", + " actprob=iap,\n", + " magne=imagne,\n", + " std=istd,\n", + " percentile=ipct,\n", + " motor_threshold=imt,\n", + " motor_threshold_std=imtstd,\n", + " mt_zval=izval,\n", + " vertex_area=iva\n", + " )\n", + " for ivert, iap, imagne,istd, ipct, imt, imtstd, izval, iva\n", + " in zip(\n", + " vert,\n", + " pos_ap[vert],\n", + " l_magne[vert, pos_ix],\n", + " l_std[vert, pos_ix],\n", + " l_percentile[vert, pos_ix],\n", + " pos_mt[vert],\n", + " pos_mt_std[vert],\n", + " zval[vert],\n", + " l_va[vert, 0]\n", + " )]\n", + " pos_iidxs.extend(rows)\n", + " pos_iidxs = pd.DataFrame(pos_iidxs)\n", + " pos_iidxs['in_stim'] = pos_iidxs.idx.isin(stim_roi.idxs)\n", + " minmt_row = dict(\n", + " subject=subject,\n", + " min_mt=pos_iidxs.motor_threshold.min()\n", + " )\n", + " min_mt.append(minmt_row)\n", + " t = min_mt_thresh\n", + " m = -0.9 / (t - 80)\n", + " b = 1 - (m * 80)\n", + " 80 * m + b\n", + " pos_iidxs['mt_weight'] = pos_iidxs.motor_threshold * m + b\n", + " pos_iidxs['weighted_in_stim'] = pos_iidxs.in_stim * pos_iidxs.actprob\n", + " iidxs = pos_iidxs.loc[:, ['idx']].drop_duplicates().reset_index(drop=True)\n", + "\n", + " for session in [1,2]:\n", + " for smoothing in [2.55, 5]:\n", + " # load functional data\n", + " lrest_dir = liston_root / f'sub-{subject}/func/rest'\n", + " concat_nii = lrest_dir / f'session_{session}/concatenated/Rest_session-{session}_OCME+MEICA+MGTR_Concatenated+SubcortRegression+SpatialSmoothing{smoothing}.dtseries.nii'\n", + " timeseries = [concat_nii]\n", + " lts_data, rts_data, ts_data = load_timeseries(timeseries)\n", + "\n", + " # load clusters\n", + " clust_dir = func_dir / f'sub-{subject}/ses-{session}/cluster'\n", + " dstim_clusters = pd.read_pickle(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_dstimclusters.pkl.gz')\n", + " dstim_verts = pd.read_pickle(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_dstimverts.pkl.gz')\n", + " ref_clusters = pd.read_pickle(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_refclusters.pkl.gz')\n", + " ref_repts = np.load(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_refrepts.npz.npy')\n", + " ref_ts = np.load(clust_dir / f'sub-{subject}_ses-{session}_smoothing-{smoothing}_refts.npz.npy')\n", + "\n", + " # get vertex wise correlations for intensity eval\n", + " vert_rep_corr, _, _ = cross_spearman(lts_data[iidxs.idx.values], np.array(list(ref_clusters.repts.values)),\n", + " alpha=pairwise_sig_thresh, method='fdr_bh')\n", + " vert_rep_zs = np.arctanh(vert_rep_corr)\n", + " vert_rep_ds = weightstats.DescrStatsW(vert_rep_zs.T, weights=ref_clusters.nvert.values)\n", + " vert_rep_mean = np.tanh(vert_rep_ds.mean)\n", + " vert_rep_t, vert_rep_p = vert_rep_ds.ztest_mean()\n", + " iidxs['vert_rep_mean'] = vert_rep_mean\n", + " iidxs['vert_rep_avet'] = vert_rep_t\n", + " iidxs['vert_rep_avep'] = vert_rep_p\n", + "\n", + " n = ref_repts.shape[1]\n", + " rs = vert_rep_mean\n", + " ts = rs * np.sqrt((n - 2) / ((rs + 1.0) * (1.0 - rs)))\n", + " iidxs['vert_rep_rp'] = stats.t.sf(np.abs(ts), n - 2) * 2\n", + "\n", + " # get cluster stats\n", + " iidxs_tsc = iidxs.merge(dstim_verts, how='left', on='idx')\n", + "\n", + " pos_iidxs_tsc = pos_iidxs.merge(iidxs_tsc, how='left', on='idx')\n", + " for pos_ix, df in pos_iidxs_tsc.groupby('pos_ix'):\n", + " rep_zs = np.arctanh(df.vert_rep_mean)\n", + " weights = df['actprob'].values\n", + " if weights.sum() < 1:\n", + " continue\n", + "\n", + " rep_ds = weightstats.DescrStatsW(rep_zs.T, weights=weights)\n", + " rep_mean = np.tanh(rep_ds.mean)\n", + " rep_std = np.tanh(rep_ds.std)\n", + " rep_t, _ = rep_ds.ztest_mean()\n", + " if rep_std == 0:\n", + " continue\n", + " rep_va_ds = weightstats.DescrStatsW(rep_zs.T, weights=weights * df.vertex_area.values)\n", + " rep_va_mean = np.tanh(rep_va_ds.mean)\n", + "\n", + " rep_neg = rep_zs < 0\n", + " rn_ds = weightstats.DescrStatsW(rep_neg.T, weights=weights) \n", + " in_stim_ds = weightstats.DescrStatsW(df.in_stim.values, weights=weights)\n", + " rn_va_ds = weightstats.DescrStatsW(rep_neg.T , weights=weights * df.vertex_area) \n", + " in_stim_va_ds = weightstats.DescrStatsW(df.in_stim.values , weights=weights * df.vertex_area)\n", + " mt_ds = weightstats.DescrStatsW(df.motor_threshold.values, weights=weights)\n", + " row = dict(\n", + " subject=subject,\n", + " session=session,\n", + " smoothing=smoothing,\n", + " pos_ix=pos_ix,\n", + " n = len(df),\n", + " weighted_n = weights.sum(),\n", + " area = df.vertex_area.sum(),\n", + " weighted_area = (df.vertex_area * weights).sum(),\n", + " prop_neg=rn_ds.mean,\n", + " prop_va_neg=rn_va_ds.mean,\n", + " rep_mean=rep_mean,\n", + " rep_va_mean = rep_va_mean,\n", + " rep_std=rep_std,\n", + " rep_t=rep_t,\n", + " in_stim=in_stim_ds.mean,\n", + " in_stim_va=in_stim_va_ds.mean,\n", + " mt=mt_ds.mean,\n", + " mt_std=mt_ds.std,\n", + " )\n", + " row.update(pos_list.loc[pos_list.pos_ix == pos_ix, alt_pl_cols].iloc[0].to_dict())\n", + " alt_stim_stats.append(row)\n", + "alt_stim_stats = pd.DataFrame(alt_stim_stats)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "d5405b52-036d-4d55-a445-95168a033fb6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# add stim stats to bgs_peak_stats\n", + "merge_cols = [\n", + " 'subject',\n", + " 'session', \n", + " 'smoothing',\n", + " 'pos_ix',\n", + " 'weighted_n',\n", + " 'area',\n", + " 'weighted_area',\n", + " 'rep_mean',\n", + " 'rep_va_mean',\n", + " 'rep_std',\n", + " 'rep_t',\n", + " 'prop_neg',\n", + " 'prop_va_neg',\n", + " 'in_stim',\n", + " 'in_stim_va',\n", + " 'bx',\n", + " 'by',\n", + " 'bz',\n", + " 's_x',\n", + " 's_y',\n", + " 's_z',\n", + " 's_idx'\n", + "]\n", + "alt_to_merge = alt_stim_stats.loc[:, merge_cols].copy()\n", + "bgs_peak_stats['peak_pos'] = bgs_peak_stats.magnE_idx\n", + "peak_stats_to_merge = bgs_peak_stats.query(\"smoothing == 2.55\").loc[:, ['subject' ,'session', 'smoothing', 'peak_pos', 'peak_val', 'peak_idx', 'clust_size','z_angle']]\n", + "peak_stats_to_merge['subject_pos'] = peak_stats_to_merge.subject + '_' +peak_stats_to_merge.peak_pos.astype(str)\n", + "subj_pos_255 = peak_stats_to_merge.subject_pos.values\n", + "peak_stats_to_merge = peak_stats_to_merge.drop('subject_pos', axis=1)\n", + "alt_to_merge['subject_pos'] = alt_to_merge.subject + '_' +alt_to_merge.pos_ix.astype(str)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "10ef4f79-8d4e-4704-b222-e847ab38366c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "bgs_peak_stimstats = peak_stats_to_merge.merge(\n", + " alt_to_merge,\n", + " on=['subject', 'session', 'smoothing'],\n", + " how='left',\n", + " indicator=True\n", + ").query('subject_pos in @subj_pos_255')\n", + "\n", + "assert len(bgs_peak_stimstats.query('_merge != \"both\"')) == 0" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "dc1d249e-cb8f-467c-ae60-613b25d89dee", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ses_comp_cols = [\n", + " 'subject',\n", + " 'smoothing',\n", + " 'pos_ix',\n", + " 'peak_pos',\n", + " 'weighted_n',\n", + " 'area',\n", + " 'weighted_area',\n", + " 'rep_mean',\n", + " 'rep_va_mean',\n", + " 'rep_std',\n", + " 'rep_t',\n", + " 'prop_neg',\n", + " 'prop_va_neg',\n", + " 'in_stim',\n", + " 'in_stim_va',\n", + " 'bx',\n", + " 'by',\n", + " 'bz',\n", + " 's_x',\n", + " 's_y',\n", + " 's_z',\n", + " 'z_angle',\n", + " 's_idx'\n", + "]\n", + "bgss1 = bgs_peak_stimstats.loc[bgs_peak_stimstats.session == 1, ses_comp_cols]\n", + "bgss2 = bgs_peak_stimstats.loc[bgs_peak_stimstats.session == 2, ses_comp_cols]\n", + "bgssw = bgss1.merge(bgss2, how='inner', on=['subject', 'smoothing'], suffixes=['_1', '_2'])\n" + ] + }, + { + "cell_type": "markdown", + "id": "27fb3ac4-9c88-447b-85a6-2deb9c5cc586", + "metadata": {}, + "source": [ + "# Compare target quality" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "ec0ea3b8-72a3-4cde-b1bf-d49420fdb437", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ssr_targets = []\n", + "for ixs, df in stim_stats_rev.groupby(['subject', 'session', 'smoothing']):\n", + " target_pos = df.query('rep_rva_rank == 1').groupby('pos_ix')[['subject']].count().reset_index().sort_values('subject', ascending=False).pos_ix.values[0]\n", + " ssr_targets.append(df.query('pos_ix == @target_pos').iloc[0])\n", + "ssr_targets = pd.DataFrame(ssr_targets)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "f4de0be3-be75-43a7-b728-5764370833fb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjectsessionsmoothingpos_ixnweighted_nareaweighted_areaprop_negprop_va_negrep_meanrep_va_meanrep_stdrep_tin_stimin_stim_vamtmt_stdcxcycznxnynzbxbybzbxvbyvbzvz_angles_idxs_xs_ys_zrep_r_rankrep_rva_rank
16192454612.554987590.2646093854.437253436.4638220.8130480.809706-0.153627-0.1502590.155300-9.3445920.1466000.15124562.0500449.644858-33.32917843.2072117.092140-0.0063190.125825-0.992032-43.623859.738515.2658[0.8226, 0.553, 0.1328][0.0619, -0.3192, 0.9456][0.5653, -0.7696, -0.2968]341.34719827871-33.32917843.2072117.0921401.01.0
17262454622.554987590.2646093854.437253436.4638220.8262540.816855-0.099110-0.0964430.102797-9.1068570.1466000.15124562.0500449.644858-33.32917843.2072117.092140-0.0063190.125825-0.992032-43.623859.738515.2658[0.8226, 0.553, 0.1328][0.0619, -0.3192, 0.9456][0.5653, -0.7696, -0.2968]341.34719827871-33.32917843.2072117.0921401.01.0
1102456312.5511089479.3510574058.233170401.3238420.7501390.739029-0.030118-0.0290360.039588-6.7326330.2048160.21177960.6047559.878952-34.11653950.8487329.231405-0.490217-0.299158-0.818653-43.551464.067218.2042[0.4968, 0.7027, -0.5093][0.5605, 0.1883, 0.8065][0.6626, -0.6861, -0.3003]13.14188227872-34.11653950.8487329.2314051.01.0
1422456322.5561166143.5546075018.655341676.0586370.6368300.628295-0.028267-0.0281030.061710-5.4636100.2776060.27505360.8076269.308571-47.52897633.8365292.1505570.800593-0.587441-0.118173-60.831549.04330.6005[0.138, 0.4793, -0.8667][0.5592, 0.6846, 0.4676][0.8175, -0.5492, -0.1736]55.66588511630-47.52897633.8365292.1505571.01.0
2732457312.551813105.7679013602.537782513.2826790.8406130.847446-0.086049-0.0860390.084548-10.4183280.3306470.31104262.0268688.607600-43.74262645.8984729.5243630.474250-0.4427370.760967-58.830055.092019.0800[-0.62206, -0.78171, 0.044322][-0.24165, 0.13784, -0.96052][0.74474, -0.60822, -0.27464]171.83349029729-43.74262645.8984729.5243631.01.0
3922457322.551813105.7679013602.537782513.2826790.7896580.793742-0.074195-0.0754140.077835-9.7551610.3306470.31104262.0268688.607600-43.74262645.8984729.5243630.474250-0.4427370.760967-58.830055.092019.0800[-0.62206, -0.78171, 0.044322][-0.24165, 0.13784, -0.96052][0.74474, -0.60822, -0.27464]171.83349029729-43.74262645.8984729.5243632.01.0
5682470412.55581259176.7494444533.890926692.2271860.5691650.535344-0.007824-0.0022840.078210-1.3235570.2670210.27830759.97363710.861837-44.56334718.73103124.179079-0.431679-0.871886-0.231230-61.677929.858931.8129[-0.3434, 0.3147, -0.8849][0.4885, 0.8646, 0.1179][0.8022, -0.3918, -0.4506]82.23483419104-44.56334718.73103124.1790791.01.0
6792470422.55561226182.0391884439.053854730.6981270.5052190.479083-0.012813-0.0033500.158733-1.0769350.3629590.37230461.58314611.456032-40.65998825.29540423.9115160.4103350.9079480.085183-58.815032.594034.8040[0.4129, -0.16063, 0.8965][-0.41159, -0.91099, 0.026337][0.81247, -0.37986, -0.44227]271.65597730357-40.65998825.29540423.9115161.01.0
8112471812.557581668.1001533621.932222334.6650490.9673530.971696-0.155920-0.1594100.062639-20.5307970.5564340.54609860.7261528.866545-38.27259445.29042816.1894860.221143-0.7281930.648715-54.105755.184720.2291[-0.6263, -0.6326, -0.4557][0.0779, 0.5308, -0.8439][0.7757, -0.564, -0.2831]147.83074429575-38.27259445.29042816.1894861.01.0
9002471822.553384069.0993063763.774040338.6994670.9715590.968991-0.122443-0.1231190.047899-21.1853270.3399000.32926958.7888018.319513-38.54702049.6342744.5229570.302517-0.3138670.899984-53.716060.29507.9447[-0.60268, -0.7976, 0.024788][-0.13301, 0.069781, -0.98865][0.78682, -0.59914, -0.14815]175.96263910149-38.54702049.6342744.5229571.01.0
10312474012.553357162.6623532172.136104262.5762510.8637930.872037-0.119020-0.1230680.093869-9.9745210.7513360.74644261.0671988.696843-37.94827737.76543814.5301230.4936230.609485-0.620374-55.014845.287823.6733[0.4761, 0.1541, 0.8658][-0.3434, -0.8738, 0.3443][0.8096, -0.4612, -0.3631]291.50573429679-37.94827737.76543814.5301231.01.0
11562474022.553357162.6623532172.136104262.5762510.7408000.751627-0.119953-0.1250680.129541-7.2654840.7513360.74644261.0671988.696843-37.94827737.76543814.5301230.4936230.609485-0.620374-55.014845.287823.6733[0.4761, 0.1541, 0.8658][-0.3434, -0.8738, 0.3443][0.8096, -0.4612, -0.3631]291.50573429679-37.94827737.76543814.5301231.01.0
12862474212.5538872104.6601883475.349608454.3076020.8585630.862316-0.184116-0.1815460.139722-13.4822340.5126790.50549961.4680459.775790-36.71680831.86319416.226118-0.446201-0.7697640.456473-59.375540.991426.3176[-0.5392, -0.1466, -0.8293][0.3867, 0.8317, -0.3985][0.7481, -0.5355, -0.3918]115.60090429966-36.71680831.86319416.2261181.01.0
14472474222.5538872104.6601883475.349608454.3076020.8511310.854587-0.169984-0.1677570.142536-12.1775300.5126790.50549961.4680459.775790-36.71680831.86319416.226118-0.446201-0.7697640.456473-59.375540.991426.3176[-0.5392, -0.1466, -0.8293][0.3867, 0.8317, -0.3985][0.7481, -0.5355, -0.3918]115.60090429966-36.71680831.86319416.2261181.01.0
\n", + "
" + ], + "text/plain": [ + " subject session smoothing pos_ix n weighted_n area \\\n", + "1619 24546 1 2.55 49 875 90.264609 3854.437253 \n", + "1726 24546 2 2.55 49 875 90.264609 3854.437253 \n", + "110 24563 1 2.55 110 894 79.351057 4058.233170 \n", + "142 24563 2 2.55 6 1166 143.554607 5018.655341 \n", + "273 24573 1 2.55 1 813 105.767901 3602.537782 \n", + "392 24573 2 2.55 1 813 105.767901 3602.537782 \n", + "568 24704 1 2.55 58 1259 176.749444 4533.890926 \n", + "679 24704 2 2.55 56 1226 182.039188 4439.053854 \n", + "811 24718 1 2.55 75 816 68.100153 3621.932222 \n", + "900 24718 2 2.55 33 840 69.099306 3763.774040 \n", + "1031 24740 1 2.55 33 571 62.662353 2172.136104 \n", + "1156 24740 2 2.55 33 571 62.662353 2172.136104 \n", + "1286 24742 1 2.55 38 872 104.660188 3475.349608 \n", + "1447 24742 2 2.55 38 872 104.660188 3475.349608 \n", + "\n", + " weighted_area prop_neg prop_va_neg rep_mean rep_va_mean rep_std \\\n", + "1619 436.463822 0.813048 0.809706 -0.153627 -0.150259 0.155300 \n", + "1726 436.463822 0.826254 0.816855 -0.099110 -0.096443 0.102797 \n", + "110 401.323842 0.750139 0.739029 -0.030118 -0.029036 0.039588 \n", + "142 676.058637 0.636830 0.628295 -0.028267 -0.028103 0.061710 \n", + "273 513.282679 0.840613 0.847446 -0.086049 -0.086039 0.084548 \n", + "392 513.282679 0.789658 0.793742 -0.074195 -0.075414 0.077835 \n", + "568 692.227186 0.569165 0.535344 -0.007824 -0.002284 0.078210 \n", + "679 730.698127 0.505219 0.479083 -0.012813 -0.003350 0.158733 \n", + "811 334.665049 0.967353 0.971696 -0.155920 -0.159410 0.062639 \n", + "900 338.699467 0.971559 0.968991 -0.122443 -0.123119 0.047899 \n", + "1031 262.576251 0.863793 0.872037 -0.119020 -0.123068 0.093869 \n", + "1156 262.576251 0.740800 0.751627 -0.119953 -0.125068 0.129541 \n", + "1286 454.307602 0.858563 0.862316 -0.184116 -0.181546 0.139722 \n", + "1447 454.307602 0.851131 0.854587 -0.169984 -0.167757 0.142536 \n", + "\n", + " rep_t in_stim in_stim_va mt mt_std cx \\\n", + "1619 -9.344592 0.146600 0.151245 62.050044 9.644858 -33.329178 \n", + "1726 -9.106857 0.146600 0.151245 62.050044 9.644858 -33.329178 \n", + "110 -6.732633 0.204816 0.211779 60.604755 9.878952 -34.116539 \n", + "142 -5.463610 0.277606 0.275053 60.807626 9.308571 -47.528976 \n", + "273 -10.418328 0.330647 0.311042 62.026868 8.607600 -43.742626 \n", + "392 -9.755161 0.330647 0.311042 62.026868 8.607600 -43.742626 \n", + "568 -1.323557 0.267021 0.278307 59.973637 10.861837 -44.563347 \n", + "679 -1.076935 0.362959 0.372304 61.583146 11.456032 -40.659988 \n", + "811 -20.530797 0.556434 0.546098 60.726152 8.866545 -38.272594 \n", + "900 -21.185327 0.339900 0.329269 58.788801 8.319513 -38.547020 \n", + "1031 -9.974521 0.751336 0.746442 61.067198 8.696843 -37.948277 \n", + "1156 -7.265484 0.751336 0.746442 61.067198 8.696843 -37.948277 \n", + "1286 -13.482234 0.512679 0.505499 61.468045 9.775790 -36.716808 \n", + "1447 -12.177530 0.512679 0.505499 61.468045 9.775790 -36.716808 \n", + "\n", + " cy cz nx ny nz bx by \\\n", + "1619 43.207211 7.092140 -0.006319 0.125825 -0.992032 -43.6238 59.7385 \n", + "1726 43.207211 7.092140 -0.006319 0.125825 -0.992032 -43.6238 59.7385 \n", + "110 50.848732 9.231405 -0.490217 -0.299158 -0.818653 -43.5514 64.0672 \n", + "142 33.836529 2.150557 0.800593 -0.587441 -0.118173 -60.8315 49.0433 \n", + "273 45.898472 9.524363 0.474250 -0.442737 0.760967 -58.8300 55.0920 \n", + "392 45.898472 9.524363 0.474250 -0.442737 0.760967 -58.8300 55.0920 \n", + "568 18.731031 24.179079 -0.431679 -0.871886 -0.231230 -61.6779 29.8589 \n", + "679 25.295404 23.911516 0.410335 0.907948 0.085183 -58.8150 32.5940 \n", + "811 45.290428 16.189486 0.221143 -0.728193 0.648715 -54.1057 55.1847 \n", + "900 49.634274 4.522957 0.302517 -0.313867 0.899984 -53.7160 60.2950 \n", + "1031 37.765438 14.530123 0.493623 0.609485 -0.620374 -55.0148 45.2878 \n", + "1156 37.765438 14.530123 0.493623 0.609485 -0.620374 -55.0148 45.2878 \n", + "1286 31.863194 16.226118 -0.446201 -0.769764 0.456473 -59.3755 40.9914 \n", + "1447 31.863194 16.226118 -0.446201 -0.769764 0.456473 -59.3755 40.9914 \n", + "\n", + " bz bxv byv \\\n", + "1619 15.2658 [0.8226, 0.553, 0.1328] [0.0619, -0.3192, 0.9456] \n", + "1726 15.2658 [0.8226, 0.553, 0.1328] [0.0619, -0.3192, 0.9456] \n", + "110 18.2042 [0.4968, 0.7027, -0.5093] [0.5605, 0.1883, 0.8065] \n", + "142 0.6005 [0.138, 0.4793, -0.8667] [0.5592, 0.6846, 0.4676] \n", + "273 19.0800 [-0.62206, -0.78171, 0.044322] [-0.24165, 0.13784, -0.96052] \n", + "392 19.0800 [-0.62206, -0.78171, 0.044322] [-0.24165, 0.13784, -0.96052] \n", + "568 31.8129 [-0.3434, 0.3147, -0.8849] [0.4885, 0.8646, 0.1179] \n", + "679 34.8040 [0.4129, -0.16063, 0.8965] [-0.41159, -0.91099, 0.026337] \n", + "811 20.2291 [-0.6263, -0.6326, -0.4557] [0.0779, 0.5308, -0.8439] \n", + "900 7.9447 [-0.60268, -0.7976, 0.024788] [-0.13301, 0.069781, -0.98865] \n", + "1031 23.6733 [0.4761, 0.1541, 0.8658] [-0.3434, -0.8738, 0.3443] \n", + "1156 23.6733 [0.4761, 0.1541, 0.8658] [-0.3434, -0.8738, 0.3443] \n", + "1286 26.3176 [-0.5392, -0.1466, -0.8293] [0.3867, 0.8317, -0.3985] \n", + "1447 26.3176 [-0.5392, -0.1466, -0.8293] [0.3867, 0.8317, -0.3985] \n", + "\n", + " bzv z_angle s_idx s_x s_y \\\n", + "1619 [0.5653, -0.7696, -0.2968] 341.347198 27871 -33.329178 43.207211 \n", + "1726 [0.5653, -0.7696, -0.2968] 341.347198 27871 -33.329178 43.207211 \n", + "110 [0.6626, -0.6861, -0.3003] 13.141882 27872 -34.116539 50.848732 \n", + "142 [0.8175, -0.5492, -0.1736] 55.665885 11630 -47.528976 33.836529 \n", + "273 [0.74474, -0.60822, -0.27464] 171.833490 29729 -43.742626 45.898472 \n", + "392 [0.74474, -0.60822, -0.27464] 171.833490 29729 -43.742626 45.898472 \n", + "568 [0.8022, -0.3918, -0.4506] 82.234834 19104 -44.563347 18.731031 \n", + "679 [0.81247, -0.37986, -0.44227] 271.655977 30357 -40.659988 25.295404 \n", + "811 [0.7757, -0.564, -0.2831] 147.830744 29575 -38.272594 45.290428 \n", + "900 [0.78682, -0.59914, -0.14815] 175.962639 10149 -38.547020 49.634274 \n", + "1031 [0.8096, -0.4612, -0.3631] 291.505734 29679 -37.948277 37.765438 \n", + "1156 [0.8096, -0.4612, -0.3631] 291.505734 29679 -37.948277 37.765438 \n", + "1286 [0.7481, -0.5355, -0.3918] 115.600904 29966 -36.716808 31.863194 \n", + "1447 [0.7481, -0.5355, -0.3918] 115.600904 29966 -36.716808 31.863194 \n", + "\n", + " s_z rep_r_rank rep_rva_rank \n", + "1619 7.092140 1.0 1.0 \n", + "1726 7.092140 1.0 1.0 \n", + "110 9.231405 1.0 1.0 \n", + "142 2.150557 1.0 1.0 \n", + "273 9.524363 1.0 1.0 \n", + "392 9.524363 2.0 1.0 \n", + "568 24.179079 1.0 1.0 \n", + "679 23.911516 1.0 1.0 \n", + "811 16.189486 1.0 1.0 \n", + "900 4.522957 1.0 1.0 \n", + "1031 14.530123 1.0 1.0 \n", + "1156 14.530123 1.0 1.0 \n", + "1286 16.226118 1.0 1.0 \n", + "1447 16.226118 1.0 1.0 " + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ssr_targets" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "e78ee15c-e776-48b6-93b9-4d32da47d038", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ssr_targcomp = ssr_targets.loc[:, ['subject', 'session', 'rep_va_mean', 'prop_va_neg', 'in_stim_va', 'pos_ix', 's_idx']].copy()\n", + "ssr_targcomp['method'] = 'Comprehensive'\n" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "51d02165-9445-44ae-8d44-7ce1d09f2d26", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "alt_targets = bgs_peak_stimstats.query('pos_ix == peak_pos')\n", + "alt_targcomp = alt_targets.loc[:, ['subject', 'session','peak_val', 'clust_size', 'rep_va_mean', 'prop_va_neg', 'pos_ix', 's_idx']]\n", + "alt_targcomp['method'] = 'Restricted'" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "d37f5257-6674-4156-8cf9-d2c599a829c6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "targcomp = pd.concat([ssr_targcomp, alt_targcomp])" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "cbbc8b82-52a5-42d2-ba2b-57cf2adeba79", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjectsessionrep_va_meanprop_va_negin_stim_vapos_ixs_idxmethodpeak_valclust_size
1619245461-0.1502590.8097060.1512454927871ComprehensiveNaNNaN
1726245462-0.0964430.8168550.1512454927871ComprehensiveNaNNaN
110245631-0.0290360.7390290.21177911027872ComprehensiveNaNNaN
142245632-0.0281030.6282950.275053611630ComprehensiveNaNNaN
273245731-0.0860390.8474460.311042129729ComprehensiveNaNNaN
392245732-0.0754140.7937420.311042129729ComprehensiveNaNNaN
568247041-0.0022840.5353440.2783075819104ComprehensiveNaNNaN
679247042-0.0033500.4790830.3723045630357ComprehensiveNaNNaN
811247181-0.1594100.9716960.5460987529575ComprehensiveNaNNaN
900247182-0.1231190.9689910.3292693310149ComprehensiveNaNNaN
1031247401-0.1230680.8720370.7464423329679ComprehensiveNaNNaN
1156247402-0.1250680.7516270.7464423329679ComprehensiveNaNNaN
1286247421-0.1815460.8623160.5054993829966ComprehensiveNaNNaN
1447247422-0.1677570.8545870.5054993829966ComprehensiveNaNNaN
0245462-0.0592960.724703NaN018862Restricted-0.172753430.0
5245461-0.0899990.700807NaN110106Restricted-0.426592449.0
82456310.0403520.209117NaN011628Restricted-0.092104197.0
13245632-0.0191810.568214NaN111659Restricted-0.170577442.0
16245731-0.0083780.553489NaN018782Restricted-0.249221449.0
21245732-0.0228150.549053NaN118391Restricted-0.231708377.0
242470410.0062540.445805NaN018820Restricted-0.09763571.0
292470420.0504840.349516NaN118819Restricted-0.268823380.0
32247182-0.1152410.960091NaN018862Restricted-0.166929489.0
37247181-0.1401730.949834NaN118829Restricted-0.230965431.0
402474010.0239670.322065NaN018872Restricted-0.261740348.0
44247402-0.0722420.608276NaN118831Restricted-0.342271310.0
46247422-0.1064390.688931NaN018399Restricted-0.325432375.0
492474210.0070800.409774NaN118401Restricted-0.348356346.0
\n", + "
" + ], + "text/plain": [ + " subject session rep_va_mean prop_va_neg in_stim_va pos_ix s_idx \\\n", + "1619 24546 1 -0.150259 0.809706 0.151245 49 27871 \n", + "1726 24546 2 -0.096443 0.816855 0.151245 49 27871 \n", + "110 24563 1 -0.029036 0.739029 0.211779 110 27872 \n", + "142 24563 2 -0.028103 0.628295 0.275053 6 11630 \n", + "273 24573 1 -0.086039 0.847446 0.311042 1 29729 \n", + "392 24573 2 -0.075414 0.793742 0.311042 1 29729 \n", + "568 24704 1 -0.002284 0.535344 0.278307 58 19104 \n", + "679 24704 2 -0.003350 0.479083 0.372304 56 30357 \n", + "811 24718 1 -0.159410 0.971696 0.546098 75 29575 \n", + "900 24718 2 -0.123119 0.968991 0.329269 33 10149 \n", + "1031 24740 1 -0.123068 0.872037 0.746442 33 29679 \n", + "1156 24740 2 -0.125068 0.751627 0.746442 33 29679 \n", + "1286 24742 1 -0.181546 0.862316 0.505499 38 29966 \n", + "1447 24742 2 -0.167757 0.854587 0.505499 38 29966 \n", + "0 24546 2 -0.059296 0.724703 NaN 0 18862 \n", + "5 24546 1 -0.089999 0.700807 NaN 1 10106 \n", + "8 24563 1 0.040352 0.209117 NaN 0 11628 \n", + "13 24563 2 -0.019181 0.568214 NaN 1 11659 \n", + "16 24573 1 -0.008378 0.553489 NaN 0 18782 \n", + "21 24573 2 -0.022815 0.549053 NaN 1 18391 \n", + "24 24704 1 0.006254 0.445805 NaN 0 18820 \n", + "29 24704 2 0.050484 0.349516 NaN 1 18819 \n", + "32 24718 2 -0.115241 0.960091 NaN 0 18862 \n", + "37 24718 1 -0.140173 0.949834 NaN 1 18829 \n", + "40 24740 1 0.023967 0.322065 NaN 0 18872 \n", + "44 24740 2 -0.072242 0.608276 NaN 1 18831 \n", + "46 24742 2 -0.106439 0.688931 NaN 0 18399 \n", + "49 24742 1 0.007080 0.409774 NaN 1 18401 \n", + "\n", + " method peak_val clust_size \n", + "1619 Comprehensive NaN NaN \n", + "1726 Comprehensive NaN NaN \n", + "110 Comprehensive NaN NaN \n", + "142 Comprehensive NaN NaN \n", + "273 Comprehensive NaN NaN \n", + "392 Comprehensive NaN NaN \n", + "568 Comprehensive NaN NaN \n", + "679 Comprehensive NaN NaN \n", + "811 Comprehensive NaN NaN \n", + "900 Comprehensive NaN NaN \n", + "1031 Comprehensive NaN NaN \n", + "1156 Comprehensive NaN NaN \n", + "1286 Comprehensive NaN NaN \n", + "1447 Comprehensive NaN NaN \n", + "0 Restricted -0.172753 430.0 \n", + "5 Restricted -0.426592 449.0 \n", + "8 Restricted -0.092104 197.0 \n", + "13 Restricted -0.170577 442.0 \n", + "16 Restricted -0.249221 449.0 \n", + "21 Restricted -0.231708 377.0 \n", + "24 Restricted -0.097635 71.0 \n", + "29 Restricted -0.268823 380.0 \n", + "32 Restricted -0.166929 489.0 \n", + "37 Restricted -0.230965 431.0 \n", + "40 Restricted -0.261740 348.0 \n", + "44 Restricted -0.342271 310.0 \n", + "46 Restricted -0.325432 375.0 \n", + "49 Restricted -0.348356 346.0 " + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "targcomp" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "d913d227-9998-47a4-b60e-533e49b6cf60", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def get_mni_coords(row):\n", + " subject = row.subject\n", + " mni_surf_dir = liston_root / f'sub-{subject}/anat/MNINonLinear/fsaverage_LR32k/'\n", + " l_surf_path = mni_surf_dir / f'sub-{subject}.L.midthickness.32k_fs_LR.surf.gii'\n", + " points, triangles = nb.load(l_surf_path).agg_data()\n", + " return list(points[int(row.s_idx)])" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "20ee2bd6-3b52-49a1-9937-977201f374be", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "targcomp['mni_coords'] = targcomp.apply(get_mni_coords, axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 522, + "id": "c4b64569-0ba9-49a3-a0bf-db391a4e718b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3697 [-40.11714, 47.387764, 11.240886]\n", + "3911 [-40.11714, 47.387764, 11.240886]\n", + "110 [-34.50406, 57.268967, 10.119094]\n", + "278 [-48.121742, 37.288322, 1.9380682]\n", + "545 [-43.051376, 50.11994, 13.479204]\n", + "783 [-43.051376, 50.11994, 13.479204]\n", + "1078 [-50.054924, 18.272905, 26.244633]\n", + "1302 [-45.9921, 23.879623, 27.237137]\n", + "1547 [-37.54056, 45.91867, 27.724985]\n", + "1767 [-40.210518, 52.13172, 6.2416377]\n", + "2537 [-36.542202, 47.720997, 23.312147]\n", + "2787 [-36.542202, 47.720997, 23.312147]\n", + "3042 [-35.36554, 41.245953, 29.72484]\n", + "3364 [-35.36554, 41.245953, 29.72484]\n", + "2 [-48.5251, 34.661713, 23.105743]\n", + "7 [-49.045708, 34.977688, 8.607901]\n", + "12 [-51.001358, 36.882553, 4.7775683]\n", + "19 [-32.467033, 56.659843, 10.269877]\n", + "20 [-48.868458, 32.712173, 13.365688]\n", + "26 [-43.23716, 41.02818, 25.755365]\n", + "29 [-50.96127, 21.02021, 17.442978]\n", + "35 [-42.301266, 35.42563, 16.216778]\n", + "37 [-47.907833, 34.350525, 25.051294]\n", + "42 [-47.02241, 31.104078, 27.995949]\n", + "46 [-49.228146, 37.344795, 16.734148]\n", + "50 [-43.26607, 39.2656, 14.580873]\n", + "52 [-44.731724, 47.608543, 12.024196]\n", + "55 [-41.4416, 47.868946, 8.601941]\n", + "Name: mni_coords, dtype: object" + ] + }, + "execution_count": 522, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "targcomp.mni_coords" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "17d7376e-0a42-4fe3-9093-cf140cbe2c15", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "inter_subject_dist = []\n", + "for method in ['Comprehensive', 'Restricted']:\n", + " for session in [1,2]:\n", + " row = dict(\n", + " method=method,\n", + " session=session,\n", + " isdist = pdist(np.array(list(targcomp.query(\"method== @method & session == @session\").mni_coords.values))).mean()\n", + " )\n", + " inter_subject_dist.append(row)\n", + "inter_subject_dist = pd.DataFrame(inter_subject_dist)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "a52b253c-bed6-4f08-9c9d-f497d4d422e7", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methodsessionisdist
0Comprehensive119.623071
1Comprehensive219.806664
2Restricted113.676291
3Restricted220.008574
\n", + "
" + ], + "text/plain": [ + " method session isdist\n", + "0 Comprehensive 1 19.623071\n", + "1 Comprehensive 2 19.806664\n", + "2 Restricted 1 13.676291\n", + "3 Restricted 2 20.008574" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "inter_subject_dist" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "cf1f35a9-0f3f-47ad-81db-0f765c34f20e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "import statsmodels.formula.api as smf" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "c55a47da-4e42-4d5e-8adb-bef99fb3a262", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Mixed Linear Model Regression Results\n", + "===============================================================\n", + "Model: MixedLM Dependent Variable: rep_va_mean\n", + "No. Observations: 28 Method: REML \n", + "No. Groups: 7 Scale: 0.0013 \n", + "Min. group size: 4 Log-Likelihood: 40.0957 \n", + "Max. group size: 4 Converged: Yes \n", + "Mean group size: 4.0 \n", + "---------------------------------------------------------------\n", + " Coef. Std.Err. z P>|z| [0.025 0.975]\n", + "---------------------------------------------------------------\n", + "Intercept -0.096 0.022 -4.452 0.000 -0.139 -0.054\n", + "method[T.Restricted] 0.060 0.014 4.400 0.000 0.033 0.087\n", + "Group Var 0.003 0.054 \n", + "===============================================================\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/statsmodels/regression/mixed_linear_model.py:2238: ConvergenceWarning: The MLE may be on the boundary of the parameter space.\n", + " warnings.warn(msg, ConvergenceWarning)\n" + ] + } + ], + "source": [ + "rep_md = smf.mixedlm('rep_va_mean ~ method', targcomp, groups=targcomp[\"subject\"])\n", + "rep_mdf = rep_md.fit(method=[\"lbfgs\"])\n", + "print(rep_mdf.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "d5aa1163-ac54-453f-9394-a577be5143ef", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Intercept 0.000008\n", + "method[T.Restricted] 0.000011\n", + "Group Var 0.177047\n", + "dtype: float64" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rep_mdf.pvalues" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "c3c7fa00-e54e-4a9d-a075-4efc80a0d0d2", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Mixed Linear Model Regression Results\n", + "===============================================================\n", + "Model: MixedLM Dependent Variable: prop_va_neg\n", + "No. Observations: 28 Method: REML \n", + "No. Groups: 7 Scale: 0.0132 \n", + "Min. group size: 4 Log-Likelihood: 10.3933 \n", + "Max. group size: 4 Converged: Yes \n", + "Mean group size: 4.0 \n", + "---------------------------------------------------------------\n", + " Coef. Std.Err. z P>|z| [0.025 0.975]\n", + "---------------------------------------------------------------\n", + "Intercept 0.781 0.066 11.880 0.000 0.652 0.910\n", + "method[T.Restricted] -0.207 0.044 -4.747 0.000 -0.292 -0.121\n", + "Group Var 0.024 0.154 \n", + "===============================================================\n", + "\n" + ] + } + ], + "source": [ + "rep_md = smf.mixedlm('prop_va_neg ~ method', targcomp, groups=targcomp[\"subject\"])\n", + "rep_mdf = rep_md.fit(method=[\"lbfgs\"])\n", + "print(rep_mdf.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "c70ac29c-c99c-4614-9e5f-1aaf374f532c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Intercept 1.507060e-32\n", + "method[T.Restricted] 2.065298e-06\n", + "Group Var 1.827803e-01\n", + "dtype: float64" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rep_mdf.pvalues" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "db20811d-35a3-4dc6-ba44-45057adf5383", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "targcomp['subject_session'] = targcomp.subject + '_' + targcomp.session.astype(str)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "ba0e6341-8100-4a6e-aa9f-9836fee20231", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "targcomp['Weighted Mean SGC Correlation'] = targcomp.rep_va_mean\n", + "targcomp['Proportion of Stimulated Cortex\\nAnticorrelated with SGC'] = targcomp.prop_va_neg\n", + "targcomp['Targeting Method'] = targcomp.method" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "id": "3c949fd0-08cb-4164-b134-15dccaede741", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "colors = [\n", + " '#1f77b4', \n", + " '#aec7e8', \n", + " '#ff7f0e',\n", + " '#ffbb78',\n", + " '#2ca02c',\n", + " '#98df8a', \n", + " '#d62728', \n", + " '#ff9896', \n", + " '#9467bd', \n", + " '#c5b0d5', \n", + " '#8c564b', \n", + " '#c49c94', \n", + " '#e377c2', \n", + " '#f7b6d2', \n", + "]\n", + "colors = sns.color_palette(colors)" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "d5b1867b-5d5b-4f06-afd1-d834efc744be", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "sns.set_palette(colors)" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "ed52026c-560c-4709-aebe-a42eb2a153d5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "markers = [\"o\", \"+\"] * 7" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "42dedd1a-0cd9-445c-bfe1-24babbcddae4", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjectsessionrep_va_meanprop_va_negin_stim_vapos_ixs_idxmethodpeak_valclust_sizemni_coordssubject_sessionWeighted Mean SGC CorrelationProportion of Stimulated Cortex\\nAnticorrelated with SGCTargeting Method
1619245461-0.1502590.8097060.1512454927871ComprehensiveNaNNaN[-40.11714, 47.387764, 11.240886]24546_1-0.1502590.809706Comprehensive
1726245462-0.0964430.8168550.1512454927871ComprehensiveNaNNaN[-40.11714, 47.387764, 11.240886]24546_2-0.0964430.816855Comprehensive
110245631-0.0290360.7390290.21177911027872ComprehensiveNaNNaN[-34.50406, 57.268967, 10.119094]24563_1-0.0290360.739029Comprehensive
142245632-0.0281030.6282950.275053611630ComprehensiveNaNNaN[-48.121742, 37.288322, 1.9380682]24563_2-0.0281030.628295Comprehensive
273245731-0.0860390.8474460.311042129729ComprehensiveNaNNaN[-43.051376, 50.11994, 13.479204]24573_1-0.0860390.847446Comprehensive
392245732-0.0754140.7937420.311042129729ComprehensiveNaNNaN[-43.051376, 50.11994, 13.479204]24573_2-0.0754140.793742Comprehensive
568247041-0.0022840.5353440.2783075819104ComprehensiveNaNNaN[-50.054924, 18.272905, 26.244633]24704_1-0.0022840.535344Comprehensive
679247042-0.0033500.4790830.3723045630357ComprehensiveNaNNaN[-45.9921, 23.879623, 27.237137]24704_2-0.0033500.479083Comprehensive
811247181-0.1594100.9716960.5460987529575ComprehensiveNaNNaN[-37.54056, 45.91867, 27.724985]24718_1-0.1594100.971696Comprehensive
900247182-0.1231190.9689910.3292693310149ComprehensiveNaNNaN[-40.210518, 52.13172, 6.2416377]24718_2-0.1231190.968991Comprehensive
1031247401-0.1230680.8720370.7464423329679ComprehensiveNaNNaN[-36.542202, 47.720997, 23.312147]24740_1-0.1230680.872037Comprehensive
1156247402-0.1250680.7516270.7464423329679ComprehensiveNaNNaN[-36.542202, 47.720997, 23.312147]24740_2-0.1250680.751627Comprehensive
1286247421-0.1815460.8623160.5054993829966ComprehensiveNaNNaN[-35.36554, 41.245953, 29.72484]24742_1-0.1815460.862316Comprehensive
1447247422-0.1677570.8545870.5054993829966ComprehensiveNaNNaN[-35.36554, 41.245953, 29.72484]24742_2-0.1677570.854587Comprehensive
0245462-0.0592960.724703NaN018862Restricted-0.172753430.0[-53.319294, 16.178217, 18.447838]24546_2-0.0592960.724703Restricted
5245461-0.0899990.700807NaN110106Restricted-0.426592449.0[-51.844856, 33.79502, 13.617627]24546_1-0.0899990.700807Restricted
82456310.0403520.209117NaN011628Restricted-0.092104197.0[-51.001358, 36.882553, 4.7775683]24563_10.0403520.209117Restricted
13245632-0.0191810.568214NaN111659Restricted-0.170577442.0[-47.033092, 41.407192, 4.2015266]24563_2-0.0191810.568214Restricted
16245731-0.0083780.553489NaN018782Restricted-0.249221449.0[-48.868458, 32.712173, 13.365688]24573_1-0.0083780.553489Restricted
21245732-0.0228150.549053NaN118391Restricted-0.231708377.0[-47.10988, 36.04391, 5.4283257]24573_2-0.0228150.549053Restricted
242470410.0062540.445805NaN018820Restricted-0.09763571.0[-51.285946, 22.63533, 17.313612]24704_10.0062540.445805Restricted
292470420.0504840.349516NaN118819Restricted-0.268823380.0[-50.96127, 21.02021, 17.442978]24704_20.0504840.349516Restricted
32247182-0.1152410.960091NaN018862Restricted-0.166929489.0[-52.545464, 14.0646, 25.616112]24718_2-0.1152410.960091Restricted
37247181-0.1401730.949834NaN118829Restricted-0.230965431.0[-47.907833, 34.350525, 25.051294]24718_1-0.1401730.949834Restricted
402474010.0239670.322065NaN018872Restricted-0.261740348.0[-49.228146, 37.344795, 16.734148]24740_10.0239670.322065Restricted
44247402-0.0722420.608276NaN118831Restricted-0.342271310.0[-43.26607, 39.2656, 14.580873]24740_2-0.0722420.608276Restricted
46247422-0.1064390.688931NaN018399Restricted-0.325432375.0[-44.731724, 47.608543, 12.024196]24742_2-0.1064390.688931Restricted
492474210.0070800.409774NaN118401Restricted-0.348356346.0[-41.4416, 47.868946, 8.601941]24742_10.0070800.409774Restricted
\n", + "
" + ], + "text/plain": [ + " subject session rep_va_mean prop_va_neg in_stim_va pos_ix s_idx \\\n", + "1619 24546 1 -0.150259 0.809706 0.151245 49 27871 \n", + "1726 24546 2 -0.096443 0.816855 0.151245 49 27871 \n", + "110 24563 1 -0.029036 0.739029 0.211779 110 27872 \n", + "142 24563 2 -0.028103 0.628295 0.275053 6 11630 \n", + "273 24573 1 -0.086039 0.847446 0.311042 1 29729 \n", + "392 24573 2 -0.075414 0.793742 0.311042 1 29729 \n", + "568 24704 1 -0.002284 0.535344 0.278307 58 19104 \n", + "679 24704 2 -0.003350 0.479083 0.372304 56 30357 \n", + "811 24718 1 -0.159410 0.971696 0.546098 75 29575 \n", + "900 24718 2 -0.123119 0.968991 0.329269 33 10149 \n", + "1031 24740 1 -0.123068 0.872037 0.746442 33 29679 \n", + "1156 24740 2 -0.125068 0.751627 0.746442 33 29679 \n", + "1286 24742 1 -0.181546 0.862316 0.505499 38 29966 \n", + "1447 24742 2 -0.167757 0.854587 0.505499 38 29966 \n", + "0 24546 2 -0.059296 0.724703 NaN 0 18862 \n", + "5 24546 1 -0.089999 0.700807 NaN 1 10106 \n", + "8 24563 1 0.040352 0.209117 NaN 0 11628 \n", + "13 24563 2 -0.019181 0.568214 NaN 1 11659 \n", + "16 24573 1 -0.008378 0.553489 NaN 0 18782 \n", + "21 24573 2 -0.022815 0.549053 NaN 1 18391 \n", + "24 24704 1 0.006254 0.445805 NaN 0 18820 \n", + "29 24704 2 0.050484 0.349516 NaN 1 18819 \n", + "32 24718 2 -0.115241 0.960091 NaN 0 18862 \n", + "37 24718 1 -0.140173 0.949834 NaN 1 18829 \n", + "40 24740 1 0.023967 0.322065 NaN 0 18872 \n", + "44 24740 2 -0.072242 0.608276 NaN 1 18831 \n", + "46 24742 2 -0.106439 0.688931 NaN 0 18399 \n", + "49 24742 1 0.007080 0.409774 NaN 1 18401 \n", + "\n", + " method peak_val clust_size mni_coords \\\n", + "1619 Comprehensive NaN NaN [-40.11714, 47.387764, 11.240886] \n", + "1726 Comprehensive NaN NaN [-40.11714, 47.387764, 11.240886] \n", + "110 Comprehensive NaN NaN [-34.50406, 57.268967, 10.119094] \n", + "142 Comprehensive NaN NaN [-48.121742, 37.288322, 1.9380682] \n", + "273 Comprehensive NaN NaN [-43.051376, 50.11994, 13.479204] \n", + "392 Comprehensive NaN NaN [-43.051376, 50.11994, 13.479204] \n", + "568 Comprehensive NaN NaN [-50.054924, 18.272905, 26.244633] \n", + "679 Comprehensive NaN NaN [-45.9921, 23.879623, 27.237137] \n", + "811 Comprehensive NaN NaN [-37.54056, 45.91867, 27.724985] \n", + "900 Comprehensive NaN NaN [-40.210518, 52.13172, 6.2416377] \n", + "1031 Comprehensive NaN NaN [-36.542202, 47.720997, 23.312147] \n", + "1156 Comprehensive NaN NaN [-36.542202, 47.720997, 23.312147] \n", + "1286 Comprehensive NaN NaN [-35.36554, 41.245953, 29.72484] \n", + "1447 Comprehensive NaN NaN [-35.36554, 41.245953, 29.72484] \n", + "0 Restricted -0.172753 430.0 [-53.319294, 16.178217, 18.447838] \n", + "5 Restricted -0.426592 449.0 [-51.844856, 33.79502, 13.617627] \n", + "8 Restricted -0.092104 197.0 [-51.001358, 36.882553, 4.7775683] \n", + "13 Restricted -0.170577 442.0 [-47.033092, 41.407192, 4.2015266] \n", + "16 Restricted -0.249221 449.0 [-48.868458, 32.712173, 13.365688] \n", + "21 Restricted -0.231708 377.0 [-47.10988, 36.04391, 5.4283257] \n", + "24 Restricted -0.097635 71.0 [-51.285946, 22.63533, 17.313612] \n", + "29 Restricted -0.268823 380.0 [-50.96127, 21.02021, 17.442978] \n", + "32 Restricted -0.166929 489.0 [-52.545464, 14.0646, 25.616112] \n", + "37 Restricted -0.230965 431.0 [-47.907833, 34.350525, 25.051294] \n", + "40 Restricted -0.261740 348.0 [-49.228146, 37.344795, 16.734148] \n", + "44 Restricted -0.342271 310.0 [-43.26607, 39.2656, 14.580873] \n", + "46 Restricted -0.325432 375.0 [-44.731724, 47.608543, 12.024196] \n", + "49 Restricted -0.348356 346.0 [-41.4416, 47.868946, 8.601941] \n", + "\n", + " subject_session Weighted Mean SGC Correlation \\\n", + "1619 24546_1 -0.150259 \n", + "1726 24546_2 -0.096443 \n", + "110 24563_1 -0.029036 \n", + "142 24563_2 -0.028103 \n", + "273 24573_1 -0.086039 \n", + "392 24573_2 -0.075414 \n", + "568 24704_1 -0.002284 \n", + "679 24704_2 -0.003350 \n", + "811 24718_1 -0.159410 \n", + "900 24718_2 -0.123119 \n", + "1031 24740_1 -0.123068 \n", + "1156 24740_2 -0.125068 \n", + "1286 24742_1 -0.181546 \n", + "1447 24742_2 -0.167757 \n", + "0 24546_2 -0.059296 \n", + "5 24546_1 -0.089999 \n", + "8 24563_1 0.040352 \n", + "13 24563_2 -0.019181 \n", + "16 24573_1 -0.008378 \n", + "21 24573_2 -0.022815 \n", + "24 24704_1 0.006254 \n", + "29 24704_2 0.050484 \n", + "32 24718_2 -0.115241 \n", + "37 24718_1 -0.140173 \n", + "40 24740_1 0.023967 \n", + "44 24740_2 -0.072242 \n", + "46 24742_2 -0.106439 \n", + "49 24742_1 0.007080 \n", + "\n", + " Proportion of Stimulated Cortex\\nAnticorrelated with SGC \\\n", + "1619 0.809706 \n", + "1726 0.816855 \n", + "110 0.739029 \n", + "142 0.628295 \n", + "273 0.847446 \n", + "392 0.793742 \n", + "568 0.535344 \n", + "679 0.479083 \n", + "811 0.971696 \n", + "900 0.968991 \n", + "1031 0.872037 \n", + "1156 0.751627 \n", + "1286 0.862316 \n", + "1447 0.854587 \n", + "0 0.724703 \n", + "5 0.700807 \n", + "8 0.209117 \n", + "13 0.568214 \n", + "16 0.553489 \n", + "21 0.549053 \n", + "24 0.445805 \n", + "29 0.349516 \n", + "32 0.960091 \n", + "37 0.949834 \n", + "40 0.322065 \n", + "44 0.608276 \n", + "46 0.688931 \n", + "49 0.409774 \n", + "\n", + " Targeting Method \n", + "1619 Comprehensive \n", + "1726 Comprehensive \n", + "110 Comprehensive \n", + "142 Comprehensive \n", + "273 Comprehensive \n", + "392 Comprehensive \n", + "568 Comprehensive \n", + "679 Comprehensive \n", + "811 Comprehensive \n", + "900 Comprehensive \n", + "1031 Comprehensive \n", + "1156 Comprehensive \n", + "1286 Comprehensive \n", + "1447 Comprehensive \n", + "0 Restricted \n", + "5 Restricted \n", + "8 Restricted \n", + "13 Restricted \n", + "16 Restricted \n", + "21 Restricted \n", + "24 Restricted \n", + "29 Restricted \n", + "32 Restricted \n", + "37 Restricted \n", + "40 Restricted \n", + "44 Restricted \n", + "46 Restricted \n", + "49 Restricted " + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "targcomp" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "8a512312-eacf-401b-99aa-f8a5cbf711a1", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.6823529411764706, 0.7803921568627451, 0.9098039215686274)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((1.0, 0.7333333333333333, 0.47058823529411764)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.596078431372549, 0.8745098039215686, 0.5411764705882353)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((1.0, 0.596078431372549, 0.5882352941176471)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.7725490196078432, 0.6901960784313725, 0.8352941176470589)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.7686274509803922, 0.611764705882353, 0.5803921568627451)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.9686274509803922, 0.7137254901960784, 0.8235294117647058)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for_key = targcomp.groupby('subject_session')[['subject', 'session']].first().reset_index()\n", + "for_key = for_key.rename(columns={'subject':'Participant', 'session':'Session'})\n", + "fig, ax = plt.subplots(1, figsize=(1.75,3))\n", + "g = sns.pointplot(\n", + " data=for_key,\n", + " y='Participant',\n", + " x='Session',\n", + " hue='subject_session',\n", + " ax=ax,\n", + " markers=markers\n", + ")\n", + "ax.get_legend().remove()\n", + "ax.set_xlim([0.6, 2.6])\n", + "ax.set_xticks([1,2])\n", + "sns.despine(ax=ax)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "0e1c7cff-9aa0-4e2b-85fc-20afccacd567", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.6823529411764706, 0.7803921568627451, 0.9098039215686274)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((1.0, 0.7333333333333333, 0.47058823529411764)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.596078431372549, 0.8745098039215686, 0.5411764705882353)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((1.0, 0.596078431372549, 0.5882352941176471)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.7725490196078432, 0.6901960784313725, 0.8352941176470589)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.7686274509803922, 0.611764705882353, 0.5803921568627451)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.9686274509803922, 0.7137254901960784, 0.8235294117647058)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.6823529411764706, 0.7803921568627451, 0.9098039215686274)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((1.0, 0.7333333333333333, 0.47058823529411764)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.596078431372549, 0.8745098039215686, 0.5411764705882353)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((1.0, 0.596078431372549, 0.5882352941176471)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.7725490196078432, 0.6901960784313725, 0.8352941176470589)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.7686274509803922, 0.611764705882353, 0.5803921568627451)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.9686274509803922, 0.7137254901960784, 0.8235294117647058)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axes = plt.subplots(1,2)\n", + "ax = axes[0]\n", + "g = sns.pointplot(\n", + " data=targcomp,\n", + " x='Targeting Method',\n", + " y='Weighted Mean SGC Correlation',\n", + " hue='subject_session',\n", + " hue_order=for_key.subject_session,\n", + " ax=ax,\n", + " markers=markers\n", + ")\n", + "ax.get_legend().remove()\n", + "ax = axes[1]\n", + "g = sns.pointplot(\n", + " data=targcomp,\n", + " x='Targeting Method',\n", + " y='Proportion of Stimulated Cortex\\nAnticorrelated with SGC',\n", + " hue='subject_session',\n", + " hue_order=for_key.subject_session,\n", + " ax=ax,\n", + " markers=markers\n", + ")\n", + "ax.get_legend().remove()\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "markdown", + "id": "aa1f719c-906b-4cb7-8b9a-c9ab4e04ebad", + "metadata": {}, + "source": [ + "# Compare reproducibility" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "9412d2a1-398f-49f0-8dbf-136dd992e19b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "method\n", + "Comprehensive 0.571429\n", + "Restricted 0.000000\n", + "Name: same_targ, dtype: float64" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "same_targ = targcomp.groupby(['method', 'subject']).pos_ix.nunique().reset_index()\n", + "same_targ['same_targ'] = same_targ.pos_ix == 1\n", + "same_targ.groupby('method').same_targ.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "5232b045-1955-448d-9734-ced25d171ea9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methodsubjectpos_ixsame_targ
0Comprehensive245461True
1Comprehensive245632False
2Comprehensive245731True
3Comprehensive247042False
4Comprehensive247182False
5Comprehensive247401True
6Comprehensive247421True
7Restricted245462False
8Restricted245632False
9Restricted245732False
10Restricted247042False
11Restricted247182False
12Restricted247402False
13Restricted247422False
\n", + "
" + ], + "text/plain": [ + " method subject pos_ix same_targ\n", + "0 Comprehensive 24546 1 True\n", + "1 Comprehensive 24563 2 False\n", + "2 Comprehensive 24573 1 True\n", + "3 Comprehensive 24704 2 False\n", + "4 Comprehensive 24718 2 False\n", + "5 Comprehensive 24740 1 True\n", + "6 Comprehensive 24742 1 True\n", + "7 Restricted 24546 2 False\n", + "8 Restricted 24563 2 False\n", + "9 Restricted 24573 2 False\n", + "10 Restricted 24704 2 False\n", + "11 Restricted 24718 2 False\n", + "12 Restricted 24740 2 False\n", + "13 Restricted 24742 2 False" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "same_targ" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "283a8564-aa32-44ef-ac87-a295d76fb9e2", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "same_targ['scalp_dist'] = 0.\n", + "same_targ['ctx_dist'] = 0.\n", + "same_targ['mni_ctx_dist'] = 0.\n", + "\n", + "same_targ['stim_corr'] = 1.\n", + "same_targ['stim_nz_corr'] = 1.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "baedfd41-8025-4f28-adcc-c1e3f3c07c9a", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methodsubjectpos_ixsame_targscalp_distctx_distmni_ctx_diststim_corrstim_nz_corr
0Comprehensive245461True0.00.00.01.01.0
1Comprehensive245632False0.00.00.01.01.0
2Comprehensive245731True0.00.00.01.01.0
3Comprehensive247042False0.00.00.01.01.0
4Comprehensive247182False0.00.00.01.01.0
5Comprehensive247401True0.00.00.01.01.0
6Comprehensive247421True0.00.00.01.01.0
7Restricted245462False0.00.00.01.01.0
8Restricted245632False0.00.00.01.01.0
9Restricted245732False0.00.00.01.01.0
10Restricted247042False0.00.00.01.01.0
11Restricted247182False0.00.00.01.01.0
12Restricted247402False0.00.00.01.01.0
13Restricted247422False0.00.00.01.01.0
\n", + "
" + ], + "text/plain": [ + " method subject pos_ix same_targ scalp_dist ctx_dist \\\n", + "0 Comprehensive 24546 1 True 0.0 0.0 \n", + "1 Comprehensive 24563 2 False 0.0 0.0 \n", + "2 Comprehensive 24573 1 True 0.0 0.0 \n", + "3 Comprehensive 24704 2 False 0.0 0.0 \n", + "4 Comprehensive 24718 2 False 0.0 0.0 \n", + "5 Comprehensive 24740 1 True 0.0 0.0 \n", + "6 Comprehensive 24742 1 True 0.0 0.0 \n", + "7 Restricted 24546 2 False 0.0 0.0 \n", + "8 Restricted 24563 2 False 0.0 0.0 \n", + "9 Restricted 24573 2 False 0.0 0.0 \n", + "10 Restricted 24704 2 False 0.0 0.0 \n", + "11 Restricted 24718 2 False 0.0 0.0 \n", + "12 Restricted 24740 2 False 0.0 0.0 \n", + "13 Restricted 24742 2 False 0.0 0.0 \n", + "\n", + " mni_ctx_dist stim_corr stim_nz_corr \n", + "0 0.0 1.0 1.0 \n", + "1 0.0 1.0 1.0 \n", + "2 0.0 1.0 1.0 \n", + "3 0.0 1.0 1.0 \n", + "4 0.0 1.0 1.0 \n", + "5 0.0 1.0 1.0 \n", + "6 0.0 1.0 1.0 \n", + "7 0.0 1.0 1.0 \n", + "8 0.0 1.0 1.0 \n", + "9 0.0 1.0 1.0 \n", + "10 0.0 1.0 1.0 \n", + "11 0.0 1.0 1.0 \n", + "12 0.0 1.0 1.0 \n", + "13 0.0 1.0 1.0 " + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "same_targ" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "c277cca0-8a37-4e14-834f-e46a8f9a4b3a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ses_comp_cols = [\n", + " 'subject',\n", + " 'subject_pos',\n", + " 'smoothing',\n", + " 'pos_ix',\n", + " 'weighted_n',\n", + " 'area',\n", + " 'weighted_area',\n", + " 'rep_r_rank',\n", + " 'rep_rva_rank',\n", + " 'rep_mean',\n", + " 'rep_va_mean',\n", + " 'rep_std',\n", + " 'rep_t',\n", + " 'prop_neg',\n", + " 'prop_va_neg',\n", + " 'in_stim',\n", + " 'in_stim_va',\n", + " 'bx',\n", + " 'by',\n", + " 'bz',\n", + " 's_x',\n", + " 's_y',\n", + " 's_z',\n", + " 's_idx',\n", + " 'z_angle'\n", + "]\n", + "stim_stats_rev['subject_pos'] = stim_stats_rev.subject + '_' + stim_stats_rev.pos_ix.astype(str)\n", + "ss1 = stim_stats_rev.query('session == 1').loc[:, ses_comp_cols] \n", + "ss2 = stim_stats_rev.query('session == 2').loc[:, ses_comp_cols] \n", + "ssw = ss1.merge(ss2, how='inner', on=['subject', 'smoothing'], suffixes=['_1', '_2'])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "630b02d3-3607-467c-9912-af1119631d8a", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "ss1_winners = ss1.loc[ss1.rep_rva_rank == 1, 'subject_pos'].values\n", + "ss2_winners = ss2.loc[ss2.rep_rva_rank == 1, 'subject_pos'].values" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "527b1f0d-d738-4692-a71c-71a54d952bc8", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "s1_on_s2 = ss2.loc[ss2.subject_pos.isin(ss1_winners), ['subject', 'rep_va_mean', 'prop_va_neg', ]]\n", + "s1_on_s2['session'] = 2\n", + "s2_on_s1 = ss1.loc[ss1.subject_pos.isin(ss2_winners), ['subject', 'rep_va_mean', 'prop_va_neg', ]]\n", + "s2_on_s1['session'] = 1\n", + "cross_ses = pd.concat([s1_on_s2, s2_on_s1])\n", + "cross_ses['method'] = 'Comprehensive'\n", + "\n", + "alt_s1_on_s2 = bgssw.query('smoothing==2.55').loc[bgssw.peak_pos_1 == bgssw.pos_ix_2, ['subject', 'rep_va_mean_2', 'prop_va_neg_2']].groupby('subject').first().reset_index()\n", + "alt_s1_on_s2 = alt_s1_on_s2.rename(columns={'rep_va_mean_2':'rep_va_mean', 'prop_va_neg_2': 'prop_va_neg'})\n", + "alt_s1_on_s2['session'] = 2\n", + "alt_s2_on_s1 = bgssw.query('smoothing==2.55').loc[bgssw.peak_pos_2 == bgssw.pos_ix_1, ['subject', 'rep_va_mean_1', 'prop_va_neg_1']].groupby('subject').first().reset_index()\n", + "alt_s2_on_s1 = alt_s2_on_s1.rename(columns={'rep_va_mean_1':'rep_va_mean', 'prop_va_neg_1': 'prop_va_neg'})\n", + "alt_s2_on_s1['session'] = 1\n", + "\n", + "alt_cross_ses = pd.concat([ alt_s1_on_s2, alt_s2_on_s1])\n", + "alt_cross_ses['method'] = 'Restricted'\n", + "\n", + "cross_ses = pd.concat([cross_ses, alt_cross_ses])" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "id": "06b3771c-f03a-4b3a-8c54-893293fdc8ef", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "cross_ses['subject_session'] = cross_ses.subject +'_'+cross_ses.session.astype(str)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "0d14ee65-a9b9-4334-9df6-6cce099ee3b1", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjectrep_va_meanprop_va_negsessionmethodsubject_session
24624563-0.0115000.5057982Comprehensive24563_2
39224573-0.0754140.7937422Comprehensive24573_2
68124704-0.0000290.4570382Comprehensive24704_2
94224718-0.1190190.9780462Comprehensive24718_2
115624740-0.1250680.7516272Comprehensive24740_2
144724742-0.1677570.8545872Comprehensive24742_2
172624546-0.0964430.8168552Comprehensive24546_2
624563-0.0262950.6854311Comprehensive24563_1
27324573-0.0860390.8474461Comprehensive24573_1
566247040.0045710.4882031Comprehensive24704_1
76924718-0.1568660.9499121Comprehensive24718_1
103124740-0.1230680.8720371Comprehensive24740_1
128624742-0.1815460.8623161Comprehensive24742_1
161924546-0.1502590.8097061Comprehensive24546_1
024546-0.0501620.6617972Restricted24546_2
1245630.0625060.1763222Restricted24563_2
224573-0.0285430.6206582Restricted24573_2
324704-0.0013870.4783542Restricted24704_2
424718-0.1162450.9704232Restricted24718_2
5247400.0640870.2632482Restricted24740_2
6247420.0085460.3866422Restricted24742_2
024546-0.0944150.7337311Restricted24546_1
124563-0.0273660.6867061Restricted24563_1
2245730.0110890.4957831Restricted24573_1
3247040.0469790.3079371Restricted24704_1
424718-0.1472950.9526171Restricted24718_1
524740-0.0789100.7062511Restricted24740_1
624742-0.1142720.6627931Restricted24742_1
\n", + "
" + ], + "text/plain": [ + " subject rep_va_mean prop_va_neg session method subject_session\n", + "246 24563 -0.011500 0.505798 2 Comprehensive 24563_2\n", + "392 24573 -0.075414 0.793742 2 Comprehensive 24573_2\n", + "681 24704 -0.000029 0.457038 2 Comprehensive 24704_2\n", + "942 24718 -0.119019 0.978046 2 Comprehensive 24718_2\n", + "1156 24740 -0.125068 0.751627 2 Comprehensive 24740_2\n", + "1447 24742 -0.167757 0.854587 2 Comprehensive 24742_2\n", + "1726 24546 -0.096443 0.816855 2 Comprehensive 24546_2\n", + "6 24563 -0.026295 0.685431 1 Comprehensive 24563_1\n", + "273 24573 -0.086039 0.847446 1 Comprehensive 24573_1\n", + "566 24704 0.004571 0.488203 1 Comprehensive 24704_1\n", + "769 24718 -0.156866 0.949912 1 Comprehensive 24718_1\n", + "1031 24740 -0.123068 0.872037 1 Comprehensive 24740_1\n", + "1286 24742 -0.181546 0.862316 1 Comprehensive 24742_1\n", + "1619 24546 -0.150259 0.809706 1 Comprehensive 24546_1\n", + "0 24546 -0.050162 0.661797 2 Restricted 24546_2\n", + "1 24563 0.062506 0.176322 2 Restricted 24563_2\n", + "2 24573 -0.028543 0.620658 2 Restricted 24573_2\n", + "3 24704 -0.001387 0.478354 2 Restricted 24704_2\n", + "4 24718 -0.116245 0.970423 2 Restricted 24718_2\n", + "5 24740 0.064087 0.263248 2 Restricted 24740_2\n", + "6 24742 0.008546 0.386642 2 Restricted 24742_2\n", + "0 24546 -0.094415 0.733731 1 Restricted 24546_1\n", + "1 24563 -0.027366 0.686706 1 Restricted 24563_1\n", + "2 24573 0.011089 0.495783 1 Restricted 24573_1\n", + "3 24704 0.046979 0.307937 1 Restricted 24704_1\n", + "4 24718 -0.147295 0.952617 1 Restricted 24718_1\n", + "5 24740 -0.078910 0.706251 1 Restricted 24740_1\n", + "6 24742 -0.114272 0.662793 1 Restricted 24742_1" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cross_ses" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "id": "dad80e54-6336-4412-9b01-3dee2cdb3ba6", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "cross_ses['Targeting Method'] = cross_ses.method\n", + "cross_ses['Weighted Mean SGC Correlation'] = cross_ses.rep_va_mean\n", + "cross_ses['Proportion of Stimulated Cortex\\nAnticorrelated with SGC'] = cross_ses.prop_va_neg" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "id": "419e7853-8846-4106-a11f-18a25f7fd5cb", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.6823529411764706, 0.7803921568627451, 0.9098039215686274)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((1.0, 0.7333333333333333, 0.47058823529411764)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.596078431372549, 0.8745098039215686, 0.5411764705882353)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((1.0, 0.596078431372549, 0.5882352941176471)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.7725490196078432, 0.6901960784313725, 0.8352941176470589)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.7686274509803922, 0.611764705882353, 0.5803921568627451)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.9686274509803922, 0.7137254901960784, 0.8235294117647058)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead\n", + " if pd.api.types.is_categorical_dtype(vector):\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.6823529411764706, 0.7803921568627451, 0.9098039215686274)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((1.0, 0.7333333333333333, 0.47058823529411764)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.596078431372549, 0.8745098039215686, 0.5411764705882353)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((1.0, 0.596078431372549, 0.5882352941176471)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.7725490196078432, 0.6901960784313725, 0.8352941176470589)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.7686274509803922, 0.611764705882353, 0.5803921568627451)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n", + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/seaborn/categorical.py:1728: UserWarning: You passed a edgecolor/edgecolors ((0.9686274509803922, 0.7137254901960784, 0.8235294117647058)) for an unfilled marker ('+'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future.\n", + " ax.scatter(x, y, label=hue_level,\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axes = plt.subplots(1,2)\n", + "ax = axes[0]\n", + "g = sns.pointplot(\n", + " data=cross_ses,\n", + " x='Targeting Method',\n", + " y='Weighted Mean SGC Correlation',\n", + " hue='subject_session',\n", + " hue_order =for_key.subject_session,\n", + " ax=ax,\n", + " markers=markers\n", + ")\n", + "ax.get_legend().remove()\n", + "ax = axes[1]\n", + "g = sns.pointplot(\n", + " data=cross_ses,\n", + " x='Targeting Method',\n", + " y='Proportion of Stimulated Cortex\\nAnticorrelated with SGC',\n", + " hue='subject_session',\n", + " hue_order =for_key.subject_session,\n", + " ax=ax,\n", + " markers=markers\n", + ")\n", + "ax.get_legend().remove()\n", + "fig.tight_layout()" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "e242e59c-7206-45cd-9026-fac961043337", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Mixed Linear Model Regression Results\n", + "===============================================================\n", + "Model: MixedLM Dependent Variable: rep_va_mean\n", + "No. Observations: 28 Method: REML \n", + "No. Groups: 7 Scale: 0.0020 \n", + "Min. group size: 4 Log-Likelihood: 35.7604 \n", + "Max. group size: 4 Converged: Yes \n", + "Mean group size: 4.0 \n", + "---------------------------------------------------------------\n", + " Coef. Std.Err. z P>|z| [0.025 0.975]\n", + "---------------------------------------------------------------\n", + "Intercept -0.094 0.023 -4.115 0.000 -0.139 -0.049\n", + "method[T.Restricted] 0.061 0.017 3.593 0.000 0.028 0.094\n", + "Group Var 0.003 0.046 \n", + "===============================================================\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/gpfs/gsfs10/users/MLDSST/nielsond/target_test/env/lib/python3.9/site-packages/statsmodels/regression/mixed_linear_model.py:2238: ConvergenceWarning: The MLE may be on the boundary of the parameter space.\n", + " warnings.warn(msg, ConvergenceWarning)\n" + ] + } + ], + "source": [ + "rep_md = smf.mixedlm('rep_va_mean ~ method', cross_ses, groups=cross_ses[\"subject\"])\n", + "rep_mdf = rep_md.fit(method=[\"lbfgs\"])\n", + "print(rep_mdf.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "8b36a46b-7c15-4b0e-8d46-badb7cfc5b7c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Intercept 0.000039\n", + "method[T.Restricted] 0.000327\n", + "Group Var 0.201159\n", + "dtype: float64" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rep_mdf.pvalues" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "id": "72abc5eb-96d3-46dd-ab30-0bd12758576b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Mixed Linear Model Regression Results\n", + "===============================================================\n", + "Model: MixedLM Dependent Variable: prop_va_neg\n", + "No. Observations: 28 Method: REML \n", + "No. Groups: 7 Scale: 0.0208 \n", + "Min. group size: 4 Log-Likelihood: 5.6576 \n", + "Max. group size: 4 Converged: Yes \n", + "Mean group size: 4.0 \n", + "---------------------------------------------------------------\n", + " Coef. Std.Err. z P>|z| [0.025 0.975]\n", + "---------------------------------------------------------------\n", + "Intercept 0.762 0.070 10.881 0.000 0.625 0.900\n", + "method[T.Restricted] -0.184 0.054 -3.370 0.001 -0.290 -0.077\n", + "Group Var 0.024 0.133 \n", + "===============================================================\n", + "\n" + ] + } + ], + "source": [ + "rep_md = smf.mixedlm('prop_va_neg ~ method', cross_ses, groups=cross_ses[\"subject\"])\n", + "rep_mdf = rep_md.fit(method=[\"lbfgs\"])\n", + "print(rep_mdf.summary())" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "69900eef-0590-4c8b-b3da-6f9dbb6b2158", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Intercept 1.422022e-27\n", + "method[T.Restricted] 7.526951e-04\n", + "Group Var 2.117418e-01\n", + "dtype: float64" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rep_mdf.pvalues" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "199786bf-fa17-46e3-8624-278ca0577911", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjectrep_va_meanprop_va_negsessionmethod
024546-0.0501620.6617972Restricted
1245630.0625060.1763222Restricted
224573-0.0285430.6206582Restricted
324704-0.0013870.4783542Restricted
424718-0.1162450.9704232Restricted
5247400.0640870.2632482Restricted
6247420.0085460.3866422Restricted
024546-0.0944150.7337311Restricted
124563-0.0273660.6867061Restricted
2245730.0110890.4957831Restricted
3247040.0469790.3079371Restricted
424718-0.1472950.9526171Restricted
524740-0.0789100.7062511Restricted
624742-0.1142720.6627931Restricted
\n", + "
" + ], + "text/plain": [ + " subject rep_va_mean prop_va_neg session method\n", + "0 24546 -0.050162 0.661797 2 Restricted\n", + "1 24563 0.062506 0.176322 2 Restricted\n", + "2 24573 -0.028543 0.620658 2 Restricted\n", + "3 24704 -0.001387 0.478354 2 Restricted\n", + "4 24718 -0.116245 0.970423 2 Restricted\n", + "5 24740 0.064087 0.263248 2 Restricted\n", + "6 24742 0.008546 0.386642 2 Restricted\n", + "0 24546 -0.094415 0.733731 1 Restricted\n", + "1 24563 -0.027366 0.686706 1 Restricted\n", + "2 24573 0.011089 0.495783 1 Restricted\n", + "3 24704 0.046979 0.307937 1 Restricted\n", + "4 24718 -0.147295 0.952617 1 Restricted\n", + "5 24740 -0.078910 0.706251 1 Restricted\n", + "6 24742 -0.114272 0.662793 1 Restricted" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "alt_cross_ses" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "5dd53743-2481-4eae-ba21-3a6161a6ecf3", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def get_mni_dist(row):\n", + " subject = row.subject\n", + " mni_surf_dir = liston_root / f'sub-{subject}/anat/MNINonLinear/fsaverage_LR32k/'\n", + " l_surf_path = mni_surf_dir / f'sub-{subject}.L.midthickness.32k_fs_LR.surf.gii'\n", + " points, triangles = nb.load(l_surf_path).agg_data()\n", + " return cdist([points[int(row.s_idx_1)]],[points[int(row.s_idx_2)]])[0][0] " + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "23b6de0d-fc9f-4fc7-af4a-f4add7880fed", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "diff_idx = (\n", + " (ssw.pos_ix_1 != ssw.pos_ix_2)\n", + " & ((ssw.rep_rva_rank_1 == 1) & (ssw.rep_rva_rank_2 == 1))\n", + ")\n", + "diff_dat = ssw.loc[diff_idx].copy()\n", + "diff_dat['method'] = 'Comprehensive'\n", + "alt_diff_dat = bgssw.loc[(bgssw.pos_ix_1 != bgssw.pos_ix_2) & (bgssw.peak_pos_1 != bgssw.peak_pos_2)].groupby('subject').first().reset_index()\n", + "alt_diff_dat['method'] = 'Restricted'\n", + "diff_dat = pd.concat([diff_dat, alt_diff_dat]).reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "id": "1bc4d861-9609-4ae2-b061-c39f447395a9", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
subjectpos_ix_1pos_ix_2rep_rva_rank_1rep_rva_rank_2peak_pos_1peak_pos_2
02456311061.01.0NaNNaN
12470458561.01.0NaNNaN
22471875331.01.0NaNNaN
32454601NaNNaN1.00.0
42456301NaNNaN0.01.0
52457301NaNNaN0.01.0
62470401NaNNaN0.01.0
72471801NaNNaN1.00.0
82474001NaNNaN0.01.0
92474201NaNNaN1.00.0
\n", + "
" + ], + "text/plain": [ + " subject pos_ix_1 pos_ix_2 rep_rva_rank_1 rep_rva_rank_2 peak_pos_1 \\\n", + "0 24563 110 6 1.0 1.0 NaN \n", + "1 24704 58 56 1.0 1.0 NaN \n", + "2 24718 75 33 1.0 1.0 NaN \n", + "3 24546 0 1 NaN NaN 1.0 \n", + "4 24563 0 1 NaN NaN 0.0 \n", + "5 24573 0 1 NaN NaN 0.0 \n", + "6 24704 0 1 NaN NaN 0.0 \n", + "7 24718 0 1 NaN NaN 1.0 \n", + "8 24740 0 1 NaN NaN 0.0 \n", + "9 24742 0 1 NaN NaN 1.0 \n", + "\n", + " peak_pos_2 \n", + "0 NaN \n", + "1 NaN \n", + "2 NaN \n", + "3 0.0 \n", + "4 1.0 \n", + "5 1.0 \n", + "6 1.0 \n", + "7 0.0 \n", + "8 1.0 \n", + "9 0.0 " + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "diff_dat.loc[:, ['subject', 'pos_ix_1', 'pos_ix_2', 'rep_rva_rank_1', 'rep_rva_rank_2', 'peak_pos_1', 'peak_pos_2']]" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "78022e1e-95b6-40f5-93d1-5bf225b73d83", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "scalp_loc_1 = diff_dat.loc[:, ['bx_1', 'by_1', 'bz_1']].values\n", + "scalp_loc_2 = diff_dat.loc[:, ['bx_2', 'by_2', 'bz_2']].values\n", + "ctx_loc_1 = diff_dat.loc[:, ['s_x_1', 's_y_1', 's_z_1']].values\n", + "ctx_loc_2 = diff_dat.loc[:, ['s_x_2', 's_y_2', 's_z_2']].values\n", + "scalp_dist = []\n", + "for sl1, sl2 in zip(scalp_loc_1, scalp_loc_2):\n", + " scalp_dist.append(cdist([sl1], [sl2])[0][0])\n", + " \n", + "ctx_dist = []\n", + "for sl1, sl2 in zip(ctx_loc_1, ctx_loc_2):\n", + " ctx_dist.append(cdist([sl1], [sl2])[0][0])\n" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "e4542c6a-7158-4dc9-aad2-41696990eae7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "mni_ctx_dist = diff_dat.reset_index().apply(get_mni_dist, axis=1).values" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "7a521320-49f8-454f-bb56-50481166c506", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "same_targ.loc[~same_targ.same_targ, 'scalp_dist'] = scalp_dist\n", + "same_targ.loc[~same_targ.same_targ, 'ctx_dist'] = ctx_dist\n", + "same_targ.loc[~same_targ.same_targ, 'mni_ctx_dist'] = mni_ctx_dist\n" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "id": "f782014f-4d57-4f64-9c81-5407bc1e1a9c", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methodsubjectpos_ixsame_targscalp_distctx_distmni_ctx_diststim_corrstim_nz_corr
0Comprehensive245461True0.0000000.0000000.0000001.01.0
1Comprehensive245632False28.88268822.79137925.5263911.01.0
2Comprehensive245731True0.0000000.0000000.0000001.01.0
3Comprehensive247042False4.9622227.6419106.9947761.01.0
4Comprehensive247182False13.31065412.45199622.5225421.01.0
5Comprehensive247401True0.0000000.0000000.0000001.01.0
6Comprehensive247421True0.0000000.0000000.0000001.01.0
7Restricted245462False16.86955717.70314418.3263931.01.0
8Restricted245632False33.8491974.4733106.0457681.01.0
9Restricted245732False30.3792666.8976758.7860571.01.0
10Restricted247042False18.3383831.6986411.6525021.01.0
11Restricted247182False8.78786515.58515620.8169491.01.0
12Restricted247402False5.3544456.2726326.6236251.01.0
13Restricted247422False18.6151284.4857624.7544241.01.0
\n", + "
" + ], + "text/plain": [ + " method subject pos_ix same_targ scalp_dist ctx_dist \\\n", + "0 Comprehensive 24546 1 True 0.000000 0.000000 \n", + "1 Comprehensive 24563 2 False 28.882688 22.791379 \n", + "2 Comprehensive 24573 1 True 0.000000 0.000000 \n", + "3 Comprehensive 24704 2 False 4.962222 7.641910 \n", + "4 Comprehensive 24718 2 False 13.310654 12.451996 \n", + "5 Comprehensive 24740 1 True 0.000000 0.000000 \n", + "6 Comprehensive 24742 1 True 0.000000 0.000000 \n", + "7 Restricted 24546 2 False 16.869557 17.703144 \n", + "8 Restricted 24563 2 False 33.849197 4.473310 \n", + "9 Restricted 24573 2 False 30.379266 6.897675 \n", + "10 Restricted 24704 2 False 18.338383 1.698641 \n", + "11 Restricted 24718 2 False 8.787865 15.585156 \n", + "12 Restricted 24740 2 False 5.354445 6.272632 \n", + "13 Restricted 24742 2 False 18.615128 4.485762 \n", + "\n", + " mni_ctx_dist stim_corr stim_nz_corr \n", + "0 0.000000 1.0 1.0 \n", + "1 25.526391 1.0 1.0 \n", + "2 0.000000 1.0 1.0 \n", + "3 6.994776 1.0 1.0 \n", + "4 22.522542 1.0 1.0 \n", + "5 0.000000 1.0 1.0 \n", + "6 0.000000 1.0 1.0 \n", + "7 18.326393 1.0 1.0 \n", + "8 6.045768 1.0 1.0 \n", + "9 8.786057 1.0 1.0 \n", + "10 1.652502 1.0 1.0 \n", + "11 20.816949 1.0 1.0 \n", + "12 6.623625 1.0 1.0 \n", + "13 4.754424 1.0 1.0 " + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "same_targ" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "b551c76f-5b54-423b-908f-e74e6d2e6f19", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "stim_corrs = []\n", + "stim_nz_corrs = []\n", + "for subject,row in diff_dat.iterrows():\n", + " subject=row.subject\n", + " src_surf_dir = liston_root / f'sub-{subject}/anat/T1w/fsaverage_LR32k/'\n", + " sim_out_dir = anat_dir / f'sub-{subject}/Simulation'\n", + " if row.method == 'Restrictive':\n", + " sim_dir = sorted(sim_out_dir.glob('alternate_targeting-*'))[-1]\n", + " else:\n", + " sim_dir = sorted(sim_out_dir.glob('simulation-*'))[-1]\n", + "\n", + " uncert_dir = sim_dir / f'uncert{uncert_n}'\n", + " #load prob map\n", + " ap_path = uncert_dir / f'sub-{subject}_space-fsLR_den-32k_desc-abovethreshactprobs_stat.dtseries.nii'\n", + " ap_img = ci.load(ap_path)\n", + " all_ap = ap_img.get_fdata()\n", + " l_ap = surf_data_from_cifti(all_ap, ap_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + " all_ap = all_ap.T\n", + "\n", + " # load va map\n", + " va_path = src_surf_dir / f'sub-{subject}.midthickness_va.32k_fs_LR.dscalar.nii'\n", + " va_img = ci.load(va_path)\n", + " all_va = va_img.get_fdata()\n", + " l_va = surf_data_from_cifti(all_va, va_img.header.get_axis(1), 'CIFTI_STRUCTURE_CORTEX_LEFT')\n", + " \n", + " flat_ap_1 = l_ap[:, int(row.pos_ix_1)]\n", + " flat_ap_2 = l_ap[:, int(row.pos_ix_2)]\n", + " flat_ap_nz_idx = (flat_ap_1 != 0) | (flat_ap_1 != 0)\n", + " \n", + " stim_corrs.append(np.corrcoef(flat_ap_1, flat_ap_2)[1,0])\n", + " stim_nz_corrs.append(np.corrcoef(flat_ap_1[flat_ap_nz_idx], flat_ap_2[flat_ap_nz_idx])[1,0])" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "ab9e1f79-e957-4b94-80fb-8f5884bd1fa7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "same_targ.loc[~same_targ.same_targ, 'stim_corr'] = stim_corrs\n", + "same_targ.loc[~same_targ.same_targ, 'stim_nz_corr'] = stim_nz_corrs" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "b0577755-961c-40b2-881e-6fe2eaf28b4b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "same_targ = same_targ.merge(inter_subject_dist.groupby('method').isdist.mean().reset_index(),how='left',on='method')" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "71c8b414-9bd7-4320-84c3-5ede68494b2b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "same_targ['inter_intra_ratio'] = same_targ.isdist / same_targ.mni_ctx_dist" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "id": "62b84d37-9288-489e-9b5b-58573cdd9e0b", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
methodsubjectpos_ixsame_targscalp_distctx_distmni_ctx_diststim_corrstim_nz_corrisdistinter_intra_ratio
0Comprehensive245461True0.0000000.0000000.0000001.0000001.00000019.714868inf
1Comprehensive245632False28.88268822.79137925.5263910.4793890.31247519.7148680.772333
2Comprehensive245731True0.0000000.0000000.0000001.0000001.00000019.714868inf
3Comprehensive247042False4.9622227.6419106.9947760.9676350.95508919.7148682.818513
4Comprehensive247182False13.31065412.45199622.5225420.6514830.58816819.7148680.875339
5Comprehensive247401True0.0000000.0000000.0000001.0000001.00000019.714868inf
6Comprehensive247421True0.0000000.0000000.0000001.0000001.00000019.714868inf
7Restricted245462False16.86955717.70314418.3263930.8179700.75481116.8424320.919026
8Restricted245632False33.8491974.4733106.0457680.5395240.42639716.8424322.785822
9Restricted245732False30.3792666.8976758.7860570.1617990.15442516.8424321.916950
10Restricted247042False18.3383831.6986411.6525020.9389940.92302716.84243210.192080
11Restricted247182False8.78786515.58515620.8169490.2587580.12048016.8424320.809073
12Restricted247402False5.3544456.2726326.6236250.8872510.85850216.8424322.542782
13Restricted247422False18.6151284.4857624.7544240.9956720.99431716.8424323.542476
\n", + "
" + ], + "text/plain": [ + " method subject pos_ix same_targ scalp_dist ctx_dist \\\n", + "0 Comprehensive 24546 1 True 0.000000 0.000000 \n", + "1 Comprehensive 24563 2 False 28.882688 22.791379 \n", + "2 Comprehensive 24573 1 True 0.000000 0.000000 \n", + "3 Comprehensive 24704 2 False 4.962222 7.641910 \n", + "4 Comprehensive 24718 2 False 13.310654 12.451996 \n", + "5 Comprehensive 24740 1 True 0.000000 0.000000 \n", + "6 Comprehensive 24742 1 True 0.000000 0.000000 \n", + "7 Restricted 24546 2 False 16.869557 17.703144 \n", + "8 Restricted 24563 2 False 33.849197 4.473310 \n", + "9 Restricted 24573 2 False 30.379266 6.897675 \n", + "10 Restricted 24704 2 False 18.338383 1.698641 \n", + "11 Restricted 24718 2 False 8.787865 15.585156 \n", + "12 Restricted 24740 2 False 5.354445 6.272632 \n", + "13 Restricted 24742 2 False 18.615128 4.485762 \n", + "\n", + " mni_ctx_dist stim_corr stim_nz_corr isdist inter_intra_ratio \n", + "0 0.000000 1.000000 1.000000 19.714868 inf \n", + "1 25.526391 0.479389 0.312475 19.714868 0.772333 \n", + "2 0.000000 1.000000 1.000000 19.714868 inf \n", + "3 6.994776 0.967635 0.955089 19.714868 2.818513 \n", + "4 22.522542 0.651483 0.588168 19.714868 0.875339 \n", + "5 0.000000 1.000000 1.000000 19.714868 inf \n", + "6 0.000000 1.000000 1.000000 19.714868 inf \n", + "7 18.326393 0.817970 0.754811 16.842432 0.919026 \n", + "8 6.045768 0.539524 0.426397 16.842432 2.785822 \n", + "9 8.786057 0.161799 0.154425 16.842432 1.916950 \n", + "10 1.652502 0.938994 0.923027 16.842432 10.192080 \n", + "11 20.816949 0.258758 0.120480 16.842432 0.809073 \n", + "12 6.623625 0.887251 0.858502 16.842432 2.542782 \n", + "13 4.754424 0.995672 0.994317 16.842432 3.542476 " + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "same_targ" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "2f7939e8-f54a-448d-a02f-7a8cddbf4edc", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "same_targ_comp = same_targ.loc[same_targ.method == 'Comprehensive', ['subject', 'scalp_dist','ctx_dist', 'mni_ctx_dist', 'inter_intra_ratio', 'stim_corr']]\n", + "same_targ_2s = same_targ.loc[same_targ.method == 'Restricted', ['subject', 'scalp_dist', 'ctx_dist', 'mni_ctx_dist', 'inter_intra_ratio', 'stim_corr']]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "84d51049-2692-488b-8c3e-aa061775789f", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Participant IDIntersession Scalp Distancectx_distIntersession Cortical DistanceIntersubject-Intrasubject RatioIntersession Correlation of Activation Probability
0245460.0000000.0000000.000000inf1.000000
12456328.88268822.79137925.5263910.7723330.479389
2245730.0000000.0000000.000000inf1.000000
3247044.9622227.6419106.9947762.8185130.967635
42471813.31065412.45199622.5225420.8753390.651483
5247400.0000000.0000000.000000inf1.000000
6247420.0000000.0000000.000000inf1.000000
\n", + "
" + ], + "text/plain": [ + " Participant ID Intersession Scalp Distance ctx_dist \\\n", + "0 24546 0.000000 0.000000 \n", + "1 24563 28.882688 22.791379 \n", + "2 24573 0.000000 0.000000 \n", + "3 24704 4.962222 7.641910 \n", + "4 24718 13.310654 12.451996 \n", + "5 24740 0.000000 0.000000 \n", + "6 24742 0.000000 0.000000 \n", + "\n", + " Intersession Cortical Distance Intersubject-Intrasubject Ratio \\\n", + "0 0.000000 inf \n", + "1 25.526391 0.772333 \n", + "2 0.000000 inf \n", + "3 6.994776 2.818513 \n", + "4 22.522542 0.875339 \n", + "5 0.000000 inf \n", + "6 0.000000 inf \n", + "\n", + " Intersession Correlation of Activation Probability \n", + "0 1.000000 \n", + "1 0.479389 \n", + "2 1.000000 \n", + "3 0.967635 \n", + "4 0.651483 \n", + "5 1.000000 \n", + "6 1.000000 " + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "display_rename = {'subject': 'Participant ID', 'same_targ':'Same Target?', 'scalp_dist':'Intersession Scalp Distance',\n", + " 'mni_ctx_dist': 'Intersession Cortical Distance', 'isdist':'Intersubject Cortical Distance',\n", + " 'inter_intra_ratio': 'Intersubject-Intrasubject Ratio', 'stim_corr': 'Intersession Correlation of Activation Probability'} \n", + "same_targ_comp.rename(columns=display_rename)" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "id": "4bf973b7-6fd9-41a6-88a0-d81b01a8eddf", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Participant IDIntersession Scalp Distancectx_distIntersession Cortical DistanceIntersubject-Intrasubject RatioIntersession Correlation of Activation Probability
72454616.86955717.70314418.3263930.9190260.817970
82456333.8491974.4733106.0457682.7858220.539524
92457330.3792666.8976758.7860571.9169500.161799
102470418.3383831.6986411.65250210.1920800.938994
11247188.78786515.58515620.8169490.8090730.258758
12247405.3544456.2726326.6236252.5427820.887251
132474218.6151284.4857624.7544243.5424760.995672
\n", + "
" + ], + "text/plain": [ + " Participant ID Intersession Scalp Distance ctx_dist \\\n", + "7 24546 16.869557 17.703144 \n", + "8 24563 33.849197 4.473310 \n", + "9 24573 30.379266 6.897675 \n", + "10 24704 18.338383 1.698641 \n", + "11 24718 8.787865 15.585156 \n", + "12 24740 5.354445 6.272632 \n", + "13 24742 18.615128 4.485762 \n", + "\n", + " Intersession Cortical Distance Intersubject-Intrasubject Ratio \\\n", + "7 18.326393 0.919026 \n", + "8 6.045768 2.785822 \n", + "9 8.786057 1.916950 \n", + "10 1.652502 10.192080 \n", + "11 20.816949 0.809073 \n", + "12 6.623625 2.542782 \n", + "13 4.754424 3.542476 \n", + "\n", + " Intersession Correlation of Activation Probability \n", + "7 0.817970 \n", + "8 0.539524 \n", + "9 0.161799 \n", + "10 0.938994 \n", + "11 0.258758 \n", + "12 0.887251 \n", + "13 0.995672 " + ] + }, + "execution_count": 106, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "same_targ_2s.rename(columns=display_rename)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}