mirror of
https://github.com/c-sooyoung/fold_slice.git
synced 2026-09-18 00:09:10 +09:00
initial commit
This commit is contained in:
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
Compilation from Matlab:
|
||||
maybe a tiny bit faster code is generated by
|
||||
mex -largeArrayDims 'CFLAGS="\$CFLAGS -std=c99 -fopenmp"' LDFLAGS="\$LDFLAGS -fopenmp" get_projections_cpu_mex.c
|
||||
|
||||
Usage from Matlab:
|
||||
set_projections_cpu_mex(probe,object,positions, Npos);
|
||||
|
||||
This code in matlab:
|
||||
asize = size(probe);
|
||||
for i=1:Npos
|
||||
Indy = positions(i,1) + (1:asize(1));
|
||||
Indx = positions(i,2) + (1:asize(2));
|
||||
ob(Indy,Indx) = ob(Indy,Indx) + probe;
|
||||
end
|
||||
|
||||
Academic License Agreement
|
||||
|
||||
Source Code
|
||||
|
||||
Introduction
|
||||
• This license agreement sets forth the terms and conditions under which the PAUL SCHERRER INSTITUT (PSI), CH-5232 Villigen-PSI, Switzerland (hereafter "LICENSOR")
|
||||
will grant you (hereafter "LICENSEE") a royalty-free, non-exclusive license for academic, non-commercial purposes only (hereafter "LICENSE") to use the cSAXS
|
||||
ptychography MATLAB package computer software program and associated documentation furnished hereunder (hereafter "PROGRAM").
|
||||
|
||||
Terms and Conditions of the LICENSE
|
||||
1. LICENSOR grants to LICENSEE a royalty-free, non-exclusive license to use the PROGRAM for academic, non-commercial purposes, upon the terms and conditions
|
||||
hereinafter set out and until termination of this license as set forth below.
|
||||
2. LICENSEE acknowledges that the PROGRAM is a research tool still in the development stage. The PROGRAM is provided without any related services, improvements
|
||||
or warranties from LICENSOR and that the LICENSE is entered into in order to enable others to utilize the PROGRAM in their academic activities. It is the
|
||||
LICENSEE’s responsibility to ensure its proper use and the correctness of the results.”
|
||||
3. THE PROGRAM IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR
|
||||
A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. IN NO EVENT SHALL THE LICENSOR, THE AUTHORS OR THE COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY ARISING FROM, OUT OF OR IN CONNECTION WITH THE PROGRAM OR THE USE
|
||||
OF THE PROGRAM OR OTHER DEALINGS IN THE PROGRAM.
|
||||
4. LICENSEE agrees that it will use the PROGRAM and any modifications, improvements, or derivatives of PROGRAM that LICENSEE may create (collectively,
|
||||
"IMPROVEMENTS") solely for academic, non-commercial purposes and that any copy of PROGRAM or derivatives thereof shall be distributed only under the same
|
||||
license as PROGRAM. The terms "academic, non-commercial", as used in this Agreement, mean academic or other scholarly research which (a) is not undertaken for
|
||||
profit, or (b) is not intended to produce works, services, or data for commercial use, or (c) is neither conducted, nor funded, by a person or an entity engaged
|
||||
in the commercial use, application or exploitation of works similar to the PROGRAM.
|
||||
5. LICENSEE agrees that it shall make the following acknowledgement in any publication resulting from the use of the PROGRAM or any translation of the code into
|
||||
another computing language:
|
||||
"Data processing was carried out using the cSAXS ptychography MATLAB package developed by the Science IT and the coherent X-ray scattering (CXS) groups, Paul
|
||||
Scherrer Institut, Switzerland."
|
||||
|
||||
Additionally, any publication using the package, or any translation of the code into another computing language should cite for difference map:
|
||||
P. Thibault, M. Dierolf, A. Menzel, O. Bunk, C. David, F. Pfeiffer, High-resolution scanning X-ray diffraction microscopy, Science 321, 379–382 (2008).
|
||||
(doi: 10.1126/science.1158573),
|
||||
for maximum likelihood:
|
||||
P. Thibault and M. Guizar-Sicairos, Maximum-likelihood refinement for coherent diffractive imaging, New J. Phys. 14, 063004 (2012).
|
||||
(doi: 10.1088/1367-2630/14/6/063004),
|
||||
for mixed coherent modes:
|
||||
P. Thibault and A. Menzel, Reconstructing state mixtures from diffraction measurements, Nature 494, 68–71 (2013). (doi: 10.1038/nature11806),
|
||||
and/or for multislice:
|
||||
E. H. R. Tsai, I. Usov, A. Diaz, A. Menzel, and M. Guizar-Sicairos, X-ray ptychography with extended depth of field, Opt. Express 24, 29089–29108 (2016).
|
||||
(doi: 10.1364/OE.24.029089).
|
||||
6. Except for the above-mentioned acknowledgment, LICENSEE shall not use the PROGRAM title or the names or logos of LICENSOR, nor any adaptation thereof, nor the
|
||||
names of any of its employees or laboratories, in any advertising, promotional or sales material without prior written consent obtained from LICENSOR in each case.
|
||||
7. Ownership of all rights, including copyright in the PROGRAM and in any material associated therewith, shall at all times remain with LICENSOR, and LICENSEE
|
||||
agrees to preserve same. LICENSEE agrees not to use any portion of the PROGRAM or of any IMPROVEMENTS in any machine-readable form outside the PROGRAM, nor to
|
||||
make any copies except for its internal use, without prior written consent of LICENSOR. LICENSEE agrees to place the following copyright notice on any such copies:
|
||||
© All rights reserved. PAUL SCHERRER INSTITUT, Switzerland, Laboratory for Macromolecules and Bioimaging, 2017.
|
||||
8. The LICENSE shall not be construed to confer any rights upon LICENSEE by implication or otherwise except as specifically set forth herein.
|
||||
9. DISCLAIMER: LICENSEE shall be aware that Phase Focus Limited of Sheffield, UK has an international portfolio of patents and pending applications which relate
|
||||
to ptychography and that the PROGRAM may be capable of being used in circumstances which may fall within the claims of one or more of the Phase Focus patents,
|
||||
in particular of patent with international application number PCT/GB2005/001464. The LICENSOR explicitly declares not to indemnify the users of the software
|
||||
in case Phase Focus or any other third party will open a legal action against the LICENSEE due to the use of the program.
|
||||
10. This Agreement shall be governed by the material laws of Switzerland and any dispute arising out of this Agreement or use of the PROGRAM shall be brought before
|
||||
the courts of Zürich, Switzerland.
|
||||
*/
|
||||
|
||||
#include "mex.h"
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <omp.h>
|
||||
|
||||
void mexFunction(int nlhs, mxArray *plhs[],
|
||||
int nrhs, const mxArray *prhs[])
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Check for proper number of arguments. */
|
||||
if (nrhs != 4)
|
||||
mexErrMsgTxt("Four input arguments required: set_projections_cpu_mex(probe,object,positions,Npos)");
|
||||
else if (nlhs != 0)
|
||||
mexErrMsgTxt("No output argument has to be specified.");
|
||||
|
||||
/* Input must be of type single. */
|
||||
for (i=0; i < 2; i++) {
|
||||
if (mxIsSingle(prhs[i]) != 1){
|
||||
printf("Input %d is not single\n",i+1);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Inputs must be of correct type.");
|
||||
}
|
||||
}
|
||||
/* Input must be of type int32. */
|
||||
for (i=2; i<nrhs; i++){
|
||||
if (mxIsInt32(prhs[i]) != 1){
|
||||
printf("Input %d is not integer\n",i+1);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Inputs must be of correct type.");
|
||||
}
|
||||
}
|
||||
|
||||
/* It cannot be one-dimensional */
|
||||
if(mxGetNumberOfDimensions(prhs[0]) < 2) {
|
||||
printf("The 1st input argument must have at least two dimensions.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong number of dimensions");
|
||||
}
|
||||
/* It cannot be more than 3-dimensional */
|
||||
if(mxGetNumberOfDimensions(prhs[0]) > 3) {
|
||||
printf("The 1st input argument must have at most three dimensions.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong number of dimensions");
|
||||
}
|
||||
/* Check that arrays are complex */
|
||||
if(mxIsComplex(prhs[0]) != 1) {
|
||||
printf("object input argument must be complex-valued.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Expected complex arrays");
|
||||
}
|
||||
if(mxIsComplex(prhs[1]) != 1) {
|
||||
printf("probe input argument must be complex-valued.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Expected complex arrays");
|
||||
}
|
||||
|
||||
float const *object_r, *object_i;
|
||||
float *projection_r,*projection_i;
|
||||
const int *positions, *ind_ok;
|
||||
|
||||
ind_ok = (int*)mxGetData(prhs[3]);
|
||||
positions = (int*)mxGetData(prhs[2]);
|
||||
object_r = (float*)mxGetData(prhs[0]);
|
||||
projection_r = (float*)mxGetData(prhs[1]);
|
||||
|
||||
/* get pointers to input data */
|
||||
object_i = (float*)mxGetImagData(prhs[0]);
|
||||
projection_i = (float*)mxGetImagData(prhs[1]);
|
||||
|
||||
|
||||
|
||||
/* Get dimension of probe and object */
|
||||
mwSize const * dims;
|
||||
mwSize const Ndims = mxGetNumberOfDimensions(prhs[1]);
|
||||
dims = mxGetDimensions(prhs[1]);
|
||||
mwSize const No_y = mxGetM(prhs[0]);
|
||||
mwSize const No_x = mxGetN(prhs[0]);
|
||||
mwSize const Np_y = dims[0];
|
||||
mwSize const Np_x = dims[1];
|
||||
mwSize const Npos = mxGetNumberOfElements(prhs[3]);
|
||||
|
||||
if((mxGetM(prhs[3]) > dims[2])) {
|
||||
printf("wrong size of update / positions %i", Ndims);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong size of update / positions");
|
||||
}
|
||||
|
||||
int id_small, id_large, pos, col, row, p;
|
||||
|
||||
#pragma omp parallel for private(p,pos,col, row, id_small, id_large)
|
||||
for (p=0;p<Npos;p++){
|
||||
pos = ind_ok[p]-1;
|
||||
for (col=0;col<Np_x;col++) {
|
||||
for (row=0;row<Np_y;row++) {
|
||||
id_small = row + col*Np_y + Np_y*Np_x*pos;
|
||||
id_large = row + positions[pos] + (col+positions[pos+Npos])*No_y;
|
||||
projection_r[id_small] = object_r[id_large];
|
||||
projection_i[id_small] = object_i[id_large];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
Compilation from Matlab:
|
||||
maybe a tiny bit faster code is generated by
|
||||
mex -largeArrayDims 'CFLAGS="\$CFLAGS -std=c99 -fopenmp"' LDFLAGS="\$LDFLAGS -fopenmp" get_projections_cpu_mex_double.c
|
||||
|
||||
Usage from Matlab:
|
||||
set_projections_cpu_mex(probe,object,positions, Npos);
|
||||
|
||||
This code in matlab:
|
||||
asize = size(probe);
|
||||
for i=1:Npos
|
||||
Indy = positions(i,1) + (1:asize(1));
|
||||
Indx = positions(i,2) + (1:asize(2));
|
||||
ob(Indy,Indx) = ob(Indy,Indx) + probe;
|
||||
end
|
||||
|
||||
Academic License Agreement
|
||||
|
||||
Source Code
|
||||
|
||||
Introduction
|
||||
• This license agreement sets forth the terms and conditions under which the PAUL SCHERRER INSTITUT (PSI), CH-5232 Villigen-PSI, Switzerland (hereafter "LICENSOR")
|
||||
will grant you (hereafter "LICENSEE") a royalty-free, non-exclusive license for academic, non-commercial purposes only (hereafter "LICENSE") to use the cSAXS
|
||||
ptychography MATLAB package computer software program and associated documentation furnished hereunder (hereafter "PROGRAM").
|
||||
|
||||
Terms and Conditions of the LICENSE
|
||||
1. LICENSOR grants to LICENSEE a royalty-free, non-exclusive license to use the PROGRAM for academic, non-commercial purposes, upon the terms and conditions
|
||||
hereinafter set out and until termination of this license as set forth below.
|
||||
2. LICENSEE acknowledges that the PROGRAM is a research tool still in the development stage. The PROGRAM is provided without any related services, improvements
|
||||
or warranties from LICENSOR and that the LICENSE is entered into in order to enable others to utilize the PROGRAM in their academic activities. It is the
|
||||
LICENSEE’s responsibility to ensure its proper use and the correctness of the results.”
|
||||
3. THE PROGRAM IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR
|
||||
A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. IN NO EVENT SHALL THE LICENSOR, THE AUTHORS OR THE COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY ARISING FROM, OUT OF OR IN CONNECTION WITH THE PROGRAM OR THE USE
|
||||
OF THE PROGRAM OR OTHER DEALINGS IN THE PROGRAM.
|
||||
4. LICENSEE agrees that it will use the PROGRAM and any modifications, improvements, or derivatives of PROGRAM that LICENSEE may create (collectively,
|
||||
"IMPROVEMENTS") solely for academic, non-commercial purposes and that any copy of PROGRAM or derivatives thereof shall be distributed only under the same
|
||||
license as PROGRAM. The terms "academic, non-commercial", as used in this Agreement, mean academic or other scholarly research which (a) is not undertaken for
|
||||
profit, or (b) is not intended to produce works, services, or data for commercial use, or (c) is neither conducted, nor funded, by a person or an entity engaged
|
||||
in the commercial use, application or exploitation of works similar to the PROGRAM.
|
||||
5. LICENSEE agrees that it shall make the following acknowledgement in any publication resulting from the use of the PROGRAM or any translation of the code into
|
||||
another computing language:
|
||||
"Data processing was carried out using the cSAXS ptychography MATLAB package developed by the Science IT and the coherent X-ray scattering (CXS) groups, Paul
|
||||
Scherrer Institut, Switzerland."
|
||||
|
||||
Additionally, any publication using the package, or any translation of the code into another computing language should cite for difference map:
|
||||
P. Thibault, M. Dierolf, A. Menzel, O. Bunk, C. David, F. Pfeiffer, High-resolution scanning X-ray diffraction microscopy, Science 321, 379–382 (2008).
|
||||
(doi: 10.1126/science.1158573),
|
||||
for maximum likelihood:
|
||||
P. Thibault and M. Guizar-Sicairos, Maximum-likelihood refinement for coherent diffractive imaging, New J. Phys. 14, 063004 (2012).
|
||||
(doi: 10.1088/1367-2630/14/6/063004),
|
||||
for mixed coherent modes:
|
||||
P. Thibault and A. Menzel, Reconstructing state mixtures from diffraction measurements, Nature 494, 68–71 (2013). (doi: 10.1038/nature11806),
|
||||
and/or for multislice:
|
||||
E. H. R. Tsai, I. Usov, A. Diaz, A. Menzel, and M. Guizar-Sicairos, X-ray ptychography with extended depth of field, Opt. Express 24, 29089–29108 (2016).
|
||||
(doi: 10.1364/OE.24.029089).
|
||||
6. Except for the above-mentioned acknowledgment, LICENSEE shall not use the PROGRAM title or the names or logos of LICENSOR, nor any adaptation thereof, nor the
|
||||
names of any of its employees or laboratories, in any advertising, promotional or sales material without prior written consent obtained from LICENSOR in each case.
|
||||
7. Ownership of all rights, including copyright in the PROGRAM and in any material associated therewith, shall at all times remain with LICENSOR, and LICENSEE
|
||||
agrees to preserve same. LICENSEE agrees not to use any portion of the PROGRAM or of any IMPROVEMENTS in any machine-readable form outside the PROGRAM, nor to
|
||||
make any copies except for its internal use, without prior written consent of LICENSOR. LICENSEE agrees to place the following copyright notice on any such copies:
|
||||
© All rights reserved. PAUL SCHERRER INSTITUT, Switzerland, Laboratory for Macromolecules and Bioimaging, 2017.
|
||||
8. The LICENSE shall not be construed to confer any rights upon LICENSEE by implication or otherwise except as specifically set forth herein.
|
||||
9. DISCLAIMER: LICENSEE shall be aware that Phase Focus Limited of Sheffield, UK has an international portfolio of patents and pending applications which relate
|
||||
to ptychography and that the PROGRAM may be capable of being used in circumstances which may fall within the claims of one or more of the Phase Focus patents,
|
||||
in particular of patent with international application number PCT/GB2005/001464. The LICENSOR explicitly declares not to indemnify the users of the software
|
||||
in case Phase Focus or any other third party will open a legal action against the LICENSEE due to the use of the program.
|
||||
10. This Agreement shall be governed by the material laws of Switzerland and any dispute arising out of this Agreement or use of the PROGRAM shall be brought before
|
||||
the courts of Zürich, Switzerland.
|
||||
*/
|
||||
|
||||
#include "mex.h"
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <omp.h>
|
||||
|
||||
void mexFunction(int nlhs, mxArray *plhs[],
|
||||
int nrhs, const mxArray *prhs[])
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Check for proper number of arguments. */
|
||||
if (nrhs != 4)
|
||||
mexErrMsgTxt("Four input arguments required: set_projections_cpu_mex(probe,object,positions,Npos)");
|
||||
else if (nlhs != 0)
|
||||
mexErrMsgTxt("No output argument has to be specified.");
|
||||
|
||||
/* Input must be of type double. */
|
||||
for (i=0; i < 2; i++) {
|
||||
if (mxIsDouble(prhs[i]) != 1){
|
||||
printf("Input %d is not double\n",i+1);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Inputs must be of correct type.");
|
||||
}
|
||||
}
|
||||
/* Input must be of type int32. */
|
||||
for (i=2; i<nrhs; i++){
|
||||
if (mxIsInt32(prhs[i]) != 1){
|
||||
printf("Input %d is not integer\n",i+1);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Inputs must be of correct type.");
|
||||
}
|
||||
}
|
||||
|
||||
/* It cannot be one-dimensional */
|
||||
if(mxGetNumberOfDimensions(prhs[0]) < 2) {
|
||||
printf("The 1st input argument must have at least two dimensions.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong number of dimensions");
|
||||
}
|
||||
/* It cannot be more than 3-dimensional */
|
||||
if(mxGetNumberOfDimensions(prhs[0]) > 3) {
|
||||
printf("The 1st input argument must have at most three dimensions.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong number of dimensions");
|
||||
}
|
||||
/* Check that arrays are complex */
|
||||
if(mxIsComplex(prhs[0]) != 1) {
|
||||
printf("object input argument must be complex-valued.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Expected complex arrays");
|
||||
}
|
||||
if(mxIsComplex(prhs[1]) != 1) {
|
||||
printf("probe input argument must be complex-valued.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Expected complex arrays");
|
||||
}
|
||||
|
||||
double const *object_r, *object_i;
|
||||
double *projection_r,*projection_i;
|
||||
int *positions, *ind_ok;
|
||||
|
||||
ind_ok = (int*)mxGetData(prhs[3]);
|
||||
positions = (int*)mxGetData(prhs[2]);
|
||||
object_r = (double*)mxGetData(prhs[0]);
|
||||
projection_r = (double*)mxGetData(prhs[1]);
|
||||
|
||||
/* get pointers to input data */
|
||||
object_i = (double*)mxGetImagData(prhs[0]);
|
||||
projection_i = (double*)mxGetImagData(prhs[1]);
|
||||
|
||||
|
||||
/* Get dimension of probe and object */
|
||||
mwSize const * dims;
|
||||
mwSize const Ndims = mxGetNumberOfDimensions(prhs[1]);
|
||||
dims = mxGetDimensions(prhs[1]);
|
||||
mwSize const No_y = mxGetM(prhs[0]);
|
||||
mwSize const No_x = mxGetN(prhs[0]);
|
||||
mwSize const Np_y = dims[0];
|
||||
mwSize const Np_x = dims[1];
|
||||
mwSize const Npos = mxGetNumberOfElements(prhs[3]);
|
||||
|
||||
if((mxGetM(prhs[3]) > dims[2])) {
|
||||
printf("wrong size of update / positions %i", Ndims);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong size of update / positions");
|
||||
}
|
||||
|
||||
int id_small, id_large, pos, col, row, p;
|
||||
|
||||
#pragma omp parallel for private(p,pos,col, row, id_small, id_large)
|
||||
for (p=0;p<Npos;p++){
|
||||
pos = ind_ok[p]-1;
|
||||
for (col=0;col<Np_x;col++) {
|
||||
for (row=0;row<Np_y;row++) {
|
||||
id_small = row + col*Np_y + Np_y*Np_x*pos;
|
||||
id_large = row + positions[pos] + (col+positions[pos+Npos])*No_y;
|
||||
projection_r[id_small] = object_r[id_large];
|
||||
projection_i[id_small] = object_i[id_large];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -0,0 +1,245 @@
|
||||
%PTYCHO_EXIT
|
||||
%onCleanup function for core.ptycho_recons
|
||||
%
|
||||
% ** p p structure
|
||||
%
|
||||
% see also: core.ptycho_recons
|
||||
% modified by YJ
|
||||
|
||||
function ptycho_exit(p)
|
||||
import utils.*
|
||||
|
||||
if ~isfield(p.io,'data_descriptor')
|
||||
p.io.data_descriptor = '';
|
||||
end
|
||||
|
||||
if isfield(p.getReport, 'crashed') && p.getReport.crashed
|
||||
fprintf('\n\n\n###############################################################\n')
|
||||
fprintf('########################## PONG! ##############################\n')
|
||||
fprintf('###############################################################\n')
|
||||
disp([p.getReport.ME.getReport '\n\n\n']);
|
||||
|
||||
fprintf('Reconstruction stopped! Set verbose level to >3 for debugging. \n')
|
||||
if ~p.getReport.completed
|
||||
if ~isempty(p.io.phone_number) && p.io.send_crashed_recon_SMS
|
||||
%modified by YJ
|
||||
|
||||
subject = 'Ptycho recon crashed!';
|
||||
message = sprintf('User %s''s ptycho recon of %s scan%s crashed on %s', io.get_user_name(), ...
|
||||
p.io.data_descriptor, num2str(p.scan_number), io.get_host_name());
|
||||
if isfield(p.engines{1},'use_gpu') && p.engines{1}.use_gpu
|
||||
message = strcat(message,'(GPU id ',num2str(p.engines{1}.gpu_id),')');
|
||||
end
|
||||
io.sendSMS(p.io.phone_number, subject, message);
|
||||
end
|
||||
if isfield(p.queue, 'file_this_recons')
|
||||
disp('test test test test')
|
||||
try
|
||||
fprintf('Moving queue file file back to %s.\n', fullfile(p.queue.path, p.queue.file_this_recons))
|
||||
|
||||
% get log file name
|
||||
[~, ~, fext] = fileparts(p.queue.file_this_recons);
|
||||
log_dir = fullfile(p.queue.path, 'failed', 'log');
|
||||
if ~exist(log_dir, 'dir')
|
||||
mkdir(log_dir)
|
||||
end
|
||||
log_file = fullfile(log_dir, strrep(p.queue.file_this_recons, fext, '.log'));
|
||||
|
||||
% check if log file extists and update its content; move
|
||||
% queue file back to in_progess
|
||||
if exist(log_file, 'file')
|
||||
fid = fopen(log_file);
|
||||
log_line = fgetl(fid);
|
||||
fclose(fid);
|
||||
log_int = strtrim(strsplit(log_line, ':'));
|
||||
log_int = log_int{end};
|
||||
log_int = str2double(log_int);
|
||||
if ~isfield(p, 'queue_max_attempts')
|
||||
p.queue.max_attempts = 5;
|
||||
fprintf('Code crashed before parsing p.queue.max_attempts.\n')
|
||||
end
|
||||
if log_int >= p.queue.max_attempts
|
||||
io.movefile_fast(fullfile(p.queue.path,'in_progress', p.queue.file_this_recons),fullfile(p.queue.path, 'failed', p.queue.file_this_recons))
|
||||
fid = fopen(log_file, 'w');
|
||||
fprintf(fid, [p.getReport.ME.getReport '\n\n\n']);
|
||||
fprintf('Failed more than %u times. Moving file to ''failed''.\n', p.queue.max_attempts);
|
||||
fclose(fid);
|
||||
if ~isempty(p.io.phone_number) && p.io.send_failed_scans_SMS
|
||||
io.sendSMS(p.io.phone_number, sprintf('Failed to reconstruct scan %s. I will move it to "failed".', num2str(p.scan_number)), 'sleep', p.SMS_sleep, 'logfile', fullfile(log_dir, 'sendSMS.log'));
|
||||
end
|
||||
else
|
||||
io.movefile_fast(fullfile(p.queue.path,'in_progress', p.queue.file_this_recons),fullfile(p.queue.path, p.queue.file_this_recons));
|
||||
fid = fopen(log_file, 'w');
|
||||
fprintf(fid, 'failed attempts: %u\n\n', log_int+1);
|
||||
fprintf(fid, [p.getReport.ME.getReport '\n\n\n']);
|
||||
fclose(fid);
|
||||
end
|
||||
else
|
||||
fid = fopen(log_file, 'w');
|
||||
fprintf(fid, 'failed attempts: 1');
|
||||
fclose(fid);
|
||||
io.movefile_fast(fullfile(p.queue.path,'in_progress', p.queue.file_this_recons),fullfile(p.queue.path, p.queue.file_this_recons))
|
||||
end
|
||||
|
||||
catch
|
||||
fprintf('Failed to move file back to queue search path.\n')
|
||||
end
|
||||
end
|
||||
if isfield(p.queue, 'lockfile')
|
||||
if isempty(p.queue.lockfile)
|
||||
if verbose > 2
|
||||
p.queue.lockfile = false;
|
||||
else
|
||||
p.queue.lockfile = true;
|
||||
end
|
||||
end
|
||||
if p.queue.lockfile
|
||||
if isempty(p.save_path{1})
|
||||
try
|
||||
for ii = 1:length(p.scan_number)
|
||||
p.scan_str{ii} = sprintf(p.scan_string_format, p.scan_number(ii)); % Scan string
|
||||
end
|
||||
p = core.ptycho_prepare_paths(p);
|
||||
catch
|
||||
fprintf('Could not find lock file. \n')
|
||||
end
|
||||
end
|
||||
for ii=1:length(p.save_path)
|
||||
lock_filename = [p.save_path{ii} '/' p.run_name '_lock'];
|
||||
if exist(lock_filename, 'file')
|
||||
try
|
||||
unix(['rm ' lock_filename]);
|
||||
fprintf('Removing lock file %s\n',lock_filename)
|
||||
catch
|
||||
fprintf('Removing lock file %s failed\n',lock_filename)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if isfield(p.queue, 'remote_recons') && p.queue.remote_recons
|
||||
keyboard
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
fprintf('Pausing for 5 seconds.\n')
|
||||
fprintf('###############################################################\n\n')
|
||||
pause(5);
|
||||
|
||||
elseif ~p.getReport.completed
|
||||
if isfield(p, 'remote_failed') && p.remote_failed
|
||||
try
|
||||
io.movefile_fast(fullfile(p.queue.path,'in_progress', p.queue.file_this_recons),fullfile(p.queue.path, 'failed', p.queue.file_this_recons));
|
||||
catch
|
||||
fprintf('Failed to move file to failed.\n')
|
||||
end
|
||||
elseif isfield(p.queue, 'file_this_recons')
|
||||
try
|
||||
fprintf('Reconstruction stopped, moving file to %s.\n', fullfile(p.queue.path, p.queue.file_this_recons))
|
||||
io.movefile_fast(fullfile(p.queue.path,'in_progress', p.queue.file_this_recons),fullfile(p.queue.path, p.queue.file_this_recons))
|
||||
catch
|
||||
fprintf('Failed to move file back to queue search path.\n')
|
||||
end
|
||||
end
|
||||
if isfield(p.queue, 'lockfile')
|
||||
if isempty(p.queue.lockfile)
|
||||
if verbose > 2
|
||||
p.queue.lockfile = false;
|
||||
else
|
||||
p.queue.lockfile = true;
|
||||
end
|
||||
end
|
||||
if p.queue.lockfile
|
||||
if isempty(p.save_path{1})
|
||||
try
|
||||
for ii = 1:length(p.scan_number)
|
||||
p.scan_str{ii} = sprintf(p.scan_string_format, p.scan_number(ii)); % Scan string
|
||||
end
|
||||
p = core.ptycho_prepare_paths(p);
|
||||
catch
|
||||
fprintf('Could not find lock file. \n')
|
||||
end
|
||||
end
|
||||
if isfield(p, 'run_name') && ~isempty(p.run_name)
|
||||
for ii=1:length(p.save_path)
|
||||
lock_filename = [p.save_path{ii} '/' p.run_name '_lock'];
|
||||
if exist(lock_filename, 'file')
|
||||
try
|
||||
delete(lock_filename);
|
||||
fprintf('Removing lock file %s\n',lock_filename)
|
||||
catch
|
||||
fprintf('Removing lock file %s failed\n',lock_filename)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if isfield(p, 'remote_file_this_recons')
|
||||
try
|
||||
fprintf('Removing remote file.\n')
|
||||
if exist(p.queue.remote_file_this_recons, 'file')
|
||||
delete(p.queue.remote_file_this_recons)
|
||||
end
|
||||
|
||||
[~, this_file] = fileparts(p.queue.remote_file_this_recons);
|
||||
if p.queue.isreplica
|
||||
system(['touch ' fullfile(p.queue.remote_path, [this_file '.crash'])]);
|
||||
end
|
||||
|
||||
this_file = [this_file '.mat'];
|
||||
|
||||
if exist(fullfile(p.queue.remote_path, 'in_progress', this_file), 'file')
|
||||
delete(fullfile(p.queue.remote_path, 'in_progress', this_file));
|
||||
end
|
||||
if exist(fullfile(p.queue.remote_path, 'done', this_file), 'file')
|
||||
delete(fullfile(p.queue.remote_path, 'done', this_file));
|
||||
end
|
||||
if exist(fullfile(p.queue.remote_path, 'done', this_file), 'file')
|
||||
delete(fullfile(p.queue.remote_path, 'done', this_file));
|
||||
end
|
||||
|
||||
catch
|
||||
fprintf('Failed to remove remote file.\n')
|
||||
end
|
||||
end
|
||||
|
||||
if ~isempty(p.io.phone_number) && p.io.send_crashed_recon_SMS
|
||||
%modified by YJ
|
||||
subject = 'Ptycho recon crashed!';
|
||||
message = sprintf('User %s''s ptycho recon of %s scan%s crashed on %s', io.get_user_name(), ...
|
||||
p.io.data_descriptor, num2str(p.scan_number), io.get_host_name());
|
||||
|
||||
if isfield(p.engines{1},'use_gpu') && p.engines{1}.use_gpu
|
||||
message = strcat(message,'(GPU id ',num2str(p.engines{1}.gpu_id),')');
|
||||
end
|
||||
|
||||
io.sendSMS(p.io.phone_number, subject, message);
|
||||
end
|
||||
end
|
||||
|
||||
pid = [p.ptycho_matlab_path './utils/.tmp_procID/proc_' num2str(feature('getpid')) '.dat'];
|
||||
if exist(pid, 'file')
|
||||
delete(pid)
|
||||
end
|
||||
|
||||
if ~isempty(p.io.phone_number) && p.io.send_finished_recon_SMS && p.getReport.completed
|
||||
%modified by YJ
|
||||
subject = 'Ptycho recon completed!';
|
||||
message = sprintf('User %s''s ptycho recon of %s scan%s completed on %s', io.get_user_name(), ...
|
||||
p.io.data_descriptor, num2str(p.scan_number), io.get_host_name());
|
||||
|
||||
if isfield(p.engines{1},'use_gpu') && p.engines{1}.use_gpu
|
||||
message = strcat(message,'(GPU id ',num2str(p.engines{1}.gpu_id),')');
|
||||
end
|
||||
|
||||
io.sendSMS(p.io.phone_number, subject, message);
|
||||
end
|
||||
|
||||
try
|
||||
verbose(struct('prefix', {[]}))
|
||||
catch
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
Compilation from Matlab:
|
||||
maybe a tiny bit faster code is generated by
|
||||
mex -largeArrayDims 'CFLAGS="\$CFLAGS -std=c99 -fopenmp"' LDFLAGS="\$LDFLAGS -fopenmp" set_projections_cpu_mex.c
|
||||
|
||||
Usage from Matlab:
|
||||
set_projections_cpu_mex(probe,object,positions, Npos);
|
||||
|
||||
This code in matlab:
|
||||
asize = size(probe);
|
||||
for i=1:Npos
|
||||
Indy = positions(i,1) + (1:asize(1));
|
||||
Indx = positions(i,2) + (1:asize(2));
|
||||
ob(Indy,Indx) = ob(Indy,Indx) + probe;
|
||||
end
|
||||
|
||||
Academic License Agreement
|
||||
|
||||
Source Code
|
||||
|
||||
Introduction
|
||||
• This license agreement sets forth the terms and conditions under which the PAUL SCHERRER INSTITUT (PSI), CH-5232 Villigen-PSI, Switzerland (hereafter "LICENSOR")
|
||||
will grant you (hereafter "LICENSEE") a royalty-free, non-exclusive license for academic, non-commercial purposes only (hereafter "LICENSE") to use the cSAXS
|
||||
ptychography MATLAB package computer software program and associated documentation furnished hereunder (hereafter "PROGRAM").
|
||||
|
||||
Terms and Conditions of the LICENSE
|
||||
1. LICENSOR grants to LICENSEE a royalty-free, non-exclusive license to use the PROGRAM for academic, non-commercial purposes, upon the terms and conditions
|
||||
hereinafter set out and until termination of this license as set forth below.
|
||||
2. LICENSEE acknowledges that the PROGRAM is a research tool still in the development stage. The PROGRAM is provided without any related services, improvements
|
||||
or warranties from LICENSOR and that the LICENSE is entered into in order to enable others to utilize the PROGRAM in their academic activities. It is the
|
||||
LICENSEE’s responsibility to ensure its proper use and the correctness of the results.”
|
||||
3. THE PROGRAM IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR
|
||||
A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. IN NO EVENT SHALL THE LICENSOR, THE AUTHORS OR THE COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY ARISING FROM, OUT OF OR IN CONNECTION WITH THE PROGRAM OR THE USE
|
||||
OF THE PROGRAM OR OTHER DEALINGS IN THE PROGRAM.
|
||||
4. LICENSEE agrees that it will use the PROGRAM and any modifications, improvements, or derivatives of PROGRAM that LICENSEE may create (collectively,
|
||||
"IMPROVEMENTS") solely for academic, non-commercial purposes and that any copy of PROGRAM or derivatives thereof shall be distributed only under the same
|
||||
license as PROGRAM. The terms "academic, non-commercial", as used in this Agreement, mean academic or other scholarly research which (a) is not undertaken for
|
||||
profit, or (b) is not intended to produce works, services, or data for commercial use, or (c) is neither conducted, nor funded, by a person or an entity engaged
|
||||
in the commercial use, application or exploitation of works similar to the PROGRAM.
|
||||
5. LICENSEE agrees that it shall make the following acknowledgement in any publication resulting from the use of the PROGRAM or any translation of the code into
|
||||
another computing language:
|
||||
"Data processing was carried out using the cSAXS ptychography MATLAB package developed by the Science IT and the coherent X-ray scattering (CXS) groups, Paul
|
||||
Scherrer Institut, Switzerland."
|
||||
|
||||
Additionally, any publication using the package, or any translation of the code into another computing language should cite for difference map:
|
||||
P. Thibault, M. Dierolf, A. Menzel, O. Bunk, C. David, F. Pfeiffer, High-resolution scanning X-ray diffraction microscopy, Science 321, 379–382 (2008).
|
||||
(doi: 10.1126/science.1158573),
|
||||
for maximum likelihood:
|
||||
P. Thibault and M. Guizar-Sicairos, Maximum-likelihood refinement for coherent diffractive imaging, New J. Phys. 14, 063004 (2012).
|
||||
(doi: 10.1088/1367-2630/14/6/063004),
|
||||
for mixed coherent modes:
|
||||
P. Thibault and A. Menzel, Reconstructing state mixtures from diffraction measurements, Nature 494, 68–71 (2013). (doi: 10.1038/nature11806),
|
||||
and/or for multislice:
|
||||
E. H. R. Tsai, I. Usov, A. Diaz, A. Menzel, and M. Guizar-Sicairos, X-ray ptychography with extended depth of field, Opt. Express 24, 29089–29108 (2016).
|
||||
(doi: 10.1364/OE.24.029089).
|
||||
6. Except for the above-mentioned acknowledgment, LICENSEE shall not use the PROGRAM title or the names or logos of LICENSOR, nor any adaptation thereof, nor the
|
||||
names of any of its employees or laboratories, in any advertising, promotional or sales material without prior written consent obtained from LICENSOR in each case.
|
||||
7. Ownership of all rights, including copyright in the PROGRAM and in any material associated therewith, shall at all times remain with LICENSOR, and LICENSEE
|
||||
agrees to preserve same. LICENSEE agrees not to use any portion of the PROGRAM or of any IMPROVEMENTS in any machine-readable form outside the PROGRAM, nor to
|
||||
make any copies except for its internal use, without prior written consent of LICENSOR. LICENSEE agrees to place the following copyright notice on any such copies:
|
||||
© All rights reserved. PAUL SCHERRER INSTITUT, Switzerland, Laboratory for Macromolecules and Bioimaging, 2017.
|
||||
8. The LICENSE shall not be construed to confer any rights upon LICENSEE by implication or otherwise except as specifically set forth herein.
|
||||
9. DISCLAIMER: LICENSEE shall be aware that Phase Focus Limited of Sheffield, UK has an international portfolio of patents and pending applications which relate
|
||||
to ptychography and that the PROGRAM may be capable of being used in circumstances which may fall within the claims of one or more of the Phase Focus patents,
|
||||
in particular of patent with international application number PCT/GB2005/001464. The LICENSOR explicitly declares not to indemnify the users of the software
|
||||
in case Phase Focus or any other third party will open a legal action against the LICENSEE due to the use of the program.
|
||||
10. This Agreement shall be governed by the material laws of Switzerland and any dispute arising out of this Agreement or use of the PROGRAM shall be brought before
|
||||
the courts of Zürich, Switzerland.
|
||||
*/
|
||||
|
||||
#include "mex.h"
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <omp.h>
|
||||
|
||||
|
||||
void mexFunction(int nlhs, mxArray *plhs[],
|
||||
int nrhs, const mxArray *prhs[])
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Check for proper number of arguments. */
|
||||
if (nrhs != 4)
|
||||
mexErrMsgTxt("Four input arguments required: set_projections_cpu_mex(probe,object,positions,Npos)");
|
||||
else if (nlhs != 0)
|
||||
mexErrMsgTxt("No output argument has to be specified.");
|
||||
|
||||
/* Input must be of type double. */
|
||||
for (i=0; i < 2; i++) {
|
||||
if (mxIsSingle(prhs[i]) != 1){
|
||||
printf("Input %d is not single\n",i+1);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Inputs must be of correct type.");
|
||||
}
|
||||
}
|
||||
/* Input must be of type int32. */
|
||||
for (i=2; i<nrhs; i++){
|
||||
if (mxIsInt32(prhs[i]) != 1){
|
||||
printf("Input %d is not integer\n",i+1);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Inputs must be of correct type.");
|
||||
}
|
||||
}
|
||||
|
||||
/* It cannot be one-dimensional */
|
||||
if(mxGetNumberOfDimensions(prhs[0]) < 2) {
|
||||
printf("The 1st input argument must have at least two dimensions.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong number of dimensions");
|
||||
}
|
||||
/* It cannot be more than 3-dimensional */
|
||||
if(mxGetNumberOfDimensions(prhs[0]) > 3) {
|
||||
printf("The 1st input argument must have at most three dimensions.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong number of dimensions");
|
||||
}
|
||||
// /* Check that arrays are complex */
|
||||
// if(mxIsComplex(prhs[0]) != 1) {
|
||||
// printf("object input argument must be complex-valued.");
|
||||
// mexErrMsgIdAndTxt("MexError:ptycho","Expected complex arrays");
|
||||
// }
|
||||
// if(mxIsComplex(prhs[1]) != 1) {
|
||||
// printf("probe input argument must be complex-valued.");
|
||||
// mexErrMsgIdAndTxt("MexError:ptycho","Expected complex arrays");
|
||||
// }
|
||||
|
||||
float *object_r, *object_i, *probe_r,*probe_i;
|
||||
int *positions, *ind_ok;
|
||||
bool cprobe, cobject;
|
||||
|
||||
cobject = mxIsComplex(prhs[0]);
|
||||
cprobe = mxIsComplex(prhs[1]);
|
||||
if( cobject != cobject)
|
||||
{
|
||||
printf("probe/object input argument must be complex/real-valued.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Expected both complex / real arrays");
|
||||
}
|
||||
|
||||
ind_ok = (int*)mxGetData(prhs[3]);
|
||||
positions = (int*)mxGetData(prhs[2]);
|
||||
object_r = (float*)mxGetData(prhs[0]);
|
||||
probe_r = (float*)mxGetData(prhs[1]);
|
||||
if(cprobe)
|
||||
{
|
||||
/* get pointers to input data */
|
||||
object_i = (float*)mxGetImagData(prhs[0]);
|
||||
probe_i = (float*)mxGetImagData(prhs[1]);
|
||||
}
|
||||
|
||||
|
||||
/* Get dimension of probe and object */
|
||||
mwSize const Ndims = mxGetNumberOfDimensions(prhs[1]);
|
||||
mwSize const * dims = mxGetDimensions(prhs[1]);
|
||||
mwSize const No_y = mxGetM(prhs[0]);
|
||||
mwSize const No_x = mxGetN(prhs[0]);
|
||||
mwSize const Np_y = dims[0];
|
||||
mwSize const Np_x = dims[1];
|
||||
mwSize const Npos = mxGetNumberOfElements(prhs[3]);
|
||||
|
||||
if((mxGetM(prhs[2]) != dims[2]) && (Ndims == 3)) {
|
||||
printf("wrong size of update / positions %i", Ndims);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong size of update / positions");
|
||||
}
|
||||
|
||||
mwSize id_small, id_large, pos, col, row, o, p;
|
||||
bool flat_probe = Ndims == 2;
|
||||
|
||||
#pragma omp parallel for private(p,pos, col, row, id_small, id_large)
|
||||
for (p=0;p<Npos;p++){
|
||||
pos = ind_ok[p]-1;
|
||||
for (col=0;col<Np_x;col++) {
|
||||
for (row=0;row<Np_y;row++) {
|
||||
if(flat_probe)
|
||||
id_small = row + col*Np_y;
|
||||
else
|
||||
id_small = row + col*Np_y + Np_y*Np_x*pos;
|
||||
|
||||
id_large = row + positions[pos] + (col+positions[pos+Npos])*No_y;
|
||||
#pragma omp atomic
|
||||
object_r[id_large] += probe_r[id_small];
|
||||
if(cprobe) {
|
||||
#pragma omp atomic
|
||||
object_i[id_large] += probe_i[id_small];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -0,0 +1,188 @@
|
||||
/*
|
||||
Compilation from Matlab:
|
||||
maybe a tiny bit faster code is generated by
|
||||
mex -largeArrayDims 'CFLAGS="\$CFLAGS -std=c99 -fopenmp"' LDFLAGS="\$LDFLAGS -fopenmp" set_projections_cpu_mex_double.c
|
||||
|
||||
Usage from Matlab:
|
||||
set_projections_cpu_mex(probe,object,positions, Npos);
|
||||
|
||||
This code in matlab:
|
||||
asize = size(probe);
|
||||
for i=1:Npos
|
||||
Indy = positions(i,1) + (1:asize(1));
|
||||
Indx = positions(i,2) + (1:asize(2));
|
||||
ob(Indy,Indx) = ob(Indy,Indx) + probe;
|
||||
end
|
||||
|
||||
Academic License Agreement
|
||||
|
||||
Source Code
|
||||
|
||||
Introduction
|
||||
• This license agreement sets forth the terms and conditions under which the PAUL SCHERRER INSTITUT (PSI), CH-5232 Villigen-PSI, Switzerland (hereafter "LICENSOR")
|
||||
will grant you (hereafter "LICENSEE") a royalty-free, non-exclusive license for academic, non-commercial purposes only (hereafter "LICENSE") to use the cSAXS
|
||||
ptychography MATLAB package computer software program and associated documentation furnished hereunder (hereafter "PROGRAM").
|
||||
|
||||
Terms and Conditions of the LICENSE
|
||||
1. LICENSOR grants to LICENSEE a royalty-free, non-exclusive license to use the PROGRAM for academic, non-commercial purposes, upon the terms and conditions
|
||||
hereinafter set out and until termination of this license as set forth below.
|
||||
2. LICENSEE acknowledges that the PROGRAM is a research tool still in the development stage. The PROGRAM is provided without any related services, improvements
|
||||
or warranties from LICENSOR and that the LICENSE is entered into in order to enable others to utilize the PROGRAM in their academic activities. It is the
|
||||
LICENSEE’s responsibility to ensure its proper use and the correctness of the results.”
|
||||
3. THE PROGRAM IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR
|
||||
A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. IN NO EVENT SHALL THE LICENSOR, THE AUTHORS OR THE COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY ARISING FROM, OUT OF OR IN CONNECTION WITH THE PROGRAM OR THE USE
|
||||
OF THE PROGRAM OR OTHER DEALINGS IN THE PROGRAM.
|
||||
4. LICENSEE agrees that it will use the PROGRAM and any modifications, improvements, or derivatives of PROGRAM that LICENSEE may create (collectively,
|
||||
"IMPROVEMENTS") solely for academic, non-commercial purposes and that any copy of PROGRAM or derivatives thereof shall be distributed only under the same
|
||||
license as PROGRAM. The terms "academic, non-commercial", as used in this Agreement, mean academic or other scholarly research which (a) is not undertaken for
|
||||
profit, or (b) is not intended to produce works, services, or data for commercial use, or (c) is neither conducted, nor funded, by a person or an entity engaged
|
||||
in the commercial use, application or exploitation of works similar to the PROGRAM.
|
||||
5. LICENSEE agrees that it shall make the following acknowledgement in any publication resulting from the use of the PROGRAM or any translation of the code into
|
||||
another computing language:
|
||||
"Data processing was carried out using the cSAXS ptychography MATLAB package developed by the Science IT and the coherent X-ray scattering (CXS) groups, Paul
|
||||
Scherrer Institut, Switzerland."
|
||||
|
||||
Additionally, any publication using the package, or any translation of the code into another computing language should cite for difference map:
|
||||
P. Thibault, M. Dierolf, A. Menzel, O. Bunk, C. David, F. Pfeiffer, High-resolution scanning X-ray diffraction microscopy, Science 321, 379–382 (2008).
|
||||
(doi: 10.1126/science.1158573),
|
||||
for maximum likelihood:
|
||||
P. Thibault and M. Guizar-Sicairos, Maximum-likelihood refinement for coherent diffractive imaging, New J. Phys. 14, 063004 (2012).
|
||||
(doi: 10.1088/1367-2630/14/6/063004),
|
||||
for mixed coherent modes:
|
||||
P. Thibault and A. Menzel, Reconstructing state mixtures from diffraction measurements, Nature 494, 68–71 (2013). (doi: 10.1038/nature11806),
|
||||
and/or for multislice:
|
||||
E. H. R. Tsai, I. Usov, A. Diaz, A. Menzel, and M. Guizar-Sicairos, X-ray ptychography with extended depth of field, Opt. Express 24, 29089–29108 (2016).
|
||||
(doi: 10.1364/OE.24.029089).
|
||||
6. Except for the above-mentioned acknowledgment, LICENSEE shall not use the PROGRAM title or the names or logos of LICENSOR, nor any adaptation thereof, nor the
|
||||
names of any of its employees or laboratories, in any advertising, promotional or sales material without prior written consent obtained from LICENSOR in each case.
|
||||
7. Ownership of all rights, including copyright in the PROGRAM and in any material associated therewith, shall at all times remain with LICENSOR, and LICENSEE
|
||||
agrees to preserve same. LICENSEE agrees not to use any portion of the PROGRAM or of any IMPROVEMENTS in any machine-readable form outside the PROGRAM, nor to
|
||||
make any copies except for its internal use, without prior written consent of LICENSOR. LICENSEE agrees to place the following copyright notice on any such copies:
|
||||
© All rights reserved. PAUL SCHERRER INSTITUT, Switzerland, Laboratory for Macromolecules and Bioimaging, 2017.
|
||||
8. The LICENSE shall not be construed to confer any rights upon LICENSEE by implication or otherwise except as specifically set forth herein.
|
||||
9. DISCLAIMER: LICENSEE shall be aware that Phase Focus Limited of Sheffield, UK has an international portfolio of patents and pending applications which relate
|
||||
to ptychography and that the PROGRAM may be capable of being used in circumstances which may fall within the claims of one or more of the Phase Focus patents,
|
||||
in particular of patent with international application number PCT/GB2005/001464. The LICENSOR explicitly declares not to indemnify the users of the software
|
||||
in case Phase Focus or any other third party will open a legal action against the LICENSEE due to the use of the program.
|
||||
10. This Agreement shall be governed by the material laws of Switzerland and any dispute arising out of this Agreement or use of the PROGRAM shall be brought before
|
||||
the courts of Zürich, Switzerland.
|
||||
*/
|
||||
|
||||
#include "mex.h"
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <omp.h>
|
||||
|
||||
|
||||
void mexFunction(int nlhs, mxArray *plhs[],
|
||||
int nrhs, const mxArray *prhs[])
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Check for proper number of arguments. */
|
||||
if (nrhs != 4)
|
||||
mexErrMsgTxt("Four input arguments required: set_projections_cpu_mex(probe,object,positions,Npos)");
|
||||
else if (nlhs != 0)
|
||||
mexErrMsgTxt("No output argument has to be specified.");
|
||||
|
||||
/* Input must be of type double. */
|
||||
for (i=0; i < 2; i++) {
|
||||
if (mxIsDouble(prhs[i]) != 1){
|
||||
printf("Input %d is not double\n",i+1);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Inputs must be of correct type.");
|
||||
}
|
||||
}
|
||||
/* Input must be of type int32. */
|
||||
for (i=2; i<nrhs; i++){
|
||||
if (mxIsInt32(prhs[i]) != 1){
|
||||
printf("Input %d is not integer\n",i+1);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Inputs must be of correct type.");
|
||||
}
|
||||
}
|
||||
|
||||
/* It cannot be one-dimensional */
|
||||
if(mxGetNumberOfDimensions(prhs[0]) < 2) {
|
||||
printf("The 1st input argument must have at least two dimensions.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong number of dimensions");
|
||||
}
|
||||
/* It cannot be more than 3-dimensional */
|
||||
if(mxGetNumberOfDimensions(prhs[0]) > 3) {
|
||||
printf("The 1st input argument must have at most three dimensions.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong number of dimensions");
|
||||
}
|
||||
// /* Check that arrays are complex */
|
||||
// if(mxIsComplex(prhs[0]) != 1) {
|
||||
// printf("object input argument must be complex-valued.");
|
||||
// mexErrMsgIdAndTxt("MexError:ptycho","Expected complex arrays");
|
||||
// }
|
||||
// if(mxIsComplex(prhs[1]) != 1) {
|
||||
// printf("probe input argument must be complex-valued.");
|
||||
// mexErrMsgIdAndTxt("MexError:ptycho","Expected complex arrays");
|
||||
// }
|
||||
|
||||
double *object_r, *object_i, *probe_r,*probe_i;
|
||||
int *positions, *ind_ok;
|
||||
bool cprobe, cobject;
|
||||
|
||||
cobject = mxIsComplex(prhs[0]);
|
||||
cprobe = mxIsComplex(prhs[1]);
|
||||
if( cobject != cobject)
|
||||
{
|
||||
printf("probe/object input argument must be complex/real-valued.");
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","Expected both complex / real arrays");
|
||||
}
|
||||
|
||||
ind_ok = (int*)mxGetData(prhs[3]);
|
||||
positions = (int*)mxGetData(prhs[2]);
|
||||
object_r = (double*)mxGetData(prhs[0]);
|
||||
probe_r = (double*)mxGetData(prhs[1]);
|
||||
if(cprobe)
|
||||
{
|
||||
/* get pointers to input data */
|
||||
object_i = (double*)mxGetImagData(prhs[0]);
|
||||
probe_i = (double*)mxGetImagData(prhs[1]);
|
||||
}
|
||||
|
||||
|
||||
/* Get dimension of probe and object */
|
||||
mwSize const Ndims = mxGetNumberOfDimensions(prhs[1]);
|
||||
mwSize const * dims = mxGetDimensions(prhs[1]);
|
||||
mwSize const No_y = mxGetM(prhs[0]);
|
||||
mwSize const No_x = mxGetN(prhs[0]);
|
||||
mwSize const Np_y = dims[0];
|
||||
mwSize const Np_x = dims[1];
|
||||
mwSize const Npos = mxGetNumberOfElements(prhs[3]);
|
||||
|
||||
if((mxGetM(prhs[2]) != dims[2]) && (Ndims == 3)) {
|
||||
printf("wrong size of update / positions %i", Ndims);
|
||||
mexErrMsgIdAndTxt("MexError:ptycho","wrong size of update / positions");
|
||||
}
|
||||
|
||||
mwSize id_small, id_large, pos, col, row, o, p;
|
||||
bool flat_probe = Ndims == 2;
|
||||
|
||||
#pragma omp parallel for private(p,pos, col, row, id_small, id_large)
|
||||
for (p=0;p<Npos;p++){
|
||||
pos = ind_ok[p]-1;
|
||||
for (col=0;col<Np_x;col++) {
|
||||
for (row=0;row<Np_y;row++) {
|
||||
if(flat_probe)
|
||||
id_small = row + col*Np_y;
|
||||
else
|
||||
id_small = row + col*Np_y + Np_y*Np_x*pos;
|
||||
|
||||
id_large = row + positions[pos] + (col+positions[pos+Npos])*No_y;
|
||||
#pragma omp atomic
|
||||
object_r[id_large] += probe_r[id_small];
|
||||
if(cprobe) {
|
||||
#pragma omp atomic
|
||||
object_i[id_large] += probe_i[id_small];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
%WRITE_PROCID
|
||||
% writes .dat files to utils/.tmp_procID to keep track of current
|
||||
% reconstructions
|
||||
% ** p p structure
|
||||
|
||||
% Academic License Agreement
|
||||
%
|
||||
% Source Code
|
||||
%
|
||||
% Introduction
|
||||
% • This license agreement sets forth the terms and conditions under which the PAUL SCHERRER INSTITUT (PSI), CH-5232 Villigen-PSI, Switzerland (hereafter "LICENSOR")
|
||||
% will grant you (hereafter "LICENSEE") a royalty-free, non-exclusive license for academic, non-commercial purposes only (hereafter "LICENSE") to use the cSAXS
|
||||
% ptychography MATLAB package computer software program and associated documentation furnished hereunder (hereafter "PROGRAM").
|
||||
%
|
||||
% Terms and Conditions of the LICENSE
|
||||
% 1. LICENSOR grants to LICENSEE a royalty-free, non-exclusive license to use the PROGRAM for academic, non-commercial purposes, upon the terms and conditions
|
||||
% hereinafter set out and until termination of this license as set forth below.
|
||||
% 2. LICENSEE acknowledges that the PROGRAM is a research tool still in the development stage. The PROGRAM is provided without any related services, improvements
|
||||
% or warranties from LICENSOR and that the LICENSE is entered into in order to enable others to utilize the PROGRAM in their academic activities. It is the
|
||||
% LICENSEE’s responsibility to ensure its proper use and the correctness of the results.”
|
||||
% 3. THE PROGRAM IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR
|
||||
% A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. IN NO EVENT SHALL THE LICENSOR, THE AUTHORS OR THE COPYRIGHT
|
||||
% HOLDERS BE LIABLE FOR ANY CLAIM, DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY ARISING FROM, OUT OF OR IN CONNECTION WITH THE PROGRAM OR THE USE
|
||||
% OF THE PROGRAM OR OTHER DEALINGS IN THE PROGRAM.
|
||||
% 4. LICENSEE agrees that it will use the PROGRAM and any modifications, improvements, or derivatives of PROGRAM that LICENSEE may create (collectively,
|
||||
% "IMPROVEMENTS") solely for academic, non-commercial purposes and that any copy of PROGRAM or derivatives thereof shall be distributed only under the same
|
||||
% license as PROGRAM. The terms "academic, non-commercial", as used in this Agreement, mean academic or other scholarly research which (a) is not undertaken for
|
||||
% profit, or (b) is not intended to produce works, services, or data for commercial use, or (c) is neither conducted, nor funded, by a person or an entity engaged
|
||||
% in the commercial use, application or exploitation of works similar to the PROGRAM.
|
||||
% 5. LICENSEE agrees that it shall make the following acknowledgement in any publication resulting from the use of the PROGRAM or any translation of the code into
|
||||
% another computing language:
|
||||
% "Data processing was carried out using the cSAXS ptychography MATLAB package developed by the Science IT and the coherent X-ray scattering (CXS) groups, Paul
|
||||
% Scherrer Institut, Switzerland."
|
||||
%
|
||||
% Additionally, any publication using the package, or any translation of the code into another computing language should cite for difference map:
|
||||
% P. Thibault, M. Dierolf, A. Menzel, O. Bunk, C. David, F. Pfeiffer, High-resolution scanning X-ray diffraction microscopy, Science 321, 379–382 (2008).
|
||||
% (doi: 10.1126/science.1158573),
|
||||
% for maximum likelihood:
|
||||
% P. Thibault and M. Guizar-Sicairos, Maximum-likelihood refinement for coherent diffractive imaging, New J. Phys. 14, 063004 (2012).
|
||||
% (doi: 10.1088/1367-2630/14/6/063004),
|
||||
% for mixed coherent modes:
|
||||
% P. Thibault and A. Menzel, Reconstructing state mixtures from diffraction measurements, Nature 494, 68–71 (2013). (doi: 10.1038/nature11806),
|
||||
% and/or for multislice:
|
||||
% E. H. R. Tsai, I. Usov, A. Diaz, A. Menzel, and M. Guizar-Sicairos, X-ray ptychography with extended depth of field, Opt. Express 24, 29089–29108 (2016).
|
||||
% (doi: 10.1364/OE.24.029089).
|
||||
% 6. Except for the above-mentioned acknowledgment, LICENSEE shall not use the PROGRAM title or the names or logos of LICENSOR, nor any adaptation thereof, nor the
|
||||
% names of any of its employees or laboratories, in any advertising, promotional or sales material without prior written consent obtained from LICENSOR in each case.
|
||||
% 7. Ownership of all rights, including copyright in the PROGRAM and in any material associated therewith, shall at all times remain with LICENSOR, and LICENSEE
|
||||
% agrees to preserve same. LICENSEE agrees not to use any portion of the PROGRAM or of any IMPROVEMENTS in any machine-readable form outside the PROGRAM, nor to
|
||||
% make any copies except for its internal use, without prior written consent of LICENSOR. LICENSEE agrees to place the following copyright notice on any such copies:
|
||||
% © All rights reserved. PAUL SCHERRER INSTITUT, Switzerland, Laboratory for Macromolecules and Bioimaging, 2017.
|
||||
% 8. The LICENSE shall not be construed to confer any rights upon LICENSEE by implication or otherwise except as specifically set forth herein.
|
||||
% 9. DISCLAIMER: LICENSEE shall be aware that Phase Focus Limited of Sheffield, UK has an international portfolio of patents and pending applications which relate
|
||||
% to ptychography and that the PROGRAM may be capable of being used in circumstances which may fall within the claims of one or more of the Phase Focus patents,
|
||||
% in particular of patent with international application number PCT/GB2005/001464. The LICENSOR explicitly declares not to indemnify the users of the software
|
||||
% in case Phase Focus or any other third party will open a legal action against the LICENSEE due to the use of the program.
|
||||
% 10. This Agreement shall be governed by the material laws of Switzerland and any dispute arising out of this Agreement or use of the PROGRAM shall be brought before
|
||||
% the courts of Zürich, Switzerland.
|
||||
|
||||
function write_procID(p)
|
||||
try
|
||||
if ~exist(fullfile(p.ptycho_matlab_path, 'utils', '.tmp_procID'), 'dir')
|
||||
mkdir(fullfile(p.ptycho_matlab_path, 'utils', '.tmp_procID'))
|
||||
end
|
||||
if ispc
|
||||
hostname = getenv('COMPUTERNAME');
|
||||
else
|
||||
hostname = getenv('HOSTNAME');
|
||||
end
|
||||
% calling system('hostname') has large overhead, try to avoid if not needed
|
||||
if isempty(hostname)
|
||||
[~, hostname] = system('hostname');
|
||||
hostname = hostname(1:end-1);
|
||||
end
|
||||
|
||||
caller = dbstack;
|
||||
|
||||
f = fopen(fullfile(p.ptycho_matlab_path, 'utils', '.tmp_procID', ['proc_' num2str(feature('getpid')) '.dat']), 'w');
|
||||
fprintf(f, [hostname ' ' strrep(num2str(p.scan_number), ' ', '-') ' ' datestr(datetime('now')) ' ' caller(end).name]);
|
||||
fclose(f);
|
||||
catch
|
||||
utils.verbose(0, 'Failed to write process ID.')
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user