1 | function Meffquad = getrespquad(varargin) |
---|
2 | % getrespquad - Calculates from the model the response matrix of quadrupole relatively to the |
---|
3 | % beta function in every other quadrupole |
---|
4 | % |
---|
5 | |
---|
6 | % INPUTS |
---|
7 | % 1. Quadrupole family name {Default : All} |
---|
8 | % Optional |
---|
9 | % 'Archive', 'Display' |
---|
10 | % |
---|
11 | % OUPUTS |
---|
12 | % Meffquad |
---|
13 | % |
---|
14 | % ALGORITHM |
---|
15 | % Meffquad( i , j ) = delta beta dans quadrupole n° i / delta courant dans |
---|
16 | % quadrupole j |
---|
17 | |
---|
18 | % |
---|
19 | % Written by Mat husalem |
---|
20 | |
---|
21 | %%%%%%%%%%%%%%%%%%%%%%% |
---|
22 | switch2sim |
---|
23 | %%%%%%%%%%%%%%%%%%%%%%% |
---|
24 | |
---|
25 | DisplayFlag = 1; |
---|
26 | ArchiveFlag = 0; |
---|
27 | % % % FileName = ''; |
---|
28 | |
---|
29 | |
---|
30 | for i = length(varargin):-1:1 |
---|
31 | if isstruct(varargin{i}) |
---|
32 | % Ignore structures |
---|
33 | elseif iscell(varargin{i}) |
---|
34 | % Ignore cells |
---|
35 | elseif strcmpi(varargin{i},'Display') |
---|
36 | DisplayFlag = 1; |
---|
37 | varargin(i) = []; |
---|
38 | elseif strcmpi(varargin{i},'NoDisplay') |
---|
39 | DisplayFlag = O; |
---|
40 | varargin(i) = []; |
---|
41 | elseif strcmpi(varargin{i},'NoArchive') |
---|
42 | ArchiveFlag = O; |
---|
43 | varargin(i) = []; |
---|
44 | elseif strcmpi(varargin{i},'Archive') |
---|
45 | ArchiveFlag = 1; |
---|
46 | varargin(i) = []; |
---|
47 | end |
---|
48 | end |
---|
49 | |
---|
50 | % Input parsing |
---|
51 | if isempty(varargin) |
---|
52 | QuadFam = findmemberof('QUAD'); |
---|
53 | elseif ischar(varargin{1}) |
---|
54 | QuadFam = {varargin{:}}; |
---|
55 | else |
---|
56 | QuadFam = varargin{:} |
---|
57 | end |
---|
58 | |
---|
59 | if ArchiveFlag |
---|
60 | % % % if isempty(FileName) |
---|
61 | % % % FileName = appendtimestamp(getfamilydata('Default', 'QUADArchiveFile')); |
---|
62 | % % % DirectoryName = getfamilydata('Directory', 'QUAD'); |
---|
63 | % % % if isempty(DirectoryName) |
---|
64 | % % % DirectoryName = [getfamilydata('Directory','DataRoot'), 'Response', filesep, 'BPM', filesep]; |
---|
65 | % % % else |
---|
66 | % % % % Make sure default directory exists |
---|
67 | % % % DirStart = pwd; |
---|
68 | % % % [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName); |
---|
69 | % % % cd(DirStart); |
---|
70 | % % % end |
---|
71 | % % % [FileName, DirectoryName] = uiputfile('*.mat', 'Select a Quad File ("Save" starts measurement)', [DirectoryName FileName]); |
---|
72 | % % % if FileName == 0 |
---|
73 | % % % ArchiveFlag = 0; |
---|
74 | % % % disp(' Quadrupole betatron measurement canceled.'); |
---|
75 | % % % return |
---|
76 | % % % end |
---|
77 | % % % FileName = [DirectoryName, FileName]; |
---|
78 | % % % elseif FileName == -1 |
---|
79 | % % % FileName = appendtimestamp(getfamilydata('Default', 'QUADArchiveFile')); |
---|
80 | % % % DirectoryName = getfamilydata('Directory', 'QUAD'); |
---|
81 | % % % FileName = [DirectoryName, FileName]; |
---|
82 | % % % end |
---|
83 | end |
---|
84 | |
---|
85 | Indexquad = family2atindex({'Q1','Q2','Q3','Q4','Q5','Q6','Q7','Q8','Q9','Q10'});% Index of quadrupoles |
---|
86 | Meffquad = zeros(160,160); |
---|
87 | DeviceNumber = 0; |
---|
88 | |
---|
89 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
90 | % mesure de beta comme sur la machine theorique |
---|
91 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
92 | |
---|
93 | % beta_tune = mesure_beta(QuadFam); |
---|
94 | % betatheorX = beta_tune(1,:); |
---|
95 | % betatheorZ = beta_tune(2,:); |
---|
96 | % DirStart = pwd; |
---|
97 | % DirectoryName = '/home/matlabML/measdata/Ringdata/QUAD/'; |
---|
98 | % [DirectoryName, DirectoryErrorFlag] = gotodirectory(DirectoryName); |
---|
99 | % try |
---|
100 | % Nomfichier = 'Sauvegarde_beta_theorique_0_2_0_3'; |
---|
101 | % save(Nomfichier,'betatheorX','betatheorZ'); |
---|
102 | % catch |
---|
103 | % cd(DirStart); |
---|
104 | % return |
---|
105 | % end |
---|
106 | % cd(DirStart); |
---|
107 | |
---|
108 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
109 | % mesure de la matrice d'effcicaité comme sur la machine |
---|
110 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
111 | |
---|
112 | for k1 = 1:length(QuadFam), |
---|
113 | numero_famille_en_cours = k1 % affichage ecran |
---|
114 | if ~isfamily(QuadFam{k1}) |
---|
115 | error('%s is not a valid Family \n', QuadFam{k1}); |
---|
116 | return; |
---|
117 | end |
---|
118 | DeviceList = family2dev(QuadFam{k1}); |
---|
119 | for k2 = 1:length(DeviceList), |
---|
120 | |
---|
121 | betaX0= [];betaZ0 = [];betaX1= [];betaZ1 = [];betaX2= [];betaZ2 = []; |
---|
122 | DeviceNumber = DeviceNumber + 1; |
---|
123 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% State before current change |
---|
124 | Ic = getam(QuadFam{k1}, DeviceList(k2,:)) ;% get the actual current |
---|
125 | %K0 = hw2physics(QuadFam{k1}, 'Setpoint', Ic, DeviceList(k2,:)); |
---|
126 | |
---|
127 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + deltaI |
---|
128 | DeltaI = getfamilydata(QuadFam{k1},'Setpoint','DeltaKBeta')*4; % Amp |
---|
129 | %fprintf('Current increment of %d A\n', DeltaI); |
---|
130 | stepsp(QuadFam{k1}, DeltaI, DeviceList(k2,:),'Model'); % Step value in Amps |
---|
131 | %Ic1 = getam(QuadFam{k1}, DeviceList(k2,:),'Model'); |
---|
132 | %K1 = hw2physics(QuadFam{k1}, 'Setpoint', Ic+DeltaI, DeviceList(k2,:)); |
---|
133 | |
---|
134 | % mesure de beta comme sur la machine delta I |
---|
135 | beta_tune = mesure_beta(QuadFam); |
---|
136 | betaX1 = beta_tune(1,:); |
---|
137 | betaZ1 = beta_tune(2,:); |
---|
138 | |
---|
139 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -2 *deltaI |
---|
140 | %fprintf('Current increment of %d A\n', -2*DeltaI); |
---|
141 | stepsp(QuadFam{k1}, -2*DeltaI, DeviceList(k2,:),'Model'); % |
---|
142 | |
---|
143 | % mesure de beta comme sur la machine -2delta I |
---|
144 | beta_tune = mesure_beta(QuadFam); |
---|
145 | betaX2 = beta_tune(1,:); |
---|
146 | betaZ2 = beta_tune(2,:); |
---|
147 | |
---|
148 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% go back to initial values |
---|
149 | %fprintf('Current increment of %d A\n', DeltaI); |
---|
150 | stepsp(QuadFam{k1}, DeltaI, DeviceList(k2,:),'Model'); % go back to initial values |
---|
151 | |
---|
152 | gettune('Model') % vérification que la machine est bien "revenue" |
---|
153 | |
---|
154 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
155 | MeffquadH(:,DeviceNumber) = (betaX2 - betaX1)'/(-2*DeltaI) ;% coefficient deltabeta / deltaI in each quad |
---|
156 | MeffquadV(:,DeviceNumber) = (betaZ2 - betaZ1)'/(-2*DeltaI) ; |
---|
157 | Meffquad = [MeffquadH ; MeffquadV]; |
---|
158 | %betaX1 |
---|
159 | %betaX2 |
---|
160 | %Meffquad(:,DeviceNumber) |
---|
161 | end |
---|
162 | disp('he oui') |
---|
163 | |
---|
164 | end |
---|
165 | |
---|
166 | if ArchiveFlag |
---|
167 | % enregistrement |
---|
168 | directory = '/home/matlabML/mml/machine/Soleil/StorageRing/quad/'; |
---|
169 | directory_actuelle = pwd; |
---|
170 | cd(directory) |
---|
171 | %Name = 'Meffquad_Qnoncoupe_4_3_H_V'; |
---|
172 | %Name = 'Meffquad_Qnoncoupe_2_3_H_V'; |
---|
173 | Name = 'Meffquad_beta_tune_2_3_H_V'; |
---|
174 | save(Name,'Meffquad','-mat'); |
---|
175 | cd(directory_actuelle); |
---|
176 | end |
---|
177 | |
---|
178 | if DisplayFlag |
---|
179 | Meffquad |
---|
180 | end |
---|
181 | disp('c''est fini') |
---|
182 | |
---|
183 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
184 | |
---|
185 | function beta_tune = mesure_beta(QuadFam) |
---|
186 | |
---|
187 | Indexquad = family2atindex({'Q1','Q2','Q3','Q4','Q5','Q6','Q7','Q8','Q9','Q10'});% Index of quadrupoles |
---|
188 | DeviceNumber = 0; |
---|
189 | beta_tune = [] ; % Initialisation des vecteurs betas X (premiÚre ligne) |
---|
190 | % et Z (deuxiÚme ligne) dans tous les quad (toutes les colonnes) |
---|
191 | |
---|
192 | for k1 = 1:length(QuadFam), |
---|
193 | |
---|
194 | if ~isfamily(QuadFam{k1}) |
---|
195 | error('%s is not a valid Family \n', QuadFam{k1}); |
---|
196 | return; |
---|
197 | end |
---|
198 | DeviceList = family2dev(QuadFam{k1}); |
---|
199 | |
---|
200 | % initialize data to zero |
---|
201 | tune1 = zeros(length(DeviceList),2); |
---|
202 | tune2 = zeros(length(DeviceList),2); |
---|
203 | dtune = zeros(length(DeviceList),2); |
---|
204 | beta = zeros(length(DeviceList),2); |
---|
205 | k3 = 0; |
---|
206 | |
---|
207 | for k2 = 1:length(DeviceList), |
---|
208 | |
---|
209 | k3 = k3 +1; |
---|
210 | betaX0= [];betaZ0 = [];betaX1= [];betaZ1 = [];betaX2= [];betaZ2 = []; |
---|
211 | DeviceNumber = DeviceNumber + 1; |
---|
212 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% State before current change |
---|
213 | Ic = getam(QuadFam{k1}, DeviceList(k2,:)) ;% get the actual current |
---|
214 | K = hw2physics(QuadFam{k1}, 'Setpoint', Ic, DeviceList(k2,:)) ;% Calcul du gradient nominal |
---|
215 | |
---|
216 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + deltaI |
---|
217 | DeltaI = getfamilydata(QuadFam{k1},'Setpoint','DeltaKBeta')*4; % Amp |
---|
218 | stepsp(QuadFam{k1}, DeltaI, DeviceList(k2,:),'Model'); % Step value in Amps |
---|
219 | tune1(k3,:) = gettune('Model'); % get new tunes |
---|
220 | |
---|
221 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -2 *deltaI |
---|
222 | stepsp(QuadFam{k1}, -2*DeltaI, DeviceList(k2,:),'Model'); % |
---|
223 | tune2(k3,:) = gettune('Model') ;% get new tunes |
---|
224 | |
---|
225 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% go back to initial values |
---|
226 | stepsp(QuadFam{k1}, DeltaI, DeviceList(k2,:),'Model'); % go back to initial values |
---|
227 | |
---|
228 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
229 | dtune(k3,:) = tune1(k3,:) - tune2(k3,:); |
---|
230 | Leff = getleff(QuadFam{k1}, DeviceList(k2,:)); % Get effective length |
---|
231 | DeltaKL = 2*DeltaI/Ic*K*Leff; |
---|
232 | beta(k3,:) = 4*pi*dtune(k3,:)./DeltaKL.*[1 -1] ; |
---|
233 | |
---|
234 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
235 | |
---|
236 | end |
---|
237 | beta0 = beta'; |
---|
238 | beta_tune = [beta_tune beta0]; % beta en ligne mesurés par la méthode des tunes |
---|
239 | |
---|
240 | end |
---|