mirror of
https://github.com/c-sooyoung/fold_slice.git
synced 2026-09-17 22:49:08 +09:00
182 lines
7.2 KiB
Matlab
182 lines
7.2 KiB
Matlab
%CONVERT2HDF5_WRAPPER converts Eiger 1.5M raw data files to HDF5 and
|
||
% deletes the raw files if the conversion has finished successfully
|
||
% convert2hdf5_wrapper(raw_data_path)
|
||
%
|
||
% ** raw_data_path path to the eiger directory, e.g. ~/Data10/
|
||
%
|
||
% *optional*
|
||
% ** scanID start at the given scan number
|
||
%
|
||
% EXAMPLES:
|
||
% % start at scan number 1:
|
||
% convert2hdf5_wrapper('~/Data10/');
|
||
%
|
||
% % start at scan number 150:
|
||
% convert2hdf5_wrapper('~/Data10/', 150);
|
||
%
|
||
% Pleas note that the script is designed to be used during an ongoing
|
||
% measurement, and therefore only converts n-1 datasets, that is it waits
|
||
% until the next measurement has started.
|
||
|
||
%*-----------------------------------------------------------------------*
|
||
%| |
|
||
%| Except where otherwise noted, this work is licensed under a |
|
||
%| Creative Commons Attribution-NonCommercial-ShareAlike 4.0 |
|
||
%| International (CC BY-NC-SA 4.0) license. |
|
||
%| |
|
||
%| Copyright (c) 2017 by Paul Scherrer Institute (http://www.psi.ch) |
|
||
%| |
|
||
%| Author: CXS group, PSI |
|
||
%*-----------------------------------------------------------------------*
|
||
% You may use this code with the following provisions:
|
||
%
|
||
% If the code is fully or partially redistributed, or rewritten in another
|
||
% computing language this notice should be included in the redistribution.
|
||
%
|
||
% If this code, or subfunctions or parts of it, is used for research in a
|
||
% publication or if it is fully or partially rewritten for another
|
||
% computing language the authors and institution should be acknowledged
|
||
% in written form in the publication: “Data processing was carried out
|
||
% using the “cSAXS matlab package” developed by the CXS group,
|
||
% Paul Scherrer Institut, Switzerland.”
|
||
% Variations on the latter text can be incorporated upon discussion with
|
||
% the CXS group if needed to more specifically reflect the use of the package
|
||
% for the published work.
|
||
%
|
||
% A publication that focuses on describing features, or parameters, that
|
||
% are already existing in the code should be first discussed with the
|
||
% authors.
|
||
%
|
||
% This code and subroutines are part of a continuous development, they
|
||
% are provided “as they are” without guarantees or liability on part
|
||
% of PSI or the authors. It is the user responsibility to ensure its
|
||
% proper use and the correctness of the results.
|
||
|
||
|
||
function convert2hdf5_wrapper(raw_data_path, varargin)
|
||
import utils.*
|
||
if nargin > 1
|
||
scanID = varargin{1};
|
||
else
|
||
scanID = 1;
|
||
end
|
||
while true
|
||
[started, newScan, specDatFile] = beamline.next_scan_started(raw_data_path, scanID);
|
||
if started
|
||
convert2hdf5(scanID, raw_data_path, specDatFile);
|
||
fprintf('Converting scan %d\n', scanID);
|
||
scanID = newScan;
|
||
else
|
||
fprintf('Waiting for next scan to start.\n');
|
||
pause(1);
|
||
end
|
||
end
|
||
|
||
|
||
end
|
||
|
||
|
||
function convert2hdf5(scan, raw_data_path, specDatFile)
|
||
|
||
% some defaults
|
||
convertor_path = '~/Data10/bin/eiger1p5M_converter/hdf5MakerOMNY';
|
||
xmlLayoutFile = '~/Data10/bin/nexus/layout.xml';
|
||
orchestraPath = '~/Data10/specES1/scan_positions/';
|
||
specParser = '~/Data10/matlab/+io/spec_reader/spec_reader';
|
||
|
||
% check if orchestraPath exists
|
||
if exist(orchestraPath, 'dir')
|
||
% orchestraPath = '--orchestra ' + orchestraPath;
|
||
orchestraPath = ['--orchestra ' orchestraPath];
|
||
else
|
||
orchestraPath = '';
|
||
end
|
||
|
||
load_dir = utils.compile_x12sa_dirname(scan);
|
||
if exist('raw_data_path','var')&&exist(fullfile(raw_data_path,load_dir),'dir')
|
||
load_dir = fullfile(raw_data_path,load_dir);
|
||
elseif exist(['~/Data10/eiger_4/'],'dir')
|
||
load_dir = ['~/Data10/eiger_4/' load_dir];
|
||
elseif exist([raw_data_path,'eiger_4/'])
|
||
load_dir = [raw_data_path,'/eiger_4/' load_dir];
|
||
elseif exist([raw_data_path,'/eigeromny/'])
|
||
load_dir = [raw_data_path,'/eigeromny/' load_dir];
|
||
end
|
||
|
||
if ~exist(load_dir, 'dir')
|
||
warning('Raw data path %s not found', load_dir)
|
||
return
|
||
end
|
||
|
||
testDir = [load_dir, '/deleteMe'];
|
||
% test for write permissions by creating a folder and then deleting it
|
||
isWritable = mkdir(testDir);
|
||
% check if directory creation was successful
|
||
if isWritable == 1
|
||
rmdir(fullfile(testDir));
|
||
end
|
||
|
||
list_h5 = dir([load_dir, '/run_*.h5']);
|
||
|
||
|
||
file_sizes = [list_h5.bytes];
|
||
if any(file_sizes < 1e6) % find files < 1MB
|
||
warning('H5 files in scan %i seem damaged, generate again ... ', scan)
|
||
list_raw = dir([load_dir, '/run_d0_f0000000*.raw']);
|
||
if isempty(list_raw)
|
||
warning('RAW data is missing, data cannot be converted')
|
||
return
|
||
else
|
||
delete(sprintf('%s/*.h5',load_dir))
|
||
end
|
||
list_h5 = dir([load_dir, '/run_*.h5']);
|
||
end
|
||
% toc
|
||
if isempty(list_h5)
|
||
if ~isWritable
|
||
warning('Conversion failed because folder %s is not writable', load_dir)
|
||
return
|
||
end
|
||
|
||
list_raw = dir(fullfile(load_dir, 'run_d0_f0000000*.raw'));
|
||
|
||
Nscans = length(list_raw);
|
||
|
||
for ii = 1:Nscans
|
||
ind_scans(ii) = str2num(list_raw(ii).name(16:17));
|
||
end
|
||
|
||
for ii = 1:Nscans
|
||
systemcall = [convertor_path ' ' fullfile(list_raw(1).folder,list_raw(1).name)];
|
||
fprintf('%s\n',systemcall);
|
||
[stat,out] = system(systemcall);
|
||
systemcall = sprintf('%s -s %s --scanNr %u --hdf5 --xmlLayout %s -o %s %s', specParser, specDatFile, scan, xmlLayoutFile, fullfile(load_dir, sprintf('run_%05d_000000000000.h5',scan)), orchestraPath);
|
||
[stat, out] = system(systemcall);
|
||
end
|
||
|
||
list_h5 = dir([load_dir, '/*.h5']);
|
||
if isempty(list_h5)
|
||
error(sprintf('After conversion did not find any h5 in %s\n',load_dir))
|
||
return
|
||
end
|
||
if numel(list_h5)>1
|
||
error(sprintf('After conversion I found more than one h5 in %s\n',load_dir))
|
||
return
|
||
end
|
||
|
||
h5fileinfo = h5info(fullfile(list_h5.folder,list_h5.name), '/entry/instrument/eiger_4/data');
|
||
|
||
nframes_converted = h5fileinfo.Dataspace.Size(3);
|
||
out = splitlines(out);
|
||
nframes_expected = str2num(out{end-2}(14:end));
|
||
fprintf('Frames expected: %i, frames converted %i \n', nframes_expected, nframes_converted)
|
||
if nframes_converted == nframes_expected
|
||
fprintf('Scan %i succefully converted to H5\n', scan);
|
||
delete(sprintf('%s/*.raw',load_dir))
|
||
else
|
||
error('Scan %i WAS NOT CONVERTED to H5\n', scan)
|
||
delete(sprintf('%s/*.h5',load_dir))
|
||
end
|
||
end
|
||
end
|