LINEPASS tracks particles through each element of the cell array LINE calling the element-specific tracking function specified in the LINE{i}.PassMethod field. ROUT=LINEPASS(LINE,RIN) tracks particle(s) with initial condition(s) RIN for NTURNS turns to the end of the LINE LINE AT lattice RIN 6xN matrix: input coordinates of N particles ROUT 6xN matrix: output coordinates of N particles at the end of LINE ROUT=LINEPASS(LINE,RIN,REFPTS) also returns intermediate results at the entrance of each element specified in the REFPTS REFPTS is an array of increasing indexes that selects elements between 1 and length(LINE)+1. See further explanation of REFPTS in the 'help' for FINDSPOS ROUT 6x(N*length(REFPTS)) matrix: output coordinates of N particles at each reference point NOTE: LINEPASS(LINE,RIN,length(LINE)+1) is the same as LINEPASS(LINE,RIN) since the reference point length(LINE)+1 is the exit of the last element LINEPASS(LINE,RIN,1) is a copy of RIN since the reference point 1 is the entrance of the first element [ROUT, LOST]=LINEPASS(...) Return additionally an information on lost particles LOST 1xN logical vector, indicating lost particles If only one output is given, loss information is saved in global variable LOSSFLAG [ROUT, LOSS, LOSSINFO]=LINEPASS(...,'nhist',NHIST,...) Return additional information on lost particles NHIST number elements before the loss to be traced (default: 1) LOSSINFO 1x1 structure with the following fields: lost 1xN logical vector, indicating lost particles turn 1xN vector, turn number where the particle is lost element 1xN vector, element number where the particle is lost coordinates_at_loss 6xN array, coordinates at the exit of the element where the particle is lost (sixth coordinate is inf if particle is lost in a physical aperture) coordinates 6xNxNHIST array, coordinates at the entrance of the LHIST elements before the loss ROUT=LINEPASS(...,'KeepLattice') Tracking with the 'KeepLattice' flag is more efficient because it reuses persistent data structures stored in memory in previous calls to LINEPASS. !!! In order to use this option, LINEPASS must first be called without the 'KeepLattice' flag. It then assumes that the elements in LINE DO NOT CHANGE between calls. Otherwise, LINEPASS must be called again without 'KeepLattice'. ROUT=LINEPASS(...,'reuse') is kept for compatibilty with previous versions. It has no effect. Rfin=LINEPASS(...,PREFUNC) Rfin=LINEPASS(...,PREFUNC,POSTFUNC) Rfin=LINEPASS(...,function_handle.empty,POSTFUNC) PREFUNC and POSTFUNC are function handles, PREFUNC is called immediately before tracking each element, POSTFUNC is called immediately after each element. Functions are called as: ROUT=FUNC(ELEMENT, RIN, NTURN, NELEMENT) and is allowed to modify the particle coordinates See also: RINGPASS
0001 function [Rout,varargout] = linepass(line,Rin,refpts,varargin) 0002 %LINEPASS tracks particles through each element of the cell array LINE 0003 % calling the element-specific tracking function specified in the 0004 % LINE{i}.PassMethod field. 0005 % 0006 % ROUT=LINEPASS(LINE,RIN) tracks particle(s) with initial 0007 % condition(s) RIN for NTURNS turns to the end of the LINE 0008 % 0009 % LINE AT lattice 0010 % RIN 6xN matrix: input coordinates of N particles 0011 % 0012 % ROUT 6xN matrix: output coordinates of N particles at 0013 % the end of LINE 0014 % 0015 % ROUT=LINEPASS(LINE,RIN,REFPTS) also returns intermediate results 0016 % at the entrance of each element specified in the REFPTS 0017 % 0018 % REFPTS is an array of increasing indexes that selects elements 0019 % between 1 and length(LINE)+1. 0020 % See further explanation of REFPTS in the 'help' for FINDSPOS 0021 % ROUT 6x(N*length(REFPTS)) matrix: output coordinates of N particles at 0022 % each reference point 0023 % 0024 % NOTE: 0025 % LINEPASS(LINE,RIN,length(LINE)+1) is the same as LINEPASS(LINE,RIN) 0026 % since the reference point length(LINE)+1 is the exit of the last element 0027 % LINEPASS(LINE,RIN,1) is a copy of RIN since the 0028 % reference point 1 is the entrance of the first element 0029 % 0030 % [ROUT, LOST]=LINEPASS(...) 0031 % Return additionally an information on lost particles 0032 % LOST 1xN logical vector, indicating lost particles 0033 % If only one output is given, loss information is saved in 0034 % global variable LOSSFLAG 0035 % 0036 % [ROUT, LOSS, LOSSINFO]=LINEPASS(...,'nhist',NHIST,...) 0037 % Return additional information on lost particles 0038 % NHIST number elements before the loss to be traced (default: 1) 0039 % LOSSINFO 1x1 structure with the following fields: 0040 % lost 1xN logical vector, indicating lost particles 0041 % turn 1xN vector, turn number where the particle is lost 0042 % element 1xN vector, element number where the particle is lost 0043 % coordinates_at_loss 6xN array, coordinates at the exit of 0044 % the element where the particle is lost 0045 % (sixth coordinate is inf if particle is lost in a physical aperture) 0046 % coordinates 6xNxNHIST array, coordinates at the entrance of the 0047 % LHIST elements before the loss 0048 % 0049 % ROUT=LINEPASS(...,'KeepLattice') Tracking with the 'KeepLattice' flag is 0050 % more efficient because it reuses persistent data structures stored in 0051 % memory in previous calls to LINEPASS. 0052 % 0053 % !!! In order to use this option, LINEPASS must first be called 0054 % without the 'KeepLattice' flag. It then assumes that the elements in LINE 0055 % DO NOT CHANGE between calls. Otherwise, LINEPASS must be called again 0056 % without 'KeepLattice'. 0057 % 0058 % ROUT=LINEPASS(...,'reuse') is kept for compatibilty with previous 0059 % versions. It has no effect. 0060 % 0061 % Rfin=LINEPASS(...,PREFUNC) 0062 % Rfin=LINEPASS(...,PREFUNC,POSTFUNC) 0063 % Rfin=LINEPASS(...,function_handle.empty,POSTFUNC) 0064 % PREFUNC and POSTFUNC are function handles, PREFUNC is called 0065 % immediately before tracking each element, POSTFUNC is called 0066 % immediately after each element. Functions are called as: 0067 % 0068 % ROUT=FUNC(ELEMENT, RIN, NTURN, NELEMENT) 0069 % 0070 % and is allowed to modify the particle coordinates 0071 % 0072 % See also: RINGPASS 0073 0074 % Check input arguments 0075 if size(Rin,1)~=6 0076 error('Matrix of initial conditions, the second argument, must have 6 rows'); 0077 end 0078 0079 if (nargin < 3) 0080 refpts = length(line)+1; 0081 elseif islogical(refpts) 0082 refpts = find(refpts); 0083 elseif ~isnumeric(refpts) 0084 refpts = length(line)+1; 0085 end 0086 [keeplattice,args]=getflag(varargin, 'KeepLattice'); 0087 [dummy,args]=getflag(args,'reuse'); %#ok<ASGLU> % Kept for compatibility and ignored 0088 funcargs=cellfun(@(arg) isa(arg,'function_handle'), args); 0089 nhist=getoption(struct(args{~funcargs}), 'nhist',1); 0090 0091 newlattice = double(~keeplattice); 0092 0093 [prefunc,postfunc]=parseargs({function_handle.empty,function_handle.empty},... 0094 args(funcargs)); 0095 0096 try 0097 [Rout,lossinfo] = atpass(line,Rin,newlattice,1,refpts,prefunc,postfunc,nhist); 0098 0099 if nargout>1 0100 if nargout>2, varargout{2}=lossinfo; end 0101 varargout{1} = lossinfo.lost; 0102 else % if no output arguments - create LOSSFLAG, for backward compatibility with AT 1.2 0103 evalin('base','clear LOSSFLAG'); 0104 evalin('base','global LOSSFLAG'); 0105 assignin('base','LOSSFLAG',lossinfo.lost); 0106 end 0107 catch err 0108 if strcmp(err.identifier,'MATLAB:unassignedOutputs') 0109 error('Atpass:obsolete',['linepass is now expecting 2 output arguments from atpass.\n',... 0110 'You may need to call "atmexall" to install the new version']); 0111 else 0112 rethrow(err) 0113 end 0114 end 0115 end