123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- function res = sensors(this, type, newsens)
- % Sets and gets sensor fields for EEG and MEG
- % returns empty matrix if no sensors are defined.
- % FORMAT res = sensors(this, type, newsens)
- % type - 'EEG' or 'MEG'
- % _______________________________________________________________________
- % Copyright (C) 2008-2012 Wellcome Trust Centre for Neuroimaging
- % Vladimir Litvak
- % $Id: sensors.m 6829 2016-07-07 10:16:46Z vladimir $
- if nargin<2
- error('Sensor type (EEG or MEG) must be specified');
- end
- switch lower(type)
- case 'eeg'
- if nargin < 3
- if isfield(this.sensors, 'eeg')
- res = this.sensors.eeg;
- else
- res = [];
- end
- else
- this.sensors(1).eeg = newsens;
- res = check(this);
- end
- case 'meg'
- if nargin < 3
- if isfield(this.sensors, 'meg')
- res = this.sensors.meg;
- else
- res = [];
- end
- else
- this.sensors(1).meg = newsens;
- res = check(this);
- end
- case 'src'
- if nargin < 3
- if isfield(this.sensors, 'src')
- res = this.sensors.src;
- else
- res = [];
- end
- else
- this.sensors(1).src = newsens;
- res = check(this);
- end
- otherwise
- error('Unsupported sensor type');
- end
- if nargin < 3 && ~isempty(res) && ismember(lower(type), {'eeg', 'meg'}) && this.montage.Mind > 0
- sens = res;
- montage = this.montage.M(this.montage.Mind);
- if ~isempty(intersect(sens.label, montage.labelorg))
- sensmontage = montage;
- [sel1, sel2] = spm_match_str(sens.label, sensmontage.labelorg);
- sensmontage.labelorg = sensmontage.labelorg(sel2);
- sensmontage.tra = sensmontage.tra(:, sel2);
- selempty = find(all(sensmontage.tra == 0, 2));
- sensmontage.tra(selempty, :) = [];
- sensmontage.labelnew(selempty) = [];
-
- if isfield(sensmontage, 'chantypeorg')
- sensmontage.chantypeorg = sensmontage.chantypeorg(sel2);
- end
- if isfield(sensmontage, 'chanunitorg')
- sensmontage.chanunitorg = sensmontage.chanunitorg(sel2);
- end
- if isfield(sensmontage, 'chantypenew')
- sensmontage.chantypenew(selempty) = [];
- end
- if isfield(sensmontage, 'chanunitnew')
- sensmontage.chanunitnew(selempty) = [];
- end
-
- chanunitorig = sens.chanunit(sel1);
- chantypeorig = sens.chantype(sel1);
- labelorg = sens.label;
-
- keepunused = 'no'; % not sure if this is good for all cases
-
- sens = ft_apply_montage(sens, sensmontage, 'keepunused', keepunused);
-
- if strcmpi(type, 'MEG')
- if isfield(sens, 'balance') && ~isequal(sens.balance.current, 'none')
- balance = ft_apply_montage(getfield(sens.balance, sens.balance.current), sensmontage, 'keepunused', keepunused);
- else
- balance = sensmontage;
- end
-
- sens.balance.custom = balance;
- sens.balance.current = 'custom';
- end
-
-
- % If all the original channels contributing to a new channel have
- % the same units, transfer them to the new channel. This might be
- % wrong if the montage itself changes the units by scaling the data.
- if isfield(sens, 'chanunit')
- chanunit = sens.chanunit;
- else
- chanunit = repmat({'unknown'}, numel(sens.label), 1);
- end
-
- if isfield(sens, 'chantype')
- chantype = sens.chantype;
- else
- chantype = repmat({'unknown'}, numel(sens.label), 1);
- end
-
- for j = 1:numel(sens.label)
- k = strmatch(sens.label{j}, sensmontage.labelnew, 'exact');
- if ~isempty(k)
- if isequal(chanunit{j}, 'unknown')
- unit = unique(chanunitorig(~~abs(sensmontage.tra(k, :))));
- if numel(unit)==1
- chanunit(j) = unit;
- elseif strcmpi(type, 'MEG')
- chanunit{j} = 'T';
- else
- chanunit{j} = 'V';
- end
- end
-
- if isequal(chantype{j}, 'unknown')
- ctype = unique(chantypeorig(~~abs(sensmontage.tra(k, :))));
- if numel(ctype)==1
- chantype(j) = ctype;
- elseif strcmpi(type, 'MEG')
- chantype{j} = 'megmag';
- else
- chantype{j} = 'eeg';
- end
- end
- else %channel was not in the montage, but just copied
- k = strmatch(sens.label{j}, labelorg, 'exact');
- if isequal(chanunit{j}, 'unknown')
- chanunit(j) = chanunitorig(k);
- end
- if isequal(chantype{j}, 'unknown')
- chantype(j) = chantypeorig(k);
- end
- end
- end
-
- sens.chanunit = chanunit;
- sens.chantype = chantype;
- end
-
- if strcmpi(type, 'MEG')
- res = ft_datatype_sens(sens, 'amplitude', 'T', 'distance', 'mm');
- else
- res = ft_datatype_sens(sens, 'amplitude', 'V', 'distance', 'mm');
- end
- end
|