source: MML/trunk/machine/SOLEIL/StorageRing/bpm/getbpmrawdata_mat.m @ 4

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

Initial import--MML version from SOLEIL@2013

File size: 8.7 KB
Line 
1function varargout = getbpmrawdata_mat(varargin)
2% GETBPMRAWDATA - Gets turn by turn data for  BPM
3%
4%  INPUTS
5%  1. num - bpm number (scalar or vector) list ([] means all valid BPM)
6%
7%  Optional input arguments
8%  2. Optional display
9%     'Display'   - Plot BPM data X,Z, Sum, Q
10%     'NoDisplay' - No plotting
11%  3. 'NoArchive' - No file archive {Default}
12%     'Archive'   - Save a dispersion data structure to \<Directory.BPMData>\<DispArchiveFile><Date><Time>.mat
13%                   To change the filename, included the filename after the 'Archive', '' to browse
14%                   Structure output  is forced
15%  4. 'Struct'    - Return out as a structure
16%  5. 'Freezing'  - Buffer freezing mechanism
17%     'NoFreezing'
18%
19%  OUTPUTS
20%  structure output if 'Struct' precised
21%  AM
22%
23%  vector output
24%  1. X - Horizontal data
25%  2. Z - Vertical data
26%  3. Sum - Sum signal data
27%  4. Q  - Quadrupole signal data
28%  5. Va - electrode data
29%  6. Vb - electrode data
30%  7. Vc - electrode data
31%  8. Vd - electrode data
32%
33%  EXAMPLES
34%  1. Display BPM 18
35%      getbpmrawdata(18)
36%  2. Display all valid BPM and output data as a structure
37%      getbpmrawdata([],'Struct');
38%  3. Output all valid BPM data
39%      [X Z Sum Q Va Vb Vc Vd] = getbpmrawdata([],'NoDisplay');
40%  4. Archives BPM 17 and 18 w/o displaying
41%     getbpmrawdata([17 18],'Archive','NoDisplay');
42%  5. Archives BPM 17 and 18 w/o displaying w/ buffer freezing mechanism
43%     getbpmrawdata([17 18],'Archive','NoDisplay','Freezing');
44%
45% See Also anabpmfirstturn
46
47%
48% Written by Laurent S. Nadolski
49
50% TODO freezing mechanism: introduce group
51
52DisplayFlag = 1;
53ArchiveFlag = 0;
54StructureFlag = 0;
55FreezingFlag = 0;
56FileName='';
57varargin2 = {};
58
59if ~exist('DeviceName','var')
60    DeviceName = [];
61end
62
63for i = length(varargin):-1:1
64    if strcmpi(varargin{i},'Display')
65        DisplayFlag = 1;
66        varargin2 = {varargin2{:} varargin{i}};
67        varargin(i) = [];
68    elseif strcmpi(varargin{i},'NoDisplay')
69        DisplayFlag = 0;
70        varargin2 = {varargin2{:} varargin{i}};
71        varargin(i) = [];
72    elseif strcmpi(varargin{i},'Archive')
73        ArchiveFlag = 1;
74        StructureFlag = 1;
75%        varargin2 = {varargin2{:} varargin{i}};
76        varargin(i) = [];
77    elseif strcmpi(varargin{i},'NoArchive')
78        ArchiveFlag = 0;
79%        varargin2 = {varargin2{:} varargin{i}};
80        varargin(i) = [];
81    elseif strcmpi(varargin{i},'Struct')
82        StructureFlag = 1;
83        varargin2 = {varargin2{:} varargin{i}};
84        varargin(i) = [];
85    elseif strcmpi(varargin{i},'Freezing')
86        FreezingFlag = 1;
87        varargin(i) = [];
88    elseif strcmpi(varargin{i},'NoFreezing')
89        FreezingFlag = 0;
90        varargin(i) = [];
91    end
92end
93
94AO = getfamilydata('BPMx');
95% if empty select all valid BPM
96
97if isempty(varargin)
98    num = 1:length(AO.DeviceName);
99else
100    num = varargin{1};
101    if isempty(num)
102        num = 1:length(AO.DeviceName);
103    end
104end
105
106% Status one devices
107valid  = find(AO.Status);
108num    = intersect(num,valid);
109
110if isempty(num)
111    disp('All BPM not valid')
112    return;
113end
114
115%
116% % read BPM number of samples
117% % If all not the same stop program and ask action to user
118% for k = 1:length(num)
119%     modestr{k} = char(readattribute([AO.DeviceName{num(k)} '/Mode']));
120% end
121%
122% for k = 1:length(num)
123%     sampleNumber(k) = readattribute([AO.DeviceName{num(k)} '/NumSamples']);
124% end
125%
126% notTheSame = sampleNumber-sampleNumber(1);
127%
128% if ~all(strcmp(modestr,modestr{1}))
129%    disp([mfilename ' STOP!']);
130%    error('Not all BPM in the same mode')
131%    return;
132% end
133%
134% if (sum(notTheSame) ~= 0)
135%    disp([mfilename ' STOP!']);
136%    error('Not all BPM with the same number of samples')
137%    return;
138% end
139
140%% Buffer freezing
141% Enable freezing mechanism
142if (FreezingFlag)
143%     hh = warndlg('BPMmanager must be stop and BPM mode be FT or TT');
144%     uiwait(hh);
145    disp([mfilename ': Enabling freezing mecanism']);
146    for k = 1:length(num)
147        tango_command_inout2(AO.DeviceName{num(k)},'EnableBufferFreezing');
148    end
149    disp([mfilename ': Freezing BPM: pseudo synchronism']);
150    for k = 1:length(num)
151        tango_command_inout2(AO.DeviceName{num(k)},'UnFreezeBuffer');
152    end   
153end
154
155%% loop of bpm list
156if length(num) > 1
157    AM.DeviceList=[];
158    for k = 1:length(num)   
159       
160        AM0 = getbpmrawdata_mat(num(k),varargin2{:},'Struct');
161        try
162            AM.DeviceName{k} = AM0.DeviceName{:};
163            AM.Data.X(k,:) = AM0.Data.X(:); AM.Data.Z(k,:) = AM0.Data.Z(:);
164            AM.Data.Sum(k,:) = AM0.Data.Sum(:); AM.Data.Q(k,:) = AM0.Data.Q(:);
165            AM.Data.Va(k,:) = AM0.Data.Va(:); AM.Data.Vb(k,:) = AM0.Data.Vb(:);
166            AM.Data.Vc(k,:) = AM0.Data.Vc(:); AM.Data.Vd(k,:) = AM0.Data.Vd(:);
167            AM.TimeStamp = datestr(now);
168            AM.DataDescriptor = ['Turn by turn data for ' getfamilydata('SubMachine')];
169            AM.CreatedBy = mfilename;
170            AM.DeviceList = [AM.DeviceList; AM0.DeviceList];
171        catch
172            switch lasterr
173                case 'Subscripted assignment dimension mismatch.'
174                    error('BPM do not have the same number of samples !!!')
175            end
176        end
177    end
178
179    % Disable freezing mechanism
180    if (FreezingFlag)
181        disp([mfilename ': disabling buffer freezing for BPM'])
182        for k = 1:length(num)
183            tango_command_inout2(AO.DeviceName{num(k)},'DisableBufferFreezing');
184        end
185    end
186
187else
188    %% Loop for one BPM
189    AO = getfamilydata('BPMx');
190    AO.DeviceName;
191
192    attr_name = ...
193        {'XPosDD','ZPosDD', 'QuadDD', 'SumDD', ...
194        'VaDD', 'VbDD', 'VcDD', 'VdDD'};
195   
196       
197    rep = tango_read_attributes2(AO.DeviceName{num},attr_name);
198
199    X   = rep(1).value;
200    Z   = rep(2).value;
201    Q   = rep(3).value;
202    Sum = rep(4).value;
203    Va  = rep(5).value;
204    Vb  = rep(6).value;
205    Vc  = rep(7).value;
206    Vd  = rep(8).value;
207
208    %% Display part
209
210    if DisplayFlag
211        figure
212        subplot(2,2,1)
213        plot(X)
214        ylabel('X (mm)')
215        grid on
216
217        subplot(2,2,2)
218        plot(Z)
219        ylabel('Z (mm)')
220        grid on
221
222        subplot(2,2,3)
223        plot(Sum)
224        ylabel('SUM')
225        xlabel('turn number')
226        grid on
227
228        subplot(2,2,4)
229        plot(Q)
230        ylabel('Q')
231        xlabel('turn number')
232        grid on
233        addlabel(1,0,datestr(clock));
234        suptitle(sprintf('Turn by turn data for %s',AO.DeviceName{num}))
235    end
236
237    if StructureFlag
238        AM.DeviceName = AO.DeviceName(num);
239        AM.Data.X   = X;
240        AM.Data.Z   = Z;
241        AM.Data.Sum = Sum;
242        AM.Data.Q   = Q;
243        AM.Data.Va  = Va;
244        AM.Data.Vb  = Vb;
245        AM.Data.Vc  = Vc;
246        AM.Data.Vd  = Vd;
247        %time stamp of recording
248        AM.TimeStamp = datestr(now);
249        AM.DataDescriptor = ['Turn by turn data for ' getfamilydata('Machine')];
250        AM.CreatedBy = mfilename;
251        AM.DeviceList = tango2dev(AO.Monitor.TangoNames{num});
252    end
253
254end
255
256if ArchiveFlag
257    % filling up data
258    % Archive data structure
259    if isempty(FileName)
260        FileName = appendtimestamp(getfamilydata('Default', 'BPMArchiveFile'));
261        DirectoryName = getfamilydata('Directory','BPMData');
262        if isempty(DirectoryName)
263            DirectoryName = fullfile(getfamilydata('Directory','DataRoot'), 'BPM');
264        else
265            % Make sure default directory exists
266            DirStart = pwd;
267            [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName);
268            cd(DirStart);
269        end
270        [DirectoryName FileName]
271        [FileName, DirectoryName] = uiputfile('*.mat', 'Select Dispersion File', [DirectoryName FileName]);
272        if FileName == 0
273            ArchiveFlag = 0;
274            disp('   BPM measurement canceled.');
275            FileName='';
276            return
277        end
278        FileName = [DirectoryName, FileName];
279    elseif FileName == -1
280        FileName = appendtimestamp(getfamilydata('Default', 'BPMArchiveFile'));
281        DirectoryName = getfamilydata('Directory','BPMData');
282        if isempty(DirectoryName)
283            DirectoryName = fullfile(getfamilydata('Directory','DataRoot'), 'BPM');
284        end
285        FileName = [DirectoryName, FileName];
286    end
287
288    save(FileName,'AM');
289
290end
291
292if StructureFlag
293    varargout{1} = AM;
294else
295    if exist('AM','var') % not nice but it works
296        varargout{1} = AM.Data.X; varargout{2} =   AM.Data.Z;
297        varargout{3} = AM.Data.Sum; varargout{4} =  AM.Data.Q;
298        varargout{5} = AM.Data.Va; varargout{6} =  AM.Data.Vb;
299        varargout{7} = AM.Data.Vc; varargout{8} =  AM.Data.Vd;
300    else
301        varargout{1} = X;   varargout{2} =   Z;
302        varargout{3} = Sum; varargout{4} =  Q;
303        varargout{5} = Va;  varargout{6} =  Vb;
304        varargout{7} = Vc;  varargout{8} =  Vd;
305    end
306end
Note: See TracBrowser for help on using the repository browser.