Home > . > setexternal.m

setexternal

PURPOSE ^

SETEXTERNAL - set external angles for makelist

SYNOPSIS ^

function external = setexternal(mode, preExternal, varargin)

DESCRIPTION ^

 SETEXTERNAL - set external angles for makelist

 external = setexternal(mode, preExternal)  
   external drawn from file and cannot be 'OPTIMAL'
 external = setexternal(mode, preExternal, nSim)  
   external directly input into makelist and cannot be 'OPTIMAL' 
 external = setexternal(mode, preExternal, nSim, detId)  
   internal can be 'OPTIMAL'

 mode      operating mode of makelist
 preExternal  intermediate external angles 
 nSim      (optional) number of angles to generate
 detId     (optional) detector identifier

 external  determined external angles

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function external = setexternal(mode, preExternal, varargin)      
0002 
0003 % SETEXTERNAL - set external angles for makelist
0004 %
0005 % external = setexternal(mode, preExternal)
0006 %   external drawn from file and cannot be 'OPTIMAL'
0007 % external = setexternal(mode, preExternal, nSim)
0008 %   external directly input into makelist and cannot be 'OPTIMAL'
0009 % external = setexternal(mode, preExternal, nSim, detId)
0010 %   internal can be 'OPTIMAL'
0011 %
0012 % mode      operating mode of makelist
0013 % preExternal  intermediate external angles
0014 % nSim      (optional) number of angles to generate
0015 % detId     (optional) detector identifier
0016 %
0017 % external  determined external angles
0018 
0019 % $Id: setexternal.m,v 1.7 2004/05/17 21:21:01 stuver Exp $
0020 
0021 % DETERMINE how external angles where input to makelist from mode
0022 % IF external angles were read from file
0023 %   DETERMINE if makelist needs to set angles
0024 %   IF angle needs to be set
0025 %       SET angle
0026 %   ELSEIF anlge does not need to be set
0027 %       TYPECAST from string to double
0028 %   ENDIF
0029 %   RETURN determined external angles
0030 % ELSEIF external angles were not read from a file
0031 %   DETERMINE class of external
0032 %   IF string
0033 %       SET angles either randomly or to optimal orientation
0034 %   ELSEIF double
0035 %       COPY external nSim times
0036 %   ELSEIF struct
0037 %       COPY exernal nSim times
0038 %   ENDIF
0039 %   RETURN determined external angles
0040 % ENDIF
0041 
0042 external = [];
0043 
0044 % Modes with positive numbers are modes from makelist and match the modes
0045 % used in makelist.  Modes with negative numbers are modes for
0046 % pre-generated waveforms
0047 if (mode ==3 | mode == 4 | mode ==6 | mode == -1 | mode == -2) ...
0048         & length(varargin)~=2
0049     varargin
0050     error(['makelist -> setexternal: length(varargin) must be 2 for ' ...
0051             'modes 3, 4, 6, -1 or -2'])
0052 end
0053 
0054 % If external may be 'OPTIMAL', assign varargin{2} as the detId
0055 if length(varargin) == 2
0056     detId = varargin{2};
0057     if mode == 3 | mode == 4 | mode == 6 | mode == -1 | mode == -2
0058         % Get detector coordinates
0059         Cordnt = getifo(detId);
0060     end
0061 end
0062 
0063 % If external was read from file
0064 if mode == 1 | mode == 2 | mode == 3 | mode == 4 | mode == -1
0065     % There are 3 types of external angles that need to be looked at
0066     % individually.
0067     % Each of these angle types my be a list.  Each angle on the list must
0068     % be looked at individually.
0069     
0070     % Sort external into the three angle types
0071     [ext1, ext2, ext3] = deal(preExternal{1}, preExternal{2}, ...
0072         preExternal{3});
0073         
0074     % Look at every angle in each angle type
0075     for k=1:size(ext1, 1)
0076         % Examine ext1
0077         if strcmp(upper(ext1(k,:)), 'RANDOM') | ...
0078             strcmp(upper(ext1(k,:)), 'RANDOM ')
0079             % Set first external angle randomly
0080             tempExt1(k,1) = randomangle(1, 'x');
0081         elseif (mode == 3 | mode == 4) & strcmp(upper(ext1(k,:)), 'OPTIMAL')
0082             % Set source at zenith
0083             if ~isfield(Cordnt, 'CODEC')
0084                 error('makelist -> setexternal: Cordnt.CODEC does not exist')
0085             end
0086             tempExt1(k,1) = Cordnt.CODEC;
0087         else
0088             % Typecast first external angle
0089             tempExt1(k,1) = str2double(ext1(k,:));
0090             % Check for error
0091             if isnan(tempExt1(k,1))
0092                 if mode == 1 | mode == 2
0093                     ext1 = ext1(k,:)
0094                     error(['makelist -> setexternal: ext1 must be a ' ...
0095                             'double or char ''RANDOM'''])
0096                 elseif mode == 3 | mode == 4
0097                     ext1 = ext1(k,:)
0098                     error(['makelist -> setexternal: ext1 must be a ' ...
0099                             'double or char ''RANDOM'' or ''OPTIMAL'''])
0100                 end
0101             end
0102         end
0103         % Examine ext2
0104         if strcmp(upper(ext2(k,:)), 'RANDOM') | ...
0105             strcmp(upper(ext2(k,:)), 'RANDOM ')
0106             % Set second external angle randomly
0107             tempExt2(k,1) = randomangle(1, 'phi');
0108         elseif (mode == 3 | mode == 4) & strcmp(upper(ext2(k,:)), 'OPTIMAL')
0109             % Set source at zenith
0110             if ~isfield(Cordnt, 'LONG')
0111                 error('makelist -> setexternal: Cordnt.LONG does not exist')
0112             end
0113             tempExt2(k,1) = Cordnt.LONG;
0114         else
0115             % Typecast second internal angle
0116             tempExt2(k,1) = str2double(ext2(k,:));
0117             % Check for error
0118             if isnan(tempExt2(k,1))
0119                 if mode == 1 | mode == 2
0120                     ext2 = ext2(k,:)
0121                     error(['makelist -> setexternal: ext2 must be a ' ...
0122                             'double or char ''RANDOM'''])
0123                 elseif mode == 3 | mode == 4
0124                     ext2 = ext2(k,:)
0125                     error(['makelist -> setexternal: ext2 must be a ' ...
0126                             'double or char ''RANDOM'' or ''OPTIMAL'''])
0127                 end                
0128             end
0129         end 
0130         % Examine ext3
0131         if strcmp(upper(ext3(k,:)), 'RANDOM') | ...
0132             strcmp(upper(ext3(k,:)), 'RANDOM ')
0133             % Set third external angle randomly
0134             tempExt3(k,1) = randomangle(1, 'psi');
0135         elseif (mode == 3 | mode == 4) & strcmp(upper(ext3(k,:)), 'OPTIMAL')
0136             % Set polarization angle to 22.5 deg (50-50 mix of h+ and hx)
0137             tempExt3(k,1) = pi/8;
0138         else
0139             % Typecast third internal angle
0140             tempExt3(k,1) = str2double(ext3(k,:));
0141             % Check for error
0142             if isnan(tempExt3(k,1))
0143                 if mode == 1 | mode == 2
0144                     ext3 = ext3(k,:)
0145                     error(['makelist -> setexternal: ext3 must be a ' ...
0146                             'double or char ''RANDOM'''])
0147                 elseif mode == 3 | mode == 4
0148                     ext3 = ext3(k,:)
0149                     error(['makelist -> setexternal: ext3 must be a ' ...
0150                             'double or char ''RANDOM'' or ''OPTIMAL'''])
0151                 end
0152             end
0153         end
0154     end
0155     % Return determined external angles
0156     external = [tempExt1, tempExt2, tempExt3];
0157     
0158 % If external was not read from a file
0159 elseif mode == 5 | mode == 6 | mode == -2
0160     
0161     if length(varargin) >= 1
0162         nSim = varargin{1};
0163     else
0164         error(['makelist -> setexternal: Need to know number if external '...
0165                 'angles to generate (nSim)'])
0166     end
0167     
0168     if strcmp(class(preExternal), 'char') % external is a string
0169         if strcmp(upper(preExternal), 'RANDOM')
0170             % Set all (ext1, ext2 & ext3) external angles randomly nSim
0171             % times
0172             external = [randomangle(nSim, 'x'), randomangle(nSim, 'phi'), ...
0173                     randomangle(nSim, 'psi')];
0174             % Return external angles
0175         elseif strcmp(upper(preExternal), 'OPTIMAL') & (mode == 6 | ...
0176                 mode == -2)
0177             % Set source at xenith and polarzation angle to 22.5 deg (50-50
0178             % h+ and hx) nSim times
0179             if ~isfield(Cordnt, 'CODEC') | ~isfield(Cordnt, 'LONG')
0180                 error(['makelist -> setexternal: Cordnt.CODEC or ' ...
0181                         'Cordnt.LONG does not exist'])
0182             end
0183             external = repmat([Cordnt.CODEC, Cordnt.LONG, pi/8], nSim, 1);
0184             % Return external angles
0185         elseif mode == 5
0186             external = preExternal
0187             error(['makelist -> setexternal: external must be 1x3 vector,'...
0188                 ' struct or string ''RANDOM'''])
0189         elseif mode == 6 | mode == -2
0190             external = preExternal
0191             error(['makelist -> setexternal: external must be 1x3 vector,'...
0192                     ' struct or string ''RANDOM'' or ''OPTIMAL'''])
0193         end
0194     elseif strcmp(class(preExternal), 'double') % external is a double
0195         % Copy external angles nSim times
0196         external = repmat(preExternal, nSim, 1);
0197         % Return external angles
0198     elseif strcmp(class(preExternal), 'struct') % external is a struct
0199         if ~isfield(preExternal, 'x') | ~isfield(preExternal, 'phi') ...
0200                 | ~isfield(preExternal, 'psi')
0201             external = preExternal
0202             error(['makelist -> setexternal: the external struct must '...
0203                     'have fields x, phi and psi'])
0204         end
0205         % Copy external angles nSim times
0206         external = repmat([preExternal.x, preExternal.phi, ...
0207                 preExternal.psi], nSim, 1);
0208         % Return external angles
0209     else
0210         external = preExternal
0211         error(['makelist -> setexternal: Class type of external must be '...
0212                 'double, struct or char'])
0213     end
0214     
0215 end
0216 
0217 % Check ranges on angles
0218 check = find(abs(external(:,1)) > 1);
0219 if ~isempty(check)
0220     ext1 = external(:,1)
0221     error(['makelist -> setexternal: The first external angle is out of '...
0222             'range: (-1 1)'])
0223 end
0224 
0225 check = find(external(:,2) < -pi | external(:,2) > pi);
0226 if ~isempty(check)
0227     ext2 = external(:,2)
0228     error(['makelist -> setexternal: The second external angle is out of '...
0229         'range: (-pi pi)'])
0230 end
0231 
0232 check = find(external(:,3) < 0 | external(:,3) > 2*pi);
0233 if ~isempty(check)
0234     ext3 = external(:,3)
0235     error(['makelist -> setexternal: The third external angle is out of ' ...
0236             'range: (0 pi)'])
0237 end
0238 
0239 return

Generated on Tue 05-Oct-2004 10:40:50 by m2html © 2003