Exploratory branch for EEG quality checks and format comparison in Neuroelectrics workflows.
edf_conv.py: comparación por pares y generación deCSV + JSON + MD.easy_edf_graph.py: comparación visual avanzada (PNG + CSV + JSON + MD) para un par específico.
python -m venv eno_venv
source eno_venv/bin/activate
pip install -r requirements.txtAntes de correr análisis, valida que los archivos tengan contenido:
find data/test_XXX -type f \( -name '*.easy' -o -name '*.edf' -o -name '*.info' \) | sort
wc -l data/test_XXX/*.easySi un archivo aparece con 0 líneas o 0B, debe excluirse -> señal para repetir el ensayo.
Caso ideal (.easy y .edf con mismo stem):
./eno_venv/bin/python edf_conv.py \
--data-dir data/test_XXX \
--output-dir comparison_reports/test_XXX_singleFallback implementado en este repo para lotes sin .edf válido:
- Si no encuentra pares
.easy/.edf, el script entra en modo.easy-only. - En ese modo compara cada
.easycontra sí mismo para generar reporte estructural del lote.
Importante: en modo .easy-only la correlación media tenderá a 1.0 y el RMSE a 0, lo cual no mide mejora real entre formatos; solo confirma consistencia interna del archivo.
Cuando sí exista .edf real, usa:
./eno_venv/bin/python easy_edf_graph.py \
--easy "data/test_XXX/archivo.easy" \
--edf "data/test_XXX/archivo.edf" \
--info "data/test_XXX/archivo.info" \
--output-dir comparison_reports/test_XXX_graphsEsto genera overlays, histogramas y heatmap de métricas por canal.
- Duración y
sampling_rate_hzestables entre sesiones. - Sin canales con
stdopeak-to-peakanómalos extremos frente al resto. - Tendencia consistente entre repeticiones (
001vs002) en misma condición (EO, EC, MI). - Menor dispersión en
mean_abs_diff_uvyrmse_uvcuando compares contra.edfreal.
Ese indicador es valioso solamente cuando comparas dos fuentes distintas (.easy vs .edf).
Si corres en modo .easy-only, una correlación media alta no implica mejora de calidad fisiológica; para calidad del ensayo mira más los patrones por canal, estabilidad entre bloques y presencia de artefactos.
Por cada comparación, edf_conv.py crea:
*_channels.csv(métricas por canal)*.json(resumen estructurado)*.md(interpretación textual)
Por cada comparación, easy_edf_graph.py crea además:
*_raw_overlay.png*_demeaned_overlay.png*_histograms.png*_stats_heatmap.png
- Mantener nombres consistentes por sesión (timestamp + sujeto + condición + réplica).
- Guardar
.infojunto a cada.easypara preservar nombres de canal y metadatos. - No usar archivos
*_edfFiltered.easyvacíos; si existen con0B, ignorarlos o regenerarlos. - Versionar siempre el comando usado y el
output-dirdel análisis para reproducibilidad.