source: MML/trunk/machine/SOLEIL/common/plotfamily/plotfamily.m @ 4

Last change on this file since 4 was 4, checked in by zhangj, 11 years ago

Initial import--MML version from SOLEIL@2013

File size: 141.5 KB
Line 
1function varargout = plotfamily(varargin)
2%PLOTFAMILY - Plots by middle layer family name
3%  Runs as a stand-alone application as well
4%
5%  To restrict the families to certain MemberOf group use:
6%  plotfamily MemberName
7%
8%  FACTS
9%  1. Clicking on a data point in the plot will select the device in the
10%     listbox.  Clicking in the listbox will allow for a setpoint change.
11%
12%  2. The lattice plot can also be used to change the setpoint.
13%     Just click on an object in the lattice drawing.  To remove the
14%     setpoint widget click on a drift pass or BPM.  Note that HCMs are
15%     drawn above the axis and VCMs below.
16%
17%  3. The "Common Tasks" menu is a launch pad menu.  It actually has nothing
18%     to do with of the plotfamily application.  Many of the typical
19%     tasks for setup of storage rings are listed in this menu.
20%
21%  4. Use plotfamilystartup to customize it for a particular accelerator.
22%     (Look at the ALS for an example.)
23%
24%  5. This application can be compiled to run standalone.
25
26%
27%  Written by Gregory Portmann
28%  Adapted and enhanced for SOLEIL by Laurent S. Nadolski
29
30
31% Last Modified by GUIDE v2.5 29-Jul-2011 11:51:08
32
33
34% For the compiler
35%#function plotfamilystartup
36%#function aoinit setao setoperationalmode srinit
37%#function srcycle getmachineconfig setmachineconfig
38%#function setorbitdefault findrf findrf2 rmdisp setgolden setoffset
39%#function settune steptune setchro stepchro
40%#function plotorbit plotorbitdata plotcm plotgoldenorbit plotoffsetorbit
41%#function plotorbit plotdata plotbpmresp plotbpmrespsym
42%#function plotlattice plotdisp plotchro
43%#function monbpm getbpm monmags
44%#function gettune
45%#function measchro plotchro
46%#function measdisp plotdisp
47%#function measbpmresp meastuneresp quadcenter
48%#function copybpmrespfile
49%#function copybpmsigmafile
50%#function copychrorespfile
51%#function copydispersionfile
52%#function copydisprespfile
53%#function copyinjectionconfigfile
54%#function copymachineconfigfile
55%#function copytunerespfile
56%#function measlocodata locogui buildlocoinput buildloco buildlocofitparameters
57%#function solamor2linb
58%#function solamor2linc
59%#function lat_2020_3170f
60%#function lat_2020_3170e
61%#function lat_2020_3170b
62%#function lat_2020_3170a
63%#function gethbpmgroup
64%#function getvbpmgroup
65%#function lat_pseudo_nanoscopium_juin2011_122BPM
66%#function  lat_nano_176_234_122BPM
67
68%
69%  Written by Greg Portmann
70%  Modified by Laurent S. Nadolski
71
72% Edit the above text to modify the response to help plotfamily
73
74
75% Last modifications
76% 13 mars 2005: returns an error if LT1 or LT2 is loaded
77% May 30, 2007: edit does works for BPMyFamily
78% Directory to save data
79
80% Begin initialization code - DO NOT EDIT
81gui_Singleton = 0;
82gui_State = struct('gui_Name',       mfilename, ...
83    'gui_Singleton',  gui_Singleton, ...
84    'gui_OpeningFcn', @plotfamily_OpeningFcn, ...
85    'gui_OutputFcn',  @plotfamily_OutputFcn, ...
86    'gui_LayoutFcn',  [] , ...
87    'gui_Callback',   []);
88if nargin && ischar(varargin{1})
89    gui_State.gui_Callback = str2func(varargin{1});
90end
91
92if nargout
93    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
94else
95    gui_mainfcn(gui_State, varargin{:});
96end
97% End initialization code - DO NOT EDIT
98
99
100% --- Executes when user attempts to close figure1.
101function figure1_CloseRequestFcn(hObject, eventdata, handles)
102% hObject    handle to figure1 (see GCBO)
103% eventdata  reserved - to be defined in a future version of MATLAB
104% handles    structure with handles and user data (see GUIDATA)
105
106% Hint: delete(hObject) closes the figure
107delete(hObject);
108
109
110% --- Executes just before plotfamily is made visible.
111function plotfamily_OpeningFcn(hObject, eventdata, handles, varargin)
112% This function has no output args, see OutputFcn.
113% hObject    handle to figure
114% eventdata  reserved - to be defined in a future version of MATLAB
115% handles    structure with handles and user data (see GUIDATA)
116% varargin   command line arguments to plotfamily (see VARARGIN)
117
118% Choose default command line output for plotfamily
119handles.output = hObject;
120
121% Update handles structure
122guidata(hObject, handles);
123
124% UIWAIT makes plotfamily wait for user response (see UIRESUME)
125% uiwait(handles.figure1);
126
127% Set defaults
128UpdatePeriod = 0.2;
129set(handles.UpdatePeriod,'Label', sprintf('Update Period = %.2f s',UpdatePeriod));
130setappdata(handles.figure1, 'UpdatePeriod', UpdatePeriod);
131
132% Units  (This should get over written by the default for the BPM family)
133setappdata(handles.figure1,'UnitsFlag', 2); % Hardware
134set(handles.PhysicsUnitsFlag,'Checked','Off');
135set(handles.HardwareUnitsFlag,'Checked','On');
136set(handles.MicronFlag,'Checked','Off');
137
138setappdata(handles.figure1,'ChannelA',1); % Monitor values
139setappdata(handles.figure1,'ChannelB',2); % Golden values
140
141% Set the trace 1 defaults
142%setappdata(handles.figure1,'Trace1',1);
143set(handles.DisplayDiff,'Value', 0);
144set(handles.Display1,'Value', 1);
145set(handles.Display2,'Value', 0);
146setappdata(handles.figure1,'Trace1', 1); % Plot A
147
148setappdata(handles.figure1,'Trace2', 4); % Plotting Off
149
150% Run initialization if it has not been run (like standalone)
151checkforao;
152
153% Run initialization if it has not been run (like standalone)
154% Define Machine Name: Booster or Storage Ring
155Machine = getfamilydata('SubMachine');
156
157if isempty(Machine)
158    error('No Machine loaded');
159elseif strcmpi(Machine,'StorageRing')
160    namestr = 'Storage Ring';
161elseif strcmpi(Machine,'Booster')
162    namestr = 'Booster';
163elseif strcmpi(Machine,'LT1') || strcmpi(Machine,'LT2')
164    error('Not working for LT1 or LT2');
165else
166    error('Unknown machine\n exiting ...');
167end
168
169set(handles.accelerator_name,'String',namestr);
170
171if isempty(varargin)
172    MemberofField = 'PlotFamily';
173else
174    MemberofField = varargin{1};
175end
176
177% Build Family menu
178FoundOne = 0;
179FamilyName = getfamilylist;
180for i = 1:size(FamilyName,1)
181    Family = deblank(FamilyName(i,:));
182
183    try
184        spos = getspos(Family);
185    catch
186        spos = [];
187    end
188
189    % Only include if there are S-position for the family
190    if ~isempty(spos)
191        FieldList = '';
192        if ismemberof(Family, MemberofField)
193            %if ismemberof(Family, 'PlotFamily') | ismemberof(Family, 'MachineConfig') | ismemberof(Family, 'BPM') | ...
194            %        ismemberof(Family, 'COR') | ismemberof(Family, 'QUAD') | ...
195            %        ismemberof(Family, 'HCM') | ismemberof(Family, 'VCM') | ...
196            %        ismemberof(Family, 'SEXT') | ismemberof(Family, 'BEND') | ...
197            %        ismemberof(Family, 'SkewQuad') | ismemberof(Family, 'SQSF') | ismemberof(Family, 'SQSD')
198            FieldList = 'Monitor';
199            FoundOne = 1;
200        end
201
202        % Look if any other fields are part of the MachineConfig
203        AOFamily = getfamilydata(Family);
204        FieldNameCell = fieldnames(AOFamily);
205        for j = 1:size(FieldNameCell,1)
206            if isfield(AOFamily.(FieldNameCell{j}),'MemberOf')
207                if any(strcmpi(AOFamily.(FieldNameCell{j}).MemberOf, MemberofField))
208                    %if any(strcmpi(AOFamily.(FieldNameCell{j}).MemberOf, MemberofField)) | any(strcmpi(AOFamily.(FieldNameCell{j}).MemberOf, 'MachineConfig'))
209                    FieldList = strvcat(FieldList,FieldNameCell{j});
210                    FoundOne = 1;
211                end
212            end
213        end
214
215        % Remove repeats but keep the row order
216        [FieldListUnique, ii, jj] = unique(FieldList, 'rows');
217        jj(find(diff(jj)==0)) = [];
218        FieldList = FieldListUnique(jj,:);
219
220        if size(FieldList,1) == 1
221            Menu1 = handles.BPMxFamily;
222            Menu2 = handles.BPMyFamily;
223            h1 = uimenu(Menu1, 'Label',sprintf('%s',Family), 'Callback','plotfamily(''BPMxFamily_Callback'',gcbo,[],guidata(gcbo))');
224            h2 = uimenu(Menu2, 'Label',sprintf('%s',Family), 'Callback','plotfamily(''BPMyFamily_Callback'',gcbo,[],guidata(gcbo))');
225            set(h1, 'UserData', family2datastruct(Family, deblank(FieldList)));
226            set(h2, 'UserData', family2datastruct(Family, deblank(FieldList)));
227
228        elseif size(FieldList,1) > 1
229            % Build off an extra menu
230            Menu1 = handles.BPMxFamily;
231            Menu2 = handles.BPMyFamily;
232            Menu1 = uimenu(Menu1, 'Label', Family);
233            Menu2 = uimenu(Menu2, 'Label', Family);
234
235            for iField = 1:size(FieldList,1)
236                h1 = uimenu(Menu1, 'Label',sprintf('%s.%s',Family,deblank(FieldList(iField,:))), 'Callback','plotfamily(''BPMxFamily_Callback'',gcbo,[],guidata(gcbo))');
237                h2 = uimenu(Menu2, 'Label',sprintf('%s.%s',Family,deblank(FieldList(iField,:))), 'Callback','plotfamily(''BPMyFamily_Callback'',gcbo,[],guidata(gcbo))');
238                set(h1, 'UserData', family2datastruct(Family, deblank(FieldList(iField,:))));
239                set(h2, 'UserData', family2datastruct(Family, deblank(FieldList(iField,:))));
240            end
241        else
242            % Skip family
243        end
244    end
245end
246
247
248if ~FoundOne
249    % if MemberOf came up empty, then put all the families in the menu
250    for i = 1:size(FamilyName,1)
251        try
252            Family = deblank(FamilyName(i,:));
253            FamilyStruct = family2datastruct(Family,'Monitor');
254            spos = getspos(FamilyStruct);
255            if ~isempty(spos)
256                h1 = uimenu(handles.BPMxFamily, 'Label',Family, 'Callback','plotfamily(''BPMxFamily_Callback'',gcbo,[],guidata(gcbo))');
257                h2 = uimenu(handles.BPMyFamily, 'Label',Family, 'Callback','plotfamily(''BPMyFamily_Callback'',gcbo,[],guidata(gcbo))');
258                set(h1, 'UserData', FamilyStruct);
259                set(h2, 'UserData', FamilyStruct);
260            end
261        catch
262            % Skip family
263            %fprintf('Skipping family %s',Family);
264        end
265    end
266end
267
268
269% Initial families
270try
271    BPMFamilyCell = findmemberof('BPM');
272    if length(BPMFamilyCell) >= 2
273        BPMxFamily = BPMFamilyCell{1};
274        BPMyFamily = BPMFamilyCell{2};
275    else
276        Hope for the best on a family name
277        BPMxFamily = gethbpmfamily;
278        BPMyFamily = getvbpmfamily;
279    end
280    BPMxField = 'Monitor';
281    BPMyField = 'Monitor';
282    BPMxList = family2dev(BPMxFamily, 1);
283    BPMyList = family2dev(BPMyFamily, 1);
284
285    set(handles.BPMxFamily,'Label',sprintf('Family = %s', BPMxFamily));
286    set(handles.BPMyFamily,'Label',sprintf('Family = %s', BPMyFamily));
287
288    % Base on first 2 families
289    FamilyHandles = get(handles.BPMxFamily,'Children');
290    if length(FamilyHandles) >= 1
291        RawX = get(FamilyHandles(end),'UserData');
292        if isempty(RawX)
293            FamilyHandles2 = get(FamilyHandles(end),'Children');
294            RawX = get(FamilyHandles2(end),'UserData');
295        end
296        BPMxFamily = RawX.FamilyName;
297    else
298        fprintf('   No families in the MML.\n');
299    end
300    if length(FamilyHandles) >= 2
301        RawY = get(FamilyHandles(end-1),'UserData');
302        if isempty(RawY)
303            FamilyHandles2 = get(FamilyHandles(end-1),'Children');
304            RawY = get(FamilyHandles2(end),'UserData');
305        end
306        BPMyFamily = RawY.FamilyName;
307    else
308        RawY = RawX;
309        BPMyFamily = RawX.FamilyName;
310    end
311
312    % Initialize Mode
313    % if strcmpi(get(handles.Simulate,'Checked'),'On')
314    %     Mode = 'Simulator';
315    % else
316    %     Mode = 'Online';
317    % end
318    if strcmpi(RawX.Mode,'SIMULATOR')
319        set(handles.Online,'Checked','Off');
320        set(handles.Simulate,'Checked','On');
321        Mode = 'Simulator';
322        SetFigureTitle(handles.figure1, 'Model');
323    else
324        set(handles.Online,'Checked','On');
325        set(handles.Simulate,'Checked','Off');
326        Mode = 'Online';
327        SetFigureTitle(handles.figure1, 'Online');
328    end
329
330    % Initialize Units
331    if strcmpi(RawX.Units,'Physics')
332        setappdata(handles.figure1,'UnitsFlag', 1);
333        set(handles.('PhysicsUnitsFlag'),'Checked','On');
334        set(handles.('HardwareUnitsFlag'),'Checked','Off');
335        set(handles.('MicronFlag'),'Checked','Off');
336        UnitsFlag = 'Physics';
337    else
338        setappdata(handles.figure1,'UnitsFlag', 2);
339        set(handles.('PhysicsUnitsFlag'),'Checked','Off');
340        set(handles.('HardwareUnitsFlag'),'Checked','On');
341        set(handles.('MicronFlag'),'Checked','Off');
342        UnitsFlag = 'Hardware';
343    end
344
345    set(handles.('BPMxFamily'),'Label',sprintf('Plot: %s', BPMxFamily));
346    set(handles.('BPMyFamily'),'Label',sprintf('Plot: %s', BPMyFamily));
347
348    % Create the list box string
349    RawX = CreateListboxString(RawX);
350    RawY = CreateListboxString(RawY);
351
352    setappdata(handles.figure1, 'BPMxFamily', RawX);
353    setappdata(handles.figure1, 'BPMyFamily', RawY);
354
355    setappdata(handles.figure1,'RawX', RawX);
356    setappdata(handles.figure1,'RawY', RawY);
357
358    setappdata(handles.figure1,'SaveX', RawX);
359    setappdata(handles.figure1,'SaveY', RawY);
360    set(handles.SaveTime,'String', 'Not saved');
361
362    setappdata(handles.figure1,'FileX', RawX);
363    setappdata(handles.figure1,'FileY', RawY);
364
365    setappdata(handles.figure1,'FileX2', RawX);
366    setappdata(handles.figure1,'FileY2', RawY);
367
368    setappdata(handles.figure1,'FileNameX','');
369    setappdata(handles.figure1,'FileNameY','');
370    setappdata(handles.figure1,'FileNameX2','');
371    setappdata(handles.figure1,'FileNameY2','');
372
373    set(handles.FileNameX,'String', '');
374    set(handles.FileNameY,'String', '');
375    set(handles.FileNameX2,'String', '');
376    set(handles.FileNameY2,'String', '');
377   
378    %p = get(handles.FileNameX,'Position');
379    %set(handles.FileNameX,'Position', [p(1) 4 p(3) p(4)]);    % Points
380    %set(handles.FileNameX,'Position', [p(1) .8 p(3) p(4)]);   % Characters
381    %set(handles.FileNameX,'Position', [p(1) 0.02 p(3) p(4)]); % Normalized
382    %p = get(handles.SaveTime,'Position');
383    %set(handles.SaveTime,'Position', [p(1) 16.5 p(3) p(4)]);  % Points
384    %set(handles.SaveTime,'Position', [p(1) 1.6 p(3) p(4)]);   % Characters
385    %set(handles.SaveTime,'Position', [p(1) 0.052 p(3) p(4)]); % Normalized
386
387    % Look to see it the AT model needs to be changed for this family
388    ATModelNumber = getfamilydata(BPMxFamily, 'AT', 'ATModel');
389    if ~isempty(ATModelNumber)
390        global THERING THERINGCELL
391        THERING = THERINGCELL{ATModelNumber};
392        setfamilydata(findspos(THERING,length(THERING)+1), 'Circumference');
393    end
394
395catch
396
397    % Starting units
398    UnitMenu = getappdata(handles.figure1,'UnitsFlag');
399    if UnitMenu == 1
400        UnitsFlag = 'Physics';
401    else
402        UnitsFlag = 'Hardware';
403    end
404
405    % Initialize Mode
406    if strcmpi(get(handles.Simulate,'Checked'),'On')
407        Mode = 'Simulator';
408    else
409        Mode = 'Online';
410    end
411
412end
413
414
415% % Look for the golden values
416% try
417%     GoldenValues = getgolden(BPMxFamily, BPMxList, 'Struct');
418%     setappdata(handles.figure1,'GoldenX', GoldenValues);
419% catch
420%     setappdata(handles.figure1,'GoldenX', RawX);
421% end
422%
423% % Look for the offset values
424% try
425%     OffsetValues = getoffset(BPMxFamily, BPMxList, 'Struct');
426%     setappdata(handles.figure1,'OffsetX', OffsetValues);
427% catch
428%     if isempty(OffsetValues)
429%         try
430%             % If and offset does not exist than try using the setpoint
431%             setappdata(handles.figure1,'OffsetX', getsp(BPMxFamily, BPMxList, Mode, 'Struct'));
432%         catch
433%             % Use zeros
434%             setappdata(handles.figure1,'OffsetX', RawX);
435%         end
436%     end
437% end
438%
439% % Look for the golden values
440% try
441%     GoldenValues = getgolden(BPMyFamily, BPMyList, 'Struct');
442%     setappdata(handles.figure1,'GoldenY', GoldenValues);
443% catch
444%     setappdata(handles.figure1,'GoldenY', RawY);
445% end
446%
447% % Look for the offset values
448% try
449%     OffsetValues = getoffset(BPMyFamily, BPMyList, 'Struct');
450%     setappdata(handles.figure1,'OffsetY', OffsetValues);
451% catch
452%     try
453%         % If and offset does not exist than try using the setpoint
454%         setappdata(handles.figure1,'OffsetY', getsp(BPMyFamily, BPMyList, Mode, 'Struct'));
455%     catch
456%         % Use zeros
457%         setappdata(handles.figure1,'OffsetY', RawY);
458%     end
459% end
460
461%% Sets axes for Graph1
462L = getfamilydata('Circumference');
463
464try
465    s = getspos(RawX);
466    setappdata(handles.figure1, 'SPosX', s);
467    if isempty(L)
468        L = max(s);
469    end
470    %setappdata(handles.figure1, 'AxisRange1X', [min(s) max(s)]);
471catch
472    %setappdata(handles.figure1, 'SPosX', 1:size(RawX.DeviceList,1));
473end
474setappdata(handles.figure1, 'AxisRange1X', [0 L]);
475
476%% Sets axes for Graph2
477try
478    s = getspos(RawY);
479    setappdata(handles.figure1, 'SPosY', s);
480    %setappdata(handles.figure1, 'AxisRange2X', [min(s) max(s)]);
481catch
482    %setappdata(handles.figure1, 'SPosY', 1:size(RawY.DeviceList,1));
483end
484setappdata(handles.figure1, 'AxisRange2X', [0 L]);
485
486
487% Update time
488set(handles.Time, 'String', '');
489
490
491% Initialize plots
492set(handles.Graph1, 'XLim', [0 L]);
493set(handles.Graph2, 'XLim', [0 L]);
494
495p1 = [0.07    0.66    0.69    0.28];
496set(handles.Graph1, 'Position', p1);
497set(handles.Graph3, 'Position', p1);
498
499p2 = [0.07    0.26    0.69    0.28];
500set(handles.Graph2, 'Position', p2);
501set(handles.Graph4, 'Position', p2);
502
503plot(handles.Graph3, NaN, NaN);
504set(handles.Graph3, 'Visible', 'Off');
505set(handles.Graph3, 'color', 'none');
506set(handles.Graph3, 'XLim', [0 L]);
507
508plot(handles.Graph4, NaN,NaN);
509set(handles.Graph4, 'Visible', 'Off');
510set(handles.Graph4, 'color', 'none');
511set(handles.Graph4, 'XLim', [0 L]);
512
513
514%axes(handles.LatticeAxes);
515try
516    drawlattice(0, 1.1, handles.LatticeAxes);
517catch
518    d = .01;
519    p1 = [0.07    0.65-d    0.74    0.29+d];
520    set(handles.Graph1, 'Position', p1);
521    set(handles.Graph3, 'Position', p1);
522
523    p2 = [0.07    0.27    0.74    0.29+d];
524    set(handles.Graph2, 'Position', p2);
525    set(handles.Graph4, 'Position', p2);
526
527    set(handles.DrawLattice, 'Checked', 'Off');
528    set(get(handles.LatticeAxes,'Children'), 'Visible' , 'Off');
529end
530
531try
532    set(handles.LatticeAxes,'Visible','Off');
533    set(handles.LatticeAxes,'Color','None');
534    set(handles.LatticeAxes,'XMinorTick','Off');
535    set(handles.LatticeAxes,'XMinorGrid','Off');
536    set(handles.LatticeAxes,'YMinorTick','Off');
537    set(handles.LatticeAxes,'YMinorGrid','Off');
538    set(handles.LatticeAxes,'XTickLabel',[]);
539    set(handles.LatticeAxes,'YTickLabel',[]);
540    set(handles.LatticeAxes,'XLim', [0 L]);
541    set(handles.LatticeAxes,'YLim', [-1.5 1.5]);
542
543
544    % Add callback on each lattice element
545    % set(handles.LatticeAxes ,'ButtonDownFcn','plotfamily(''Lattice_ButtonDown'',gcbo,[],guidata(gcbo))');
546    h = get(handles.LatticeAxes,'Children');
547    for i = 1:length(h)
548        %ATIndex = get(h(i), 'UserData');
549        set(h(i), 'ButtonDownFcn', 'plotfamily(''Lattice_ButtonDown'',gcbo,[],guidata(gcbo))');
550    end
551catch
552end
553
554
555
556
557% % Build middle layer edit menus
558% %h = addmenuao(handles.('EditMiddleLayerAO'));
559% %set(h, 'Label', 'Middle Layer Family Setup');
560%
561% hmenu = handles.('EditMiddleLayerAO');
562% LabelString = 'Middle Layer Family Setup';
563% ParentLabelString = 'MiddleLayer';
564% DataStructure0 = getao;
565% if isempty(DataStructure0)
566%     aoinit;
567% end
568%
569%
570% % Build middle menu tree
571% DataStructFieldName1 = fieldnames(DataStructure0);
572% for i = 1:length(DataStructFieldName1)
573%     DataStructure1 = DataStructure0.(DataStructFieldName1{i});
574%     if isstruct(DataStructure1)
575%         hmenu1 = uimenu(hmenu, 'Label',DataStructFieldName1{i}, 'Callback','');
576%         DataStructFieldName2 = fieldnames(DataStructure1);
577%         for j = 1:length(DataStructFieldName2)
578%             DataStructure2 = DataStructure1.(DataStructFieldName2{j});
579%             if isstruct(DataStructure2)
580%                 hmenu2 = uimenu(hmenu1, 'Label',DataStructFieldName2{j}, 'Callback','');
581%                 DataStructFieldName3 = fieldnames(DataStructure2);
582%                 for k = 1:length(DataStructFieldName3)
583%                     DataStructure3 = DataStructure2.(DataStructFieldName3{k});
584%                     if isstruct(DataStructure3)
585%                         hmenu3 = uimenu(hmenu2, 'Label',DataStructFieldName3{k}, 'Callback','');
586%                         DataStructFieldName4 = fieldnames(DataStructure3);
587%                         for l = 1:length(DataStructFieldName4)
588%                             hmenu4 = uimenu(hmenu3, 'Label', DataStructFieldName4{l});
589%                             set(hmenu4,'UserData', {DataStructure3.(DataStructFieldName4{l}) , DataStructFieldName1{l}, DataStructFieldName2{k}, DataStructFieldName3{k}, DataStructFieldName4{i}});
590%                             set(hmenu4,'Callback', 'plotfamily(''EditMiddleLayer_Callback'',gcbo,[],guidata(gcbo))');
591%                         end
592%                     else
593%                         hmenu3 = uimenu(hmenu2, 'Label',DataStructFieldName3{k});
594%                         set(hmenu3,'UserData', {DataStructure3, DataStructFieldName1{i}, DataStructFieldName2{j}, DataStructFieldName3{k}});
595%                         set(hmenu3,'Callback', 'plotfamily(''EditMiddleLayer_Callback'',gcbo,[],guidata(gcbo))');
596%                     end
597%                 end
598%             else
599%                 hmenu2 = uimenu(hmenu1, 'Label',DataStructFieldName2{j});
600%                 set(hmenu2,'UserData', {DataStructure2, DataStructFieldName1{i}, DataStructFieldName2{j}});
601%                 set(hmenu2,'Callback', 'plotfamily(''EditMiddleLayer_Callback'',gcbo,[],guidata(gcbo))');
602%             end
603%         end
604%     else
605%         hmenu1 = uimenu(hmenu, 'Label', DataStructFieldName1{i});
606%         set(hmenu1,'UserData', {DataStructure1, DataStructFieldName1{i}});
607%         set(hmenu1,'Callback', 'plotfamily(''EditMiddleLayer_Callback'',gcbo,[],guidata(gcbo))');
608%     end
609% end
610
611
612% % Build the AD menu
613% set(addmenuad(handles.EditMiddleLayerAD), 'Label', 'Middle Layer Parameter Setup');
614set(handles.EditMiddleLayerAO, 'Visible', 'Off');
615set(handles.EditMiddleLayerAD, 'Visible', 'Off');
616
617
618% Machine specific startup function
619if exist('plotfamilystartup', 'file')
620    handles = plotfamilystartup(handles);
621    % Update handles structure
622    guidata(hObject, handles);
623end
624
625
626% Refresh once
627OneShot_Callback(hObject, eventdata, handles);
628
629% --------------------------------------------------------------------
630function SetFigureTitle(h_fig, ModeString)
631
632MachineName     = getfamilydata('Machine');
633SubMachineName  = getfamilydata('SubMachine');
634OperationalMode = getfamilydata('OperationalMode');
635try
636    if isdeployed
637        TitleString = sprintf('Plot Family:  %s  -  %s  -  %s  (%s - Standalone)', MachineName, SubMachineName, OperationalMode, ModeString);
638    else
639        TitleString = sprintf('Plot Family:  %s  -  %s  -  %s  (%s)', MachineName, SubMachineName, OperationalMode, ModeString);
640    end
641catch
642    TitleString = sprintf('Plot Family:  %s  -  %s  -  %s  (%s)', MachineName, SubMachineName, OperationalMode, ModeString);
643end
644
645set(h_fig,'Name',TitleString);
646
647
648
649% --------------------------------------------------------------------
650function Resize_Callback(hObject, eventdata, handles)
651
652% SmallestPositionX = 174.800;
653% SmallestPositionY  = 39.7692;
654%
655% % Units should be characters anyways
656% Units = get(hObject,'Units');
657% set(hObject,'Units', 'Characters');
658% P = get(hObject, 'Position');
659%
660% if P(3) < SmallestPositionX
661%    P(3) = SmallestPositionX;
662%
663%    if P(1)+P(3) < 0
664%    end
665% end
666%
667%
668% if P(4) < SmallestPositionY
669%    P(4) = SmallestPositionY;
670% end
671%
672% set(hObject, 'Position', P);
673% set(hObject, 'Units', Units);
674
675
676
677% --- Outputs from this function are returned to the command line.
678function varargout = plotfamily_OutputFcn(hObject, eventdata, handles)
679% varargout  cell array for returning output args (see VARARGOUT);
680% hObject    handle to figure
681% eventdata  reserved - to be defined in a future version of MATLAB
682% handles    structure with handles and user data (see GUIDATA)
683
684% Get default command line output from handles structure
685if isfield(handles,'output')
686    varargout{1} = handles.output;
687end
688
689
690% --- Executes onoff button press in OnOff.
691function EditMiddleLayer_Callback(hObject, eventdata, handles)
692
693Data = get(hObject, 'UserData');
694
695% Get up-to-date data
696Data{1} = getfamilydata(Data{2:end});
697TitleString = sprintf('%s ',Data{2:end});
698AddOpts.Resize='on';
699AddOpts.WindowStyle='normal';
700AddOpts.Interpreter='tex';
701
702if length(Data) >= 3 && (strcmpi(deblank(Data{3}),'Status') || strcmpi(deblank(Data{3}),'DeviceList') || strcmpi(deblank(Data{3}),'ElementList'))
703    if strcmpi(deblank(Data{3}),'ElementList')
704        DeviceList = getfamilydata(deblank(Data{2}), 'ElementList');
705    else
706        DeviceList = getfamilydata(deblank(Data{2}), 'DeviceList');
707    end
708    Status = getfamilydata(deblank(Data{2}), 'Status');
709    DeviceListNew = editlist(DeviceList, deblank(Data{2}), Status);
710
711    [i, iNotFound] = findrowindex(DeviceListNew, DeviceList);
712
713    if size(Status,1) == 1
714        DeviceListTotal = family2dev(Data{2}, 0);
715        Status = zeros(size(DeviceListTotal,1),1);
716    else
717        Status = 0 * Status;
718    end
719    Status(i) = 1;
720    setfamilydata(Status, deblank(Data{2}), 'Status');
721
722elseif isnumeric(Data{1})
723    answer = inputdlg({sprintf('Change %s ',TitleString)}, 'Edit Middle Layer Family', size(Data{1},1), {num2str(Data{1})}, AddOpts);
724    if isempty(answer)
725        return
726    end
727    Data{1} = str2num(answer{1});
728    set(hObject, 'UserData', Data);
729    setfamilydata(Data{1:end});
730elseif strcmpi(Data{2},'Directory')
731    answer = uigetdir(Data{1}, sprintf('Change directory location for %s', Data{3}));
732    if answer == 0
733        return
734    end
735    Data{1} = answer;
736    set(hObject, 'UserData', Data);
737    setfamilydata(Data{1:end});
738
739elseif ischar(Data{1})
740    answer = inputdlg({sprintf('Change %s ',TitleString)}, 'Edit Middle Layer Family', size(Data{1},1), {num2str(Data{1})}, AddOpts);
741    if isempty(answer)
742        return
743    end
744    Data{1} = answer{1};
745    set(hObject, 'UserData', Data);
746    setfamilydata(Data{1:end});
747end
748
749
750% Reset graphs
751BPMxFamily_Callback([], eventdata, handles);
752BPMyFamily_Callback([], eventdata, handles);
753
754
755% --- Executes on delete
756function Delete_Callback(hObject, eventdata, handles)
757
758% If timer is on, then turn it off by deleting the timer handle
759try
760    %h = get(gcbf, 'UserData');
761    h = get(handles.figure1, 'UserData');
762    if isfield(h,'TimerHandle')
763        stop(h.TimerHandle);
764        delete(h.TimerHandle);
765    end
766catch
767    fprintf('   Trouble stopping the timer on exit.\n');
768end
769
770
771
772% --- Executes onoff button press in OnOff.
773function Timer_Callback(hObject, eventdata, handles)
774% Timer method
775
776%disp('Timer executed.');
777%handles = get(eventdata, 'UserData');
778handles = get(hObject, 'UserData');
779plotfamily('OneShot_Callback', hObject, [], handles);
780
781
782% --- Executes onoff button press in OnOff.
783function OnOff_Callback(hObject, eventdata, handles)
784% Timer method
785
786% % Update the title bar
787% if strcmpi(get(handles.Simulate,'Checked'),'On')
788%     SetFigureTitle(handles.figure1, 'Model');
789% else
790%     SetFigureTitle(handles.figure1, 'Online');
791% end
792
793OnFlag = get(handles.OnOff, 'Value');
794
795if OnFlag
796    % Turn on updates
797    set(handles.OnOff, 'String', 'Running');
798
799    % Turn LatticeAxes menu back off
800    set(handles.LatticeMenu,'enable','off');
801
802    % Setup timer
803    UpdatePeriod = getappdata(handles.figure1, 'UpdatePeriod');
804    t = timer;
805    set(t,'StartDelay',0);
806    set(t,'Period', UpdatePeriod);
807    %set(t,'TimerFcn', 'plotfamily(''OneShot_Callback'', getfield(get(timerfind(''Tag'',''PlotFamilyTimer''),''Userdata''),''figure1''), [], get(timerfind(''Tag'',''PlotFamilyTimer''),''Userdata''));');
808    set(t,'TimerFcn', ['plotfamily(''Timer_Callback'',', sprintf('%.30f',handles.figure1), ',',sprintf('%.30f',handles.figure1), ', [])']);
809    set(t,'UserData', handles);
810    set(t,'BusyMode', 'drop');  %'queue'
811    set(t,'TasksToExecute', Inf);
812    set(t,'ExecutionMode', 'FixedRate');
813    set(t,'Tag', 'PlotFamilyTimer');
814
815    handles.TimerHandle = t;
816    set(handles.figure1, 'UserData', handles);
817
818    % Change Color
819    set(handles.OnOff, 'String', 'Running', 'BackgroundColor',[0 1 0]);
820
821    start(t);
822
823else
824    try
825        % Turn off updating by deleting timer handle
826        h = get(handles.figure1, 'UserData');
827        stop(h.TimerHandle);
828        delete(h.TimerHandle);
829        h = rmfield(h, 'TimerHandle');
830        set(handles.figure1, 'UserData', h);
831
832        % Delete all timers
833        %h = timerfind('Tag','PlotFamilyTimer');
834        %for i = 1:length(h)
835        %    stop(h(i));
836        %    delete(h(i));
837        %end
838
839        % Change OnOff label string
840        set(handles.OnOff, 'String', 'Continuous', 'BackgroundColor',[0.81 0.81 0.81]);
841        % Turn LatticeAxes menu back on
842        set(handles.LatticeMenu,'enable','on');
843
844    catch
845        fprintf('   Trouble stopping the timer.\n');
846    end
847end
848
849
850% % --- Executes onoff button press in OnOff.
851% function OnOff_Callback(hObject, eventdata, handles)
852% % Uses delay (not Timer)
853%
854% OrbitFeedbackFlag = 0;
855%
856% % Turn latticeaxes menu back off
857% set(handles.('LatticeMenu'),'enable','off');
858%
859% if strcmpi(get(handles.Simulate,'Checked'),'On')
860%     Mode = 'Simulator';
861% else
862%     Mode = 'Online';
863% end
864%
865% BPMxFamily = getappdata(handles.figure1, 'BPMxFamily');
866% BPMxList = getappdata(handles.figure1, 'BPMxList');
867% BPMyFamily = getappdata(handles.figure1, 'BPMyFamily');
868% BPMyList = getappdata(handles.figure1, 'BPMyList');
869%
870% OnFlag = get(handles.('OnOff'),'Value');
871% if OnFlag
872%     % Turn on updates
873%     set(handles.('OnOff'), 'String', 'Running')
874% end
875%
876% if OrbitFeedbackFlag
877%     [Nbpm, Tbpm] = getbpmaverages;
878%     Tbpm = max(Tbpm);
879% end
880%
881% while OnFlag
882%     t0 = gettime;
883%     OnFlag = get(handles.('OnOff'),'Value');
884%     UpdatePeriod = getappdata(handles.figure1, 'UpdatePeriod');
885%
886%     if OnFlag
887%         % Get new data
888%         try
889%             RawX = getam(BPMxFamily, BPMxList, Mode, 'Struct');
890%         catch
891%             RawX.Data = NaN*zeros(size(BPMxList,1),1);
892%             RawX.Units = 'Hardware';
893%             RawX.TimeStamp = clock;
894%             fprintf('   %s, GETAM trouble in family %s\n', sprintf('%s',datestr(RawX.TimeStamp,14)), BPMxFamily);
895%         end
896%         setappdata(handles.figure1, 'RawX', RawX);
897%
898%         try
899%             RawY = getam(BPMyFamily, BPMyList, Mode, 'Struct');
900%         catch
901%             RawY.Data = NaN*zeros(size(BPMyList,1),1);
902%             RawY.Units = 'Hardware';
903%             RawY.TimeStamp = clock;
904%             fprintf('   %s, GETAM trouble in family %s\n', sprintf('%s',datestr(RawY.TimeStamp,14)), BPMyFamily);
905%         end
906%         setappdata(handles.figure1, 'RawY', RawY);
907%
908%         % For non-BPM the offset (ie, the setpoint) may have changed
909%         if ~ismemberof(BPMxFamily,'BPM')
910%             % Update the offset to the setpoint
911%             setappdata(handles.figure1,'OffsetX', getsp(BPMxFamily, BPMxList, Mode));
912%         end
913%         if ~ismemberof(BPMyFamily,'BPM')
914%             % Update the offset to the setpoint
915%             setappdata(handles.figure1,'OffsetY', getsp(BPMyFamily, BPMyList, Mode));
916%         end
917%
918%         % Update time
919%         set(handles.('Time'),'String', sprintf('%s',datestr(RawY.TimeStamp,14)));
920%
921%         plotappdatalocal(handles);
922%         drawnow;
923%
924%
925%         if OrbitFeedbackFlag
926%             % One could easily add a orbit feedback step
927%             setorbitdefault([], 1, [], 'NoDisplay');
928%             pause(2.2*Tbpm);
929%         end
930%
931%     else
932%         set(handles.('OnOff'), 'String', 'Continuous');
933%
934%         % Turn latticeaxes menu back on
935%         set(handles.('LatticeMenu'),'enable','on');
936%
937%         break
938%     end
939%
940%     % Pause
941%     T = UpdatePeriod-(gettime-t0);
942%     if T > 0
943%         pause(T);
944%     end
945% end
946
947
948
949% --- Executes on button press in OneShot.
950function OneShot_Callback(hObject, eventdata, handles)
951
952% To break out of the continuous loop (if in it)
953%set(handles.('OnOff'),'Value', 0);  % Not turned off with timer!
954
955
956% Get Mode and update the title bar
957if strcmpi(get(handles.Simulate,'Checked'),'On')
958    SetFigureTitle(handles.figure1, 'Model')
959    Mode = 'Simulator';
960else
961    SetFigureTitle(handles.figure1, 'Online')
962    Mode = 'Online';
963end
964
965% Get the structures
966DataStruct1 = getappdata(handles.figure1, 'BPMxFamily');
967DataStruct2 = getappdata(handles.figure1, 'BPMyFamily');
968
969% Get new data
970try
971    RawX = getpv(DataStruct1, Mode, 'Struct');
972    %RawX = getpv(DataStruct1, Mode, UnitsFlag, 'Struct');
973catch
974    RawX.Data = NaN*zeros(size(DataStruct1.Data,1),1);
975    RawX.Units = DataStruct1.Units;
976    RawX.UnitsString = DataStruct1.UnitsString;
977    RawX.Mode = Mode;
978    RawX.TimeStamp = clock;
979    fprintf('\n%s\n', lasterr);
980    fprintf('   %s, GETPV trouble in family %s\n', sprintf('%s',datestr(RawX.TimeStamp,13)), DataStruct1.FamilyName);
981end
982setappdata(handles.figure1, 'RawX', RawX);
983
984try
985    RawY = getpv(DataStruct2, Mode, 'Struct');
986    %RawY = getpv(DataStruct2, Mode, UnitsFlag, 'Struct');
987catch
988    RawY.Data = NaN*zeros(size(DataStruct2.Data,1),1);
989    RawY.Units = DataStruct2.Units;
990    RawY.UnitsString = DataStruct2.UnitsString;
991    RawY.Mode = Mode;
992    RawY.TimeStamp = clock;
993    fprintf('\n%s\n', lasterr);
994    fprintf('   %s, GETPV trouble in family %s\n', sprintf('%s',datestr(RawY.TimeStamp,13)), DataStruct2.FamilyName);
995end
996setappdata(handles.figure1, 'RawY', RawY);
997
998
999% % For non-BPM the offset (ie, the setpoint) may have changed
1000% if ~isempty(getfamilydata(DataStruct1.FamilyName,'Setpoint'))
1001%     % Update the offset to the setpoint
1002%     setappdata(handles.figure1,'OffsetX', getsp(DataStruct1.FamilyName, Mode, DataStruct1.Units, 'Struct'));
1003% end
1004% if ~isempty(getfamilydata(DataStruct2.FamilyName,'Setpoint'))
1005%     % Update the offset to the setpoint
1006%     setappdata(handles.figure1,'OffsetY', getsp(DataStruct2.FamilyName, Mode, DataStruct2.Units, 'Struct'));
1007% end
1008
1009
1010% Update time
1011set(handles.Time, 'String', sprintf('%s',datestr(RawY.TimeStamp,13)));
1012
1013plotappdatalocal(handles);
1014drawnow;
1015
1016
1017
1018function plotappdatalocal(handles)
1019
1020if strcmpi(get(handles.Simulate,'Checked'),'On')
1021    Mode = 'Simulator';
1022else
1023    Mode = 'Online';
1024end
1025
1026
1027% Get data from appdata
1028Trace1 = getappdata(handles.figure1,'Trace1');
1029Trace2 = getappdata(handles.figure1,'Trace2');
1030UnitsFlag = getappdata(handles.figure1,'UnitsFlag');
1031
1032DataStruct1 = getappdata(handles.figure1, 'BPMxFamily');
1033DataStruct2 = getappdata(handles.figure1, 'BPMyFamily');
1034
1035RawX = getappdata(handles.figure1, 'RawX');
1036RawY = getappdata(handles.figure1, 'RawY');
1037
1038sx = getappdata(handles.figure1, 'SPosX');
1039sy = getappdata(handles.figure1, 'SPosY');
1040
1041if isempty(sx)
1042    error(sprintf('Position along ring information not available for %s family.', RawX.FamilyName));
1043    %sx = 1:size(RawX.Data,1);
1044end
1045if isempty(sy)
1046    error(sprintf('Position along ring information not available for %s family.', RawY.FamilyName));
1047    %sy = 1:size(RawY.Data,1);
1048end
1049
1050ChannelA = getappdata(handles.figure1, 'ChannelA');
1051ChannelB = getappdata(handles.figure1, 'ChannelB');
1052
1053if Trace1 == 1 || Trace1 == 3 || Trace2 == 1 || Trace2 == 3
1054    if ChannelA == 1
1055        DataA1 = RawX.Data;
1056        DataA2 = RawY.Data;
1057    elseif ChannelA == 2
1058        %DataA1 = getappdata(handles.figure1,'GoldenX');
1059        %DataA1 = DataA1.Data;
1060        %DataA2 = getappdata(handles.figure1,'GoldenY');
1061        %DataA2 = DataA2.Data;
1062
1063        if strcmpi(DataStruct1.Field, 'Monitor') && ~isempty(getfamilydata(DataStruct1.FamilyName,'Setpoint'))
1064            % Display the setpoint golden value
1065            DataA1 = getgolden(DataStruct1, 'Setpoint', DataStruct1.Units, 'Numeric');
1066        else
1067            DataA1 = getgolden(DataStruct1, DataStruct1.Units, 'Numeric');
1068        end
1069
1070        if strcmpi(DataStruct2.Field, 'Monitor') && ~isempty(getfamilydata(DataStruct2.FamilyName,'Setpoint'))
1071            % Display the setpoint golden value
1072            DataA2 = getgolden(DataStruct2, 'Setpoint', DataStruct2.Units, 'Numeric');
1073        else
1074            DataA2 = getgolden(DataStruct2, DataStruct2.Units, 'Numeric');
1075        end
1076
1077    elseif ChannelA == 3
1078        %DataA1 = getappdata(handles.figure1,'OffsetX');
1079        %DataA1 = DataA1.Data;
1080        %DataA2 = getappdata(handles.figure1,'OffsetY');
1081        %DataA2 = DataA2.Data;
1082
1083        if strcmpi(DataStruct1.Field, 'Monitor') && ~isempty(getfamilydata(DataStruct1.FamilyName,'Setpoint'))
1084            % Update the offset to the setpoint
1085            DataA1 = getsp(DataStruct1, Mode, DataStruct1.Units, 'Numeric');
1086        else
1087            DataA1 = getoffset(DataStruct1, DataStruct1.Units, 'Numeric');
1088        end
1089
1090        if strcmpi(DataStruct2.Field, 'Monitor') && ~isempty(getfamilydata(DataStruct2.FamilyName,'Setpoint'))
1091            % Update the offset to the setpoint
1092            DataA2 = getsp(DataStruct2, Mode, DataStruct2.Units, 'Numeric');
1093        else
1094            DataA2 = getoffset(DataStruct2, DataStruct2.Units, 'Numeric');
1095        end
1096
1097    elseif ChannelA == 4
1098        DataA1 = getappdata(handles.figure1,'SaveX');
1099        DataA1 = DataA1.Data;
1100        DataA2 = getappdata(handles.figure1,'SaveY');
1101        DataA2 = DataA2.Data;
1102    elseif ChannelA == 5
1103        DataA1 = getappdata(handles.figure1,'FileX');
1104        DataA1 = DataA1.Data;
1105        DataA2 = getappdata(handles.figure1,'FileY');
1106        DataA2 = DataA2.Data;
1107    elseif ChannelA == 6
1108        DataA1 = getappdata(handles.figure1,'FileX2');
1109        DataA1 = DataA1.Data;
1110        DataA2 = getappdata(handles.figure1,'FileY2');
1111        DataA2 = DataA2.Data;
1112    else
1113        DataA1 = zeros(size(BPMxList,1),1);
1114        DataA2 = zeros(size(BPMyList,1),1);
1115    end
1116end
1117
1118if Trace1 == 2 || Trace1 == 3 || Trace2 == 2 || Trace2 == 3
1119    if ChannelB == 1
1120        DataB1 = RawX.Data;
1121        DataB2 = RawY.Data;
1122    elseif ChannelB == 2
1123        %DataB1 = getappdata(handles.figure1,'GoldenX');
1124        %DataB1 = DataB1.Data;
1125        %DataB2 = getappdata(handles.figure1,'GoldenY');
1126        %DataB2 = DataB2.Data;
1127
1128        if strcmpi(DataStruct1.Field, 'Monitor') && ~isempty(getfamilydata(DataStruct1.FamilyName,'Setpoint'))
1129            % Display the setpoint golden value
1130            DataB1 = getgolden(DataStruct1, 'Setpoint', DataStruct1.Units, 'Numeric');
1131        else
1132            DataB1 = getgolden(DataStruct1, DataStruct1.Units, 'Numeric');
1133        end
1134
1135        if strcmpi(DataStruct2.Field, 'Monitor') && ~isempty(getfamilydata(DataStruct2.FamilyName,'Setpoint'))
1136            % Display the setpoint golden value
1137            DataB2 = getgolden(DataStruct2, 'Setpoint', DataStruct2.Units, 'Numeric');
1138        else
1139            DataB2 = getgolden(DataStruct2, DataStruct2.Units, 'Numeric');
1140        end
1141
1142    elseif ChannelB == 3
1143        %DataB1 = getappdata(handles.figure1,'OffsetX');
1144        %DataB1 = DataB1.Data;
1145        %DataB2 = getappdata(handles.figure1,'OffsetY');
1146        %DataB2 = DataB2.Data;
1147
1148        if strcmpi(DataStruct1.Field, 'Monitor') && ~isempty(getfamilydata(DataStruct1.FamilyName,'Setpoint'))
1149            % Update the offset to the setpoint
1150            DataB1 = getsp(DataStruct1.FamilyName, DataStruct1.DeviceList, Mode, DataStruct1.Units, 'Numeric');
1151        else
1152            DataB1 = getoffset(DataStruct1, DataStruct1.DeviceList, DataStruct1.Units, 'Numeric');
1153        end
1154
1155        if strcmpi(DataStruct2.Field, 'Monitor') && ~isempty(getfamilydata(DataStruct2.FamilyName,'Setpoint'))
1156            % Update the offset to the setpoint
1157            DataB2 = getsp(DataStruct2, Mode, DataStruct2.Units, 'Numeric');
1158        else
1159            DataB2 = getoffset(DataStruct2, DataStruct2.Units, 'Numeric');
1160        end
1161    elseif ChannelB == 4
1162        DataB1 = getappdata(handles.figure1,'SaveX');
1163        DataB1 = DataB1.Data;
1164
1165        DataB2 = getappdata(handles.figure1,'SaveY');
1166        DataB2 = DataB2.Data;
1167
1168    elseif ChannelB == 5
1169        DataB1 = getappdata(handles.figure1,'FileX');
1170        DataB1 = DataB1.Data;
1171        DataB2 = getappdata(handles.figure1,'FileY');
1172        DataB2 = DataB2.Data;
1173
1174    elseif ChannelB == 6
1175        DataB1 = getappdata(handles.figure1,'FileX2');
1176        DataB1 = DataB1.Data;
1177        DataB2 = getappdata(handles.figure1,'FileY2');
1178        DataB2 = DataB2.Data;
1179    else
1180        DataB1 = zeros(size(BPMxList,1),1);
1181        DataB2 = zeros(size(BPMyList,1),1);
1182    end
1183end
1184
1185
1186% First line
1187if Trace1 == 1
1188    Data1 = DataA1;
1189    Data2 = DataA2;
1190elseif Trace1 == 2
1191    Data1 = DataB1;
1192    Data2 = DataB2;
1193elseif Trace1 == 3
1194    Data1 = DataA1 - DataB1;
1195    Data2 = DataA2 - DataB2;
1196end
1197
1198
1199% Second line
1200if Trace2 == 4
1201    Data3 = NaN * Data1;
1202    Data4 = NaN * Data2;
1203else
1204    if Trace2 == 1
1205        Data3 = DataA1;
1206        Data4 = DataA2;
1207    elseif Trace2 == 2
1208        Data3 = DataB1;
1209        Data4 = DataB2;
1210    elseif Trace2 == 3
1211        Data3 = DataA1 - DataB1;
1212        Data4 = DataA2 - DataB2;
1213    end
1214end
1215
1216
1217
1218% if UnitsFlag == 1 && strcmpi(RawX.Units,'Hardware')
1219%     % Physics units requested, data is in Hardware units
1220%     Data1 = hw2physics(BPMxFamily, 'Monitor', Data1);
1221%     Data2 = hw2physics(BPMyFamily, 'Monitor', Data2);
1222%     Data3 = hw2physics(BPMxFamily, 'Monitor', Data3);
1223%     Data4 = hw2physics(BPMyFamily, 'Monitor', Data4);
1224% elseif (UnitsFlag==2 | UnitsFlag==3) && strcmpi(RawX.Units,'Physics')
1225%     % Hardware units requested, data is in Physics units
1226%     Data1 = physics2hw(BPMxFamily, 'Monitor', Data1);
1227%     Data2 = physics2hw(BPMyFamily, 'Monitor', Data2);
1228%     Data3 = physics2hw(BPMxFamily, 'Monitor', Data3);
1229%     Data4 = physics2hw(BPMyFamily, 'Monitor', Data4);
1230% end
1231
1232UnitsString1 = DataStruct1.UnitsString;
1233UnitsString2 = DataStruct2.UnitsString;
1234% if UnitsFlag == 1
1235%     % Physics units
1236%     UnitsString1 = getfamilydata(DataStruct1.FamilyName, DataStruct1.Field, 'PhysicsUnits');
1237%     UnitsString2 = getfamilydata(DataStruct2.FamilyName, DataStruct2.Field, 'PhysicsUnits');
1238% elseif UnitsFlag == 2
1239%     % Hardware units
1240%     UnitsString1 = getfamilydata(DataStruct1.FamilyName, DataStruct1.Field, 'HWUnits');
1241%     UnitsString2 = getfamilydata(DataStruct2.FamilyName, DataStruct2.Field, 'HWUnits');
1242if UnitsFlag == 3
1243    % Hardware units time 1000
1244    Data1 = 1000 * Data1;
1245    Data2 = 1000 * Data2;
1246    Data3 = 1000 * Data3;
1247    Data4 = 1000 * Data4;
1248    %UnitsString1 = getfamilydata(DataStruct1.FamilyName, DataStruct1.Field, 'HWUnits');
1249    %UnitsString2 = getfamilydata(DataStruct2.FamilyName, DataStruct2.Field, 'HWUnits');
1250    if strcmpi(UnitsString1,'mm')
1251        UnitsString1 = '\mum';
1252    else
1253        %UnitsString1 = ['1000x', UnitsString1];
1254        UnitsString1 = ['milli', UnitsString1];
1255    end
1256    if strcmpi(UnitsString2,'mm')
1257        UnitsString2 = '\mum';
1258    else
1259        %UnitsString2 = ['1000x', UnitsString2];
1260        UnitsString2 = ['milli', UnitsString2];
1261    end
1262end
1263
1264
1265% Axes 1
1266h = get(handles.Graph1,'Children');
1267AxisRange1X = getappdata(handles.figure1, 'AxisRange1X');
1268
1269% Bar graph setup
1270if strcmpi(get(handles.Graph1Bar,'Checked'),'On')
1271    %  #pts  BarWidth
1272    Table = [
1273        0    .01
1274        24    .025
1275        48    .05
1276        120   .10
1277        1000  .3
1278        3000  .40
1279        1e5   .50
1280        ];
1281    L = getfamilydata('Circumference');
1282    WidthScaleFactor = interp1(Table(:,1), Table(:,2), length(Data1), 'linear');
1283    WidthScaleFactor = WidthScaleFactor * (L/length(sx)) / min(diff(sx));
1284end
1285
1286% Don't change the axis (unless it's the first time)
1287if isempty(h)
1288    cla(handles.Graph1);
1289    if strcmpi(get(handles.Graph1Bar,'Checked'),'On')
1290        % Bar graph
1291        h(1) = bar(handles.Graph1, sx, Data1(:), WidthScaleFactor);
1292        hold(handles.Graph1, 'on');
1293        h(2) = bar(handles.Graph1, sx, Data3(:), WidthScaleFactor/2);
1294        hold(handles.Graph1, 'off');
1295        set(h(1),'FaceColor','b');
1296        set(h(1),'EdgeColor','b');
1297        if get(handles.Trace2Off, 'Value')
1298            set(h(2),'FaceColor','k');
1299            set(h(2),'EdgeColor','k');
1300        else
1301            set(h(2),'FaceColor','r');
1302            set(h(2),'EdgeColor','r');
1303        end
1304    else
1305        h = plot(handles.Graph1, sx, [Data1(:) Data3(:)],'.-');
1306        set(h(1),'Color','b');
1307        set(h(2),'Color','r');
1308    end
1309
1310    % plot(handles.Graph1, sx, Data3,'squarer','MarkerSize',3);
1311    % plot(handles.Graph1, sx, Data1,'squareb','MarkerSize',3);
1312
1313    % Set defaults
1314    set(handles.Graph1, 'Nextplot',      'Add');
1315    set(handles.Graph1, 'YGrid',         'On');
1316    set(handles.Graph1, 'YMinorTick',    'On');
1317    set(handles.Graph1, 'XMinorTick',    'On');
1318    set(handles.Graph1, 'XAxisLocation', 'Bottom');
1319    set(handles.Graph1, 'XTickLabel',    '');
1320
1321    a = axis(handles.Graph1);
1322    axis(handles.Graph1, [AxisRange1X(1) AxisRange1X(2) a(3) a(4)]);
1323
1324    if strcmpi(get(handles.('YScaleLog1'),'Checked'),'On')
1325        set(handles.Graph1,'YScale','Log');
1326    else
1327        set(handles.Graph1,'YScale','Linear');
1328    end
1329
1330    set(handles.Graph1 ,'ButtonDownFcn','plotfamily(''Graph1_ButtonDown'',gcbo,[],guidata(gcbo))');
1331    h = get(handles.Graph1,'Children');
1332    for i = 1:length(h)
1333        set(h(i) ,'ButtonDownFcn','plotfamily(''Graph1_ButtonDown'',gcbo,[],guidata(gcbo))');
1334    end
1335else
1336    % This fixes a weird error with srcontrol
1337    h = sort(h(end-1:end));
1338
1339    a = axis(handles.Graph1);
1340    set(h(1), 'XData', sx, 'YData', Data1);
1341    set(h(2), 'XData', sx, 'YData', Data3);
1342
1343    if strcmpi(get(handles.Graph1Bar,'Checked'),'On')
1344        set(h(1),'BarWidth',WidthScaleFactor);
1345        set(h(2),'BarWidth',WidthScaleFactor/2);
1346        if get(handles.Trace2Off, 'Value')
1347            set(h(2),'FaceColor','k');
1348            set(h(2),'EdgeColor','k');
1349        else
1350            set(h(2),'FaceColor','r');
1351            set(h(2),'EdgeColor','r');
1352        end
1353    end
1354
1355    axis(handles.Graph1, [AxisRange1X(1) AxisRange1X(2) a(3) a(4)]);
1356end
1357
1358h_label=get(handles.Graph1,'ylabel');
1359
1360
1361if strcmpi(DataStruct1.Field,'Monitor')
1362    if isempty(UnitsString1)
1363        set(h_label, 'String', sprintf('%s',      DataStruct1.FamilyName), 'Interpreter','None');
1364    elseif strcmpi(UnitsString1,'\mum')
1365        set(h_label, 'String', sprintf('%s [%s]', DataStruct1.FamilyName, UnitsString1), 'Interpreter','Tex');
1366    else
1367        set(h_label, 'String', sprintf('%s [%s]', DataStruct1.FamilyName, UnitsString1), 'Interpreter','None');
1368    end
1369else
1370    if isempty(UnitsString1)
1371        set(h_label, 'String', sprintf('%s.%s',      DataStruct1.FamilyName, DataStruct1.Field), 'Interpreter','None');
1372    elseif strcmpi(UnitsString1,'\mum')
1373        set(h_label, 'String', sprintf('%s.%s [%s]', DataStruct1.FamilyName, DataStruct1.Field, UnitsString1), 'Interpreter','Tex');
1374    else
1375        set(h_label, 'String', sprintf('%s.%s [%s]', DataStruct1.FamilyName, DataStruct1.Field, UnitsString1), 'Interpreter','None');
1376    end
1377end
1378
1379
1380% Graph 3
1381if strcmpi(get(handles.('AddPlot1_Nothing'),'Checked'),'Off')
1382    % Bring Graph 3 forward
1383    axes(handles.Graph3);
1384end
1385
1386% Remove NaN
1387i = find(~isnan(Data1));
1388set(handles.Trace1max,'String',...
1389    sprintf('rms = %.4e     mean = %.4e     min = %.4e     max = %.4e       [%s]', ...
1390    std(Data1(i)), mean(Data1(i)), min(Data1(i)),  max(Data1(i)),  ...
1391    UnitsString1));
1392
1393% Set the list box
1394Value = get(handles.DataList1, 'Value');
1395set(handles.DataList1, 'Value', Value);
1396ListBoxTop = get(handles.DataList1, 'ListBoxTop');
1397set(handles.DataList1, 'String', [DataStruct1.ListBoxString, num2str(Data1(:),'%+.4e')]);
1398set(handles.DataList1, 'ListBoxTop', ListBoxTop);
1399
1400
1401% Axes 2
1402h = get(handles.Graph2,'Children');
1403AxisRange2X = getappdata(handles.figure1, 'AxisRange2X');
1404
1405% Bar graph setup
1406if strcmpi(get(handles.Graph2Bar,'Checked'),'On')
1407    %  #pts  BarWidth
1408    Table = [
1409        0    .01
1410        24    .025
1411        48    .05
1412        120   .10
1413        1000  .3
1414        3000  .40
1415        1e5   .50
1416        ];
1417    L = getfamilydata('Circumference');
1418    WidthScaleFactor = interp1(Table(:,1), Table(:,2), length(Data2), 'linear');
1419    WidthScaleFactor = WidthScaleFactor * (L/length(sy)) / min(diff(sy));
1420end
1421
1422
1423if isempty(h)
1424    cla(handles.Graph2);
1425    if strcmpi(get(handles.Graph2Bar,'Checked'),'On')
1426        % Bar graph
1427        h(1) = bar(handles.Graph2, sy, Data2(:), WidthScaleFactor);
1428        hold(handles.Graph2, 'on');
1429        h(2) = bar(handles.Graph2, sy, Data4(:), WidthScaleFactor/2);
1430        hold(handles.Graph2, 'off');
1431        set(h(1),'FaceColor','b');
1432        set(h(1),'EdgeColor','b');
1433        if get(handles.Trace2Off, 'Value')
1434            set(h(2),'FaceColor','k');
1435            set(h(2),'EdgeColor','k');
1436        else
1437            set(h(2),'FaceColor','r');
1438            set(h(2),'EdgeColor','r');
1439        end
1440    else
1441        h = plot(handles.Graph2, sy, [Data2(:) Data4(:)],'.-');
1442        set(h(1),'Color','b');
1443        set(h(2),'Color','r');
1444    end
1445
1446    % Set defaults
1447    set(handles.Graph2, 'Nextplot',      'Add');
1448    set(handles.Graph2, 'YGrid',         'On');
1449    set(handles.Graph2, 'YMinorTick',    'On');
1450    set(handles.Graph2, 'XMinorTick',    'On');
1451    set(handles.Graph2, 'XAxisLocation', 'Bottom');
1452
1453    a = axis(handles.Graph2);
1454    axis(handles.Graph2, [AxisRange2X(1) AxisRange2X(2) a(3) a(4)])
1455
1456    if strcmpi(get(handles.('YScaleLog2'),'Checked'),'On')
1457        set(handles.Graph2,'YScale','Log');
1458    else
1459        set(handles.Graph2,'YScale','Linear');
1460    end
1461
1462    set(handles.Graph2 ,'ButtonDownFcn','plotfamily(''Graph2_ButtonDown'',gcbo,[],guidata(gcbo))');
1463    h = get(handles.Graph2,'Children');
1464    for i = 1:length(h)
1465        set(h(i) ,'ButtonDownFcn','plotfamily(''Graph2_ButtonDown'',gcbo,[],guidata(gcbo))');
1466    end
1467else
1468    % This fixes a weird error with srcontrol
1469    h = sort(h(end-1:end));
1470
1471    a = axis(handles.Graph2);
1472    set(h(1), 'XData', sy, 'YData', Data2);
1473    set(h(2), 'XData', sy, 'YData', Data4);
1474
1475    if strcmpi(get(handles.Graph2Bar,'Checked'),'On')
1476        set(h(1),'BarWidth',WidthScaleFactor);
1477        set(h(2),'BarWidth',WidthScaleFactor/2);
1478        if get(handles.Trace2Off, 'Value')
1479            set(h(2),'FaceColor','k');
1480            set(h(2),'EdgeColor','k');
1481        else
1482            set(h(2),'FaceColor','r');
1483            set(h(2),'EdgeColor','r');
1484        end
1485    end
1486
1487    %% Add the model orbit to the plot
1488    %[x, y, sx, sy] = modeltwiss('x', 'All');
1489    %h4 = get(handles.Graph4,'children');
1490    %set(h4, 'XData', sx, 'YData', x);
1491    %axis(h4, [AxisRange2X(1) AxisRange2X(2) a(3) a(4)]);
1492
1493    axis(handles.Graph2, [AxisRange2X(1) AxisRange2X(2) a(3) a(4)]);
1494end
1495
1496h_label = get(handles.Graph2,'ylabel');
1497if strcmpi(DataStruct2.Field,'Monitor')
1498    if isempty(UnitsString2)
1499        set(h_label, 'String', sprintf('%s',      DataStruct2.FamilyName), 'Interpreter','None');
1500    elseif strcmpi(UnitsString2,'\mum')
1501        set(h_label, 'String', sprintf('%s [%s]', DataStruct2.FamilyName, UnitsString2), 'Interpreter','Tex');
1502    else
1503        set(h_label, 'String', sprintf('%s [%s]', DataStruct2.FamilyName, UnitsString2), 'Interpreter','None');
1504    end
1505else
1506    if isempty(UnitsString2)
1507        set(h_label, 'String', sprintf('%s.%s',      DataStruct2.FamilyName, DataStruct2.Field), 'Interpreter','None');
1508    elseif strcmpi(UnitsString2,'\mum')
1509        set(h_label, 'String', sprintf('%s.%s [%s]', DataStruct2.FamilyName, DataStruct2.Field, UnitsString2), 'Interpreter','Tex');
1510    else
1511        set(h_label, 'String', sprintf('%s.%s [%s]', DataStruct2.FamilyName, DataStruct2.Field, UnitsString2), 'Interpreter','None');
1512    end
1513end
1514
1515
1516% Graph 4
1517if strcmpi(get(handles.('AddPlot2_Nothing'),'Checked'),'Off')
1518    % Bring Graph 4 forward
1519    axes(handles.Graph4);
1520end
1521
1522
1523% Set the list box header
1524i = find(~isnan(Data2));
1525set(handles.Trace2max,'String', ...
1526    sprintf('rms = %.4e     mean = %.4e     min = %.4e     max = %.4e       [%s]', ...
1527    std(Data2(i)), mean(Data2(i)), min(Data2(i)),  max(Data2(i)),  ...
1528    UnitsString2));
1529
1530
1531% Set the list box
1532Value = get(handles.DataList2,'Value');
1533set(handles.DataList2,'Value', Value);
1534ListBoxTop = get(handles.DataList2,'ListBoxTop');
1535set(handles.DataList2,'String', [DataStruct2.ListBoxString, num2str(Data2(:),'%+.4e')]);
1536set(handles.DataList2, 'ListBoxTop', ListBoxTop);
1537
1538
1539
1540% --- Executes on button press in RawOrbit1.
1541function RawOrbit1_Callback(hObject, eventdata, handles)
1542set(handles.RawOrbit1,'Value', 1);
1543set(handles.GoldenOrbit1,'Value', 0);
1544set(handles.OffsetOrbit1,'Value', 0);
1545set(handles.SaveOrbit1,'Value', 0);
1546set(handles.FileOrbit1,'Value', 0);
1547set(handles.FileOrbit3,'Value', 0);
1548setappdata(handles.figure1, 'ChannelA', 1);
1549plotappdatalocal(handles);
1550%AutoScaleYLocal(handles);
1551
1552% --- Executes on button press in GoldenOrbit1.
1553function GoldenOrbit1_Callback(hObject, eventdata, handles)
1554set(handles.RawOrbit1,'Value', 0);
1555set(handles.GoldenOrbit1,'Value', 1);
1556set(handles.OffsetOrbit1,'Value', 0);
1557set(handles.SaveOrbit1,'Value', 0);
1558set(handles.FileOrbit1,'Value', 0);
1559set(handles.FileOrbit3,'Value', 0);
1560setappdata(handles.figure1, 'ChannelA', 2);
1561plotappdatalocal(handles);
1562%AutoScaleYLocal(handles);
1563
1564% --- Executes on button press in OffsetOrbit1.
1565function OffsetOrbit1_Callback(hObject, eventdata, handles)
1566set(handles.RawOrbit1,'Value', 0);
1567set(handles.GoldenOrbit1,'Value', 0);
1568set(handles.OffsetOrbit1,'Value', 1);
1569set(handles.SaveOrbit1,'Value', 0);
1570set(handles.FileOrbit1,'Value', 0);
1571set(handles.FileOrbit3,'Value', 0);
1572setappdata(handles.figure1, 'ChannelA', 3);
1573plotappdatalocal(handles);
1574%AutoScaleYLocal(handles);
1575
1576% --- Executes on button press in SaveOrbit1.
1577function SaveOrbit1_Callback(hObject, eventdata, handles)
1578set(handles.RawOrbit1,'Value', 0);
1579set(handles.GoldenOrbit1,'Value', 0);
1580set(handles.OffsetOrbit1,'Value', 0);
1581set(handles.SaveOrbit1,'Value', 1);
1582set(handles.FileOrbit1,'Value', 0);
1583set(handles.FileOrbit3,'Value', 0);
1584setappdata(handles.figure1, 'ChannelA', 4);
1585plotappdatalocal(handles);
1586%AutoScaleYLocal(handles);
1587
1588% --- Executes on button press in FileOrbit1.
1589function FileOrbit1_Callback(hObject, eventdata, handles)
1590set(handles.RawOrbit1,'Value', 0);
1591set(handles.GoldenOrbit1,'Value', 0);
1592set(handles.OffsetOrbit1,'Value', 0);
1593set(handles.SaveOrbit1,'Value', 0);
1594set(handles.FileOrbit1,'Value', 1);
1595set(handles.FileOrbit3,'Value', 0);
1596setappdata(handles.figure1, 'ChannelA', 5);
1597plotappdatalocal(handles);
1598%AutoScaleYLocal(handles);
1599
1600
1601% --- Executes on button press in RawOrbit2.
1602function RawOrbit2_Callback(hObject, eventdata, handles)
1603set(handles.RawOrbit2,'Value', 1);
1604set(handles.GoldenOrbit2,'Value', 0);
1605set(handles.OffsetOrbit2,'Value', 0);
1606set(handles.SaveOrbit2,'Value', 0);
1607set(handles.FileOrbit2,'Value', 0);
1608set(handles.FileOrbit4,'Value', 0);
1609setappdata(handles.figure1, 'ChannelB', 1);
1610plotappdatalocal(handles);
1611%AutoScaleYLocal(handles);
1612
1613% --- Executes on button press in GoldenOrbit2.
1614function GoldenOrbit2_Callback(hObject, eventdata, handles)
1615set(handles.RawOrbit2,'Value', 0);
1616set(handles.GoldenOrbit2,'Value', 1);
1617set(handles.OffsetOrbit2,'Value', 0);
1618set(handles.SaveOrbit2,'Value', 0);
1619set(handles.FileOrbit2,'Value', 0);
1620set(handles.FileOrbit4,'Value', 0);
1621setappdata(handles.figure1, 'ChannelB', 2);
1622plotappdatalocal(handles);
1623%AutoScaleYLocal(handles);
1624
1625% --- Executes on button press in OffsetOrbit2.
1626function OffsetOrbit2_Callback(hObject, eventdata, handles)
1627set(handles.RawOrbit2,'Value', 0);
1628set(handles.GoldenOrbit2,'Value', 0);
1629set(handles.OffsetOrbit2,'Value', 1);
1630set(handles.SaveOrbit2,'Value', 0);
1631set(handles.FileOrbit2,'Value', 0);
1632set(handles.FileOrbit4,'Value', 0);
1633setappdata(handles.figure1, 'ChannelB', 3);
1634plotappdatalocal(handles);
1635%AutoScaleYLocal(handles);
1636
1637% --- Executes on button press in SaveOrbit2.
1638function SaveOrbit2_Callback(hObject, eventdata, handles)
1639set(handles.RawOrbit2,'Value', 0);
1640set(handles.GoldenOrbit2,'Value', 0);
1641set(handles.OffsetOrbit2,'Value', 0);
1642set(handles.SaveOrbit2,'Value', 1);
1643set(handles.FileOrbit2,'Value', 0);
1644set(handles.FileOrbit4,'Value', 0);
1645setappdata(handles.figure1, 'ChannelB', 4);
1646plotappdatalocal(handles);
1647%AutoScaleYLocal(handles);
1648
1649% --- Executes on button press in FileOrbit2.
1650function FileOrbit2_Callback(hObject, eventdata, handles)
1651set(handles.RawOrbit2,'Value', 0);
1652set(handles.GoldenOrbit2,'Value', 0);
1653set(handles.OffsetOrbit2,'Value', 0);
1654set(handles.SaveOrbit2,'Value', 0);
1655set(handles.FileOrbit2,'Value', 1);
1656set(handles.FileOrbit4,'Value', 0);
1657setappdata(handles.figure1, 'ChannelB', 5);
1658plotappdatalocal(handles);
1659%AutoScaleYLocal(handles);
1660
1661% --- Executes on button press in FileOrbit3.
1662function FileOrbit3_Callback(hObject, eventdata, handles)
1663% hObject    handle to FileOrbit3 (see GCBO)
1664% eventdata  reserved - to be defined in a future version of MATLAB
1665% handles    structure with handles and user data (see GUIDATA)
1666
1667% Hint: get(hObject,'Value') returns toggle state of FileOrbit3
1668set(handles.RawOrbit1,'Value', 0);
1669set(handles.GoldenOrbit1,'Value', 0);
1670set(handles.OffsetOrbit1,'Value', 0);
1671set(handles.SaveOrbit1,'Value', 0);
1672set(handles.FileOrbit1,'Value', 0);
1673set(handles.FileOrbit3,'Value', 1);
1674setappdata(handles.figure1, 'ChannelA', 6);
1675plotappdatalocal(handles);
1676%AutoScaleYLocal(handles);
1677
1678
1679% --- Executes on button press in FileOrbit4.
1680function FileOrbit4_Callback(hObject, eventdata, handles)
1681% hObject    handle to FileOrbit4 (see GCBO)
1682% eventdata  reserved - to be defined in a future version of MATLAB
1683% handles    structure with handles and user data (see GUIDATA)
1684
1685% Hint: get(hObject,'Value') returns toggle state of FileOrbit4
1686set(handles.RawOrbit2,'Value', 0);
1687set(handles.GoldenOrbit2,'Value', 0);
1688set(handles.OffsetOrbit2,'Value', 0);
1689set(handles.SaveOrbit2,'Value', 0);
1690set(handles.FileOrbit2,'Value', 0);
1691set(handles.FileOrbit4,'Value', 1);
1692setappdata(handles.figure1, 'ChannelB', 6);
1693plotappdatalocal(handles);
1694%AutoScaleYLocal(handles);
1695
1696
1697
1698% --- Executes on button press in SaveOrbit1Now.
1699function SaveOrbit1Now_Callback(hObject, eventdata, handles)
1700RawX = getappdata(handles.figure1,'RawX');
1701RawY = getappdata(handles.figure1,'RawY');
1702setappdata(handles.figure1,'SaveX', RawX);
1703setappdata(handles.figure1,'SaveY', RawY);
1704if isfield(RawY,'TimeStamp')
1705    set(handles.SaveTime,'String', sprintf('%s',datestr(RawY.TimeStamp,0)));
1706else
1707    set(handles.SaveTime,'String', sprintf('%s',datestr(clock,0)));
1708end
1709plotappdatalocal(handles);
1710%AutoScaleYLocal(handles);
1711
1712
1713% --- Executes on button press in LoadOrbit1.
1714function LoadOrbit1_Callback(hObject, eventdata, handles)
1715UnitMenu = getappdata(handles.figure1,'UnitsFlag');
1716if UnitMenu == 1
1717    UnitsFlag = 'Physics';
1718else
1719    UnitsFlag = 'Hardware';
1720end
1721
1722DataStruct1 = getappdata(handles.figure1, 'BPMxFamily');
1723DataStruct2 = getappdata(handles.figure1, 'BPMyFamily');
1724
1725
1726% DirectoryName = getfamilydata('Directory','DataRoot');
1727DirectoryName = getfamilydata('Directory', 'BPMData');
1728[FileName, DirectoryName] = uigetfile('*.mat', 'Select a File', [DirectoryName]);
1729if FileName == 0
1730    return
1731end
1732
1733% Remove .mat
1734%if strcmpi(FileName(end-3:end), '.mat')
1735%    FileName = FileName(1:end-4);
1736%end
1737
1738% Graph 1
1739try
1740    %DataStruct = getdata(DataStruct1.FamilyName, DataStruct1.DeviceList, [DirectoryName FileName], 'Struct');
1741    DataStruct = getdata(DataStruct1.FamilyName, DataStruct1.DeviceList, 'Field', DataStruct1.Field, [DirectoryName FileName], 'Struct');
1742    if UnitMenu == 1 && strcmpi(DataStruct.Units,'Hardware')
1743        % Physics units requested
1744        DataStruct = hw2physics(DataStruct);
1745    elseif (UnitMenu==2 || UnitMenu==3) && strcmpi(DataStruct.Units,'Physics')
1746        % Hardware units requested, data is in Physics units
1747        DataStruct = physics2hw(DataStruct);
1748    end
1749    setappdata(handles.figure1, 'FileX', DataStruct);
1750    setappdata(handles.figure1, 'FileNameX', [DirectoryName FileName]);
1751catch
1752end
1753
1754% Graph 2
1755try
1756    %DataStruct = getdata(DataStruct2.FamilyName, DataStruct2.DeviceList, [DirectoryName FileName], 'Struct');
1757    DataStruct = getdata(DataStruct2.FamilyName, DataStruct2.DeviceList, 'Field', DataStruct2.Field, [DirectoryName FileName], 'Struct');
1758    if UnitMenu == 1 && strcmpi(DataStruct.Units,'Hardware')
1759        % Physics units requested
1760        DataStruct = hw2physics(DataStruct);
1761    elseif (UnitMenu==2 || UnitMenu==3) && strcmpi(DataStruct.Units,'Physics')
1762        % Hardware units requested, data is in Physics units
1763        DataStruct = physics2hw(DataStruct);
1764    end
1765    setappdata(handles.figure1, 'FileY', DataStruct);
1766    setappdata(handles.figure1, 'FileNameY', [DirectoryName FileName]);
1767catch
1768end
1769
1770plotappdatalocal(handles);
1771%AutoScaleYLocal(handles);
1772UpdateFileDisplayLocal(handles);
1773
1774% --- Executes on button press in LoadOrbit2.
1775function LoadOrbit2_Callback(hObject, eventdata, handles)
1776UnitMenu = getappdata(handles.figure1,'UnitsFlag');
1777if UnitMenu == 1
1778    UnitsFlag = 'Physics';
1779else
1780    UnitsFlag = 'Hardware';
1781end
1782
1783DataStruct1 = getappdata(handles.figure1, 'BPMxFamily');
1784DataStruct2 = getappdata(handles.figure1, 'BPMyFamily');
1785
1786
1787% DirectoryName = getfamilydata('Directory','DataRoot');
1788DirectoryName = getfamilydata('Directory', 'BPMData');
1789[FileName, DirectoryName] = uigetfile('*.mat', 'Select a File', [DirectoryName]);
1790if FileName == 0
1791    return
1792end
1793
1794% Remove .mat
1795%if strcmpi(FileName(end-3:end), '.mat')
1796%    FileName = FileName(1:end-4);
1797%end
1798
1799% Graph 1
1800try
1801    %DataStruct = getdata(DataStruct1.FamilyName, DataStruct1.DeviceList, [DirectoryName FileName], 'Struct');
1802    DataStruct = getdata(DataStruct1.FamilyName, DataStruct1.DeviceList, 'Field', DataStruct1.Field, [DirectoryName FileName], 'Struct');
1803    if UnitMenu == 1 && strcmpi(DataStruct.Units,'Hardware')
1804        % Physics units requested
1805        DataStruct = hw2physics(DataStruct);
1806    elseif (UnitMenu==2 || UnitMenu==3) && strcmpi(DataStruct.Units,'Physics')
1807        % Hardware units requested, data is in Physics units
1808        DataStruct = physics2hw(DataStruct);
1809    end
1810    setappdata(handles.figure1, 'FileX2', DataStruct);
1811    setappdata(handles.figure1, 'FileNameX2', [DirectoryName FileName]);
1812catch
1813end
1814
1815% Graph 2
1816try
1817    %DataStruct = getdata(DataStruct2.FamilyName, DataStruct2.DeviceList, [DirectoryName FileName], 'Struct');
1818    DataStruct = getdata(DataStruct2.FamilyName, DataStruct2.DeviceList, 'Field', DataStruct2.Field, [DirectoryName FileName], 'Struct');
1819    if UnitMenu == 1 && strcmpi(DataStruct.Units,'Hardware')
1820        % Physics units requested
1821        DataStruct = hw2physics(DataStruct);
1822    elseif (UnitMenu==2 || UnitMenu==3) && strcmpi(DataStruct.Units,'Physics')
1823        % Hardware units requested, data is in Physics units
1824        DataStruct = physics2hw(DataStruct);
1825    end
1826    setappdata(handles.figure1, 'FileY2', DataStruct);
1827    setappdata(handles.figure1, 'FileNameY2', [DirectoryName FileName]);
1828catch
1829end
1830
1831plotappdatalocal(handles);
1832%AutoScaleYLocal(handles);
1833UpdateFileDisplayLocal2(handles);
1834
1835
1836% --- local function to update filename on the display.
1837function UpdateFileDisplayLocal(handles)
1838
1839FileNameX = getappdata(handles.figure1, 'FileNameX');
1840FileNameY = getappdata(handles.figure1, 'FileNameY');
1841
1842if isempty(FileNameX) && isempty(FileNameY)
1843    set(handles.FileNameX,'String', 'File X: not loaded');
1844    set(handles.FileNameY,'String', 'File Z: not loaded');
1845    drawnow;
1846    return;
1847end
1848
1849if ~isempty(FileNameX)
1850    % Remove directories
1851    i = findstr(FileNameX, filesep);
1852    if ~isempty(i)
1853        FileNameX = FileNameX(i(end)+1:end);
1854    end
1855
1856    % Shorten length
1857    if length(FileNameX) >= 31
1858        % Remove .mat
1859        if strcmpi(FileNameX(end-3:end),'.mat')
1860            FileNameX = FileNameX(1:end-4);  % remove .mat
1861        end
1862
1863        if length(FileNameX) >= 31
1864            FileNameX = FileNameX(1:31);
1865        end
1866    end
1867
1868    set(handles.FileNameX,'String', sprintf('File X: %s', FileNameX));
1869else
1870    set(handles.FileNameX,'String', 'File X1: no data');
1871end
1872
1873if ~isempty(FileNameY)
1874    % Remove directories
1875    i = findstr(FileNameY,filesep);
1876    if ~isempty(i)
1877        FileNameY = FileNameY(i(end)+1:end);
1878    end
1879
1880    % Shorten length
1881    if length(FileNameY) >= 31
1882        % Remove .mat
1883        if strcmpi(FileNameY(end-3:end),'.mat')
1884            FileNameY = FileNameY(1:end-4);  % remove .mat
1885        end
1886        if length(FileNameY) >= 31
1887            FileNameY = FileNameY(1:31);
1888        end
1889    end
1890
1891    %set(handles.FileNameY,'String', sprintf('File 2: %s', FileNameY));
1892    set(handles.FileNameY,'String', sprintf('File Y: %s', FileNameY));
1893else
1894    set(handles.FileNameY,'String', 'File Y1: no data');
1895end
1896
1897set(handles.FileOrbit1,'TooltipString', sprintf('%s', FileNameX));
1898set(handles.FileOrbit2,'TooltipString', sprintf('%s', FileNameX));
1899
1900if strcmpi(FileNameX, FileNameY) && ~isempty(FileNameX)
1901    set(handles.FileNameY,'Visible','off');
1902    set(handles.FileNameX,'String', sprintf('%s', FileNameX));
1903    %p = get(handles.FileNameX,'Position');
1904    %set(handles.FileName,'Position', [p(1) 4 p(3) p(4)]);   % Points
1905    %set(handles.FileNameX,'Position', [p(1) .4 p(3) p(4)]);   % Characters
1906    %p = get(handles.SaveTime,'Position');
1907    %set(handles.SaveTime,'Position', [p(1) 16.5 p(3) p(4)]);  % Points
1908    %set(handles.SaveTime,'Position', [p(1) 1.6 p(3) p(4)]);    % Characters
1909else
1910    %p = get(handles.FileNameX,'Position');
1911    %set(handles.FileName,'Position', [p(1) 10 p(3) p(4)]);  % Points
1912    %set(handles.FileNameX,'Position', [p(1) 1.1 p(3) p(4)]);  % Characters
1913    set(handles.FileNameY,'Visible','on');
1914    %p = get(handles.SaveTime,'Position');
1915    %set(handles.SaveTime,'Position', [p(1) 20 p(3) p(4)]);  % Points
1916    %set(handles.SaveTime,'Position', [p(1) 2.0 p(3) p(4)]);  % Characters
1917end
1918
1919drawnow;
1920
1921% --- local function to update filenamex2 on the display.
1922function UpdateFileDisplayLocal2(handles)
1923
1924FileNameX2 = getappdata(handles.figure1, 'FileNameX2');
1925FileNameY2 = getappdata(handles.figure1, 'FileNameY2');
1926
1927if isempty(FileNameX2) && isempty(FileNameY2)
1928    set(handles.FileNameX2,'String', 'NoData');
1929    set(handles.FileNameY2,'String', 'NoData');
1930    drawnow;
1931    return;
1932end
1933
1934if ~isempty(FileNameX2)
1935    % Remove directories
1936    i = findstr(FileNameX2, filesep);
1937    if ~isempty(i)
1938        FileNameX2 = FileNameX2(i(end)+1:end);
1939    end
1940   
1941    % Shorten length
1942    if length(FileNameX2) >= 31
1943        % Remove .mat
1944        if strcmpi(FileNameX2(end-3:end),'.mat')
1945            FileNameX2 = FileNameX2(1:end-4);  % remove .mat
1946        end
1947       
1948        if length(FileNameX2) >= 31
1949            FileNameX2 = FileNameX2(1:31);
1950        end
1951    end
1952
1953    %set(handles.filenamex2,'String', sprintf('File 1: %s', FileNameX));
1954    set(handles.FileNameX2,'String', sprintf('%s', FileNameX2));
1955else
1956    set(handles.FileNameX2,'String', 'File X2: no data');
1957end
1958
1959if ~isempty(FileNameY2)
1960    % Remove directories
1961    i = findstr(FileNameY2,filesep);
1962    if ~isempty(i)
1963        FileNameY2 = FileNameY2(i(end)+1:end);
1964    end
1965   
1966    % Shorten length
1967    if length(FileNameY2) >= 31
1968        % Remove .mat
1969        if strcmpi(FileNameY2(end-3:end),'.mat')
1970            FileNameY2 = FileNameY2(1:end-4);  % remove .mat
1971        end
1972        if length(FileNameY2) >= 31
1973            FileNameY2 = FileNameY2(1:31);
1974        end
1975    end
1976   
1977    %set(handles.filenamey2,'String', sprintf('File 2: %s', FileNameY));
1978    set(handles.FileNameY2,'String', sprintf('%s', FileNameY2));
1979else
1980    set(handles.FileNameY2,'String', 'File Y2: no data');
1981end
1982
1983set(handles.FileOrbit3,'TooltipString', sprintf('%s', FileNameX2));
1984set(handles.FileOrbit4,'tooltipString', sprintf('%s', FileNameX2));
1985
1986if strcmpi(FileNameX2, FileNameY2) && ~isempty(FileNameX2)
1987    set(handles.FileNameY2,'Visible','off');
1988    set(handles.FileNameX2,'String', sprintf('%s', FileNameX2));
1989    %p = get(handles.filenamex2,'Position');
1990    %set(handles.filenamex2,'Position', [p(1) 4 p(3) p(4)]);   % Points
1991    %set(handles.filenamex2,'Position', [p(1) .4 p(3) p(4)]);  % Characters
1992    %set(handles.filenamex2,'Position', [p(1) 0.02 p(3) p(4)]); % Normalized
1993    %p = get(handles.SaveTime,'Position');
1994    %set(handles.SaveTime,'Position', [p(1) 16.5 p(3) p(4)]);   % Points
1995    %set(handles.SaveTime,'Position', [p(1) 1.6 p(3) p(4)]);    % Characters
1996    %set(handles.SaveTime,'Position', [p(1) 0.052 p(3) p(4)]);   % Normalized
1997else
1998    %p = get(handles.filenamex2,'Position');
1999    %set(handles.filenamex2,'Position', [p(1) 10 p(3) p(4)]);  % Points
2000    %set(handles.filenamex2,'Position', [p(1) 1.1 p(3) p(4)]);  % Characters
2001    %set(handles.filenamex2,'Position', [p(1) 0.025 p(3) p(4)]);  % Normalized
2002    set(handles.FileNameY2,'Visible','on');
2003    %p = get(handles.SaveTime,'Position');
2004    %set(handles.SaveTime,'Position', [p(1) 20 p(3) p(4)]);  % Points
2005    %set(handles.SaveTime,'Position', [p(1) 2.0 p(3) p(4)]);  % Characters
2006    %set(handles.SaveTime,'Position', [p(1) 0.055 p(3) p(4)]);  % Normalized
2007end
2008
2009drawnow;
2010
2011% --- Executes on button press in Display1.
2012function Display1_Callback(hObject, eventdata, handles)
2013set(handles.DisplayDiff,'Value', 0);
2014set(handles.Display1,'Value', 1);
2015set(handles.Display2,'Value', 0);
2016setappdata(handles.figure1,'Trace1',1);
2017plotappdatalocal(handles);
2018%AutoScaleYLocal(handles);
2019
2020% --- Executes on button press in Display2.
2021function Display2_Callback(hObject, eventdata, handles)
2022set(handles.DisplayDiff,'Value', 0);
2023set(handles.Display1,'Value', 0);
2024set(handles.Display2,'Value', 1);
2025setappdata(handles.figure1,'Trace1',2);
2026plotappdatalocal(handles);
2027%AutoScaleYLocal(handles);
2028
2029% --- Executes on button press in DisplayDiff.
2030function DisplayDiff_Callback(hObject, eventdata, handles)
2031set(handles.DisplayDiff,'Value', 1);
2032set(handles.Display1,'Value', 0);
2033set(handles.Display2,'Value', 0);
2034setappdata(handles.figure1,'Trace1',3);
2035plotappdatalocal(handles);
2036%AutoScaleYLocal(handles);
2037
2038
2039% --- Executes on button press in Trace2A.
2040function Trace2A_Callback(hObject, eventdata, handles)
2041set(handles.Trace2A,'Value', 1);
2042set(handles.Trace2B,'Value', 0);
2043set(handles.Trace2A_B,'Value', 0);
2044set(handles.Trace2Off,'Value', 0);
2045setappdata(handles.figure1,'Trace2',1);
2046plotappdatalocal(handles);
2047%AutoScaleYLocal(handles);
2048
2049% --- Executes on button press in Trace2B.
2050function Trace2B_Callback(hObject, eventdata, handles)
2051set(handles.Trace2A,'Value', 0);
2052set(handles.Trace2B,'Value', 1);
2053set(handles.Trace2A_B,'Value', 0);
2054set(handles.Trace2Off,'Value', 0);
2055setappdata(handles.figure1,'Trace2',2);
2056plotappdatalocal(handles);
2057%AutoScaleYLocal(handles);
2058
2059% --- Executes on button press in Trace2A_B.
2060function Trace2A_B_Callback(hObject, eventdata, handles)
2061set(handles.Trace2A,'Value', 0);
2062set(handles.Trace2B,'Value', 0);
2063set(handles.Trace2A_B,'Value', 1);
2064set(handles.Trace2Off,'Value', 0);
2065setappdata(handles.figure1,'Trace2',3);
2066plotappdatalocal(handles);
2067%AutoScaleYLocal(handles);
2068
2069% --- Executes on button press in Trace2Off.
2070function Trace2Off_Callback(hObject, eventdata, handles)
2071set(handles.Trace2A,'Value', 0);
2072set(handles.Trace2B,'Value', 0);
2073set(handles.Trace2A_B,'Value', 0);
2074set(handles.Trace2Off,'Value', 1);
2075setappdata(handles.figure1,'Trace2',4);
2076plotappdatalocal(handles);
2077%AutoScaleYLocal(handles);
2078
2079
2080% --- Executes on selection change in DataList1.
2081function DataList1_Callback(hObject, eventdata, handles)
2082if strcmpi(get(handles.Simulate,'Checked'),'On')
2083    Mode = 'Simulator';
2084else
2085    Mode = 'Online';
2086end
2087
2088i = get(hObject,'Value');
2089DataStruct = getappdata(handles.figure1, 'BPMxFamily');
2090
2091Family = DataStruct.FamilyName;
2092Field = DataStruct.Field;
2093List = DataStruct.DeviceList;
2094[tmp,ao] = isfamily(Family);
2095
2096if strcmpi(Field, 'Monitor')
2097    Field = 'Setpoint';
2098end
2099
2100set(handles.DataList1, 'TooltipString', cell2mat(family2tangodev(Family,List(i,:))));
2101
2102if isfield(ao, Field)
2103    if getappdata(handles.figure1,'UnitsFlag') == 1
2104        UnitsFlag = 'Physics';
2105    else
2106        UnitsFlag = 'Hardware';
2107    end
2108
2109    % Get/save the present setpoint then call the GUI for setpoint changes
2110    try
2111        SP = getpv(Family, Field, List(i,:), Mode, UnitsFlag, 'Struct');
2112        set(handles.SetpointSlider,     'UserData', SP);
2113        set(handles.SetpointPushButton, 'UserData', SP);
2114
2115        SetpointGUI_Callback(hObject, eventdata, handles);
2116    catch
2117        fprintf('   Trouble finding the present value of %s.%s(%d,%d)\n',Family, Field, List(i,:));
2118    end
2119end
2120
2121
2122% --- Executes on selection change in DataList2.
2123function DataList2_Callback(hObject, eventdata, handles)
2124if strcmpi(get(handles.Simulate,'Checked'),'On')
2125    Mode = 'Simulator';
2126else
2127    Mode = 'Online';
2128end
2129
2130i = get(hObject,'Value');
2131DataStruct = getappdata(handles.figure1, 'BPMyFamily');
2132
2133Family = DataStruct.FamilyName;
2134Field = DataStruct.Field;
2135List = DataStruct.DeviceList;
2136[tmp,ao] = isfamily(Family);
2137
2138if strcmpi(Field, 'Monitor')
2139    Field = 'Setpoint';
2140end
2141
2142set(handles.DataList2, 'TooltipString', cell2mat(family2tangodev(Family,List(i,:))));
2143
2144if isfield(ao, Field)
2145    if getappdata(handles.figure1,'UnitsFlag') == 1
2146        UnitsFlag = 'Physics';
2147    else
2148        UnitsFlag = 'Hardware';
2149    end
2150
2151    % Get/save the present setpoint then call the GUI for setpoint changes
2152    try
2153        SP = getpv(Family, Field, List(i,:), Mode, UnitsFlag, 'Struct');
2154        set(handles.SetpointSlider, 'UserData', SP);
2155        set(handles.SetpointPushButton, 'UserData', SP);
2156
2157        SetpointGUI_Callback(hObject, eventdata, handles);
2158    catch
2159        fprintf('   Trouble finding the present value of %s.%s(%d,%d)\n',Family, Field, List(i,:));
2160    end
2161end
2162
2163
2164
2165%%%%%%%%%%%%%%%%%%
2166% MENU CALLBACKS %
2167%%%%%%%%%%%%%%%%%%
2168
2169% --------------------------------------------------------------------
2170function PopPlot_Callback(hObject, eventdata, handles)
2171a = figure;
2172b = copyobj(handles.Graph1, a);
2173set(b, 'Position', [0.1300    0.5811    0.7750    0.3439]);
2174set(b, 'ButtonDownFcn','');
2175set(b, 'XAxisLocation','Bottom');
2176
2177b = copyobj(handles.Graph2, a);
2178set(b, 'Position', [0.1300    0.1100    0.7750    0.3439]);
2179set(b, 'ButtonDownFcn','');
2180xlabel(b, 'Position [meters]');
2181
2182Data = getappdata(handles.figure1, 'RawY');
2183if isfield(Data, 'TimeStamp')
2184    addlabel(1,0,datestr(Data.TimeStamp,21));
2185end
2186orient tall
2187
2188
2189% --------------------------------------------------------------------
2190function PopPlot1_Callback(hObject, eventdata, handles)
2191%set(handles.figure1, 'HandleVisibility','Callback');
2192
2193a = figure;
2194b = copyobj(handles.Graph1, a);
2195set(b, 'Position',[0.13 0.11 0.775 0.815]);
2196set(b, 'ButtonDownFcn','');
2197set(b, 'XAxisLocation','Bottom');
2198Axis1 = axis;
2199
2200if strcmpi(get(handles.AddPlot1_Nothing,'Checked'),'Off')
2201    set(b, 'Position',[0.13 0.11 0.775 0.7]);
2202    c = copyobj(handles.Graph3, a);
2203
2204    % Plot on top of each other
2205    %set(c, 'Position',[0.13 0.11 0.775 0.815]);
2206
2207    % Separate plots
2208    set(c, 'Position',[0.13 0.11+.72 0.775 0.12]);
2209
2210    set(c,'color',[1 1 1]);
2211    set(c,'Visible','On');
2212    set(c,'XAxisLocation','Top');
2213    set(c,'XTick',get(b,'XTick'));
2214    %set(c,'XTickLabel',get(b,'XTickLabel'));
2215    set(c,'XTickLabel',[]);
2216    set(c,'XMinorTick','On');
2217    set(c,'XMinorGrid','Off');
2218    set(c,'XGrid','Off');
2219    set(c,'YGrid','Off');
2220    set(c,'XAxisLocation','Bottom');
2221    set(c,'YAxisLocation','Left');
2222    %set(c,'YAxisLocation','Right');
2223    set(c,'YTick',[]);
2224    set(c,'YMinorTick','Off');
2225    set(c,'YMinorGrid','Off');
2226    set(c,'YTickLabel',[]);
2227    axis(c,'tight');
2228    Axis2 = axis(c);
2229    axis(c,[Axis1(1) Axis1(2) Axis2(3)-.2*(Axis2(4)-Axis2(3)) Axis2(4)+.2*(Axis2(4)-Axis2(3))]);
2230
2231    set(c, 'ButtonDownFcn','');
2232
2233    if strcmpi(get(handles.AddPlot1_BetaX,'Checked'),'On')
2234        ylabel(c, 'Beta X');
2235    end
2236    if strcmpi(get(handles.AddPlot1_BetaY,'Checked'),'On')
2237        ylabel(c, 'Beta Y');
2238    end
2239    if strcmpi(get(handles.AddPlot1_DispX,'Checked'),'On')
2240        ylabel(c, 'Disp X');
2241    end
2242    if strcmpi(get(handles.AddPlot1_DispY,'Checked'),'On')
2243        ylabel(c, 'Disp Y');
2244    end
2245end
2246xlabel(b, 'Position [meters]');
2247Data = getappdata(handles.figure1, 'RawX');
2248if isfield(Data, 'TimeStamp') && ~isempty(Data.TimeStamp)
2249    addlabel(1,0,datestr(Data.TimeStamp,21));
2250end
2251orient portrait
2252
2253
2254% --------------------------------------------------------------------
2255function PopPlot2_Callback(hObject, eventdata, handles)
2256set(handles.Graph2, 'HandleVisibility', 'Callback');
2257
2258a = figure;
2259b = copyobj(handles.Graph2, a);
2260set(b, 'Position',[0.13 0.11 0.775 0.815]);
2261set(b, 'ButtonDownFcn','');
2262Axis1 = axis;
2263
2264if strcmpi(get(handles.AddPlot2_Nothing,'Checked'),'Off')
2265    set(b, 'Position',[0.13 0.11 0.775 0.7]);
2266    c = copyobj(handles.Graph4, a);
2267
2268    % Plot on top of each other
2269    %set(c, 'Position',[0.13 0.11 0.775 0.815]);
2270
2271    % Separate plots
2272    set(c, 'Position',[0.13 0.11+.72 0.775 0.12]);
2273
2274    set(c,'color',[1 1 1]);
2275    set(c,'Visible','On');
2276    set(c,'XAxisLocation','Top');
2277    set(c,'XTick',get(b,'XTick'));
2278    set(c,'XTickLabel',get(b,'XTickLabel'));
2279    %set(c,'XTickLabel',[]);
2280    set(c,'XMinorTick','On');
2281    set(c,'XMinorGrid','Off');
2282    set(c,'XGrid','Off');
2283    set(c,'YGrid','Off');
2284    set(c,'YAxisLocation','Left');
2285
2286    % Turn y-axis on
2287    set(c,'YTick',[]);
2288    set(c,'YMinorTick','Off');
2289    set(c,'YMinorGrid','Off');
2290    set(c,'YTickLabel',[]);
2291    axis(c,'tight');
2292    Axis2 = axis(c);
2293    axis(c,[Axis1(1) Axis1(2) Axis2(3)-.2*(Axis2(4)-Axis2(3)) Axis2(4)+.2*(Axis2(4)-Axis2(3))]);
2294
2295    set(c, 'ButtonDownFcn','');
2296
2297    if strcmpi(get(handles.AddPlot2_BetaX,'Checked'),'On')
2298        ylabel(c,'Beta X');
2299    end
2300    if strcmpi(get(handles.AddPlot2_BetaY,'Checked'),'On')
2301        ylabel(c,'Beta Y');
2302    end
2303    if strcmpi(get(handles.AddPlot2_DispX,'Checked'),'On')
2304        ylabel(c,'Disp X');
2305    end
2306    if strcmpi(get(handles.AddPlot2_DispY,'Checked'),'On')
2307        ylabel(c,'Disp Y');
2308    end
2309end
2310xlabel('Position [meters]');
2311Data = getappdata(handles.figure1, 'RawY');
2312if isfield(Data, 'TimeStamp') && ~isempty(Data.TimeStamp)
2313    addlabel(1,0,datestr(Data.TimeStamp,21));
2314end
2315orient portrait
2316
2317
2318% --------------------------------------------------------------------
2319function Axis1_Callback(hObject, eventdata, handles)
2320a = axis(handles.Graph1);
2321a = a(3:4);
2322answer = inputdlg('New upper graph vertical axis [2 element vector]','',1,{sprintf('[%s]',num2str(a))});
2323if ~isempty(answer)
2324    a = str2num(answer{1});
2325    if length(a) == 2
2326        set(handles.Graph1, 'YLim', a);
2327    else
2328        fprintf('   Vertical axis needs to be a 2 element vector.\n');
2329    end
2330end
2331
2332
2333% --------------------------------------------------------------------
2334function Axis2_Callback(hObject, eventdata, handles)
2335a = axis(handles.Graph2);
2336a = a(3:4);
2337answer = inputdlg('New lower graph vertical axis [2 element vector]','',1,{sprintf('[%s]',num2str(a))});
2338if ~isempty(answer)
2339    a = str2num(answer{1});
2340    if length(a) == 2
2341        set(handles.Graph2, 'YLim', a);
2342    else
2343        fprintf('   Vertical axis needs to be a 2 element vector.\n');
2344    end
2345end
2346
2347
2348% --------------------------------------------------------------------
2349function HorizontalAxis_Callback(hObject, eventdata, handles) %#ok<DEFNU>
2350a = axis(handles.Graph2);
2351a = a(1:2);
2352answer = inputdlg('New horizontal axis [2 element vector]','',1,{sprintf('[%s]',num2str(a))});
2353if ~isempty(answer)
2354    a = str2num(answer{1});
2355    if length(a) == 2
2356        set(handles.Graph1, 'XLim', a);
2357        set(handles.Graph2, 'XLim', a);
2358        set(handles.Graph3, 'XLim', a);
2359        set(handles.Graph4, 'XLim', a);
2360        set(handles.LatticeAxes, 'XLim', a);
2361        setappdata(handles.figure1, 'AxisRange1X', a(:)');
2362        setappdata(handles.figure1, 'AxisRange2X', a(:)');
2363    else
2364        fprintf('   Horizontal axis needs to be a 2 element vector.\n');
2365    end
2366end
2367
2368
2369% --------------------------------------------------------------------
2370function HorizontalAxisSector_Callback(hObject, eventdata, handles) %#ok<DEFNU>
2371a = eventdata;
2372if length(a) == 2
2373    set(handles.Graph1, 'XLim', a);
2374    set(handles.Graph2, 'XLim', a);
2375    set(handles.Graph3, 'XLim', a);
2376    set(handles.Graph4, 'XLim', a);
2377    set(handles.LatticeAxes, 'XLim', a);
2378
2379    setappdata(handles.figure1, 'AxisRange1X', a(:)');
2380    setappdata(handles.figure1, 'AxisRange2X', a(:)');
2381else
2382    fprintf('   Horizontal axis needs to be a 2 element vector.\n');
2383end
2384
2385
2386
2387
2388% --------------------------------------------------------------------
2389function YScaleLog1_Callback(hObject, eventdata, handles)
2390if ~strcmpi(get(handles.Graph1Bar,'Checked'),'On')
2391    set(handles.Graph1,'YScale','Log');
2392    set(handles.YScaleLog1,'Checked','On');
2393    set(handles.YScaleLinear1,'Checked','Off');
2394    drawnow;
2395else
2396    fprintf('   Log scale not allowed for bar graphs\n');
2397end
2398
2399% --------------------------------------------------------------------
2400function YScaleLinear1_Callback(hObject, eventdata, handles)
2401set(handles.Graph1,'YScale','Linear');
2402set(handles.YScaleLog1,'Checked','Off');
2403set(handles.YScaleLinear1,'Checked','On');
2404drawnow;
2405
2406
2407% --------------------------------------------------------------------
2408function YScaleLog2_Callback(hObject, eventdata, handles)
2409if ~strcmpi(get(handles.Graph2Bar,'Checked'),'On')
2410    set(handles.Graph2,'YScale','Log');
2411    set(handles.YScaleLog2,'Checked','On');
2412    set(handles.YScaleLinear2,'Checked','Off');
2413    drawnow;
2414else
2415    fprintf('   Log scale not allowed for bar graphs\n');
2416end
2417
2418% --------------------------------------------------------------------
2419function YScaleLinear2_Callback(hObject, eventdata, handles)
2420set(handles.Graph2,'YScale','Linear');
2421set(handles.YScaleLog2,'Checked','Off');
2422set(handles.YScaleLinear2,'Checked','On');
2423drawnow;
2424
2425
2426% --------------------------------------------------------------------
2427function DataStruct = CreateListboxString(DataStruct)
2428%DataStruct.ListBoxString = strcat(family2common(DataStruct.FamilyName, DataStruct.DeviceList),'=');
2429DataStruct.ListBoxString = [];
2430for i = 1:size(DataStruct.DeviceList,1)
2431    DataStruct.ListBoxString = strvcat(DataStruct.ListBoxString, sprintf('%s(%d,%d) = ', DataStruct.FamilyName, DataStruct.DeviceList(i,1), DataStruct.DeviceList(i,2)));
2432end
2433
2434% --------------------------------------------------------------------
2435function BPMxFamily_Callback(hObject, eventdata, handles)
2436UnitMenu = getappdata(handles.figure1,'UnitsFlag');
2437if UnitMenu == 1
2438    UnitsFlag = 'Physics';
2439else
2440    UnitsFlag = 'Hardware';
2441end
2442
2443if strcmpi(get(handles.Simulate,'Checked'),'On')
2444    Mode = 'Simulator';
2445else
2446    Mode = 'Online';
2447end
2448
2449if isempty(hObject)
2450    close(gcbf);
2451    error('PLOTFAMILY:  Menu corrupted, restart application.');
2452else
2453    DataStruct = get(hObject, 'UserData');
2454end
2455
2456% Rebuild the data structure in case a status field was changed
2457DataStruct = family2datastruct(DataStruct.FamilyName, DataStruct.Field);
2458
2459if isfamily(DataStruct)
2460    % Create the list box string
2461    DataStruct = CreateListboxString(DataStruct);
2462
2463    setappdata(handles.figure1, 'BPMxFamily', DataStruct);
2464
2465    s = getspos(DataStruct);
2466    setappdata(handles.figure1, 'SPosX', s);
2467
2468    %L = getfamilydata('Circumference');
2469    %if isempty(L)
2470    %    setappdata(handles.figure1, 'AxisRange1X', [min(s) max(s)]);
2471    %else
2472    %    setappdata(handles.figure1, 'AxisRange1X', [0 L]);
2473    %end
2474
2475    ZeroData = DataStruct;
2476    ZeroData.Data = zeros(size(DataStruct.Data,1),1);
2477
2478    % Menu label
2479    set(handles.BPMxFamily,'Label',sprintf('Plot: %s.%s', DataStruct.FamilyName, DataStruct.Field));
2480
2481    setappdata(handles.figure1,'SaveX', ZeroData);
2482    tmp = getappdata(handles.figure1,'SaveY');
2483    tmp.Data = 0 * tmp.Data;
2484    setappdata(handles.figure1,'SaveY', tmp);
2485    set(handles.SaveTime,'String', 'Not saved');
2486
2487    %     % Look for the golden values
2488    %     try
2489    %         if strcmpi(DataStruct.Field,'Monitor')
2490    %             % Use the golden setpoint
2491    %             GoldenValues = getgolden(DataStruct.FamilyName, DataStruct.DeviceList, 'Setpoint', UnitsFlag, 'Struct');
2492    %         else
2493    %             GoldenValues = getgolden(DataStruct, UnitsFlag, 'Struct');
2494    %         end
2495    %         setappdata(handles.figure1, 'GoldenX', GoldenValues);
2496    %     catch
2497    %         setappdata(handles.figure1, 'GoldenX', ZeroData);
2498    %     end
2499    %
2500    %     % Look for the offset values
2501    %     try
2502    %         OffsetValues = getoffset(DataStruct, UnitsFlag, 'Struct');
2503    %         setappdata(handles.figure1, 'OffsetX', OffsetValues);
2504    %     catch
2505    %         try
2506    %             % If and offset does not exist than try using the setpoint
2507    %             setappdata(handles.figure1, 'OffsetX', getsp(DataStruct.FamilyName, DataStruct.DeviceList, Mode, UnitsFlag, 'Struct'));
2508    %         catch
2509    %             % Use zeros
2510    %             setappdata(handles.figure1, 'OffsetX', ZeroData);
2511    %         end
2512    %     end
2513    try
2514        FileName = getappdata(handles.figure1, 'FileNameX');
2515        if isempty(FileName)
2516            FileName = getappdata(handles.figure1, 'FileNameY');
2517        end
2518    catch
2519    end
2520
2521    try
2522        FileName = getappdata(handles.figure1, 'FileNameX');
2523        if isempty(FileName)
2524            setappdata(handles.figure1,'FileX', ZeroData);
2525        else
2526            tmp = getdata(DataStruct.FamilyName, DataStruct.DeviceList, FileName, 'Struct');
2527            if UnitMenu == 1 && strcmpi(tmp.Units,'Hardware')
2528                % Physics units requested, data is in Hardware units
2529                tmp = hw2physics(tmp);
2530            else
2531                % Hardware units requested, data is in Physics units
2532                tmp = physics2hw(tmp);
2533            end
2534            setappdata(handles.figure1,'FileX', tmp);
2535            setappdata(handles.figure1,'FileNameX', FileName);
2536        end
2537    catch
2538        setappdata(handles.figure1,'FileX', ZeroData);
2539        setappdata(handles.figure1,'FileNameX','');
2540    end
2541
2542    try
2543        FileName = getappdata(handles.figure1, 'FileNameX2');
2544        if isempty(FileName)
2545            FileName = getappdata(handles.figure1, 'FileNameY2');
2546        end
2547    catch
2548    end
2549
2550    try
2551        FileName = getappdata(handles.figure1, 'FileNameX2');
2552        if isempty(FileName)
2553            setappdata(handles.figure1,'FileX2', ZeroData);
2554        else
2555            tmp = getdata(DataStruct.FamilyName, DataStruct.DeviceList, FileName, 'Struct');
2556            if UnitMenu == 1 && strcmpi(tmp.Units,'Hardware')
2557                % Physics units requested, data is in Hardware units
2558                tmp = hw2physics(tmp);
2559            else
2560                % Hardware units requested, data is in Physics units
2561                tmp = physics2hw(tmp);
2562            end
2563            setappdata(handles.figure1,'FileX2', tmp);
2564            setappdata(handles.figure1,'FileNameX2', FileName);
2565        end
2566    catch
2567        setappdata(handles.figure1,'FileX2', ZeroData);
2568        setappdata(handles.figure1,'FileNameX2','');
2569    end
2570
2571    % Make sure the scale is linear for bar plots
2572    if strcmpi(get(handles.Graph1Bar,'Checked'),'On')
2573        set(handles.Graph1,'YScale','Linear');
2574        set(handles.YScaleLog1,'Checked','Off');
2575        set(handles.YScaleLinear1,'Checked','On');
2576    end
2577
2578    set(handles.DataList1,'Value', 1);
2579    set(handles.DataList1,'ListBoxTop', 1);
2580    UpdateFileDisplayLocal(handles);
2581    OneShot_Callback(hObject, eventdata, handles);
2582
2583    % Auto scale y-axis
2584    % AutoScaleYLocal(handles);
2585    a = axis(handles.Graph1);
2586    axis(handles.Graph1, 'auto');
2587    set(handles.Graph1, 'XLim', a(1:2));
2588
2589else
2590    fprintf('   %s is not a known family\n', DataStruct.FamilyName);
2591end
2592
2593
2594% --------------------------------------------------------------------
2595function BPMyFamily_Callback(hObject, eventdata, handles)
2596UnitMenu = getappdata(handles.figure1,'UnitsFlag');
2597if UnitMenu == 1
2598    UnitsFlag = 'Physics';
2599else
2600    UnitsFlag = 'Hardware';
2601end
2602
2603if strcmpi(get(handles.Simulate,'Checked'),'On')
2604    Mode = 'Simulator';
2605else
2606    Mode = 'Online';
2607end
2608
2609if isempty(hObject)
2610    close(gcbf);
2611    error('PLOTFAMILY:  Menu corrupted, restart application.');
2612else
2613    DataStruct = get(hObject, 'UserData');
2614end
2615
2616% Rebuild the data structure in case a status field was changed
2617DataStruct = family2datastruct(DataStruct.FamilyName, DataStruct.Field);
2618
2619if isfamily(DataStruct)
2620     % Create the list box string
2621    DataStruct = CreateListboxString(DataStruct);
2622
2623    setappdata(handles.figure1, 'BPMyFamily', DataStruct);
2624
2625    s = getspos(DataStruct);
2626    setappdata(handles.figure1, 'SPosY', s);
2627    %L = getfamilydata('Circumference');
2628    %if isempty(L)
2629    %    setappdata(handles.figure1, 'AxisRange2X', [min(s) max(s)]);
2630    %else
2631    %    setappdata(handles.figure1, 'AxisRange2X', [0 L]);
2632    %end
2633
2634    ZeroData = DataStruct;
2635    ZeroData.Data = zeros(size(DataStruct.Data,1),1);
2636
2637    % Menu label
2638    set(handles.BPMyFamily,'Label',sprintf('Plot: %s.%s', DataStruct.FamilyName, DataStruct.Field));
2639
2640    setappdata(handles.figure1,'SaveY', ZeroData);
2641    tmp = getappdata(handles.figure1,'SaveX');
2642    tmp.Data = 0 * tmp.Data;
2643    setappdata(handles.figure1,'SaveX', tmp);
2644    set(handles.SaveTime,'String', '');
2645
2646    %     % Look for the golden values
2647    %     try
2648    %         if strcmpi(DataStruct.Field,'Monitor')
2649    %             % Use the golden setpoint
2650    %             GoldenValues = getgolden(DataStruct.FamilyName, DataStruct.DeviceList, 'Setpoint', UnitsFlag, 'Struct');
2651    %         else
2652    %             GoldenValues = getgolden(DataStruct, UnitsFlag, 'Struct');
2653    %         end
2654    %         setappdata(handles.figure1,'GoldenY', GoldenValues);
2655    %     catch
2656    %         setappdata(handles.figure1, 'GoldenY', ZeroData);
2657    %     end
2658    %
2659    %     % Look for the offset values
2660    %     try
2661    %         OffsetValues = getoffset(DataStruct, UnitsFlag, 'Struct');
2662    %         setappdata(handles.figure1,'OffsetY', OffsetValues);
2663    %     catch
2664    %         try
2665    %             % If and offset does not exist than try using the setpoint
2666    %             setappdata(handles.figure1, 'OffsetY', getsp(DataStruct.FamilyName, DataStruct.DeviceList, Mode, UnitsFlag, 'Struct'));
2667    %         catch
2668    %             % Use zeros
2669    %             setappdata(handles.figure1, 'OffsetY', ZeroData);
2670    %         end
2671    %     end
2672
2673    % Look for file data
2674    try
2675        FileName = getappdata(handles.figure1, 'FileNameY');
2676        if isempty(FileName)
2677            FileName = getappdata(handles.figure1, 'FileNameX');
2678        end
2679    catch
2680    end
2681
2682    % Look for file data
2683    try
2684        FileName = getappdata(handles.figure1, 'FileNameX');
2685        if isempty(FileName)
2686            setappdata(handles.figure1, 'FileY', ZeroData);
2687        else
2688            tmp = getdata(DataStruct.FamilyName, DataStruct.DeviceList, FileName, 'Struct');
2689            if UnitMenu == 1 && strcmpi(tmp.Units,'Hardware')
2690                % Physics units requested, data is in Hardware units
2691                tmp = hw2physics(tmp);
2692            else
2693                % Hardware units requested, data is in Physics units
2694                tmp = physics2hw(tmp);
2695            end
2696            setappdata(handles.figure1, 'FileY', tmp);
2697            setappdata(handles.figure1, 'FileNameY', FileName);
2698        end
2699    catch
2700        setappdata(handles.figure1, 'FileY', ZeroData);
2701        setappdata(handles.figure1, 'FileNameY','');
2702    end
2703
2704    try
2705        FileName = getappdata(handles.figure1, 'FileNameY2');
2706        if isempty(FileName)
2707            FileName = getappdata(handles.figure1, 'FileNameX2');
2708        end
2709    catch
2710    end
2711
2712    % Look for file data
2713    try
2714        FileName = getappdata(handles.figure1, 'FileNameX2');
2715        if isempty(FileName)
2716            setappdata(handles.figure1, 'FileY2', ZeroData);
2717        else
2718            tmp = getdata(DataStruct.FamilyName, DataStruct.DeviceList, FileName, 'Struct');
2719            if UnitMenu == 1 && strcmpi(tmp.Units,'Hardware')
2720                % Physics units requested, data is in Hardware units
2721                tmp = hw2physics(tmp);
2722            else
2723                % Hardware units requested, data is in Physics units
2724                tmp = physics2hw(tmp);
2725            end
2726            setappdata(handles.figure1, 'FileY2', tmp);
2727            setappdata(handles.figure1, 'FileNameY2', FileName);
2728        end
2729    catch
2730        setappdata(handles.figure1, 'FileY2', ZeroData);
2731        setappdata(handles.figure1, 'FileNameY2','');
2732    end
2733   
2734    % Make sure the scale is linear for bar plots
2735    if strcmpi(get(handles.Graph2Bar,'Checked'),'On')
2736        set(handles.Graph2,'YScale','Linear');
2737        set(handles.YScaleLog2,'Checked','Off');
2738        set(handles.YScaleLinear2,'Checked','On');
2739    end
2740
2741    set(handles.DataList2, 'Value', 1);
2742    set(handles.DataList2, 'ListBoxTop', 1);
2743    UpdateFileDisplayLocal(handles);
2744    OneShot_Callback(hObject, eventdata, handles);
2745
2746    % Auto scale y-axis
2747    % AutoScaleYLocal(handles);
2748    a = axis(handles.Graph2);
2749    axis(handles.Graph2, 'auto');
2750    set(handles.Graph2, 'XLim', a(1:2));
2751else
2752    fprintf('   %s is not a known family\n', DataStruct.FamilyName);
2753end
2754
2755
2756% --------------------------------------------------------------------
2757function BPMxList_Callback(hObject, eventdata, handles)
2758UnitMenu = getappdata(handles.figure1,'UnitsFlag');
2759if UnitMenu == 1
2760    UnitsFlag = 'Physics';
2761else
2762    UnitsFlag = 'Hardware';
2763end
2764
2765if strcmpi(get(handles.Simulate,'Checked'),'On')
2766    Mode = 'Simulator';
2767else
2768    Mode = 'Online';
2769end
2770
2771%% Build List display
2772DataStruct = getappdata(handles.figure1, 'BPMxFamily');
2773Family = DataStruct.FamilyName;
2774List = DataStruct.DeviceList;
2775FullList = family2dev(Family);    % Include bad status
2776CheckList = zeros(size(FullList,1),1);
2777i = findrowindex(List, FullList); % Find all selected Devices
2778CheckList(i) = 1;
2779List = editlist(FullList, Family, CheckList);
2780
2781DataStruct.Data = NaN * ones(size(List,1),1);  %DataStruct.Data(i);
2782DataStruct.DeviceList = List;
2783DataStruct.Status = ones(size(List,1),1);
2784
2785% Create the list box string
2786DataStruct = CreateListboxString(DataStruct);
2787
2788
2789setappdata(handles.figure1, 'BPMxFamily', DataStruct);
2790
2791s = getspos(DataStruct);
2792setappdata(handles.figure1, 'SPosX', s);
2793
2794ZeroData = DataStruct;
2795ZeroData.Data = zeros(size(DataStruct.Data,1),1);
2796
2797% % Look for the golden values
2798% try
2799%     if strcmpi(DataStruct.Field,'Monitor')
2800%         % Use the golden setpoint
2801%         GoldenValues = getgolden(DataStruct.FamilyName, DataStruct.DeviceList, 'Setpoint', UnitsFlag, 'Struct');
2802%     else
2803%         GoldenValues = getgolden(DataStruct, UnitsFlag, 'Struct');
2804%     end
2805%     setappdata(handles.figure1, 'GoldenX', GoldenValues);
2806% catch
2807%     setappdata(handles.figure1, 'GoldenX', ZeroData);
2808% end
2809%
2810% % Look for the offset values
2811% try
2812%     OffsetValues = getoffset(DataStruct, UnitsFlag, 'Struct');
2813%     setappdata(handles.figure1,'OffsetX', OffsetValues);
2814% catch
2815%     try
2816%         % If and offset does not exist than try using the setpoint
2817%         setappdata(handles.figure1, 'OffsetX', getsp(DataStruct.FamilyName, DataStruct.DeviceList, Mode, UnitsFlag, 'Struct'));
2818%     catch
2819%         % Use zeros
2820%         setappdata(handles.figure1, 'OffsetX', ZeroData);
2821%     end
2822% end
2823
2824
2825% Changing the list wipes out a save
2826setappdata(handles.figure1,'SaveX', ZeroData);
2827tmp = getappdata(handles.figure1,'SaveY');
2828tmp.Data = 0 * tmp.Data;
2829setappdata(handles.figure1,'SaveY', tmp);
2830set(handles.SaveTime,'String', 'Data not saved');
2831
2832try
2833    FileName = getappdata(handles.figure1, 'FileNameX');
2834    if isempty(FileName)
2835        FileName = getappdata(handles.figure1, 'FileNameY');
2836    end
2837    if isempty(FileName)
2838        setappdata(handles.figure1,'FileX', ZeroData);
2839    else
2840        tmp = getdata(DataStruct.FamilyName, DataStruct.DeviceList, FileName, 'Struct');
2841        if UnitMenu == 1 && strcmpi(tmp.Units,'Hardware')
2842            % Physics units requested, data is in Hardware units
2843            tmp = hw2physics(tmp);
2844        else
2845            % Hardware units requested, data is in Physics units
2846            tmp = physics2hw(tmp);
2847        end
2848        setappdata(handles.figure1,'FileX', tmp);
2849        setappdata(handles.figure1,'FileNameX', FileName);
2850    end
2851catch
2852    setappdata(handles.figure1,'FileX', ZeroData);
2853    setappdata(handles.figure1,'FileNameX','');
2854end
2855
2856set(handles.DataList1,'Value', 1);
2857set(handles.DataList1,'ListBoxTop', 1);
2858UpdateFileDisplayLocal(handles);
2859cla(handles.Graph1);
2860OneShot_Callback(hObject, eventdata, handles);
2861
2862% --------------------------------------------------------------------
2863function BPMyList_Callback(hObject, eventdata, handles)
2864UnitMenu = getappdata(handles.figure1,'UnitsFlag');
2865if UnitMenu == 1
2866    UnitsFlag = 'Physics';
2867else
2868    UnitsFlag = 'Hardware';
2869end
2870
2871if strcmpi(get(handles.Simulate,'Checked'),'On')
2872    Mode = 'Simulator';
2873else
2874    Mode = 'Online';
2875end
2876
2877%% Build List display
2878DataStruct = getappdata(handles.figure1, 'BPMyFamily');
2879Family = DataStruct.FamilyName;
2880List = DataStruct.DeviceList;
2881FullList = family2dev(Family);    % Include bad status
2882CheckList = zeros(size(FullList,1),1);
2883i = findrowindex(List, FullList); % Find all selected Devices
2884CheckList(i) = 1;
2885List = editlist(FullList, Family, CheckList);
2886
2887DataStruct.Data = NaN * ones(size(List,1),1);  %DataStruct.Data(i);
2888DataStruct.DeviceList = List;
2889DataStruct.Status = ones(size(List,1),1);
2890%DataStruct.Data = DataStruct.Data(i);
2891
2892% Create the list box string
2893DataStruct = CreateListboxString(DataStruct);
2894
2895setappdata(handles.figure1, 'BPMyFamily', DataStruct);
2896
2897s = getspos(DataStruct);
2898setappdata(handles.figure1, 'SPosY', s);
2899
2900ZeroData = DataStruct;
2901ZeroData.Data = zeros(size(DataStruct.Data,1),1);
2902
2903
2904% % Look for the golden values
2905% try
2906%     if strcmpi(DataStruct.Field,'Monitor')
2907%         % Use the golden setpoint
2908%         GoldenValues = getgolden(DataStruct.FamilyName, DataStruct.DeviceList, 'Setpoint', UnitsFlag, 'Struct');
2909%     else
2910%         GoldenValues = getgolden(DataStruct, UnitsFlag, 'Struct');
2911%     end
2912%     setappdata(handles.figure1, 'GoldenY', GoldenValues);
2913% catch
2914%     setappdata(handles.figure1, 'GoldenY', ZeroData);
2915% end
2916%
2917%
2918% % Look for the offset values
2919% try
2920%     OffsetValues = getoffset(DataStruct, UnitsFlag, 'Struct');
2921%     setappdata(handles.figure1,'OffsetY', OffsetValues);
2922% catch
2923%     try
2924%         % If and offset does not exist than try using the setpoint
2925%         setappdata(handles.figure1, 'OffsetY', getsp(DataStruct.FamilyName, DataStruct.DeviceList, Mode, UnitsFlag, 'Struct'));
2926%     catch
2927%         % Use zeros
2928%         setappdata(handles.figure1, 'OffsetY', ZeroData);
2929%     end
2930% end
2931
2932
2933% Changing the list wipes out a save
2934setappdata(handles.figure1,'SaveY', ZeroData);
2935tmp = getappdata(handles.figure1,'SaveX');
2936tmp.Data = 0 * tmp.Data;
2937setappdata(handles.figure1,'SaveX', tmp);
2938set(handles.SaveTime, 'String', 'Data not saved');
2939
2940try
2941    FileName = getappdata(handles.figure1, 'FileNameY');
2942    if isempty(FileName)
2943        FileName = getappdata(handles.figure1, 'FileNameX');
2944    end
2945    if isempty(FileName)
2946        setappdata(handles.figure1,'FileY', ZeroData);
2947    else
2948        tmp = getdata(DataStruct.FamilyName, DataStruct.DeviceList, FileName, 'Struct');
2949        if UnitMenu == 1 && strcmpi(tmp.Units,'Hardware')
2950            % Physics units requested, data is in Hardware units
2951            tmp = hw2physics(tmp);
2952        else
2953            % Hardware units requested, data is in Physics units
2954            tmp = physics2hw(tmp);
2955        end
2956        setappdata(handles.figure1,'FileY', tmp);
2957        setappdata(handles.figure1,'FileNameY', FileName);
2958    end
2959catch
2960    setappdata(handles.figure1,'FileY', ZeroData);
2961    setappdata(handles.figure1,'FileNameY','');
2962end
2963
2964set(handles.DataList2,'Value', 1);
2965set(handles.DataList2,'ListBoxTop', 1);
2966UpdateFileDisplayLocal(handles);
2967cla(handles.Graph2);
2968OneShot_Callback(hObject, eventdata, handles);
2969
2970
2971% --------------------------------------------------------------------
2972function UpdatePeriod_Callback(hObject, eventdata, handles)
2973answer = inputdlg('Enter new update period [seconds]','',1,{num2str(getappdata(handles.figure1, 'UpdatePeriod'))});
2974if ~isempty(answer)
2975    UpdatePeriod = str2num(answer{1});
2976    if ~isempty(UpdatePeriod) && UpdatePeriod >= 0
2977        if UpdatePeriod > 10
2978            UpdatePeriod = 10;
2979        end
2980        set(handles.UpdatePeriod,'Label', sprintf('Update Period = %.2f sec',UpdatePeriod));
2981        setappdata(handles.figure1, 'UpdatePeriod', UpdatePeriod);
2982    end
2983end
2984
2985% --------------------------------------------------------------------
2986function PhysicsUnits_Callback(hObject, eventdata, handles)
2987UnitMenu = 1;
2988setappdata(handles.figure1,'UnitsFlag', UnitMenu);
2989set(handles.PhysicsUnitsFlag,'Checked','On');
2990set(handles.HardwareUnitsFlag,'Checked','Off');
2991set(handles.MicronFlag,'Checked','Off');
2992
2993RawX = getappdata(handles.figure1, 'RawX');
2994RawY = getappdata(handles.figure1, 'RawY');
2995
2996if strcmpi(RawX.Units,'Hardware')
2997    % Physics units requested, data is in Hardware units
2998    setappdata(handles.figure1, 'RawX', hw2physics(RawX));
2999    setappdata(handles.figure1, 'RawY', hw2physics(RawY));
3000
3001    %     setappdata(handles.figure1, 'OffsetX', hw2physics(getappdata(handles.figure1,'OffsetX')));
3002    %     setappdata(handles.figure1, 'OffsetY', hw2physics(getappdata(handles.figure1,'OffsetY')));
3003    %
3004    %     setappdata(handles.figure1, 'GoldenX', hw2physics(getappdata(handles.figure1,'GoldenX')));
3005    %     setappdata(handles.figure1, 'GoldenY', hw2physics(getappdata(handles.figure1,'GoldenY')));
3006
3007    setappdata(handles.figure1, 'SaveX', hw2physics(getappdata(handles.figure1,'SaveX')));
3008    setappdata(handles.figure1, 'SaveY', hw2physics(getappdata(handles.figure1,'SaveY')));
3009
3010    setappdata(handles.figure1, 'FileX', hw2physics(getappdata(handles.figure1,'FileX')));
3011    setappdata(handles.figure1, 'FileY', hw2physics(getappdata(handles.figure1,'FileY')));
3012    setappdata(handles.figure1, 'FileX2', hw2physics(getappdata(handles.figure1,'FileX2')));
3013    setappdata(handles.figure1, 'FileY2', hw2physics(getappdata(handles.figure1,'FileY2')));
3014end
3015
3016DataStruct1 = getappdata(handles.figure1, 'BPMxFamily');
3017if strcmpi(DataStruct1.Units,'Hardware')
3018    % Physics units requested, data is in Hardware units
3019    setappdata(handles.figure1, 'BPMxFamily', hw2physics(DataStruct1));
3020end
3021
3022DataStruct2 = getappdata(handles.figure1, 'BPMyFamily');
3023if strcmpi(DataStruct2.Units,'Hardware')
3024    % Physics units requested, data is in Hardware units
3025    setappdata(handles.figure1, 'BPMyFamily', hw2physics(DataStruct2));
3026end
3027
3028plotappdatalocal(handles);
3029AutoScaleYLocal(handles);
3030
3031% Turn off the setpoint GUI (or change it to physics units)
3032TurnOffSetpointGUI_Callback(hObject, eventdata, handles);
3033
3034
3035% --------------------------------------------------------------------
3036function HardwareUnits_Callback(hObject, eventdata, handles)
3037UnitMenu = 2;
3038setappdata(handles.figure1,'UnitsFlag', UnitMenu);
3039set(handles.PhysicsUnitsFlag,'Checked','Off');
3040set(handles.HardwareUnitsFlag,'Checked','On');
3041set(handles.MicronFlag,'Checked','Off');
3042
3043RawX = getappdata(handles.figure1, 'RawX');
3044RawY = getappdata(handles.figure1, 'RawY');
3045
3046if strcmpi(RawX.Units,'Physics')
3047    % Hardware units requested, data is in Physics units
3048    setappdata(handles.figure1, 'RawX', physics2hw(RawX));
3049    setappdata(handles.figure1, 'RawY', physics2hw(RawY));
3050
3051    %     setappdata(handles.figure1, 'OffsetX', physics2hw(getappdata(handles.figure1,'OffsetX')));
3052    %     setappdata(handles.figure1, 'OffsetY', physics2hw(getappdata(handles.figure1,'OffsetY')));
3053    %
3054    %     setappdata(handles.figure1, 'GoldenX', physics2hw(getappdata(handles.figure1,'GoldenX')));
3055    %     setappdata(handles.figure1, 'GoldenY', physics2hw(getappdata(handles.figure1,'GoldenY')));
3056
3057    setappdata(handles.figure1, 'SaveX', physics2hw(getappdata(handles.figure1,'SaveX')));
3058    setappdata(handles.figure1, 'SaveY', physics2hw(getappdata(handles.figure1,'SaveY')));
3059
3060    setappdata(handles.figure1, 'FileX', physics2hw(getappdata(handles.figure1,'FileX')));
3061    setappdata(handles.figure1, 'FileY', physics2hw(getappdata(handles.figure1,'FileY')));
3062    setappdata(handles.figure1, 'FileX2', physics2hw(getappdata(handles.figure1,'FileX2')));
3063    setappdata(handles.figure1, 'FileY2', physics2hw(getappdata(handles.figure1,'FileY2')));
3064end
3065
3066DataStruct1 = getappdata(handles.figure1, 'BPMxFamily');
3067if strcmpi(DataStruct1.Units,'Physics')
3068    % Hardware units requested, data is in Physics units
3069    setappdata(handles.figure1, 'BPMxFamily', physics2hw(DataStruct1));
3070end
3071
3072DataStruct2 = getappdata(handles.figure1, 'BPMyFamily');
3073if strcmpi(DataStruct2.Units,'Physics')
3074    % Hardware units requested, data is in Physics units
3075    setappdata(handles.figure1, 'BPMyFamily', physics2hw(DataStruct2));
3076end
3077
3078plotappdatalocal(handles);
3079AutoScaleYLocal(handles);
3080
3081% Turn off the setpoint GUI (or change it to physics units)
3082TurnOffSetpointGUI_Callback(hObject, eventdata, handles);
3083
3084drawnow;
3085
3086% --------------------------------------------------------------------
3087function MicronFlag_Callback(hObject, eventdata, handles)
3088UnitMenu = 3;
3089setappdata(handles.figure1,'UnitsFlag', UnitMenu);
3090set(handles.PhysicsUnitsFlag,'Checked','Off');
3091set(handles.HardwareUnitsFlag,'Checked','Off');
3092set(handles.MicronFlag,'Checked','On');
3093
3094RawX = getappdata(handles.figure1, 'RawX');
3095RawY = getappdata(handles.figure1, 'RawY');
3096
3097if strcmpi(RawX.Units,'Physics')
3098    % Hardware units requested, data is in Physics units
3099    setappdata(handles.figure1, 'RawX', physics2hw(RawX));
3100    setappdata(handles.figure1, 'RawY', physics2hw(RawY));
3101
3102    %     setappdata(handles.figure1, 'OffsetX', physics2hw(getappdata(handles.figure1,'OffsetX')));
3103    %     setappdata(handles.figure1, 'OffsetY', physics2hw(getappdata(handles.figure1,'OffsetY')));
3104    %
3105    %     setappdata(handles.figure1, 'GoldenX', physics2hw(getappdata(handles.figure1,'GoldenX')));
3106    %     setappdata(handles.figure1, 'GoldenY', physics2hw(getappdata(handles.figure1,'GoldenY')));
3107
3108    setappdata(handles.figure1, 'SaveX', physics2hw(getappdata(handles.figure1,'SaveX')));
3109    setappdata(handles.figure1, 'SaveY', physics2hw(getappdata(handles.figure1,'SaveY')));
3110
3111    setappdata(handles.figure1, 'FileX', physics2hw(getappdata(handles.figure1,'FileX')));
3112    setappdata(handles.figure1, 'FileY', physics2hw(getappdata(handles.figure1,'FileY')));
3113    setappdata(handles.figure1, 'FileX2', physics2hw(getappdata(handles.figure1,'FileX2')));
3114    setappdata(handles.figure1, 'FileY2', physics2hw(getappdata(handles.figure1,'FileY2')));
3115end
3116
3117DataStruct1 = getappdata(handles.figure1, 'BPMxFamily');
3118if strcmpi(DataStruct1.Units,'Physics')
3119    % Hardware units requested, data is in Physics units
3120    setappdata(handles.figure1, 'BPMxFamily', physics2hw(DataStruct1));
3121end
3122
3123DataStruct2 = getappdata(handles.figure1, 'BPMyFamily');
3124if strcmpi(DataStruct2.Units,'Physics')
3125    % Hardware units requested, data is in Physics units
3126    setappdata(handles.figure1, 'BPMyFamily', physics2hw(DataStruct2));
3127end
3128
3129plotappdatalocal(handles);
3130AutoScaleYLocal(handles);
3131drawnow;
3132
3133
3134% --------------------------------------------------------------------
3135function SaveOrbitToFile_Callback(hObject, eventdata, handles)
3136
3137Data1 = getappdata(handles.figure1, 'RawX');
3138Data2 = getappdata(handles.figure1, 'RawY');
3139
3140if isfield(Data1,'TimeStamp')
3141    DirStart = pwd;
3142
3143    FamilyName1 = Data1.FamilyName;
3144    FamilyName2 = Data2.FamilyName;
3145    if strcmpi(FamilyName1, FamilyName2)
3146        FileName = appendtimestamp(FamilyName1, Data1.TimeStamp);
3147    else
3148        FileName = appendtimestamp([FamilyName1,'_',FamilyName2], Data1.TimeStamp);
3149    end
3150
3151    % soleil specific
3152    if any(strcmp(FamilyName1,'BPMx')) && any(strcmp(FamilyName2,'BPMz'))
3153        DirectoryName = getfamilydata('Directory','BeamUser');
3154    else
3155        DirectoryName = getfamilydata('Directory','BPMData');
3156    end
3157    % soleil specific
3158
3159    [FileName, DirectoryName] = uiputfile('*.mat', 'Select File (Cancel to not save to a file)', [DirectoryName FileName, '.mat']);
3160    if FileName == 0
3161        disp('   No data saved');
3162        return
3163    end
3164
3165    [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName);
3166    save(FileName, 'Data1', 'Data2');
3167    cd(DirStart);
3168    fprintf('   Data saved to %s\n', [DirectoryName FileName]);
3169else
3170    fprintf('   No data to save \n');
3171end
3172
3173
3174% --------------------------------------------------------------------
3175function Online_Callback(hObject, eventdata, handles)
3176set(handles.Online,  'Checked','On');
3177set(handles.Simulate,'Checked','Off');
3178SetFigureTitle(handles.figure1, 'Online');
3179%switch2online;
3180OneShot_Callback(hObject, eventdata, handles);
3181plotappdatalocal(handles);
3182
3183% --------------------------------------------------------------------
3184function Simulate_Callback(hObject, eventdata, handles)
3185set(handles.Online,  'Checked','Off');
3186set(handles.Simulate,'Checked','On');
3187SetFigureTitle(handles.figure1, 'Model');
3188%switch2sim;
3189OneShot_Callback(hObject, eventdata, handles);
3190plotappdatalocal(handles);
3191
3192% --------------------------------------------------------------------
3193function Sim2Machine_Callback(hObject, eventdata, handles)
3194sim2machine;
3195OneShot_Callback(hObject, eventdata, handles);
3196plotappdatalocal(handles);
3197
3198% --------------------------------------------------------------------
3199function Machine2Sim_Callback(hObject, eventdata, handles)
3200machine2sim;
3201OneShot_Callback(hObject, eventdata, handles);
3202plotappdatalocal(handles);
3203
3204
3205% --------------------------------------------------------------------
3206function HorizontalAxesScaling(hObject, eventdata, handles)
3207% Graph 1, 2, 3, & 4 axes scaling
3208py = 0.74;
3209p1 = get(handles.Graph1,'Position');
3210p2 = get(handles.Graph2,'Position');
3211p3 = get(handles.Graph3,'Position');
3212p4 = get(handles.Graph4,'Position');
3213pa = get(handles.LatticeAxes,'Position');
3214if strcmpi(get(handles.AddPlot1_Nothing,'Checked'),'Off') || strcmpi(get(handles.AddPlot2_Nothing,'Checked'),'Off')
3215    py = py*.93;
3216end
3217set(handles.Graph1,     'Position', [p1(1) p1(2) py p1(4)]);
3218set(handles.Graph2,     'Position', [p2(1) p2(2) py p2(4)]);
3219set(handles.Graph3,     'Position', [p3(1) p3(2) py p3(4)]);
3220set(handles.Graph4,     'Position', [p4(1) p4(2) py p4(4)]);
3221set(handles.LatticeAxes,'Position', [pa(1) pa(2) py pa(4)]);
3222
3223plotappdatalocal(handles);
3224
3225
3226% --------------------------------------------------------------------
3227function AddPlot_Nothing_Callback(hObject, eventdata, handles)
3228
3229hp = get(hObject, 'Parent');
3230hp = get(hp, 'Parent');
3231if strcmp(get(hp,'Label'),'Graph #1')
3232    plot(handles.Graph3, NaN, NaN)
3233    set(handles.Graph3,'Visible','Off');
3234    set(handles.Graph3,'color','none');
3235    set(handles.AddPlot1_Nothing,'Checked','On');
3236    set(handles.AddPlot1_BetaX,'Checked','Off');
3237    set(handles.AddPlot1_BetaY,'Checked','Off');
3238    set(handles.AddPlot1_DispX,'Checked','Off');
3239    set(handles.AddPlot1_DispY,'Checked','Off');
3240else
3241    plot(handles.Graph4, NaN, NaN)
3242    set(handles.Graph4,'Visible','Off');
3243    set(handles.Graph4,'color','none');
3244    set(handles.AddPlot2_Nothing,'Checked','On');
3245    set(handles.AddPlot2_BetaX,'Checked','Off');
3246    set(handles.AddPlot2_BetaY,'Checked','Off');
3247    set(handles.AddPlot2_DispX,'Checked','Off');
3248    set(handles.AddPlot2_DispY,'Checked','Off');
3249end
3250
3251HorizontalAxesScaling(hObject, eventdata, handles);
3252
3253
3254% --------------------------------------------------------------------
3255function AddPlot_Beta_Callback(hObject, eventdata, handles)
3256% Plot Beta
3257LineColor = [0 .5 0];
3258
3259hp = get(hObject,'Parent');
3260hp = get(hp,'Parent');
3261hp = get(hp,'Parent');
3262if strcmp(get(hp,'Label'),'Graph #1')
3263    hAxes = handles.Graph3;
3264else
3265    hAxes = handles.Graph4;
3266end
3267[BetaX, BetaY, Sx, Sy] = modelbeta('All','All');
3268if strcmp(get(hObject,'Label'),'Horizontal')
3269    plot(hAxes, Sx, BetaX, 'Color',LineColor);
3270    ylabel(hAxes, '{\it\beta_x} [meters]', 'Color',LineColor);
3271else
3272    plot(hAxes, Sy, BetaY, 'Color',LineColor);
3273    ylabel(hAxes, '{\it\beta_y} [meters]', 'Color',LineColor);
3274end
3275
3276if strcmp(get(hp,'Label'),'Graph #1')
3277    AxisRangeX = getappdata(handles.figure1, 'AxisRange1X');
3278else
3279    AxisRangeX = getappdata(handles.figure1, 'AxisRange2X');
3280end
3281
3282axis(hAxes, 'auto');
3283a = axis(hAxes);       
3284del = a(4) - a(3);
3285axis(hAxes, [AxisRangeX(1) AxisRangeX(2) a(3)-.4*del a(4)+.4*del]);
3286AutoScaleVertical(hAxes, .77);
3287
3288% Set axes defaults
3289set(hAxes, 'Color', 'none');
3290set(hAxes, 'Visible', 'On');  % Off to hide axis
3291set(hAxes, 'YAxisLocation', 'Right');
3292set(hAxes, 'XGrid', 'Off');
3293set(hAxes, 'YGrid', 'Off');
3294set(hAxes, 'XMinorGrid', 'Off');
3295set(hAxes, 'YMinorGrid', 'Off');
3296set(hAxes, 'YMinorTick', 'Off');
3297set(hAxes, 'XMinorTick', 'Off');
3298set(hAxes, 'XAxisLocation', 'Bottom');
3299set(hAxes, 'XTickLabel', '');
3300% set(hAxes, 'YTickLabel', []);
3301% set(hAxes, 'XTick', []);
3302% set(hAxes, 'YTick', []);
3303
3304YTick = get(handles.Graph1, 'YTick');
3305
3306
3307if strcmp(get(hp,'Label'),'Graph #1')
3308    set(handles.AddPlot1_Nothing,'Checked','Off');
3309    if strcmp(get(hObject,'Label'),'Horizontal')
3310        set(handles.AddPlot1_BetaX,'Checked','On');
3311        set(handles.AddPlot1_BetaY,'Checked','Off');
3312    else
3313        set(handles.AddPlot1_BetaX,'Checked','Off');
3314        set(handles.AddPlot1_BetaY,'Checked','On');
3315    end
3316    set(handles.AddPlot1_DispX,'Checked','Off');
3317    set(handles.AddPlot1_DispY,'Checked','Off');
3318   
3319    set(hAxes ,'ButtonDownFcn','plotfamily(''Graph1_ButtonDown'',gcbo,[],guidata(gcbo))');
3320    h = get(hAxes,'Children');
3321    for i = 1:length(h)
3322        set(h(i) ,'ButtonDownFcn','plotfamily(''Graph1_ButtonDown'',gcbo,[],guidata(gcbo))');
3323    end
3324else
3325    set(handles.AddPlot2_Nothing,'Checked','Off');
3326    if strcmp(get(hObject,'Label'),'Horizontal')
3327        set(handles.AddPlot2_BetaX,'Checked','On');
3328        set(handles.AddPlot2_BetaY,'Checked','Off');
3329    else
3330        set(handles.AddPlot2_BetaX,'Checked','Off');
3331        set(handles.AddPlot2_BetaY,'Checked','On');
3332    end
3333    set(handles.AddPlot2_DispX,'Checked','Off');
3334    set(handles.AddPlot2_DispY,'Checked','Off');
3335   
3336    set(hAxes ,'ButtonDownFcn','plotfamily(''Graph2_ButtonDown'',gcbo,[],guidata(gcbo))');
3337    h = get(hAxes,'Children');
3338    for i = 1:length(h)
3339        set(h(i) ,'ButtonDownFcn','plotfamily(''Graph2_ButtonDown'',gcbo,[],guidata(gcbo))');
3340    end
3341end
3342
3343HorizontalAxesScaling(hObject, eventdata, handles);
3344
3345
3346% --------------------------------------------------------------------
3347function AddPlot_Dispersion_Callback(hObject, eventdata, handles)
3348% Plot dispersion in physics units
3349LineColor = [0 .5 0];
3350
3351hp = get(hObject,'Parent');
3352hp = get(hp,'Parent');
3353hp = get(hp,'Parent');
3354
3355if strcmp(get(hp,'Label'),'Graph #1')
3356    hAxes = handles.Graph3;
3357else
3358    hAxes = handles.Graph4;
3359end
3360
3361[DispX, DispY, Sx, Sy] = modeldisp('All','All','Physics');
3362if strcmp(get(hObject,'Label'),'Horizontal')
3363    plot(hAxes, Sx, 100*DispX, 'Color',LineColor);
3364    ylabel(hAxes, '{\it\eta_x} [cm]', 'Color',LineColor);
3365else
3366    plot(hAxes, Sy, 100*DispY, 'Color',LineColor);
3367    ylabel(hAxes, '{\it\eta_y} [cm]', 'Color',LineColor);
3368end
3369if strcmp(get(hp,'Label'),'Graph #1')
3370    AxisRangeX = getappdata(handles.figure1, 'AxisRange1X');
3371else
3372    AxisRangeX = getappdata(handles.figure1, 'AxisRange2X');
3373end
3374
3375axis(hAxes, 'auto');
3376a = axis(hAxes);       
3377del = a(4) - a(3);
3378axis(hAxes, [AxisRangeX(1) AxisRangeX(2) a(3)-.4*del a(4)+.4*del]);
3379AutoScaleVertical(hAxes, .77);
3380
3381% Set axes defaults
3382set(hAxes, 'Color', 'none');
3383set(hAxes, 'Visible', 'On');  % Off to hide axis
3384set(hAxes, 'YAxisLocation', 'Right');
3385set(hAxes, 'XGrid', 'Off');
3386set(hAxes, 'YGrid', 'Off');
3387set(hAxes, 'XMinorGrid', 'Off');
3388set(hAxes, 'YMinorGrid', 'Off');
3389set(hAxes, 'YMinorTick', 'Off');
3390set(hAxes, 'XMinorTick', 'Off');
3391set(hAxes, 'XAxisLocation', 'Bottom');
3392set(hAxes, 'XTickLabel', '');
3393% set(hAxes, 'YTickLabel', []);
3394% set(hAxes, 'XTick', []);
3395% set(hAxes, 'YTick', []);
3396
3397
3398if strcmp(get(hp,'Label'),'Graph #1')
3399    set(handles.AddPlot1_Nothing,'Checked','Off');
3400    if strcmp(get(hObject,'Label'),'Horizontal')
3401        set(handles.AddPlot1_DispX,'Checked','On');
3402        set(handles.AddPlot1_DispY,'Checked','Off');
3403    else
3404        set(handles.AddPlot1_DispX,'Checked','Off');
3405        set(handles.AddPlot1_DispY,'Checked','On');
3406    end
3407    set(handles.AddPlot1_BetaX,'Checked','Off');
3408    set(handles.AddPlot1_BetaY,'Checked','Off');
3409   
3410    set(hAxes ,'ButtonDownFcn','plotfamily(''Graph1_ButtonDown'',gcbo,[],guidata(gcbo))');
3411    h = get(hAxes,'Children');
3412    for i = 1:length(h)
3413        set(h(i) ,'ButtonDownFcn','plotfamily(''Graph1_ButtonDown'',gcbo,[],guidata(gcbo))');
3414    end
3415   
3416else
3417    set(handles.AddPlot2_Nothing,'Checked','Off');
3418    if strcmp(get(hObject,'Label'),'Horizontal')
3419        set(handles.AddPlot2_DispX,'Checked','On');
3420        set(handles.AddPlot2_DispY,'Checked','Off');
3421    else
3422        set(handles.AddPlot2_DispX,'Checked','Off');
3423        set(handles.AddPlot2_DispY,'Checked','On');
3424    end
3425    set(handles.AddPlot2_BetaX,'Checked','Off');
3426    set(handles.AddPlot2_BetaY,'Checked','Off');
3427   
3428    set(hAxes, 'ButtonDownFcn','plotfamily(''Graph2_ButtonDown'',gcbo,[],guidata(gcbo))');
3429    h = get(hAxes, 'Children');
3430    for i = 1:length(h)
3431        set(h(i), 'ButtonDownFcn', 'plotfamily(''Graph2_ButtonDown'',gcbo,[],guidata(gcbo))');
3432    end
3433end
3434
3435HorizontalAxesScaling(hObject, eventdata, handles);
3436
3437
3438% --------------------------------------------------------------------
3439function DrawLattice_Callback(hObject, eventdata, handles)
3440% Graph size is determined here and in function HorizontalAxesScaling
3441CheckMark = get(handles.DrawLattice, 'Checked');
3442if strcmpi(CheckMark, 'On')
3443    d = .01;
3444    p1 = [0.07    0.65-d    0.74    0.29+d];
3445    set(handles.Graph1, 'Position', p1);
3446    set(handles.Graph3, 'Position', p1);
3447
3448    p2 = [0.07    0.27    0.74    0.29+d];
3449    set(handles.Graph2, 'Position', p2);
3450    set(handles.Graph4, 'Position', p2);
3451
3452    set(handles.DrawLattice, 'Checked', 'Off');
3453    set(get(handles.LatticeAxes,'Children'), 'Visible' , 'Off');
3454else
3455    p1 = [0.07    0.65    0.74    0.29];
3456    set(handles.Graph1, 'Position', p1);
3457    set(handles.Graph3, 'Position', p1);
3458
3459    p2 = [0.07    0.27    0.74    0.29];
3460    set(handles.Graph2, 'Position', p2);
3461    set(handles.Graph4, 'Position', p2);
3462
3463    set(handles.DrawLattice, 'Checked', 'On');
3464    set(get(handles.LatticeAxes,'Children'), 'Visible' , 'On');
3465end
3466
3467HorizontalAxesScaling(hObject, eventdata, handles);
3468
3469
3470% --------------------------------------------------------------------
3471function Graph1_ButtonDown(hObject, eventdata, handles)
3472set(handles.figure1, 'HandleVisibility','Callback');
3473CurrentPoint = get(gca, 'CurrentPoint');
3474SposMouse = CurrentPoint(1,1);
3475SposData = getappdata(handles.figure1, 'SPosX');
3476
3477MeritFcn = abs(SposData-SposMouse);
3478i = find(min(MeritFcn) == MeritFcn);
3479set(handles.DataList1, 'value', i(1));
3480set(handles.figure1, 'HandleVisibility','Off');
3481
3482% --------------------------------------------------------------------
3483function Graph2_ButtonDown(hObject, eventdata, handles)
3484set(handles.figure1, 'HandleVisibility','Callback');
3485CurrentPoint = get(gca, 'CurrentPoint');
3486SposMouse = CurrentPoint(1,1);
3487SposData = getappdata(handles.figure1, 'SPosY');
3488
3489MeritFcn = abs(SposData-SposMouse);
3490i = find(min(MeritFcn) == MeritFcn);
3491set(handles.DataList2, 'value', i(1));
3492set(handles.figure1, 'HandleVisibility','Off');
3493
3494
3495% --- Executes on button press in AutoScale1.
3496function AutoScale1_Callback(hObject, eventdata, handles)
3497AutoScaleVertical(handles.Graph1, .95);
3498AutoScaleVertical(handles.Graph3, .77);
3499
3500% --- Executes on button press in AutoScale2.
3501function AutoScale2_Callback(hObject, eventdata, handles)
3502AutoScaleVertical(handles.Graph2, .95);
3503AutoScaleVertical(handles.Graph4, .77);
3504
3505%--------------------------------------------------------
3506function AutoScaleVertical(h_axis, ScaleFactor)
3507% Auto-scale y-axis
3508
3509if nargin < 2
3510    ScaleFactor = 1;
3511end
3512
3513a = axis(h_axis);
3514% if strcmpi(get(handles.Graph2Line,'Checked'),'On')
3515%     % Line
3516%     axis(h_axis, 'auto');
3517%     set(h_axis, 'XLim', a(1:2));
3518% else
3519    % Bar
3520    h = get(h_axis,'Children');
3521    if length(h) > 1
3522        h = sort(h(end-1:end));
3523        y1 = get(h(1),'YData');
3524        y2 = get(h(2),'YData');
3525    else
3526        y1 = get(h(1),'YData');
3527        y2 = y1;
3528    end
3529    x = get(h(1),'XData');
3530    i = find(x>a(1) & x<a(2));
3531    if ~isempty(i)
3532        % Select within present x-axis
3533        y1 = y1(i);
3534        y2 = y2(i);
3535    end
3536   
3537    MaxY = max([y1(:); y2(:)]);
3538    MinY = min([y1(:); y2(:)]);
3539
3540    if isnan(MinY) || isnan(MaxY)
3541        axis(h_axis, 'auto');
3542        set(h_axis, 'XLim', a(1:2));
3543    else
3544        %if abs(MaxY-MinY) < eps
3545        %    MaxY = MaxY + .5;
3546        %    MinY = MinY - .5;
3547        %else
3548            % Add a buffer
3549            Delta = MaxY - MinY;
3550            if Delta == 0
3551                Delta = 1e-15; %eps;
3552            end
3553            MaxY = MaxY + (1-ScaleFactor) * Delta;
3554            MinY = MinY - (1-ScaleFactor) * Delta;
3555        %end
3556        set(h_axis, 'YLim', [MinY MaxY]);
3557    end
3558%end
3559 
3560% % Auto-scale y-axis
3561% axis(handles.Graph2, 'auto');
3562% a = axis(handles.Graph2);
3563% axis(handles.Graph2, [AxisRange2X(1) AxisRange2X(2) a(3) a(4)]);
3564% a = axis(handles.Graph4);
3565% axis(handles.Graph4, [AxisRange2X(1) AxisRange2X(2) a(3) a(4)]);
3566
3567
3568
3569% --- Executes on button press in AutoScale1.
3570function AutoScaleH_Callback(hObject, eventdata, handles)
3571
3572% Auto scale X-axis to the full range
3573L = getfamilydata('Circumference');
3574if isempty(L)
3575    DataStruct = getappdata(handles.figure1, 'BPMxFamily');
3576    s = getspos(DataStruct);
3577    AxisRangeX = [min(s) max(s)];
3578else
3579    AxisRangeX = [0 L];
3580end
3581setappdata(handles.figure1, 'AxisRange1X', AxisRangeX);
3582setappdata(handles.figure1, 'AxisRange2X', AxisRangeX);
3583
3584
3585% Set x-axis for everybody else
3586set(handles.Graph1,      'XLim', AxisRangeX);
3587set(handles.Graph2,      'XLim', AxisRangeX);
3588set(handles.Graph3,      'XLim', AxisRangeX);
3589set(handles.Graph4,      'XLim', AxisRangeX);
3590set(handles.LatticeAxes, 'XLim', AxisRangeX);
3591
3592% % Auto scale X-axis to the full range
3593% L = getfamilydata('Circumference');
3594% if isempty(L)
3595%     DataStruct = getappdata(handles.figure1, 'BPMyFamily');
3596%     s = getspos(DataStruct);
3597%     AxisRange2X = [min(s) max(s)];
3598% else
3599%     AxisRange2X = [0 L];
3600% end
3601% setappdata(handles.figure1, 'AxisRange2X', AxisRange2X);
3602%
3603% Set x-axis for everybody else
3604%set(handles.Graph1,      'XLim', [AxisRange2X(1) AxisRange2X(2)]);
3605%set(handles.Graph3,      'XLim', [AxisRange2X(1) AxisRange2X(2)]);
3606%set(handles.LatticeAxes, 'XLim', [AxisRange2X(1) AxisRange2X(2)]);
3607
3608
3609function AutoScaleYLocal(handles)
3610a = axis(handles.Graph1);
3611axis(handles.Graph1, 'auto');
3612set(handles.Graph1, 'XLim', a(1:2));
3613
3614a = axis(handles.Graph2);
3615axis(handles.Graph2, 'auto');
3616set(handles.Graph2, 'XLim', a(1:2));
3617
3618
3619
3620% --- Executes on button press in Graph1ZoomInVertical.
3621function Graph1ZoomInVertical_Callback(hObject, eventdata, handles)
3622a = axis(handles.Graph1);
3623ChangeFactor = 1.15;
3624del = (1/ChangeFactor-1)*(a(4)-a(3));
3625axis((handles.Graph1), [a(1) a(2) a(3)-del/2 a(4)+del/2]);
3626set(hObject, 'Value', 0);
3627
3628
3629% --- Executes on button press in Graph1ZoomOutVertical.
3630function Graph1ZoomOutVertical_Callback(hObject, eventdata, handles)
3631a = axis(handles.Graph1);
3632ChangeFactor = 1.15;
3633del = (ChangeFactor-1)*(a(4)-a(3));
3634axis((handles.Graph1), [a(1) a(2) a(3)-del/2 a(4)+del/2]);
3635set(hObject, 'Value', 0);
3636
3637
3638% --- Executes on button press in Graph2ZoomInVertical.
3639function Graph2ZoomInVertical_Callback(hObject, eventdata, handles)
3640a = axis(handles.Graph2);
3641ChangeFactor = 1.15;
3642del = (1/ChangeFactor-1)*(a(4)-a(3));
3643axis((handles.Graph2), [a(1) a(2) a(3)-del/2 a(4)+del/2]);
3644set(hObject, 'Value', 0);
3645
3646
3647% --- Executes on button press in Graph2ZoomOutVertical.
3648function Graph2ZoomOutVertical_Callback(hObject, eventdata, handles)
3649a = axis(handles.Graph2);
3650ChangeFactor = 1.15;
3651del = (ChangeFactor-1)*(a(4)-a(3));
3652axis((handles.Graph2), [a(1) a(2) a(3)-del/2 a(4)+del/2]);
3653set(hObject, 'Value', 0);
3654
3655
3656% --- Executes on button press in Graph1ZoomInVertical.
3657function Graph1OffsetUpVertical_Callback(hObject, eventdata, handles)
3658ChangeFactor = 1.1;
3659a1 = axis(handles.Graph1);
3660del1 = (ChangeFactor-1)*(a1(4)-a1(3));
3661axis(handles.Graph1, [a1(1) a1(2) a1(3)+del1 a1(4)+del1]);
3662set(hObject, 'Value', 0);
3663
3664% --- Executes on button press in Graph1ZoomOutVertical.
3665function Graph1OffsetDownVertical_Callback(hObject, eventdata, handles)
3666ChangeFactor = 1.1;
3667a1 = axis(handles.Graph1);
3668del1 = (1/ChangeFactor-1)*(a1(4)-a1(3));
3669axis(handles.Graph1, [a1(1) a1(2) a1(3)+del1 a1(4)+del1]);
3670set(hObject, 'Value', 0);
3671
3672
3673% --- Executes on button press in Graph1ZoomInVertical.
3674function Graph2OffsetUpVertical_Callback(hObject, eventdata, handles)
3675ChangeFactor = 1.1;
3676a1 = axis(handles.Graph2);
3677del1 = (ChangeFactor-1)*(a1(4)-a1(3));
3678axis(handles.Graph2, [a1(1) a1(2) a1(3)+del1 a1(4)+del1]);
3679set(hObject, 'Value', 0);
3680
3681% --- Executes on button press in Graph1ZoomOutVertical.
3682function Graph2OffsetDownVertical_Callback(hObject, eventdata, handles)
3683ChangeFactor = 1.1;
3684a1 = axis(handles.Graph2);
3685del1 = (1/ChangeFactor-1)*(a1(4)-a1(3));
3686axis(handles.Graph2, [a1(1) a1(2) a1(3)+del1 a1(4)+del1]);
3687set(hObject, 'Value', 0);
3688
3689
3690% --- Executes on button press in HorizontalOffsetRight.
3691function HorizontalOffsetRight_Callback(hObject, eventdata, handles)
3692ChangeFactor = 1.05;
3693a1 = axis(handles.Graph1);
3694a2 = axis(handles.Graph2);
3695a3 = axis(handles.Graph3);
3696a4 = axis(handles.Graph4);
3697del1 = (ChangeFactor-1)*(a1(2)-a1(1));
3698del2 = (ChangeFactor-1)*(a2(2)-a2(1));
3699axis(handles.Graph1, [a1(1)+del1 a1(2)+del1 a1(3) a1(4)]);
3700axis(handles.Graph3, [a1(1)+del1 a1(2)+del1 a3(3) a3(4)]);
3701axis(handles.Graph2, [a2(1)+del2 a2(2)+del2 a2(3) a2(4)]);
3702axis(handles.Graph4, [a2(1)+del2 a2(2)+del2 a4(3) a4(4)]);
3703set(handles.LatticeAxes, 'XLim', [a2(1)+del2 a2(2)+del2]);
3704setappdata(handles.figure1, 'AxisRange1X', [a1(1)+del1 a1(2)+del1]);
3705setappdata(handles.figure1, 'AxisRange2X', [a2(1)+del2 a2(2)+del2]);
3706
3707function HorizontalOffsetLeft_Callback(hObject, eventdata, handles)
3708ChangeFactor = 1.05;
3709a1 = axis(handles.Graph1);
3710a2 = axis(handles.Graph2);
3711a3 = axis(handles.Graph3);
3712a4 = axis(handles.Graph4);
3713del1 = (1/ChangeFactor-1)*(a1(2)-a1(1));
3714del2 = (1/ChangeFactor-1)*(a2(2)-a2(1));
3715axis(handles.Graph1, [a1(1)+del1 a1(2)+del1 a1(3) a1(4)]);
3716axis(handles.Graph3, [a1(1)+del1 a1(2)+del1 a3(3) a3(4)]);
3717axis(handles.Graph2, [a2(1)+del2 a2(2)+del2 a2(3) a2(4)]);
3718axis(handles.Graph4, [a2(1)+del2 a2(2)+del2 a4(3) a4(4)]);
3719set(handles.LatticeAxes, 'XLim', [a2(1)+del2 a2(2)+del2]);
3720setappdata(handles.figure1, 'AxisRange1X', [a1(1)+del1 a1(2)+del1]);
3721setappdata(handles.figure1, 'AxisRange2X', [a2(1)+del2 a2(2)+del2]);
3722
3723function Graph1ZoomInHorizontal_Callback(hObject, eventdata, handles)
3724ChangeFactor = 1.3;
3725a1 = axis(handles.Graph1);
3726a2 = axis(handles.Graph2);
3727a3 = axis(handles.Graph3);
3728a4 = axis(handles.Graph4);
3729del1 = (1/ChangeFactor-1)*(a1(2)-a1(1));
3730del2 = (1/ChangeFactor-1)*(a2(2)-a2(1));
3731axis(handles.Graph1, [a1(1)-del1/2 a1(2)+del1/2 a1(3) a1(4)]);
3732axis(handles.Graph3, [a1(1)-del1/2 a1(2)+del1/2 a3(3) a3(4)]);
3733axis(handles.Graph2, [a2(1)-del2/2 a2(2)+del2/2 a2(3) a2(4)]);
3734axis(handles.Graph4, [a2(1)-del2/2 a2(2)+del2/2 a4(3) a4(4)]);
3735set(handles.LatticeAxes, 'XLim', [a2(1)-del2/2 a2(2)+del2/2]);
3736setappdata(handles.figure1, 'AxisRange1X', [a1(1)-del1/2 a1(2)+del1/2]);
3737setappdata(handles.figure1, 'AxisRange2X', [a2(1)-del2/2 a2(2)+del2/2]);
3738
3739function Graph1ZoomOutHorizontal_Callback(hObject, eventdata, handles)
3740ChangeFactor = 1.3;
3741a1 = axis(handles.Graph1);
3742a2 = axis(handles.Graph2);
3743a3 = axis(handles.Graph3);
3744a4 = axis(handles.Graph4);
3745del1 = (ChangeFactor-1)*(a1(2)-a1(1));
3746del2 = (ChangeFactor-1)*(a2(2)-a2(1));
3747axis(handles.Graph1, [a1(1)-del1/2 a1(2)+del1/2 a1(3) a1(4)]);
3748axis(handles.Graph3, [a1(1)-del1/2 a1(2)+del1/2 a3(3) a3(4)]);
3749axis(handles.Graph2, [a2(1)-del2/2 a2(2)+del2/2 a2(3) a2(4)]);
3750axis(handles.Graph4, [a2(1)-del2/2 a2(2)+del2/2 a4(3) a4(4)]);
3751set(handles.LatticeAxes, 'XLim', [a2(1)-del2/2 a2(2)+del2/2]);
3752setappdata(handles.figure1, 'AxisRange1X', [a1(1)-del1/2 a1(2)+del1/2]);
3753setappdata(handles.figure1, 'AxisRange2X', [a2(1)-del2/2 a2(2)+del2/2]);
3754
3755
3756% Just in Lattice menu (Not plotfamily)
3757function Switch2HW_Callback(hObject, eventdata, handles)
3758switch2hw;
3759
3760function Switch2Physics_Callback(hObject, eventdata, handles)
3761switch2physics;
3762
3763function Switch2Online_Callback(hObject, eventdata, handles)
3764switch2online;
3765
3766function Switch2Sim_Callback(hObject, eventdata, handles)
3767switch2sim;
3768
3769
3770
3771
3772%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3773% Setpoint change callbacks %
3774%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3775
3776% --------------------------------------------------------------------
3777function Lattice_ButtonDown(hObject, eventdata, handles)
3778% Change setpoint request
3779ErrorFlag = 0;
3780
3781% Only works on setpoint fields (at the moment)
3782Field = 'Setpoint';
3783
3784try
3785    ATIndex = get(hObject, 'UserData');
3786
3787    CurrentPoint = get(handles.LatticeAxes, 'CurrentPoint');
3788    SposMouse = CurrentPoint(1,1);
3789
3790    [Family, List] = atindex2family(ATIndex);
3791
3792    if isempty(Family) || isempty(List)
3793        ErrorFlag = 1;
3794    else
3795
3796        List = List(1,:);
3797
3798        HCMFamily = gethcmfamily;
3799        VCMFamily = getvcmfamily;
3800        if any(strcmpi(Family, {HCMFamily, VCMFamily}))
3801            % A corrector was found (how do I know if it's a HCM or VCM?  AT does not differentiate)
3802            if strcmpi(Family, HCMFamily) && CurrentPoint(1,2)<0
3803                % It should be a VCM family
3804                DevList = family2dev(VCMFamily);
3805                [i, col] = find(ATIndex == family2atindex(VCMFamily,DevList));
3806                if ~isempty(i)
3807                    Family = VCMFamily;
3808                    List = DevList(i,:);
3809                end
3810            elseif strcmpi(Family, VCMFamily) && CurrentPoint(1,2)>0
3811                % It should be a HCM family
3812                DevList = family2dev(HCMFamily);
3813                [i, col] = find(ATIndex == family2atindex(HCMFamily,DevList));
3814                if ~isempty(i)
3815                    Family = HCMFamily;
3816                    List = DevList(i,:);
3817                end
3818            end
3819        end
3820
3821        [FamilyFlag,ao] = isfamily(Family);
3822
3823        if isfield(ao, Field)
3824            % Get/save the present setpoint then call the GUI for setpoint changes
3825            if strcmpi(get(handles.Simulate,'Checked'),'On')
3826                Mode = 'Simulator';
3827            else
3828                Mode = 'Online';
3829            end
3830            if strcmpi(get(handles.PhysicsUnitsFlag,'Checked'),'On')
3831                %if getappdata(handles.figure1,'UnitsFlag') == 1
3832                UnitsFlag = 'Physics';
3833            else
3834                UnitsFlag = 'Hardware';
3835            end
3836
3837            SP = getpv(Family, Field, List, Mode, UnitsFlag, 'Struct');
3838            set(handles.SetpointSlider,     'UserData', SP);
3839            set(handles.SetpointPushButton, 'UserData', SP);
3840            SetpointGUI_Callback(hObject, eventdata, handles);
3841        else
3842            ErrorFlag = 1;
3843        end
3844    end
3845catch
3846    ErrorFlag = 1;
3847    fprintf('\n%s\n', lasterr);
3848    fprintf('There was a problem getting %s.%s(%d,%d)\n', Family, Field, List);
3849end
3850
3851if ErrorFlag
3852    % Turn off the setpoint GUI
3853    TurnOffSetpointGUI_Callback(hObject, eventdata, handles);
3854end
3855
3856
3857% --------------------------------------------------------------------
3858function SetpointGUI_Callback(hObject, eventdata, handles)
3859
3860if strcmpi(get(handles.DisabledSetpointChanges,'Checked'),'Off')
3861    SP = get(handles.SetpointSlider, 'UserData');
3862
3863    % Use slider and edit box
3864    set(handles.SetpointSlider, 'UserData', SP);
3865    try
3866        MaxPV = maxpv(SP);
3867        MinPV = minpv(SP);
3868        %if isinf(MaxPV) && ~isnan(MaxPV)
3869        %    MaxPV = 1e10; %SP.Data + abs(SP.Data);
3870        %end
3871        %if isinf(MinPV) && ~isnan(MinPV)
3872        %    MinPV = -1e10; %SP.Data - abs(SP.Data);;
3873        %end
3874
3875        if MaxPV < MinPV
3876            tmp = MaxPV;
3877            MaxPV = MinPV;
3878            MinPV = tmp;
3879        end
3880
3881        if isnumeric(MaxPV) && isnumeric(MinPV) && ~isinf(MaxPV) && ~isinf(MinPV) && ~isnan(MaxPV) && ~isnan(MinPV) && (MaxPV-MinPV)~=0
3882            Range = abs(MaxPV-MinPV);
3883            if Range == 1
3884                StepSize = 1;
3885            else
3886                StepSize = Range/5000;
3887            end
3888        else
3889            StepSize = 1;
3890        end
3891        set(handles.SetpointStepSize, 'String', num2str(StepSize));
3892        %set(handles.SetpointStepSize, 'String', sprintf('%f',StepSize));
3893    catch
3894        MaxPV = Inf; % 1e10; % SP.Data + abs(SP.Data);
3895        MinPV =-Inf; %-1e10; % SP.Data - abs(SP.Data);
3896    end
3897
3898    set(handles.SetpointMax, 'String', sprintf('%f',MaxPV));
3899    set(handles.SetpointMin, 'String', sprintf('%f',MinPV));
3900
3901    if ~isinf(MaxPV) && ~isnan(MaxPV) && (MaxPV-MinPV)~=0
3902        set(handles.SetpointSlider, 'Max', MaxPV);
3903    end
3904    if ~isinf(MinPV) && ~isnan(MaxPV) && (MaxPV-MinPV)~=0
3905        set(handles.SetpointSlider, 'Min', MinPV);
3906    end
3907    SetpointRange_Callback(hObject, eventdata, handles);
3908
3909    set(handles.SetpointFamily, 'String', sprintf('%s.%s', deblank(family2common(SP.FamilyName, SP.DeviceList)), SP.Field));
3910    %set(handles.SetpointFamily, 'String', sprintf('%s.%s(%d,%d)', SP.FamilyName, SP.Field, SP.DeviceList));
3911    try
3912        set(handles.SetpointFamily,  'TooltipString', sprintf('%s', family2channel(SP)));
3913    catch
3914        set(handles.SetpointFamily,  'TooltipString', '');
3915    end
3916    set(handles.SetpointUnits,   'String', [SP.UnitsString, '/step']);
3917    set(handles.SetpointEditBox, 'String', sprintf('%f', SP.Data));
3918    set(handles.SetpointEditBox, 'TooltipString', sprintf('New setpoint in %s', SP.UnitsString));
3919
3920    set(handles.SetpointPushButton, 'String', sprintf('%f', SP.Data));
3921    set(handles.SetpointPushButton, 'TooltipString', sprintf('Restore original setpoint to %f %s', SP.Data, SP.UnitsString));
3922
3923
3924    set(handles.SetpointEditBox,   'Visible', 'On');
3925    set(handles.SetpointFamily,    'Visible', 'On');
3926    set(handles.SetpointUnits,     'Visible', 'On');
3927    set(handles.SetpointSlider,    'Visible', 'On');
3928    set(handles.SetpointMax,       'Visible', 'On');
3929    set(handles.SetpointMin,       'Visible', 'On');
3930    set(handles.SetpointFrame,     'Visible', 'On');
3931    set(handles.SetpointStepSize,  'Visible', 'On');
3932    set(handles.SetpointPushButton,'Visible', 'On');
3933
3934    % Change the save and file text to make room for the slider
3935    p = get(handles.SaveTime, 'Position');
3936    set(handles.SaveTime, 'Position',  [p(1) p(2) .353*p(3) p(4)]);
3937    p = get(handles.FileNameX, 'Position');
3938    set(handles.FileNameX, 'Position', [p(1) p(2) .353*p(3) p(4)]);
3939    p = get(handles.FileNameY, 'Position');
3940    set(handles.FileNameY, 'Position', [p(1) p(2) .353*p(3) p(4)]);
3941
3942    % % Other method: use input dialog box
3943    % answer = inputdlg(sprintf('Enter new setpoint for %s.%s(%d,%d) in %s (%s):', SP.FamilyName, SP.Field, SP.DeviceList, SP.UnitsString, SP.Mode),'FAMILYPLOT',1,{sprintf('%s',num2str(SP.Data))});
3944    % if ~isempty(answer)
3945    %     NewSP = str2num(answer{1});
3946    %     if ~isempty(NewSP)
3947    %         SP.Data = NewSP
3948    %         set(handles.SetpointSlider,  'UserData', SP);
3949    %         ChangeSetpointPlotfamily(hObject, eventdata, handles);
3950    %         %setpv(Family, Field, NewSP, List, Mode);
3951    %     end
3952    % end
3953end
3954
3955
3956% --------------------------------------------------------------------
3957function SetpointRange_Callback(hObject, eventdata, handles)
3958
3959MaxPV = str2num(get(handles.SetpointMax,'String'));
3960MinPV = str2num(get(handles.SetpointMin,'String'));
3961
3962if isnumeric(MaxPV) && isnumeric(MinPV) && ~isinf(MaxPV) && ~isinf(MinPV) && ~isnan(MaxPV) && ~isnan(MinPV) && (MaxPV-MinPV)~=0
3963    if MaxPV < MinPV
3964        fprintf('   Maximum range must be greater than the minimum range.\n');
3965        MaxPV = get(handles.SetpointSlider, 'Max');
3966        MinPV = get(handles.SetpointSlider, 'Min');
3967        set(handles.SetpointMax, 'String', sprintf('%f',MaxPV));
3968        set(handles.SetpointMin, 'String', sprintf('%f',MinPV));
3969    else
3970        StepSize = abs(str2num(get(handles.SetpointStepSize, 'String')));
3971        Range = abs(MaxPV-MinPV);
3972        if isempty(StepSize) || ~isnumeric(StepSize)
3973            fprintf('   Step size is not a numeric value.  Overwriting with the default step size.\n');
3974            StepSize = Range/1000;
3975        end
3976        set(handles.SetpointStepSize, 'String', num2str(StepSize));
3977        %set(handles.SetpointStepSize, 'String', sprintf('%f',StepSize));
3978        Steps = Range/StepSize;
3979        if Steps < 10
3980            Steps = 10;
3981        end
3982        set(handles.SetpointSlider, 'Max', MaxPV);
3983        set(handles.SetpointSlider, 'Min', MinPV);
3984        set(handles.SetpointSlider, 'SliderStep', [1/Steps 10/Steps]);
3985        %set(handles.SetpointSlider, 'SliderStep', [.001 .01]);
3986
3987        SP = get(handles.SetpointSlider, 'UserData');
3988        set(handles.SetpointSlider,  'Value',  SP.Data);
3989
3990        set(handles.SetpointSlider, 'Enable', 'On');
3991    end
3992else
3993    set(handles.SetpointSlider, 'Enable', 'Off');
3994end
3995
3996
3997
3998% --------------------------------------------------------------------
3999function SetpointSlider_Callback(hObject, eventdata, handles)
4000
4001% Get setpoint from the slider
4002NewSP = get(handles.SetpointSlider, 'Value');
4003
4004SP = get(handles.SetpointSlider, 'UserData');
4005SP.Data = NewSP;
4006
4007% Update Slider
4008set(handles.SetpointSlider, 'UserData', SP);
4009set(handles.SetpointSlider, 'Value', NewSP);
4010
4011% Update EditBox
4012set(handles.SetpointEditBox, 'String', sprintf('%f', SP.Data));
4013
4014% Make setpoint change
4015ChangeSetpointPlotfamily(hObject, eventdata, handles);
4016
4017
4018% --------------------------------------------------------------------
4019function SetpointEditBox_Callback(hObject, eventdata, handles)
4020
4021% Get setpoint from the editbox
4022ValueStr = get(handles.SetpointEditBox, 'String');
4023
4024if ~isempty(ValueStr)
4025    NewSP = str2num(ValueStr);
4026
4027    SP = get(handles.SetpointSlider, 'UserData');
4028    SP.Data = NewSP;
4029
4030    % Check range (if slider is enabled)
4031    ChangeFlag = 1;
4032    if strcmpi(get(handles.SetpointSlider,'Enable'), 'On')
4033        MaxPV = str2num(get(handles.SetpointMax,'String'));
4034        MinPV = str2num(get(handles.SetpointMin,'String'));
4035        if isnumeric(MaxPV) && isnumeric(MinPV) && ~isinf(MaxPV) && ~isinf(MinPV) && ~isnan(MaxPV) && ~isnan(MinPV)
4036            if MaxPV < NewSP  || NewSP < MinPV
4037                fprintf('   The requested setpoint is outside the limits.  Requested cancelled.\n');
4038                ChangeFlag = 0;
4039                OldSP = get(handles.SetpointSlider, 'Value');
4040                set(handles.SetpointEditBox, 'String', sprintf('%f',OldSP));
4041            end
4042        end
4043    end
4044
4045    % Update Slider
4046    if ChangeFlag
4047        set(handles.SetpointSlider, 'UserData', SP);
4048
4049        % Don't change the slider if it's not enabled
4050        if strcmpi(get(handles.SetpointSlider,'Enable'), 'On')
4051            set(handles.SetpointSlider, 'Value', NewSP);
4052        end
4053
4054        % Make setpoint change
4055        ChangeSetpointPlotfamily(hObject, eventdata, handles);
4056    end
4057end
4058
4059
4060% --------------------------------------------------------------------
4061function SetpointPushButton_Callback(hObject, eventdata, handles)
4062
4063% Get setpoint from the pushbutton
4064SP = get(handles.SetpointPushButton, 'UserData');
4065
4066% Update Slider if it's enabled
4067if strcmpi(get(handles.SetpointSlider,'Enable'), 'On')
4068    set(handles.SetpointSlider, 'Value', SP.Data);
4069end
4070
4071% Store the setpoint change and update the editbox
4072set(handles.SetpointSlider, 'UserData', SP);
4073set(handles.SetpointEditBox, 'String', sprintf('%f',SP.Data));
4074
4075% Make setpoint change
4076ChangeSetpointPlotfamily(hObject, eventdata, handles);
4077
4078
4079% --------------------------------------------------------------------
4080function ChangeSetpointPlotfamily(hObject, eventdata, handles)
4081
4082SP = get(handles.SetpointSlider, 'UserData');
4083
4084% Get the present mode (units are stored with the data)
4085if strcmpi(get(handles.Simulate,'Checked'),'On')
4086    Mode = 'Simulator';
4087else
4088    Mode = 'Online';
4089end
4090
4091
4092% Make the setpoint change
4093setpv(SP, 0, Mode);
4094
4095
4096% Update plots
4097OneShot_Callback(hObject, eventdata, handles);
4098
4099if strcmpi(get(handles.AddPlot1_BetaX,'Checked'),'On')
4100    AddPlot_Beta_Callback(handles.AddPlot1_BetaX, eventdata, handles);
4101end
4102if strcmpi(get(handles.AddPlot2_BetaX,'Checked'),'On')
4103    AddPlot_Beta_Callback(handles.AddPlot2_BetaX, eventdata, handles);
4104end
4105if strcmpi(get(handles.AddPlot1_BetaY,'Checked'),'On')
4106    AddPlot_Beta_Callback(handles.AddPlot1_BetaY, eventdata, handles);
4107end
4108if strcmpi(get(handles.AddPlot2_BetaY,'Checked'),'On')
4109    AddPlot_Beta_Callback(handles.AddPlot2_BetaY, eventdata, handles);
4110end
4111
4112if strcmpi(get(handles.AddPlot1_DispX,'Checked'),'On')
4113    AddPlot_Dispersion_Callback(handles.AddPlot1_DispX, eventdata, handles);
4114end
4115if strcmpi(get(handles.AddPlot2_DispX,'Checked'),'On')
4116    AddPlot_Dispersion_Callback(handles.AddPlot2_DispX, eventdata, handles);
4117end
4118if strcmpi(get(handles.AddPlot1_DispY,'Checked'),'On')
4119    AddPlot_Dispersion_Callback(handles.AddPlot1_DispY, eventdata, handles);
4120end
4121if strcmpi(get(handles.AddPlot2_DispY,'Checked'),'On')
4122    AddPlot_Dispersion_Callback(handles.AddPlot2_DispY, eventdata, handles);
4123end
4124
4125
4126
4127% --------------------------------------------------------------------
4128function Graph1Line_Callback(hObject, eventdata, handles)
4129set(handles.Graph1Line,'Checked','On');
4130set(handles.Graph1Bar, 'Checked','Off');
4131cla(handles.Graph1);
4132
4133% Update plot
4134OneShot_Callback(hObject, eventdata, handles);
4135
4136% --------------------------------------------------------------------
4137function Graph1Bar_Callback(hObject, eventdata, handles)
4138set(handles.Graph1Line,'Checked','Off');
4139set(handles.Graph1Bar, 'Checked','On');
4140cla(handles.Graph1);
4141
4142% Make sure the scale is linear for bar plots
4143set(handles.Graph1,'YScale','Linear');
4144set(handles.YScaleLog1,'Checked','Off');
4145set(handles.YScaleLinear1,'Checked','On');
4146
4147% Update plot
4148OneShot_Callback(hObject, eventdata, handles);
4149
4150
4151% --------------------------------------------------------------------
4152function Graph2Line_Callback(hObject, eventdata, handles)
4153set(handles.Graph2Line,'Checked','On');
4154set(handles.Graph2Bar, 'Checked','Off');
4155cla(handles.Graph2);
4156
4157% Update plot
4158OneShot_Callback(hObject, eventdata, handles);
4159
4160% --------------------------------------------------------------------
4161function Graph2Bar_Callback(hObject, eventdata, handles)
4162set(handles.Graph2Line,'Checked','Off');
4163set(handles.Graph2Bar, 'Checked','On');
4164cla(handles.Graph2);
4165
4166% Make sure the scale is linear for bar plots
4167set(handles.Graph2,'YScale','Linear');
4168set(handles.YScaleLog2,'Checked','Off');
4169set(handles.YScaleLinear2,'Checked','On');
4170
4171% Update plot
4172OneShot_Callback(hObject, eventdata, handles);
4173
4174
4175% --------------------------------------------------------------------
4176function DisabledSetpointChanges_Callback(hObject, eventdata, handles)
4177if strcmpi(get(handles.DisabledSetpointChanges,'Checked'),'Off')
4178    set(handles.DisabledSetpointChanges,'Checked','On');
4179    TurnOffSetpointGUI_Callback(hObject, eventdata, handles);
4180else
4181    set(handles.DisabledSetpointChanges,'Checked','Off');
4182end
4183
4184
4185% --------------------------------------------------------------------
4186function TurnOffSetpointGUI_Callback(hObject, eventdata, handles)
4187% Turn off the setpoint GUI
4188if strcmpi(get(handles.SetpointEditBox,'Visible'),'On')
4189    set(handles.SetpointEditBox,   'Visible', 'Off');
4190    set(handles.SetpointFamily,    'Visible', 'Off');
4191    set(handles.SetpointUnits,     'Visible', 'Off');
4192    set(handles.SetpointSlider,    'Visible', 'Off');
4193    set(handles.SetpointMax,       'Visible', 'Off');
4194    set(handles.SetpointMin,       'Visible', 'Off');
4195    set(handles.SetpointFrame,     'Visible', 'Off');
4196    set(handles.SetpointStepSize,  'Visible', 'Off');
4197    set(handles.SetpointPushButton,'Visible', 'Off');
4198
4199    % Change the save and file text back to full size
4200    p = get(handles.SaveTime, 'Position');
4201    set(handles.SaveTime, 'Position',  [p(1) p(2) p(3)/.353 p(4)]);
4202    p = get(handles.FileNameX, 'Position');
4203    set(handles.FileNameX, 'Position', [p(1) p(2) p(3)/.353 p(4)]);
4204    p = get(handles.FileNameY, 'Position');
4205    set(handles.FileNameY, 'Position', [p(1) p(2) p(3)/.353 p(4)]);
4206
4207    drawnow;
4208end
4209
4210
4211%% What to do before closing the application
4212function Closinggui(obj, event, handles, figure1)
4213
4214% Get default command line output from handles structure
4215answer = questdlg('Close PlotFamily?',...
4216    'Exit PlotFamily Program',...
4217    'Yes','No','Yes');
4218
4219switch answer
4220    case 'Yes'
4221        %         delete(handles); %Delete Timer
4222        delete(figure1); %Close gui
4223    otherwise
4224        disp('Closing aborted')
4225end
4226
4227% --------------------------------------------------------------------
4228function ReloadGoldenOrbit_Callback(hObject, eventdata, handles)
4229% hObject    handle to ReloadGoldenOrbit (see GCBO)
4230% eventdata  reserved - to be defined in a future version of MATLAB
4231% handles    structure with handles and user data (see GUIDATA)
4232
4233setappdata(handles.figure1,'GoldenX', getgolden('BPMx'));
4234setappdata(handles.figure1,'GoldenY', getgolden('BPMz'));
4235OneShot_Callback(hObject, eventdata, handles);
4236
4237
4238
4239
4240% --- Executes when figure1 is resized.
4241function figure1_ResizeFcn(hObject, eventdata, handles)
4242% hObject    handle to figure1 (see GCBO)
4243% eventdata  reserved - to be defined in a future version of MATLAB
4244% handles    structure with handles and user data (see GUIDATA)
4245
4246
4247% --------------------------------------------------------------------
4248function Untitled_13_Callback(hObject, eventdata, handles)
4249% hObject    handle to Graph1Bar (see GCBO)
4250% eventdata  reserved - to be defined in a future version of MATLAB
4251% handles    structure with handles and user data (see GUIDATA)
Note: See TracBrowser for help on using the repository browser.