Skip to content

Commit f17a63e

Browse files
committed
add basic support and conversion for EEG iEEG MEG BEH
1 parent 9e8cb6e commit f17a63e

File tree

9 files changed

+271
-146
lines changed

9 files changed

+271
-146
lines changed

manualTests/dummyData/.bidsignore

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
*_beh.*
2+
*_eeg.*
3+
*_ieeg.*
4+
*_meg.*
5+
6+
# *_beh.tsv
7+
# *_eeg.edf
8+
# *_ieeg.edf
9+
# *_meg.fif
10+
11+
# *_bold.nii.gz

manualTests/test_createBoldJson.m renamed to manualTests/test_createJson.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
function test_suite = test_createBoldJson %#ok<*STOUT>
1+
function test_suite = test_createJson %#ok<*STOUT>
22
try % assignment of 'localfunctions' is necessary in Matlab >= 2016
33
test_functions = localfunctions(); %#ok<*NASGU>
44
catch % no problem; early Matlab versions can use initTestSuite fine
55
end
66
initTestSuite;
77
end
88

9-
function test_createBoldJsonExtra()
9+
function test_createJsonExtra()
1010

1111
outputDir = fullfile(fileparts(mfilename('fullpath')), 'output');
1212

@@ -29,7 +29,7 @@ function test_createBoldJsonExtra()
2929

3030
extraInfo = struct('extraInfo', struct('nestedExtraInfo', 'something extra'));
3131

32-
createBoldJson(cfg, extraInfo);
32+
createJson(cfg, extraInfo);
3333

3434
%% check content
3535
fileName = strrep(cfg.fileName.events, '_events', '_bold');

manualTests/test_makeRawDataset.m

Lines changed: 171 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,75 @@
11
function test_makeRawDataset()
2-
2+
33
outputDir = fullfile(fileparts(mfilename('fullpath')), 'output');
4-
4+
55
if isdir(outputDir)
66
rmdir(outputDir, 's');
77
end
8-
8+
99
%% set up
1010
cfg.dir.output = outputDir;
11-
11+
1212
cfg.bids.datasetDescription.Name = 'dummy';
1313
cfg.bids.datasetDescription.BIDSVersion = '1.0.0';
1414
cfg.bids.datasetDescription.Authors = {'Jane Doe', 'John Doe'};
15-
15+
1616
cfg.testingDevice = 'mri';
17-
17+
1818
%% MRI task data
1919
cfg.mri.repetitionTime = 1.56;
20-
20+
2121
cfg.subject.subjectNb = 1;
2222
cfg.subject.runNb = 1;
23-
23+
2424
cfg.task.name = 'testtask';
25-
25+
cfg.task.instructions = 'do this';
26+
2627
logFile.extraColumns.Speed.length = 1;
2728
logFile.extraColumns.LHL24.length = 3;
2829
logFile.extraColumns.is_Fixation.length = 1;
29-
30+
3031
cfg = createFilename(cfg);
31-
32+
3233
extraInfo = struct('extraInfo', struct('nestedExtraInfo', 'something extra'));
33-
createBoldJson(cfg, extraInfo);
34-
34+
createJson(cfg, extraInfo);
35+
3536
createDatasetDescription(cfg);
36-
37+
3738
% create the events file and header
3839
logFile = saveEventsFile('open', cfg, logFile);
39-
40+
4041
% ROW 2: normal events : all info is there
4142
logFile(1, 1).onset = 2;
4243
logFile(end, 1).trial_type = 'MotionUp';
4344
logFile(end, 1).duration = 3;
4445
logFile(end, 1).Speed = 2;
4546
logFile(end, 1).is_Fixation = true;
4647
logFile(end, 1).LHL24 = 1:3;
47-
48+
4849
% ROW 3: missing info (speed, LHL24)
4950
logFile(1, 1).onset = 3;
5051
logFile(end, 1).trial_type = 'static';
5152
logFile(end, 1).duration = 4;
5253
logFile(end, 1).is_Fixation = false;
53-
54+
5455
% ROW 4: missing info (duration is missing and speed is empty)
5556
logFile(2, 1).onset = 4;
5657
logFile(end, 1).trial_type = 'BLUES';
5758
logFile(end, 1).Speed = [];
5859
logFile(end, 1).is_Fixation = true;
5960
logFile(end, 1).LHL24 = rand(1, 3);
60-
61+
6162
% ROW 5: missing info (array is not the right size)
6263
logFile(5, 1).onset = 5;
6364
logFile(end, 1).trial_type = 'jazz';
6465
logFile(end, 1).duration = 3;
6566
logFile(end, 1).LHL24 = rand(1, 2);
66-
67+
6768
saveEventsFile('save', cfg, logFile);
68-
69+
6970
% close the file
7071
saveEventsFile('close', cfg, logFile);
71-
72+
7273
% add dummy stim data
7374
stimLogFile = saveEventsFile('open_stim', cfg, logFile);
7475
for i = 1:100
@@ -82,54 +83,171 @@ function test_makeRawDataset()
8283
saveEventsFile('save', cfg, stimLogFile);
8384
saveEventsFile('close', cfg, stimLogFile);
8485

85-
% add dummy functional data
86-
funcDir = fullfile(cfg.dir.output, 'source', 'sub-001', 'ses-001', 'func');
87-
boldFilename = 'sub-001_ses-001_task-testtask_run-001_bold.nii.gz';
88-
89-
copyfile( ...
90-
fullfile('dummyData', 'dummyData.nii.gz'), ...
91-
fullfile(funcDir, boldFilename));
92-
9386
%% MRI bold rest data and fancy suffixes
9487
clear cfg;
95-
88+
9689
cfg.dir.output = outputDir;
97-
90+
9891
cfg.testingDevice = 'mri';
99-
100-
cfg.subject.subjectNb = 2;
101-
cfg.subject.sessionNb = 3;
102-
cfg.subject.runNb = 4;
103-
92+
93+
cfg.subject.subjectNb = 1;
94+
cfg.subject.runNb = 1;
95+
10496
% deal with MRI suffixes
105-
cfg.mri.reconstruction = 'fast recon';
106-
cfg.mri.contrastEnhancement = 'test';
107-
cfg.mri.phaseEncodingDirection = 'y pos';
108-
cfg.mri.echo = '1';
109-
cfg.mri.acquisition = ' new tYpe';
97+
cfg.suffix.reconstruction = 'fast recon';
98+
cfg.suffix.contrastEnhancement = 'test';
99+
cfg.suffix.phaseEncodingDirection = 'y pos';
100+
cfg.suffix.echo = '1';
101+
cfg.suffix.acquisition = ' new tYpe';
102+
110103
cfg.mri.repetitionTime = 1.56;
111-
104+
112105
cfg.task.name = 'rest';
113-
106+
114107
cfg = createFilename(cfg);
108+
109+
extraInfo = struct('extraInfo', struct('nestedExtraInfo', 'something extra'));
110+
createJson(cfg, extraInfo);
111+
112+
113+
%% EEG data and fancy suffixes
114+
clear cfg;
115+
116+
cfg.dir.output = outputDir;
117+
118+
cfg.testingDevice = 'eeg';
119+
120+
cfg.subject.subjectNb = 1;
121+
cfg.subject.runNb = 1;
122+
123+
cfg.task.name = 'target practice';
124+
cfg.task.instructions = 'do this';
125+
126+
cfg.bids.eeg.EEGReference = 'Cz';
127+
cfg.bids.eeg.SamplingFrequency = 2400;
128+
cfg.bids.eeg.PowerLineFrequency = 50;
129+
cfg.bids.eeg.SoftwareFilters = 'n/a';
115130

116-
createBoldJson(cfg);
117-
118-
%% add dummy functional data
119-
funcDir = fullfile(cfg.dir.output, 'source', 'sub-002', 'ses-003', 'func');
120-
boldFilename = ['sub-002_ses-003_task-rest', ...
131+
cfg = createFilename(cfg);
132+
133+
extraInfo = struct('extraInfo', struct('nestedExtraInfo', 'something extra'));
134+
createJson(cfg, extraInfo);
135+
136+
%% iEEG data and fancy suffixes
137+
clear cfg;
138+
139+
cfg.dir.output = outputDir;
140+
141+
cfg.testingDevice = 'ieeg';
142+
143+
cfg.subject.subjectNb = 1;
144+
cfg.subject.runNb = 1;
145+
146+
cfg.task.name = 'implanted target practice';
147+
cfg.task.instructions = 'do this';
148+
149+
cfg.bids.ieeg.iEEGReference = 'Cz';
150+
cfg.bids.ieeg.SamplingFrequency = 2400;
151+
cfg.bids.ieeg.PowerLineFrequency = 50;
152+
cfg.bids.ieeg.SoftwareFilters = 'n/a';
153+
154+
cfg = createFilename(cfg);
155+
156+
extraInfo = struct('extraInfo', struct('nestedExtraInfo', 'something extra'));
157+
createJson(cfg, extraInfo);
158+
159+
%% MEG data and fancy suffixes
160+
clear cfg;
161+
162+
cfg.dir.output = outputDir;
163+
164+
cfg.testingDevice = 'meg';
165+
166+
cfg.subject.subjectNb = 1;
167+
cfg.subject.runNb = 1;
168+
169+
cfg.task.name = 'magnetic target practice';
170+
cfg.task.instructions = 'do this';
171+
172+
cfg.bids.meg.SamplingFrequency = 2400;
173+
cfg.bids.meg.PowerLineFrequency = 60;
174+
cfg.bids.meg.DewarPosition = 'upright';
175+
cfg.bids.meg.SoftwareFilters = 'n/a';
176+
cfg.bids.meg.DigitizedLandmarks = false;
177+
cfg.bids.meg.DigitizedHeadPoints = false;
178+
179+
cfg = createFilename(cfg);
180+
181+
extraInfo = struct('extraInfo', struct('nestedExtraInfo', 'something extra'));
182+
createJson(cfg, extraInfo);
183+
184+
%% beh data and fancy suffixes
185+
clear cfg;
186+
187+
cfg.dir.output = outputDir;
188+
189+
cfg.testingDevice = 'pc';
190+
191+
cfg.subject.subjectNb = 1;
192+
cfg.subject.runNb = 1;
193+
194+
cfg.task.name = 'easy target practice';
195+
cfg.task.instructions = 'do this';
196+
197+
cfg = createFilename(cfg);
198+
199+
extraInfo = struct('extraInfo', struct('nestedExtraInfo', 'something extra'));
200+
createJson(cfg, extraInfo);
201+
202+
%% add dummy data
203+
subjectDir = fullfile(cfg.dir.output, 'source', 'sub-001', 'ses-001');
204+
funcDir = fullfile(subjectDir, 'func');
205+
206+
boldFilename = 'sub-001_ses-001_task-testtask_run-001_bold.nii.gz';
207+
208+
copyfile( ...
209+
fullfile('dummyData', 'dummyData.nii.gz'), ...
210+
fullfile(funcDir, boldFilename));
211+
212+
boldFilename = ['sub-001_ses-001_task-rest', ...
121213
'_acq-newTYpe_ce-test_dir-yPos_rec-fastRecon', ...
122-
'_run-004_echo-1_bold.nii.gz'];
123-
214+
'_run-001_echo-1_bold.nii.gz'];
215+
124216
copyfile( ...
125217
fullfile('dummyData', 'dummyData.nii.gz'), ...
126218
fullfile(funcDir, boldFilename));
127-
219+
220+
eegDir = fullfile(subjectDir, 'eeg');
221+
megDir = fullfile(subjectDir, 'meg');
222+
ieegDir = fullfile(subjectDir, 'ieeg');
223+
behDir = fullfile(subjectDir, 'beh');
224+
225+
eegFilename = 'sub-001_ses-001_task-targetPractice_run-001_eeg.edf';
226+
megFilename = 'sub-001_ses-001_task-magneticTargetPractice_run-001_meg.fif';
227+
ieegFilename = 'sub-001_ses-001_task-implantedTargetPractice_run-001_ieeg.edf';
228+
behFilename = 'sub-001_ses-001_task-easyTargetPractice_run-001_beh.tsv';
229+
230+
copyfile( ...
231+
fullfile('dummyData', 'dummyData.nii.gz'), ...
232+
fullfile(eegDir, eegFilename));
233+
234+
copyfile( ...
235+
fullfile('dummyData', 'dummyData.nii.gz'), ...
236+
fullfile(megDir, megFilename));
237+
238+
copyfile( ...
239+
fullfile('dummyData', 'dummyData.nii.gz'), ...
240+
fullfile(ieegDir, ieegFilename));
241+
242+
copyfile( ...
243+
fullfile('dummyData', 'dummyData.nii.gz'), ...
244+
fullfile(behDir, behFilename));
245+
128246
%% actually do the conversion of the source data thus created
129247
clear;
130-
248+
131249
outputDir = fullfile(fileparts(mfilename('fullpath')), 'output');
132250
cfg.dir.output = outputDir;
133251
convertSourceToRaw(cfg);
134-
252+
135253
end

0 commit comments

Comments
 (0)