- Python 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .gitignore | ||
| CF_Broadmann.py | ||
| CF_Harv-Oxf.py | ||
| CF_pauli.py | ||
| CF_schaefer.py | ||
| CF_yeo.py | ||
| LICENSE | ||
| Pipfile | ||
| Pipfile.lock | ||
| README.md | ||
Práctica 2
Este repositorio contiene scripts de Python para ejecutar análisis de conectividad con distintos atlas de parcelación. Funciona para la ejecución de 1 sujeto a la vez.
Consideraciones para la ejecución ⚙
Los scripts asumen que los datos fueron previamente preprocesados y hay funciones que únicamente tienen compatibilidad con outputs del pipeline fMRIPrep.
Las carpetas y los nombres de los archivos deben seguir el formato BIDS. La estructura general de un directorio BIDS (con datos sin preprocesar) es la siguiente:
data/bids/
├── CHANGES
├── dataset_description.json
├── LICENSE
├── participants.json
├── participants.tsv
├── README
├── README.md
├── sub-002
│ ├── anat
│ │ ├── sub-002_T1w.json
│ │ └── sub-002_T1w.nii.gz
│ ├── fmap
│ │ ├── sub-002_dir-PA_epi.json
│ │ └── sub-002_dir-PA_epi.nii.gz
│ └── func
│ ├── sub-002_task-rest_bold.json
│ └── sub-002_task-rest_bold.nii.gz
La estructura mínima que requieren los scripts para su ejecución es la siguiente:
data/bids/
├── dataset_description.json
├── sub-001
│ └── ses-1
│ └── func
│ ├── sub-001_task-rest_desc-preproc_bold.json
│ └── sub-001_task-rest_desc-confounds_regressors.tsv
│ ├── sub-001_task-rest_bold.dtseries.json
│ └── sub-001_task-rest_bold.dtseries.nii
Descargando este repositorio 🔽
Para tener estos datos en tu cuenta debes clonar el repositorio. Ubica el icono code en la parte superior de esta página y copia la URL de la opción ‘HTTPS’.
Ve a tu sesión y ubicate en la terminal:
Pega la url que copiaste escribiendo el comando git clone con la siguiente estructura:
git clone git@github.com:usuario/repositorio.git
Cargando el entorno virtual 📂
Este repositorio cuenta con un entorno virtual generado mediante pipenv. Este ambiente contiene información sobre todos los paquetes externos a python que se requieren para la ejecución de los scripts. Para instalar los paquetes que viven en los archivos Pipfile y Pipfile.lock ejecuta el siguiente comando en tu terminal:
pipenv sync
Ejecutando un script 📑
Para ejecutar el script, primero debes asegurarte de actualizar la ruta de fmri_dir. Una vez que te has asegurado de que el script trabaje con los datos del sujeto que elegiste, ejecuta tu archivo dentro del ambiente virtual con:
pipenv run python CF.py
Este comando ejecuta todas las instrucciones del script siempre y cuando estén escritas de manera adecuada. Para seleccionar un atlas de parcelación distinto solo debes ejecutar el archivo con el nombre del atlas elegido (ej. pipenv run python CF_pauli.py).
También puedes ir ejecutando cada línea del script. Para esto ejecuta en la terminal el comando:
pipenv run python
Al copiar y pegar las instrucciones en la terminal irás ejecutando cada línea de manera independiente. Considera que si quieres dejar de ejecutar Python tendrás que poner el comando exit() en tu terminal.
Consideraciones sobre el análisis de conectividad 🧠
Los scripts trabajan principalmente con funciones del paquete Nilearn. Nilearn contiene un conjunto de datos precargados, entre ellos atlas a los que puede accederse con el comando fetch_atlas_nombre_atlas(). Este repositorio cuenta con ejemplos de uso de 5 atlas de parcelación distintos:
Funcionalmente definidos
- Yeo 17 Networks. Consulta: documentación de nilearn o articulo.
- Schaefer 100 Parcelas. Consulta: documentación de nilearn o articulo
Anatómicamente definidos
- Harvard-Oxford (48 regiones). Consulta documentación de nilearn, visualización o documentación de FSL
- Broadmann (Versión atlas de Talairach). Consulta documentación de nilearn o página del atlas
- Pauli (atlas subcortical). Consulta documentación de nilearn o artículo
Para conocer otros atlas y datos disponibles consulta nilearn.datasets.
Consulta la documentación de otras funciones de nilearn empleadas en los scripts:
- load_confounds.
- NiftiLabelsMasker y fit_transform.
- load_img.
- ConnectivityMeasure.
- find_parcellation_cut_coords.
- plot_connectome.
- plot_matrix.
Consulta la documentación general y los ejemplos de uso de nilearn.
Consulta esta alternativa para graficar la matriz de correlación.
Consulta otros paquetes de python empleados en el script:
Adicionalmente puedes consultar el ejercicio de esta lección para ver un análisis de correlación con múltiples sujetos.
Consideraciones sobre la práctica
Debes ajustar la ruta del objeto fmri_dir para que coincida con la ubicación de los archivos. Ejemplo, tus carpetas siguen esta estructura:
data/bids/
├── dataset_description.json
├── sub-001
│ └── ses-1
│ └── func
│ ├── sub-001_task-rest_desc-preproc_bold.json
│ └── sub-001_task-rest_desc-confounds_regressors.tsv
│ ├── sub-001_task-rest_bold.dtseries.json
│ └── sub-001_task-rest_bold.dtseries.nii
├── sub-002
│ └── ses-1
│ └── func
│ ├── sub-002_task-rest_desc-preproc_bold.json
│ └── sub-002_task-rest_desc-confounds_regressors.tsv
│ ├── sub-002_task-rest_bold.dtseries.json
│ └── sub-002_task-rest_bold.dtseries.nii
├── sub-003
│ └── ses-1
│ └── func
│ ├── sub-003_task-rest_desc-preproc_bold.json
│ └── sub-003_task-rest_desc-confounds_regressors.tsv
│ ├── sub-003_task-rest_bold.dtseries.json
│ └── sub-003_task-rest_bold.dtseries.nii
La ruta dentro de tu objeto debe ser: fmri_dir='/data/bids/'
Además de la ruta, debes ajustar el sujeto con el que vas a trabajar. El script está programado para mostrarte en qué orden están acomodados los archivos al ejecutar la línea:
print("Los archivos NIfTI de los sujetos encontrados en el directorio BIDS son: {0}".format(func_files))
Para la carpeta del ejemplo, la salida en la terminal se vería así:
Los archivos NIfTI de los sujetos encontrados en el directorio BIDS son: ['/data/bids/sub-001/ses-1/func/sub-001_task-rest_desc-preproc_bold.nii.gz', '/data/bids/sub-002/ses-1/func/sub-002_task-rest_desc-preproc_bold.nii.gz','/data/bids/sub-003/ses-1/func/sub-003_task-rest_desc-preproc_bold.nii.gz']
Aquí, cada elemento está separado de otro por comas y son las rutas hacia el archivo.
Python asigna a cada elemento una posición en particular, empezando desde cero:
'/data/bids/sub-001/ses-1/func/sub-001_task-rest_desc-preproc_bold.nii.gz' [0]
'/data/bids/sub-002/ses-1/func/sub-002_task-rest_desc-preproc_bold.nii.gz' [1]
'/data/bids/sub-003/ses-1/func/sub-003_task-rest_desc-preproc_bold.nii.gz' [2]
Para recuperar algún elemento en particular, basta con especificar la posición asignada por Python. En el script, hay 3 líneas que son muy importantes, pues recuperan los datos de un solo sujeto. Estas son las líneas:
func_file = func_files[1]
confounds_file = confounds_simple[1]
sample_file = sample_mask[1]
Esta instrucción le está indicando a Python que acceda a los objetos almacenados en la posición 1, en nuestro ejemplo serían datos del sujeto con el identificador (ID) 002.
También podemos consultar el orden en que se almacenaron los IDs de los sujetos y podemos usar esta información para mostrar mensajes en la terminal. El script está programado para mostrarte en qué orden están acomodados los IDs al ejecutar las líneas:
sub=layout.get_subjects()
print("Los IDs de los sujetos encontrados en el directorio BIDS son: {0}".format(sub))
Para la carpeta del ejemplo, la salida en la terminal podría verse así:
Los IDs de los sujetos encontrados en el directorio BIDS son: ['002','001','003']
En este caso, la posición asignada por Python sería la siguiente:
'002' [0]
'001' [1]
'003' [2]
Considera que si no modificas las notas que se imprimen en la terminal con la función print() el script no va a reflejar en automático el cambio de sujeto con el que está trabajando. Dado que no están en el mismo orden, debes verificar que se recupere el ID que corresponde al archivo con el que estás trabajando. Por ejemplo, si modificaste los objetos func_files,confounds_simple y sample_mask para tomar la posición 1 (sub-002) debes modificar también la salida a terminal de la siguiente forma: print('Se recuperaron datos del sujeto {0}'.format(sub[0])), así el script estará procesando los datos del sujeto 002 y en terminal verás el mensaje:
Se recuperaron datos del sujeto 002
Este es un ejemplo de lo que pasaría si no ajustas la posición del sujeto 002 en el mensaje que sale a la terminal: Si en el código tu escribes...
func_file = func_files[1]
confounds_file = confounds_simple[1]
sample_file = sample_mask[1]
print('Se recuperaron datos del sujeto {0}'.format(sub[1]))
El script estaría analizando la imagen funcional del sujeto 002 pero te mostraría en la terminal el mensaje:
Se recuperaron datos del sujeto 001
Asegurate de modificar la posición del objeto sub para que tu salida en terminal coincida con los datos con los que está trabajando el script. Puedes corregir de la misma forma todos los comandos que incluyan .format(sub[0]).

