[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

    sensor_spacing                     C:\BrainStorm_2001\Toolbox\sensor_spacing.m
    source_grid                        C:\BrainStorm_2001\Toolbox\source_grid.m

### 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 Nov 2 16:17:59 2004
Cross-Directory links are: ON