From 0bd7ecb35ff2cffc1dd34a8bcda193b70b5139c2 Mon Sep 17 00:00:00 2001
From: Olivier Sauter <olivier.sauter@epfl.ch>
Date: Fri, 21 Aug 2015 13:09:34 +0000
Subject: [PATCH] starting version of gdat, gdat_tcv working relativelz well
 but not yet with all data_request keywords copied from previous loadTCV,
 returns also list of data request names for aug

git-svn-id: https://spcsvn.epfl.ch/repos/TCV/gdat/trunk@4879 d63d8f72-b253-0410-a779-e742ad2e26cf
---
 crpptbx_new/AUG/aug_requests_mapping.m   | 169 ++++++++
 crpptbx_new/AUG/gdat_aug.m               | 420 ++++++++++++++++++++
 crpptbx_new/TCV/gdat_tcv.m               | 472 +++++++++++++++++++++++
 crpptbx_new/TCV/loadTCVdata.m            | 257 ++++++------
 crpptbx_new/TCV/tcv_requests_mapping.m   | 169 ++++++++
 crpptbx_new/gdat.m                       | 249 +++---------
 crpptbx_new/gdat2.m                      | 274 -------------
 crpptbx_new/gdat_data_request_names.xlsx | Bin 0 -> 11749 bytes
 crpptbx_new/gdat_plot.m                  |  12 +
 crpptbx_new/gdat_prev.m                  | 279 --------------
 crpptbx_new/gdatpaths.m                  |  16 -
 crpptbx_new/get_data_request_names.m     |  45 +++
 crpptbx_new/subcall_all2str.m            |  59 +++
 13 files changed, 1536 insertions(+), 885 deletions(-)
 create mode 100644 crpptbx_new/AUG/aug_requests_mapping.m
 create mode 100644 crpptbx_new/AUG/gdat_aug.m
 create mode 100644 crpptbx_new/TCV/gdat_tcv.m
 create mode 100644 crpptbx_new/TCV/tcv_requests_mapping.m
 delete mode 100644 crpptbx_new/gdat2.m
 create mode 100644 crpptbx_new/gdat_data_request_names.xlsx
 create mode 100644 crpptbx_new/gdat_plot.m
 delete mode 100644 crpptbx_new/gdat_prev.m
 delete mode 100644 crpptbx_new/gdatpaths.m
 create mode 100644 crpptbx_new/get_data_request_names.m
 create mode 100644 crpptbx_new/subcall_all2str.m

diff --git a/crpptbx_new/AUG/aug_requests_mapping.m b/crpptbx_new/AUG/aug_requests_mapping.m
new file mode 100644
index 00000000..15b98dd6
--- /dev/null
+++ b/crpptbx_new/AUG/aug_requests_mapping.m
@@ -0,0 +1,169 @@
+function mapping = aug_requests_mapping(data_request)
+
+% Defaults
+mapping = struct(...
+    'label', '', ...
+    'method', '', ...
+    'expression','', ...
+    'timedim', -1, ...     % dim which is the time, to copy in .t, the other dims are in .x (-1 means last dimension)
+    'new_timedim',0, ...  % if need to reshape data and dim orders to have timedim as new_timedim (shifting time to new_timedim)
+    'min', -inf, ...
+    'max', inf);
+
+if ~exist('data_request') || isempty(data_request)
+  return
+end
+
+% default label: data_request keyword itself
+mapping.label = data_request;
+
+% for AUG, following choices are set so far:
+% method = 'tdi' and then expression is the string within tdi (usual case when there is a direct link to an existing signal)
+%                with tdi, if expression cell array, call tdi(cell{1},cell{2},...)
+% method = 'function', then expression is the funtion to call which should return the correct structure
+% method = 'switchcase', then there will be a specific case within gdat_aug (usual case when not directly a signal)
+%
+% label is used for plotting
+switch lower(data_request)
+ case 'b0'
+  mapping.label = 'B_0';
+  mapping.method = 'switchcase';
+  mapping.expression = '';
+ case 'betan'
+  mapping.label = '\beta_N';
+  mapping.method = 'switchcase';
+  mapping.expression = '';
+ case 'betap'
+  mapping.label = '\beta_p';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::beta_pol';
+ case 'cxrs'
+  mapping.label = 'cxrs';
+  mapping.method = 'switchcase';
+  mapping.expression = '';
+ case 'delta'
+  mapping.method = 'tdi';
+  mapping.expression = '\results::delta_edge';
+  mapping.method = 'function';
+  mapping.expression = ['tdi(''\results::q_psi'');'];
+ case 'delta_top'
+  mapping.label = 'delta\_top';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::delta_ed_top';
+ case 'delta_bottom'
+  mapping.label = 'delta\_bottom';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::delta_ed_bot';
+ case 'ece'
+  mapping.method = 'switchcase';
+  mapping.expression = '';
+ case 'eqdsk'
+  mapping.method = 'switchcase'; % could use function make_eqdsk directly?
+  mapping.expression = '';
+ case 'halpha'
+  mapping.label = 'Halpha';
+  mapping.method = 'tdi';
+  mapping.expression = '\base::pd:pd_011';
+ case 'ioh'
+  mapping.label = 'I ohmic transformer';
+  mapping.method = 'tdi';
+  mapping.expression = [{'\magnetics::ipol[*,$1]'} {'OH_001'}];
+ case 'ip'
+  mapping.label = 'Plasma current';
+  mapping.method = 'tdi';
+  mapping.expression = '\magnetics::iplasma:trapeze';
+ case 'kappa'
+  mapping.method = 'tdi';
+  mapping.expression = '\results::kappa_edge';
+ case 'mhd'
+  mapping.label = 'n=1,2, etc';
+  mapping.method = 'switchcase';
+  mapping.expression = '';
+ case 'ne'
+  mapping.method = 'switchcase';
+ case 'neint'
+  mapping.label = 'line integrated el. density';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::fir:lin_int_dens';
+ case 'nel'
+  mapping.label = 'line-averaged el. density';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::fir:n_average';
+ case 'nerho'
+  mapping.label = 'ne';
+  mapping.method = 'switchcase';
+ case 'neterho'
+  mapping.label = 'ne and Te';
+  mapping.method = 'switchcase';
+ case 'ni'
+  mapping.method = 'switchcase'; % especially since might have option fit, etc
+ case 'powers'
+  mapping.label = 'various powers';
+  mapping.method = 'switchcase';
+ case 'q0'
+  mapping.method = 'tdi';
+  mapping.expression = '\results::q_zero';
+ case 'q95'
+  mapping.method = 'tdi';
+  mapping.expression = '\results::q_95';
+ case 'qedge'
+  mapping.method = 'tdi';
+  mapping.expression = '\results::q_edge';
+ case 'qrho'
+  mapping.label = 'q';
+  mapping.method = 'switchcase';
+ case 'rgeom'
+  mapping.label = 'Rgeom';
+  mapping.method = 'switchcase';
+ case 'rhovol'
+  mapping.label = 'rhovol\_norm';
+  mapping.method = 'switchcase'; % from conf if exist otherwise computes it
+ case 'rmag'
+  mapping.label = 'R\_magaxis';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::r_axis';
+ case 'sxr'
+  mapping.method = 'switchcase';
+ case 'te'
+  mapping.label = 'Te';
+  mapping.method = 'switchcase';
+ case 'terho'
+  mapping.label = 'Te';
+  mapping.method = 'switchcase';
+ case 'ti'
+  mapping.label = 'Ti';
+  mapping.method = 'switchcase';
+ case 'transp'
+  mapping.label = 'transp output';
+  mapping.method = 'switchcase';
+ case 'vloop'
+  mapping.label = '';
+  mapping.method = 'tdi';
+  mapping.expression = '';
+ case 'vol'
+  mapping.label = 'Volume';
+  mapping.method = 'switchcase';
+  % mapping.expression = '\results::psitbx:vol'; (if exists for liuqe2 and 3 as well)
+ case 'zeff'
+  mapping.label = 'zeff from Ip-Ibs';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::ibs:z_eff';
+ case 'zgeom'
+  mapping.label = 'Zgeom';
+  mapping.method = 'switchcase';
+ case 'zmag'
+  mapping.label = 'Zmagaxis';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::z_axis';
+% $$$  case ''
+% $$$   mapping.label = '';
+% $$$   mapping.method = 'tdi';
+% $$$   mapping.expression = '';
+ otherwise
+  mapping.label = data_request;
+  mapping.method = 'tdi'; % assume a full tracename is given, so just try with tdi (could check there are some ":", etc...)
+  mapping.expression = data_request;
+  
+end
+
+
diff --git a/crpptbx_new/AUG/gdat_aug.m b/crpptbx_new/AUG/gdat_aug.m
new file mode 100644
index 00000000..228b8fd9
--- /dev/null
+++ b/crpptbx_new/AUG/gdat_aug.m
@@ -0,0 +1,420 @@
+function [gdat_data,gdat_params,error_status,varargout] = gdat_aug(shot,data_request,varargin)
+%
+% function [gdat_data,gdat_params,error_status,varargout] = gdat(shot,data_request,varargin)
+%
+% Aim: get data from a given machine using full path or keywords. 
+%      data_request are and should be case independent (transformed in lower case in the function and outputs)
+%
+% If no inputs are provided, return the list of available pre-defined data_request in gdat_data and default parameters gdat_params
+%
+% Inputs:
+%
+%    no inputs: return default parameters in a structure form in gdat_params
+%    shot: shot number
+%    data_request: keyword (like 'ip') or trace name or structure containing all parameters but shot number
+%    varargin{i},varargin{i+1},i=1:nargin-2: additional optional parameters given in pairs: param_name, param_value
+%                                            The optional parameters list might depend on the data_request
+%              examples of optional parameters:
+%                               'plot',1 (plot is set by default to 0)
+%                               'machine','AUG' (the default machine is the local machine)
+%
+%
+% Outputs:
+%
+% gdat_data: structure containing the data, the time trace if known and other useful information
+% gdat_data.t : time trace
+% gdat_data.data: requested data values
+% gdat_data.dim : values of the various coordinates related to the dimensions of .data(:,:,...)
+%                     note that one of the dim is the time, replicated in .t for clarity
+% gdat_data.dimunits : units of the various dimensions, 'dimensionless' if dimensionless
+% gdat_data.error_bar : if provided
+% gdat_data.gdat_call : list of parameters provided in the gdat call (so can be reproduced)
+% gdat_data.shot: shot number
+% gdat_data.machine: machine providing the data
+% gdat_data.gdat_request: keyword for gdat if relevant
+% gdat_data.data_fullpath: full path to the data node if known and relevant, or expression, or relevant function called if relevant
+% gdat_data.gdat_params: copy gdat_params for completeness
+% gdat_data.xxx: any other relevant information
+%
+%
+% Examples:
+% (should add working examples for various machines (provides working shot numbers for each machine...))
+% 
+%    [a1,a2]=gdat;
+%    a2.data_request = 'Ip';
+%    a3=gdat(48836,a2);  % gives input parameters as a structure, allows to call the same for many shots
+%    a4=gdat('opt1',123,'opt2',[1 2 3],'shot',48832,'data_request','Ip','opt3','aAdB'); % all in pairs
+%    a5=gdat(48836,'ip'); % standard call
+%    a6=gdat(48836,'ip','Opt1',123,'Doplot',1,'opt2','Abc'); % standard call with a few options (note all lowercase in output)
+
+%
+% Comments for local developer:
+% This gdat is just a "header routine" calling the gdat for the specific machine gdat_`machine`.m which can be called
+% directly, thus which should be able to treat the same type of input arguments
+%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Prepare some variables, etc
+
+varargout{1}=cell(1,1);
+error_status=1;
+
+% construct default parameters structure
+gdat_params.data_request = '';
+default_machine = 'aug';
+
+gdat_params.machine=default_machine;
+gdat_params.doplot = 0;
+
+% construct list of keywords from global set of keywords and specific AUG set
+% get data_request names from centralized function
+data_request_names = get_data_request_names;
+
+% add AUG specific to all:
+if ~isempty(data_request_names.aug)
+  aug_names = fieldnames(data_request_names.aug);
+  for i=1:length(aug_names)
+    data_request_names.all.(aug_names{i}) = data_request_names.aug.(aug_names{i});
+  end
+end
+data_request_names_all = fieldnames(data_request_names.all);
+
+% $$$ data_request_names_all= [{'ip'} {'b0'} {'zmag'} {'rmag'} {'rcont'} {'zcont'} {'vol'} {'rhovol'} {'qrho'} {'q95'} {'kappa'} ...
+% $$$       {'delta'} {'deltatop'} {'deltabot'} {'neint'} {'nel'} ...
+% $$$       {'ne'} {'te'} {'nerho'} {'terho'}  {'ne_edge'} {'te_edge'} {'nerho_edge'} {'terho_edge'} {'nerhozshift'} {'terhozshift'} {'profnerho'} {'profterho'} ...
+% $$$       {'neft'} {'teft'} {'neftav'} {'teftav'} {'neft:trial'} {'teft:trial'} {'neftav:trial'} {'teftav:trial'}  ...
+% $$$       {'sxr'} {'sxr'} {'ece'} {'mpx'} {'ioh'} {'vloop'} {'pgyro'} {'jtor'} {'vi_tor'} {'vi_torfit'} {'vi_pol'} {'vi_polfit'} {'ti'} {'tifit'} {'ni'} {'nifit'} {'zeffcxrs'} {'zeffcxrsfit'}];
+
+% construct default output structure
+gdat_data.data = [];
+gdat_data.units = [];
+gdat_data.dim = [];
+gdat_data.dimunits = [];
+gdat_data.t = [];
+gdat_data.x = [];
+gdat_data.shot = [];
+gdat_data.gdat_request = [];
+gdat_data.gdat_params = gdat_params;
+gdat_data.data_fullpath = [];
+
+
+% Treat inputs:
+ivarargin_first_char = 3;
+data_request_eff = '';
+if nargin>=2 && ischar(data_request); data_request = lower(data_request); end
+
+gdat_data.gdat_request = data_request_names_all; % so if return early gives list of possible request names
+% no inputs
+if nargin==0
+  % return defaults and list of keywords
+  return
+end
+
+do_mdsopen_mdsclose = 1;
+% treat 1st arg
+if nargin>=1
+  if isempty(shot)
+    % means mdsopen(shot) already performed
+    shot = mdsipmex(2,'$SHOT');
+    gdat_data.shot = shot;
+    do_mdsopen_mdsclose = 0;
+  elseif isnumeric(shot)
+    gdat_data.shot = shot;
+  elseif ischar(shot)
+    ivarargin_first_char = 1;
+  else
+    warning('type of 1st argument unexpected, should be numeric or char')
+    error_status=2;
+    return
+  end
+  if nargin==1
+    % Only shot number given. If there is a default data_request set it and continue, otherwise return
+    return
+  end
+end
+% 2nd input argument if not part of pairs
+if nargin>=2 && ivarargin_first_char~=1
+  if isempty(data_request)
+    return
+  end
+  % 2nd arg can be a structure with all options except shot_number, or a string for the pathname or keyword, or the start of pairs string/value for the parameters
+  if isstruct(data_request)
+    if ~isfield(data_request,'data_request')
+      warning('expects field data_request in input parameters structure')
+      error_status=3;
+      return
+    end
+    data_request.data_request = lower(data_request.data_request);
+    data_request_eff = data_request.data_request;
+    gdat_params = data_request;
+  else
+    % since data_request is char check from nb of args if it is data_request or a start of pairs
+    if mod(nargin-1,2)==0
+      ivarargin_first_char = 2;
+    else
+      ivarargin_first_char = 3;
+      data_request_eff = data_request;
+    end
+  end
+end
+
+if ~isstruct(data_request)
+  gdat_params.data_request = data_request_eff;
+end
+
+% if start pairs from shot or data_request, shift varargin
+if ivarargin_first_char==1
+  varargin_eff{1} = shot;
+  varargin_eff{2} = data_request;
+  varargin_eff(3:nargin) = varargin(:);
+elseif ivarargin_first_char==2
+  varargin_eff{1} = data_request;
+  varargin_eff(2:nargin-1) = varargin(:);
+else
+  varargin_eff(1:nargin-2) = varargin(:);
+end
+
+% extract parameters from pairs of varargin:
+if (nargin>=ivarargin_first_char)
+  if mod(nargin-ivarargin_first_char+1,2)==0
+    for i=1:2:nargin-ivarargin_first_char+1
+      if ischar(varargin_eff{i})
+        % enforce lower case for any character driven input
+        if ischar(varargin_eff{i+1})
+          gdat_params.(lower(varargin_eff{i})) = lower(varargin_eff{i+1});
+        else
+          gdat_params.(lower(varargin_eff{i})) = varargin_eff{i+1};
+        end
+      else
+        warning(['input argument nb: ' num2str(i) ' is incorrect, expects a character string'])
+        error_status=401;
+        return
+      end
+    end
+  else
+    warning('number of input arguments incorrect, cannot make pairs of parameters')
+    error_status=402;
+    return
+  end
+end
+data_request_eff = gdat_params.data_request; % in case was defined in pairs
+
+% if it is a request_keyword copy it:
+ij=strmatch(data_request_eff,data_request_names_all,'exact');
+if ~isempty(ij); gdat_data.gdat_request = data_request_names_all{ij}; end
+
+% special treatment if shot and data_request given within pairs
+if isfield(gdat_params,'shot')
+  shot = gdat_params.shot; % should use only gdat_params.shot but change shot to make sure
+  gdat_data.shot = gdat_params.shot;
+  gdat_params=rmfield(gdat_params,'shot');
+end
+if ~isfield(gdat_params,'data_request') || isempty(gdat_params.data_request)
+  % warning('input for ''data_request'' missing from input arguments') % might be correct, asking for list of requests
+  error_status=5;
+  return
+end
+gdat_data.gdat_params = gdat_params;
+
+% re-assign main variables to make sure use the one in gdat_data structure
+shot = gdat_data.shot;
+data_request_eff = gdat_data.gdat_params.data_request;
+error_status = 6; % at least reached this level
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Specifications on how to get the data provided in aug_requests_mapping
+mapping_for_aug = aug_requests_mapping(data_request_eff);
+gdat_data.label = mapping_for_aug.label;
+
+ishot=NaN;
+if do_mdsopen_mdsclose
+  mdsdefaultserver aug1.epfl.ch; % should be in aug general path, but set-it in the meantime...
+  ishot = mdsopen(shot); % if ishot equal to shot, then mdsclose at the end
+  if ishot~=shot
+    warning(['cannot open shot= ' num2str(shot)])
+    return
+  end
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% 1st treat the simplest method: "tdi"
+if strcmp(mapping_for_aug.method,'tdi')
+  % need to treat liuqe2, model, etc from options....
+  if iscell(mapping_for_aug.expression)
+    if length(mapping_for_aug.expression)>0
+      % series of arguments for tdi given in each cell
+      eval_expr = ['aatmp=tdi(''' mapping_for_aug.expression{1} ''''];
+      for i=2:length(mapping_for_aug.expression)
+        eval_expr = [eval_expr ',''' mapping_for_aug.expression{i} ''''];
+      end
+      eval_expr = [eval_expr ');'];
+      eval(eval_expr);
+    else
+      % empty or wrong expression
+      error_status=701;
+      return
+    end
+  else
+    eval_expr = ['aatmp=tdi(''' mapping_for_aug.expression ''');'];
+    eval(eval_expr);
+  end
+  gdat_data.data = aatmp.data;
+  gdat_data.dim = aatmp.dim;
+  nbdims = length(gdat_data.dim);
+  if mapping_for_aug.timedim==-1; 
+    mapping_for_aug.timedim = nbdims;
+    if (size(gdat_data.data,nbdims)==1 && nbdims>1); mapping_for_aug.timedim = nbdims-1; end
+  end
+  dim_nontim = setdiff([1:nbdims],mapping_for_aug.timedim);
+  if ~isempty(dim_nontim)
+    % since most cases have at most 2d, copy as array if data is 2D and as cell if 3D or more
+    if length(dim_nontim)==1
+      gdat_data.x = gdat_data.dim{dim_nontim(1)};
+    else
+      gdat_data.x = gdat_data.dim(dim_nontim);
+    end
+  end
+  gdat_data.t = gdat_data.dim{mapping_for_aug.timedim};
+  gdat_data.units = aatmp.units;
+  gdat_data.dimunits = aatmp.dimunits;
+  if mapping_for_aug.new_timedim>0 && mapping_for_aug.new_timedim ~= mapping_for_aug.timedim
+    % shift timedim to new_timedim data(i,j,...itime,k,...) -> data(i,inewtime,j,...,k,...)
+    % note that this means that gdat_data.x and gdat_data.t are same and correct, 
+    % only .data, .dim and .dimunits need to be changed
+    iprev=[1:nbdims];
+    ij=find(dim_nontim>mapping_for_aug.new_timedim-1);
+    inew=[1:mapping_for_aug.new_timedim-1 mapping_for_aug.timedim dim_nontim(ij)];
+    data_sizes = size(aatmp.data);
+    gdat_data.data = NaN*ones(data_sizes(inew));
+    abcol=ones(1,nbdims)*double(':'); abcomma=ones(1,nbdims)*double(',');
+    dimstr_prev=['(' repmat(':,',1,mapping_for_aug.timedim-1) 'it,' ...
+                 repmat(':,',1,nbdims-mapping_for_aug.timedim-1) ':)'];
+    dimstr_new=['(' repmat(':,',1,mapping_for_aug.new_timedim-1) 'it,' ...
+                repmat(':,',1,nbdims-mapping_for_aug.new_timedim-1) ':)'];
+    % eval gdat_data.data(;,:,...,it,...) = aatmp.data(:,:,:,it,...);
+    for it=1:size(aatmp.data,mapping_for_aug.timedim)
+      shift_eval = ['gdat_data.data' dimstr_new ' = aatmp.data'  dimstr_prev ';'];
+      eval(shift_eval);
+    end
+    gdat_data.dim = aatmp.dim(inew);
+    gdat_data.dimunits = aatmp.dimunits(inew);
+  end
+  gdat_data.data_fullpath=mapping_for_aug.expression;
+  % end of method "tdi"
+
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+elseif strcmp(mapping_for_aug.method,'function')
+  % 2nd: method="function"
+  % assume expression contains function to call and which returns a structure
+  % we copy the structure, to make sure default nodes are defined and to avoid if return is an closed object like tdi
+  eval_expr = ['aatmp=' mapping_for_aug.expression ';'];
+  eval(eval_expr);
+  if isempty(aatmp) || (~isstruct(aatmp) & ~isobject(aatmp))
+    warning(['function expression does not return a structure: ' eval_expr])
+    error_status=801;
+    return
+  end
+  tmp_fieldnames = fieldnames(aatmp);
+  if sum(strcmp(tmp_fieldnames,'data'))==0 % note: cannot do isfield since aatmp might be an object
+    warning(['function does not return a child name ''data'' for ' data_request_eff])
+  end
+  for i=1:length(tmp_fieldnames)
+    gdat_data.(tmp_fieldnames{i}) = aatmp.(tmp_fieldnames{i});
+  end
+  % add .t and .x in case only dim is provided
+  % do not allow shifting of timedim since should be treated in the relevant function
+  ijdim=find(strcmp(tmp_fieldnames,'dim')==1);
+  if ~isempty(ijdim)
+    nbdims = length(gdat_data.dim);
+    if mapping_for_aug.timedim==-1; 
+      mapping_for_aug.timedim = nbdims;
+      if (size(gdat_data.data,nbdims)==1 && nbdims>1); mapping_for_aug.timedim = nbdims-1; end
+    end
+    dim_nontim = setdiff([1:nbdims],mapping_for_aug.timedim);
+    ijt=find(strcmp(tmp_fieldnames,'t')==1);
+    if isempty(ijt)
+      gdat_data.t = gdat_data.dim{mapping_for_aug.timedim};
+    end
+    ijx=find(strcmp(tmp_fieldnames,'x')==1);
+    if isempty(ijx)
+      if ~isempty(dim_nontim)
+        % since most cases have at most 2d, copy as array if data is 2D and as cell if 3D or more
+        if length(dim_nontim)==1
+          gdat_data.x = gdat_data.dim{dim_nontim(1)};
+        else
+          gdat_data.x = gdat_data.dim(dim_nontim);
+        end
+      end
+    end
+    gdat_data.data_fullpath=mapping_for_aug.expression;
+  end
+  % end of method "function"
+
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+elseif strcmp(mapping_for_aug.method,'switchcase')
+  switch data_request_eff % not lower(...) since data_request_eff should be lower case already at this stage
+   case {'ne','te'}
+    % ne or Te from Thomson data on raw z mesh vs (z,t)
+    mdsopen(shot);
+    nodenameeff=['\results::thomson:' data_request_eff];
+    tracetdi=tdi(nodenameeff);
+    tracestd=tdi(['\results::thomson:' data_request_eff ':error_bar']);
+    trace_fir_rat=tdi('\results::thomson:fir_thom_rat');
+    gdat_data.data=tracetdi.data'; % Thomson data as (t,z)
+    gdat_data.error_bar=tracestd.data';
+    gdat_data.data_fullpath=[nodenameeff];
+    % add correct dimensions
+    try
+      time=mdsdata('\results::thomson:times');
+    catch
+      warning('Problems with \results::thomson:times')
+      disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' data_request_eff])
+      return
+    end
+    if isempty(time) || ischar(time)
+      thomsontimes=time
+      warning('!!!!!!!!!!!!!!!!!!!!!!!!!\results::thomson:times  is empty? Check')
+      disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' data_request_eff])
+      return
+    end
+    if strcmp(data_request_eff(1:2),'ne')
+      tracefirrat_data = get_fir_thom_rat_data('thomson',time);
+      gdat_data.data_abs = gdat_data.data * diag(tracefirrat_data);
+      gdat_data.error_bar_abs = gdat_data.error_bar * diag(tracefirrat_data);
+      gdat_data.firrat=tracefirrat_data;
+      gdat_data.data_fullpath=[gdat_data.data_fullpath ' ; _abs includes *firrat'];
+    end
+    z=mdsdata('\diagz::thomson_set_up:vertical_pos');
+    gdat_data.dim=[{z};{time}];
+    gdat_data.dimunits=[{'Z [m]'} ; {'time [s]'}];
+    gdat_data.x=z;
+    gdat_data.t=time;
+    % isfield does not work since tracetdi is not a 'struct' but a tdi object, thus use fieldnames
+    if any(strcmp(fieldnames(tracetdi),'units'))
+      gdat_data.units=tracetdi.units;
+    end
+
+    
+   case 'nerho'
+    
+    
+   otherwise
+    warning(['switchcase= ' data_request_eff ' not known in gdat_aug'])
+    error_status=901;
+    return
+  end
+  
+else
+  warning(['AUG method=' mapping_for_aug.method ' not known yet, contact Olivier.Sauter@epfl.ch'])
+  error_status=602;
+  return
+end
+
+if ishot==shot; mdsclose; end
+
+gdat_data.mapping_for_aug = mapping_for_aug;
+error_status=0;
+
+return
+
diff --git a/crpptbx_new/TCV/gdat_tcv.m b/crpptbx_new/TCV/gdat_tcv.m
new file mode 100644
index 00000000..fdec0bce
--- /dev/null
+++ b/crpptbx_new/TCV/gdat_tcv.m
@@ -0,0 +1,472 @@
+function [gdat_data,gdat_params,error_status,varargout] = gdat_tcv(shot,data_request,varargin)
+%
+% function [gdat_data,gdat_params,error_status,varargout] = gdat(shot,data_request,varargin)
+%
+% Aim: get data from a given machine using full path or keywords. 
+%      data_request are and should be case independent (transformed in lower case in the function and outputs)
+%
+% If no inputs are provided, return the list of available pre-defined data_request in gdat_data and default parameters gdat_params
+%
+% Inputs:
+%
+%    no inputs: return default parameters in a structure form in gdat_params
+%    shot: shot number
+%    data_request: keyword (like 'ip') or trace name or structure containing all parameters but shot number
+%    varargin{i},varargin{i+1},i=1:nargin-2: additional optional parameters given in pairs: param_name, param_value
+%                                            The optional parameters list might depend on the data_request
+%              examples of optional parameters:
+%                               'plot',1 (plot is set by default to 0)
+%                               'machine','TCV' (the default machine is the local machine)
+%
+%
+% Outputs:
+%
+% gdat_data: structure containing the data, the time trace if known and other useful information
+% gdat_data.t : time trace
+% gdat_data.data: requested data values
+% gdat_data.dim : values of the various coordinates related to the dimensions of .data(:,:,...)
+%                     note that one of the dim is the time, replicated in .t for clarity
+% gdat_data.dimunits : units of the various dimensions, 'dimensionless' if dimensionless
+% gdat_data.error_bar : if provided
+% gdat_data.gdat_call : list of parameters provided in the gdat call (so can be reproduced)
+% gdat_data.shot: shot number
+% gdat_data.machine: machine providing the data
+% gdat_data.gdat_request: keyword for gdat if relevant
+% gdat_data.data_fullpath: full path to the data node if known and relevant, or expression, or relevant function called if relevant
+% gdat_data.gdat_params: copy gdat_params for completeness
+% gdat_data.xxx: any other relevant information
+%
+%
+% Examples:
+% (should add working examples for various machines (provides working shot numbers for each machine...))
+% 
+%    [a1,a2]=gdat;
+%    a2.data_request = 'Ip';
+%    a3=gdat(48836,a2);  % gives input parameters as a structure, allows to call the same for many shots
+%    a4=gdat('opt1',123,'opt2',[1 2 3],'shot',48832,'data_request','Ip','opt3','aAdB'); % all in pairs
+%    a5=gdat(48836,'ip'); % standard call
+%    a6=gdat(48836,'ip','Opt1',123,'Doplot',1,'opt2','Abc'); % standard call with a few options (note all lowercase in output)
+
+%
+% Comments for local developer:
+% This gdat is just a "header routine" calling the gdat for the specific machine gdat_`machine`.m which can be called
+% directly, thus which should be able to treat the same type of input arguments
+%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Prepare some variables, etc
+
+varargout{1}=cell(1,1);
+error_status=1;
+
+% construct default parameters structure
+gdat_params.data_request = '';
+default_machine = 'tcv';
+
+gdat_params.machine=default_machine;
+gdat_params.doplot = 0;
+
+% construct list of keywords from global set of keywords and specific TCV set
+% get data_request names from centralized function
+data_request_names = get_data_request_names;
+% add TCV specific to all:
+if ~isempty(data_request_names.tcv)
+  tcv_names = fieldnames(data_request_names.tcv);
+  for i=1:length(tcv_names)
+    data_request_names.all.(tcv_names{i}) = data_request_names.tcv.(tcv_names{i});
+  end
+end
+data_request_names_all = fieldnames(data_request_names.all);
+
+% $$$ data_request_names_all= [{'ip'} {'b0'} {'zmag'} {'rmag'} {'rcont'} {'zcont'} {'vol'} {'rhovol'} {'qrho'} {'q95'} {'kappa'} ...
+% $$$       {'delta'} {'deltatop'} {'deltabot'} {'neint'} {'nel'} ...
+% $$$       {'ne'} {'te'} {'nerho'} {'terho'}  {'ne_edge'} {'te_edge'} {'nerho_edge'} {'terho_edge'} {'nerhozshift'} {'terhozshift'} {'profnerho'} {'profterho'} ...
+% $$$       {'neft'} {'teft'} {'neftav'} {'teftav'} {'neft:trial'} {'teft:trial'} {'neftav:trial'} {'teftav:trial'}  ...
+% $$$       {'sxr'} {'sxr'} {'ece'} {'mpx'} {'ioh'} {'vloop'} {'pgyro'} {'jtor'} {'vi_tor'} {'vi_torfit'} {'vi_pol'} {'vi_polfit'} {'ti'} {'tifit'} {'ni'} {'nifit'} {'zeffcxrs'} {'zeffcxrsfit'}];
+
+% construct default output structure
+gdat_data.data = [];
+gdat_data.units = [];
+gdat_data.dim = [];
+gdat_data.dimunits = [];
+gdat_data.t = [];
+gdat_data.x = [];
+gdat_data.shot = [];
+gdat_data.gdat_request = [];
+gdat_data.gdat_params = gdat_params;
+gdat_data.data_fullpath = [];
+
+
+% Treat inputs:
+ivarargin_first_char = 3;
+data_request_eff = '';
+if nargin>=2 && ischar(data_request); data_request = lower(data_request); end
+
+gdat_data.gdat_request = data_request_names_all; % so if return early gives list of possible request names
+% no inputs
+if nargin==0
+  % return defaults and list of keywords
+  return
+end
+
+do_mdsopen_mdsclose = 1;
+% treat 1st arg
+if nargin>=1
+  if isempty(shot)
+    % means mdsopen(shot) already performed
+    shot = mdsipmex(2,'$SHOT');
+    gdat_data.shot = shot;
+    do_mdsopen_mdsclose = 0;
+  elseif isnumeric(shot)
+    gdat_data.shot = shot;
+  elseif ischar(shot)
+    ivarargin_first_char = 1;
+  else
+    warning('type of 1st argument unexpected, should be numeric or char')
+    error_status=2;
+    return
+  end
+  if nargin==1
+    % Only shot number given. If there is a default data_request set it and continue, otherwise return
+    return
+  end
+end
+% 2nd input argument if not part of pairs
+if nargin>=2 && ivarargin_first_char~=1
+  if isempty(data_request)
+    return
+  end
+  % 2nd arg can be a structure with all options except shot_number, or a string for the pathname or keyword, or the start of pairs string/value for the parameters
+  if isstruct(data_request)
+    if ~isfield(data_request,'data_request')
+      warning('expects field data_request in input parameters structure')
+      error_status=3;
+      return
+    end
+    data_request.data_request = lower(data_request.data_request);
+    data_request_eff = data_request.data_request;
+    gdat_params = data_request;
+  else
+    % since data_request is char check from nb of args if it is data_request or a start of pairs
+    if mod(nargin-1,2)==0
+      ivarargin_first_char = 2;
+    else
+      ivarargin_first_char = 3;
+      data_request_eff = data_request;
+    end
+  end
+end
+
+if ~isstruct(data_request)
+  gdat_params.data_request = data_request_eff;
+end
+
+% if start pairs from shot or data_request, shift varargin
+if ivarargin_first_char==1
+  varargin_eff{1} = shot;
+  varargin_eff{2} = data_request;
+  varargin_eff(3:nargin) = varargin(:);
+elseif ivarargin_first_char==2
+  varargin_eff{1} = data_request;
+  varargin_eff(2:nargin-1) = varargin(:);
+else
+  varargin_eff(1:nargin-2) = varargin(:);
+end
+
+% extract parameters from pairs of varargin:
+if (nargin>=ivarargin_first_char)
+  if mod(nargin-ivarargin_first_char+1,2)==0
+    for i=1:2:nargin-ivarargin_first_char+1
+      if ischar(varargin_eff{i})
+        % enforce lower case for any character driven input
+        if ischar(varargin_eff{i+1})
+          gdat_params.(lower(varargin_eff{i})) = lower(varargin_eff{i+1});
+        else
+          gdat_params.(lower(varargin_eff{i})) = varargin_eff{i+1};
+        end
+      else
+        warning(['input argument nb: ' num2str(i) ' is incorrect, expects a character string'])
+        error_status=401;
+        return
+      end
+    end
+  else
+    warning('number of input arguments incorrect, cannot make pairs of parameters')
+    error_status=402;
+    return
+  end
+end
+data_request_eff = gdat_params.data_request; % in case was defined in pairs
+
+% if it is a request_keyword copy it:
+ij=strmatch(data_request_eff,data_request_names_all,'exact');
+if ~isempty(ij); gdat_data.gdat_request = data_request_names_all{ij}; end
+
+% special treatment if shot and data_request given within pairs
+if isfield(gdat_params,'shot')
+  shot = gdat_params.shot; % should use only gdat_params.shot but change shot to make sure
+  gdat_data.shot = gdat_params.shot;
+  gdat_params=rmfield(gdat_params,'shot');
+end
+if ~isfield(gdat_params,'data_request') || isempty(gdat_params.data_request)
+  % warning('input for ''data_request'' missing from input arguments') % might be correct, asking for list of requests
+  error_status=5;
+  return
+end
+gdat_data.gdat_params = gdat_params;
+
+% re-assign main variables to make sure use the one in gdat_data structure
+shot = gdat_data.shot;
+data_request_eff = gdat_data.gdat_params.data_request;
+error_status = 6; % at least reached this level
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Specifications on how to get the data provided in tcv_requests_mapping
+mapping_for_tcv = tcv_requests_mapping(data_request_eff);
+gdat_data.label = mapping_for_tcv.label;
+
+ishot=NaN;
+if do_mdsopen_mdsclose
+  mdsdefaultserver tcv1.epfl.ch; % should be in tcv general path, but set-it in the meantime...
+  ishot = mdsopen(shot); % if ishot equal to shot, then mdsclose at the end
+  if ishot~=shot
+    warning(['cannot open shot= ' num2str(shot)])
+    return
+  end
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% 1st treat the simplest method: "tdi"
+if strcmp(mapping_for_tcv.method,'tdi')
+  % need to treat liuqe2, model, etc from options....
+  if iscell(mapping_for_tcv.expression)
+    if length(mapping_for_tcv.expression)>0
+      % series of arguments for tdi given in each cell
+      eval_expr = ['aatmp=tdi(''' mapping_for_tcv.expression{1} ''''];
+      for i=2:length(mapping_for_tcv.expression)
+        eval_expr = [eval_expr ',''' mapping_for_tcv.expression{i} ''''];
+      end
+      eval_expr = [eval_expr ');'];
+      eval(eval_expr);
+    else
+      % empty or wrong expression
+      error_status=701;
+      return
+    end
+  else
+    eval_expr = ['aatmp=tdi(''' mapping_for_tcv.expression ''');'];
+    eval(eval_expr);
+  end
+  gdat_data.data = aatmp.data;
+  gdat_data.dim = aatmp.dim;
+  nbdims = length(gdat_data.dim);
+  if mapping_for_tcv.timedim==-1; 
+    mapping_for_tcv.timedim = nbdims;
+    if (size(gdat_data.data,nbdims)==1 && nbdims>1); mapping_for_tcv.timedim = nbdims-1; end
+  end
+  dim_nontim = setdiff([1:nbdims],mapping_for_tcv.timedim);
+  if ~isempty(dim_nontim)
+    % since most cases have at most 2d, copy as array if data is 2D and as cell if 3D or more
+    if length(dim_nontim)==1
+      gdat_data.x = gdat_data.dim{dim_nontim(1)};
+    else
+      gdat_data.x = gdat_data.dim(dim_nontim);
+    end
+  end
+  gdat_data.t = gdat_data.dim{mapping_for_tcv.timedim};
+  gdat_data.units = aatmp.units;
+  gdat_data.dimunits = aatmp.dimunits;
+  if mapping_for_tcv.new_timedim>0 && mapping_for_tcv.new_timedim ~= mapping_for_tcv.timedim
+    % shift timedim to new_timedim data(i,j,...itime,k,...) -> data(i,inewtime,j,...,k,...)
+    % note that this means that gdat_data.x and gdat_data.t are same and correct, 
+    % only .data, .dim and .dimunits need to be changed
+    iprev=[1:nbdims];
+    ij=find(dim_nontim>mapping_for_tcv.new_timedim-1);
+    inew=[1:mapping_for_tcv.new_timedim-1 mapping_for_tcv.timedim dim_nontim(ij)];
+    data_sizes = size(aatmp.data);
+    gdat_data.data = NaN*ones(data_sizes(inew));
+    abcol=ones(1,nbdims)*double(':'); abcomma=ones(1,nbdims)*double(',');
+    dimstr_prev=['(' repmat(':,',1,mapping_for_tcv.timedim-1) 'it,' ...
+                 repmat(':,',1,nbdims-mapping_for_tcv.timedim-1) ':)'];
+    dimstr_new=['(' repmat(':,',1,mapping_for_tcv.new_timedim-1) 'it,' ...
+                repmat(':,',1,nbdims-mapping_for_tcv.new_timedim-1) ':)'];
+    % eval gdat_data.data(;,:,...,it,...) = aatmp.data(:,:,:,it,...);
+    for it=1:size(aatmp.data,mapping_for_tcv.timedim)
+      shift_eval = ['gdat_data.data' dimstr_new ' = aatmp.data'  dimstr_prev ';'];
+      eval(shift_eval);
+    end
+    gdat_data.dim = aatmp.dim(inew);
+    gdat_data.dimunits = aatmp.dimunits(inew);
+  end
+  gdat_data.data_fullpath=mapping_for_tcv.expression;
+  % end of method "tdi"
+
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+elseif strcmp(mapping_for_tcv.method,'function')
+  % 2nd: method="function"
+  % assume expression contains function to call and which returns a structure
+  % we copy the structure, to make sure default nodes are defined and to avoid if return is an closed object like tdi
+  eval_expr = ['aatmp=' mapping_for_tcv.expression ';'];
+  eval(eval_expr);
+  if isempty(aatmp) || (~isstruct(aatmp) & ~isobject(aatmp))
+    warning(['function expression does not return a structure: ' eval_expr])
+    error_status=801;
+    return
+  end
+  tmp_fieldnames = fieldnames(aatmp);
+  if sum(strcmp(tmp_fieldnames,'data'))==0 % note: cannot do isfield since aatmp might be an object
+    warning(['function does not return a child name ''data'' for ' data_request_eff])
+  end
+  for i=1:length(tmp_fieldnames)
+    gdat_data.(tmp_fieldnames{i}) = aatmp.(tmp_fieldnames{i});
+  end
+  % add .t and .x in case only dim is provided
+  % do not allow shifting of timedim since should be treated in the relevant function
+  ijdim=find(strcmp(tmp_fieldnames,'dim')==1);
+  if ~isempty(ijdim)
+    nbdims = length(gdat_data.dim);
+    if mapping_for_tcv.timedim==-1; 
+      mapping_for_tcv.timedim = nbdims;
+      if (size(gdat_data.data,nbdims)==1 && nbdims>1); mapping_for_tcv.timedim = nbdims-1; end
+    end
+    dim_nontim = setdiff([1:nbdims],mapping_for_tcv.timedim);
+    ijt=find(strcmp(tmp_fieldnames,'t')==1);
+    if isempty(ijt)
+      gdat_data.t = gdat_data.dim{mapping_for_tcv.timedim};
+    end
+    ijx=find(strcmp(tmp_fieldnames,'x')==1);
+    if isempty(ijx)
+      if ~isempty(dim_nontim)
+        % since most cases have at most 2d, copy as array if data is 2D and as cell if 3D or more
+        if length(dim_nontim)==1
+          gdat_data.x = gdat_data.dim{dim_nontim(1)};
+        else
+          gdat_data.x = gdat_data.dim(dim_nontim);
+        end
+      end
+    end
+    gdat_data.data_fullpath=mapping_for_tcv.expression;
+  end
+  % end of method "function"
+
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+elseif strcmp(mapping_for_tcv.method,'switchcase')
+  switch data_request_eff % not lower(...) since data_request_eff should be lower case already at this stage
+   case {'ne','te'}
+    % ne or Te from Thomson data on raw z mesh vs (z,t)
+    mdsopen(shot);
+    nodenameeff=['\results::thomson:' data_request_eff];
+    tracetdi=tdi(nodenameeff);
+    tracestd=tdi(['\results::thomson:' data_request_eff ':error_bar']);
+    trace_fir_rat=tdi('\results::thomson:fir_thom_rat');
+    gdat_data.data=tracetdi.data'; % Thomson data as (t,z)
+    gdat_data.error_bar=tracestd.data';
+    gdat_data.data_fullpath=[nodenameeff];
+    % add correct dimensions
+    try
+      time=mdsdata('\results::thomson:times');
+    catch
+      warning('Problems with \results::thomson:times')
+      disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' data_request_eff])
+      return
+    end
+    if isempty(time) || ischar(time)
+      thomsontimes=time
+      warning('!!!!!!!!!!!!!!!!!!!!!!!!!\results::thomson:times  is empty? Check')
+      disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' data_request_eff])
+      return
+    end
+    if strcmp(data_request_eff(1:2),'ne')
+      tracefirrat_data = get_fir_thom_rat_data('thomson',time);
+      gdat_data.data_abs = gdat_data.data * diag(tracefirrat_data);
+      gdat_data.error_bar_abs = gdat_data.error_bar * diag(tracefirrat_data);
+      gdat_data.firrat=tracefirrat_data;
+      gdat_data.data_fullpath=[gdat_data.data_fullpath ' ; _abs includes *firrat'];
+    end
+    z=mdsdata('\diagz::thomson_set_up:vertical_pos');
+    gdat_data.dim=[{z};{time}];
+    gdat_data.dimunits=[{'Z [m]'} ; {'time [s]'}];
+    gdat_data.x=z;
+    gdat_data.t=time;
+    % isfield does not work since tracetdi is not a 'struct' but a tdi object, thus use fieldnames
+    if any(strcmp(fieldnames(tracetdi),'units'))
+      gdat_data.units=tracetdi.units;
+    end
+
+    
+   case 'nerho'
+    
+    
+   otherwise
+    warning(['switchcase= ' data_request_eff ' not known in gdat_tcv'])
+    error_status=901;
+    return
+  end
+  
+else
+  warning(['TCV method=' mapping_for_tcv.method ' not known yet, contact Olivier.Sauter@epfl.ch'])
+  error_status=602;
+  return
+end
+
+if ishot==shot; mdsclose; end
+
+gdat_data.mapping_for_tcv = mapping_for_tcv;
+error_status=0;
+
+return
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+function [firthomratio] = get_fir_thom_rat_data(maintracename,timebase);
+%
+% since depends on shot number for using auto fit and thomson or thomson edge, use tracename and function here
+%
+% maintracename = 'thomson' or 'thomson_edge
+%
+% return fir_to_thomson ratio on time=timebase
+%
+% normally should use "main" thomson one built from auto fit if possible
+% take edge one if need be
+%
+% default: maintracename = "thomson"
+%
+maintracename_eff = 'thomson';
+if exist('maintracename') && ~isempty(maintracename)
+  maintracename_eff = maintracename;
+end
+
+firthomratio = NaN;
+if ~exist('timebase') || isempty(timebase)
+  disp('need a timebase in get_fir_thom_rat_data')
+  return
+end
+firthomratio = NaN*ones(size(timebase));
+
+if strcmp(maintracename_eff,'thomson')
+  if shot>=23801
+    tracefirrat=tdi('\results::thomson.profiles.auto:fir_thom_rat'); %time base not same!!
+    if isempty(tracefirrat.data) || ischar(tracefirrat.data)
+      disp('problem with \results::thomson.profiles.auto:fir_thom_rat: empty, use thomson:fir_thom_rat')
+      tracefirrat=tdi('\results::thomson:fir_thom_rat');
+    end
+  else
+    tracefirrat=tdi('\results::thomson:fir_thom_rat');
+    if isempty(tracefirrat.data) || ischar(tracefirrat.data)
+      disp('problem with \results::thomson:fir_thom_rat: empty')
+    end
+  end
+elseif strcmp(maintracename_eff,'thomson_edge')
+  tracefirrat=tdi('\results::thomson_edge:fir_thom_rat');
+  if isempty(tracefirrat.data) || ischar(tracefirrat.data)
+    disp('problem with \results::thomson_edge:fir_thom_rat: empty')
+  end
+else
+  disp('bad input in get_fir_thom_rat_data')
+  return
+end  
+  
+if ~isempty(tracefirrat.data) || ischar(tracefirrat.data)
+  firthomratio = interp1(tracefirrat.dim{1},tracefirrat.data,timebase);
+end
+
diff --git a/crpptbx_new/TCV/loadTCVdata.m b/crpptbx_new/TCV/loadTCVdata.m
index e912325d..cc7ef6ba 100644
--- a/crpptbx_new/TCV/loadTCVdata.m
+++ b/crpptbx_new/TCV/loadTCVdata.m
@@ -1,9 +1,9 @@
- function [trace,error,varargout]=loadTCVdata(shot,data_request,varargin)
+ function [trace,error_status,varargout]=loadTCVdata(shot,data_type,varargin)
 %
 % Added option to load shot=-1 or >=100000
 % Added option shot=-9 to list keywords
 %
-% list of data_request currently available (when [_2,_3] is added, means can add _i to get Liuqe i):
+% list of data_type currently available (when [_2,_3] is added, means can add _i to get Liuqe i):
 % if -1 is added, can also get it from FBTE with shot=-1, >=100000 or liuqe_version='_-1' (to get model file)
 %
 % 'Ip'[_2,_3]   =  current
@@ -54,18 +54,18 @@
 %
 % INPUT:
 % shot: shot number
-% data_request: type of the required data
+% data_type: type of the required data
 %
-% Definition of varargin depends on data_request:
+% Definition of varargin depends on data_type:
 %
-% data_request=sxr or ece:
+% data_type=sxr or ece:
 %                  varargin{1}:  [i1 i2] : if not empty, assumes need many chords from i1 to i2
 %                  varargin{2}:  channel status 1= unread yet, 0= read
 %                                (for traces with many channel, enables to load additional channels,
 %                                 like SXR, ECE, etc.)
 %                  varargin{3}:  zmag for varargout{1} computation
 %                       (can have more inputs for AUG, but not used here)
-% data_request=nerhozshift or terhozshift:
+% data_type=nerhozshift or terhozshift:
 %                  varargin{1}:  zshift [m] constant or (t) : positive, moves equil up (that is thomson effective z down)
 %                                                time dependent: needs same time base as psitbx:psi
 %
@@ -78,41 +78,41 @@
 % trace.dimunits: units of dimensions
 % trace.units:  units of data
 %
-% Additional Output arguments depending on data_request
+% Additional Output arguments depending on data_type
 %
-% data_request=sxR, ece:
+% data_type=sxR, ece:
 %                varargout{1}: major radius: intersection/projection of the view lines with z=zmag
-% data_request=MPX:
+% data_type=MPX:
 %                varargout{1}: te be determined
 %
 %
 % function needed: mds functions-xtomo_geometry-get_xtomo_data (Furno's routines)
 %                  VsxrTCVradius
 % Example:
-%         [ip,error]=loadTCVdata(shot,'Ip',1);
-%         [sxr,error,R]=loadTCVdata(shot,'sxR',1);
+%         [ip,error_status]=loadTCVdata(shot,'Ip',1);
+%         [sxr,error_status,R]=loadTCVdata(shot,'sxR',1);
 %
 
 varargout{1}=cell(1,1);
-error=1;
+error_status=1;
 
-% To allow multiple ways of writing a specific keyword, use data_request_eff within this routine
-if exist('data_request') && ~isempty(data_request)
-  data_request_eff=data_request;
+% To allow multiple ways of writing a specific keyword, use data_type_eff within this routine
+if exist('data_type') && ~isempty(data_type)
+  data_type_eff=data_type;
 else
-  data_request_eff=' ';
+  data_type_eff=' ';
 end
 i_23=0;
 % LIUQE tree
 begstr = '\results::';
 endstr = '';
 liuqe_version = 1;
-if length(data_request_eff)>2
-  if strcmp(data_request_eff(end-1:end),'_2') | strcmp(data_request_eff(end-1:end),'_3')
+if length(data_type_eff)>2
+  if strcmp(data_type_eff(end-1:end),'_2') | strcmp(data_type_eff(end-1:end),'_3')
     i_23=2;
-    endstr=data_request_eff(end-1:end);
-    liuqe_version = str2num(data_request_eff(end:end));
-  elseif strcmp(upper(data_request_eff(end-2:end)),'_-1')
+    endstr=data_type_eff(end-1:end);
+    liuqe_version = str2num(data_type_eff(end:end));
+  elseif strcmp(upper(data_type_eff(end-2:end)),'_-1')
     i_23=3;
     begstr = 'tcv_eq( "';
     endstr = '", "FBTE" )';
@@ -128,122 +128,122 @@ end
 
 % use keyword without eventual _2 or _3 extension to check for multiple possibilities
 % Also remove ":4" for trial_indx specification
-jj=strfind(data_request_eff,':');
+jj=strfind(data_type_eff,':');
 trialindx=[];
 if ~isempty(jj)
-  ii=strmatch(data_request_eff(1:jj-1),[{'teft'},{'neft'},{'teftav'},{'neftav'}]);
+  ii=strmatch(data_type_eff(1:jj-1),[{'teft'},{'neft'},{'teftav'},{'neftav'}]);
   if ~isempty(ii)
-    trialindx=str2num(data_request_eff(jj+1:end));
-    data_request_eff_noext=[data_request_eff(1:jj-1) ':trial'];
+    trialindx=str2num(data_type_eff(jj+1:end));
+    data_type_eff_noext=[data_type_eff(1:jj-1) ':trial'];
   else
-    data_request_eff_noext=data_request_eff(1:end-i_23);
+    data_type_eff_noext=data_type_eff(1:end-i_23);
   end
 else
-  data_request_eff_noext=data_request_eff(1:end-i_23);
+  data_type_eff_noext=data_type_eff(1:end-i_23);
 end
 
-if ~isempty(strmatch(data_request_eff_noext,[{'ip'} {'i_p'} {'xip'}],'exact'))
-  data_request_eff_noext='Ip';
+if ~isempty(strmatch(data_type_eff_noext,[{'ip'} {'i_p'} {'xip'}],'exact'))
+  data_type_eff_noext='Ip';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'b0'} {'B_0'} {'Bgeom'} {'BGEOM'}],'exact'))
-  data_request_eff_noext='B0';
+if ~isempty(strmatch(data_type_eff_noext,[{'b0'} {'B_0'} {'Bgeom'} {'BGEOM'}],'exact'))
+  data_type_eff_noext='B0';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Te'} {'t_e'} {'TE'} {'T_e'}],'exact'))
-  data_request_eff_noext='te';
+if ~isempty(strmatch(data_type_eff_noext,[{'Te'} {'t_e'} {'TE'} {'T_e'}],'exact'))
+  data_type_eff_noext='te';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Te_edge'} {'TE_edge'}],'exact'))
-  data_request_eff_noext='te_edge';
+if ~isempty(strmatch(data_type_eff_noext,[{'Te_edge'} {'TE_edge'}],'exact'))
+  data_type_eff_noext='te_edge';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Ne_edge'} {'NE_edge'}],'exact'))
-  data_request_eff_noext='ne';
+if ~isempty(strmatch(data_type_eff_noext,[{'Ne_edge'} {'NE_edge'}],'exact'))
+  data_type_eff_noext='ne';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Rcont'}],'exact'))
-  data_request_eff_noext='rcont';
+if ~isempty(strmatch(data_type_eff_noext,[{'Rcont'}],'exact'))
+  data_type_eff_noext='rcont';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Zcont'}],'exact'))
-  data_request_eff_noext='zcont';
+if ~isempty(strmatch(data_type_eff_noext,[{'Zcont'}],'exact'))
+  data_type_eff_noext='zcont';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Terho'}],'exact'))
-  data_request_eff_noext='terho';
+if ~isempty(strmatch(data_type_eff_noext,[{'Terho'}],'exact'))
+  data_type_eff_noext='terho';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Terhozshift'}],'exact'))
-  data_request_eff_noext='terhozshift';
+if ~isempty(strmatch(data_type_eff_noext,[{'Terhozshift'}],'exact'))
+  data_type_eff_noext='terhozshift';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'SXR'}],'exact'))
-  data_request_eff_noext='sxr';
+if ~isempty(strmatch(data_type_eff_noext,[{'SXR'}],'exact'))
+  data_type_eff_noext='sxr';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'ECE'}],'exact'))
-  data_request_eff_noext='ece';
+if ~isempty(strmatch(data_type_eff_noext,[{'ECE'}],'exact'))
+  data_type_eff_noext='ece';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'VOL'} {'volume'}],'exact'))
-  data_request_eff_noext='vol';
+if ~isempty(strmatch(data_type_eff_noext,[{'VOL'} {'volume'}],'exact'))
+  data_type_eff_noext='vol';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'RHOVOL'}],'exact'))
-  data_request_eff_noext='rhovol';
+if ~isempty(strmatch(data_type_eff_noext,[{'RHOVOL'}],'exact'))
+  data_type_eff_noext='rhovol';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'q_95'} {'Q95'}],'exact'))
-  data_request_eff_noext='q95';
+if ~isempty(strmatch(data_type_eff_noext,[{'q_95'} {'Q95'}],'exact'))
+  data_type_eff_noext='q95';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'elongation'} {'elon'}],'exact'))
-  data_request_eff_noext='kappa';
+if ~isempty(strmatch(data_type_eff_noext,[{'elongation'} {'elon'}],'exact'))
+  data_type_eff_noext='kappa';
 end
-if ~isempty(strmatch(lower(data_request_eff_noext),[{'j_tor'} {'jtor'} {'\results::j_tor'}],'exact'))
-  data_request_eff_noext='jtor';
-  data_request_eff = ['jtor' endstr];
+if ~isempty(strmatch(lower(data_type_eff_noext),[{'j_tor'} {'jtor'} {'\results::j_tor'}],'exact'))
+  data_type_eff_noext='jtor';
+  data_type_eff = ['jtor' endstr];
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'triangularity'} {'triang'}],'exact'))
-  data_request_eff_noext='delta';
+if ~isempty(strmatch(data_type_eff_noext,[{'triangularity'} {'triang'}],'exact'))
+  data_type_eff_noext='delta';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'deltaup'} {'deltau'} {'triangtop'} {'triangu'} {'triangup'}],'exact'))
-  data_request_eff_noext='deltatop';
+if ~isempty(strmatch(data_type_eff_noext,[{'deltaup'} {'deltau'} {'triangtop'} {'triangu'} {'triangup'}],'exact'))
+  data_type_eff_noext='deltatop';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'deltalow'} {'deltal'} {'triangbot'} {'triangl'} {'trianglow'}],'exact'))
-  data_request_eff_noext='deltabot';
+if ~isempty(strmatch(data_type_eff_noext,[{'deltalow'} {'deltal'} {'triangbot'} {'triangl'} {'trianglow'}],'exact'))
+  data_type_eff_noext='deltabot';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Rmag'}],'exact'))
-  data_request_eff_noext='rmag';
+if ~isempty(strmatch(data_type_eff_noext,[{'Rmag'}],'exact'))
+  data_type_eff_noext='rmag';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Zmag'}],'exact'))
-  data_request_eff_noext='zmag';
+if ~isempty(strmatch(data_type_eff_noext,[{'Zmag'}],'exact'))
+  data_type_eff_noext='zmag';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'MPX'}],'exact'))
-  data_request_eff_noext='MPX';
+if ~isempty(strmatch(data_type_eff_noext,[{'MPX'}],'exact'))
+  data_type_eff_noext='MPX';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'ioh'} {'Ioh'} {'iot'} {'IOT'}],'exact'))
-  data_request_eff_noext='IOH';
+if ~isempty(strmatch(data_type_eff_noext,[{'ioh'} {'Ioh'} {'iot'} {'IOT'}],'exact'))
+  data_type_eff_noext='IOH';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Vloop'} {'Vsurf'} {'vsurf'}],'exact'))
-  data_request_eff_noext='vloop';
+if ~isempty(strmatch(data_type_eff_noext,[{'Vloop'} {'Vsurf'} {'vsurf'}],'exact'))
+  data_type_eff_noext='vloop';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'vtor'} {'v_tor'} {'vi'} {'vc'} {'v_i'} {'v_c'} {'VTOR'} {'V_TOR'} {'VI'} {'VC'} {'V_I'} {'V_C'}],'exact'))
-  data_request_eff_noext='vi_tor';
+if ~isempty(strmatch(data_type_eff_noext,[{'vtor'} {'v_tor'} {'vi'} {'vc'} {'v_i'} {'v_c'} {'VTOR'} {'V_TOR'} {'VI'} {'VC'} {'V_I'} {'V_C'}],'exact'))
+  data_type_eff_noext='vi_tor';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'vtorfit'} {'vtorft'} {'v_torfit'} {'vifit'} {'vcfit'} {'v_ifit'} {'v_cfit'} {'VTORfit'} {'V_TORfit'} {'VIfit'} {'VCfit'} {'V_Ifit'} {'V_Cfit'}],'exact'))
-  data_request_eff_noext='vi_torfit';
+if ~isempty(strmatch(data_type_eff_noext,[{'vtorfit'} {'vtorft'} {'v_torfit'} {'vifit'} {'vcfit'} {'v_ifit'} {'v_cfit'} {'VTORfit'} {'V_TORfit'} {'VIfit'} {'VCfit'} {'V_Ifit'} {'V_Cfit'}],'exact'))
+  data_type_eff_noext='vi_torfit';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'vpol'} {'v_pol'} {'VPOL'} {'V_POL'}],'exact'))
-  data_request_eff_noext='vi_pol';
+if ~isempty(strmatch(data_type_eff_noext,[{'vpol'} {'v_pol'} {'VPOL'} {'V_POL'}],'exact'))
+  data_type_eff_noext='vi_pol';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'vpolfit'} {'vpolft'} {'v_polfit'} {'VPOLfit'} {'V_POLfit'}],'exact'))
-  data_request_eff_noext='vi_polfit';
+if ~isempty(strmatch(data_type_eff_noext,[{'vpolfit'} {'vpolft'} {'v_polfit'} {'VPOLfit'} {'V_POLfit'}],'exact'))
+  data_type_eff_noext='vi_polfit';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Ti'} {'ti'} {'TC'} {'tc'} {'T_C'} {'t_c'}],'exact'))
-  data_request_eff_noext='Ti';
+if ~isempty(strmatch(data_type_eff_noext,[{'Ti'} {'ti'} {'TC'} {'tc'} {'T_C'} {'t_c'}],'exact'))
+  data_type_eff_noext='Ti';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Tifit'} {'tifit'} {'TCfit'} {'tcfit'} {'T_Cfit'} {'t_cfit'}],'exact'))
-  data_request_eff_noext='Tifit';
+if ~isempty(strmatch(data_type_eff_noext,[{'Tifit'} {'tifit'} {'TCfit'} {'tcfit'} {'T_Cfit'} {'t_cfit'}],'exact'))
+  data_type_eff_noext='Tifit';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Ni'} {'ni'} {'NC'} {'nc'} {'N_C'} {'n_c'}],'exact'))
-  data_request_eff_noext='ni';
+if ~isempty(strmatch(data_type_eff_noext,[{'Ni'} {'ni'} {'NC'} {'nc'} {'N_C'} {'n_c'}],'exact'))
+  data_type_eff_noext='ni';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Nifit'} {'nifit'} {'NCfit'} {'ncfit'} {'N_Cfit'} {'n_cfit'}],'exact'))
-  data_request_eff_noext='nifit';
+if ~isempty(strmatch(data_type_eff_noext,[{'Nifit'} {'nifit'} {'NCfit'} {'ncfit'} {'N_Cfit'} {'n_cfit'}],'exact'))
+  data_type_eff_noext='nifit';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Zeffcxrs'} {'zeffcxrs'} {'Z_effcxrs'} {'z_effcxrs'} {'Zeff_cxrs'} {'zeff_cxrs'} {'Z_eff_cxrs'} {'z_eff_cxrs'}],'exact'))
-  data_request_eff_noext='zeffcxrs';
+if ~isempty(strmatch(data_type_eff_noext,[{'Zeffcxrs'} {'zeffcxrs'} {'Z_effcxrs'} {'z_effcxrs'} {'Zeff_cxrs'} {'zeff_cxrs'} {'Z_eff_cxrs'} {'z_eff_cxrs'}],'exact'))
+  data_type_eff_noext='zeffcxrs';
 end
-if ~isempty(strmatch(data_request_eff_noext,[{'Zeffcxrsfit'} {'zeffcxrsfit'} {'Z_effcxrsfit'} {'z_effcxrsfit'} {'Zeff_cxrsfit'} {'zeff_cxrsfit'} {'Z_eff_cxrsfit'} {'z_eff_cxrsfit'}],'exact'))
-  data_request_eff_noext='zeffcxrsfit';
+if ~isempty(strmatch(data_type_eff_noext,[{'Zeffcxrsfit'} {'zeffcxrsfit'} {'Z_effcxrsfit'} {'z_effcxrsfit'} {'Zeff_cxrsfit'} {'zeff_cxrsfit'} {'Z_eff_cxrsfit'} {'z_eff_cxrsfit'}],'exact'))
+  data_type_eff_noext='zeffcxrsfit';
 end
 
 % some defaults
@@ -434,33 +434,33 @@ trace.dimunits=[];
 trace.units=[];
 iprintwarn=0;
 % find index of signal called upon
-if strcmp(data_request_eff(1:1),'\')
+if strcmp(data_type_eff(1:1),'\')
   % in case full node name was given
-  index=strmatch(data_request_eff(1:end-i_23),TCVsiglocation,'exact');
+  index=strmatch(data_type_eff(1:end-i_23),TCVsiglocation,'exact');
   if iprintwarn & isempty(index)
     disp('********************')
     disp('trace not yet registered.')
     disp('If standard data, ask olivier.sauter@epfl.ch to create a keyqord entry for this data')
-%    eval(['!mail -s ''' data_request_eff ' ' num2str(shot) ' ' getenv('USER') ' TCV'' olivier.sauter@epfl.ch < /dev/null'])
+%    eval(['!mail -s ''' data_type_eff ' ' num2str(shot) ' ' getenv('USER') ' TCV'' olivier.sauter@epfl.ch < /dev/null'])
     disp('********************')
   elseif isempty(index)
     % temporarily add entry in arrays, so can work below
     index=length(TCVkeywrdall)+1;
     TCVkeywrdall(end+1)={'new'};
     TCVkeywrdcase(end+1)={'simpletdi'};
-    TCVsiglocation(end+1)={data_request_eff(1:end-i_23)};
+    TCVsiglocation(end+1)={data_type_eff(1:end-i_23)};
     TCVsigtimeindx(end+1)=0;
   elseif ~strcmp(TCVkeywrdcase{index},'simpletdi')
-    msgbox(['Problem in loadTCVdata with data_request_eff = ' data_request_eff ...
+    msgbox(['Problem in loadTCVdata with data_type_eff = ' data_type_eff ...
           '. Full paths of nodes should only be for case simpletdi'],'in loadTCVdata','error')
     error('in loadTCVdata')
   end
 else
-  index=strmatch(data_request_eff_noext,TCVkeywrdall,'exact');
+  index=strmatch(data_type_eff_noext,TCVkeywrdall,'exact');
   if isempty(index)
     disp(' ')
     disp('********************')
-    disp(['no such keyword: ' data_request_eff(1:end-i_23)])
+    disp(['no such keyword: ' data_type_eff(1:end-i_23)])
     disp(' ')
     disp('Available keywords:')
     TCVkeywrdall(:)
@@ -473,13 +473,13 @@ else
   end
 end
 if iprintwarn
-  disp(['loading' ' ' data_request_eff_noext ' from TCV shot #' num2str(shot)]);
+  disp(['loading' ' ' data_type_eff_noext ' from TCV shot #' num2str(shot)]);
   disp(['case ' TCVkeywrdcase{index}])
 end
 if i_23==2 & isempty(strmatch(TCVsiglocation(index),liuqe23,'exact')) & strcmp(TCVkeywrdcase{index},'simpletdi')
   disp('********')
   disp('Warning asks for liuqe 2 or 3 of a signal, but not in liuqe23 list in loadTCVdata')
-%  eval(['!mail -s ''' data_request_eff ' ' num2str(shot) ' ' getenv('USER') ' TCV: not in liuqe23 list'' olivier.sauter@epfl.ch < /dev/null'])
+%  eval(['!mail -s ''' data_type_eff ' ' num2str(shot) ' ' getenv('USER') ' TCV: not in liuqe23 list'' olivier.sauter@epfl.ch < /dev/null'])
   disp('********')
 end
 
@@ -502,7 +502,7 @@ switch TCVkeywrdcase{index}
     else
       mdsopen(shot);
       % test if node exists
-      error=1;
+      error_status=1;
       ij=findstr(TCVsiglocation{index},'[');
       if isempty(ij); ij=length(TCVsiglocation{index})+1; end
       if eval(['~mdsdata(''node_exists("\' TCVsiglocation{index}(1:ij-1) '")'')'])
@@ -527,7 +527,7 @@ switch TCVkeywrdcase{index}
     end
     tracetdi=tdi(nodenameeff);
     mdsclose;
-    if isempty(tracetdi.data) | isnan(tracetdi.data)
+    if isempty(tracetdi.data) || (~iscell(tracetdi.data) && isnan(tracetdi.data))
       disp(['node ' nodenameeff ' is empty for shot = ' num2str(shot)])
       return
     end
@@ -589,7 +589,7 @@ switch TCVkeywrdcase{index}
         trace.data=trace.data';
       end
     elseif length(tracetdi.dim)>2
-      msgbox(['data more than 2D (data_request_eff=' data_request_eff ...
+      msgbox(['data more than 2D (data_type_eff=' data_type_eff ...
             '), check how to save it, contact andrea.scarabosio@epfl.ch or olivier.sauter@epfl.ch'],...
           'in simpletdi','warn')
       warning('in simpletdi of loadTCVdata')
@@ -614,7 +614,7 @@ switch TCVkeywrdcase{index}
     end
     
     trace.name=[num2str(shot) ';' nodenameeff];
-    error=0;
+    error_status=0;
 
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   case {'ne','te'}
@@ -628,7 +628,6 @@ switch TCVkeywrdcase{index}
       nodenameeff='\results::thomson:te';
       tracetdi=tdi(nodenameeff);
       tracestd=tdi('\results::thomson:te:error_bar');
-      trace_abs=tdi('\results::thomson:fir_thom_rat');
     end
     trace.data=tracetdi.data'; % Thomson data as (t,z)
     trace.std=tracestd.data';
@@ -666,11 +665,11 @@ switch TCVkeywrdcase{index}
       nodenameeff='\results::thomson.edge:ne';
       tracetdi=tdi(nodenameeff);
       tracestd=tdi('\results::thomson.edge:ne:error_bar');
+      % trace_abs=tdi('\results::thomson.edge:fir_thom_rat');
     else
       nodenameeff='\results::thomson.edge:te';
       tracetdi=tdi(nodenameeff);
       tracestd=tdi('\results::thomson.edge:te:error_bar');
-      trace_abs=tdi('\results::thomson.edge:fir_thom_rat');
     end
     trace.data=tracetdi.data'; % Thomson.Edge data as (t,z)
     trace.std=tracestd.data';
@@ -874,9 +873,7 @@ switch TCVkeywrdcase{index}
     else
       zshift=0.;
     end
-%    mdsdisconnect; mdsconnect tcv1;
     mdsopen(shot);
-    keyboard
     try
       time=mdsdata('\results::thomson:times');
     catch
@@ -982,7 +979,7 @@ switch TCVkeywrdcase{index}
   case {'profnerho','profterho'}
     % vol from psitbx
     mdsopen(shot);
-    error=1;
+    error_status=1;
     if strcmp(TCVkeywrdcase{index},'profnerho')
       nodenameeff=['\results::THOMSON.PROFILES.AUTO:ne'];
       avers=tdi('\results::THOMSON.PROFILES.AUTO:ne:version_num');
@@ -1003,9 +1000,9 @@ switch TCVkeywrdcase{index}
         if ~isempty(tracetdi.dim) && ~ischar(tracetdi.data)
           trace.x=tracetdi.dim{1};
           trace.t=tracetdi.dim{2};
-          error=0;
+          error_status=0;
         else
-         error=2;
+         error_status=2;
           trace.x=[];
           trace.t=[];
         end
@@ -1015,11 +1012,11 @@ switch TCVkeywrdcase{index}
           disp('assumes dim{2} for x in THOMSON.PROFILES.AUTO')
           trace.x=tracetdi.dim{2};
           trace.t=tracetdi.dim{1};
-          error=0;
+          error_status=0;
         else
           trace.x=[];
           trace.t=[];
-         error=2;
+         error_status=2;
         end
       end
     else
@@ -1186,7 +1183,7 @@ switch TCVkeywrdcase{index}
     if ~isempty(find(status(1:20*icamera*ones(10,1)) == 1))
       [fans,vangle,xchord,ychord,aomega,angfact]=xtomo_geometry(1,icamera);
       % calculating intersection of the view lines with magnetic axis
-      if strcmp(data_request_eff,'sxR')
+      if strcmp(data_type_eff,'sxR')
         if nargin>=5 & ~isempty(varargin{3})
           zmag=varargin{3};
         else
@@ -1213,7 +1210,7 @@ switch TCVkeywrdcase{index}
     trace.dim=[{trace.x} ; {trace.t}];
     trace.dimunits=[{'channel #'} ; {'time [s]'}];
     trace.name=[num2str(shot) ';' 'get_xtomo_data'];
-    error=0;
+    error_status=0;
 
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   case 'ece'
@@ -1244,7 +1241,7 @@ switch TCVkeywrdcase{index}
     radius.data=trace.R;
     radius.t=trace.t;
     varargout{1}={radius};
-    error=0;
+    error_status=0;
     % isfield does not work since tracetdi is not a 'struct' but a tdi object, thus isfield using isa does not work
     if any(strcmp(fieldnames(tracetdi),'units'))
       trace.units=tracetdi.units;
@@ -1275,7 +1272,7 @@ switch TCVkeywrdcase{index}
     trace.name=[num2str(shot) ';' 'get_mds_mio(MPX)'];
     [xchord,ychord]=mpx_geometry;
     varargout{1}={VsxrTCVradius(zmag.data,xchord,ychord)};
-    error=0;
+    error_status=0;
 
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   case 'IOH'
@@ -1294,7 +1291,7 @@ switch TCVkeywrdcase{index}
     end
     trace.name=[num2str(shot) ';' nodenameeff{1} ',' nodenameeff{2}];
     mdsclose;
-    error=0;
+    error_status=0;
     
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   case 'vloop'
@@ -1313,7 +1310,7 @@ switch TCVkeywrdcase{index}
     end
     trace.name=[num2str(shot) ';' nodenameeff{1} ',' nodenameeff{2}];
     mdsclose;
-    error=0;
+    error_status=0;
     
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   case 'pgyro'
@@ -1332,7 +1329,7 @@ switch TCVkeywrdcase{index}
     end
     trace.name=[num2str(shot) ';' nodenameeff];
     mdsclose;
-    error=0;
+    error_status=0;
     
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   case 'jtor'
@@ -1351,7 +1348,7 @@ switch TCVkeywrdcase{index}
     end
     trace.name=[num2str(shot) ';' nodenameeff];
     mdsclose;
-    error=0;
+    error_status=0;
     
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   case {'neft:trial','teft:trial','neftav:trial','teftav:trial'}
@@ -1373,7 +1370,7 @@ switch TCVkeywrdcase{index}
     end
     trace.name=[num2str(shot) ' ; ' nodenameeff{:} ' ; trialindx=' num2str(trialindx) ];
     mdsclose;
-    error=0;
+    error_status=0;
     
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  case {'vi_tor', 'vi_torfit', 'vi_pol', 'vi_polfit', 'Ti', 'Tifit', 'ni', 'nifit', 'zeffcxrs', 'zeffcxrsfit'}
@@ -1416,11 +1413,11 @@ switch TCVkeywrdcase{index}
       trace.std_t = [];
     end
     mdsclose;
-    error=0;
+    error_status=0;
     
   %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   otherwise
-    % eval(['!mailto_Andrea ''from loadTCVdata, data_request_eff= ' data_request_eff ''''])
-    disp(['this data_request_eff' ' ' data_request_eff ' ' 'not yet programmed in loadTCVdata, ask Andrea.Scarabosio@epfl.ch']);
+    % eval(['!mailto_Andrea ''from loadTCVdata, data_type_eff= ' data_type_eff ''''])
+    disp(['this data_type_eff' ' ' data_type_eff ' ' 'not yet programmed in loadTCVdata, ask Andrea.Scarabosio@epfl.ch']);
 
 end
diff --git a/crpptbx_new/TCV/tcv_requests_mapping.m b/crpptbx_new/TCV/tcv_requests_mapping.m
new file mode 100644
index 00000000..f2e3c7e1
--- /dev/null
+++ b/crpptbx_new/TCV/tcv_requests_mapping.m
@@ -0,0 +1,169 @@
+function mapping = tcv_requests_mapping(data_request)
+
+% Defaults
+mapping = struct(...
+    'label', '', ...
+    'method', '', ...
+    'expression','', ...
+    'timedim', -1, ...     % dim which is the time, to copy in .t, the other dims are in .x (-1 means last dimension)
+    'new_timedim',0, ...  % if need to reshape data and dim orders to have timedim as new_timedim (shifting time to new_timedim)
+    'min', -inf, ...
+    'max', inf);
+
+if ~exist('data_request') || isempty(data_request)
+  return
+end
+
+% default label: data_request keyword itself
+mapping.label = data_request;
+
+% for TCV, following choices are set so far:
+% method = 'tdi' and then expression is the string within tdi (usual case when there is a direct link to an existing signal)
+%                with tdi, if expression cell array, call tdi(cell{1},cell{2},...)
+% method = 'function', then expression is the funtion to call which should return the correct structure
+% method = 'switchcase', then there will be a specific case within gdat_tcv (usual case when not directly a signal)
+%
+% label is used for plotting
+switch lower(data_request)
+ case 'b0'
+  mapping.label = 'B_0';
+  mapping.method = 'switchcase';
+  mapping.expression = '';
+ case 'betan'
+  mapping.label = '\beta_N';
+  mapping.method = 'switchcase';
+  mapping.expression = '';
+ case 'betap'
+  mapping.label = '\beta_p';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::beta_pol';
+ case 'cxrs'
+  mapping.label = 'cxrs';
+  mapping.method = 'switchcase';
+  mapping.expression = '';
+ case 'delta'
+  mapping.method = 'tdi';
+  mapping.expression = '\results::delta_edge';
+  mapping.method = 'function';
+  mapping.expression = ['tdi(''\results::q_psi'');'];
+ case 'delta_top'
+  mapping.label = 'delta\_top';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::delta_ed_top';
+ case 'delta_bottom'
+  mapping.label = 'delta\_bottom';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::delta_ed_bot';
+ case 'ece'
+  mapping.method = 'switchcase';
+  mapping.expression = '';
+ case 'eqdsk'
+  mapping.method = 'switchcase'; % could use function make_eqdsk directly?
+  mapping.expression = '';
+ case 'halpha'
+  mapping.label = 'Halpha';
+  mapping.method = 'tdi';
+  mapping.expression = '\base::pd:pd_011';
+ case 'ioh'
+  mapping.label = 'I ohmic transformer';
+  mapping.method = 'tdi';
+  mapping.expression = [{'\magnetics::ipol[*,$1]'} {'OH_001'}];
+ case 'ip'
+  mapping.label = 'Plasma current';
+  mapping.method = 'tdi';
+  mapping.expression = '\magnetics::iplasma:trapeze';
+ case 'kappa'
+  mapping.method = 'tdi';
+  mapping.expression = '\results::kappa_edge';
+ case 'mhd'
+  mapping.label = 'n=1,2, etc';
+  mapping.method = 'switchcase';
+  mapping.expression = '';
+ case 'ne'
+  mapping.method = 'switchcase';
+ case 'neint'
+  mapping.label = 'line integrated el. density';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::fir:lin_int_dens';
+ case 'nel'
+  mapping.label = 'line-averaged el. density';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::fir:n_average';
+ case 'nerho'
+  mapping.label = 'ne';
+  mapping.method = 'switchcase';
+ case 'neterho'
+  mapping.label = 'ne and Te';
+  mapping.method = 'switchcase';
+ case 'ni'
+  mapping.method = 'switchcase'; % especially since might have option fit, etc
+ case 'powers'
+  mapping.label = 'various powers';
+  mapping.method = 'switchcase';
+ case 'q0'
+  mapping.method = 'tdi';
+  mapping.expression = '\results::q_zero';
+ case 'q95'
+  mapping.method = 'tdi';
+  mapping.expression = '\results::q_95';
+ case 'qedge'
+  mapping.method = 'tdi';
+  mapping.expression = '\results::q_edge';
+ case 'qrho'
+  mapping.label = 'q';
+  mapping.method = 'switchcase';
+ case 'rgeom'
+  mapping.label = 'Rgeom';
+  mapping.method = 'switchcase';
+ case 'rhovol'
+  mapping.label = 'rhovol\_norm';
+  mapping.method = 'switchcase'; % from conf if exist otherwise computes it
+ case 'rmag'
+  mapping.label = 'R\_magaxis';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::r_axis';
+ case 'sxr'
+  mapping.method = 'switchcase';
+ case 'te'
+  mapping.label = 'Te';
+  mapping.method = 'switchcase';
+ case 'terho'
+  mapping.label = 'Te';
+  mapping.method = 'switchcase';
+ case 'ti'
+  mapping.label = 'Ti';
+  mapping.method = 'switchcase';
+ case 'transp'
+  mapping.label = 'transp output';
+  mapping.method = 'switchcase';
+ case 'vloop'
+  mapping.label = '';
+  mapping.method = 'tdi';
+  mapping.expression = '';
+ case 'vol'
+  mapping.label = 'Volume';
+  mapping.method = 'switchcase';
+  % mapping.expression = '\results::psitbx:vol'; (if exists for liuqe2 and 3 as well)
+ case 'zeff'
+  mapping.label = 'zeff from Ip-Ibs';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::ibs:z_eff';
+ case 'zgeom'
+  mapping.label = 'Zgeom';
+  mapping.method = 'switchcase';
+ case 'zmag'
+  mapping.label = 'Zmagaxis';
+  mapping.method = 'tdi';
+  mapping.expression = '\results::z_axis';
+% $$$  case ''
+% $$$   mapping.label = '';
+% $$$   mapping.method = 'tdi';
+% $$$   mapping.expression = '';
+ otherwise
+  mapping.label = data_request;
+  mapping.method = 'tdi'; % assume a full tracename is given, so just try with tdi (could check there are some ":", etc...)
+  mapping.expression = data_request;
+  
+end
+
+
diff --git a/crpptbx_new/gdat.m b/crpptbx_new/gdat.m
index 60ff6b67..5ec4e363 100644
--- a/crpptbx_new/gdat.m
+++ b/crpptbx_new/gdat.m
@@ -1,6 +1,6 @@
-function [gdat_data,gdat_params,varargout] = gdat(shot,data_request,varargin)
+function [gdat_data,gdat_params,error_status,varargout] = gdat(shot,data_request,varargin)
 %
-% function [gdat_data,gdat_params,varargout] = gdat(shot,data_request,varargin)
+% function [gdat_data,gdat_params,error_status,varargout] = gdat(shot,data_request,varargin)
 %
 % Aim: get data from a given machine using full path or keywords. 
 %      Keywords should be the same for different machines, otherwise add "_machinname" to the keyword if specific
@@ -32,7 +32,7 @@ function [gdat_data,gdat_params,varargout] = gdat(shot,data_request,varargin)
 % gdat_data.gdat_call : list of parameters provided in the gdat call (so can be reproduced)
 % gdat_data.shot: shot number
 % gdat_data.machine: machine providing the data
-% gdat_data.gdat_keyword: keyword for gdat if relevant
+% gdat_data.gdat_request: keyword for gdat if relevant
 % gdat_data.data_fullpath: full path to the data node if known and relevant, or expression, or relevant function called if relevant
 % gdat_data.gdat_params: copy gdat_params for completeness
 % gdat_data.xxx: any other relevant information
@@ -46,18 +46,25 @@ function [gdat_data,gdat_params,varargout] = gdat(shot,data_request,varargin)
 %    a3=gdat(48836,a2);  % gives input parameters as a structure, allows to call the same for many shots
 %    a4=gdat('opt1',123,'opt2',[1 2 3],'shot',48832,'data_request','Ip','opt3','aAdB'); % all in pairs
 %    a5=gdat(48836,'ip'); % standard call
-%    a6=gdat(48836,'ip','Opt1',123,'Doplot',1,'opt2','Abc'); % standard call with a few options (note all lowercase in output)
+%    a6=gdat(48836,'ip','Opt1',123,'Doplot',1,'opt2','Abc'); % standard call with a few options (all lowercase in output)
+
+
+%
+% Comments for local developer:
+% This gdat is just a "header routine" calling the gdat for the specific machine gdat_`machine`.m which can be called
+% directly, thus which should be able to treat the same type of input arguments
+%
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % Prepare some variables, etc
 
 % for backward compatibility (with most recent simple call ala: gdat(shot,'data_request',doplot,machine) )
 % if nargin<=4 and >2 and 1st and 3rd are numeric, assume this is an old call and transform it to:
-% gdat(shot,'data_request','doplot',doplot','machine',machine) by adding at end of varargin, so will be taken
+% gdat(shot,'data_request','doplot',doplot','machine',machine)
 % and a warning
-varargin_eff = varargin;
 if nargin>2
-  if nargin>=3 && nargin<=4  && isnumeric(shot) && isnumeric(varagin{1})
+  varargin_eff = varargin;
+  if nargin>=3 && nargin<=4  && isnumeric(shot) && isnumeric(varargin{1})
     % assume old call: gdat(shot,'data_request',doplot[,machine])
     varargin_eff{1} = 'doplot';
     varargin_eff{end+1} = varargin{1};
@@ -68,9 +75,6 @@ if nargin>2
   end
 end
 
-% add paths to each machine which are in subdirectory of gdat and working
-gdatpaths
-
 % construct default parameters structure
 gdat_params.data_request = '';
 fusion_machine_defaultname=getenv('FUSION_MACHINE_DEFAULTNAME');
@@ -85,24 +89,36 @@ else
     default_machine = 'aug';
   end
 end
+machine_eff = default_machine;
+
+% do not treat inputs here but in subsequent gdat_machine.m function, however, need to extract machine name if provided:
+if nargin>=2 % need at least 2 inputs to have 'machine','aug' as arguments (to ask specific list of requests)
+  % in case start directly with pairs of options
+  if ischar(shot) && ischar(data_request)
+    machine_eff = data_request;
+  elseif isstruct(shot) && isfield(shot,'machine')
+    machine_eff = shot.machine;
+  elseif isstruct(data_request) && isfield(data_request,'machine')
+    machine_eff = data_request.machine;
+  else
+    imachine=[];
+    for i=1:length(varargin_eff)
+      if ischar(varargin_eff{i})
+        ii = strmatch(varargin_eff{i},'machine','exact');
+        if ~isempty(ii); imachine = i; end
+      end
+    end
+    if ~isempty(imachine) && length(varargin_eff)>=imachine+1 && ~isempty(varargin_eff{imachine+1})
+      machine_eff = varargin_eff{imachine+1};
+    end
+  end
+end
 
-gdat_params.machine=default_machine;
-gdat_params.doplot = 0;
-
-% construct list of keywords
-gdat_keywords= [{'kwd1'}, {'kwd2'}];
+% add paths to each machine which are in subdirectory of gdat and working
+% add only given machine directory using machine_eff...
+gdat_path = mfilename('fullpath');
+eval(['addpath ' gdat_path(1:end-4) upper(machine_eff)]);
 
-% construct default output structure
-gdat_data.t = [];
-gdat_data.data = [];
-gdat_data.dim = [];
-gdat_data.dimunits = [];
-gdat_data.error_bar = [];
-gdat_data.shot = [];
-gdat_data.machine = [];
-gdat_data.gdat_keyword = [];
-gdat_data.gdat_params = gdat_params;
-gdat_data.data_fullpath = [];
 % copy gdat present call:
 if nargin==0
   subcall=['gdat;'];
@@ -131,174 +147,35 @@ elseif nargin>=1
   % ... to continue
   subcall = [subcall ');'];
 end
-gdat_data.gdat_call = subcall;
-
-% Treat inputs:
-ivarargin_first_char = 3;
-data_request_eff = '';
-if nargin>=2 && ischar(data_request); data_request = lower(data_request); end
-
-% no inputs
-if nargin==0
-  % return defaults and list of keywords
-  gdat_data.gdat_keyword = gdat_keywords;
-
-  % add window with scrollable list of keywords (and probably small GUI to add shot number and choose data_request)
-  return
-end
-
-% treat 1st arg
-if nargin>=1
-  if isempty(shot)
-    % same as no inputs (later might mean asks for defaults of given data_request)
-    gdat_data.gdat_keyword = gdat_keywords;
-    return
-  end
-  if isnumeric(shot)
-    gdat_data.shot = shot;
-  elseif ischar(shot)
-    ivarargin_first_char = 1;
-  else
-    warning('type of 1st argument unexpected, should be numeric or char')
-    return
-  end
-  if nargin==1
-    % Only shot number given. If there is a default data_request set it and continue, otherwise return
-    gdat_data.gdat_keyword = gdat_keywords;
-    return
-  end
-end
-% 2nd input argument if not part of pairs
-if nargin>=2 && ivarargin_first_char~=1
-  if isempty(data_request)
-    gdat_data.gdat_keyword = gdat_keywords;
-    return
-  end
-  % 2nd arg can be a structure with all options except shot_number, or a string for the pathname or keyword, or the start of pairs string/value for the parameters
-  if isstruct(data_request)
-    if ~isfield(data_request,'data_request')
-      warning('expects field data_request in input parameters structure')
-      return
-    end
-    data_request.data_request = lower(data_request.data_request);
-    data_request_eff = data_request.data_request;
-    gdat_params = data_request;
-  else
-    % since data_request is char check from nb of args if it is data_request or a start of pairs
-    if mod(nargin-1,2)==0
-      ivarargin_first_char = 2;
-    else
-      ivarargin_first_char = 3;
-      data_request_eff = data_request;
-    end
-  end
-end
-
-if ~isstruct(data_request); gdat_params.data_request = data_request_eff; end
 
-% if start pairs from shot or data_request, shift varargin
-if ivarargin_first_char==1
-  varargin_eff{1} = shot;
-  varargin_eff{2} = data_request;
-  varargin_eff(3:nargin) = varargin(:);
-elseif ivarargin_first_char==2
-  varargin_eff{1} = data_request;
-  varargin_eff(2:nargin-1) = varargin(:);
-else
-  varargin_eff(1:nargin-2) = varargin(:);
-end
-
-% extract parameters from pairs of varargin:
-if (nargin>=ivarargin_first_char)
-  if mod(nargin-ivarargin_first_char+1,2)==0
-    for i=1:2:nargin-ivarargin_first_char+1
-      if ischar(varargin_eff{i})
-        % enforce lower case for any character driven input
-        if ischar(varargin_eff{i+1})
-          gdat_params.(lower(varargin_eff{i})) = lower(varargin_eff{i+1});
-        else
-          gdat_params.(lower(varargin_eff{i})) = varargin_eff{i+1};
-        end
-      else
-        warning(['input argument nb: ' num2str(i) ' is incorrect, expects a character string'])
-        return
-      end
-    end
+% Note: would need to check nargout to make call consistent, but to avoid this, each gdat_xxx should return at least an empty varargout: varargout{1}=cell(1);
+try
+  if nargin==0
+    eval(['[gdat_data,gdat_params,error_status,varargout] = gdat_' lower(machine_eff) ';']);
+  elseif nargin==1
+    eval(['[gdat_data,gdat_params,error_status,varargout] = gdat_' lower(machine_eff) '(shot);']);
+  elseif nargin==2  
+    eval(['[gdat_data,gdat_params,error_status,varargout] = gdat_' lower(machine_eff) '(shot,data_request);']);
   else
-    warning('number of input arguments incorrect, cannot make pairs of parameters')
-    return
+    eval(['[gdat_data,gdat_params,error_status,varargout] = gdat_' lower(machine_eff) '(shot,data_request,varargin_eff{:});']);
   end
-end
-data_request_eff = gdat_params.data_request; % in case was defined in pairs
-
-% special treatment if shot and data_request given within pairs
-if isfield(gdat_params,'shot')
-  shot = gdat_params.shot; % should use only gdat_params.shot but change shot to make sure
-  gdat_data.shot = gdat_params.shot;
-  gdat_params=rmfield(gdat_params,'shot');
-end
-if ~isfield(gdat_params,'data_request') || isempty(gdat_params.data_request)
-  warning('input for ''data_request'' missing from input arguments')
+catch
+  warning(['problems calling gdat_' lower(machine_eff)]);
   return
 end
 
-gdat_data.gdat_params = gdat_params;
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-function 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
+% copy subcall here so is last subnode
+gdat_data.gdat_call = [subcall ' % nargout = ' num2str(nargout)];
 
-if nargin==0
-  subcall_string = '';
-  return
+if ~isfield(gdat_data.gdat_params,'doplot')
+  gdat_data.gdat_params.doplot = 0;
 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 ''''];
+if gdat_data.gdat_params.doplot
+  % plot gdat_data versus 1st dim by default, if nb_dims<=2, otherwise do not plot
+  if length(varargout)==0 || isempty(varargout{1})
+    varargout{1} = gdat_plot(gdat_data); % return handle to figure
+  else
+    varargout{end+1} = gdat_plot(gdat_data); % return handle to figure
   end
 end
-
-subcall_string = subcall;
diff --git a/crpptbx_new/gdat2.m b/crpptbx_new/gdat2.m
deleted file mode 100644
index 799af109..00000000
--- a/crpptbx_new/gdat2.m
+++ /dev/null
@@ -1,274 +0,0 @@
-function [gdat_data,gdat_params,varargout] = gdat2(shot,data_request,varargin)
-%
-% function [gdat_data,gdat_params,varargout] = gdat(shot,data_request,varargin)
-%
-% Aim: get data from a given machine using full path or keywords. 
-%      Keywords should be the same for different machines, otherwise add "_machinname" to the keyword if specific
-%      Keywords are and should be case independent (transformed in lower case in the function and outputs)
-%
-% If no inputs are provided, return the list of available keywords in gdat_data and default parameters gdat_params
-%
-% Inputs:
-%
-%    no inputs: return default parameters in a structure form in gdat_params
-%    shot: shot number
-%    data_request: keyword (like 'ip') or trace name or structure containing all parameters but shot number
-%    varargin{i},varargin{i+1},i=1:nargin-2: additional optional parameters given in pairs: param_name, param_value
-%                                            The optional parameters list might depend on the data_request
-%              examples of optional parameters:
-%                               'plot',1 (plot is set by default to 0)
-%                               'machine','TCV' (the default machine is the local machine)
-%
-%
-% Outputs:
-%
-% gdat_data: structure containing the data, the time trace if known and other useful information
-% gdat_data.t : time trace
-% gdat_data.data: requested data values
-% gdat_data.dim : values of the various coordinates related to the dimensions of .data(:,:,...)
-%                     note that one of the dim is the time, replicated in .t for clarity
-% gdat_data.dimunits : units of the various dimensions, 'dimensionless' if dimensionless
-% gdat_data.error_bar : if provided
-% gdat_data.gdat_call : list of parameters provided in the gdat call (so can be reproduced)
-% gdat_data.shot: shot number
-% gdat_data.machine: machine providing the data
-% gdat_data.gdat_keyword: keyword for gdat if relevant
-% gdat_data.data_fullpath: full path to the data node if known and relevant, or expression, or relevant function called if relevant
-% gdat_data.gdat_params: copy gdat_params for completeness
-% gdat_data.xxx: any other relevant information
-%
-%
-% Examples:
-% (should add working examples for various machines (provides working shot numbers for each machine...))
-% 
-%    [a1,a2]=gdat;
-%    a2.data_request = 'Ip';
-%    a3=gdat(48836,a2);  % gives input parameters as a structure, allows to call the same for many shots
-%    a4=gdat('opt1',123,'opt2',[1 2 3],'shot',48832,'data_request','Ip','opt3','aAdB'); % all in pairs
-%    a5=gdat(48836,'ip'); % standard call
-%    a6=gdat(48836,'ip','Opt1',123,'Doplot',1,'opt2','Abc'); % standard call with a few options (note all lowercase in output)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Prepare some variables, etc
-
-% add paths to each machine which are in subdirectory of gdat and working
-gdatpaths
-
-% construct default parameters structure
-gdat_params.data_request = '';
-gdat_params.machine=lower('TCV'); % to insert default machine
-gdat_params.doplot = 0;
-
-% construct list of keywords
-gdat_keywords= [{'kwd1'}, {'kwd2'}];
-
-% construct default output structure
-gdat_data.t = [];
-gdat_data.data = [];
-gdat_data.dim = [];
-gdat_data.dimunits = [];
-gdat_data.error_bar = [];
-gdat_data.shot = [];
-gdat_data.machine = [];
-gdat_data.gdat_keyword = [];
-gdat_data.gdat_params = gdat_params;
-gdat_data.data_fullpath = [];
-% copy gdat present call:
-if nargin==0
-  subcall=['gdat;'];
-elseif nargin>=1
-  if isnumeric(shot)
-    subcall=['gdat(' num2str(shot) ];
-  elseif ischar(shot)
-    subcall=['gdat(' shot ];
-  else
-    warning('type of 1st argument unexpected, should be numeric or char')
-    gdat_data.gdat_call = [];
-    return
-  end
-  if nargin>=2
-    if isempty(data_request)
-      subcall = [subcall ',[]'];
-    else
-      substring = subcall_all2str(data_request);
-      subcall = [subcall substring];
-    end
-    if nargin>=3
-      substring = subcall_all2str(varargin{:});
-      subcall = [subcall substring];
-    end
-  end
-  % ... to continue
-  subcall = [subcall ');'];
-end
-gdat_data.gdat_call = subcall;
-
-% Treat inputs:
-ivarargin_first_char = 3;
-data_request_eff = '';
-if nargin>=2 && ischar(data_request); data_request = lower(data_request); end
-
-% no inputs
-if nargin==0
-  % return defaults and list of keywords
-  gdat_data.gdat_keyword = gdat_keywords;
-
-  % add window with scrollable list of keywords (and probably small GUI to add shot number and choose data_request)
-  return
-end
-
-% treat 1st arg
-if nargin>=1
-  if isempty(shot)
-    % same as no inputs (later might mean asks for defaults of given data_request)
-    gdat_data.gdat_keyword = gdat_keywords;
-    return
-  end
-  if isnumeric(shot)
-    gdat_data.shot = shot;
-  elseif ischar(shot)
-    ivarargin_first_char = 1;
-  else
-    warning('type of 1st argument unexpected, should be numeric or char')
-    return
-  end
-  if nargin==1
-    % Only shot number given. If there is a default data_request set it and continue, otherwise return
-    gdat_data.gdat_keyword = gdat_keywords;
-    return
-  end
-end
-% 2nd input argument if not part of pairs
-if nargin>=2 && ivarargin_first_char~=1
-  if isempty(data_request)
-    gdat_data.gdat_keyword = gdat_keywords;
-    return
-  end
-  % 2nd arg can be a structure with all options except shot_number, or a string for the pathname or keyword, or the start of pairs string/value for the parameters
-  if isstruct(data_request)
-    if ~isfield(data_request,'data_request')
-      warning('expects field data_request in input parameters structure')
-      return
-    end
-    data_request.data_request = lower(data_request.data_request);
-    data_request_eff = data_request.data_request;
-    gdat_params = data_request;
-  else
-    % since data_request is char check from nb of args if it is data_request or a start of pairs
-    if mod(nargin-1,2)==0
-      ivarargin_first_char = 2;
-    else
-      ivarargin_first_char = 3;
-      data_request_eff = data_request;
-    end
-  end
-end
-
-if ~isstruct(data_request); gdat_params.data_request = data_request_eff; end
-
-% if start pairs from shot or data_request, shift varargin
-if ivarargin_first_char==1
-  varargin_eff{1} = shot;
-  varargin_eff{2} = data_request;
-  varargin_eff(3:nargin) = varargin(:);
-elseif ivarargin_first_char==2
-  varargin_eff{1} = data_request;
-  varargin_eff(2:nargin-1) = varargin(:);
-else
-  varargin_eff(1:nargin-2) = varargin(:);
-end
-
-% extract parameters from pairs of varargin:
-if (nargin>=ivarargin_first_char)
-  if mod(nargin-ivarargin_first_char+1,2)==0
-    for i=1:2:nargin-ivarargin_first_char+1
-      if ischar(varargin_eff{i})
-        % enforce lower case for any character driven input
-        if ischar(varargin_eff{i+1})
-          gdat_params.(lower(varargin_eff{i})) = lower(varargin_eff{i+1});
-        else
-          gdat_params.(lower(varargin_eff{i})) = varargin_eff{i+1};
-        end
-      else
-        warning(['input argument nb: ' num2str(i) ' is incorrect, expects a character string'])
-        return
-      end
-    end
-  else
-    warning('number of input arguments incorrect, cannot make pairs of parameters')
-    return
-  end
-end
-data_request_eff = gdat_params.data_request; % in case was defined in pairs
-
-% special treatment if shot and data_request given within pairs
-if isfield(gdat_params,'shot')
-  shot = gdat_params.shot; % should use only gdat_params.shot but change shot to make sure
-  gdat_data.shot = gdat_params.shot;
-  gdat_params=rmfield(gdat_params,'shot');
-end
-if ~isfield(gdat_params,'data_request') || isempty(gdat_params.data_request)
-  warning('input for ''data_request'' missing from input arguments')
-  return
-end
-
-gdat_data.gdat_params = gdat_params;
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-function 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(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;
diff --git a/crpptbx_new/gdat_data_request_names.xlsx b/crpptbx_new/gdat_data_request_names.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..419bf48dcfa4eec850ba8aefc48338caf2044112
GIT binary patch
literal 11749
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
F{U6z0j+g)d

literal 0
HcmV?d00001

diff --git a/crpptbx_new/gdat_plot.m b/crpptbx_new/gdat_plot.m
new file mode 100644
index 00000000..67e315b1
--- /dev/null
+++ b/crpptbx_new/gdat_plot.m
@@ -0,0 +1,12 @@
+function [fighandle]=gdat_plot(gdat_data);
+%
+%
+
+fighandle = figure;
+if prod(isfield(gdat_data,{'data','t'})) && ~isempty(gdat_data.data) && ~isempty(gdat_data.t)
+  plot(gdat_data.t,gdat_data.data);
+  title([gdat_data.gdat_params.machine ' #' num2str(gdat_data.shot)]);
+  ylabel(gdat_data.label);
+else
+  disp('cannot plot gdat_data, has empty data or t field')
+end
diff --git a/crpptbx_new/gdat_prev.m b/crpptbx_new/gdat_prev.m
deleted file mode 100644
index edafb8d1..00000000
--- a/crpptbx_new/gdat_prev.m
+++ /dev/null
@@ -1,279 +0,0 @@
-function [gdat_data,gdat_params,varargout] = gdat(shot,data_request,varargin)
-%
-% function [gdat_data,gdat_params,varargout] = gdat(shot,data_request,varargin)
-%
-% Aim: get data from a given machine using full path or keywords. 
-%      Keywords should be the same for different machines, otherwise add "_machinname" to the keyword if specific
-%      Keywords are and should be case independent (transformed in lower case in the function and outputs)
-%
-% If no inputs are provided, return the list of available keywords in gdat_data and default parameters gdat_params
-%
-% Inputs:
-%
-%    no inputs: return default parameters in a structure form in gdat_params
-%    shot: shot number
-%    data_request: keyword (like 'ip') or trace name or structure containing all parameters but shot number
-%    varargin{i},varargin{i+1},i=1:nargin-2: additional optional parameters given in pairs: param_name, param_value
-%                                            The optional parameters list might depend on the data_request
-%              examples of optional parameters:
-%                               'plot',1 (plot is set by default to 0)
-%                               'machine','TCV' (the default machine is the local machine)
-%
-%
-% Outputs:
-%
-% gdat_data: structure containing the data, the time trace if known and other useful information
-% gdat_data.t : time trace
-% gdat_data.data: requested data values
-% gdat_data.dim : values of the various coordinates related to the dimensions of .data(:,:,...)
-%                     note that one of the dim is the time, replicated in .t for clarity
-% gdat_data.dimunits : units of the various dimensions, 'dimensionless' if dimensionless
-% gdat_data.error_bar : if provided
-% gdat_data.gdat_call : list of parameters provided in the gdat call (so can be reproduced)
-% gdat_data.shot: shot number
-% gdat_data.machine: machine providing the data
-% gdat_data.gdat_keyword: keyword for gdat if relevant
-% gdat_data.data_fullpath: full path to the data node if known and relevant, or expression, or relevant function called if relevant
-% gdat_data.gdat_params: copy gdat_params for completeness
-% gdat_data.xxx: any other relevant information
-%
-%
-% Examples:
-% (should add working examples for various machines (provides working shot numbers for each machine...))
-% 
-%    [a1,a2]=gdat;
-%    a2.data_request = 'Ip';
-%    a3=gdat(48836,a2);  % gives input parameters as a structure, allows to call the same for many shots
-%    a4=gdat('opt1',123,'opt2',[1 2 3],'shot',48832,'data_request','Ip','opt3','aAdB'); % all in pairs
-%    a5=gdat(48836,'ip'); % standard call
-%    a6=gdat(48836,'ip','Opt1',123,'Doplot',1,'opt2','Abc'); % standard call with a few options (note all lowercase in output)
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Prepare some variables, etc
-
-% add paths to each machine which are in subdirectory of gdat and working
-gdatpaths
-
-% construct default parameters structure
-gdat_params.data_request = '';
-gdat_params.machine=lower('TCV'); % to insert default machine
-gdat_params.doplot = 0;
-
-% construct list of keywords
-gdat_keywords= [{'kwd1'}, {'kwd2'}];
-
-% construct default output structure
-gdat_data.t = [];
-gdat_data.data = [];
-gdat_data.dim = [];
-gdat_data.dimunits = [];
-gdat_data.error_bar = [];
-gdat_data.shot = [];
-gdat_data.machine = [];
-gdat_data.gdat_keyword = [];
-gdat_data.gdat_params = gdat_params;
-gdat_data.data_fullpath = [];
-% copy gdat present call:
-if nargin==0
-  subcall=['gdat;'];
-elseif nargin>=1
-  if isnumeric(shot)
-    subcall=['gdat(' num2str(shot) ];
-  elseif ischar(shot)
-    subcall=['gdat(' shot ];
-  else
-    warning('type of 1st argument unexpected, should be numeric or char')
-    gdat_data.gdat_call = [];
-    return
-  end
-  if nargin>=2
-    if isempty(data_request)
-      subcall = [subcall ',[]'];
-    else
-      substring = subcall_all2str(data_request);
-      subcall = [subcall ',' substring];
-      
-    end
-    if nargin>=3
-      for i=1:nargin-2
-        if ischar(varargin{i})
-          subcall = [subcall ',''' varargin{i} ''''];
-        elseif isnumeric(varargin{i})
-          aa_values = varargin{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(aa_values) ']'];
-          else
-            subcall = [subcall ',' num2str(aa_values) ''];
-          end
-        else
-          % treat extra cases
-        end
-      end
-    end
-  end
-  % ... to continue
-  subcall = [subcall ');'];
-end
-gdat_data.gdat_call = subcall;
-
-% Treat inputs:
-ivarargin_first_char = 3;
-data_request_eff = '';
-if nargin>=2 && ischar(data_request); data_request = lower(data_request); end
-
-% no inputs
-if nargin==0
-  % return defaults and list of keywords
-  gdat_data.gdat_keyword = gdat_keywords;
-
-  % add window with scrollable list of keywords (and probably small GUI to add shot number and choose data_request)
-  return
-end
-
-% treat 1st arg
-if nargin>=1
-  if isempty(shot)
-    % same as no inputs (later might mean asks for defaults of given data_request)
-    gdat_data.gdat_keyword = gdat_keywords;
-    return
-  end
-  if isnumeric(shot)
-    gdat_data.shot = shot;
-  elseif ischar(shot)
-    ivarargin_first_char = 1;
-  else
-    warning('type of 1st argument unexpected, should be numeric or char')
-    return
-  end
-  if nargin==1
-    % Only shot number given. If there is a default data_request set it and continue, otherwise return
-    gdat_data.gdat_keyword = gdat_keywords;
-    return
-  end
-end
-% 2nd input argument if not part of pairs
-if nargin>=2 && ivarargin_first_char~=1
-  if isempty(data_request)
-    gdat_data.gdat_keyword = gdat_keywords;
-    return
-  end
-  % 2nd arg can be a structure with all options except shot_number, or a string for the pathname or keyword, or the start of pairs string/value for the parameters
-  if isstruct(data_request)
-    if ~isfield(data_request,'data_request')
-      warning('expects field data_request in input parameters structure')
-      return
-    end
-    data_request.data_request = lower(data_request.data_request);
-    data_request_eff = data_request.data_request;
-    gdat_params = data_request;
-  else
-    % since data_request is char check from nb of args if it is data_request or a start of pairs
-    if mod(nargin-1,2)==0
-      ivarargin_first_char = 2;
-    else
-      ivarargin_first_char = 3;
-      data_request_eff = data_request;
-    end
-  end
-end
-
-if ~isstruct(data_request); gdat_params.data_request = data_request_eff; end
-
-% if start pairs from shot or data_request, shift varargin
-if ivarargin_first_char==1
-  varargin_eff{1} = shot;
-  varargin_eff{2} = data_request;
-  varargin_eff(3:nargin) = varargin(:);
-elseif ivarargin_first_char==2
-  varargin_eff{1} = data_request;
-  varargin_eff(2:nargin-1) = varargin(:);
-else
-  varargin_eff(1:nargin-2) = varargin(:);
-end
-
-% extract parameters from pairs of varargin:
-if (nargin>=ivarargin_first_char)
-  if mod(nargin-ivarargin_first_char+1,2)==0
-    for i=1:2:nargin-ivarargin_first_char+1
-      if ischar(varargin_eff{i})
-        % enforce lower case for any character driven input
-        if ischar(varargin_eff{i+1})
-          gdat_params.(lower(varargin_eff{i})) = lower(varargin_eff{i+1});
-        else
-          gdat_params.(lower(varargin_eff{i})) = varargin_eff{i+1};
-        end
-      else
-        warning(['input argument nb: ' num2str(i) ' is incorrect, expects a character string'])
-        return
-      end
-    end
-  else
-    warning('number of input arguments incorrect, cannot make pairs of parameters')
-    return
-  end
-end
-data_request_eff = gdat_params.data_request; % in case was defined in pairs
-
-% special treatment if shot and data_request given within pairs
-if isfield(gdat_params,'shot')
-  shot = gdat_params.shot; % should use only gdat_params.shot but change shot to make sure
-  gdat_data.shot = gdat_params.shot;
-  gdat_params=rmfield(gdat_params,'shot');
-end
-if ~isfield(gdat_params,'data_request') || isempty(gdat_params.data_request)
-  warning('input for ''data_request'' missing from input arguments')
-  return
-end
-
-gdat_data.gdat_params = gdat_params;
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-function 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(aa_values) ']'];
-        else
-          subcall = [subcall ',' num2str(aa_values) ''];
-        end
-      else
-        % to treat extra cases
-      end
-    end
-  elseif ischar(var_to_treat)
-    subcall = [subcall ',''' var_to_treat ''''];
-  end
-end
diff --git a/crpptbx_new/gdatpaths.m b/crpptbx_new/gdatpaths.m
deleted file mode 100644
index ca08087f..00000000
--- a/crpptbx_new/gdatpaths.m
+++ /dev/null
@@ -1,16 +0,0 @@
-%
-% add paths for gdat directory
-%
-% assumes gdat already available
-%
-a=which('gdat');
-ii=findstr('/',a);
-a=a(1:ii(end));
-
-machines=[{'JET'} {'TCV'} {'AUG'} {'D3D'}];
-machines=[{'JET'} {'TCV'} {'AUG'} {'KSTAR'}];
-
-for i=1:length(machines)
-  addpath([a machines{i}])
-end
-
diff --git a/crpptbx_new/get_data_request_names.m b/crpptbx_new/get_data_request_names.m
new file mode 100644
index 00000000..5aaf8099
--- /dev/null
+++ b/crpptbx_new/get_data_request_names.m
@@ -0,0 +1,45 @@
+function [data_request_names] = get_data_request_names;
+%
+% get list of presently available data_request names grouped and with description
+%
+% at this stage using first 3 columns of file gdat_data_request_names.xlsx
+%
+
+expected_machines = [{'aug'}, {'jet'}, {'tcv'}]; % substrutures created for these at this stage (all means all of these)
+for j=1:length(expected_machines)
+  data_request_names.(expected_machines{j}) = [];
+end
+
+filename='gdat_data_request_names.xlsx';
+
+[numeric_struct,text_struct,raw_struct]=xlsread(filename);
+
+% use text structure
+[n1,n2]=size(text_struct);
+if prod(n1,n2)==0 || n2<3
+  disp(['problems with file ' filename])
+  return
+end
+
+% assume 1st column has data_request names with the headline "data_request"
+ij=find(strcmp('data_request',strtrim(lower(text_struct{1,1})))==1);
+if isempty(ij) || ij+1>=n1
+  disp(['problems with file ' filename '; ''data_request'' not found in 1st column or no extra lines'])
+  return
+end
+
+ij_1strow = ij+1;
+for iline=ij+1:n1
+  if isempty(text_struct{iline,1}); keyboard; end
+  % extra machine
+  validity = text_struct{iline,3};
+  if ~isempty(regexpi(validity,'all'))
+    data_request_names.all.(strtrim(lower(text_struct{iline,1}))).description = strtrim(text_struct{iline,2});
+  else
+    for j=1:length(expected_machines)
+      if ~isempty(regexpi(validity,expected_machines{j}))
+        data_request_names.(lower(expected_machines{j})).(strtrim(lower(text_struct{iline,1}))).description = strtrim(text_struct{iline,2});
+      end
+    end
+  end
+end
diff --git a/crpptbx_new/subcall_all2str.m b/crpptbx_new/subcall_all2str.m
new file mode 100644
index 00000000..a87eff3a
--- /dev/null
+++ b/crpptbx_new/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;
-- 
GitLab