diff --git a/crpptbx/subcall_all2str.m b/crpptbx/subcall_all2str.m
new file mode 100644
index 0000000000000000000000000000000000000000..a87eff3a3767bb855d26d6f42cd6d92ff5524838
--- /dev/null
+++ b/crpptbx/subcall_all2str.m
@@ -0,0 +1,59 @@
+function subcall_string = subcall_all2str(varargin)
+%
+% subcall_string = subcall_all2str(varargin)
+%
+% create a string from varargin allowing following types:
+%
+% char: varargin is just copied
+% numeric: if scalar use num2str, if 1 or 2-D array add relevant '[' and ']', else mark a string multi-D
+% structure: explode structure as field,value
+%
+
+% to be taken from above and include this call in above
+
+if nargin==0
+  subcall_string = '';
+  return
+end
+
+subcall = '';
+for i_in=1:length(varargin)
+  var_to_treat = varargin{i_in};
+  if isstruct(var_to_treat)
+    % explode structure into 'childname',childvalues
+    param_names = fieldnames(var_to_treat);
+    for i=1:length(param_names)
+      subcall = [subcall ',''' param_names{i} ''''];
+      if ischar(var_to_treat.(param_names{i}))
+        subcall = [subcall ',''' var_to_treat.(param_names{i}) ''''];
+      elseif isnumeric(var_to_treat.(param_names{i}))
+        aa_values = var_to_treat.(param_names{i});
+        if prod(size(aa_values))~= length(aa_values)
+          % multi-D input, do not treat it yet
+          subcall = [subcall ',''multi-D input'''];
+        elseif length(aa_values) > 1
+          % array
+          subcall = [subcall ',[' num2str(reshape(aa_values,1,length(aa_values))) ']'];
+        else
+          subcall = [subcall ',' num2str(aa_values) ''];
+        end
+      else
+        % to treat extra cases
+      end
+    end
+  elseif isnumeric(var_to_treat)
+    if prod(size(var_to_treat))~= length(var_to_treat)
+      % multi-D input, do not treat it yet
+      subcall = [subcall ',''multi-D input'''];
+    elseif length(var_to_treat) > 1
+      % array
+      subcall = [subcall ',[' num2str(var_to_treat) ']'];
+    else
+      subcall = [subcall ',' num2str(var_to_treat) ''];
+    end
+  elseif ischar(var_to_treat)
+    subcall = [subcall ',''' var_to_treat ''''];
+  end
+end
+
+subcall_string = subcall;