source: MML/trunk/machine/SOLEIL/common/getbpmrawdata.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: 17.4 KB
Line 
1function varargout = getbpmrawdata(varargin)
2% GETBPMRAWDATA - Get turn by turn data for  BPM
3%
4%  INPUTS
5%  1. Device List bpm number (scalar or vector) list ([] means all valid BPM)
6%
7%  Optional input arguments
8%  2. Optional display {Default}
9%     'Display'     - Plot BPM data X,Z, Sum, Q
10%     {'NoDisplay'} - No plotting
11%  3. 'NoArchive' - No file archive {Default}
12%     'Archive'   - Save a BPM 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%  6. 'Group'  - TAngo group mecanism
19%     'NoGroup'
20%  7. {'XZSum'}  - Select only X Z and Sum signals
21%      'NoXZSum' or 'AllData' - Select only X Z Sum Q, Va, Vb, Vc and Vd signals
22%
23%  OUTPUTS
24%  structure output if 'Struct' precised
25%  AM
26%
27%  Vector output
28%  1. X - Horizontal data
29%  2. Z - Vertical data
30%  3. Sum - Sum signal data
31%  4. Q  - Quadrusspole signal data
32%  5. Va - electrode data
33%  6. Vb - electrode data
34%  7. Vc - electrode data
35%
36%  EXAMPLES
37%  1. Display BPM 18
38%      getbpmrawdata(18)
39%  2. Display all valid BPM and output data as a structure
40%      getbpmrawdata([],'Struct');
41%  3. Output all valid BPM data
42%      [X Z Sum Q Va Vb Vc Vd] = getbpmrawdata([],'NoDisplay');
43%  4. Archives BPM 17 and 18 w/o displaying
44%     getbpmrawdata([17; 18],'Archive','NoDisplay');
45%  5. Archives BPM 17 and 18 w/o displaying w/ buffer freezing mechanism
46%     getbpmrawdata([17; 18],'Archive','NoDisplay','Freezing');
47%  6. Idem via devicelist
48%     getbpmrawdata([17 1; 18 1],'Archive','NoDisplay','Freezing');
49%
50% See Also anabpmfirstturn, convertBPMData2CERNformat
51
52%
53% Written by Laurent S. Nadolski
54% 17 May 2006: group added
55
56% TODO freezing mechanism
57OldLiberaFlag = 0; % Booster version
58DisplayFlag   = 0;
59ArchiveFlag   = 0;
60StructureFlag = 0;
61FreezingFlag  = 0;
62GroupFlag     = 1;
63XZSumFlag     = 1;
64FileName      = '';
65varargin2     = {};
66SAFlag = 0;
67
68if ~exist('DeviceName','var')
69    DeviceName = [];
70end
71
72% Flag factory
73for i = length(varargin):-1:1
74    if strcmpi(varargin{i},'Display')
75        DisplayFlag = 1;
76        varargin2 = {varargin2{:} varargin{i}};
77        varargin(i) = [];
78    elseif strcmpi(varargin{i},'NoDisplay')
79        DisplayFlag = 0;
80        varargin2 = {varargin2{:} varargin{i}};
81        varargin(i) = [];
82    elseif strcmpi(varargin{i},'SA')
83        SAFlag = 1;
84        varargin(i) = [];
85    elseif strcmpi(varargin{i},'Group')
86        GroupFlag = 1;
87        varargin(i) = [];
88    elseif strcmpi(varargin{i},'NoGroup')
89        GroupFlag = 0;
90        % Marie-Agnes modification 23 mai 2006
91        varargin2 = {varargin2{:} varargin{i}};
92        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
93        varargin(i) = [];
94    elseif strcmpi(varargin{i},'Archive')
95        ArchiveFlag = 1;
96        StructureFlag = 1;
97        if length(varargin) > i
98            % Look for a filename as the next input
99            if ischar(varargin{i+1})
100                FileName = varargin{i+1};
101                varargin(i+1) = [];
102            end
103        end
104%        varargin2 = {varargin2{:} varargin{i}};
105        varargin(i) = [];
106    elseif strcmpi(varargin{i},'NoArchive')
107        ArchiveFlag = 0;
108%        varargin2 = {varargin2{:} varargin{i}};
109        varargin(i) = [];
110    elseif strcmpi(varargin{i},'Struct')
111        StructureFlag = 1;
112        varargin2 = {varargin2{:} varargin{i}};
113        varargin(i) = [];
114    elseif strcmpi(varargin{i},'Freezing')
115        FreezingFlag = 1;
116        varargin(i) = [];
117    elseif strcmpi(varargin{i},'NoFreezing')
118        FreezingFlag = 0;
119        varargin(i) = [];
120    elseif strcmpi(varargin{i},'XZSum')
121        XZSumFlag = 1;
122        varargin(i) = [];
123    elseif strcmpi(varargin{i},'NoXZSum') || strcmpi(varargin{i},'AllData')
124        XZSumFlag = 0;
125        varargin(i) = [];
126    end
127end
128
129Machine = getsubmachinename;
130
131switch Machine
132    case 'OldBooster'  % Modif Alex shuntant l'ancien mode BPM booster 28-08-06
133        OldLiberaFlag = 1;
134    otherwise
135        OldLiberaFlag = 0;
136end
137
138AO = getfamilydata('BPMx');
139
140% if empty select all valid BPM
141if isempty(varargin)
142    num = 1:length(AO.DeviceName);
143    DeviceList = family2dev('BPMx');
144else
145    DeviceList = varargin{1};
146    if size(DeviceList,2) == 2 % DeviceList
147        %%
148    else %% Element list       
149        DeviceList = elem2dev('BPMx',DeviceList);
150    end   
151end
152
153% Status one devices
154Status     = family2status('BPMx',DeviceList);
155DeviceList = DeviceList(find(Status),:);
156
157if isempty(DeviceList)
158    disp('All BPM not valid')
159    AM = -1;
160    return;
161end
162
163
164%% Buffer freezing
165% Enable freezing mechanism
166
167if (FreezingFlag)
168
169    if OldLiberaFlag
170        Enablecmd   = 'EnableBufferFreezing';
171        UnFreezecmd = 'UnFreezeBuffer';
172    else
173        Enablecmd   = 'EnableDDBufferFreezing';
174        UnFreezecmd = 'UnFreezeDDBuffer';
175    end
176
177    disp([mfilename ': Enabling freezing mecanism']);
178    for k = 1:length(DeviceList)
179        tango_command_inout2(DeviceName{k},Enablecmd);
180    end
181    disp([mfilename ': Freezing BPM: pseudo synchronism']);
182    for k = 1:length(DeviceList)
183        tango_command_inout2(DeviceName{k},UnFreezecmd);
184    end
185end
186
187% Group definition
188if GroupFlag
189    if ~SAFlag
190        if OldLiberaFlag
191            attr_name = ...
192                {'XPosVector','ZPosVector', 'QuadVector', 'SumVector', ...
193                'VaVector', 'VbVector', 'VcVector', 'VdVector'};
194        else
195            if ~XZSumFlag
196                attr_name = ...
197                    {'XPosDD','ZPosDD', 'SumDD', 'QuadDD', ...
198                    'VaDD', 'VbDD', 'VcDD', 'VdDD'};
199            else
200                attr_name = {'XPosDD','ZPosDD', 'SumDD'};
201            end
202        end
203    else
204            if ~XZSumFlag
205                attr_name = ...
206                    {'XPosSA','ZPosSA', 'SumSA', 'QuadSA', ...
207                    'VaSA', 'VbSA', 'VcSA', 'VdSA'};
208            else
209                attr_name = {'XPosSA','ZPosSA', 'SumSA'};
210            end
211    end
212
213    GroupId =getfamilydata('BPMx', 'GroupId');
214
215    % get all BPMs
216    DeviceListFull = family2dev('BPMx',0);
217    % disable all
218    tango_group_disable_device2(GroupId, dev2tangodev('BPMx',DeviceListFull));
219    % Enable only valid BPM
220    tango_group_enable_device2(GroupId, dev2tangodev('BPMx',DeviceList));
221
222    % Stimulate connexion TANGO bug
223    tango_group_ping(GroupId);
224
225    if ~SAFlag
226        % Check buffer size
227        rep = tango_group_read_attribute2(GroupId,'DDBufferSize',0);
228
229        % take minimum turn number for common buffersize
230        turnNumber = min(rep);
231        if mean(rep) ~= rep(1)
232            warning(['Buffer size not the same for all BPMs: max= %d turns,  min= %d turns', ...
233                '\nCheck BPM buffer size for all BPMs'],max(rep), min(rep));
234        end
235    else
236        turnNumber = 1;
237    end
238   
239    rep = tango_group_read_attributes(GroupId,attr_name,0);
240    if tango_error == -1
241        tango_print_error_stack
242        return
243    end
244   
245    if rep.has_failed
246        disp('Error when reading data for BPM');
247        for k = 1:length(rep.dev_replies),
248            if rep.dev_replies(k).has_failed
249                fprintf('Error with device %s\n',rep.dev_replies(k).dev_name)
250                tango_print_error_stack_as_it_is(rep.dev_replies(k).attr_values(1).error)
251            end
252        end       
253        error('Programme %s Stopped', mfilename);
254    else
255        kActiveBPM = zeros(size(rep.dev_replies,2),1);
256
257        AM.DeviceName = cell(size(rep.dev_replies,2),1);
258        % initialize data
259        % read turnNumber on first BPM and assume all BPM have the same number of turns
260        %turnNumber  = readattribute([char(family2tangodev('BPMx', DeviceList(1,:))) '/DDBufferSize']);
261        AM.Data.X   = zeros(size(rep.dev_replies,2),turnNumber);
262        AM.Data.Z   = zeros(size(rep.dev_replies,2),turnNumber);
263        AM.Data.Sum = zeros(size(rep.dev_replies,2),turnNumber);
264       
265        if ~XZSumFlag
266            AM.Data.Q  = zeros(size(rep.dev_replies,2),turnNumber);
267            AM.Data.Va = zeros(size(rep.dev_replies,2),turnNumber);
268            AM.Data.Vb = zeros(size(rep.dev_replies,2),turnNumber);
269            AM.Data.Vc = zeros(size(rep.dev_replies,2),turnNumber);
270            AM.Data.Vd = zeros(size(rep.dev_replies,2),turnNumber);
271        end
272       
273        % Loop over all BPM
274        for kbpm = 1:size(rep.dev_replies,2),
275            kActiveBPM(kbpm) = rep.dev_replies(kbpm).is_enabled;
276           
277            % Selected just active BPM
278            if rep.dev_replies(kbpm).is_enabled
279                %rep.dev_replies(k).attr_values(1).dev_name;
280                AM.DeviceName{kbpm} = rep.dev_replies(kbpm).attr_values(1).dev_name;
281                if length(rep.dev_replies(kbpm).attr_values(1).value) < turnNumber
282                    error('BPM %s datalength is %d <= %d', AM.DeviceName{kbpm}, ...
283                        length(rep.dev_replies(kbpm).attr_values(1).value), turnNumber);
284                end
285                AM.Data.X(kbpm,:)   = rep.dev_replies(kbpm).attr_values(1).value(1:turnNumber);
286                AM.Data.Z(kbpm,:)   = rep.dev_replies(kbpm).attr_values(2).value(1:turnNumber);
287                AM.Data.Sum(kbpm,:) = rep.dev_replies(kbpm).attr_values(3).value(1:turnNumber);
288
289                % If more than X, Z, SUM is needed
290                if ~XZSumFlag
291                    AM.Data.Q(kbpm,:)   = rep.dev_replies(kbpm).attr_values(4).value(1:turnNumber);
292                    AM.Data.Va(kbpm,:)  = rep.dev_replies(kbpm).attr_values(5).value(1:turnNumber);
293                    AM.Data.Vb(kbpm,:)  = rep.dev_replies(kbpm).attr_values(6).value(1:turnNumber);
294                    AM.Data.Vc(kbpm,:)  = rep.dev_replies(kbpm).attr_values(7).value(1:turnNumber);
295                    AM.Data.Vd(kbpm,:)  = rep.dev_replies(kbpm).attr_values(8).value(1:turnNumber);
296                end
297                %%%%%%%%%%% modification
298                klast = kbpm;
299                %%%%%%%%%%%%%%%%%%%%%%%%
300           
301                % Display Data X Z SUM
302                if DisplayFlag
303                    figure
304                    subplot(3,1,1)
305                    plot(AM.Data.X(kbpm,:))
306                    ylabel('X (mm)')
307                    grid on
308
309                    subplot(3,1,2)
310                    plot(AM.Data.Z(kbpm,:))
311                    ylabel('Z (mm)')
312                    grid on
313
314                    subplot(3,1,3)
315                    plot(AM.Data.Sum(kbpm,:))
316                    ylabel('SUM')
317                    xlabel('turn number')
318                    grid on
319                    addlabel(1,0,datestr(clock));
320                    suptitle(sprintf('Turn by turn data for %s',AM.DeviceName{kbpm}))
321                end % Display loop
322            end % enabled BPM
323        end % BPM loop
324       
325        % Selected only data for asked BPMs
326        AM.DeviceName(find(1-kActiveBPM)) = []; % Remove empty data BPM
327       
328        % Store data in structure
329        kgoodBPM = find(kActiveBPM);
330       
331        % Slected only valid data, ie. for selectged BPM, other are zeros
332        AM.Data.X   = AM.Data.X(kgoodBPM,:);
333        AM.Data.Z   = AM.Data.Z(kgoodBPM,:);
334        AM.Data.Sum = AM.Data.Sum(kgoodBPM,:);
335       
336        if ~XZSumFlag
337            AM.Data.Q  = AM.Data.Q(kgoodBPM,:);
338            AM.Data.Va = AM.Data.Va(kgoodBPM,:);
339            AM.Data.Vb = AM.Data.Vb(kgoodBPM,:);
340            AM.Data.Vc = AM.Data.Vc(kgoodBPM,:);
341            AM.Data.Vd = AM.Data.Vd(kgoodBPM,:);
342        end
343       
344        % add description data
345        AM.TimeStamp = datestr(now);
346        AM.DataDescriptor = ['Turn by turn data for ' getsubmachinename];
347        AM.CreatedBy = mfilename;
348        AM.DeviceList = DeviceList;
349        AM.DeviceName = AM.DeviceName';
350        AM.Dcct = getdcct;
351    end
352else
353    %% loop of bpm list
354    if size(DeviceList,1) > 1
355        AM.DeviceList=[];
356        for k = 1:length(DeviceList)
357            AM0 = getbpmrawdata(DeviceList(k,:),varargin2{:},'Struct');
358            try
359                AM.DeviceName{k} = AM0.DeviceName{:};
360                AM.Data.X(k,:) = AM0.Data.X(:); AM.Data.Z(k,:) = AM0.Data.Z(:);
361                AM.Data.Sum(k,:) = AM0.Data.Sum(:);
362                if ~XZSumFlag
363                    AM.Data.Q(k,:)  = AM0.Data.Q(:);
364                    AM.Data.Va(k,:) = AM0.Data.Va(:); AM.Data.Vb(k,:) = AM0.Data.Vb(:);
365                    AM.Data.Vc(k,:) = AM0.Data.Vc(:); AM.Data.Vd(k,:) = AM0.Data.Vd(:);
366                end
367                AM.TimeStamp = datestr(now);
368                AM.DataDescriptor = ['Turn by turn data for ' getsubmachinename];
369                AM.CreatedBy = mfilename;
370                AM.DeviceList = [AM.DeviceList; AM0.DeviceList];
371            catch
372                switch lasterr
373                    case 'Subscripted assignment dimension mismatch.'
374                        error('BPM do not have the same number of samples !!!\n see BPM %s', AM.DeviceName{k})
375                    otherwise
376                        fprintf('error %s\n', lasterr)
377                end
378            end
379        end
380
381        if (FreezingFlag)
382
383            % Disable freezing mechanism
384            if OldLiberaFlag
385                Disablecmd = 'DisableBufferFreezing';
386            else
387                Disablecmd = 'DisableDDBufferFreezing';
388            end
389
390            disp([mfilename ': disabling buffer freezing for BPM'])
391            for k = 1:length(DeviceList)
392                tango_command_inout2(DeviceName{k}, Disablecmd);
393            end
394        end
395
396    else
397        %% Loop for one BPM
398        AO = getfamilydata('BPMx');
399        DeviceName = family2tangodev('BPMx',DeviceList);
400
401        if OldLiberaFlag
402            attr_name = ...
403                {'XPosVector','ZPosVector', 'QuadVector', 'SumVector', ...
404                'VaVector', 'VbVector', 'VcVector', 'VdVector'};
405        else
406            if ~XZSumFlag
407                attr_name = ...
408                    {'XPosDD','ZPosDD', 'QuadDD', 'SumDD', ...
409                    'VaDD', 'VbDD', 'VcDD', 'VdDD'};
410            else
411                attr_name = {'XPosDD','ZPosDD', 'SumDD'};
412            end
413        end
414
415
416
417        rep = tango_read_attributes2(DeviceName{:},attr_name);
418
419        X   = rep(1).value;
420        Z   = rep(2).value;
421        Sum = rep(3).value;
422        if ~XZSumFlag
423            Q   = rep(4).value;
424            Va  = rep(5).value;
425            Vb  = rep(6).value;
426            Vc  = rep(7).value;
427            Vd  = rep(8).value;
428        end
429        %% Display part
430
431        if DisplayFlag
432            figure
433            subplot(3,1,1)
434            plot(X)
435            ylabel('X (mm)')
436            grid on
437
438            subplot(3,1,2)
439            plot(Z)
440            ylabel('Z (mm)')
441            grid on
442
443            subplot(3,1,3)
444            plot(Sum)
445            ylabel('SUM')
446            xlabel('turn number')
447            grid on
448
449            addlabel(1,0,datestr(clock));
450            suptitle(sprintf('Turn by turn data for %s',DeviceName{:}))
451        end
452
453        if StructureFlag % Build up structure           
454            AM.DeviceList = DeviceList;           
455            AM.DeviceName = DeviceName;
456            AM.Data.X   = X;
457            AM.Data.Z   = Z;
458            AM.Data.Sum = Sum;
459            if ~XZSumFlag
460                AM.Data.Q   = Q;
461                AM.Data.Va  = Va;
462                AM.Data.Vb  = Vb;
463                AM.Data.Vc  = Vc;
464                AM.Data.Vd  = Vd;
465            end
466            %time stamp of recording
467            AM.TimeStamp = datestr(now);
468            AM.DataDescriptor = ['Turn by turn data for ' getfamilydata('Machine')];
469            AM.CreatedBy  = mfilename;
470            AM.DeviceList = DeviceList;
471        end
472    end
473end
474
475if ArchiveFlag
476    % filling up data
477    % Archive data structure
478    if isempty(FileName)
479        FileName = appendtimestamp('BPMTurnByTurn');
480        DirectoryName = getfamilydata('Directory','BPMData');
481        if isempty(DirectoryName)
482            DirectoryName = [getfamilydata('Directory','DataRoot') 'BPM', filesep];
483        else
484            % Make sure default directory exists
485            DirStart = pwd;
486            [DirectoryName, ErrorFlag] = gotodirectory(DirectoryName);
487            cd(DirStart);
488        end
489        [DirectoryName FileName]
490        [FileName, DirectoryName] = uiputfile('*.mat', 'Select FileName', [DirectoryName FileName]);
491        if FileName == 0
492            ArchiveFlag = 0;
493            disp('   BPM measurement canceled.');
494            FileName='';
495            return
496        end
497        FileName = [DirectoryName, FileName];
498    elseif FileName == -1
499        FileName = appendtimestamp(getfamilydata('Default', 'BPMArchiveFile'));
500        DirectoryName = getfamilydata('Directory','BPMData');
501        if isempty(DirectoryName)
502            DirectoryName = [getfamilydata('Directory','DataRoot') 'BPM', filesep];
503        end
504        FileName = [DirectoryName, FileName];
505    end
506
507    save(FileName,'AM');
508
509end
510
511% Build up structure
512if StructureFlag
513    varargout{1} = AM;
514else
515    if exist('AM','var') % not nice but it works
516        varargout{1} = AM.Data.X;   varargout{2}  =  AM.Data.Z;
517        varargout{3} = AM.Data.Sum;
518        if ~XZSumFlag
519            varargout{4} =  AM.Data.Q;
520            varargout{5} = AM.Data.Va;  varargout{6}  =  AM.Data.Vb;
521            varargout{7} = AM.Data.Vc;  varargout{8}  =  AM.Data.Vd;
522        end
523    else
524        varargout{1} = X;   varargout{2} =   Z;
525        varargout{3} = Sum;
526        if ~XZSumFlag
527            varargout{4} =  Q;
528            varargout{5} = Va;  varargout{6} =  Vb;
529            varargout{7} = Vc;  varargout{8} =  Vd;
530        end
531    end
532end
Note: See TracBrowser for help on using the repository browser.