diff --git a/crpptbx/D3D/d3d_requests_mapping.m b/crpptbx/D3D/d3d_requests_mapping.m
index 71e14c8630f7797976dbf883785b046ede608b3b..4ddb0741403e494f2ca3efdc69bd71aad5916abc 100644
--- a/crpptbx/D3D/d3d_requests_mapping.m
+++ b/crpptbx/D3D/d3d_requests_mapping.m
@@ -52,7 +52,7 @@ switch lower(data_request)
   mapping.timedim = 1;
   mapping.label = 'B_0';
   mapping.method = 'signal';
-  mapping.expression = [{'FPC'},{'BTF'}];
+  mapping.expression = [{'EFIT01'},{'\bcentr'}];
  case 'beta'
   mapping.timedim = 1;
   mapping.label = '\beta';
@@ -106,23 +106,23 @@ switch lower(data_request)
   mapping.label = 'delta\_top';
   mapping.timedim = 1;
   mapping.method = 'signal';
-  mapping.expression = [{'FPG'},{'delRoben'}];
+  mapping.expression = [{'OT01'},{'\tritop'}];
  case 'delta_bottom'
   mapping.label = 'delta\_bottom';
   mapping.timedim = 1;
   mapping.method = 'signal';
-  mapping.expression = [{'FPG'},{'delRuntn'}];
- case {'ece', 'eced', 'ece_rho', 'eced_rho'}
-  mapping.timedim = 2;
+  mapping.expression = [{'OT01'},{'\tribot'}];
+ case {'ece', 'ece_rho'}
+  mapping.timedim = 1;
   mapping.method = 'switchcase';
   mapping.expression = '';
  case 'eqdsk'
   mapping.timedim = 2;
-  mapping.method = 'switchcase'; % could use function make_eqdsk directly?
+  mapping.method = 'switchcase'; 
   mapping.expression = '';
  case 'equil'
   mapping.gdat_timedim = 2;
-  mapping.method = 'switchcase'; % could use function make_eqdsk directly?
+  mapping.method = 'switchcase'; 
   mapping.expression = '';
  case 'halpha'
   mapping.timedim = 1;
@@ -148,12 +148,12 @@ switch lower(data_request)
   mapping.timedim = 1;
   mapping.label = 'Plasma current';
   mapping.method = 'signal';
-  mapping.expression = [{'MAG'},{'Ipa'}];
+  mapping.expression = [{'efit01'},{'\cpasma'}];
  case 'kappa'
   mapping.timedim = 1;
   mapping.label = '\kappa';
   mapping.method = 'signal';
-  mapping.expression = [{'FPG'},{'k'}];
+  mapping.expression = [{'efit01'},{'\kappa'}];
  case 'kappa_top'
   mapping.timedim = 1;
   mapping.label = '\kappa^{top}';
@@ -168,7 +168,7 @@ switch lower(data_request)
   mapping.timedim = 1;
   mapping.label = 'l_i';
   mapping.method = 'signal';
-  mapping.expression = [{'FPG'},{'li'}];
+  mapping.expression = [{'efit01'},{'\li3'}];
  case 'mhd'
   mapping.timedim = 1;
   mapping.label = 'Odd and Even n';
@@ -188,6 +188,11 @@ switch lower(data_request)
 		    'gdat_tmp.n_even.amp_t=gdat_tmp2.t;' ...
 		    'gdat_tmp.full_path=''MOD/Odd in data and .n_odd; .n_even'';' ...
 		    'gdat_tmp.gdat_request=''mhd'';gdat_tmp.gdat_params.data_request=gdat_tmp.gdat_request;'];
+ case 'nbi'
+  mapping.timedim = 1;
+  mapping.label = 'Pnbi';
+  mapping.method = 'signal';
+  mapping.expression = [{'nb'},{'pinj'}];
  case 'ne'
   mapping.timedim = 2;
   mapping.method = 'switchcase';
@@ -198,14 +203,9 @@ switch lower(data_request)
   mapping.expression = [{'DCN'},{'H-1'}];
  case 'nel'
   mapping.timedim = 1;
-  mapping.label = 'line-averaged el. density';
-  mapping.expression = [{'FPG'},{'lenH-1'}];
-  mapping.method = 'expression';
-  mapping.expression = ['params_eff = gdat_data.gdat_params;params_eff.data_request=''neint'';' ...
-                    'gdat_tmp=gdat_d3d(shot,params_eff);params_eff.data_request=[{''FPG''},{''lenH-1''}];' ...
-		   'gdat_tmp2=gdat_d3d(shot,params_eff);ij=find(gdat_tmp2.data==0);gdat_tmp2.data(ij)=NaN;' ...
-		    'tmp_data=interp1(gdat_tmp2.t,gdat_tmp2.data,gdat_tmp.t,[],NaN);' ...
-		    'gdat_tmp.data = gdat_tmp.data./(tmp_data+1e-5);'];
+  mapping.label = 'NEBAR\_R0';
+  mapping.method = 'signal';
+  mapping.expression = [{'efit01'},{'\NEBAR_R0'}];
  case 'ne_rho'
   mapping.timedim = 2;
   mapping.label = 'ne';
@@ -254,6 +254,11 @@ switch lower(data_request)
   mapping.gdat_timedim = 2;
   mapping.label = 'q';
   mapping.method = 'switchcase';
+ case 'r0'
+  mapping.timedim = 1;
+  mapping.label = 'R_0';
+  mapping.method = 'signal';
+  mapping.expression = [{'EFIT01'},{'\rzero'}];
  case 'rgeom'
   mapping.label = 'Rgeom';
   mapping.timedim = 1;
diff --git a/crpptbx/D3D/gdat_d3d.m b/crpptbx/D3D/gdat_d3d.m
index 1b640907a3e531463dadb0f070c96d06d40da340..d20e5db508939d8ce75eabeec0d2b30b4057bdb1 100644
--- a/crpptbx/D3D/gdat_d3d.m
+++ b/crpptbx/D3D/gdat_d3d.m
@@ -198,9 +198,7 @@ if (nargin>=ivarargin_first_char)
 end
 data_request_eff = gdat_params.data_request; % in case was defined in pairs
 % default equil:
-if ~isfield(gdat_params,'equil'); gdat_params.equil = 'EQI'; end
-if isfield(gdat_params,'source') && (any(strcmp(lower(gdat_params.source),'ide')) || any(strcmp(lower(gdat_params.source),'idg')) ...
-	  || any(strcmp(lower(gdat_params.source),'ida'))); gdat_params.equil = 'IDE'; end
+if ~isfield(gdat_params,'equil'); gdat_params.equil = 'EFIT01'; end
 
 % if it is a request_keyword can obtain description:
 if ischar(data_request_eff) || length(data_request_eff)==1
@@ -271,7 +269,9 @@ if strcmp(mapping_for_d3d.method,'signal')
     if gdat_params.nverbose>=3; disp(['error after get_signal_d3d in signal with data_request_eff= ' data_request_eff]); end
     return
   end
-  
+  if iscell(gdat_data.label) && length(gdat_data.label)==2;
+    gdat_data.label = {[gdat_data.label{1} ' ' gdat_data.label{2}]};
+  end
   gdat_data.data_fullpath=mapping_for_d3d.expression;
   % end of method "signal"
 
@@ -533,7 +533,7 @@ elseif strcmp(mapping_for_d3d.method,'switchcase')
     end
 	
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-   case {'ece', 'eced', 'ece_rho', 'eced_rho'}
+   case {'ece', 'ece_rho'}
     nth_points = 13;
     if isfield(gdat_data.gdat_params,'nth_points') && ~isempty(gdat_data.gdat_params.nth_points)
       nth_points = gdat_data.gdat_params.nth_points;
@@ -544,6 +544,7 @@ elseif strcmp(mapping_for_d3d.method,'switchcase')
     if isfield(gdat_data.gdat_params,'channels') && ~isempty(gdat_data.gdat_params.channels)
       channels = gdat_data.gdat_params.channels;
     end
+    diag_name = 'ece';
     if nth_points>=10
       match_rz_to_time = 1;
     else
@@ -561,126 +562,66 @@ elseif strcmp(mapping_for_d3d.method,'switchcase')
       gdat_data.gdat_params.time_interval = time_interval;
     end
     %
-    if isfield(gdat_data.gdat_params,'diag_name') && ~isempty(gdat_data.gdat_params.diag_name)
-      diag_name = gdat_data.gdat_params.diag_name;
-      if strcmp(upper(diag_name),'RMD'); gdat_data.gdat_params.exp_name = 'ECED'; end
-    else
-      diag_name = 'CEC';
-      gdat_data.gdat_params.diag_name = diag_name;
-    end
-    exp_name_eff = gdat_data.gdat_params.exp_name;
-    if strcmp(data_request_eff,'eced')
-      exp_name_eff = 'ECED';
-      gdat_data.gdat_params.exp_name = exp_name_eff;
-    end
-    [a,e]=rdaD3D_eff(shot,diag_name,'Trad-A',exp_name_eff,time_interval);
-    % [a,e]=rdaD3D_eff(shot,diag_name,'Trad-A',exp_name_eff);
-    inb_chord = size(a.data,1);
     if channels(1)<=0
-      channels = [1:inb_chord];
+      channels = [1:40];
     end
+    chanelles=sort(channels);
     gdat_data.dim{1} = channels;
     gdat_data.gdat_params.channels = channels;
-    if nth_points>1
-      gdat_data.data = a.data(channels,1:nth_points:end);
-      gdat_data.dim{2} = a.t(1:nth_points:end);
-    else
-      gdat_data.data = a.data(channels,:);
-      gdat_data.dim{2} = a.t;
+    for i=channels
+      a = gdat_d3d(shot,{'ece',['\tece' num2str(i,'%.2d')]});
+      if nth_points>1
+        gdat_data.data(i,:) = a.data(1:nth_points:end);
+        gdat_data.dim{2} = a.t(1:nth_points:end);
+      else
+        gdat_data.data(i,:) = a.data;
+        gdat_data.dim{2} = a.t;
+      end
     end
     gdat_data.x = gdat_data.dim{1};
     gdat_data.t = gdat_data.dim{2};
     gdat_data.dimunits=[{'channels'} ; {'time [s]'}];
     if any(strcmp(fieldnames(a),'units')); gdat_data.units=a.units; end
-    try
-      [aR,e]=rdaD3D_eff(shot,diag_name,'R-A',exp_name_eff,time_interval);
-    catch
-    end
-    try
-      [aZ,e]=rdaD3D_eff(shot,diag_name,'z-A',exp_name_eff,time_interval);
-    catch
-      disp(['problem with getting z-A in ' diag_name])
-    end
-    if match_rz_to_time
-      % interpolate R structure on ece data time array, to ease plot vs R
-      for i=1:length(channels)
-	radius.data(i,:) = interp1(aR.t,aR.data(channels(i),:),gdat_data.t);
-	zheight.data(i,:) = interp1(aZ.t,aZ.data(channels(i),:),gdat_data.t);
-      end
-      radiuszheight.t=gdat_data.t;
-    else
-      radius.data = aR.data(channels,:);
-      radiuszheight.t=aR.t;
-      zheight.data = aZ.data(channels,:);
-    end
+% $$$     if match_rz_to_time
+% $$$       % interpolate R structure on ece data time array, to ease plot vs R
+% $$$       for i=1:length(channels)
+% $$$ 	radius.data(i,:) = interp1(aR.t,aR.data(channels(i),:),gdat_data.t);
+% $$$ 	zheight.data(i,:) = interp1(aZ.t,aZ.data(channels(i),:),gdat_data.t);
+% $$$       end
+% $$$       radiuszheight.t=gdat_data.t;
+% $$$     else
+% $$$       radius.data = aR.data(channels,:);
+% $$$       radiuszheight.t=aR.t;
+% $$$       zheight.data = aZ.data(channels,:);
+% $$$     end
     ij=find(gdat_data.data<=0);
     gdat_data.data(ij)=NaN;
-    gdat_data.rz.r=radius.data;
-    gdat_data.rz.z=zheight.data;
-    gdat_data.rz.t = radiuszheight.t;
-    gdat_data.data_fullpath = [exp_name_eff '/' diag_name '/Trad-A with R, Z in .r,.z'];
+% $$$     gdat_data.rz.r=radius.data;
+% $$$     gdat_data.rz.z=zheight.data;
+% $$$     gdat_data.rz.t = radiuszheight.t;
+    gdat_data.data_fullpath = [diag_name '\tece' num2str(channels(1)) '...' num2str(channels(end))];
 
-    if strcmp(data_request_eff,'ece_rho') || strcmp(data_request_eff,'eced_rho')
-      params_equil = gdat_data.gdat_params;
-      params_equil.data_request = 'equil';
-      [equil,params_equil,error_status] = gdat_d3d(shot,params_equil);
-      if error_status>0
-	if gdat_params.nverbose>=3; disp(['problems with ' params_equil.data_request]); end
-	return
-      end
-      gdat_data.gdat_params.equil = params_equil.equil;
-      gdat_data.equil = equil;
-      gdat_data.data_fullpath = [exp_name_eff '/' diag_name '/Trad-A with .r,.z projected on equil ' gdat_data.gdat_params.equil ' in .rhos'];
-      inb_chord_ece=size(gdat_data.rz.r,1);
-      inb_time_ece=size(gdat_data.rz.r,2);
-      psi_out = NaN*ones(inb_chord_ece,inb_time_ece);
-      rhopolnorm_out = NaN*ones(inb_chord_ece,inb_time_ece);
-      rhotornorm_out = NaN*ones(inb_chord_ece,inb_time_ece);
-      rhovolnorm_out = NaN*ones(inb_chord_ece,inb_time_ece);
-      % constructs intervals within which a given equil is used: [time_equil(i),time_equil(i+1)]
-      time_equil=[min(gdat_data.rz.t(1)-0.1,equil.t(1)-0.1) 0.5.*(equil.t(1:end-1)+equil.t(2:end)) max(equil.t(end)+0.1,gdat_data.rz.t(end)+0.1)];
-      for itequil=1:length(time_equil)-1
-	rr=equil.Rmesh(:,itequil);
-	zz=equil.Zmesh(:,itequil);
-	psirz_in = equil.psi2D(:,:,itequil);
-	it_ece_inequil = find(gdat_data.rz.t>time_equil(itequil) & gdat_data.rz.t<=time_equil(itequil+1));
-	if ~isempty(it_ece_inequil)
-	  r_it_ece_inequil = gdat_data.rz.r(:,it_ece_inequil);
-	  iok = find(~isnan(r_it_ece_inequil) & r_it_ece_inequil>0);
-	  if ~isempty(iok)
-	    rout=r_it_ece_inequil(iok);
-	    z_it_ece_inequil = gdat_data.rz.z(:,it_ece_inequil);
-	    zout=z_it_ece_inequil(iok);
-	    psi_at_routzout = interpos2Dcartesian(rr,zz,psirz_in,rout,zout);
-	    [ieff,jeff]=ind2sub(size(gdat_data.rz.r(:,it_ece_inequil)),iok);
-	    for ij=1:length(iok)
-	      psi_out(ieff(ij),it_ece_inequil(jeff(ij))) = psi_at_routzout(ij);
-	    end
-	    rhopolnorm_out(:,it_ece_inequil) = sqrt(abs((psi_out(:,it_ece_inequil)-equil.psi_axis(itequil))./(equil.psi_lcfs(itequil)-equil.psi_axis(itequil))));
-	    for it_cx=1:length(it_ece_inequil)
-	      rhotornorm_out(:,it_ece_inequil(it_cx)) = interpos(equil.rhopolnorm(:,itequil),equil.rhotornorm(:,itequil),rhopolnorm_out(:,it_ece_inequil(it_cx)),-3,[2 2],[0 1]);
-	      rhovolnorm_out(:,it_ece_inequil(it_cx)) = interpos(equil.rhopolnorm(:,itequil),equil.rhovolnorm(:,itequil),rhopolnorm_out(:,it_ece_inequil(it_cx)),-3,[2 2],[0 1]);
-	    end
-	  end
-	end
-      end
-      gdat_data.rhos.psi = psi_out;
-      gdat_data.rhos.rhopolnorm = rhopolnorm_out;
-      gdat_data.rhos.rhotornorm = rhotornorm_out;
-      gdat_data.rhos.rhovolnorm = rhovolnorm_out;
-      gdat_data.rhos.t = gdat_data.rz.t;
-    end
+% $$$       gdat_data.rhos.psi = psi_out;
+% $$$       gdat_data.rhos.rhopolnorm = rhopolnorm_out;
+% $$$       gdat_data.rhos.rhotornorm = rhotornorm_out;
+% $$$       gdat_data.rhos.rhovolnorm = rhovolnorm_out;
+% $$$       gdat_data.rhos.t = gdat_data.rz.t;
+% $$$     end
 	
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'eqdsk'}
     %
-    time_eqdsks=1.; % default time
+    time_eqdsks=2000.; % default time
     if isfield(gdat_data.gdat_params,'time') && ~isempty(gdat_data.gdat_params.time)
       time_eqdsks = gdat_data.gdat_params.time;
     else
       gdat_data.gdat_params.time = time_eqdsks;
       disp(['"time" is expected as an option, choose default time = ' num2str(time_eqdsks)]);
     end
+    if time_eqdsks < 10;
+      % assume given in seconds, d3d time is in ms
+      time_eqdsks = time_eqdsks * 1e3;
+    end
     gdat_data.gdat_params.time = time_eqdsks;
     gdat_data.t = time_eqdsks;
     zshift = 0.;
@@ -702,7 +643,7 @@ elseif strcmp(mapping_for_d3d.method,'switchcase')
     for itime=1:length(time_eqdsks)
       time_eff = time_eqdsks(itime);
       % use read_results updated to effectively obtain an eqdsk with sign correct with COCOS=2
-      [eqdskD3D, equil_all_t, equil_t_index]=geteqdskD3D(equil,time_eff,gdat_data.gdat_params.zshift,'source',gdat_data.gdat_params.equil);
+      [eqdskD3D, equil_all_t, equil_t_index]=get_eqdsk_d3d(equil,time_eff,gdat_data.gdat_params.zshift,'source',gdat_data.gdat_params.equil);
       eqdskD3D.fnamefull = fullfile(['/tmp/' getenv('USER')],['EQDSK_' num2str(shot) 't' num2str(time_eff,'%.4f')]);
       cocos_out = equil.cocos;
       if isfield(gdat_data.gdat_params,'cocos') && ~isempty(gdat_data.gdat_params.cocos)
@@ -748,183 +689,70 @@ elseif strcmp(mapping_for_d3d.method,'switchcase')
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'equil'}
-    % get equil params and time array in gdat_data.t
-    [gdat_data,exp_name_eff,DIAG,NTIME_Lpf,NTIME,Lpf1_t,Lpf_SOL,M_Rmesh,N_Zmesh] = get_EQ_params(gdat_data);
-    % since Lpf depends on time, need to load all first and then loop over time for easier mapping
-    [qpsi,e]=rdaD3D_eff(shot,DIAG,'Qpsi',exp_name_eff);
-    ndimrho = size(qpsi.data,2);
-    if ndimrho==NTIME_Lpf
-      % data seems to be transposed
-      ndimrho = size(qpsi.data,1);
-      itotransposeback = 1; % seems x,time inverted so transpose and exchange .x and .t
+    if ~isfield(gdat_data.gdat_params,'source') || isempty(gdat_data.gdat_params.source) || ~ischar(gdat_data.gdat_params.source)
+      gdat_data.gdat_params.source = 'efit03';
     else
-      itotransposeback = 0;
     end
-    qpsi=adapt_rda(qpsi,NTIME,ndimrho,itotransposeback);
-    ijnan=find(isnan(qpsi.value));
-    qpsi.value(ijnan)=0;
-    [psi_tree,e]=rdaD3D_eff(shot,DIAG,'PFL',exp_name_eff);
-    psi_tree=adapt_rda(psi_tree,NTIME,ndimrho,itotransposeback);
-    [phi_tree,e]=rdaD3D_eff(shot,DIAG,'TFLx',exp_name_eff);
-    phi_tree=adapt_rda(phi_tree,NTIME,ndimrho,itotransposeback);
-    [Vol,e]=rdaD3D_eff(shot,DIAG,'Vol',exp_name_eff);
-    Vol=adapt_rda(Vol,NTIME,2*ndimrho,itotransposeback);
-    [Area,e]=rdaD3D_eff(shot,DIAG,'Area',exp_name_eff);
-    Area=adapt_rda(Area,NTIME,2*ndimrho,itotransposeback);
-    [Ri,e]=rdaD3D_eff(shot,DIAG,'Ri',exp_name_eff);
-    Ri=adapt_rda(Ri,NTIME,M_Rmesh,itotransposeback);
-    [Zj,e]=rdaD3D_eff(shot,DIAG,'Zj',exp_name_eff);
-    Zj=adapt_rda(Zj,NTIME,N_Zmesh,itotransposeback);
-    [PFM_tree,e]=rdaD3D_eff(shot,DIAG,'PFM','-raw','-exp',exp_name_eff); % -raw necessary for IDE
-    PFM_tree=adaptPFM_rda(PFM_tree,M_Rmesh,N_Zmesh,NTIME);
-    [Pres,e]=rdaD3D_eff(shot,DIAG,'Pres',exp_name_eff);
-    Pres=adapt_rda(Pres,NTIME,2*ndimrho,itotransposeback);
-    [Jpol,e]=rdaD3D_eff(shot,DIAG,'Jpol',exp_name_eff);
-    Jpol=adapt_rda(Jpol,NTIME,2*ndimrho,itotransposeback);
-    [FFP,e]=rdaD3D_eff(shot,DIAG,'FFP',exp_name_eff);
-    if ~isempty(FFP.value)
-      FFP=adapt_rda(FFP,NTIME,ndimrho,itotransposeback);
-    else
-      FFP.value=NaN*ones(NTIME,max(Lpf1_t));
-    end
-    if strcmp(DIAG,'EQI') || strcmp(DIAG,'EQH') || strcmp(DIAG,'IDE')
-      [Rinv,e]=rdaD3D_eff(shot,DIAG,'Rinv',exp_name_eff);
-      Rinv=adapt_rda(Rinv,NTIME,ndimrho,itotransposeback);
-      [R2inv,e]=rdaD3D_eff(shot,DIAG,'R2inv',exp_name_eff);
-      R2inv=adapt_rda(R2inv,NTIME,ndimrho,itotransposeback);
-      [Bave,e]=rdaD3D_eff(shot,DIAG,'Bave',exp_name_eff);
-      Bave=adapt_rda(Bave,NTIME,ndimrho,itotransposeback);
-      [B2ave,e]=rdaD3D_eff(shot,DIAG,'B2ave',exp_name_eff);
-      B2ave=adapt_rda(B2ave,NTIME,ndimrho,itotransposeback);
-      if strcmp(DIAG,'IDE')
-	FTRA.value=[];
-      else
-	[FTRA,e]=rdaD3D_eff(shot,DIAG,'FTRA',exp_name_eff);
-	FTRA=adapt_rda(FTRA,NTIME,ndimrho,itotransposeback);
-      end
-    else
-      Rinv.value=[]; R2inv.value=[]; Bave.value=[]; B2ave.value=[]; FTRA.value=[];
-    end
-    [LPFx,e]=rdaD3D_eff(shot,DIAG,'LPFx',exp_name_eff);
-    LPFx.value=LPFx.value(1:NTIME); LPFx.data=LPFx.value; LPFx.t=LPFx.t(1:NTIME);
-    [PFxx,e]=rdaD3D_eff(shot,DIAG,'PFxx',exp_name_eff);
-    PFxx=adapt_rda(PFxx,NTIME,max(LPFx.value)+1,itotransposeback);
-    [RPFx,e]=rdaD3D_eff(shot,DIAG,'RPFx',exp_name_eff);
-    RPFx=adapt_rda(RPFx,NTIME,max(LPFx.value)+1,itotransposeback);
-    [zPFx,e]=rdaD3D_eff(shot,DIAG,'zPFx',exp_name_eff);
-    zPFx=adapt_rda(zPFx,NTIME,max(LPFx.value)+1,itotransposeback);
-    % seems "LCFS" q-value is far too large, limit to some max (when diverted)
-    max_qValue = 30.; % Note could just put a NaN on LCFS value since ill-defined when diverted
-    for it=1:NTIME
-      Lpf1 = Lpf1_t(it);
-      % Qpsi and similar data is on (time,radius) with radius being: LCFS..Lpf_points dummy LCFS..SOL part
-      % change it to (radial,time) and use only Lpf+1 points up to LCFS
-      ijok=find(qpsi.value(:,1)); % note: eqr fills in only odd points radially
-      % set NaNs to zeroes
-      if qpsi.value(ijok(1),1)<0
-	gdat_data.qvalue(:,it) = max(qpsi.value(it,Lpf1:-1:1)',-max_qValue);
-      else
-	gdat_data.qvalue(:,it) = min(qpsi.value(it,Lpf1:-1:1)',max_qValue);
-      end
-      % get x values
-      gdat_data.psi(:,it)=psi_tree.value(it,Lpf1:-1:1)';
-      gdat_data.psi_axis(it)= gdat_data.psi(1,it);
-      gdat_data.psi_lcfs(it)= gdat_data.psi(end,it);
+    if exist('read_mds_eq_func')<=0
+      if gdat_params.nverbose>=3; disp(['addpath(''/m/GAtools/matlab/efit'',''end'') since needs function read_mds_eq_func']); end
+      addpath('/m/GAtools/matlab/efit','end');
+    end
+    [equil_all_t,neq,eq,ier]=read_mds_eq_func(shot,gdat_data.gdat_params.source,'d3d');
+    gdat_data.rhovolnorm = eq.results.geqdsk.rhovn;
+    gdat_data.equil_all_t = equil_all_t;
+    gdat_data.eq_raw = eq;
+    % extract main parameters, can add more later
+    gdat_data.phi = [];
+    gdat_data.rhotornorm = [];
+    gdat_data.t = equil_all_t.time;
+    for it=1:length(equil_all_t.time)
+      gdat_data.qvalue(:,it) = equil_all_t.gdata(it).qpsi;
+      gdat_data.psi(:,it) = (equil_all_t.gdata(it).ssibry - equil_all_t.gdata(it).ssimag) ...
+          .* linspace(0,1,equil_all_t.gdata(it).nw)' + equil_all_t.gdata(it).ssimag;
+      gdat_data.psi_axis(it)= equil_all_t.gdata(it).ssimag;
+      gdat_data.psi_lcfs(it)= equil_all_t.gdata(it).ssibry;
       gdat_data.rhopolnorm(:,it) = sqrt(abs((gdat_data.psi(:,it)-gdat_data.psi_axis(it)) ./(gdat_data.psi_lcfs(it)-gdat_data.psi_axis(it))));
-      if strcmp(DIAG,'EQR');
-	% q value has only a few values and from center to edge, assume they are from central rhopol values on
-	% But they are every other point starting from 3rd
-	ijk=find(gdat_data.qvalue(:,it)~=0);
-	if length(ijk)>2
-	  % now shots have non-zero axis values in eqr
-	  rhoeff=gdat_data.rhopolnorm(ijk,it);
-	  qeff=gdat_data.qvalue(ijk,it); % radial order was already inverted above
-	  if ijk(1)>1
-	    rhoeff = [0.; rhoeff];
-	    qeff = [qeff(1) ;qeff];
-	  end
-	  ij_nonan=find(~isnan(gdat_data.rhopolnorm(:,it)));
-	  qfit = zeros(size(gdat_data.rhopolnorm(:,it)));
-	  qfit(ij_nonan)=interpos(rhoeff,qeff,gdat_data.rhopolnorm(ij_nonan,it),-0.01,[1 0],[0 0],[300; ones(size(qeff(1:end-1)))]);
-	else
-	  qfit = zeros(size(gdat_data.rhopolnorm(:,it)));
-	end
-	gdat_data.qvalue(:,it) = qfit;
-      end    
-      % get rhotor values
-      gdat_data.phi(:,it) = phi_tree.value(it,Lpf1:-1:1)';
-      gdat_data.rhotornorm(:,it) = sqrt(abs(gdat_data.phi(:,it) ./ gdat_data.phi(end,it)));
-      % get rhovol values
-      gdat_data.vol(:,it)=Vol.value(it,2*Lpf1-1:-2:1)'; 
-      gdat_data.dvoldpsi(:,it)=Vol.value(it,2*Lpf1:-2:2)'; % 2nd index are dV/dpsi
-      gdat_data.rhovolnorm(:,it) = sqrt(abs(gdat_data.vol(:,it) ./ gdat_data.vol(end,it)));
-      gdat_data.area(:,it)=Area.value(it,2*Lpf1-1:-2:1)'; 
-      gdat_data.dareadpsi(:,it)=Area.value(it,2*Lpf1:-2:2)'; % 2nd index are dV/dpsi
-      gdat_data.Rmesh(:,it) = Ri.value(it,1:M_Rmesh);
-      gdat_data.Zmesh(:,it) = Zj.value(it,1:N_Zmesh);
-      gdat_data.psi2D(1:M_Rmesh,1:N_Zmesh,it) = PFM_tree.value(1:M_Rmesh,1:N_Zmesh,it);
-      gdat_data.pressure(:,it)=Pres.value(it,2*Lpf1-1:-2:1)'; 
-      gdat_data.dpressuredpsi(:,it)=Pres.value(it,2*Lpf1:-2:2)'; % 2nd index are dV/dpsi
-      if ~isempty(Jpol.value)
-	gdat_data.jpol(:,it)=Jpol.value(it,2*Lpf1-1:-2:1)'; 
-	gdat_data.djpolpsi(:,it)=Jpol.value(it,2*Lpf1:-2:2)'; % 2nd index are dV/dpsi
-      else
-	gdat_data.jpol = [];
-	gdat_data.djpolpsi = [];
-      end
-      gdat_data.ffprime(:,it) = FFP.value(it,Lpf1:-1:1)';
-      gdat_data.Xpoints.psi(1:LPFx.value(it)+1,it) = PFxx.value(it,1:LPFx.value(it)+1);
-      gdat_data.Xpoints.Rvalue(1:LPFx.value(it)+1,it) = RPFx.value(it,1:LPFx.value(it)+1);
-      gdat_data.Xpoints.Zvalue(1:LPFx.value(it)+1,it) = zPFx.value(it,1:LPFx.value(it)+1);
-      if ~isempty(Rinv.value)
-	gdat_data.rinv(:,it) = Rinv.value(it,Lpf1:-1:1)';
-      else
-	gdat_data.rinv = [];
-      end
-      if ~isempty(R2inv.value)
-	gdat_data.r2inv(:,it) = R2inv.value(it,Lpf1:-1:1)';
+      gdat_data.rhopolnorm(end,it) = 1.;
+      gdat_data.vol(:,it)=gdat_data.rhovolnorm(:,it).^2 .* eq.results.aeqdsk.volume(it); 
+      gdat_data.Rmesh(:,it) = eq.results.geqdsk.r;
+      gdat_data.Zmesh(:,it) = eq.results.geqdsk.z;
+      gdat_data.psi2D(:,:,it) = equil_all_t.gdata(it).psirz;
+      gdat_data.pressure(:,it) = equil_all_t.gdata(it).pres; 
+      gdat_data.dpressuredpsi(:,it) = equil_all_t.gdata(it).pprime; % 2nd index are dV/dpsi
+      gdat_data.ffprime(:,it) = equil_all_t.gdata(it).ffprim;
+      gdat_data.rwall(:,it) = equil_all_t.gdata(it).xlim;
+      gdat_data.zwall(:,it) = equil_all_t.gdata(it).ylim;
+      if equil_all_t.adata(it).rxpt1 < -9.5
+        gdat_data.R_Xpoints(:,it,1) = NaN;
       else
-	gdat_data.r2inv = [];
+        gdat_data.R_Xpoints(:,it,1) = equil_all_t.adata(it).rxpt1;
       end
-      if ~isempty(Bave.value)
-	gdat_data.bave(:,it) = Bave.value(it,Lpf1:-1:1)';
+      if equil_all_t.adata(it).rxpt1 < -9.5
+        gdat_data.Z_Xpoints(:,it,1) = NaN;
       else
-	gdat_data.bave = [];
+        gdat_data.Z_Xpoints(:,it,1) = equil_all_t.adata(it).zxpt1;
       end
-      if ~isempty(B2ave.value)
-	gdat_data.b2ave(:,it) = B2ave.value(it,Lpf1:-1:1)';
+      if equil_all_t.adata(it).rxpt2 < -9.5
+        gdat_data.R_Xpoints(:,it,2) = NaN;
       else
-	gdat_data.b2ave = [];
+        gdat_data.R_Xpoints(:,it,2) = equil_all_t.adata(it).rxpt2;
       end
-      if ~isempty(FTRA.value)
-	gdat_data.ftra(:,it) = FTRA.value(it,Lpf1:-1:1)';
+      if equil_all_t.adata(it).rxpt2 < -9.5
+        gdat_data.Z_Xpoints(:,it,2) = NaN;
       else
-	gdat_data.ftra = [];
+        gdat_data.Z_Xpoints(:,it,2) = equil_all_t.adata(it).zxpt2;
       end
       %
     end
     gdat_data.x = gdat_data.rhopolnorm;
     %
-    [equil_Rcoil,e]=rdaD3D_eff(shot,DIAG,'Rcl',exp_name_eff);
-    gdat_data.Rcoils=equil_Rcoil.value;
-    [equil_Zcoil,e]=rdaD3D_eff(shot,DIAG,'Zcl',exp_name_eff);
-    gdat_data.Zcoils=equil_Zcoil.value;
-    %
-    if strcmp(DIAG,'IDE')
-      [IpiPSI,e]=rdaD3D_eff(shot,'IDG','Itor',exp_name_eff);
-      if length(IpiPSI.value)~=NTIME
-	disp('Problem with nb time points of IDG/Itor with respect to IDE NTIME, check with O. Sauter')
-	return
-      end
-    else
-      [IpiPSI,e]=rdaD3D_eff(shot,DIAG,'IpiPSI',exp_name_eff);
-    end
-    gdat_data.Ip = IpiPSI.value(1:NTIME);
+    gdat_data.ip = [equil_all_t.gdata(:).cpasma];
     %
     gdat_data.data = gdat_data.qvalue; % put q in data
-    gdat_data.units=[]; % not applicable
-    gdat_data.data_fullpath = [DIAG ' from expname: ' gdat_data.gdat_params.exp_name '; q(rhopolnorm,t) in .data(.x,.t)'];
-    gdat_data.cocos = 17; % should check FPP
+    gdat_data.units='q'; % not applicable
+    gdat_data.data_fullpath = ...
+        ['q(:,time) in .data, all from [equil_all_t,neq,eq,ier]=read_mds_eq_func(shot,gdat_data.gdat_params.source,''d3d'');'];
+    gdat_data.cocos = 2; 
     gdat_data.dim{1} = gdat_data.x;
     gdat_data.dim{2} = gdat_data.t;
     gdat_data.dimunits{1} = 'rhopolnorm';
@@ -1236,8 +1064,10 @@ elseif strcmp(mapping_for_d3d.method,'switchcase')
     %  LOAD MULTI CHANNEL DATA ECS
     %  powers, frequencies, etc 
     params_eff = gdat_data.gdat_params;
-    params_eff.data_request={'ECS','PECRH'};
-    % pgyro tot in index=9
+    params_eff.data_request={'rf'  '\echpwrc'};
+    gyro_names={'leia','luke','scarecrow','tinman','chewbacca','nasa'};
+    power_names={'ecleifpwrc','eclukfpwrc','ecscafpwrc','ectinfpwrc','ecchefpwrc','ecnasfpwrc'};
+    % pgyro tot in index=length(gyro_names)+1
     try
       gdat_data=gdat_d3d(shot,params_eff);
       gdat_data.data_request = data_request_eff;
@@ -1248,129 +1078,75 @@ elseif strcmp(mapping_for_d3d.method,'switchcase')
       return
     end
     nb_timepoints = length(gdat_data.t);
-    pgyro = NaN*ones(nb_timepoints,9);
-    pgyro(:,9) = reshape(gdat_data.data,nb_timepoints,1);
+    pgyro = NaN*ones(nb_timepoints,length(gyro_names)+1);
+    pgyro(:,length(gyro_names)+1) = reshape(gdat_data.data,nb_timepoints,1);
     gdat_data.data = pgyro;
-    labels{9} = 'ECtot';
-    for i=1:4
+    labels{length(gyro_names)+1} = 'ECtot';
+    for i=1:length(gyro_names)
       % "old" ECRH1 gyrotrons: gyro 1 to 4 in pgyro
-      params_eff.data_request={'ECS',['PG' num2str(i)]};
+      params_eff.data_request={'rf',['ech.' gyro_names{i} ':' power_names{i}]};
       gdat_data_i=gdat_d3d(shot,params_eff);
       if isempty(gdat_data_i.data) || isempty(gdat_data_i.dim)
       else
 	gdat_data.ec{i} = gdat_data_i;
 	gdat_data.data(:,i) = reshape(gdat_data_i.data,nb_timepoints,1);
-	gdat_data.dim = [{gdat_data_i.t} {[1:9]}];
+	gdat_data.dim = [{gdat_data_i.t} {[1:length(gyro_names)+1]}];
 	if max(gdat_data_i.data) > 0.
-	  labels{i} = ['EC_' num2str(i)];
+	  % labels{i} = [gyro_names{i} ':' power_names{i}];
+	  labels{i} = [gyro_names{i}];
 	end
       end
       try
-	a = sf2par('ECS',shot,'gyr_freq',['P_sy1_g' num2str(i)]);
+        params_eff.data_request={'rf',['ech.' gyro_names{i} ':ec' gyro_names{i}(1:3) 'polang']};
+        a=gdat_d3d(shot,params_eff);
       catch
-	% gyr_freq not present (old shots for example)
+	% polang not present
 	a=[];
       end
       if isempty(a)
       else
-	gdat_data.ec{i}.freq = a;
-	gdat_data.freq_ec(i) = a.value;
+	gdat_data.ec{i}.polang_t = a.t;
+	gdat_data.ec{i}.polang = a.data;
+	gdat_data.polang_ec{i} = a;
       end
       try
-	a = sf2par('ECS',shot,'GPolPos',['P_sy1_g' num2str(i)]);
+        params_eff.data_request={'rf',['ech.' gyro_names{i} ':ec' gyro_names{i}(1:3) 'polcnt']};
+        a=gdat_d3d(shot,params_eff);
       catch
-	% GPolPos not present
 	a=[];
       end
       if isempty(a)
       else
-	gdat_data.ec{i}.polpos = a.value;
-	gdat_data.polpos_ec(i) = a.value;
+	gdat_data.ec{i}.polcnt = a.data;
+	gdat_data.polcnt_ec{i} = a;
       end
       try
-	a = sf2par('ECS',shot,'GTorPos',['P_sy1_g' num2str(i)]);
+        params_eff.data_request={'rf',['ech.' gyro_names{i} ':ec' gyro_names{i}(1:3) 'torcnt']};
+        a=gdat_d3d(shot,params_eff);
       catch
 	a=[];
       end
       if isempty(a)
       else
-	gdat_data.ec{i}.torpos = a.value;
-	gdat_data.torpos_ec(i) = a.value;
-      end
-      % "new" ECRH2 gyrotrons: gyro 5 to 8 in pgyro
-      params_eff.data_request={'ECS',['PG' num2str(i) 'N']};
-      gdat_data_i=gdat_d3d(shot,params_eff);
-      if isempty(gdat_data_i.data) || isempty(gdat_data_i.dim)
-      else
-	gdat_data.ec{i+4} = gdat_data_i;
-	gdat_data.data(:,i+4) = reshape(gdat_data_i.data,nb_timepoints,1);
-	gdat_data.dim = [{gdat_data_i.t} {[1:9]}];
-	if max(gdat_data_i.data) > 0.
-	  labels{i+4} = ['EC_' num2str(i+4)];
-	end
-      end
-      try
-	a = sf2par('ECS',shot,'gyr_freq',['P_sy2_g' num2str(i)]);
-      catch
-	a=[];
-      end
-      if isempty(a)
-      else
-	gdat_data.ec{i+4}.freq = a;
-	gdat_data.freq_ec(i+4) = a.value;
-      end
-      try
-	a = sf2par('ECS',shot,'GPolPos',['P_sy2_g' num2str(i)]);
-      catch
-	a=[];
-      end
-      if isempty(a)
-      else
-	gdat_data.ec{i+4}.polpos = a.value;
-	gdat_data.polpos_ec(i+4) = a.value;
-      end
-      try
-	a = sf2par('ECS',shot,'GTorPos',['P_sy2_g' num2str(i)]);
-      catch
-	a=[];
-      end
-      if isempty(a)
-      else
-	gdat_data.ec{i+4}.torpos = a.value;
-	gdat_data.torpos_ec(i+4) = a.value;
-      end
-      params_eff.data_request={'ECN',['G' num2str(i) 'POL']};
-      gdat_data_i=gdat_d3d(shot,params_eff);
-      if isempty(gdat_data_i.data) || isempty(gdat_data_i.dim)
-      else
-	gdat_data.ec{i+4}.gpol_ec = gdat_data_i;
-      end
-      params_eff.data_request={'ECN',['G' num2str(i) 'TOR']};
-      gdat_data_i=gdat_d3d(shot,params_eff);
-      if isempty(gdat_data_i.data) || isempty(gdat_data_i.dim)
-      else
-	gdat_data.ec{i+4}.gtor_ec = gdat_data_i;
-      end
-      params_eff.data_request={'ECN',['G' num2str(i) 'PO4']};
-      gdat_data_i=gdat_d3d(shot,params_eff);
-      if isempty(gdat_data_i.data) || isempty(gdat_data_i.dim)
-      else
-	gdat_data.ec{i+4}.gpo4_ec = gdat_data_i;
-      end
-      params_eff.data_request={'ECN',['G' num2str(i) 'PO8']};
-      gdat_data_i=gdat_d3d(shot,params_eff);
-      if isempty(gdat_data_i.data) || isempty(gdat_data_i.dim)
-      else
-	gdat_data.ec{i+4}.gpo8_ec = gdat_data_i;
+	gdat_data.ec{i}.torcnt = a.data;
+	gdat_data.torcnt_ec{i} = a;
       end
     end
+    gdat_data.gyro_names = gyro_names;
+    gdat_data.power_names = power_names;
+    % add ech on time_interval from total power>3% of max;
+    ij=find(gdat_data.data(:,end)>0.03.*max(gdat_data.data(:,end)));
+    if ~isempty(ij)
+      gdat_data.ec_t_on = [gdat_data.t(ij(1)) gdat_data.t(ij(end))];
+    else
+      gdat_data.ec_t_on = [0 0];
+    end
     if ~isempty(gdat_data.dim)
       gdat_data.t = gdat_data.dim{1};
       gdat_data.x = gdat_data.dim{2};
-      gdat_data.dimunits=[{'time [s]'} {'ECRH1(1:4) ECRH2(1:4) ECtot'}];
+      gdat_data.dimunits=[{'time [ms]'} gyro_names{:} {'ECtot'}];
       gdat_data.units='W';
-      gdat_data.freq_ech_units = 'GHz';
-      gdat_data.data_fullpath=['ECS/' 'PGi and PGiN, etc'];
+      gdat_data.data_fullpath=['rf::ech.gyro_names:ec..pwrc'];
       icount=0;
       for i=1:length(labels)
 	if ~isempty(labels{i})
@@ -1381,7 +1157,6 @@ elseif strcmp(mapping_for_d3d.method,'switchcase')
     else
       gdat_data.freq_ech_units =[]';
       gdat_data.ec = [];
-      gdat_data.freq_ec = [];
       gdat_data.polpos_ec = [];
       gdat_data.torpos_ec = [];
     end
@@ -1756,67 +1531,22 @@ elseif strcmp(mapping_for_d3d.method,'switchcase')
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'sxr'}
-    % sxr from B by default or else if 'source','else' is provided
+    % sxr from sx90rm1s by default or else if 'source' is provided
     if ~isfield(gdat_data.gdat_params,'freq')|| isempty(gdat_data.gdat_params.freq)
-      gdat_data.gdat_params.freq = 'slow';
+      gdat_data.gdat_params.freq = 1;
     end
     if ~isfield(gdat_data.gdat_params,'source') || isempty(gdat_data.gdat_params.source)
-      gdat_data.gdat_params.source = 'G';
-    elseif length(gdat_data.gdat_params.source)>1 || ...
-	  upper(gdat_data.gdat_params.source)<'F' || upper(gdat_data.gdat_params.source)>'M'
-      if gdat_data.gdat_params.nverbose>=1
-        warning(['source = ' gdat_data.gdat_params.source ' not expected with data_request= ' data_request_eff])
-      end
-      return
+      gdat_data.gdat_params.source = 'sx90rm1s';
     end
-    dim1_len = 'from_chord_nb'; % thus up to max(chords_ok_nb)
     if ~isfield(gdat_data.gdat_params,'camera') || isempty(gdat_data.gdat_params.camera)
-      gdat_data.gdat_params.camera = [];
-    elseif ischar(gdat_data.gdat_params.camera) && strcmp(gdat_data.gdat_params.camera,'central')
-      gdat_data.gdat_params.source = 'J';
-      gdat_data.gdat_params.camera = 49;
-    elseif isnumeric(gdat_data.gdat_params.camera)
-      % ok keep the array, but first dim to contain just the related chords
-      dim1_len='nb_of_chords';
-    else
-      if gdat_data.gdat_params.nverbose>=1
-	warning(['camera = ' gdat_data.gdat_params.camera ' not expected with data_request= ' data_request_eff])
-      end
-      return
+      gdat_data.gdat_params.camera = [1:28];
     end
-    if length(gdat_data.gdat_params.camera)==1; dim1_len='nb_of_chords'; end
     gdat_data.gdat_params.source = upper(gdat_data.gdat_params.source);
     %
     if ~isfield(gdat_data.gdat_params,'time_interval')
       gdat_data.gdat_params.time_interval = [];
     end
-    [aa,bb]=unix(['ssh ' '-o "StrictHostKeyChecking no" sxd3d20.d3d.ipp.mpg.de WhichSX ' num2str(shot) ' ' ...
-		  upper(gdat_data.gdat_params.source)]);
-    chords_ok_diags=regexpi(bb,'(?<chord>[A-Z]_[0-9]+)\saddress:\s[0-9]+\sDiag:\s(?<diag>[A-Z]+)','names');
-    if isempty(chords_ok_diags)
-      chords_ok_nb = [];
-    else
-      for i=1:length(chords_ok_diags)
-	chords_ok_nb(i) =  str2num(chords_ok_diags(i).chord(3:end));
-      end
-    end
-    if isempty(gdat_data.gdat_params.camera);
-      gdat_data.gdat_params.camera = chords_ok_nb;
-    else
-      for i=1:length(gdat_data.gdat_params.camera)
-	ij=find(chords_ok_nb==gdat_data.gdat_params.camera(i));
-	if ~isempty(ij)
-	  chords_ok_diags_tmp(i) = chords_ok_diags(ij);
-	else
-	  % chord not in use
-	  chords_ok_diags_tmp(i).chord = [];
-	  chords_ok_diags_tmp(i).diag = [];
-	end
-      end
-      chords_ok_diags = chords_ok_diags_tmp;
-      chords_ok_nb = gdat_data.gdat_params.camera;
-    end
-    exp_name_eff = 'D3DD';
+    exp_name_eff = 'D3D';
     icount = 0;
     nnth = 1;
     if isnumeric(gdat_data.gdat_params.freq) && gdat_data.gdat_params.freq>1; 
@@ -1824,56 +1554,34 @@ elseif strcmp(mapping_for_d3d.method,'switchcase')
       gdat_data.gdat_params.freq = nnth;
     end
     for i=1:length(gdat_data.gdat_params.camera)
-      if ischar(gdat_data.gdat_params.freq) && strcmp(gdat_data.gdat_params.freq,'slow'); chords_ok_diags(i).diag = 'SSX'; end
-      if ~isempty(chords_ok_diags(i).diag) && ~isempty(chords_ok_diags(i).chord)
-	[a,e]=rdaD3D_eff(shot,chords_ok_diags(i).diag,chords_ok_diags(i).chord,exp_name_eff,gdat_data.gdat_params.time_interval);
-      else
-	a.data = [];
-	a.t = [];
-      end
+      tree = 'spectroscopy';
+      ichord = gdat_data.gdat_params.camera(i);
+      diagname = ['sxr:' gdat_data.gdat_params.source ':' gdat_data.gdat_params.source num2str(ichord,'%.2d')];
+      a = gdat_d3d(shot,{tree,diagname});
       if ~isempty(a.data)
 	icount = icount + 1;
 	if icount == 1
 	  % first time has data
-	  % assume all chords have same time base even if from different shotfile
-	  % time missing one point
-	  if length(a.value) == length(a.t)+1
-	    a.t=linspace(a.range(1),a.range(2),length(a.value));
-	    a_time.index(2) = length(a.value);
-	  end
 	  gdat_data.t = a.t(1:nnth:end);
 	  gdat_data.units = a.units;
-	  if strcmp(dim1_len,'from_chord_nb')
-	    gdat_data.data = NaN*ones(max(chords_ok_nb),length(gdat_data.t));
-	    gdat_data.dim{1} = [1:max(chords_ok_nb)]; % simpler to have index corresponding to chord number, except for central
-	  else
-	    gdat_data.data = NaN*ones(length(chords_ok_nb),length(gdat_data.t));
-	    gdat_data.dim{1} = chords_ok_nb;
-	  end
+          gdat_data.data = NaN*ones(max(gdat_data.gdat_params.camera),length(gdat_data.t));
+          gdat_data.x = [1:max(gdat_data.gdat_params.camera)]; % simpler to have index corresponding to chord number, except for central
+          gdat_data.dim{1} = gdat_data.x;
 	  gdat_data.dim{2} = gdat_data.t;
 	  gdat_data.dimunits = [{'chord nb'}; {'s'}];
-	  gdat_data.data_fullpath = ['sxr from source=''' gdat_data.gdat_params.source ' uses shotfiles SX' ...
-		    setdiff(unique(strvcat(chords_ok_diags(:).diag)),'SX')'];
+	  gdat_data.data_fullpath = ['sxr from source=''' gdat_data.gdat_params.source ''''];
 	  gdat_data.label = ['SXR/' upper(gdat_data.gdat_params.source)];
 	end
 	try
-	  if strcmp(dim1_len,'from_chord_nb')
-	    gdat_data.data(chords_ok_nb(i),:) = a.data(1:nnth:end);
-	  else
-	    gdat_data.data(i,:) = a.data(1:nnth:end);
-	  end
+          gdat_data.data(ichord,:) = a.data(1:nnth:end);
 	catch
-	  if (gdat_params.nverbose>=1); disp(['problem with ' chords_ok_diags(i).diag ' ; ' chords_ok_diags(i).chord]); end
-
+	  if (gdat_params.nverbose>=1); disp(['problem with ' gdat_data.gdat_params.source '...' num2str(ichord)]); end
 	end
       else
 	% add fields not yet defined in case all cases have empty data 
       end
     end
-    gdat_data.chords = chords_ok_nb;
-    if length(gdat_data.dim)>=1
-      gdat_data.x = gdat_data.dim{1};
-    end
+    gdat_data.chords = gdat_data.gdat_params.camera;
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'transp'}
@@ -1936,36 +1644,3 @@ return
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % functions for portions called several times
 
-function [gdat_data,exp_name_eff,DIAG,NTIME_Lpf,NTIME,Lpf1_t,Lpf_SOL,M_Rmesh,N_Zmesh] = get_EQ_params(gdat_data);
-% get basic params to be able to read results in EQ-like shotfiles
-% M_Rmesh,N_Zmesh only needed for equil when 2D quantities are required
-%
-shot=gdat_data.shot;
-exp_name_eff = gdat_data.gdat_params.exp_name;
-gdat_data.gdat_params.equil = upper(gdat_data.gdat_params.equil);
-DIAG = gdat_data.gdat_params.equil; % 'EQI' by default at this stage, should become EQH?
-M_Rmesh_par = sf2par(DIAG,shot,'M','PARMV');
-M_Rmesh = M_Rmesh_par.value + 1; % nb of points
-N_Zmesh_par = sf2par(DIAG,shot,'N','PARMV');
-N_Zmesh = N_Zmesh_par.value + 1; % nb of points
-NTIME_par = sf2par(DIAG,shot,'NTIME','PARMV');
-NTIME = NTIME_par.value; % nb of points
-Lpf_par = rdaD3D_eff(shot,DIAG,'Lpf',exp_name_eff);
-% since June, nb of time points in EQ results is not consistent with NTIME and time
-% It seems the first NTIME points are correct, so use this explicitely
-NTIME_Lpf = length(Lpf_par.value);
-if (NTIME < NTIME_Lpf)
-  if gdat_data.gdat_params.nverbose>=3; disp('WARNING: nb of times points smaller then equil results, use first NTIME points'); end
-elseif (NTIME > NTIME_Lpf)
-  if gdat_data.gdat_params.nverbose >= 1
-    disp('ERROR: nb of times points LARGER then equil results')
-    disp('this is unexpected, so stop there and ask Olivier.Sauter@epfl.ch')
-  end
-  return
-end
-Lpf_tot = Lpf_par.value(1:NTIME); % nb of points: 100000*nb_SOL points + nb_core
-Lpf_SOL = fix(Lpf_tot/100000);
-Lpf1_t = mod(Lpf_tot,100000)+1; % nb of Lpf points
-
-[equil_time,e]=rdaD3D_eff(shot,DIAG,'time',exp_name_eff);
-gdat_data.t = equil_time.value(1:NTIME);
diff --git a/crpptbx/D3D/get_eqdsk_d3d.m b/crpptbx/D3D/get_eqdsk_d3d.m
new file mode 100644
index 0000000000000000000000000000000000000000..5fee893e411e5775a2381594e9ba6019a61029c3
--- /dev/null
+++ b/crpptbx/D3D/get_eqdsk_d3d.m
@@ -0,0 +1,128 @@
+function [eqdskd3d, equil_all_t, equil_t_index]=get_eqdsk_d3d(shot,time,zshift,varargin);
+%
+% called by:
+%
+% eqdsk = gdat(shot/equil,'eqdsk','time',time[,'source','efit02',...]);
+%
+% [eqdskd3d, equil_all_t, equil_t_index]=geteqdskd3d(shot,time,zshift,varargin);
+%
+% if shot is a structure assumes obtained from gdat(shot,'equil',...);
+%
+% varargin{1:2}: 'source','efit03' (default) or 'source','efit01' (case insensitive)
+%
+% [eqdskd3d, equil_all_t, equil_t_index]=geteqdskd3d(shot,time);
+% [eqdskd3d, equil_all_t, equil_t_index]=geteqdskd3d(shot,time,[],'source','efit02');
+%
+% you can then do:
+%     write_eqdsk('fname',eqdskd3d,2); % EFIT is COCOS=2 by default (except abs(q) is set, so now q has a sign)
+%     write_eqdsk('fname',eqdskd3d,[2 11]); % if you want an ITER version with COCOS=11
+%
+
+if ~exist('shot') || isempty(shot); 
+  disp('requires a shot or equil structure from gdat(shot,''equil'',...) in geteqdskd3d')
+  return
+end
+
+if ~exist('time'); 
+  time_eff = 2.0*1e3;
+else
+  time_eff = time;
+end
+
+if ~exist('zshift') || isempty(zshift) || ~isnumeric(zshift)
+  zshift_eff = 0.; % no shift
+else
+  zshift_eff = zshift;
+end
+
+if nargin >= 5 && ~isempty(varargin{1})
+  if ~isempty(varargin{2})
+    equil_source = varargin{2};
+  else
+    disp(['Warning source for equil in get_eqdsk_d3d not defined']);
+    return;
+  end
+else
+  equil_source = 'efit03';
+end
+
+if isnumeric(shot)
+  % check read_mds_eq_func is available
+  equil_in = gdat(shot,'equil','equil',equil_source);
+else
+  equil_in = shot;
+  shot = equil_in.shot;
+end
+
+equil_all_t = equil_in.equil_all_t;
+equil = equil_all_t;
+[zz it]=min(abs(equil.time-time_eff));
+
+equil_t_index = it;
+
+eqdsk.cocos=2;
+eqdsk.nr = equil.gdata(it).nw;
+eqdsk.nz = equil.gdata(it).nh;
+eqdsk.rboxlen = equil.gdata(it).xdim ;
+eqdsk.rboxleft = equil.gdata(it).rgrid1;
+eqdsk.zboxlen = equil.gdata(it).zdim ;
+eqdsk.zmid = equil.gdata(it).zmid ;
+eqdsk.rmesh = linspace(eqdsk.rboxleft,eqdsk.rboxleft+eqdsk.rboxlen,eqdsk.nr)';
+eqdsk.zmesh = linspace(eqdsk.zmid-eqdsk.zboxlen/2,eqdsk.zmid+eqdsk.zboxlen/2,eqdsk.nz)' - zshift_eff;
+eqdsk.zshift = zshift_eff;
+eqdsk.psi = equil.gdata(it).psirz;
+eqdsk.psirz = reshape(eqdsk.psi,prod(size(eqdsk.psi)),1);
+eqdsk.psiaxis = equil.gdata(it).ssimag;
+eqdsk.psiedge = equil.gdata(it).ssibry;
+% need psimesh ot be equidistant and same nb of points as nr
+eqdsk.psimesh=linspace(0,1,eqdsk.nr)';
+eqdsk.rhopsi = sqrt(eqdsk.psimesh);
+% psimesh assumed from psi_axis on axis  to have correct d/dpsi 
+eqdsk.psimesh = (eqdsk.psiedge-eqdsk.psiaxis) .* eqdsk.psimesh + eqdsk.psiaxis;
+eqdsk.p = equil.gdata(it).pres;
+eqdsk.pprime = - equil.gdata(it).pprime; % pprime has wrong sign
+eqdsk.FFprime = - equil.gdata(it).ffprim; % ffprime has wrong sign
+eqdsk.F = equil.gdata(it).fpol;
+eqdsk.q = equil.gdata(it).qpsi.*sign(equil.gdata(it).bzero).*sign(equil.gdata(it).cpasma); % EFIT uses always abs(q) so recover sign
+
+eqdsk.b0 = equil.gdata(it).bzero;
+eqdsk.r0 = equil.gdata(it).rzero;
+eqdsk.ip = equil.gdata(it).cpasma;
+
+eqdsk.raxis = equil.gdata(it).rmaxis;
+eqdsk.zaxis = equil.gdata(it).zmaxis - eqdsk.zshift;
+eqdsk.nbbound = equil.gdata(it).nbbbs;
+eqdsk.rplas = equil.gdata(it).rbbbs(1:equil.gdata(it).nbbbs);
+eqdsk.zplas = equil.gdata(it).zbbbs(1:equil.gdata(it).nbbbs);
+
+eqdsk.nblim = equil.gdata(it).limitr;
+eqdsk.rlim = equil.gdata(it).xlim(1:equil.gdata(it).limitr);
+eqdsk.zlim = equil.gdata(it).ylim(1:equil.gdata(it).limitr);
+
+eqdsk.stitle=['#' num2str(shot) ' t=' num2str(time_eff) ' from ' equil_in.gdat_params.exp_name '/' equil_in.gdat_params.equil];
+eqdsk.ind1=3;
+
+psisign = sign(eqdsk.psimesh(end)-eqdsk.psimesh(1));
+[dum1,dum2,dum3,F2_05]=interpos(psisign.*eqdsk.psimesh,eqdsk.FFprime,-0.1);
+fedge=eqdsk.r0.*eqdsk.b0;
+F2 = psisign.*2.*F2_05 + fedge.^2;
+if abs(eqdsk.F(end)-fedge)./abs(fedge)>1e-6
+  disp('problem with cocos?')
+  disp(['eqdsk.F(end) = ' num2str(eqdsk.F)])
+  disp(['r0*b0 = ' num2str(eqdsk.r0) '*' num2str(eqdsk.b0) ' = ' num2str(fedge)]);
+end
+
+% get plasma boundary
+figure
+contour(eqdsk.rmesh,eqdsk.zmesh,eqdsk.psi',100)
+hold all
+plot(eqdsk.rplas,eqdsk.zplas)
+psiedge_eff = 0.001*eqdsk.psiaxis + 0.999*eqdsk.psiedge;
+[hh1 hh2]=contour(eqdsk.rmesh,eqdsk.zmesh,eqdsk.psi',[psiedge_eff psiedge_eff],'k--');
+axis equal
+
+plot(eqdsk.rlim,eqdsk.zlim,'k-')
+
+title(eqdsk.stitle)
+
+eqdskd3d = eqdsk;
diff --git a/crpptbx/D3D/get_signal_d3d.m b/crpptbx/D3D/get_signal_d3d.m
index e1e1a7ebc13edb3d9c5351f1fa26a57d56271ddf..e0d0a0d475e9da566d5a3ac5a1b34f2870a1ced1 100644
--- a/crpptbx/D3D/get_signal_d3d.m
+++ b/crpptbx/D3D/get_signal_d3d.m
@@ -3,26 +3,27 @@ function [gdat_data,error_status] = get_signal_d3d(signal,gdat_data);
 gdat_data.data = mdsvalue(signal);
 error_status = 1;
 
+gdat_data.dim = [];
+gdat_data.dimunits = [];
+gdat_data.t = [];
+gdat_data.x = [];
 nbdims=numel(setdiff(size(gdat_data.data),1));
 if ~isempty(gdat_data.data) && ~ischar(gdat_data.data)
   gdat_data.units = mdsvalue(['units_of(' signal ')']);
-  for i=1:nbdims
-    gdat_data.dim{i} = mdsvalue(['dim_of(' signal ',' num2str(i-1) ')']);
-    % gdat_data.dimunits{i} = mdsvalue(['dimunits_of(' signal ',' num2str(i-1) ')']);
-    gdat_data.dimunits{i} = 'to get';
+  if prod(size(gdat_data.data)) > 1
+    for i=1:nbdims
+      gdat_data.dim{i} = mdsvalue(['dim_of(' signal ',' num2str(i-1) ')']);
+      % gdat_data.dimunits{i} = mdsvalue(['dimunits_of(' signal ',' num2str(i-1) ')']);
+      gdat_data.dimunits{i} = 'to get';
+    end
+    if nbdims==1
+      gdat_data.t = gdat_data.dim{1};
+      gdat_data.x = [];
+    else
+      gdat_data.t = gdat_data.dim{1};
+      gdat_data.x = gdat_data.dim{2};
+    end
+    error_status = 0;
   end
-  if nbdims==1
-    gdat_data.t = gdat_data.dim{1};
-    gdat_data.x = [];
-  else
-    gdat_data.t = gdat_data.dim{1};
-    gdat_data.x = gdat_data.dim{2};
-  end
-  error_status = 0;
-else
-  gdat_data.dim = [];
-  gdat_data.dimunits = [];
-  gdat_data.t = [];
-  gdat_data.x = [];
 end