test meeg senstype collection

function test_suite=test_meeg_senstype_collection
% tests for cosmo_meeg_senstype_collection
%
% #   For CoSMoMVPA's copyright information and license terms,   #
% #   see the COPYING file distributed with CoSMoMVPA.           #
    try % assignment of 'localfunctions' is necessary in Matlab >= 2016
        test_functions=localfunctions();
    catch % no problem; early Matlab versions can use initTestSuite fine
    end
    initTestSuite;

function test_meeg_senstype_collection_
    if cosmo_skip_test_if_no_external('fieldtrip')
        return;
    end

    % get senstype properties
    % order is:
    % - senstype name
    % - acquisition system
    % - sensor type
    % - number of rows in channels
    % - number of columns in channels
    % - first and last channel label

    senstype_props=get_senstype_properties();

    % test each one
    n=numel(senstype_props);

    clear('cosmo_meeg_senstype_collection');
    stc=cosmo_meeg_senstype_collection();
    stc_cached=cosmo_meeg_senstype_collection();
    assertEqual(stc,stc_cached);
    for k=1:n
        prop=senstype_props{k};
        key=prop{1};
        is_required=numel(prop)>=7 && prop{7};

        if isfield(stc,key)
            sens=prop{2};
            type=prop{3};
            size_=[prop{4:5}];
            labels=prop{6}(:);

            assert(isfield(stc,key));
            st=stc.(key);

            assertEqual(st.sens,sens);
            assertEqual(st.type,type);
            assertEqual(size(st.label),size_);
            assertEqual(st.label([1;end]),labels);
        elseif is_required
            error('Missing key %s',key);
        end
    end

function test_meeg_senstype_collection_ft_regr_2016june
    if cosmo_skip_test_if_no_external('fieldtrip')
            return;
    end

    % since the following commit, ft_senstype supports
    %     ft_senslabel('neuromag306_combined')
    % but its output is different than was expected in
    % cosmo_meeg_senstype_collection. In particular the recent commit
    % includes the magnetometers, whereas the meeg_senstype
    % does not include those. This test is added as check for
    % such regressions

    % FieldTrip (https://github.com/fieldtrip/fieldtrip.git)
    % commit 882dba3426db583f7f4f9ac0cdf4eb3c26aaefc1
    % Author: Robert Oostenveld <r.oostenveld@gmail.com>
    % Date:   Wed Jun 22 12:47:47 2016 +0200
    %
    %     ENH - improve combined planar MEG sensor handling, see
    %     http://bugzilla.fieldtriptoolbox.org/show_bug.cgi?id=3144

    stc=cosmo_meeg_senstype_collection();
    label=stc.neuromag306_planar_combined.label;
    assertEqual(size(label),[102 1]);

    present_labels={'MEG 2642+2643','MEG 0112+0113'};
    absent_labels={'MEG0111'',MEG0112','MEG0113',...
                    'MEG2641'',MEG2642','MEG2643'};
    assert(all(cosmo_match(present_labels,label(:))));
    assert(~any(cosmo_match(absent_labels,label(:))));





function props=get_senstype_properties()

    props={{ 'biosemi64',...
                    'biosemi64','eeg',...
                    64,1,{'A1','B32'}},...
            {'biosemi128',...
                    'biosemi128','eeg',...
                    128,1,{'A1','D32'}},...
            {'biosemi256',...
                    'biosemi256','eeg',...
                    256,1,{'A1','H32'}},...
            {'bti148',...
                    'bti148','meg_axial',...
                    148,1,{'A1','A148'}},...
            {'bti148_planar',...
                    'bti148','meg_planar',...
                    148,2,{'A1_dH','A148_dV'}},...
            {'bti148_planar_combined',...
                    'bti148','meg_planar_combined',...
                    148,1,{'A1','A148'},false},...  % not required
            {'bti248',...
                    'bti248','meg_axial',...
                    248,1,{'A1','A248'}},...
            {'bti248_planar',...
                    'bti248','meg_planar',...
                    248,2,{'A1_dH','A248_dV'}},...
            {'bti248_planar_combined',...
                    'bti248','meg_planar_combined',...
                    248,1,{'A1','A248'},false},...  % not required
            {'ctf151',...
                    'ctf151','meg_axial',...
                    151,1,{'MLC11','MZP02'}},...
            {'ctf151_planar',...
                    'ctf151','meg_planar',...
                    151,2,{'MLC11_dH','MZP02_dV'}},...
            {'ctf151_planar_combined',...
                    'ctf151','meg_planar_combined',...
                    151,1,{'MLC11','MZP02'}},...
            {'ctf275',...
                    'ctf275','meg_axial',...
                    275,1,{'MLC11','MZP01'}},...
            {'ctf275_planar',...
                    'ctf275','meg_planar',...
                    275,2,{'MLC11_dH','MZP01_dV'}},...
            {'ctf275_planar_combined',...
                    'ctf275','meg_planar_combined',...
                    275,1,{'MLC11','MZP01'}},...
            {'eeg1005',...
                    'ext1020','eeg',...
                    343,1,{'Fp1','T6'}},...
            {'eeg1010',...
                    'ext1020','eeg',...
                    94,1,{'Fp1','T6'}},...
            {'eeg1020',...
                    'ext1020','eeg',...
                    29,1,{'Fp1','T6'}},...
            {'egi32',...
                    'egi32','eeg',...
                    34,1,{'E1','Cz'}},...
            {'egi64',...
                    'egi64','eeg',...
                    66,1,{'E1','Cz'}},...
            {'egi128',...
                    'egi128','eeg',...
                    130,1,{'E1','Cz'}},...
            {'egi256',...
                    'egi256','eeg',...
                    258,1,{'E1','Cz'}},...
            {'neuromag122_planar_combined',...
                    'neuromag122','meg_planar_combined',...
                    61,1,{'MEG 001+002','MEG 121+122'}},...
            {'neuromag306_planar_combined',...
                    'neuromag306','meg_planar_combined',...
                    102,1,{'MEG 0112+0113','MEG 2642+2643'}},...
            {'itab153',...
                    'itab153','meg',...
                    153,1,{'MAG_000','MAG_152'}},...
            {'itab153_planar',...
                    'itab153','meg_planar',...
                    153,2,{'MAG_000_dH','MAG_152_dV'}},...
            {'itab153_planar_combined',...
                    'itab153','meg_planar_combined',...
                    153,1,{'MAG_000','MAG_152'}},...
            {'yokogawa64',...
                    'yokogawa64','meg_axial',...
                    64,1,{'AG001','AG064'}},...
            {'yokogawa64_planar',...
                    'yokogawa64','meg_planar',...
                    64,2,{'AG001_dH','AG064_dV'}},...
            {'yokogawa64_planar_combined',...
                    'yokogawa64','meg_planar_combined',...
                    64,1,{'AG001','AG064'}},...
            {'yokogawa160',...
                    'yokogawa160','meg_axial',...
                    160,1,{'AG001','AG160'}},...
            {'yokogawa160_planar',...
                    'yokogawa160','meg_planar',...
                    160,2,{'AG001_dH','AG160_dV'}},...
            {'yokogawa160_planar_combined',...
                    'yokogawa160','meg_planar_combined',...
                    160,1,{'AG001','AG160'}},...
            {'yokogawa440',...
                    'yokogawa440','meg_axial',...
                    412,1,{'AG001','RM412'}},...
            {'yokogawa440_planar',...
                    'yokogawa440','meg_planar',...
                    210,2,{'AG001_dH','AG392_dV'}},...
            {'yokogawa440_planar_combined',...
                    'yokogawa440','meg_planar_combined',...
                    210,1,{'AG001','AG392'}},...
            {'neuromag122alt_planar_combined',...
                    'neuromag122','meg_planar_combined',...
                    61,1,{'MEG001+002','MEG121+122'}},...
            {'neuromag306alt_planar_combined',...
                    'neuromag306','meg_planar_combined',...
                    102,1,{'MEG0112+0113','MEG2642+2643'}},...
            {'neuromag306_planar',...
                    'neuromag306','meg_planar',...
                    102,2,{'MEG 0112','MEG 2643'}},...
            {'neuromag306_mag',...
                    'neuromag306','meg_axial',...
                    102,1,{'MEG 0111','MEG 2641'}},...
            {'neuromag306alt_planar',...
                    'neuromag306','meg_planar',...
                    102,2,{'MEG0112','MEG2643'}},...
            {'neuromag306alt_mag',...
                    'neuromag306','meg_axial',...
                    102,1,{'MEG0111','MEG2641'}},...
            {'neuromag122_planar',...
                    'neuromag122','meg_planar',...
                    61,2,{'MEG 001','MEG 122'}},...
            {'neuromag122alt_planar',...
                    'neuromag122','meg_planar',...
                    61,2,{'MEG001','MEG122'}}};


    % the data anobe was produced by the code below
    %
    % sc=cosmo_meeg_senstype_collection();
    % names=fieldnames(sc);
    %
    % names={'biosemi64','biosemi128','biosemi256',...
    %         'bti148','bti148_planar','bti148_planar_combined',...
    %         'bti248','bti248_planar','bti248_planar_combined',...
    %         'ctf151','ctf151_planar','ctf151_planar_combined',...
    %         'ctf275','ctf275_planar','ctf275_planar_combined',...
    %         'eeg1005','eeg1010','eeg1020',...
    %         'egi32','egi64','egi128','egi256',...
    %         'neuromag122_planar_combined',...
    %         'neuromag306_planar_combined',...
    %         'itab153','itab153_planar','itab153_planar_combined',...
    %         'yokogawa64','yokogawa64_planar','yokogawa64_planar_combined',...
    %         'yokogawa160','yokogawa160_planar',...
    %                             'yokogawa160_planar_combined',...
    %         'yokogawa440','yokogawa440_planar',...
    %                             'yokogawa440_planar_combined',...
    %         'neuromag122alt_planar_combined',...
    %         'neuromag306alt_planar_combined',...
    %         'neuromag306_planar',...
    %         'neuromag306_mag',...
    %         'neuromag306alt_planar',...
    %         'neuromag306alt_mag',...
    %         'neuromag122_planar',...
    %         'neuromag122alt_planar'};
    % for k=1:numel(names)
    %     name=names{k};
    %     s=sc.(name);
    %     fprintf(['{''%s'',...\n\t\t''%s'',''%s'',...\n\t\t'...
    %                 '%d,%d,{''%s'',''%s''}},...\n'],...
    %             name,s.sens,s.type,size(s.label),s.label{1},s.label{end})
    % end
    %