Files
dev/script/emit_meas_phase4p.m
2018-01-19 10:56:53 +01:00

1127 lines
39 KiB
Matlab
Executable File

function varargout = emit_meas_phase4p(varargin)
% EMIT_MEAS_PHASE4 M-file for emit_meas_phase4.fig
% EMIT_MEAS_PHASE4, by itself, creates a new EMIT_MEAS_PHASE4 or raises the existing
% singleton*.
%
% H = EMIT_MEAS_PHASE4 returns the handle to a new EMIT_MEAS_PHASE4 or the handle to
% the existing singleton*.
%
% EMIT_MEAS_PHASE4('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in EMIT_MEAS_PHASE4.M with the given input arguments.
%
% EMIT_MEAS_PHASE4('Property','Value',...) creates a new EMIT_MEAS_PHASE4 or raises the
% existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before emit_meas_phase4_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property application
% stop. All inputs are passed to emit_meas_phase4_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help emit_meas_phase4
% Last Modified by GUIDE v2.5 15-Jan-2014 11:43:41
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @emit_meas_phase4_OpeningFcn, ...
'gui_OutputFcn', @emit_meas_phase4_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Executes just before emit_meas_phase4 is made visible.
function emit_meas_phase4_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to emit_meas_phase4 (see VARARGIN)
% Choose default command line output for emit_meas_phase4
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% UIWAIT makes emit_meas_phase4 wait for user response (see UIRESUME)
% uiwait(handles.emit_meas);
% --- Outputs from this function are returned to the command line.
function varargout = emit_meas_phase4_OutputFcn(hObject, eventdata, handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure
varargout{1} = handles.output;
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global LOCATION SYSTEM APPNAME DAQFILENAME energy nmeas coupling nslices meas_type
global phase0 phase_steps phase_dif phase_range
global bunch_l bunch_l_err cal cal_error oper right_q
global PROFILEMONITOR K_STEPS
global background screen
global TDC_cal
freq = 2997.912e6; %frequency of TDC
if meas_type==1 % projected multi quad
quad_names = {'F10D1_MQUA35','F10D1_MQUA45','F10D1_MQUA55'}; % EPICs names
elseif meas_type==0 % projected single quad
quad_names = {'F10D1_MQUA55'}; % EPICs name
elseif meas_type==2 % slice in x using the TDC
quad_names = {'F10D1_MQUA35','F10D1_MQUA40','F10D1_MQUA45','F10D1_MQUA50','F10D1_MQUA55'}; % EPICs names
elseif meas_type==3 %slice in y using dispersion
quad_names = {'F10D1_MQUA10','F10D1_MQUA20','F10D1_MQUA30','F10D1_MQUA40','F10D1_MQUA50'}; % EPICs names
elseif meas_type==4 % slice in x using dispersion
quad_names = {'F10D1_MQUA35','F10D1_MQUA40','F10D1_MQUA45','F10D1_MQUA50','F10D1_MQUA55'}; % EPICs names
end
screen = PROFILEMONITOR;
% set proper values for quadrupoles
if right_q==0
% measurement kl-values for the 10 quads between BC and FODO
if meas_type==4
kld(1) = 4.525199912180098*0.15; %F10D1.MQUA10
kld(2) = 3.874148656932072*0.15; %F10D1.MQUA20
kld(3) = -3.249774821515966*0.15; %F10D1.MQUA30
kld(4) = -4.797555982557675*0.15; %F10D1.MQUA40
kld(5) = 3.615370265142409*0.15; %F10D1.MQUA50
kld(6) = 0; %F10D1.MQUA60
kld(7) = 0; %F10D1.MQUA70
kld(8) = 0; %F10D1.MQUA80
kld(9) = 0; %F10D1.MQUA90
kld(10) = 0; %F10D1.MQUA100
else
kld(1) = 1.335685250670285*0.15; %F10D1.MQUA10
kld(2) = 5.211233759043508e-001*0.15; %F10D1.MQUA20
kld(3) = -3.108334644187179e-001*0.15; %F10D1.MQUA30
kld(4) = 0; %F10D1.MQUA40
kld(5) = -9.113260060549501e-001*0.15; %F10D1.MQUA50
kld(6) = -2.190291790302469*0.15; %F10D1.MQUA60
kld(7) = 0.3966673632905451*0.15; %F10D1.MQUA70
kld(8) = 2.731046534825306*0.15; %F10D1.MQUA80
kld(9) = -0.5417341705156887*0.15; %F10D1.MQUA90
kld(10) = 0; %F10D1.MQUA100
end
qnames0 = {'F10D1-MQUA10','F10D1-MQUA15','F10D1-MQUA20','F10D1-MQUA25','F10D1-MQUA30',...
'F10D1-MQUA35','F10D1-MQUA40','F10D1-MQUA45','F10D1-MQUA50','F10D1-MQUA55','F10D1-MQUA60','F10D1-MQUA65',...
'F10D1-MQUA70','F10D1-MQUA80','F10D1-MQUA85','F10D1-MQUA90','F10D1-MQUA95'};
% I exclude the quads upstream the TDC, since sometimes are used to match the beam
exc5 = 0;
if exc5
qnames0 = qnames0(6:12);
kld = kld(6:10);
end
for i=1:length(kld)
Id(i)=KLquad2Curr(kld(i),energy);
end
% since the safe-set button is less reliable than the mood of my
% girlfriend, I will first cycle all quads, and then set the current
% delay the gun before cycling
SetPV('FINSS-RLLE-RIOC:RF-ENABLE',2)
BeamOnOff(0); % close the shutter before cycling
for i=1:length(qnames0)
ch=[qnames0{i} ':B-CYC'];
SetPV(ch,0)
SetPV(ch,1)
end
pause(20); % wait 20 seconds until cycling is done (15s should be fine)
BeamOnOff; % restore the previous state
if (meas_type==1)||(meas_type==2)||(meas_type==4)
%set design optics for the 5 quads between BC and TDC
if ~exc5
for i=1:5
ch=[qnames0{i} ':I-SET'];
%ch=[qnames0{i} ':SEQ-ISET'];
ch = regexprep(ch, '\.', '-');
SetPV(ch, Id(i))
end
end
elseif meas_type==0
%set design for the 10 quads
if ~exc5
for i=1:10
ch=[qnames0{i} ':I-SET'];
SetPV(ch,Id(i))
end
else
for i=1:5
ch=[qnames0{i} ':I-SET'];
SetPV(ch,Id(i))
end
end
end
% put the gun at the right timing again
SetPV('FINSS-RLLE-RIOC:RF-ENABLE',1)
end
%knob definition ---------------------------------------------------------
knob = LoadKnobDefinition('PhaseAdvanceScanXYquads103050screen10');
switch screen
case {'F10D1_DSCR75_CCAM1', 'F10D1_DSCR75_CCAM2'}
Ldx = 0; % additional drift as compared to the pre-calculated files
Ld = 10.831-0.15; % drift between the used quad and the screen
case 'F10D1_DSCR80_CCAM1'
Ldx = 0.386;
Ld = 11.217-0.15;
otherwise
error('unknown screen')
end
if meas_type==1 % projected multi quad
load proj_emitx_20110905.mat
k0 = k;
load proj_emity_20110905.mat
kini = [[k0];[k]];
elseif meas_type==0 % projected single quad
Lq = 0.15;
beta_x = 15;
%beta_y = 15;
%alpha_x = 1.38490;
%alpha_y = 1.38490;
mu = [15:5:165];
k0 = ((1 - (Ld./(sind(mu).*beta_x)) .* (cosd(mu)+beta_x.*sind(mu)/Ld)) / Ld)/Lq;
kini = k0';
quads = {'F10D1.MQUA100'};
elseif meas_type==2 % slice in x using the TDC
load slice_emit_20110905.mat
kini = k;
elseif meas_type==3 % slice in y using dispersion
%load slice_emit_20121218.mat % this was for optics in phase3
load slice_emit_20130515.mat % this is for optics in phase 4
kini = k;
elseif meas_type==4
load slice_emit_20130430.mat
kini = k;
end
k = kini([1:K_STEPS:length(kini)],:);
if meas_type==0
k=k';
end
Lm = 0.15;
% prepare Knobs for daq.m
for i=1:length(quads)
temp = size(k);
if (meas_type==1)||(meas_type==2)||(meas_type==3)||(meas_type==4)
for j=1:length(k(:,1))
I(j,i) = KLquad2Curr(k(j,i)*Lm,energy);
end
knob.Conversions{i} = [[1:1:temp(1)]',[I(:,i)]];
knob.SetpointValues = 1:temp(1);
elseif meas_type==0
for j=1:length(k)
I(j,i) = KLquad2Curr(k(j)*Lm,energy);
end
knob.Conversions{i} = [[1:1:length(k)]',[I(:)]];
knob.SetpointValues = [1:1:length(k)];
end
knob.Knobs{i}=LoadKnobDefinition(quad_names{i});
if meas_type==0
knob.Knobs(3) = [];
knob.Knobs(2) = [];
knob.Conversions(3) = [];
knob.Conversions(2) = [];
end
end
% define knobs for slice emittance measurement (add TDC phase and more)
if meas_type==2
if TDC_cal
temp = knob.Conversions;
ind_p = length(quad_names) + 1;
knob.Knobs{ind_p}.Name = 'F10D1_RLLE_RUPC_PHASE';
knob.Knobs{ind_p}.Description = 'Phase from Transverse Deflector F10D1';
knob.Knobs{ind_p}.Author = 'Eduard Prat';
knob.Knobs{ind_p}.SetpointAddress = 'F10D1-RLLE-RUPC:PHASE';
knob.Knobs{ind_p}.HowToDetermineSuccess = 'SetAndForget';
knob.Knobs{ind_p}.WaitTime = 0.2;
knob.Knobs{ind_p}.ReadbackAddress = 'F10D1-RLLE-RUPC:PHASE';
knob.Knobs{ind_p}.Max = 360;
knob.Knobs{ind_p}.Min = -360;
phase_range = [(phase0-phase_steps*phase_dif):phase_dif:(phase0+phase_steps*phase_dif)];
for i=1:length(quads)
for m=1:size(k,1)
for j=1:length(phase_range)
ind0 = length(phase_range)*(m-1)+j;
temp2 = temp{i}(m,2);
knob.Conversions{i}(ind0,2) = temp2;
knob.Conversions{i}(ind0,1) = ind0;
% values for the phase
knob.Conversions{length(quads)+1}(ind0,1) = ind0;
knob.Conversions{length(quads)+1}(ind0,2) = phase_range(j);
knob.SetpointValues(ind0) = ind0;
end
end
end
end
end
% instrument definition --------------------------------------------------
instrument = LoadInstrumentDefinition(screen);
if (meas_type == 2)||(meas_type)==0 ||(meas_type==3)||(meas_type==4)
coupling = 0;
end
instrument.Actions = [];
N=0;
instrument.Actions{N+1}.Function = 'StartServer';
instrument.Actions{N+1}.Active = 0; % not required for DSCR80
instrument.Actions{N+1}.Parameters = [];
N=N+1;
instrument.Actions{N+1}.Function = 'StoreCameraData';
instrument.Actions{N+1}.Active = 1;
instrument.Actions{N+1}.Parameters = [];
if background == 1
N=N+1;
instrument.Actions{N+1}.Function = 'MultipleBackgroundImages';
instrument.Actions{N+1}.Active = 0;
instrument.Actions{N+1}.Parameters.NumberBackgroundImages = 5;
instrument.Actions{N+1}.Parameters.StoreBackgroundImages = 1;
N=N+1;
instrument.Actions{N+1}.Function = 'SubtractBackgroundImage';
instrument.Actions{N+1}.Active = 1;
instrument.Actions{N+1}.Parameters.NumberBackgroundImages = 10;
instrument.Actions{N+1}.Parameters.StoreBackgroundImages = 1;
elseif background == 2
N=N+1;
instrument.Actions{N+1}.Function = 'MultipleBackgroundImages';
instrument.Actions{N+1}.Active = 1;
instrument.Actions{N+1}.Parameters.NumberBackgroundImages = 5;
instrument.Actions{N+1}.Parameters.StoreBackgroundImages = 1;
N=N+1;
instrument.Actions{N+1}.Function = 'SubtractBackgroundImage';
instrument.Actions{N+1}.Active = 0;
instrument.Actions{N+1}.Parameters.NumberBackgroundImages = 10;
instrument.Actions{N+1}.Parameters.StoreBackgroundImages = 1;
end
N=N+1;
instrument.Actions{N+1}.Function = 'SubtractOffset';
instrument.Actions{N+1}.Active = 0;
instrument.Actions{N+1}.Parameters = [];
N=N+1;
instrument.Actions{N+1}.Function = 'GaussFit';
instrument.Actions{N+1}.Active = 1;
if coupling
instrument.Actions{N+1}.Parameters.AdaptiveROI = 1;
instrument.Actions{N+1}.Parameters.AllowOffset = 0;
else
instrument.Actions{N+1}.Parameters = [];
end
if coupling
N=N+1;
instrument.Actions{N+1}.Function = 'NoiseCut';
instrument.Actions{N+1}.Active = 1;
instrument.Actions{N+1}.Parameters.Threshold = 0.2;
N=N+1;
instrument.Actions{N+1}.Function = 'xy_slope';
instrument.Actions{N+1}.Active = 1;
instrument.Actions{N+1}.Parameters = [];
end
%info --------------------------------------------------------------------
if oper
Info.OperatorPresent = 1;
else
Info.OperatorPresent = 0;
end
Info.Author = APPNAME;
Info.Title = 'Multiknob Emittance Measurement';
Info.eLog = Localize('eLog',LOCATION);
Info.Text = [];
Info.StartTime = now;
%set up ------------------------------------------------------------------
Setup.Function = 'scan';
Setup.Repeat = nmeas;
Setup.SaveSR = 1;
% load transfer matrices to put them in Setup
if meas_type==1
load mat_f10d165_quad6080100.mat
elseif meas_type==2
load mat_slice_phase3.mat
elseif meas_type==3
%load mat_slicey_phase3.mat % this is for phase 3 optics
load mat_slicey_phase4.mat % this is for phase 4 optics
R11=R33;
R12=R34;
R22=R44;
R21=R43;
elseif meas_type==4
load mat_slicex_phase3.mat
end
% add an additional drift (this depends on the screen; see the definition of Ldx above)
if meas_type==1 || meas_type==2 || meas_type==3 || meas_type==4
Mdx = Drift(Ldx); % additional drift between DSCR75 and DSCR80
for i=1:length(kini)
M0 = [R11(i) R12(i) 0 0; R21(i) R22(i) 0 0; 0 0 R33(i) R34(i); 0 0 R43(i) R44(i)];
M = Mdx * M0;
R11(i) = M(1,1);
R12(i) = M(1,2);
R21(i) = M(2,1);
R22(i) = M(2,2);
R33(i) = M(3,3);
R34(i) = M(3,4);
R43(i) = M(4,3);
R44(i) = M(4,4);
end
elseif meas_type==0 %in this case I calculate the matrices directly here
phi10 = Lq*sqrt(abs(kini));
Md1 = [[1 Ld 0 0 0 0];[0 1 0 0 0 0];[0 0 1 Ld 0 0];[0 0 0 1 0 0];[0 0 0 0 1 0];[0 0 0 0 0 1]];
for i=1:length(kini)
if kini(i)<0
Mq10 = [[cosh(phi10(i)) sinh(phi10(i))/sqrt(abs(kini(i))) 0 0 0 0]; [sqrt(abs(kini(i)))*sinh(phi10(i)) cosh(phi10(i)) 0 0 0 0];[0 0 cos(phi10(i)) sin(phi10(i))/sqrt(abs(kini(i))) 0 0];[0 0 -sin(phi10(i))*sqrt(abs(kini(i))) cos(phi10(i)) 0 0];[0 0 0 0 1 0];[0 0 0 0 0 1]];
elseif kini(i)==0
Mq10 = [[1 Lq 0 0 0 0];[0 1 0 0 0 0];[0 0 1 Lq 0 0];[0 0 0 1 0 0];[0 0 0 0 1 0];[0 0 0 0 0 1]];
else
Mq10 = [[cos(phi10(i)) sin(phi10(i))/sqrt(abs(kini(i))) 0 0 0 0];[-sin(phi10(i))*sqrt(abs(kini(i))) cos(phi10(i)) 0 0 0 0];[0 0 cosh(phi10(i)) sinh(phi10(i))/sqrt(abs(kini(i))) 0 0]; [0 0 sqrt(abs(kini(i)))*sinh(phi10(i)) cosh(phi10(i)) 0 0];[0 0 0 0 1 0];[0 0 0 0 0 1]];
end
M=Md1*Mq10;
R11(i) = M(1,1);
R12(i) = M(1,2);
R21(i) = M(2,1);
R22(i) = M(2,2);
R33(i) = M(3,3);
R34(i) = M(3,4);
R43(i) = M(4,3);
R44(i) = M(4,4);
end
end
R11 = R11([1:K_STEPS:length(kini)]);
R12 = R12([1:K_STEPS:length(kini)]);
R21 = R21([1:K_STEPS:length(kini)]);
R22 = R22([1:K_STEPS:length(kini)]);
R33 = R33([1:K_STEPS:length(kini)]);
R34 = R34([1:K_STEPS:length(kini)]);
R43 = R43([1:K_STEPS:length(kini)]);
R44 = R44([1:K_STEPS:length(kini)]);
Setup.AnalyzeTripleQuadScan.R = {R11, R12, 0, 0; R21, R22, 0, 0; 0, 0, R33, R34; 0, 0, R43, R44};
Setup.AnalyzeTripleQuadScan.k = k;
Setup.AnalyzeTripleQuadScan.energy = energy;
%design optical functions and emittance (entrance of F10D1.MQUA60)
if meas_type==0
Setup.AnalyzeTripleQuadScan.beta_x0 = 15*1;
Setup.AnalyzeTripleQuadScan.beta_y0 = 15*1;
Setup.AnalyzeTripleQuadScan.alpha_x0 = 1.3849*1;
Setup.AnalyzeTripleQuadScan.alpha_y0 = 1.3849*1;
elseif (meas_type==1)||(meas_type==2)
Setup.AnalyzeTripleQuadScan.beta_x0 = 9.4801;
Setup.AnalyzeTripleQuadScan.beta_y0 = 40.0155;
Setup.AnalyzeTripleQuadScan.alpha_x0 = -1.0220;
Setup.AnalyzeTripleQuadScan.alpha_y0 = -0.0207;
elseif meas_type==3 % entrance of quad10
Setup.AnalyzeTripleQuadScan.beta_y0 = 8.5084;
Setup.AnalyzeTripleQuadScan.beta_x0 = 19.2849;
Setup.AnalyzeTripleQuadScan.alpha_y0 = -1.4147;
Setup.AnalyzeTripleQuadScan.alpha_x0 = 0.6847;
elseif meas_type==4
Setup.AnalyzeTripleQuadScan.beta_x0 = 31.4326;
Setup.AnalyzeTripleQuadScan.beta_y0 = 17.12275;
Setup.AnalyzeTripleQuadScan.alpha_x0 = -9.497579;
Setup.AnalyzeTripleQuadScan.alpha_y0 = 6.811337;
end
Setup.AnalyzeTripleQuadScan.gamma_x0 = (1+Setup.AnalyzeTripleQuadScan.alpha_x0^2)/Setup.AnalyzeTripleQuadScan.beta_x0;
Setup.AnalyzeTripleQuadScan.gamma_y0 = (1+Setup.AnalyzeTripleQuadScan.alpha_y0^2)/Setup.AnalyzeTripleQuadScan.beta_y0;
% data acquisition -------------------------------------------------------
[DAQFileName, Setup, knob, instrument, Info] = daq(Setup,{knob},{instrument},Info);
%[Setup, Info, knob, instrument] = RetrieveData('/afs/psi.ch/intranet/FIN/Data/FIN250-Phase4+/2014-10-08/MKE20141008T132836.h5');
% put the quadrupole back to zero in the single quad scan
if meas_type==0
SetPV('F10D1-MQUA55:I-SET.VAL',0)
end
% get TDC calibration and other longitudinal parameters for the different
% quad configurations
clear bunch_l bunch_l_err
if meas_type==2
if TDC_cal
indg = find(abs(phase_range-phase0)<0.001);
% first get all vertical centroids and beam sizes
for i=1:length(phase_range)*size(k,1)
% all values are in mm
rms_y0(i) = mean(instrument{1}.BeamSizeGaussfit(2,:,i));
rms_err_y0(i) = sqrt(var(instrument{1}.BeamSizeGaussfit(2,:,i)));
y0(i) = mean(instrument{1}.BeamPositionGaussfit(2,:,i));
y_err0(i) = sqrt(var(instrument{1}.BeamPositionGaussfit(2,:,i)));
end
rms_y = reshape(rms_y0,length(phase_range),size(k,1))';
rms_err_y = reshape(rms_err_y0,length(phase_range),size(k,1))';
y = reshape(y0,length(phase_range),size(k,1))';
y_err = reshape(y_err0,length(phase_range),size(k,1))';
for i=1:size(k,1)
y2 = y(i,:);
y_err2 = y_err(i,:);
if nmeas>1
[p,s] = polyfit3(phase_range,y2,1,[],1./y_err2); % linear fit weighthing with measurement errors
elseif nmeas==1
[p,s] = polyfit(phase_range,y2,1);
end
%y_pred = polyval(p,phase_range);
% error of the fit
ste = sqrt(diag(inv(s.R)*inv(s.R')).*s.normr.^2./s.df);
% calibration in mm per ps
cal(i) = p(1)*360*freq/1e12;
% calibration error
cal_err(i) = ste(1)*360*freq/1e12;
% bunch length (in ps)
bunch_l(i,:) = abs(rms_y(i,:)/cal(i));
% bunch length error (assuming no correlation between calibration error and vertical beam size measurement error)
bunch_l_err(i,:) = bunch_l(i,:) .* ( (cal_err(i)/cal(i))^2 + (rms_err_y(i,:)./rms_y(i,:)).^2 ) .^ 0.5;
% slice separation for the analysis
y_sep0(i,:) = rms_y(i,:) / nslices;
for j=1:length(phase_range)
% determine valid measurements (no significant bunch length variation from zero phase)
if (bunch_l(i,indg) < (bunch_l(i,j)+bunch_l_err(i,j)))
if (bunch_l(i,indg) > (bunch_l(i,j)-bunch_l_err(i,j)))
indb0(i,j) = i;
else
indb0(i,j) = 0;
end
else
indb0(i,j) = 0;
end
end
%ysep1(i) = mean(y_sep0(~(indb0(i,:)==0)));
end
% slice image analysis
input.ind = reshape(indb0',length(phase_range)*size(k,1),1);
input.y_sep = reshape(y_sep0',1,length(phase_range)*size(k,1))';
input.cur_cut = 0.3;
%
[output] = Slicer(instrument,input);
instrument{1}.input = input;
output.y_sep = mean(mean(bunch_l))/nslices;
instrument{1}.slice = output;
instrument{1}.ind_val = input.ind;
else
for i=1:size(k,1)
% all values are in mm
rms_y0(i) = mean(instrument{1}.BeamSizeGaussfit(2,:,i));
rms_err_y0(i) = sqrt(var(instrument{1}.BeamSizeGaussfit(2,:,i)));
y0(i) = mean(instrument{1}.BeamPositionGaussfit(2,:,i));
y_err0(i) = sqrt(var(instrument{1}.BeamPositionGaussfit(2,:,i)));
end
rms_y = reshape(rms_y0,1,size(k,1))';
rms_err_y = reshape(rms_err_y0,1,size(k,1))';
y = reshape(y0,1,size(k,1))';
y_err = reshape(y_err0,1,size(k,1))';
% slice image analysis
input.y_sep = reshape(rms_y' / nslices,1,size(k,1))';
input.yflip = 0;
[output] = Slicer(instrument,input);
instrument{1}.input = input;
instrument{1}.slice = output;
end
end
if meas_type==3
% first get all horizontal centroids and beam sizes
for i=1:size(k,1)
% all values are in mm
rms_x0(i) = mean(instrument{1}.BeamSizeGaussfit(1,:,i));
rms_err_x0(i) = sqrt(var(instrument{1}.BeamSizeGaussfit(1,:,i)));
x0(i) = mean(instrument{1}.BeamPositionGaussfit(1,:,i));
x_err0(i) = sqrt(var(instrument{1}.BeamPositionGaussfit(1,:,i)));
end
rms_x = reshape(rms_x0,1,size(k,1))';
rms_err_x = reshape(rms_err_x0,1,size(k,1))';
x = reshape(x0,1,size(k,1))';
x_err = reshape(x_err0,1,size(k,1))';
% slice image analysis
input.y_sep = reshape(rms_x' / nslices,1,size(k,1))';
input.yflip = 1;
[output] = Slicer(instrument,input);
instrument{1}.input = input;
instrument{1}.slice = output;
end
if meas_type==4
% first get all horizontal centroids and beam sizes
for i=1:size(k,1)
% all values are in mm
rms_y0(i) = mean(instrument{1}.BeamSizeGaussfit(2,:,i));
rms_err_y0(i) = sqrt(var(instrument{1}.BeamSizeGaussfit(2,:,i)));
y0(i) = mean(instrument{1}.BeamPositionGaussfit(2,:,i));
y_err0(i) = sqrt(var(instrument{1}.BeamPositionGaussfit(2,:,i)));
end
rms_y = reshape(rms_y0,1,size(k,1))';
rms_err_y = reshape(rms_err_y0,1,size(k,1))';
y = reshape(y0,1,size(k,1))';
y_err = reshape(y_err0,1,size(k,1))';
% slice image analysis
input.y_sep = reshape(rms_y' / nslices,1,size(k,1))';
input.yflip = 0;
[output] = Slicer(instrument,input);
instrument{1}.input = input;
instrument{1}.slice = output;
end
%-------------------------------------------------------------------------
% calculation of emittance and optics
%save workspace
if (meas_type==1)||(meas_type==0)
[ResultStructure, figh, analfile] ...
= AnalyzeTripleQuadScanCoupling(Setup, knob, instrument, Info)
elseif meas_type==2 || meas_type==3 || meas_type==4
[ResultStructure, figh, analfile] ...
= AnalyzeTripleQuadScanCouplingSliceEnergy(Setup, knob, instrument, Info)
end
% make entry in the logbook
eLog = Localize('eLog',LOCATION);
MakeLogbookEntry(eLog,'Multiknob Emittance Measurement','','Nice operator',DAQFileName,analfile,figh)
%set(handles.pushbutton2,'Enable','on')
function edit1_Callback(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit1 as text
% str2double(get(hObject,'String')) returns contents of edit1 as a double
global energy
energy = str2double(get(hObject,'String'));
% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
global energy
set(hObject,'String',energy)
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes during object creation, after setting all properties.
function emit_meas_CreateFcn(hObject, eventdata, handles)
% hObject handle to emit_meas (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
%addpath /afs/psi.ch/intranet/FIN/Applications/Development/Eduard/MatchingTool/trunk
% set useful defaults
global LOCATION SYSTEM APPNAME DAQFILENAME energy nmeas coupling
global meas_type nslices phase0 phase_dif phase_steps oper right_q
global PROFILEMONITOR K_STEPS
global background en_chirp
global TDC_cal
TDC_cal = 1;
energy = 220; % energy in MeV -- if this is changed, change also the GUI default string
en_chirp = 0; % energgy chirp along the bunch in %
nmeas = 10; %number of measurements per measurement point
coupling = 0; %include coupling?
meas_type = 0; % 1 is projected measurement with triple quads scan, 0 is projected with single quad, 2 is slice
nslices = 5; % number of slices for slice emittance measurement
oper=0; %operator present
right_q = 1; %right initial values for quads?
K_STEPS = 2; % skip every other setpoint
background = 1; % 1 is single background subtraction, 2 is multiple
SetPath
LOCATION= 'wlha';
SYSTEM = 'epics';
APPNAME = 'Multiknob emittance measurement';
DAQFILENAME = 'MKE';
% phase control parameters (for TDC calibration measurements)
phase0 = GetPV('F10D1-RLLE-RUPC:PHASE');
phase_dif = 1;
phase_steps = 1;
PROFILEMONITOR = 'F10D1_DSCR80_CCAM1';
function edit2_Callback(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global nmeas
nmeas = str2double(get(hObject,'String'));
% --- Executes during object creation, after setting all properties.
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
global nmeas
set(hObject,'String',nmeas)
% --- Executes on button press in check_coupling.
function check_coupling_Callback(hObject, eventdata, handles)
% hObject handle to check_coupling (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global coupling
if get(hObject,'Value')
coupling =1;
else
coupling=0;
end
% Hint: get(hObject,'Value') returns toggle state of check_coupling
% --- Executes during object creation, after setting all properties.
function check_coupling_CreateFcn(hObject, eventdata, handles)
global coupling all_objects meas_type
all_objects.coupling = hObject;
if coupling
set(hObject,'Value',1)
else
set(hObject,'Value',0)
end
if (meas_type==0)||(meas_type==2)
set(hObject,'Enable','off')
else
set(hObject,'Enable','on')
end
% hObject handle to check_coupling (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
matching_phase4p
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
function edit3_Callback(hObject, eventdata, handles)
global nslices
nslices = str2double(get(hObject,'String'));
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit3 as text
% str2double(get(hObject,'String')) returns contents of edit3 as a double
% --- Executes during object creation, after setting all properties.
function edit3_CreateFcn(hObject, eventdata, handles)
global nslices all_objects
set(hObject,'String',nslices)
all_objects.nslices = hObject;
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit4_Callback(hObject, eventdata, handles)
global phase_steps
phase_steps = str2double(get(hObject,'String'));
% hObject handle to edit4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit4 as text
% str2double(get(hObject,'String')) returns contents of edit4 as a double
% --- Executes during object creation, after setting all properties.
function edit4_CreateFcn(hObject, eventdata, handles)
global phase_steps all_objects
set(hObject,'String',phase_steps)
all_objects.phase_steps = hObject;
% hObject handle to edit4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit5_Callback(hObject, eventdata, handles)
global phase_dif
phase_dif = str2double(get(hObject,'String'));
% hObject handle to edit5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit5 as text
% str2double(get(hObject,'String')) returns contents of edit5 as a double
% --- Executes during object creation, after setting all properties.
function edit5_CreateFcn(hObject, eventdata, handles)
global phase_dif all_objects
set(hObject,'String',phase_dif)
all_objects.phase_dif = hObject;
% hObject handle to edit5 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function edit6_Callback(hObject, eventdata, handles)
global phase0
phase0 = str2double(get(hObject,'String'));
% hObject handle to edit6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit6 as text
% str2double(get(hObject,'String')) returns contents of edit6 as a double
% --- Executes during object creation, after setting all properties.
function edit6_CreateFcn(hObject, eventdata, handles)
global phase0 all_objects
set(hObject,'String',phase0)
all_objects.phase0 = hObject;
% hObject handle to edit6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes during object creation, after setting all properties.
function pushbutton2_CreateFcn(hObject, eventdata, handles)
global all_objects
all_objects.matching = hObject;
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% --- Executes when selected object is changed in uipanel4.
function uipanel4_SelectionChangeFcn(hObject, eventdata, handles)
global meas_type
if strcmp(get(hObject,'String'),'Projected multi quad')
meas_type = 1;
elseif strcmp(get(hObject,'String'),'Slice X (TDC)')
meas_type = 2;
elseif strcmp(get(hObject,'String'),'Projected single quad')
meas_type = 0;
elseif strcmp(get(hObject,'String'),'Slice Y (disp.)')
meas_type = 3;
elseif strcmp(get(hObject,'String'),'Slice X (disp.)')
meas_type = 4;
end
en_dis(hObject, eventdata, handles)
% hObject handle to the selected object in uipanel4
% eventdata structure with the following fields (see UIBUTTONGROUP)
% EventName: string 'SelectionChanged' (read only)
% OldValue: handle of the previously selected object or empty if none was selected
% NewValue: handle of the currently selected object
% handles structure with handles and user data (see GUIDATA)
% --- Executes on button press in checkbox2.
function checkbox2_Callback(hObject, eventdata, handles)
global oper
if get(hObject,'Value')
oper =1;
else
oper = 0;
end
% hObject handle to checkbox2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox2
% --- Executes during object creation, after setting all properties.
function checkbox2_CreateFcn(hObject, eventdata, handles)
global oper all_objects
all_objects.oper = hObject;
if oper
set(hObject,'Value',1)
else
set(hObject,'Value',0)
end
% hObject handle to checkbox2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% --- Executes on button press in checkbox3.
function checkbox3_Callback(hObject, eventdata, handles)
global right_q
if get(hObject,'Value')
right_q =1;
else
right_q = 0;
end
% hObject handle to checkbox3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox3
% --- Executes during object creation, after setting all properties.
function checkbox3_CreateFcn(hObject, eventdata, handles)
global right_q all_objects
all_objects.right_q = hObject;
if right_q
set(hObject,'Value',1)
else
set(hObject,'Value',0)
end
% hObject handle to checkbox3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% --- Executes on selection change in SelectProfileMonitor.
function SelectProfileMonitor_Callback(hObject, eventdata, handles)
global PROFILEMONITOR
% we can just take the instrument name from the string of this menu
contents = cellstr(get(hObject,'String'));
PROFILEMONITOR = contents{get(hObject,'Value')};
function SelectStepSize_Callback(hObject, eventdata, handles)
global K_STEPS
K_STEPS = str2double(get(hObject,'String'));
% --- Bogus functions
function SelectProfileMonitor_CreateFcn(hObject, eventdata, handles)
function SelectStepSize_CreateFcn(hObject, eventdata, handles)
% --- Executes on selection change in popupmenu3.
function popupmenu3_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global background
background = get(hObject,'Value');
% Hints: contents = cellstr(get(hObject,'String')) returns popupmenu3 contents as cell array
% contents{get(hObject,'Value')} returns selected item from popupmenu3
% --- Executes during object creation, after setting all properties.
function popupmenu3_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% Hint: popupmenu controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes during object creation, after setting all properties.
function radiobutton1_CreateFcn(hObject, eventdata, handles)
% hObject handle to radiobutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% --- Executes during object creation, after setting all properties.
function meas_type_CreateFcn(hObject, eventdata, handles)
% hObject handle to meas_type (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
function edit8_Callback(hObject, eventdata, handles)
global en_chirp
en_chirp = str2double(get(hObject,'String'));
% hObject handle to edit8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of edit8 as text
% str2double(get(hObject,'String')) returns contents of edit8 as a double
% --- Executes during object creation, after setting all properties.
function edit8_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
global en_chirp all_objects
set(hObject,'String',en_chirp)
all_objects.en_chirp = hObject;
% Hint: edit controls usually have a white background on Windows.
% See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% --- Executes on button press in checkbox4.
function checkbox4_Callback(hObject, eventdata, handles)
global TDC_cal
if get(hObject,'Value')
TDC_cal =1;
else
TDC_cal = 0;
end
% hObject handle to checkbox4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of checkbox4
% --- Executes during object creation, after setting all properties.
function checkbox4_CreateFcn(hObject, eventdata, handles)
global TDC_cal all_objects
all_objects.TDC_cal = hObject;
if TDC_cal
set(hObject,'Value',1)
else
set(hObject,'Value',0)
end
% hObject handle to checkbox4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called