From 41f0f9194cb15e8174b3be19b4ff1f2b7a8f787f Mon Sep 17 00:00:00 2001 From: Olivier Sauter <olivier.sauter@epfl.ch> Date: Fri, 26 Apr 2019 09:16:48 +0000 Subject: [PATCH] add param, param-set etc as special_signal request git-svn-id: https://spcsvn.epfl.ch/repos/TCV/gdat/trunk@11794 d63d8f72-b253-0410-a779-e742ad2e26cf --- crpptbx/AUG/gdat_aug.m | 63 ++++++++++++++++++++++---------------- crpptbx/AUG/geteqdskAUG.m | 2 +- crpptbx/AUG/rdaAUG_eff.m | 64 ++++++++++++++++++++++----------------- crpptbx/subcall_all2str.m | 12 +++++++- 4 files changed, 86 insertions(+), 55 deletions(-) diff --git a/crpptbx/AUG/gdat_aug.m b/crpptbx/AUG/gdat_aug.m index 39335b60..d3b9ec7b 100644 --- a/crpptbx/AUG/gdat_aug.m +++ b/crpptbx/AUG/gdat_aug.m @@ -50,6 +50,11 @@ function [gdat_data,gdat_params,error_status,varargout] = gdat_aug(shot,data_req % a6=gdat(32827,'ip','Opt1',123,'Doplot',1,'opt2','Abc'); % standard call with a few options (note all lowercase in output) % eqd = gdat(33134,'eqdsk','equil','IDE','time',2,'extra_arg_sf2sig','''-ed'',2'); % +% to get parameters, similar special signals use: 'XXX:name' with XXX in {'param:', 'param-set:', 'area-base:', 'time-base:'} +% gyrofreq=gdat(30594,{'ECS','P_sy2_g1','AUGD','param:gyr_freq'}); +% or +% gyrofreq=gdat(30594,{'ECS','P_sy2_g1'},'special_signal',,'param:gyr_freq'); +% % ip=gdat(shot,'ip'); % will show in ip.gdat_fullpath the effective signal used. In this case it is similar to ask: % ip=gdat(shot,{'FPC','IpiFP','AUGD'}); % or ip=gdat(shot,{'FPC','IpiFP'}); % @@ -112,7 +117,10 @@ 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 +if nargin>=2 && ischar(data_request); + data_request_eff = data_request; + data_request = data_request; % should not lower until see if keyword +end gdat_data.gdat_request = data_request_names_all; % so if return early gives list of possible request names gdat_data.gdat_params.help = aug_help_parameters(fieldnames(gdat_data.gdat_params)); @@ -159,6 +167,7 @@ if nargin>=2 && ivarargin_first_char~=1 end %data_request.data_request = lower(data_request.data_request); data_request_eff = data_request.data_request; + data_request.data_request = 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 @@ -191,12 +200,13 @@ 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 + varargin_eff{i} = lower(varargin_eff{i}); + % enforce lower case for any character driven input (only for 1st part of pair...) +% $$$ if ischar(varargin_eff{i+1}) + gdat_params.(varargin_eff{i}) = varargin_eff{i+1}; +% $$$ else +% $$$ gdat_params.(lower(varargin_eff{i})) = varargin_eff{i+1}; +% $$$ end else if gdat_params.nverbose>=1; warning(['input argument nb: ' num2str(i) ' is incorrect, expects a character string']); end error_status=401; @@ -227,19 +237,18 @@ gdat_params.extra_arg_sf2sig = extra_arg_sf2sig; % if it is a request_keyword can obtain description: if ischar(data_request_eff) || length(data_request_eff)==1 - ij=strmatch(data_request_eff,data_request_names_all,'exact'); + ij=strmatch(lower(data_request_eff),data_request_names_all,'exact'); else ij=[]; end if ~isempty(ij); gdat_data.gdat_request = data_request_names_all{ij}; + gdat_params.data_request = gdat_data.gdat_request; if isfield(data_request_names.all.(data_request_names_all{ij}),'description') && ~isempty(data_request_names.all.(data_request_names_all{ij}).description) % copy description of keyword gdat_data.request_description = data_request_names.all.(data_request_names_all{ij}).description; end -else - if ~isempty(data_request_eff); gdat_data.gdat_request = data_request_eff; end end % special treatment if shot and data_request given within pairs @@ -254,7 +263,7 @@ if ~isfield(gdat_params,'data_request') || isempty(gdat_params.data_request) error_status=5; return end -gdat_data.gdat_params = gdat_params; +gdat_data.gdat_params = gdat_params; % This means that before here it is gdat_params which should be updated % re-assign main variables to make sure use the one in gdat_data structure shot = gdat_data.shot; @@ -284,7 +293,7 @@ if strcmp(mapping_for_aug.method,'signal') gdat_data.data_request_names_all = data_request_names_all; end return - elseif length(mapping_for_aug.expression)>=3 + elseif length(mapping_for_aug.expression)>=3 && ~isempty(mapping_for_aug.expression{3}) exp_location = mapping_for_aug.expression{3}; elseif length(mapping_for_aug.expression)>=2 mapping_for_aug.expression{3} = exp_location; @@ -310,21 +319,22 @@ if strcmp(mapping_for_aug.method,'signal') gdat_data.gdat_params.exp_name = exp_location; % time interval time_interval = []; - % extra args for sf2sig + % extra args for rdaAUG_eff if length(mapping_for_aug.expression)>=4 && ~isempty(mapping_for_aug.expression{4}) - gdat_data.gdat_params.extra_arg_sf2sig = mapping_for_aug.expression{4}; + gdat_data.gdat_params.special_signal = mapping_for_aug.expression{4}; end [aatmp,error_status]=rdaAUG_eff(shot,mapping_for_aug.expression{1},mapping_for_aug.expression{2},exp_location, ... - time_interval,gdat_data.gdat_params.extra_arg_sf2sig); + time_interval,gdat_data.gdat_params.extra_arg_sf2sig,gdat_data.gdat_params.special_signal); if error_status~=0 if gdat_params.nverbose>=3; disp(['error after rdaAUG in signal with data_request_eff= ' data_request_eff]); end return end - gdat_data.data = aatmp.data; - gdat_data.t = aatmp.t; - gdat_data.x = aatmp.x; + if isfield(aatmp,'data'); gdat_data.data = aatmp.data; end + if isfield(aatmp,'t'); gdat_data.t = aatmp.t; end + if isfield(aatmp,'x'); gdat_data.x = aatmp.x; end if isfield(aatmp,'dimunits'); gdat_data.dimunits = aatmp.dimunits; end - if isempty(aatmp.data) + gdat_data.data_fullpath=mapping_for_aug.expression; + if isempty(aatmp.data) || (isempty(gdat_data.t) && isempty(gdat_data.x)) return end if mapping_for_aug.timedim<=0 @@ -390,7 +400,6 @@ if strcmp(mapping_for_aug.method,'signal') else mapping_for_aug.gdat_timedim = mapping_for_aug.timedim; end - gdat_data.data_fullpath=mapping_for_aug.expression; % end of method "signal" %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1581,10 +1590,12 @@ elseif strcmp(mapping_for_aug.method,'switchcase') labels{i} = ['EC_' num2str(i)]; end end + sys1_source = 'P_sy1_g'; + if shot > 33725; sys1_source = 'P_sy3_g'; end try - [a,e]=rdaAUG_eff(shot,'ECS',['P_sy1_g' num2str(i)],gdat_data.gdat_params.exp_name,[], ... + [a,e]=rdaAUG_eff(shot,'ECS',[sys1_source num2str(i)],gdat_data.gdat_params.exp_name,[], ... gdat_data.gdat_params.extra_arg_sf2sig,['param:' 'gyr_freq']); - % eval(['a = sf2par(''ECS'',shot,''gyr_freq'',''P_sy1_g' num2str(i) '''' extra_arg_sf2sig_eff_string ');']); + % eval(['a = sf2par(''ECS'',shot,''gyr_freq'','sys1_source num2str(i) '''' extra_arg_sf2sig_eff_string ');']); catch % gyr_freq not present (old shots for example) a=[]; @@ -1595,9 +1606,9 @@ elseif strcmp(mapping_for_aug.method,'switchcase') gdat_data.freq_ec(i) = a.value; end try - [a,e]=rdaAUG_eff(shot,'ECS',['P_sy1_g' num2str(i)],gdat_data.gdat_params.exp_name,[], ... + [a,e]=rdaAUG_eff(shot,'ECS',[sys1_source num2str(i)],gdat_data.gdat_params.exp_name,[], ... gdat_data.gdat_params.extra_arg_sf2sig,['param:' 'GPolPos']); - % eval(['a = sf2par(''ECS'',shot,''GPolPos'',''P_sy1_g' num2str(i) '''' extra_arg_sf2sig_eff_string ');']); + % eval(['a = sf2par(''ECS'',shot,''GPolPos'','sys1_source num2str(i) '''' extra_arg_sf2sig_eff_string ');']); catch % GPolPos not present a=[]; @@ -1608,9 +1619,9 @@ elseif strcmp(mapping_for_aug.method,'switchcase') gdat_data.polpos_ec(i) = a.value; end try - [a,e]=rdaAUG_eff(shot,'ECS',['P_sy1_g' num2str(i)],gdat_data.gdat_params.exp_name,[], ... + [a,e]=rdaAUG_eff(shot,'ECS',[sys1_source num2str(i)],gdat_data.gdat_params.exp_name,[], ... gdat_data.gdat_params.extra_arg_sf2sig,['param:' 'GTorPos']); - % eval(['a = sf2par(''ECS'',shot,''GTorPos'',''P_sy1_g' num2str(i) '''' extra_arg_sf2sig_eff_string ');']); + % eval(['a = sf2par(''ECS'',shot,''GTorPos'','sys1_source num2str(i) '''' extra_arg_sf2sig_eff_string ');']); catch a=[]; end diff --git a/crpptbx/AUG/geteqdskAUG.m b/crpptbx/AUG/geteqdskAUG.m index bac1c980..d991b104 100644 --- a/crpptbx/AUG/geteqdskAUG.m +++ b/crpptbx/AUG/geteqdskAUG.m @@ -102,7 +102,7 @@ end eqdsk.psimesh=linspace(0,1,eqdsk.nr)'; eqdsk.rhopsi = sqrt(eqdsk.psimesh); % psimesh assumed from 0 on axis (so psi_edge is delta_psi) to have correct d/dpsi but to have sign(dpsi) easily -eqdsk.psimesh = (eqdsk.psiedge-eqdsk.psiaxis) .* eqdsk.psimesh; +% (psimesh from 0 to 1) eqdsk.psimesh = (eqdsk.psiedge-eqdsk.psiaxis) .* eqdsk.psimesh; nrho = size(equil.pressure,1); eqdsk.p = interpos(equil.rhopolnorm(:,it),equil.pressure(:,it),eqdsk.rhopsi,-0.01,[1 2],[0 equil.pressure(end,it)]); eqdsk.pprime = interpos(equil.rhopolnorm(:,it),equil.dpressuredpsi(:,it),eqdsk.rhopsi,-0.01,[1 2],[0 equil.dpressuredpsi(end,it)]); diff --git a/crpptbx/AUG/rdaAUG_eff.m b/crpptbx/AUG/rdaAUG_eff.m index 96998cd4..558f9907 100644 --- a/crpptbx/AUG/rdaAUG_eff.m +++ b/crpptbx/AUG/rdaAUG_eff.m @@ -11,6 +11,7 @@ function [adata,error]=rdaAUG_eff(shot,diagname,sigtype,shotfile_exp,varargin); % % varargin{1}: time interval or timevalue, will get data closest to that time or within that time interval % varargin{2}: extra args for sf2sig like '-raw' +% if starts as in varargin{3}, assume varargin{2} is actually varargin{3} (allows param:... set in gdat easily) % % varargin{3}: 'param:xxx' means get parameter (instead of signal) with xxx as parameter to get % 'param-set:xxx' means get parameter-set (at this stage available only with sf2ps) @@ -58,15 +59,25 @@ adata.exp = shotfile_exp; adata.edition_in = []; adata.edition_out = []; +varargin_eff = varargin; +nargin_eff = nargin; +% now use special_signal (4th input) to specify extra demand, so can remain with edition or raw in extra_arg +% $$$ special_varargin3 = {'param:', 'param-set:', 'area-base:', 'time-base:'}; +% $$$ ab=regexpi(varargin_eff{2},special_varargin3); +% $$$ if ~isempty(cell2mat(ab)) && (length(varargin_eff)<3 || isempty(varargin_eff{3})) +% $$$ varargin_eff{3} = varargin_eff{2}; +% $$$ varargin_eff{2} = ''; +% $$$ nargin_eff = max(nargin,7); +% $$$ end + time_int=[]; -if nargin>=5 & ~isempty(varargin{1}) - time_int=varargin{1}; +if nargin_eff>=5 & ~isempty(varargin_eff{1}) + time_int=varargin_eff{1}; end extra_arg_sf2sig=[]; -if nargin>=6 & ~isempty(varargin{2}) - extra_arg_sf2sig=varargin{2}; +if nargin_eff>=6 & ~isempty(varargin_eff{2}) + extra_arg_sf2sig=varargin_eff{2}; end - param_name=[]; param_set_name=[]; area_base=false; @@ -75,34 +86,34 @@ area_base_dimof=[]; time_base=false; time_base_name=[]; time_base_dimof=[]; -if nargin>=7 && ~isempty(varargin{3}) && ischar(varargin{3}) ... - && length(varargin{3})>=7 && strcmp(lower(varargin{3}(1:6)),'param:') - param_name=varargin{3}(7:end); +if nargin_eff>=7 && ~isempty(varargin_eff{3}) && ischar(varargin_eff{3}) ... + && length(varargin_eff{3})>=7 && strcmp(lower(varargin_eff{3}(1:6)),'param:') + param_name=varargin_eff{3}(7:end); end -if nargin>=7 && ~isempty(varargin{3}) && ischar(varargin{3}) ... - && length(varargin{3})>=11 && strcmp(lower(varargin{3}(1:10)),'param-set:') - param_set_name=varargin{3}(11:end); +if nargin_eff>=7 && ~isempty(varargin_eff{3}) && ischar(varargin_eff{3}) ... + && length(varargin_eff{3})>=11 && strcmp(lower(varargin_eff{3}(1:10)),'param-set:') + param_set_name=varargin_eff{3}(11:end); end -if nargin>=7 && ~isempty(varargin{3}) && ischar(varargin{3}) ... - && length(varargin{3})>=9 && strcmp(lower(varargin{3}(1:9)),'area-base') +if nargin_eff>=7 && ~isempty(varargin_eff{3}) && ischar(varargin_eff{3}) ... + && length(varargin_eff{3})>=9 && strcmp(lower(varargin_eff{3}(1:9)),'area-base') area_base = true; - ij=findstr(varargin{3},':'); + ij=findstr(varargin_eff{3},':'); if length(ij)==2 - area_base_name=varargin{3}(ij(1)+1:ij(2)-1); - area_base_dimof = str2num(varargin{3}(ij(2)+1:end)); + area_base_name=varargin_eff{3}(ij(1)+1:ij(2)-1); + area_base_dimof = str2num(varargin_eff{3}(ij(2)+1:end)); elseif length(ij)==1 - area_base_name=varargin{3}(ij(1)+1:end); + area_base_name=varargin_eff{3}(ij(1)+1:end); end end -if nargin>=7 && ~isempty(varargin{3}) && ischar(varargin{3}) ... - && length(varargin{3})>=9 && strcmp(lower(varargin{3}(1:9)),'time-base') +if nargin_eff>=7 && ~isempty(varargin_eff{3}) && ischar(varargin_eff{3}) ... + && length(varargin_eff{3})>=9 && strcmp(lower(varargin_eff{3}(1:9)),'time-base') time_base = true; - ij=findstr(varargin{3},':'); + ij=findstr(varargin_eff{3},':'); if length(ij)==2 - time_base_name=varargin{3}(ij(1)+1:ij(2)-1); - time_base_dimof = str2num(varargin{3}(ij(2)+1:end)); + time_base_name=varargin_eff{3}(ij(1)+1:ij(2)-1); + time_base_dimof = str2num(varargin_eff{3}(ij(2)+1:end)); elseif length(ij)==1 - time_base_name=varargin{3}(ij(1)+1:end); + time_base_name=varargin_eff{3}(ij(1)+1:end); end end @@ -167,9 +178,9 @@ if usemdsplus area_time_base_dimof = time_base_dimof; end if ~isempty(area_time_base_name) - if nargin>=5 & ~isempty(varargin{1}) + if nargin_eff>=5 & ~isempty(varargin_eff{1}) eval(['[data,error]=mdsvalue(''_rdaeff' user diagname '=augdiag(' num2str(shot) ',"' diagname '","' area_time_base_name '","' shotfile_exp ... - '",' ed_number ',' num2str(varargin{1}(1),'%.14f') ',' num2str(varargin{1}(end),'%.14f') ')'');']); + '",' ed_number ',' num2str(varargin_eff{1}(1),'%.14f') ',' num2str(varargin_eff{1}(end),'%.14f') ')'');']); else eval(['[data,error]=mdsvalue(''_rdaeff' user diagname '=augdiag(' num2str(shot) ',"' diagname '","' area_time_base_name '","' shotfile_exp ... '",' ed_number ',,,_oshot' user diagname ',_oed' user diagname ')'');']); @@ -201,7 +212,6 @@ if usemdsplus nb_xpoints_m1 = 4; if strcmp(sigtype,'Lpf') if (min(adata.data)<0*100000+3 && min(adata.data)~=0) || max(adata.data)>100000*20 - keyboard disp(['seems to be a problem with Lpf assume 1 sol point and ' num2str(nb_surfaces_m1+1) ' surfaces']) adata.data(:) = 100000 + nb_surfaces_m1; end @@ -401,7 +411,7 @@ else end adata.data = adata.value; catch ME - trhow(ME) + throw(ME) end elseif ~area_base && ~time_base % use sf2ps diff --git a/crpptbx/subcall_all2str.m b/crpptbx/subcall_all2str.m index a87eff3a..6e5d1ee1 100644 --- a/crpptbx/subcall_all2str.m +++ b/crpptbx/subcall_all2str.m @@ -19,7 +19,9 @@ end subcall = ''; for i_in=1:length(varargin) var_to_treat = varargin{i_in}; - if isstruct(var_to_treat) + if isempty(var_to_treat) + subcall = [subcall ',[]']; + elseif isstruct(var_to_treat) % explode structure into 'childname',childvalues param_names = fieldnames(var_to_treat); for i=1:length(param_names) @@ -53,6 +55,14 @@ for i_in=1:length(varargin) end elseif ischar(var_to_treat) subcall = [subcall ',''' var_to_treat '''']; + elseif iscell(var_to_treat) + subcall = [subcall ',{''' var_to_treat{1} '''']; + for i=2:length(var_to_treat) + subcall = [subcall ',''' var_to_treat{i} '''']; + end + subcall = [subcall '}']; + else + warning('in subcall_all2str: case not foreseen'); end end -- GitLab