0001 function ATLATTICE = readmad(FILENAME)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034 [fid, errmsg] = fopen(FILENAME,'r');
0035 if fid==-1
0036 error('Could not open file');
0037 end
0038
0039 warnlevel = warning;
0040 warning on
0041
0042 global READMADCAVITYFLAG
0043 READMADCAVITYFLAG = 0;
0044
0045 LINE1 = fgetl(fid);
0046 LINE2 = fgetl(fid);
0047
0048 S = LINE1(9:16);
0049 nonspaceindex = find(~isspace(S) & (S~=0));
0050 MADFILETYPE = S(nonspaceindex);
0051
0052
0053
0054
0055 NSUPER = str2double(LINE1(41:48));
0056
0057 S = LINE1(56);
0058 SYMFLAG = eq(S,'T');
0059
0060 NPOS = str2double(LINE1(57:64));
0061
0062 disp(['MAD output file: ',FILENAME]);
0063 disp(' ');
0064 disp(['MAD file type: ',MADFILETYPE]);
0065 disp(['Symmetry flag: ',num2str(SYMFLAG)]);
0066 disp(['Number of superperiods: ',num2str(NSUPER)]);
0067 disp(['Number of elements : ',num2str(NPOS)]);
0068 disp(' ');
0069
0070
0071
0072
0073 ATNumElements = NPOS-1;
0074 ATLATTICE = cell(1,ATNumElements);
0075
0076
0077 switch MADFILETYPE
0078 case {'STRUCTUR','SURVEY'}
0079 NumLinesPerElement = 4;
0080 case {'TWISS','CHROM'}
0081 NumLinesPerElement = 5;
0082 case 'ENVELOPE'
0083 NumLinesPerElement = 8;
0084 end
0085
0086 ELEMENTDATA = cell(1,NumLinesPerElement);
0087
0088
0089 for i = 1:NumLinesPerElement;
0090 LINE = fgetl(fid);
0091 end
0092
0093 for i = 1:ATNumElements
0094
0095 for j= 1:NumLinesPerElement
0096 ELEMENTDATA{j}=fgetl(fid);
0097 end
0098
0099 ATLATTICE{i}=mad2at(ELEMENTDATA,MADFILETYPE);
0100 end
0101
0102
0103
0104
0105 fclose(fid);
0106 warning(warnlevel);
0107
0108 disp(' ');
0109 disp(['AT cell array was successfully created from MAD output file ',FILENAME]);
0110 disp('Some information may be not available in MAD otput files')
0111 disp('Some elements may have to be further modified to be consistent with AT element models')
0112 disp(' ');
0113 disp('For RF cavities READMAD creates elements that use DriftPass or IdentityPass (if Length ==0)');
0114 disp('Use CAVITYON(ENERGY) [eV] in order to turn them into cavities');
0115
0116
0117
0118
0119 function atelem = mad2at(elementdata,madfiletype)
0120 global READMADCAVITYFLAG
0121 MADTYPE = elementdata{1}(1:4);
0122 atelem.FamName = deblank(elementdata{1}(5:20));
0123 atelem.Length = str2double(elementdata{1}(21:32));
0124
0125 switch MADTYPE
0126 case 'DRIF'
0127 atelem.PassMethod = 'DriftPass';
0128 case {'MARK','MONI','HMON','VMON'}
0129 atelem.PassMethod = 'IdentityPass';
0130 case 'RFCA'
0131
0132
0133 if ~READMADCAVITYFLAG
0134 warning('MAD lattice contains RF cavities')
0135 READMADCAVITYFLAG = 1;
0136 end
0137 atelem.Frequency = 1e6*str2double(elementdata{2}(17:32));
0138 atelem.Voltage = 1e6*str2double(elementdata{2}(33:48));
0139 atelem.PhaseLag = str2double(elementdata{2}(49:64));
0140 if atelem.Length
0141 atelem.PassMethod = 'DriftPass';
0142 else
0143 atelem.PassMethod = 'IdentityPass';
0144 end
0145 case 'SBEN'
0146 K1 = str2double(elementdata{1}(49:64));
0147 K2 = str2double(elementdata{1}(65:80));
0148 atelem.BendingAngle = str2double(elementdata{1}(33:48));
0149 atelem.ByError = 0;
0150 atelem.MaxOrder = 3;
0151 atelem.NumIntSteps = 10;
0152 atelem.TiltAngle = str2double(elementdata{2}(1:16));
0153 atelem.EntranceAngle = str2double(elementdata{2}(17:32));
0154 atelem.ExitAngle = str2double(elementdata{2}(33:48));
0155 atelem.K = K1;
0156 atelem.PolynomB = [0 K1 K2 0];
0157 atelem.PolynomA = [0 0 0 0];
0158 atelem.T1 = zeros(1,6);
0159 atelem.T2 = zeros(1,6);
0160 atelem.R1 = eye(6);
0161 atelem.R2 = eye(6);
0162 if atelem.BendingAngle
0163 if K2
0164 atelem.PassMethod = 'BndMPoleSymplectic4Pass';
0165 elseif atelem.TiltAngle
0166 atelem.PassMethod = 'BendLinearFringeTiltPass'
0167 else
0168 atelem.PassMethod = 'BendLinearPass';
0169 end
0170
0171 else
0172 if K2
0173 atelem.PassMethod = 'StrMPoleSymplectic4Pass';
0174 elseif K1
0175 atelem.PassMethod = 'QuadLinearPass';
0176 else
0177 atelem.PassMethod = 'DriftPass';
0178 end
0179 end
0180 case 'QUAD'
0181 K1 = str2double(elementdata{1}(49:64));
0182 atelem.MaxOrder = 3;
0183 atelem.NumIntSteps = 10;
0184 atelem.K = K1;
0185 atelem.PolynomB = [0 K1 0 0];
0186 atelem.PolynomA = [0 0 0 0];
0187 atelem.T1 = zeros(1,6);
0188 atelem.T2 = zeros(1,6);
0189 TILT = str2double(elementdata{2}(1:16));
0190 atelem.R1 = mksrollmat(TILT);
0191 atelem.R2 = mksrollmat(-TILT);
0192 atelem.PassMethod = 'QuadLinearPass';
0193
0194 case 'SEXT'
0195
0196
0197 K2 = str2double(elementdata{1}(65:80))/2;
0198 atelem.MaxOrder = 3;
0199 atelem.NumIntSteps = 10;
0200 atelem.PolynomB = [0 0 K2 0];
0201 atelem.PolynomA = [0 0 0 0];
0202 atelem.T1 = zeros(1,6);
0203 atelem.T2 = zeros(1,6);
0204 TILT = str2double(elementdata{2}(1:16));
0205 atelem.R1 = mksrollmat(TILT);
0206 atelem.R2 = mksrollmat(-TILT);
0207 atelem.PassMethod = 'StrMPoleSymplectic4Pass';
0208
0209 case 'OCTU'
0210
0211
0212 K3 = str2double(elementdata{2}(17:32))/6;
0213 atelem.MaxOrder = 3 ;
0214 atelem.NumIntSteps = 10;
0215 atelem.PolynomB = [0 0 0 K3];
0216 atelem.PolynomA = [0 0 0 0];
0217 atelem.T1 = zeros(1,6);
0218 atelem.T2 = zeros(1,6);
0219 TILT = str2double(elementdata{2}(1:16));
0220 atelem.R1 = mksrollmat(TILT);
0221 atelem.R2 = mksrollmat(-TILT);
0222 atelem.PassMethod = 'StrMPoleSymplectic4Pass';
0223 otherwise
0224 if atelem.Length
0225 atelem.PassMethod = 'DriftPass';
0226 else
0227 atelem.PassMethod = 'IdentityPass';
0228 end
0229 end