elec_load - Read ascii electrode file Load an ascii electrode file and return the electrode labels and coordinates. This function can read and return Cartesian (x,y,z) and/or spherical (theta,phi,r) coordinates. The ascii file format is that of NeuroScan 3Dspace export files. Each row of the file comprises an electrode label, an electrode type code (see below), and the x,y,z coordinates (cm). Each field is separated by spaces. For example, Fz 69 Xcm Ycm Zcm Usage: [elec,type,X,Y,Z,theta,phi,r] = elec_load(file,[coordinates],[xo],[yo],[zo],[N]) where: file = 'path\filename' with row format: '%s %d %f %f %f' = [elec_label, type, (X,Y,Z) or (theta,phi,r)] N is how many electrodes to load (129 default). (xo,yo,zo) are the origin {(0,0,0) default}. coordinates is a string option for input data type: 'Cartesian' = cartesian in Neuroscan 3Dspace format (default); format is ['label' type X Y Z]. As of 08/2003, it is better to use elec_load_scan_3ddasc for Neuroscan 3Dspace ascii export files (*.dat). Otherwise, try this function. 'Spherical1' = spherical, theta and phi in degrees, 'Spherical2' = spherical, theta and phi in radians, format is ['label' type theta phi r] theta is counterclockwise rotation from +x in x-y plane (azimuth), phi is elevation with respect to z-axis, r is radius in cm, +ve x-axis from origin through T4 (right ear) +ve y-axis from origin through Nasion (theta = 90degrees = pi/2 rads) Result: elec is an electrode label, as cellstr array (Nx1) type is an electrode type, as uint8 (unsigned integer, Nx1), (X,Y,Z) & (theta,phi,r) as double floating point (Nx1), with theta and phi in radians. The origin is (0,0,0), unless forced otherwise with the input arguments. Notes: i) Type is defined as follows (from Neuroscan 3Dspace ascii export): Electrode Type --------- ---- Nasion 110 (or 78) Left 108 (or 76) Right 114 (or 82) electrodes 69 Centroid 99 (or 67; eg <0,0,0>) Ref 120 (or 88) Scalp Points 32 Open the 3Dspace ascii export (*.dat file) and check these type values. If they are not consistent with the above, either hack the code of this function or edit the type values in the ascii file. From the return values, the electrodes can be selected by: index = find(type == 69); % or whatever the type is in your file X = X(index); Y = Y(index); Z = Z(index); elec = elec(index); ii) Conversion from spherical to Cartesian coordinates is: x = r .* sin(phi) .* cos(theta); y = r .* sin(phi) .* sin(theta); z = r .* cos(phi); Phi here is elevation with respect to z-axis. The matlab function sph2cart uses elevation with respect to xy plane. iii) Conversion from Cartesian to spherical coordinates is: theta = atan2( y, x ); phi = atan2( sqrt( x.^2 + y.^2 ), z ); r = sqrt( x.^2 + y.^2 + z.^2); Phi here is the elevation with respect to z-axis. The matlab function cart2sph uses elevation with respect to xy plane. Bugs: For NeuroScan 3Dspace export files, reading beyond the electrode points, into the scalp points (type 32), causes all fields to shift one to the left. To avoid this error, include a short string before each '32' in the electrode file or use the N option to only read the electrode points.
0001 function [elec,type,X,Y,Z,theta,phi,r] = elec_load(filename,coordinates,xo,yo,zo,N) 0002 0003 % elec_load - Read ascii electrode file 0004 % 0005 % Load an ascii electrode file and return 0006 % the electrode labels and coordinates. This 0007 % function can read and return Cartesian (x,y,z) 0008 % and/or spherical (theta,phi,r) coordinates. 0009 % 0010 % The ascii file format is that of NeuroScan 0011 % 3Dspace export files. Each row of the file 0012 % comprises an electrode label, an electrode 0013 % type code (see below), and the x,y,z 0014 % coordinates (cm). Each field is separated 0015 % by spaces. For example, 0016 % 0017 % Fz 69 Xcm Ycm Zcm 0018 % 0019 % Usage: 0020 % 0021 % [elec,type,X,Y,Z,theta,phi,r] = elec_load(file,[coordinates],[xo],[yo],[zo],[N]) 0022 % 0023 % where: 0024 % 0025 % file = 'path\filename' with row format: 0026 % 0027 % '%s %d %f %f %f' = [elec_label, type, (X,Y,Z) or (theta,phi,r)] 0028 % 0029 % N is how many electrodes to load (129 default). 0030 % (xo,yo,zo) are the origin {(0,0,0) default}. 0031 % 0032 % coordinates is a string option for input data type: 0033 % 'Cartesian' = cartesian in Neuroscan 3Dspace format (default); 0034 % format is ['label' type X Y Z]. 0035 % 0036 % As of 08/2003, it is better to use 0037 % elec_load_scan_3ddasc for Neuroscan 3Dspace 0038 % ascii export files (*.dat). Otherwise, try 0039 % this function. 0040 % 0041 % 'Spherical1' = spherical, theta and phi in degrees, 0042 % 'Spherical2' = spherical, theta and phi in radians, 0043 % format is ['label' type theta phi r] 0044 % 0045 % theta is counterclockwise rotation from +x in x-y plane (azimuth), 0046 % phi is elevation with respect to z-axis, r is radius in cm, 0047 % +ve x-axis from origin through T4 (right ear) 0048 % +ve y-axis from origin through Nasion (theta = 90degrees = pi/2 rads) 0049 % 0050 % Result: 0051 % 0052 % elec is an electrode label, as cellstr array (Nx1) 0053 % type is an electrode type, as uint8 (unsigned integer, Nx1), 0054 % (X,Y,Z) & (theta,phi,r) as double floating point (Nx1), with 0055 % theta and phi in radians. The origin is (0,0,0), unless forced 0056 % otherwise with the input arguments. 0057 % 0058 % Notes: 0059 % 0060 % i) Type is defined as follows (from Neuroscan 3Dspace ascii export): 0061 % 0062 % Electrode Type 0063 % --------- ---- 0064 % Nasion 110 (or 78) 0065 % Left 108 (or 76) 0066 % Right 114 (or 82) 0067 % electrodes 69 0068 % Centroid 99 (or 67; eg <0,0,0>) 0069 % Ref 120 (or 88) 0070 % Scalp Points 32 0071 % 0072 % Open the 3Dspace ascii export (*.dat file) and check these type 0073 % values. If they are not consistent with the above, either hack 0074 % the code of this function or edit the type values in the ascii 0075 % file. 0076 % 0077 % From the return values, the electrodes can be selected by: 0078 % index = find(type == 69); % or whatever the type is in your file 0079 % X = X(index); Y = Y(index); Z = Z(index); elec = elec(index); 0080 % 0081 % ii) Conversion from spherical to Cartesian coordinates is: 0082 % 0083 % x = r .* sin(phi) .* cos(theta); 0084 % y = r .* sin(phi) .* sin(theta); 0085 % z = r .* cos(phi); 0086 % 0087 % Phi here is elevation with respect to z-axis. The matlab 0088 % function sph2cart uses elevation with respect to xy plane. 0089 % 0090 % iii) Conversion from Cartesian to spherical coordinates is: 0091 % 0092 % theta = atan2( y, x ); 0093 % phi = atan2( sqrt( x.^2 + y.^2 ), z ); 0094 % r = sqrt( x.^2 + y.^2 + z.^2); 0095 % 0096 % Phi here is the elevation with respect to z-axis. The matlab 0097 % function cart2sph uses elevation with respect to xy plane. 0098 % 0099 % Bugs: 0100 % For NeuroScan 3Dspace export files, reading beyond the electrode 0101 % points, into the scalp points (type 32), causes all fields to 0102 % shift one to the left. To avoid this error, include a short 0103 % string before each '32' in the electrode file or use the N 0104 % option to only read the electrode points. 0105 % 0106 0107 % $Revision: 1.2 $ $Date: 2005/07/12 22:16:48 $ 0108 0109 % Licence: GNU GPL, no express or implied warranties 0110 % History: 08/1999, Darren.Weber_at_radiology.ucsf.edu 0111 % 08/2003, Darren.Weber_at_radiology.ucsf.edu 0112 % new version of 3Dspace exports different type numbers ;-) 0113 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 0114 0115 if ~exist('N', 'var'), N = 129; 0116 elseif isempty(N), N = 129; 0117 end 0118 if ~exist('coordinates', 'var'), 0119 coordinates = 'Cartesian'; 0120 elseif isempty(coordinates), 0121 coordinates = 'Cartesian'; 0122 end 0123 if ~exist('xo', 'var'), xo = 0; 0124 elseif isempty(xo), xo = 0; 0125 end 0126 if ~exist('yo', 'var'), yo = 0; 0127 elseif isempty(xo), yo = 0; 0128 end 0129 if ~exist('zo', 'var'), zo = 0; 0130 elseif isempty(xo), zo = 0; 0131 end 0132 0133 tic; 0134 0135 [path,name,ext] = fileparts(filename); 0136 file = fullfile(path,[name ext]); 0137 0138 eegversion = '$Revision: 1.2 $'; 0139 fprintf('ELEC_LOAD [v %s]\n',eegversion(11:15)); 0140 fprintf('...loading ''%s'' electrodes from:\n\t%s\n', coordinates, file); 0141 0142 switch coordinates 0143 0144 case 'Cartesian' 0145 [elec,type,X,Y,Z] = textread(file,'%s %d %f %f %f', N); 0146 type = uint8(type); 0147 0148 fprintf('...converting from cm to meters.\n'); 0149 % Convert from Neuroscan 3Dspace coordinate 0150 % metric (cm) to meters. 0151 X = X ./ 100; Y = Y ./ 100; Z = Z ./ 100; 0152 0153 % If possible, adjust all coordinates so that origin is (0,0,0) 0154 index = find(type == 99); 0155 if ~isempty(index), 0156 xo = X(index); yo = Y(index); zo = Z(index); 0157 end 0158 fprintf('...centering origin at (0,0,0).\n'); 0159 X = X - xo; Y = Y - yo; Z = Z - zo; 0160 xo = X(index); yo = Y(index); zo = Z(index); 0161 0162 % Convert to spherical 0163 fprintf('...calculating spherical coordinates.\n'); 0164 theta = atan2( (Y-yo), (X-xo) ); 0165 phi = atan2( sqrt( (X-xo).^2 + (Y-yo).^2 ), (Z-zo) ); 0166 r = sqrt( (X-xo).^2 + (Y-yo).^2 + (Z-zo).^2); 0167 0168 case 'Spherical1' %degrees 0169 [elec,type,theta,phi,r] = textread(file,'%s %d %f %f %f', N); 0170 % convert theta and phi to radians 0171 theta = theta * (pi/180); phi = phi * (pi/180); 0172 [X, Y, Z] = elec_sph2cart(theta,phi,r,1); 0173 fprintf('...converting from cm to meters.\n'); 0174 X = X ./ 100; Y = Y ./ 100; Z = Z ./ 100; 0175 0176 case 'Spherical2' %radians 0177 [elec,type,theta,phi,r] = textread(file,'%s %d %f %f %f', N); 0178 [X, Y, Z] = elec_sph2cart(theta,phi,r,0); 0179 fprintf('...converting from cm to meters.\n'); 0180 X = X ./ 100; Y = Y ./ 100; Z = Z ./ 100; 0181 0182 otherwise 0183 doc elec_load; 0184 msg = sprintf('...invalid coordinate type: ''%s'', see ''help elec_load''\n', coordinates); 0185 error(msg); 0186 0187 end 0188 0189 fprintf('...loaded %d electrodes\n', size(elec,1)); 0190 0191 t = toc; fprintf('...done (%6.2f sec).\n\n',t); 0192 0193 return