-
Notifications
You must be signed in to change notification settings - Fork 16
/
bids_writeieegtinfofile.m
99 lines (93 loc) · 3.67 KB
/
bids_writeieegtinfofile.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
% BIDS_WRITETIEEGINFOFILE - write tinfo file for iEEG data
%
% Usage:
% bids_writetinfofile(EEG, tinfo, fileOut)
%
% Inputs:
% EEG - [struct] EEGLAB dataset information
% tinfo - [struct] structure containing task information
% notes - [string] notes to store along with the data info
% fileOut - [string] filepath of the desired output location with file basename
% e.g. ~/BIDS_EXPORT/sub-01/ses-01/eeg/sub-01_ses-01_task-GoNogo
%
% Authors: Arnaud Delorme, 2024
function tInfo = bids_writeieegtinfofile( EEG, tInfo, notes, fileOutRed)
[~,channelsCount] = eeg_getchantype(EEG);
% Write task information (ieeg.json) Note: depends on channels
% requiredChannelTypes: 'EEG', 'EOG', 'ECG', 'EMG', 'MISC'. Other channel
% types are currently not valid output for ieeg.json.
nonEmptyChannelTypes = fieldnames(channelsCount);
for i=1:numel(nonEmptyChannelTypes)
if strcmp(nonEmptyChannelTypes{i}, 'MISC')
tInfo.('MiscChannelCount') = channelsCount.('MISC');
else
tInfo.([nonEmptyChannelTypes{i} 'ChannelCount']) = channelsCount.(nonEmptyChannelTypes{i});
end
end
if ~isfield(tInfo, 'EEGReference')
if ~ischar(EEG.ref) && numel(EEG.ref) > 1 % untested for all cases
refChanLocs = EEG.chanlocs(EEG.ref);
ref = join({refChanLocs.labels},',');
ref = ref{1};
else
ref = EEG.ref;
end
tInfo.iEEGReference = ref;
end
if EEG.trials == 1
tInfo.RecordingType = 'continuous';
else
tInfo.RecordingType = 'epoched';
tInfo.EpochLength = EEG.pnts/EEG.srate;
end
tInfo.RecordingDuration = EEG.pnts/EEG.srate;
tInfo.SamplingFrequency = EEG.srate;
if ~isempty(notes)
tInfo.SubjectArtefactDescription = notes;
end
% https://bids-specification.readthedocs.io/en/stable/modality-specific-files/intracranial-electroencephalography.html
tInfoFields = {...
'iEEGReference' 'REQUIRED' 'char' 'Unknown';
'SamplingFrequency' 'REQUIRED' '' '';
'PowerLineFrequency' 'REQUIRED' '' 'n/a';
'SoftwareFilters' 'REQUIRED' 'struct' 'n/a';
...
'HardwareFilters' 'RECOMMENDED' 'struct' '';
'ElectrodeManufacturer' 'RECOMMENDED' 'struct' '';
'ElectrodeManufacturersModelName' 'RECOMMENDED' 'struct' '';
'ECOGChannelCount' 'RECOMMENDED' '' '';
'SEEGChannelCount' 'RECOMMENDED' '' '';
'EEGChannelCount' 'RECOMMENDED' '' '';
'EOGChannelCount' 'RECOMMENDED' '' 0;
'ECGChannelCount' 'RECOMMENDED' '' 0;
'EMGChannelCount' 'RECOMMENDED' '' 0;
'MiscChannelCount' ' OPTIONAL' '' '';
'TriggerChannelCount' 'RECOMMENDED' '' ''; % double in Bucanl's fork
'RecordingDuration' 'RECOMMENDED' '' 'n/a';
'RecordingType' 'RECOMMENDED' 'char' '';
'EpochLength' 'RECOMMENDED' '' 'n/a';
'iEEGGround' 'RECOMMENDED ' 'char' '';
'iEEGPlacementScheme' 'RECOMMENDED' 'char' '';
'iEEGElectrodeGroups' 'RECOMMENDED' 'char' '';
'SubjectArtefactDescription' 'OPTIONAL' 'char' '';
...
'ElectricalStimulation' 'OPTIONAL' 'char' '';
'ElectricalStimulationParameters' 'OPTIONAL' 'char' '';
...
'Manufacturer' 'RECOMMENDED' 'char' '';
'ManufacturersModelName' 'OPTIONAL' 'char' '';
'SoftwareVersions' 'RECOMMENDED' 'char' '';
'DeviceSerialNumber' 'RECOMMENDED' 'char' '';
...
'TaskName' 'REQUIRED' '' '';
'TaskDescription' 'RECOMMENDED' '' '';
'Instructions' 'RECOMMENDED' 'char' '';
'CogAtlasID' 'RECOMMENDED' 'char' '';
'CogPOID' 'RECOMMENDED' 'char' '';
...
'InstitutionName' 'RECOMMENDED' 'char' '';
'InstitutionAddress' 'RECOMMENDED' 'char' '';
'InstitutionalDepartmentName' ' RECOMMENDED' 'char' '';
};
tInfo = bids_checkfields(tInfo, tInfoFields, 'tInfo');
jsonwrite([fileOutRed '_ieeg.json' ], tInfo,struct('indent',' '));