pop_load_frombids leaves None in chanlocs fields; pop_saveset raises TypeError on them

Aperta Adatta ai principianti
#538 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
65/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
python
Ambito
backend

Direzione di ricerca

Inizia tracciando come pop_load_frombids assegna le coordinate dei canali quando per un canale non è presente alcuna riga in electrodes.tsv, quindi confronta come i canali rimossi rappresentano i valori numerici mancanti. Controlla pop_saveset e clean_channels per vedere come vengono gestiti questi valori. Il lavoro è completato quando la riproduzione viene salvata correttamente con un valore vuoto coerente per i campi numerici mancanti.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

For a channel with no row in electrodes.tsv, pop_load_frombids leaves theta, radius, X, Y, Z, sph_theta, sph_phi and
sph_radius as None (and chaninfo plotrad and shrink as None). pop_saveset cannot write None:

import json, os, tempfile
import numpy as np
import pyedflib
from eegprep import pop_load_frombids, pop_saveset
root = tempfile.mkdtemp(); eeg_dir = os.path.join(root, "sub-01", "eeg"); os.makedirs(eeg_dir)
json.dump({"Name": "t", "BIDSVersion": "1.9.0", "DatasetType": "raw"}, open(os.path.join(root, "dataset_description.json"), "w"))
names = ["Fz", "Cz", "Pz"]
writer = pyedflib.EdfWriter(os.path.join(eeg_dir, "sub-01_task-x_eeg.edf"), 3, file_type=pyedflib.FILETYPE_EDFPLUS)
writer.setSignalHeaders([{"label": c, "dimension": "uV", "sample_frequency": 250, "physical_min": -500, "physical_max": 500,
                          "digital_min": -32768, "digital_max": 32767, "transducer": "", "prefilter": ""} for c in names])
writer.writeSamples(list(np.random.default_rng(0).standard_normal((3, 2500)) * 20)); writer.close()
open(os.path.join(eeg_dir, "sub-01_task-x_channels.tsv"), "w").write("name\ttype\tunits\n" + "".join(f"{c}\tEEG\tuV\n" for c in names))
open(os.path.join(eeg_dir, "sub-01_electrodes.tsv"), "w").write("name\tx\ty\tz\nFz\t0\t37\t84\nCz\t0\t-34\t105\n")   # no row for Pz
json.dump({"EEGCoordinateSystem": "MNI305", "EEGCoordinateUnits": "mm"}, open(os.path.join(eeg_dir, "sub-01_coordsystem.json"), "w"))
eeg = pop_load_frombids(os.path.join(eeg_dir, "sub-01_task-x_eeg.edf"), bidsevent=False, verbose=False)
print("Pz X:", eeg["chanlocs"][2]["X"])                       # None
pop_saveset(eeg, os.path.join(root, "out.set"))               # TypeError: Could not convert None (type NoneType) to array

Expected: use the same empty value (numeric_null) for every missing numeric field, as pop_load_frombids already does for
channels it clears, or make pop_saveset write None as an empty array. Also: clean_channels already treats None as missing
by an ad hoc conversion, which a consistent empty value would make unnecessary.

Checked on eegprep 0.5.0.

Lingua principale
Python
Stelle
38
Fork
7
Merge medio
22h 11m
PR unite (30g)
65

Preparare l'ambiente

  • Include un Dockerfile o un file Docker Compose
  • Nessun modello di pull request
  • Nessuna guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di sccn/eegprep

Tutte le issue di sccn/eegprep

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.