]> Creatis software - CreaPhase.git/blobdiff - utilities_ESRF/findheader.m
useful functions for simulations, created by ESRF people mainly (free to use)
[CreaPhase.git] / utilities_ESRF / findheader.m
diff --git a/utilities_ESRF/findheader.m b/utilities_ESRF/findheader.m
new file mode 100644 (file)
index 0000000..a24aca1
--- /dev/null
@@ -0,0 +1,127 @@
+## Copyright (C) 2010 Peter Cloetens
+## 
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+## 
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+## GNU General Public License for more details.
+## 
+## You should have received a copy of the GNU General Public License
+## along with Octave; see the file COPYING.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+## findheader
+## function [res, pos] = findheader(hd, what, kind)
+##      read a given info from header of edf-files (.edf), info-file (.info) or parameter file (.par)
+##
+##      arguments
+##      argument 1 : header or info string
+##      argument 2 : parameter to be read (can be 'date')
+##      argument 3 : kind|type of parameter
+##              possible values are: 'motor', 'counter', 'integer', 'float', 'list' or 'string'
+
+## Author: Peter Cloetens cloetens@esrf.eu
+## Created: 2010-12-10
+## * main change from historical version: avoid any assumption on offset, change help
+
+function [res, pos] = findheader(hd, what, kind)
+    
+    if nargin < 3
+        disp('3 input arguments required:')
+        help findheader
+        return
+    end
+
+    if strcmp(what,'date')
+        pos = findstr(hd,what);
+        if !isempty(pos)
+            pos_equal = findstr(hd(pos:end),'=');
+            pos_equal = pos(1)+pos_equal(1)-1;
+            pos_semicolon = findstr(hd(pos_equal:end),';');
+            pos_semicolon = pos_equal+pos_semicolon(1)-1;
+            res = hd(pos_equal+2:pos_semicolon-2);
+        else    % what is not in header
+            res = [];
+        end
+    elseif strcmp(kind,'motor')
+        pos = findstr(hd,'motor_mne');
+        if !isempty(pos)
+            pos_equal = findstr(hd(pos:end),'=');
+            pos_equal = pos(1)+pos_equal(1)-1;
+            pos_semicolon = findstr(hd(pos_equal:end),';');
+            pos_semicolon = pos_equal+pos_semicolon(1)-1;
+            pos = pos_equal+1;
+            posend = pos_semicolon-1;
+            motnum = 1;
+            res = []; % in case motor does not exist
+            while pos<posend; % looking number of motor
+                motor = sscanf(hd(pos:posend),'%s',1);
+                if strcmp(motor, what) % motor was found -> taking corresponding position
+                    pos = findstr(hd,'motor_pos');
+                    pos_equal = findstr(hd(pos:end),'=');
+                    pos_equal = pos(1)+pos_equal(1)-1;
+                    res = sscanf(hd(pos_equal+1:end),'%g',motnum);
+                    res = res(motnum);
+                    break
+                endif
+                motnum++;
+                pos += findstr(hd(pos:posend), motor)(1) + length(motor);
+            endwhile
+        else
+            res = [];
+        endif
+    elseif strcmp(kind,'counter')
+        pos=findstr(hd,'counter_mne');
+        if not(isempty(pos))
+            pos_equal = findstr(hd(pos:end),'=');
+            pos_equal = pos(1)+pos_equal(1)-1;
+            pos_semicolon = findstr(hd(pos_equal:end),';');
+            pos_semicolon = pos_equal+pos_semicolon(1)-1;
+            pos = pos_equal+1;
+            posend = pos_semicolon-1;
+            motnum = 1;
+            res = []; % in case counter does not exist
+            while pos<posend; % looking number of motor
+                motor = sscanf(hd(pos:posend),'%s',1);
+                if strcmp(motor,what) % motor was found -> taking corresponding position
+                    pos = findstr(hd,'counter_pos');
+                    pos_equal = findstr(hd(pos:end),'=');
+                    pos_equal = pos(1)+pos_equal(1)-1;
+                    res = sscanf(hd(pos_equal+1:end),'%g',motnum);
+                    res = res(motnum);
+                    break
+                endif
+                motnum++;
+                pos += findstr(hd(pos:posend), motor)(1) + length(motor);
+            endwhile
+        else
+            res = [];
+        endif
+    else # kind is not 'motor' 'counter' 'date'
+        pos=findstr(hd,what);
+        if not(isempty(pos))
+            pos = pos(1);
+            pos_equal = findstr(hd(pos:end),'=');
+            pos_equal = pos+pos_equal(1);
+            switch kind
+                case 'integer',
+                    res = sscanf(hd(pos_equal:end),'%i');
+                case 'float',
+                    res = sscanf(hd(pos_equal:end),'%f');
+                case 'string',
+                    res = sscanf(hd(pos_equal:end),'%s',1);
+                case 'list',
+                    pos_end = findstr(hd(pos_equal:end),'}');
+                    res = hd(pos_equal:pos_equal+pos_end-1);
+                otherwise,
+                    res = [];
+            endswitch
+        else
+            res = [];
+        endif
+    endif
+endfunction