1 | function beta2tracy |
---|
2 | % beta2tracy - Function for convering a beta lattice into a input tracy file |
---|
3 | |
---|
4 | % |
---|
5 | %% Written by Laurent S. Nadolski |
---|
6 | |
---|
7 | % TODO |
---|
8 | % tested on Diamond file, need to test on SOLEIL file |
---|
9 | % need to add special flag for soleil or generic (cf. slicing of elements and so on). |
---|
10 | % To do for all elements |
---|
11 | % To do for all parameters of all elements... |
---|
12 | |
---|
13 | fullFlag = 1; % expand the full lattice if periodicity |
---|
14 | DebugFlag =0; |
---|
15 | |
---|
16 | fileBeta='DLS713_NLBDWS.str'; |
---|
17 | |
---|
18 | % Open beta file in read access only |
---|
19 | fid = fopen(fileBeta, 'r'); |
---|
20 | |
---|
21 | % Determine the number of line of file |
---|
22 | fileLineNumber = 0; |
---|
23 | chunksize = 1e6; |
---|
24 | while ~feof(fid) |
---|
25 | ch = fread(fid, chunksize, '*uchar'); |
---|
26 | if isempty(ch) |
---|
27 | break |
---|
28 | end |
---|
29 | fileLineNumber = fileLineNumber + sum(ch == sprintf('\n')); |
---|
30 | end |
---|
31 | |
---|
32 | frewind(fid); |
---|
33 | |
---|
34 | |
---|
35 | % read BETA file and construct a structure |
---|
36 | % create the structure with the right size; |
---|
37 | fileStruct(fileLineNumber).tline = 'end of file'; |
---|
38 | |
---|
39 | for k=1:fileLineNumber, |
---|
40 | fileStruct(k).tline = fgetl(fid); % read line |
---|
41 | end |
---|
42 | |
---|
43 | fclose(fid); |
---|
44 | |
---|
45 | %% |
---|
46 | for k =1:fileLineNumber, |
---|
47 | if ~isempty(regexp(fileStruct(k).tline,'\*\*\* AUTHOR \*\*\*', 'once')) |
---|
48 | authorStr = fileStruct(k+1).tline; |
---|
49 | end |
---|
50 | if ~isempty(regexp(fileStruct(k).tline,'\*\*\* TITRE \*\*\*', 'once')) |
---|
51 | titleStr = fileStruct(k+1).tline; |
---|
52 | end |
---|
53 | if ~isempty(regexp(fileStruct(k).tline,'\*\*\* PERIOD \*\*\*', 'once')) |
---|
54 | periodNumber = str2double(regexp(fileStruct(k+1).tline,'\s*(\d*)', 'match')); |
---|
55 | end |
---|
56 | if ~isempty(regexp(fileStruct(k).tline,'\*\*\* ENERGIE CINETIQUE \(MeV\) \*\*\*', 'once')) |
---|
57 | energy = str2double(regexp(fileStruct(k+1).tline,'\s*[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)', 'match')); |
---|
58 | end |
---|
59 | if ~isempty(regexp(fileStruct(k).tline,'\*\*\* LIST OF ELEMENTS \*\*\*', 'once')) |
---|
60 | elemNumber = str2double(regexp(fileStruct(k+1).tline,'\s*(\d*)', 'match')); |
---|
61 | elemNumberLine = k + 1; |
---|
62 | end |
---|
63 | if ~isempty(regexp(fileStruct(k).tline,'\*\*\* STRUCTURE \*\*\*', 'once')) |
---|
64 | structureLineNumber = fix(str2double(regexp(fileStruct(k+1).tline,'\s*(\d*)', 'match'))/6); |
---|
65 | structureLine = k+2; |
---|
66 | end |
---|
67 | % if ~isempty(regexp(fileStruct(k).tline,'\*\*\* OPTION \*\*\*', 'once')) |
---|
68 | % optionStr = regexp(fileStruct(k+1).tline,'\s*(\d*)', 'match'); |
---|
69 | % optionLine = k+2; |
---|
70 | % end |
---|
71 | end |
---|
72 | |
---|
73 | |
---|
74 | % Numeric expression |
---|
75 | %nE = '[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?'; |
---|
76 | |
---|
77 | %% |
---|
78 | k = 1; |
---|
79 | |
---|
80 | while k <= elemNumber, |
---|
81 | %fileStruct(elemNumberLine+k).tline |
---|
82 | if ~isempty(regexp(fileStruct(elemNumberLine+k).tline, ' SD ', 'once')); |
---|
83 | fileStruct(elemNumberLine+k).elem = regexp(fileStruct(elemNumberLine+k).tline, '\s*(?<name>\w*)\s*(?<type>\w*)\s*(?<length>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)', 'names'); |
---|
84 | elseif ~isempty(regexp(fileStruct(elemNumberLine+k).tline, ' OB', 'once')) |
---|
85 | fileStruct(elemNumberLine+k).elem = regexp(fileStruct(elemNumberLine+k).tline, '\s*(?<name>\w*)\s*(?<type>\w*)', 'names'); |
---|
86 | elseif ~isempty(regexp(fileStruct(elemNumberLine+k).tline, ' QP ', 'once')) |
---|
87 | fileStruct(elemNumberLine+k).elem = regexp(fileStruct(elemNumberLine+k).tline, '\s*(?<name>\w*)\s*(?<type>\w*)\s*(?<length>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<strength>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<temp1>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)', 'names'); |
---|
88 | elseif ~isempty(regexp(fileStruct(elemNumberLine+k).tline, ' SX ', 'once')) |
---|
89 | fileStruct(elemNumberLine+k).elem = regexp(fileStruct(elemNumberLine+k).tline, '\s*(?<name>\w*)\s*(?<type>\w*)\s*(?<length>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<strength>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<temp1>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<temp2>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)', 'names'); |
---|
90 | elseif ~isempty(regexp(fileStruct(elemNumberLine+k).tline, ' BH ', 'once')) |
---|
91 | fileStruct(elemNumberLine+k).elem = regexp(fileStruct(elemNumberLine+k).tline, '\s*(?<name>\w*)\s*(?<type>\w*)\s*(?<angle>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<radius>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<quadStrength>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<sextuStrength>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<edgeAngle>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)', 'names'); |
---|
92 | temp = regexp(fileStruct(elemNumberLine+k+1).tline, '\s*(?<fringeField>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<edgeCurvature>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*(?<K2>[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)', 'names'); |
---|
93 | fileStruct(elemNumberLine+k).elem.fringeField = temp.fringeField; |
---|
94 | fileStruct(elemNumberLine+k).elem.edgeCurvature = temp.edgeCurvature; |
---|
95 | fileStruct(elemNumberLine+k).elem.K2 = temp.K2; |
---|
96 | k = k+1; |
---|
97 | end |
---|
98 | % fileStruct(elemNumberLine+k).elem: |
---|
99 | k = k +1; |
---|
100 | end |
---|
101 | |
---|
102 | %% Start writing Tracy II input file |
---|
103 | |
---|
104 | [pathstr, name] = fileparts(fileBeta); |
---|
105 | |
---|
106 | fileTracy= [name '.lat']; |
---|
107 | |
---|
108 | fid = fopen(fileTracy, 'w+'); |
---|
109 | fprintf(fid,'{*****************************************}\n'); |
---|
110 | fprintf(fid,'{* *}\n'); |
---|
111 | fprintf(fid,'{* Lattice generated on %11s *}\n', date); |
---|
112 | fprintf(fid,'{* using beta2tracy.m *}\n'); |
---|
113 | fprintf(fid,'{* *}\n'); |
---|
114 | fprintf(fid,'{* %s *}\n', titleStr); |
---|
115 | fprintf(fid,'{* *}\n'); |
---|
116 | fprintf(fid,'{* Author: %s *}\n', authorStr); |
---|
117 | fprintf(fid,'{* *}\n'); |
---|
118 | fprintf(fid,'{*****************************************}\n'); |
---|
119 | fprintf(fid,'\n'); |
---|
120 | fprintf(fid,'define lattice; \n\n'); |
---|
121 | fprintf(fid,'intmeth= 4; \n\n'); |
---|
122 | fprintf(fid,'{***** System parameters *****}\n\n'); |
---|
123 | fprintf(fid,'Energy= %f; { GeV }\n', energy*1e-3); |
---|
124 | fprintf(fid,'dP = 1.0d-10;\n'); |
---|
125 | fprintf(fid,'CODeps= 1.0d-15;\n'); |
---|
126 | fprintf(fid,'\n'); |
---|
127 | fprintf(fid,'Nq=10; {Number of slices for quadrupoles} \n'); |
---|
128 | fprintf(fid,'NqSx=10; {Number of slices for sextupoles} \n\n'); |
---|
129 | |
---|
130 | fprintf(fid,'{*** Element list ***}\n\n'); |
---|
131 | |
---|
132 | for k =elemNumberLine+1:elemNumber+elemNumberLine, |
---|
133 | if isfield(fileStruct(k).elem, 'type') |
---|
134 | if DebugFlag |
---|
135 | fileStruct(k).elem |
---|
136 | end |
---|
137 | switch fileStruct(k).elem.type; |
---|
138 | case 'SD' |
---|
139 | fprintf(fid,'%s : drift, L= %f;\n', fileStruct(k).elem.name, ... |
---|
140 | str2double(fileStruct(k).elem.length)); |
---|
141 | case 'QP' |
---|
142 | fprintf(fid,'%s : quadrupole, L= %f, k = %f, method=intmeth, N=Nq;\n', fileStruct(k).elem.name, ... |
---|
143 | str2double(fileStruct(k).elem.length), str2double(fileStruct(k).elem.strength)); |
---|
144 | case 'SX' |
---|
145 | fprintf(fid,'%s : sextupole, L= %f, k = %f, method=intmeth, N=NqSx;\n', fileStruct(k).elem.name, ... |
---|
146 | str2double(fileStruct(k).elem.length), str2double(fileStruct(k).elem.strength)); |
---|
147 | case 'BH' |
---|
148 | length_ = str2double(fileStruct(k).elem.angle)*str2double(fileStruct(k).elem.radius); |
---|
149 | angle = str2double(fileStruct(k).elem.angle) * 180/pi; % Conversion in degrees |
---|
150 | fprintf(fid,'%s : bending, L= %f, T = %f, T1 = %f, T2 = %f, K = %f, N=4, method=intmeth;\n', fileStruct(k).elem.name, ... |
---|
151 | length_, angle, angle/2, angle/2, str2double(fileStruct(k).elem.quadStrength)); |
---|
152 | case 'OB' |
---|
153 | fprintf(fid,'%s : marker;\n', fileStruct(k).elem.name); |
---|
154 | end |
---|
155 | end |
---|
156 | end |
---|
157 | |
---|
158 | fprintf(fid,'\n{*** Special markers***} \nSTART : marker;\n'); |
---|
159 | fprintf(fid,'FIN : marker;\n'); |
---|
160 | |
---|
161 | |
---|
162 | fprintf(fid,'\n\n{*** Superperiods ***}\n\n'); |
---|
163 | |
---|
164 | fprintf(fid,'PERIOD: START,\n'); |
---|
165 | for k = structureLine:structureLine+structureLineNumber-1; |
---|
166 | rep = regexp(fileStruct(k).tline,'\w*','match'); |
---|
167 | fprintf(fid,'%s, ', rep{:}); |
---|
168 | fprintf(fid,'\n'); |
---|
169 | end |
---|
170 | fprintf(fid,'FIN;\n'); |
---|
171 | |
---|
172 | if fullFlag |
---|
173 | fprintf(fid,'\n\nRING: %d*PERIOD;\n', periodNumber); |
---|
174 | else |
---|
175 | fprintf(fid,'\n\nRING: PERIOD;\n'); |
---|
176 | end |
---|
177 | |
---|
178 | |
---|
179 | fprintf(fid,'\n{***** Define CELL structure ****}\n'); |
---|
180 | if fullFlag |
---|
181 | fprintf(fid,'CELL: RING, symmetry = 1;\n\n'); |
---|
182 | else |
---|
183 | fprintf(fid,'CELL: RING, symmetry = %d;\n\n', periodNumber); |
---|
184 | end |
---|
185 | fprintf(fid,'end;\n'); |
---|
186 | |
---|
187 | fclose(fid); |
---|
188 | |
---|
189 | |
---|
190 | system(['nedit ' fileTracy ' &']); |
---|
191 | |
---|