diff --git a/matlab/TCV_IMAS/tcv_get_ids_summary.m b/matlab/TCV_IMAS/tcv_get_ids_summary.m
index 777eed4318e4fddfd68f5235a3880cf9e34b1d9b..36e2ea17ecda4029e735371011064c5897d2a1cd 100644
--- a/matlab/TCV_IMAS/tcv_get_ids_summary.m
+++ b/matlab/TCV_IMAS/tcv_get_ids_summary.m
@@ -36,6 +36,7 @@ ids_summary.code.name = 'gdat';
 ids_summary.code.version = git_release_hash;
 ids_summary.code.repository = git_url;
 
+%% boundary
 % use equilibrium time as reference, so load first elongation(time)
 
 params_eff = params_eff_ref;
@@ -59,7 +60,6 @@ ids_summary.time = unique([t_before; [kappa.t(1):max((kappa.t(end)-kappa.t(1))/(
 ids_summary_description.time = 'time from gdat(shot,''kappa'') and adding from 0 up to t(ip_trapeze(end))';
 params_eff = params_eff_ref;
 
-% boundary:
 boundary.elongation = kappa;
 boundary_desc.elongation = kappa.gdat_params.data_request;
 params_eff.data_request = 'r_geom';
@@ -121,13 +121,13 @@ if ~isempty(special_fields)
 % $$$   end
 end
 
-% disruption, use specific function
+%% disruption, use specific function
 % to be decided if changes only ids_summary_out.disruption or also elsewhere..., if ids_summary_out.time is changed,
 % then all the other data should be related, thus call this first?
 
 [ids_summary_out,ids_summary_out_description] = ids_summary_disruption(shot, ids_summary, gdat_params);
 
-% gas: bottom/top?, deuterium, helium_xx, ?
+%% gas: bottom/top?, deuterium, helium_xx, ?
 params_eff.data_request = 'gas_flux';
 gas_injection_rates.deuterium = gdat(params_summary.shot,params_eff);
 gas_injection_rates_desc.deuterium = params_eff.data_request;
@@ -148,7 +148,8 @@ for i=1:numel(gas_injection_rates_fieldnames)
   end
 end
 %params_eff.doplot=1;
-% global_quantities:
+
+%% global_quantities
 params_eff.data_request = 'b0';
 global_quantities.b0 = gdat(params_summary.shot,params_eff); % do not add 'source','liuqe' to get all times
 global_quantities_desc.b0 = [params_eff.data_request ' ; ' global_quantities.b0.data_fullpath];
@@ -263,6 +264,7 @@ end
 ids_summary.global_quantities.r0.value = global_quantities.r0.data;
 ids_summary.global_quantities.r0.source = ['gdat request: ' global_quantities_desc.r0];
 
+%% volume average
 % cst zeff
 params_eff.data_request = '\tcv_shot::top.results.ibs:z_eff';
 volume_average.zeff = gdat(params_summary.shot,params_eff);
@@ -283,6 +285,29 @@ for i=1:numel(volume_average_fieldnames)
   end
 end
 
+%% line average
+params_eff.data_request = 'nel';
+line_average.n_e = gdat(params_summary.shot,params_eff);
+line_average_desc.n_e = [params_eff.data_request ' ; ' volume_average.zeff.data_fullpath ' (not vol avrg but to match Iohm)'];
+
+special_fields = {}; % fields needing non-automatic treatments
+line_average_fieldnames = fieldnames(line_average);
+for i=1:numel(line_average_fieldnames)
+  if ~any(strcmp(line_average_fieldnames{i},special_fields))
+    if ~isstruct(ids_summary.line_average.(line_average_fieldnames{i}).value)
+      ids_summary.line_average.(line_average_fieldnames{i}).value = interp1( ...
+          line_average.(line_average_fieldnames{i}).t,line_average.(line_average_fieldnames{i}).data, ...
+          ids_summary.time,'linear',NaN);
+      ids_summary.line_average.(line_average_fieldnames{i}).source = ['gdat request: ' line_average_desc.(line_average_fieldnames{i})];
+    else
+      special_fields{end+1} = line_average_fieldnames{i};
+    end
+  end
+end
+
+
+%%
+
 % cocos automatic transform
 if ~isempty(which('ids_generic_cocos_nodes_transformation_symbolic'))
   [ids_summary,cocoscoeff]=ids_generic_cocos_nodes_transformation_symbolic(ids_summary,'summary',gdat_params.cocos_in, ...