diff --git a/matlab/TCV/gdat_tcv.m b/matlab/TCV/gdat_tcv.m
index adfcc621b13c2760e227942f411e0b17eb68eb7b..f63188553a2438b53e41bb21dd9a95cccad3d434 100644
--- a/matlab/TCV/gdat_tcv.m
+++ b/matlab/TCV/gdat_tcv.m
@@ -3346,19 +3346,25 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
       end
       return
     end
+    % time_out: times at which to provide output data, if 2 values provided, return all values within that time interval
+    % for xtomo, can only provide a time interval, for radcam, can provide a time_out array on which interpos is computed
     time_interval = [];
     if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out)
-      if length(gdat_data.gdat_params.time_out) == 2
+      if numel(gdat_data.gdat_params.time_out) == 2
         time_interval = gdat_data.gdat_params.time_out;
       else
-        if length(gdat_data.gdat_params.time_out) == 1
+        if numel(gdat_data.gdat_params.time_out) == 1
           % 200ms includes all characteristic time constants
           time_interval = [gdat_data.gdat_params.time_out-0.1 gdat_data.gdat_params.time_out+0.1];
         else
-          time_interval = [min(gdat_data.gdat_params.time_out)-0.1 max(gdat_data.gdat_params.time_out)+0.1];
+          if strcmp(gdat_data.gdat_params.source,'radcam')
+            time_interval = gdat_data.gdat_params.time_out; % for radcam provide time array on which to do interpos
+          else
+            time_interval = [min(gdat_data.gdat_params.time_out)-0.1 max(gdat_data.gdat_params.time_out)+0.1];
+            warning(['Expects a time interval [t1 t2] for ' data_request_eff ' in param time_out, uses [' ...
+                     num2str(time_interval(1)) ',' num2str(time_interval(2)) ']' char(10)])
+          end
         end
-        warning(['Expects a time interval [t1 t2] for ' data_request_eff ' in param time_out, uses [' ...
-                 num2str(time_interval(1)) ',' num2str(time_interval(2)) ']' char(10)])
       end
     end
     % at this stage 2 option for freq, raw data (fast, default), 10kHz or similar (slow)
@@ -3446,11 +3452,41 @@ elseif strcmp(mapping_for_tcv.method,'switchcase')
         gdat_data.x(end+1:end+numel(gdat_data.(gdat_data.gdat_params.camera{i}).x)) = gdat_data.(gdat_data.gdat_params.camera{i}).x;
       end
       sxr = rc_load_diodes(shot,'diag_name',"sxr",'channels',gdat_data.x); % since all cameras with different channel number
+      % for "heavy" signals, can trim it to specified time_interval and/or reduce it to smaller nb points
       if freq_opt == 1
-        gdat_data.data = sxr.data';
-        gdat_data.t = sxr.time;
+        % default, fast/raw time array
+        if ~isempty(time_interval)
+          if numel(time_interval) == 2
+            % extract data within [time_interval(1:2)]
+            ij = find(sxr.time>=time_interval(1) & sxr.time<=time_interval(end));
+            gdat_data.data = sxr.data(ij,:)';
+            gdat_data.t = sxr.time(ij);
+          else
+            % time_out array provided to obtain data, use closest points (since raw data on fast frequency)
+            ij = iround_os(sxr.time,time_interval);
+            gdat_data.data = sxr.data(ij,:)';
+            gdat_data.t = sxr.time(ij);
+          end
+        else
+          % raw data requested (default), no time_out provided
+          gdat_data.data = sxr.data';
+          gdat_data.t = sxr.time;
+        end
       else
-        gdat_data.t = linspace(sxr.time(1),sxr.time(end),round((sxr.time(end)-sxr.time(1))/1e-4));
+        % slower frequency requested (or smoothed interpolation using interpos)
+        if ~isempty(time_interval)
+          if numel(time_interval) == 2
+            % construct a default 40kHz time base within time_interval(1:2)
+            gdat_data.t = linspace(time_interval(1),time_interval(2),round((time_interval(2)-time_interval(1))/0.25e-4));
+          else
+            % time array provided
+            gdat_data.t = time_interval;
+          end
+        else
+          % construct a default 40kHz time base within full raw time interval
+          gdat_data.t = linspace(sxr.time(1),sxr.time(end),round((sxr.time(end)-sxr.time(1))/0.25e-4));
+        end
+        % compute interpolation with tension provided
         for i=1:size(sxr.data,2)
           gdat_data.data(i,:) = interpos(sxr.time,sxr.data(:,i),gdat_data.t,gdat_data.gdat_params.fit_tension);
         end
diff --git a/matlab/gdat.m b/matlab/gdat.m
index e21551bfb14986490b743ed75d0a0fe12fa88cdb..99271c743677156ce27598a06bda6a42cf7e88a1 100644
--- a/matlab/gdat.m
+++ b/matlab/gdat.m
@@ -190,14 +190,18 @@ try
   % treat multiple shot numbers
   if nargin > 0 && isnumeric(shot)
     args_in = args;
-    for i=1:numel(shot)
-      args{1} = shot(i);
-      [gdat_data_i,gdat_params,error_status(i),varargout] = feval(['gdat_' lower(machine_eff)],args{:});
-      gdat_data_i.gdat_params.machine = lower(gdat_data_i.gdat_params.machine);
-      gdat_data(i) = gdat_data_i;
+    if ~isempty(shot)
+      for i=1:numel(shot)
+        args{1} = shot(i);
+        [gdat_data_i,gdat_params,error_status(i),varargout_gdat] = feval(['gdat_' lower(machine_eff)],args{:});
+        gdat_data_i.gdat_params.machine = lower(gdat_data_i.gdat_params.machine);
+        gdat_data(i) = gdat_data_i;
+      end
+    else
+      [gdat_data,gdat_params,error_status,varargout_gdat] = feval(['gdat_' lower(machine_eff)],args{:});
     end
   else
-    [gdat_data,gdat_params,error_status,varargout] = feval(['gdat_' lower(machine_eff)],args{:});
+    [gdat_data,gdat_params,error_status,varargout_gdat] = feval(['gdat_' lower(machine_eff)],args{:});
     % because data request can be an actual detailed tree related signal, upper and lower case need to be kept, but other places remain with lower case when case insensitive
     % needed since some substructure have machine name like mapping_for
     gdat_data.gdat_params.machine = lower(gdat_data.gdat_params.machine);
diff --git a/matlab/subcall_all2str.m b/matlab/subcall_all2str.m
index 8966d184da44bc48e0c6973f93e9f0c7e8742ab0..bc88c279e055876b2631564b2e0e0862c75d3f58 100644
--- a/matlab/subcall_all2str.m
+++ b/matlab/subcall_all2str.m
@@ -33,9 +33,13 @@ for i_in=1:length(varargin)
         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
+        elseif numel(aa_values) > 1
           % array
-          subcall = [subcall ',[' num2str(reshape(aa_values,1,length(aa_values))) ']'];
+          if numel(aa_values) <=30
+            subcall = [subcall ',[' num2str(reshape(aa_values,1,numel(aa_values))) ']'];
+          else
+            subcall = [subcall ',[' num2str(reshape(aa_values(1:4),1,4)) ' ... ' num2str(reshape(aa_values(end-3:end),1,4)) ']'];
+          end
         else
           subcall = [subcall ',' num2str(aa_values) ''];
         end
@@ -47,9 +51,13 @@ for i_in=1:length(varargin)
     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
+    elseif numel(var_to_treat) > 1
       % array
-      subcall = [subcall ',[' num2str(var_to_treat) ']'];
+      if numel(var_to_treat) <=30
+        subcall = [subcall ',[' num2str(reshape(var_to_treat,1,numel(var_to_treat))) ']'];
+      else
+        subcall = [subcall ',[' num2str(reshape(var_to_treat(1:4),1,4)) ' ... ' num2str(reshape(var_to_treat(end-3:end),1,4)) ']'];
+      end
     else
       subcall = [subcall ',' num2str(var_to_treat) ''];
     end