forked from ThorstenHellert/SC
-
Notifications
You must be signed in to change notification settings - Fork 0
/
SCplotSupport.m
332 lines (288 loc) · 11.5 KB
/
SCplotSupport.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
function SCplotSupport(SC,varargin)
% SCplotSupport
% =============
%
% NAME
% ----
% SCplotSupport - Plots the offset and rolls of magnets, the support structure and BPMs
%
% SYNOPSIS
% --------
% `SCplotSupport(SC)`
%
%
% DESCRIPTION
% -----------
% This function plots the overall offsets [dx,dy,dz] and rolls [az,ax,ay] of all magnets and BPMs,
% as well as the individual contributions from different support structures (if registered).
% Please note that the apperance of the figure significanlty depends on the lattice (magnitude of
% errors or lattice size) and the used computer (screen size, Matlab version). The user might have
% to adjust plot apperance properties.
%
%
% INPUTS
% ------
% `SC`:: SC base structure
%
%
% OPTIONS
% -------
% The following options can be given as name/value-pairs:
%
% `'fontSize'` (12)::
% Figure font size.
% `'shiftAxes'` (0.03)::
% Axes are reanranged for grouping. Depending on screen resolution this value may be adjusted.
% `'xLim'` ([0 findspos(SC.RING,length(SC.RING)+1)])::
% Plot limits.
%
%
% SEE ALSO
% --------
% *SCregisterSupport*, *SCgetSupportOffset*, *SCgetSupportRoll*, *SCupdateSupport*
% Parse input
p = inputParser;
addOptional(p,'fontSize',12);
addOptional(p,'shiftAxes',0.03);
addOptional(p,'xLim',[0 findspos(SC.RING,length(SC.RING)+1)]);
parse(p,varargin{:});
par = p.Results;
% Check if magnets and BPMs are registered
if ~isfield(SC.ORD,'Magnet')
error('Magnets must be registered. Use ''SCregisterMagnets''.')
elseif ~isfield(SC.ORD,'BPM')
error('BPMs must be registered. Use ''SCregisterBPMs''.')
end
% Get s position and support structure offset and rolls with high resolution
C = findspos(SC.RING,length(SC.RING)+1);
s = linspace(par.xLim(1),par.xLim(2),100*diff(par.xLim));
sPos = findspos(SC.RING,1:length(SC.RING));
offSupportLine = SCgetSupportOffset(SC,s);
rollSupportLine = SCgetSupportRoll(SC,s);
% Magnet offsets and rolls
i=0;
for ord=SC.ORD.Magnet
if sPos(ord)>=par.xLim(1) && sPos(ord)<=par.xLim(2)
i=i+1;
% Magnets in range
magOrds(i) = ord;
% Support structure offset
offMagSupport(:,i)=SC.RING{ord}.SupportOffset;
% Support structure roll
rollMagSupport(:,i)=SC.RING{ord}.SupportRoll;
% Get individual magnet offset
offMagInd(:,i)=SC.RING{ord}.MagnetOffset;
% Get individual magnet roll
rollMagInd(:,i)=SC.RING{ord}.MagnetRoll;
% Get overall magnet offset
offMagTot(:,i)=SC.RING{ord}.T2([1 3 6]);
% Get overall magnet roll
rollMagTot(:,i)=SC.RING{ord}.MagnetRoll + SC.RING{ord}.SupportRoll;
end
end
% Loop over individual support structure types
for type = {'Section','Plinth','Girder'}
% Check if support structure is registered
if isfield(SC.ORD,type{1})
i=1;
for ordPair=SC.ORD.(type{1})
if (sPos(ordPair(1))>=par.xLim(1) && sPos(ordPair(1))<=par.xLim(2)) || (sPos(ordPair(2))>=par.xLim(1) && sPos(ordPair(2))<=par.xLim(2))
% Structures in range
SuppOrds.(type{1})(:,i) = ordPair;
% Get girder start and ending offsets
SuppOff.(type{1}).a(:,i)=SC.RING{ordPair(1)}.([type{1} 'Offset']);
SuppOff.(type{1}).b(:,i)=SC.RING{ordPair(2)}.([type{1} 'Offset']);
% Get girder rolls
SuppRoll.(type{1})(:,i)=SC.RING{ordPair(1)}.([type{1} 'Roll']);
i = i+1;
end
end
end
end
% Find BPMs within plotting range
i=0;
for ord=SC.ORD.BPM
if sPos(ord)>=par.xLim(1) && sPos(ord)<=par.xLim(2)
i=i+1;
% Magnets in range
BPMords(i) = ord;
end
end
% BPM offsets
sBPM = findspos(SC.RING,BPMords);
offBPM = cell2mat(atgetfieldvalues(SC.RING(BPMords),'Offset'));
offBPMStruct = cell2mat(atgetfieldvalues(SC.RING(BPMords),'SupportOffset'));
offBPM( :,3) = 0; % Longitudinal offsets not supported for BPMs
offBPMStruct(:,3) = 0; % Longitudinal offsets not supported for BPMs
% BPM rolls
rollBPM = atgetfieldvalues(SC.RING(BPMords),'Roll',{1,1});
rollBPMStruct = atgetfieldvalues(SC.RING(BPMords),'SupportRoll',{1,1});
rollBPM( :,2:3) = 0; % Pitch and yaw not supported for BPMs
rollBPMStruct(:,2:3) = 0; % Pitch and yaw not supported for BPMs
% Create figure
figure(1213);clf;tmpCol=get(gca, 'ColorOrder');ax=[];
yLabOffStr = {'$\Delta x$ [$\mu$m]','$\Delta y$ [$\mu$m]','$\Delta z$ [$\mu$m]'};
yLabRollStr = {'$a_z$ [$\mu$rad]','$a_x$ [$\mu$rad]','$a_y$ [$\mu$rad]'};
titlteOffStr = {'Horizontal Offsets','Vertical Offsets','Longitudinal Offsets'};
titlteRollStr = {'Roll (roll around z-axis)','Pitch (roll around x-axis)','Yaw (roll around y-axis)'};
lineSpec.Plinth = {'Color','r','LineWidth',4};
lineSpec.Section = {'Color',tmpCol(7,:),'LineWidth',2,'LineStyle',':'};
lineSpec.Girder = {'Color',tmpCol(5,:),'LineWidth',4};
% Loop over both transverse planes
for nDim=1:3
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Plot individual offset contributions
ax(3*(nDim-1)+1,1)=subplot(12,2,2*4*(nDim-1)+ [1 3]);hold on;
pVec=[];legStr=[];
% Plot line of support offset
stairs(s,1E6*offSupportLine(nDim,:));
% Plot support offset at magnets
plot(sPos(magOrds),1E6*offMagSupport(nDim,:),'D','Color',tmpCol(1,:));
% Fake plot for legend
pVec(end+1)=plot([-2 -1],[0 0],'-D','Color',tmpCol(1,:));legStr{end+1}='Overall support structure';
% Plot individual magnet offset
pVec(end+1)=plot(sPos(magOrds),1E6*offMagInd(nDim,:),'kx','MarkerSize',8);legStr{end+1}='Individual Magnet';
% Loop over support structure types
for type = {'Section','Plinth','Girder'}
% Check if support structure is registered and within range
if isfield(SuppOrds,type{1})
% Plot plinth offset
for i=1:size(SuppOrds.(type{1}),2)
% Check if support structure spans over injection point
if diff(findspos(SC.RING,SuppOrds.(type{1})(:,i)))<0
for nCase=1:2
if nCase==1
% Interpolate between last support structure and end of ring
splot = findspos(SC.RING,[SuppOrds.(type{1})(1,i) length(SC.RING)]);
sint = [findspos(SC.RING,SuppOrds.(type{1})(1,i)),findspos(SC.RING,SuppOrds.(type{1})(2,i))+C];
else
% Interpolate between beginning of ring and 1st support structure
splot = findspos(SC.RING,[1 SuppOrds.(type{1})(2,i)]);
sint = [-findspos(SC.RING,SuppOrds.(type{1})(2,i)),findspos(SC.RING,SuppOrds.(type{1})(2,i))];
end
offInt = interp1(sint,[SuppOff.(type{1}).a(nDim,i) SuppOff.(type{1}).b(nDim,i)],splot);
plot(splot,1E6*offInt,lineSpec.(type{1}){:})
end
else
plot(findspos(SC.RING,SuppOrds.(type{1})(:,i)),1E6*[SuppOff.(type{1}).a(nDim,i) SuppOff.(type{1}).b(nDim,i)],lineSpec.(type{1}){:})
end
end
% Fake plot for legend entry
pVec(end+1)=plot([-2 -1],[0 0],lineSpec.(type{1}){:});legStr{end+1}=sprintf('Individual %s',type{1});
end
end
% Legend and axis stuff
legend(pVec,legStr);
set(gca,'xlim',par.xLim,'box','on')
ylabel(yLabOffStr{nDim});
title(titlteOffStr{nDim})
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Plot overall magnet offset
ax(3*(nDim-1)+2,1)=subplot(12,2,2*4*(nDim-1)+ 5);
% Plot magnet offset
plot(sPos(magOrds),1E6*offMagTot(nDim,:),'kO-');
% Legend and axis stuff
legend('Overall magnet offset');
set(gca,'xlim',par.xLim,'box','on')
ylabel(yLabOffStr{nDim});
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Plot BPM offset
ax(3*(nDim-1)+3,1)=subplot(12,2,2*4*(nDim-1)+ 7);hold on
% Plot random BPM offset
plot(sBPM,1E6*offBPM(:,nDim),'O','Color',tmpCol(2,:),'MarkerSize',6);
% Plot BPM offset from support structure
plot(sBPM,1E6*offBPMStruct(:,nDim),'-','Color',tmpCol(2,:));
% Legend and axis stuff
legend({'Random BPM offset','BPM support offset'});
set(gca,'xlim',par.xLim,'box','on')
ylabel(yLabOffStr{nDim});
if nDim==3
xlabel('$s$ [m]')
end
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Plot individual roll contributions
ax(3*(nDim-1)+1,2)=subplot(12,2,2*4*(nDim-1)+ [2 4]);hold on;
pVec=[];legStr=[];
% Plot line of total support rolls
stairs(s,1E6*rollSupportLine(nDim,:),'Color',tmpCol(1,:));
% Plot total support rolls at magnets
plot(sPos(magOrds),1E6*rollMagSupport(nDim,:),'D','Color',tmpCol(1,:));
% Fake plot for legend
pVec(end+1)=plot([-2 -1],[0 0],'-D','Color',tmpCol(1,:));legStr{end+1}='Overall support structure';
% Plot magnet individual roll
pVec(end+1)=plot(sPos(magOrds),1E6*rollMagInd(nDim,:),'kx','MarkerSize',8);legStr{end+1}='Individual Magnet';
% Loop over support structure types
for type = {'Section','Plinth','Girder'}
% Check if support structure is registered
if isfield(SuppOrds,type{1})
% Plot plinth offset
for i=1:size(SuppOrds.(type{1}),2)
% Check if support structure spans over injection point
if diff(findspos(SC.RING,SuppOrds.(type{1})(:,i)))<0
for nCase=1:2
if nCase==1
% Interpolate between last support structure and end of ring
splot = findspos(SC.RING,[SuppOrds.(type{1})(1,i) length(SC.RING)]);
sint = [findspos(SC.RING,SuppOrds.(type{1})(1,i)),findspos(SC.RING,SuppOrds.(type{1})(2,i))+C];
else
% Interpolate between beginning of ring and 1st support structure
splot = findspos(SC.RING,[1 SuppOrds.(type{1})(2,i)]);
sint = [-findspos(SC.RING,SuppOrds.(type{1})(2,i)),findspos(SC.RING,SuppOrds.(type{1})(2,i))];
end
rollInt = interp1(sint,SuppRoll.(type{1})(nDim,i)*[1 1],splot);
plot(splot,1E6*rollInt,lineSpec.(type{1}){:})
end
else
plot(findspos(SC.RING,SuppOrds.(type{1})(:,i)),1E6*SuppRoll.(type{1})(nDim,i)*[1 1],lineSpec.(type{1}){:})
end
end
% Fake plot for legend entry
pVec(end+1)=plot([-2 -1],[0 0],lineSpec.(type{1}){:});legStr{end+1}=sprintf('Individual %s',type{1});
end
end
% Legend and axis stuff
legend(pVec,legStr);
set(gca,'xlim',par.xLim,'box','on','YAxisLocation','right')%,'XTickLabel',''
ylabel(yLabRollStr{nDim});
title(titlteRollStr{nDim})
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Plot overall magnet roll
ax(3*(nDim-1)+2,2)=subplot(12,2,2*4*(nDim-1)+ 6);hold on
% Plot magnet roll
plot(sPos(magOrds),1E6*rollMagTot(nDim,:),'kO-');
% Legend and axis stuff
legend('Overall magnet roll');
set(gca,'xlim',par.xLim,'box','on','YAxisLocation','right')%,'XTickLabel',''
ylabel(yLabRollStr{nDim});
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Plot BPM Roll
ax(3*(nDim-1)+3,2)=subplot(12,2,2*4*(nDim-1)+ 8);hold on
% Plot random BPM roll
plot(sBPM,1E6*rollBPM(:,nDim),'O','Color',tmpCol(2,:),'MarkerSize',6);
% Plot BPM roll from support structure
plot(sBPM,1E6*rollBPMStruct(:,nDim),'-','Color',tmpCol(2,:));
% Legend and axis stuff
legend({'Random BPM roll','BPM support roll'});
set(gca,'xlim',par.xLim,'box','on','YAxisLocation','right')
ylabel(yLabRollStr{nDim});
if nDim==3
xlabel('$s$ [m]')
end
end
% Link x-axis
linkaxes(ax,'x');
% Rearrange plots (not sure if it works on your screen resolution)
for nDim=1:3
for nAx=1:3
for n=1:2
set(ax(nAx+3*(nDim-1),n),'Position',get(ax(nAx+3*(nDim-1),n),'Position') - ((nDim-1)-0.4*(nAx-1))*[0 par.shiftAxes 0 0])
end
end
end
% Make nice
set(findall(gcf,'-property','TickLabelInterpreter'),'TickLabelInterpreter','latex');
set(findall(gcf,'-property','Interpreter'),'Interpreter','latex');
set(findall(gcf,'-property','FontSize'),'FontSize',par.fontSize);
set(gcf,'color','w');
drawnow
end