1 | function quadalign(sx,sy); |
---|
2 | %locate quadrupoles in AO and apply random alignment |
---|
3 | %function quadalign(sx,sy); sx and sy are sigma values for randn; |
---|
4 | %units are meters |
---|
5 | if nargin<2 |
---|
6 | disp('Error in quadalign - must supply alignment spreads'); |
---|
7 | return |
---|
8 | end |
---|
9 | |
---|
10 | global THERING |
---|
11 | AO = getao; |
---|
12 | |
---|
13 | ATindx=[]; %indices of quadrupoles |
---|
14 | mx=[]; |
---|
15 | my=[]; |
---|
16 | len=findspos(THERING,length(THERING)+1); |
---|
17 | |
---|
18 | aofields=fieldnames(AO); |
---|
19 | for ii=1:length(aofields) |
---|
20 | if strcmpi(AO.(aofields{ii}).FamilyType,'quad') |
---|
21 | indx=AO.(aofields{ii}).AT.ATIndex; |
---|
22 | |
---|
23 | %assign random alignment error to first magnet |
---|
24 | mx=[mx; sx*randn]; |
---|
25 | my=[my; sy*randn]; |
---|
26 | |
---|
27 | % assign random error to rest of family |
---|
28 | tol=1e-6; %tolerance for spacing between magnets |
---|
29 | for jj=2:length(indx) |
---|
30 | |
---|
31 | %check for split magnets |
---|
32 | if AO.(aofields{ii}).Position(jj)-THERING{indx(jj)}.Length - AO.(aofields{ii}).Position(jj-1)<tol %magnet split |
---|
33 | disp([' Split magnet ' AO{ii}.FamilyName ' found in function quadalign with index ', num2str(indx(jj))]); |
---|
34 | mx=[mx; -mx(end)]; |
---|
35 | my=[my; -my(end)]; |
---|
36 | else %magnet not split |
---|
37 | mx=[mx; sx*randn]; |
---|
38 | my=[my; sy*randn]; |
---|
39 | end |
---|
40 | |
---|
41 | end |
---|
42 | |
---|
43 | %check if first/last element split in THERING |
---|
44 | if abs(AO.(aofields{ii}).Position(1)) < tol & ... %first element near zero |
---|
45 | abs((len - AO.(aofields{ii}).Position(end) - THERING{indx(end)}.Length < tol)) %last element near end |
---|
46 | disp([' Split magnet ' AO.(aofields{ii}).FamilyName ' found in function quadalign with index ',... |
---|
47 | num2str(indx(1)), ' ',num2str(indx(end))]); |
---|
48 | mx(end)=-mx(end-length(indx)+1); %error on last quad same as error on first quad in family |
---|
49 | my(end)=-my(end-length(indx)+1); |
---|
50 | end |
---|
51 | |
---|
52 | ATindx=[ATindx; indx]; |
---|
53 | end %end quad condition |
---|
54 | end %end loop over families |
---|
55 | |
---|
56 | % my=sy*randn(1,length(ATindx)); |
---|
57 | % mx=sx*randn(1,length(ATindx)); |
---|
58 | setshift(ATindx,mx,my); |
---|
59 | |
---|