Fit a dipole to the tactile ERF after mechanical stimulation
Description
The Matlab script is given first; the figures that this script produces are at the bottom of this page.
The MEG dataset TactileStimulusDipolefit.zip is available from our FTP server.
Matlab script
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Tactile Stimulus Dipolefit % % In this dataset, mechanical tactile stimuli of 300ms length were applied % to the right index finger. The tactile stimuli were 5 different patterns % of which the subject should detect one (deviant: trigger 4). However, % stimuli were by far too difficult to differentiate, so they can be pooled % across all of them. There are no button presses or anything else in the % data. Because stimuli were too difficult there was absolutely no task. % % The MEG dataset is available from % ftp://ftp.fieldtriptoolbox.org/pub/fieldtrip/tutorial/TactileStimulusDipolefit.zip %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % determine interesting segments in the data cfg = []; cfg.dataset = 'MarkusBraille.ds'; cfg.continuous = 'yes'; cfg.trialdef.eventtype = 'backpanel trigger'; cfg.trialdef.eventvalue = [4,8]; cfg.trialdef.prestim = 0.4; cfg.trialdef.poststim = 0.6; cfg = ft_definetrial(cfg); % remove the first and last 10 trials: they are too close to the edge % of the file, which causes problems with the 10 seconds filter padding cfg.trl = cfg.trl(10:(end-10),:); % the following settings are relevant for later preprocessing, but can be % specified already. The artifact detection routines will adjust their % default settings according to the specified filter padding. cfg.padding = 10; % for filtering cfg.dftfilter = 'yes'; % line noise removal cfg.demean = 'yes'; % baseline correction cfg.baselinewindow = [-inf 0]; % use the pre-trigger interval cfg.channel = 'MEG'; % only read in the MEG channels %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % detect squid jump artifacts % this artifact detection takes very long, since it has to be done on all 151 MEG channels % since the data does not contain SQUID jump artifacts, this step can be skipped % cfg.artfctdef.jump.sgn = {'MEG'}; % cfg = ft_artifact_jump(cfg); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % detect eye artifacts % use only defaults cfg.artfctdef.eog.sgn = 'EOG'; % {'MLT21' 'MRT21' 'MLT31' 'MRT31' 'MLF12' 'MRF12'}; cfg.artfctdef.eog.feedback = 'yes'; cfg = ft_artifact_eog(cfg); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % detect muscle artifacts % the temporal and the occipital channels pick up most of the muscle activity cfg.artfctdef.muscle.sgn = {'MLT' 'MRT'} % 'MRO' 'MLO'}; cfg.artfctdef.muscle.feedback = 'yes'; cfg.artfctdef.muscle.cutoff = 40; % has been determined by visual inspection cfg = ft_artifact_muscle(cfg); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % artifact removal and preprocessing % % after detecting the segments of data contaminated by artifacts, those % segments subsequently are removed and the clean data segments of interest % can finally be imported into Matlab using the ft_preprocessing function. cfg.artfctdef.minaccepttim = 0.2; cfg.artfctdef.reject = 'partial'; cfg.artfctdef.feedback = 'yes'; cfg = ft_rejectartifact(cfg); % read and preprocess the data data = ft_preprocessing(cfg); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % compute the ERF cfg = []; cfg.channel = 'MEG'; cfg.vartrllength = 2; avg = ft_timelockanalysis(cfg, data); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % make a butterfly plot of the ERF % using the plain Matlab plotting function figure plot(1000*avg.time, avg.avg) % convert time to ms xlabel('time (ms)') ylabel('field amplitude (T)') axis tight grid on %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % make a topographic plot of the ERF, in steps of 5ms cfg = []; cfg.xlim = 0:0.005:0.1; cfg.colorbar = 'no'; cfg.comment = ''; cfg.showxlim = 'no'; cfg.showzlim = 'no'; cfg.zlim = [-1.5 1.5] * 1e-13; figure ft_topoplotER(cfg, avg); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % fit a dipole to the M50 and M100 components cfg = []; cfg.latency = [0.045 0.055]; % specify latency window around M50 peak cfg.numdipoles = 1; cfg.hdmfile = 'bauer_m.hdm'; cfg.feedback = 'textbar'; cfg.grid.resolution = 2; cfg.grid.unit = 'cm'; dipM50 = ft_dipolefitting(cfg, avg); cfg.latency = [0.100 0.120]; % specify latency window around M100 peak dipM100 = ft_dipolefitting(cfg, avg); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % make a plot of the location of the dipoles % read the anatomical MRI mri = ft_read_mri('bauer_m.mri'); % the source is expressed in cm, the MRI is expressed in mm cfg = []; cfg.location = dipM50.dip.pos * 10; % convert from cm to mm figure; ft_sourceplot(cfg, mri) cfg.location = dipM100.dip.pos * 10; % convert from cm to mm figure; ft_sourceplot(cfg, mri)