source: MML/trunk/machine/SOLEIL/common/naff/naffutils/beta2tracy.m

Last change on this file was 17, checked in by zhangj, 10 years ago

To have a stable version on the server.

  • Property svn:executable set to *
File size: 7.8 KB
Line 
1function 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
13fullFlag = 1; % expand the full lattice if periodicity
14DebugFlag =0;
15
16fileBeta='DLS713_NLBDWS.str';
17
18% Open beta file in read access only
19fid = fopen(fileBeta, 'r');
20
21% Determine the number of line of file
22fileLineNumber = 0;
23chunksize = 1e6;
24while ~feof(fid)
25    ch = fread(fid, chunksize, '*uchar');
26    if isempty(ch)
27        break
28    end
29    fileLineNumber = fileLineNumber + sum(ch == sprintf('\n'));
30end
31
32frewind(fid);
33
34
35% read BETA file and construct a structure
36% create the structure with the right size;
37fileStruct(fileLineNumber).tline = 'end of file';
38
39for k=1:fileLineNumber,
40    fileStruct(k).tline = fgetl(fid); % read line
41end
42
43fclose(fid);
44
45%%
46for 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
71end
72
73
74% Numeric expression
75%nE = '[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?';
76
77%%
78k = 1;
79
80while 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;
100end
101
102%% Start writing Tracy II input file
103
104[pathstr, name] = fileparts(fileBeta);
105
106fileTracy= [name '.lat'];
107
108fid = fopen(fileTracy, 'w+');
109fprintf(fid,'{*****************************************}\n');
110fprintf(fid,'{*                                       *}\n');
111fprintf(fid,'{* Lattice generated on %11s    *}\n', date);
112fprintf(fid,'{*    using beta2tracy.m       *}\n');
113fprintf(fid,'{*                             *}\n');
114fprintf(fid,'{* %s *}\n', titleStr);
115fprintf(fid,'{*                             *}\n');
116fprintf(fid,'{* Author: %s *}\n', authorStr);
117fprintf(fid,'{*                                       *}\n');
118fprintf(fid,'{*****************************************}\n');
119fprintf(fid,'\n');
120fprintf(fid,'define lattice; \n\n');
121fprintf(fid,'intmeth= 4; \n\n');
122fprintf(fid,'{***** System parameters *****}\n\n');
123fprintf(fid,'Energy= %f;    { GeV }\n', energy*1e-3);
124fprintf(fid,'dP    = 1.0d-10;\n');
125fprintf(fid,'CODeps= 1.0d-15;\n');
126fprintf(fid,'\n');
127fprintf(fid,'Nq=10; {Number of slices for quadrupoles} \n');
128fprintf(fid,'NqSx=10; {Number of slices for sextupoles} \n\n');
129
130fprintf(fid,'{*** Element list ***}\n\n');
131
132for 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
156end
157
158fprintf(fid,'\n{*** Special markers***} \nSTART : marker;\n');
159fprintf(fid,'FIN : marker;\n');
160
161
162fprintf(fid,'\n\n{*** Superperiods ***}\n\n');
163
164fprintf(fid,'PERIOD: START,\n');
165for k = structureLine:structureLine+structureLineNumber-1;
166    rep = regexp(fileStruct(k).tline,'\w*','match');
167    fprintf(fid,'%s, ', rep{:});
168    fprintf(fid,'\n');
169end
170fprintf(fid,'FIN;\n');
171
172if fullFlag
173    fprintf(fid,'\n\nRING: %d*PERIOD;\n', periodNumber);
174else
175    fprintf(fid,'\n\nRING: PERIOD;\n');
176end
177
178
179fprintf(fid,'\n{***** Define CELL structure ****}\n');
180if fullFlag
181    fprintf(fid,'CELL:  RING, symmetry = 1;\n\n');
182else
183    fprintf(fid,'CELL:  RING, symmetry = %d;\n\n', periodNumber);
184end
185fprintf(fid,'end;\n');
186
187fclose(fid);
188
189
190system(['nedit ' fileTracy ' &']);
191
Note: See TracBrowser for help on using the repository browser.