[Master Index]
[Index for Toolbox]
sensor_ring
(Toolbox/sensor_ring.m in BrainStorm 2.0 (Alpha))
Function Synopsis
[R,s,sensnum,th,rings] = sensor_ring(r,th,rings,version);
Help Text
SENSOR_RING - Generate rings of sensors about a sphere roughly uniformly spaced.
function [R,s,sensnum,th,rings] = sensor_ring(r,th,rings,version);
For radius 'r', angle separation 'theta' (radians), and
'rings' number of sensor rings:
Generate R (mx3) location and s (mx3) orientation of
radially oriented sensors.
If rings is given as a string, 'h' or 'f', then theta is adjusted to give
exactly half or full head coverage. Adjusted values are returned in
the output as th and rings.
The first sensor is on the z-axis, at [0 0 r]; Each ring is incremented
theta radians down from the z-axis, and the first sensor of each ring is
positioned on the x-axis (in spherical coords, the first sensor is at
phi=0).
The desired sensor spacing is set by the distance from sensor 1 to 2.
Sensnum is a vector of the number of sensors per ring. The sensors are
spaced about each ring such that the distance between sensors in a given
ring are as close as possible to the desired spacing.
Optionally: if theta has two components, then the first component is the
initial offset from the z-axis for the first ring, and the second
component is increment between rings. (Option has no effect for 'old'
mode, but the second component will be properly interpreted as the
increment.)
Example:
[R,s,sensnum] = sensor_ring(0.12,12*(pi/180),4); produces a simulated
version of the BTi configuration, which has four rings of sensors,
including the center ring of 1 sensor, then 6, then 12, then 18, for a
total of 37 sensors. Each ring is separated from the adjacent ring by
about 12 degrees, and the entire array sits on a virtual sphere of radius
12 cm (0.12 meters).
OTHER ANGLES AND MORE RINGS MAY GENERATE DIFFERENT PATTERNS THAN THE
OLD SENSOR_RING PROGRAM. The old routine may be activated by the
string 'old' in version, which builds rings of 1, 6, 12, 18, 24, ...
Default is the new routine, which builds each ring with a suitable number
of sensors to maintain the desired sensor spacing. For the BTi pattern
example above, there is virtually no difference between old and new modes.
See also CONN_DIST for the distance between sensor points,
and SENSOR_SPACING for a convenient method of calling this routine.
Cross-Reference Information
This function is called by
Listing of function C:\BrainStorm_2001\Toolbox\sensor_ring.m
function [R,s,sensnum,th,rings] = sensor_ring(r,th,rings,version);
%SENSOR_RING - Generate rings of sensors about a sphere roughly uniformly spaced.
% function [R,s,sensnum,th,rings] = sensor_ring(r,th,rings,version);
% For radius 'r', angle separation 'theta' (radians), and
% 'rings' number of sensor rings:
% Generate R (mx3) location and s (mx3) orientation of
% radially oriented sensors.
% If rings is given as a string, 'h' or 'f', then theta is adjusted to give
% exactly half or full head coverage. Adjusted values are returned in
% the output as th and rings.
%
% The first sensor is on the z-axis, at [0 0 r]; Each ring is incremented
% theta radians down from the z-axis, and the first sensor of each ring is
% positioned on the x-axis (in spherical coords, the first sensor is at
% phi=0).
% The desired sensor spacing is set by the distance from sensor 1 to 2.
% Sensnum is a vector of the number of sensors per ring. The sensors are
% spaced about each ring such that the distance between sensors in a given
% ring are as close as possible to the desired spacing.
% Optionally: if theta has two components, then the first component is the
% initial offset from the z-axis for the first ring, and the second
% component is increment between rings. (Option has no effect for 'old'
% mode, but the second component will be properly interpreted as the
% increment.)
%
% Example:
% [R,s,sensnum] = sensor_ring(0.12,12*(pi/180),4); produces a simulated
% version of the BTi configuration, which has four rings of sensors,
% including the center ring of 1 sensor, then 6, then 12, then 18, for a
% total of 37 sensors. Each ring is separated from the adjacent ring by
% about 12 degrees, and the entire array sits on a virtual sphere of radius
% 12 cm (0.12 meters).
%
% OTHER ANGLES AND MORE RINGS MAY GENERATE DIFFERENT PATTERNS THAN THE
% OLD SENSOR_RING PROGRAM. The old routine may be activated by the
% string 'old' in version, which builds rings of 1, 6, 12, 18, 24, ...
% Default is the new routine, which builds each ring with a suitable number
% of sensors to maintain the desired sensor spacing. For the BTi pattern
% example above, there is virtually no difference between old and new modes.
%
% See also CONN_DIST for the distance between sensor points,
% and SENSOR_SPACING for a convenient method of calling this routine.
%<autobegin> ---------------------- 26-May-2004 11:34:20 -----------------------
% --------- Automatically Generated Comments Block Using AUTO_COMMENTS ---------
%
% CATEGORY: Forward Modeling
%
% At Check-in: $Author: Mosher $ $Revision: 14 $ $Date: 5/26/04 10:02a $
%
% This software is part of BrainStorm Toolbox Version 2.0 (Alpha) 24-May-2004
%
% Principal Investigators and Developers:
% ** Richard M. Leahy, PhD, Signal & Image Processing Institute,
% University of Southern California, Los Angeles, CA
% ** John C. Mosher, PhD, Biophysics Group,
% Los Alamos National Laboratory, Los Alamos, NM
% ** Sylvain Baillet, PhD, Cognitive Neuroscience & Brain Imaging Laboratory,
% CNRS, Hopital de la Salpetriere, Paris, France
%
% See BrainStorm website at http://neuroimage.usc.edu for further information.
%
% Copyright (c) 2004 BrainStorm by the University of Southern California
% This software distributed under the terms of the GNU General Public License
% as published by the Free Software Foundation. Further details on the GPL
% license can be found at http://www.gnu.org/copyleft/gpl.html .
%
% FOR RESEARCH PURPOSES ONLY. THE SOFTWARE IS PROVIDED "AS IS," AND THE
% UNIVERSITY OF SOUTHERN CALIFORNIA AND ITS COLLABORATORS DO NOT MAKE ANY
% WARRANTY, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
% MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, NOR DO THEY ASSUME ANY
% LIABILITY OR RESPONSIBILITY FOR THE USE OF THIS SOFTWARE.
%<autoend> ------------------------ 26-May-2004 11:34:20 -----------------------
% ----------------------------- Script History ---------------------------------
% Author John C. Mosher, Ph.D. ~1992
% June 8, 1994 JCM: modified from old sensor_ring 6/8/94 to give more uniform
% spacing over hemisphere .
% July 28, 1994 JCM: added two element theta option
% January 18, 1995 JCM: reversed ordering around each ring to correspond to
% HRL numbering scheme.
% March 2, 1995 JCM: adjusted 'new' routine to interleave subsequent rings
% and therefore make the true distances somewhat more comparable.
% Also added 'new' rings option 'half' and 'full', for upperhemisphere
% coverage and full sphere coverage.
% August 31, 1995, bug fix with 'full' coverage, was only giving 'half'.
% 19-May-2004 JCM Comments Cleaning
% ----------------------------- Script History ---------------------------------
if(exist('version')~=1), % user gave no version
version = 'new'; % default is not old
end
if(strcmp(lower(version),'old')), % user wants old version
OLD_MODE = 1;
else
OLD_MODE = 0; % default mode
end
th_initial = 0; % initial angle from z-axis
if(length(th)==2), % user using option
th_initial = th(1);
th = th(2);
end
% design first for unit length, then scale to radius
if(OLD_MODE),
R(1,:) = [0 0 1]; % first sensor, "ring" one
degrees = 180/pi; % conversion
deg = 60; % phi increment in second ring of six sensors
for j = 2:rings
phi = -[0:deg:359]'./degrees;% phi index this ring, 1/18/95 added '-'sign
thj = (j-1)*th; % next theta increment
% append next ring of sensors
R = [R;...
[cos(phi)*sin(thj) ...
sin(phi)*sin(thj) ones(length(phi),1)*cos(thj)]];
deg = 60/j; % phi increment next ring of sensors
end
sensnum = [1 [1:(rings-1)]*6]; % old pattern of rings
else
if(isstr(rings)), % user wants us to calculate parameters
% first figure for half hemisphere coverage, but not exceeding.
tmp1 = round((pi/2 - th_initial)/th); % number of rings, except top
th = ((pi/2)-th_initial)/tmp1; % new value
nrings = tmp1; % number of rings for half coverage
if(th_initial==0), % need a top single point also
nrings = nrings + 1;
end
if(rings(1)=='f'), % want full coverage
nrings = tmp1 + nrings; % including bottom set ring of 1 sensor
end
% now map number of rings over the string rings
rings = nrings;
end % if rings given as string
[x1,y1,z1] = sph2cart(0,pi/2 - th_initial,1); % first sensor, first ring
[x2,y2,z2] = sph2cart(0,pi/2 - th_initial - th,1); %first sensor, second ring
d = norm([x2,y2,z2] - [x1,y1,z1]); % distance between, desired distance
sensnum = zeros(1,rings); % number of sensors per ring
R = [];
for j = 1:rings,
thj = (j-1)*th + th_initial;% theta this ring
circum = 2*pi*sin(thj); % circumference of circle
sens = max(round(circum/d),1);% number of sensors this ring, minimum 1
sensnum(j) = sens;
ph = -[0:(sens-1)]'/sens*2*pi; % phi increments this ring,
% 1/18/95 added '-' sign to ph
% 3/2/95 added ph/2 factor for odd numbered rings
if(rem(j,2) & (sens > 1)), % odd ring of more than one sensor
ph = ph + ph(2)/2; % bump half an increment
end
% append next ring of sensors
R = [R;...
[cos(ph)*sin(thj) ...
sin(ph)*sin(thj) ones(length(ph),1)*cos(thj)]];
end
end
s = R; % radial orientation of unit length
R = R*r; % scale to radius
return
Produced by color_mat2html, a customized BrainStorm 2.0 (Alpha) version of mat2html on Tue Oct 12 12:05:14 2004
Cross-Directory links are: ON