source: MML/trunk/machine/SOLEIL/StorageRing/quad/getrespquad.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: 8.2 KB
Line 
1function 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%%%%%%%%%%%%%%%%%%%%%%%
22switch2sim
23%%%%%%%%%%%%%%%%%%%%%%%
24
25DisplayFlag = 1;
26ArchiveFlag = 0;
27% % % FileName = '';
28
29
30for 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
48end
49
50% Input parsing
51if isempty(varargin)
52    QuadFam = findmemberof('QUAD');
53elseif ischar(varargin{1}) 
54    QuadFam = {varargin{:}};
55else
56    QuadFam = varargin{:}
57end
58
59if 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   
83end
84
85Indexquad = family2atindex({'Q1','Q2','Q3','Q4','Q5','Q6','Q7','Q8','Q9','Q10'});% Index of quadrupoles
86Meffquad = zeros(160,160);
87DeviceNumber = 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
112for 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   
164end
165
166if 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);
176end
177
178if DisplayFlag
179    Meffquad
180end
181disp('c''est fini')
182
183%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
184
185function beta_tune = mesure_beta(QuadFam)
186
187Indexquad = family2atindex({'Q1','Q2','Q3','Q4','Q5','Q6','Q7','Q8','Q9','Q10'});% Index of quadrupoles
188DeviceNumber = 0;
189beta_tune = [] ; % Initialisation des vecteurs betas X (premiÚre ligne)
190                 % et Z (deuxiÚme ligne) dans tous les quad (toutes les colonnes)
191                 
192for 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   
240end
Note: See TracBrowser for help on using the repository browser.