diff --git a/matlab/TCV/gdat_tcv.m b/matlab/TCV/gdat_tcv.m index 8acfc6f38c78d0457b3e330c4ed1c09b7b2be85e..d8977c80fa263af90386cfe3a3b1a8ee0e3d97e8 100644 --- a/matlab/TCV/gdat_tcv.m +++ b/matlab/TCV/gdat_tcv.m @@ -80,7 +80,7 @@ function [gdat_data,gdat_params,error_status,varargout] = gdat_tcv(shot,data_req % Prepare some variables, etc varargout{1}=cell(1,1); -error_status=1; +error_status=-1; % construct main default parameters structure % parameters and defaults related to a specific request should be defined in the relevant switch case section @@ -117,6 +117,9 @@ gdat_data.shot = []; gdat_data.gdat_request = []; gdat_data.gdat_params = gdat_params; gdat_data.data_fullpath = []; +gdat_data.help = ''; +gdat_data.status_mds = 2; +gdat_data.status = error_status; % Treat inputs: @@ -179,6 +182,7 @@ if nargin>=1 else if gdat_params.nverbose>=1; warning('type of 1st argument unexpected, should be numeric or char'); end error_status=2; + gdat_data.status = error_status; return end if nargin==1 @@ -196,6 +200,7 @@ if nargin>=2 && ivarargin_first_char~=1 if ~isfield(data_request,'data_request') if gdat_params.nverbose>=1; warning('expects field data_request in input parameters structure'); end error_status=3; + gdat_data.status = error_status; return end data_request_eff = data_request.data_request; @@ -248,12 +253,14 @@ if (nargin>=ivarargin_first_char) else if gdat_params.nverbose>=1; warning(['input argument nb: ' num2str(i) ' is incorrect, expects a character string']); end error_status=401; + gdat_data.status = error_status; return end end else if gdat_params.nverbose>=1; warning('number of input arguments incorrect, cannot make pairs of parameters'); end error_status=402; + gdat_data.status = error_status; return end end @@ -283,6 +290,7 @@ 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; + gdat_data.status = error_status; return end gdat_data.gdat_params = gdat_params; % This means that before here it is gdat_params which should be updated @@ -291,6 +299,7 @@ gdat_data.gdat_params = gdat_params; % This means that before here it is gdat_pa shot = gdat_data.shot; data_request_eff = gdat_data.gdat_params.data_request; error_status = 6; % at least reached this level +gdat_data.status = error_status; mapping_for_tcv = tcv_requests_mapping(data_request_eff,shot); gdat_data.label = mapping_for_tcv.label; @@ -440,6 +449,7 @@ if strcmp(mapping_for_tcv.method(1:3),'tdi') else % empty or wrong expression error_status=701; + gdat_data.status = error_status; return end else @@ -508,9 +518,15 @@ if strcmp(mapping_for_tcv.method(1:3),'tdi') end end end - if isempty(aatmp.data) || (isempty(aatmp.dim) && ischar(aatmp.data) && ~isempty(strfind(lower(aatmp.data),'no data')) ) % || ischar(aatmp.data) (to add?) + gdat_data.help = aatmp.help; + gdat_data.status_mds = aatmp.status; + error_status = 0; + gdat_data.status = error_status; + if mod(gdat_data.status_mds,2) == 0 if (gdat_params.nverbose>=1); warning(['problems loading data for ' eval_expr ' for data_request= ' data_request_eff]); end if (gdat_params.nverbose>=3); disp('check .gdat_request list'); end + error_status = 7; + gdat_data.status = error_status; return end gdat_data.data = aatmp.data; @@ -592,7 +608,6 @@ if strcmp(mapping_for_tcv.method(1:3),'tdi') else gdat_data.label=[mapping_for_tcv.expression]; end - if isfield(mapping_for_tcv,'help') && ~isempty(mapping_for_tcv.help) gdat_data.help = mapping_for_tcv.help; else @@ -611,6 +626,7 @@ elseif strcmp(mapping_for_tcv.method,'expression') if isempty(gdat_tmp) || (~isstruct(gdat_tmp) & ~isobject(gdat_tmp)) if (gdat_params.nverbose>=1); warning(['expression does not create a gdat_tmp structure: ' mapping_for_tcv.expression]); end error_status=801; + gdat_data.status = error_status; return end tmp_fieldnames = setdiff(fieldnames(gdat_tmp),{'gdat_request','label'}); % could/should also remove label in any case @@ -673,20 +689,26 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if liuqe_matlab==0 nodenameeff=['tcv_eq("r_max_psi","' psitbx_str '")']; rmaxpsi=tdi(nodenameeff); - ijnan = find(isnan(rmaxpsi.data)); - if isempty(rmaxpsi.data) || isempty(rmaxpsi.dim) || ischar(rmaxpsi.data) || ... - ( ~isempty(ijnan) && prod(size(ijnan))==prod(size(rmaxpsi.data)) ) + gdat_data.help = rmaxpsi.help; + gdat_data.status_mds = rmaxpsi.status; + error_status = 0; + gdat_data.status = error_status; + if mod(gdat_data.status_mds,2) == 0 if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end + error_status = 90; + gdat_data.status = error_status; return end nodenameeff2=['tcv_eq("r_min_psi","' psitbx_str '")']; rminpsi=tdi(nodenameeff2); - ijnan = find(isnan(rminpsi.data)); - if isempty(rminpsi.data) || isempty(rminpsi.dim) || ... - ( ~isempty(ijnan) && prod(size(ijnan))==prod(size(rminpsi.data)) ) + gdat_data.help = rminpsi.help; + gdat_data.status_mds = rminpsi.status; + if mod(gdat_data.status_mds,2) == 0 if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff2 ' for data_request= ' data_request_eff]); end if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end + error_status = 91; + gdat_data.status = error_status; return end ij=find(rmaxpsi.data<0.5 | rmaxpsi.data>1.2); % points outside TCV vessel @@ -707,6 +729,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.data_fullpath=[nodenameeff ' + ' nodenameeff2 ' /2']; else if (gdat_params.nverbose>=1); warning(['should not be in this case with data_request_eff = ' data_request_eff]); end + error_status = 92; + gdat_data.status = error_status; return end if strcmp(data_request_eff(end-3:end),'_rho') @@ -743,8 +767,20 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') return end aatmp = tdi(nodenameeff); + gdat_data.help = aatmp.help; + gdat_data.status_mds = aatmp.status; + error_status = 0; + gdat_data.status = error_status; + if mod(gdat_data.status_mds,2) == 0 + error_status = 101; + gdat_data.status = error_status; + end if strcmp(data_request_eff(end-3:end),'_rho') aatmp2 = tdi(nodenameeff2); + if mod(aatmp2.status,2) == 0 + error_status = 102; + gdat_data.status = error_status; + end if strcmp(data_request_eff,'a_minor_rho') gdat_data.data = 0.5.*(aatmp.data-aatmp2.data); elseif strcmp(data_request_eff,'rgeom_rho') @@ -784,9 +820,15 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') nodenameeff=['tcv_eq("z_edge","' psitbx_str '")']; end zcontour=tdi(nodenameeff); - if isempty(zcontour.data) || isempty(zcontour.dim) % || ischar(zcontour.data) (to add?) + gdat_data.help = zcontour.help; + gdat_data.status_mds = zcontour.status; + error_status = 0; + gdat_data.status = error_status; + if mod(gdat_data.status_mds,2) == 0 if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end + error_status = 111; + gdat_data.status = error_status; return end if strcmp(data_request_eff,'zgeom') @@ -796,6 +838,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.dimunits{1} = zcontour.dimunits{2}; else if (gdat_params.nverbose>=1); warning(['should not be in this case with data_request_eff = ' data_request_eff]); end + error_status = 112; + gdat_data.status = error_status; return end gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim}; @@ -844,8 +888,14 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.data = tracetdi.data .* added_correction; end end - if isempty(tracetdi.data) || isempty(tracetdi.dim) % || ischar(tracetdi.data) (to add?) + gdat_data.help = tracetdi.help; + gdat_data.status_mds = tracetdi.status; + error_status = 0; + gdat_data.status = error_status; + if mod(gdat_data.status_mds,2) == 0 if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end + error_status =121; + gdat_data.status = error_status; return end gdat_data.data_fullpath=[added_correction_str nodenameeff]; @@ -869,13 +919,13 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'bfields'} params_eff = gdat_data.gdat_params; - + try if params_eff.liuqe == 1 % load LIUQE data [L,LY] = mds2meq(gdat_data.shot,'LIUQE.M',[],'ifield',true); % flag to allow field computation LY = meqreprocess(L,LY); % compute fields etc, since not directly loaded from mds2meq - datapath = 'Outputs from [L,LY]=mds2meq(gdat_data.shot,''LIUQE.M'',[],''ifield'',true); LY = meqreprocess(L,LY);'; + datapath = 'Outputs from [L,LY]=mds2meq(gdat_data.shot,''LIUQE.M'',[],''ifield'',true); LY = meqreprocess(L,LY);'; Br = permute(LY.Brx,[2,1,3]); % permute for (Z,R)->(R,Z) Bz = permute(LY.Bzx,[2,1,3]); Btor = permute(LY.Btx,[2,1,3]); @@ -890,10 +940,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') Bz = B.z; Btor = B.phi; dim_in = {coord.R,coord.z,time}; - time_in = time; + time_in = time; x_in = {coord.R,coord.z}; end - + gdat_data.data_fullpath = datapath; % radial magnetic field @@ -925,7 +975,7 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.Btor.x = x_in; gdat_data.Btor.data_fullpath = datapath; gdat_data.Btor.label = 'Toroidal magnetic field map in (R,Z)'; - + % total magnetic field gdat_data.Btot.data = sqrt(gdat_data.Btor.data.^2 + gdat_data.Bz.data.^2 + gdat_data.Br.data.^2); gdat_data.Btot.units = 'T'; @@ -935,7 +985,7 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.Btot.x = x_in; gdat_data.Btot.data_fullpath = datapath; gdat_data.Btot.label = 'Total magnetic field map in (R,Z)'; - + gdat_data.data = gdat_data.Btot.data; gdat_data.units = 'T'; gdat_data.dim = dim_in; @@ -943,6 +993,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.t = time_in; gdat_data.x = x_in; gdat_data.label = 'Total magnetic field map in (R,Z)'; + gdat_data.status_mds = 1; + error_status = 0; + gdat_data.status = error_status; catch @@ -951,6 +1004,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.Br = []; gdat_data.Bz = []; gdat_data.Btot = []; + error_status = 151; + gdat_data.status = error_status; end @@ -971,11 +1026,18 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % use beta as time base if isempty(b0.data) || isempty(b0.dim) || isempty(ip.data) || isempty(ip.dim) || isempty(a_minor.data) || isempty(a_minor.dim) || isempty(beta.data) || isempty(beta.dim) if (gdat_params.nverbose>=1); warning(['problems loading data for data_request= ' data_request_eff]); end + gdat_data.status_mds = 2; + error_status = 161; + gdat_data.status = error_status; return end gdat_data.dim = beta.dim; gdat_data.t = beta.dim{1}; gdat_data.data = beta.data; + gdat_data.help = beta.help; + gdat_data.status_mds = 1; + error_status = 0; + gdat_data.status = error_status; if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) % should already have all data at times time_out since called gdat_tcv above end @@ -987,6 +1049,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') ip_t = ip.data(ij); else warning('no valid data for ip, cannot fit') + error_status = 162; + gdat_data.status = error_status; return end ij=find(isfinite(b0.data)); @@ -996,6 +1060,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') b0_t = b0.data(ij); else warning('no valid data for b0, cannot fit') + error_status = 163; + gdat_data.status = error_status; return end ij=find(isfinite(a_minor.data)); @@ -1005,6 +1071,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') a_minor_t = a_minor.data(ij); else warning('no valid data for a_minor, cannot fit') + error_status = 164; + gdat_data.status = error_status; return end gdat_data.data = 100.*beta.data ./ abs(ip_t).*1.e6 .* abs(b0_t) .* a_minor_t; @@ -1086,7 +1154,11 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') inb_times = length(cxrs_profiles.Times); gdat_data.cxrs_params = cxrs_profiles.param; if isempty(cxrs_profiles.Times) || ~isfield(cxrs_profiles,'proffit') - if (gdat_params.nverbose>=1); warning(['problems loading data with CXRS_get_profiles for data_request= ' data_request_eff]); end + gdat_data.status_mds = 2; + error_status = 171; + gdat_data.status = error_status; + gdat_data.help = ['problems loading data with CXRS_get_profiles for data_request= ' data_request_eff]; + if (gdat_params.nverbose>=1); warning(gdat_data.help); end for i=1:length(sub_nodes) sub_eff_out = sub_nodes_out{i}; gdat_data.(sub_eff_out).fit.data = []; @@ -1157,6 +1229,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') end gdat_data.dimunits{1} = ''; gdat_data.dimunits{2} = 's'; + gdat_data.help = ''; + gdat_data.status_mds = 1; + error_status = 0; + gdat_data.status = error_status; % add grids_1d to have rhotor, etc if cxrs_rho was asked for if strcmp(data_request_eff,'cxrs_rho') gdat_data = get_grids_1d(gdat_data,2,1,gdat_params.nverbose); @@ -1198,6 +1274,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'eqdsk'} % + gdat_data.help = ''; + gdat_data.status_mds = 2; + error_status = 181; + gdat_data.status = error_status; if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) if isfield(gdat_data.gdat_params,'time') && ~isempty(gdat_data.gdat_params.time) disp('time_out parameter not used for eqdsk, uses time') @@ -1273,6 +1353,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if gdat_params.nverbose>=1; warning(['could not create eqdsk file from read_results_for_chease with data_request= ' data_request_eff]); end + error_status = 182; + gdat_data.status = error_status; return end ii = regexpi(fnames_readresults{4},'eqdsksigns'); @@ -1280,6 +1362,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') eqdskval=read_eqdsk(fnames_readresults{4},cocos_read_results_for_chease,0,[],[],1); % read_results now has relevant cocos LIUQE= 17 else disp('wrong name check order of eqdsk outputs') + error_status = 183; + gdat_data.status = error_status; return end for i=1:length(fnames_readresults) @@ -1364,6 +1448,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.dimunits = {'m','m','s'}; gdat_data.request_description = ['data=psi, x=(R,Z), eqdsk contains eqdsk structure with which ' ... 'plot_eqdsk, write_eqdsk, read_eqdsk can be used']; + gdat_data.status_mds = 1; + error_status = 0; + gdat_data.status = error_status; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'gas', 'gas_flux', 'gas_request', 'gas_feedforward','gas_valve', 'gas_fluxes'} @@ -1375,6 +1462,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') end gasflux = gdat_tcv(gdat_data.shot,params_eff); gdat_data.gas_flux = gasflux; + gdat_data.help = gasflux.help; + gdat_data.status_mds = gasflux.status_mds; + error_status = 0; % since many options below, mark error if problem below + gdat_data.status = error_status; params_eff.data_request = '\hybrid::mat_m_signals:output_019'; gasrequest = gdat_tcv(gdat_data.shot,params_eff); gdat_data.gas_request_volt = gasrequest; @@ -1446,6 +1537,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') end end case {'gas_fluxes'} + gdat_data.help = 'cell array'; + gdat_data.status_mds = 2; + error_status = 191; + gdat_data.status = error_status; try if shot > 82186 for i=1:20 @@ -1480,7 +1575,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') catch end otherwise - error('gas option not defined') + gdat_data.status_mds = 2; + error_status = 192; + gdat_data.status = error_status; + error('gas option not defined') end if ~strcmp(data_request_eff,'gas_valve') gdat_data.dim{1} = gdat_data.t; @@ -1491,6 +1589,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') elseif ~isfield(gdat_data.gdat_params,'time_out') gdat_data.gdat_params.time_out = []; end + error_status = 0; + gdat_data.status = error_status; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'halphas'} @@ -1509,10 +1609,20 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.t = halphas.t; end gdat_data.data(channels(i),:) = halphas.data; + gdat_data.help = halphas.help; + gdat_data.status_mds = halphas.status_mds; catch - disp([params_eff.data_request ' not ok']); + gdat_data.help = [params_eff.data_request ' not ok']; + gdat_data.status_mds = 2; + disp(halphas.help); end end + if mod(gdat_data.status_mds,2) == 0 + error_status = 211; + else + error_status = 0; + end + gdat_data.status = error_status; gdat_data.label = ['\base::pd:pd_' num2str(min(channels),'%.3d') ' to ' num2str(max(channels),'%.3d')]; gdat_data.x = channels; gdat_data.dim{1} = gdat_data.x; @@ -1531,11 +1641,17 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') ids_empty_path = fullfile(fileparts(mfilename('fullpath')),'..','TCV_IMAS','ids_empty'); params_eff = gdat_data.gdat_params; + gdat_data.help = ''; + gdat_data.status_mds = 2; + error_status = 221; + gdat_data.status = error_status; if isfield(params_eff,'source') && ~isempty(params_eff.source) ids_top_name = params_eff.source; else ids_top_name = []; - warning('gdat:EmptyIDSName','Need an ids name in ''source'' parameter\n check substructure gdat_params.sources_available for an ids list'); + gdat_data.help = ['gdat:EmptyIDSName','Need an ids name in ''source'' parameter\n check substructure ', ... + 'gdat_params.sources_available for an ids list']; + warning(gdat_data.help); addpath(ids_empty_path); assert(~~exist('ids_list_all','file'),'could not find ids_list_all.m in %s',ids_empty_path); gdat_data.gdat_params.sources_available = ids_list_all; % avoid adding ids_list.m which would override ids_list from IMAS @@ -1618,6 +1734,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.([ids_top_name '_description']) = getReport(ME_tcv_get_ids); rethrow(ME_tcv_get_ids) end + gdat_data.status_mds = 1; + error_status = 0; + gdat_data.status = error_status; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'ec_data', 'aux', 'h_cd', 'nbi_data', 'ic_data', 'lh_data','ohm_data', 'bs_data'} @@ -1638,6 +1757,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if ~isempty(gdat_data.gdat_params.trialindx) && gdat_data.gdat_params.trialindx < 0 gdat_data.gdat_params.trialindx = []; end + gdat_data.help = ''; + gdat_data.status_mds = 2; + error_status = 1; + gdat_data.status = error_status; % specific parameters check and default settings if ~isfield(gdat_data.gdat_params,'source') || isempty(gdat_data.gdat_params.source) switch data_request_eff @@ -1657,12 +1780,16 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if (gdat_params.nverbose>=1) warning(['source= ' gdat_data.gdat_params.source ' is not part of the available sources: ' sprintf('''%s'' ',sources_avail{:})]); end + error_status = 231; + gdat_data.status = error_status; return else gdat_data.gdat_params.source = {gdat_data.gdat_params.source}; end else if (gdat_params.nverbose>=1); warning([' source parameter not compatible with: ' sprintf('''%s'' ',sources_avail{:})]); end + error_status = 232; + gdat_data.status = error_status; return end else @@ -1911,10 +2038,16 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if filled_successfully if isempty(ec_data.cd_tot.data) || isempty(ec_data.cd_tot.t) || ischar(ec_data.cd_tot.data) if (gdat_params.nverbose>=1) + gdat_data.status_mds = 2; + error_status = 233; + gdat_data.status = error_status; warning(['problems loading data for ' source_icd.ec ... ' for data_request= ' data_request_eff]); end else + gdat_data.status_mds = 1; + error_status = 0; + gdat_data.status = error_status; % now default is icdtot, will depend on request and data_out param of some kind data_fullpath = ['from toray nodes using astra_tcv_EC_exp(shot), all results in .ec_data, subfield=' field_for_main_data ... 'in ec.data, .x, .t, .dim, .dimunits, .label, .units']; @@ -1963,6 +2096,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') ec_data.cd_dens_doublewidth_label = []; ec_data.rho_tor_norm = []; gdat_data.ec.ec_data = ec_data; + error_status = 234; + gdat_data.status = error_status; return end @@ -2143,6 +2278,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') elseif ~isfield(gdat_data.gdat_params,'time_out') gdat_data.gdat_params.time_out = []; end + error_status = 0; + gdat_data.status = error_status; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'mhd'} @@ -2158,6 +2295,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % load n=1, 2 and 3 Bdot from magnetic measurements n3.data = []; mhd_source_list = {'0', '0full', '23', '23full', '-23', 'ltcc', 'ltcc-dbpol', 'ltcc-dbrad', 'ltcc-dbtor'}; + gdat_data.status_mds = 2; + error_status = 1; + gdat_data.status = error_status; if shot< 50926 n1=tdi('abs(mhdmode("LFS",1,1))'); n2=tdi('abs(mhdmode("LFS",2,1))'); @@ -2171,6 +2311,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') t2=sprintf('''%s'', ',mhd_source_list{1:end-1}); t3=sprintf('or ''%s''',mhd_source_list{end}); fprintf('%s %s %s\n',t1,t2,t3); + error_status = 241; + gdat_data.status = error_status; return end else @@ -2229,6 +2371,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') aaHFSz0_sect11=tdi('\atlas::DT196_MHD_002:channel_038'); gdat_data.n1_HFS=aaHFSz0_sect3; gdat_data.n1_HFS.data = gdat_data.n1_HFS.data - aaHFSz0_sect11.data; + gdat_data.n1_HFS.help = aaHFSz0_sect3.help; + gdat_data.n1_HFS.status_mds = aaHFSz0_sect3.status; gdat_data.n2_HFS=aaHFSz0_sect3; gdat_data.n2_HFS.data = gdat_data.n2_HFS.data + aaHFSz0_sect11.data; gdat_data.data_fullpath=['\atlas::DT196_MHD_001:channel_083 -+ \atlas::DT196_MHD_001:channel_091 for n=1,2, LFS_sect3/11, z=0cm; _HFS' ... @@ -2266,6 +2410,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') n3.data = []; else disp('should not be here in ''mhd'', ask O. Sauter') + error_status = 242; + gdat_data.status = error_status; return end end @@ -2288,7 +2434,15 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if shot>= 50926 gdat_data.label = {'n odd','n even'}; % can be used in legend(gdat_data.label) end + gdat_data.help = n1.help; + gdat_data.status_mds = n1.status; + end + if mod(gdat_data.status_mds,2) == 0 + error_status = 243; + else + error_status = 0; end + gdat_data.status = error_status; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'ne','te'} @@ -2298,6 +2452,12 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.gdat_params.systems = {'all'}; end [gdat_data] = get_thomson_raw_data(shot,data_request_eff,gdat_data,gdat_data.gdat_params.systems,gdat_params.nverbose,0); + if mod(gdat_data.status_mds,2) == 0 + error_status = 1; + else + error_status = 0; + end + gdat_data.status = error_status; if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) [gdat_data] = gdat2time_out(gdat_data,1,{'error_bar'}); elseif ~isfield(gdat_data.gdat_params,'time_out') @@ -2336,6 +2496,13 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') ab_r = gdat_tcv(gdat_data.shot,'\diagz::fir_array:radii'); gdat_data.r_center_chord = ab_r.data(ab_index.data+1); end + if mod(gdat_data.status_mds,2) == 0 + error_status = 1; + else + error_status = 0; + end + gdat_data.status = error_status; + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'ne_rho', 'te_rho', 'nete_rho'} % if nete_rho, do first ne, then Te later (so fir stuff already done) @@ -2479,6 +2646,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') disp('should not be in switch gdat_data.gdat_params.fit_type') disp('ask olivier.sauter@epfl.ch') end + error_status = 251; + gdat_data.status = error_status; return end if strcmp(gdat_data.gdat_params.fit_type,'conf') @@ -2503,8 +2672,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') trialindx = []; end tracetdi=tdi(nodenameeff); + gdat_data.help = tracetdi.help; + gdat_data.status_mds = tracetdi.status; if isempty(trialindx) - if ~isempty(tracetdi.data) && ~isempty(tracetdi.dim) && ~ischar(tracetdi.data) + if mod(gdat_data.status_mds,2) == 1 gdat_data.fit.data = tracetdi.data; else if gdat_params.nverbose>=1 @@ -2516,6 +2687,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') else gdat_data.fit.data_fullpath = [nodenameeff ' is empty']; end + error_status = 252; + gdat_data.status = error_status; return end else @@ -2526,6 +2699,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') disp([nodenameeff ' with trialindx=' num2str(trialindx) ' is empty, thus no fits, check hldsi(shot) and may need to run anaprofs?']) end gdat_data.fit.data_fullpath = [nodenameeff ' with trialindx=' num2str(trialindx) ' is empty']; + error_status = 253; + gdat_data.status = error_status; return end end @@ -2545,8 +2720,12 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.fit.help = '.x is rhopol coordinate'; tmp = tdi(def_rhotornorm); gdat_data.fit.rhotornorm = tmp.data; + gdat_data.fit.rhotornorm_help = tracetdi.help; + gdat_data.fit.rhotornorm_status_mds = tracetdi.status; tmp = tdi(def_rhovolnorm); gdat_data.fit.rhovolnorm = tmp.data; + gdat_data.fit.rhovolnorm_help = tmp.help; + gdat_data.fit.rhovolnorm_status_mds = tmp.status; % do te as well if nete asked for if strcmp(data_request_eff(1:4),'nete') for subfields={'data','x','t','units','help','rhotornorm','rhovolnorm','data_fullpath'} @@ -2567,12 +2746,16 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') end if ~isempty(trialindx); nodenameeff=[nodenameeff ':trial']; end tracetdi=tdi(nodenameeff); + gdat_data.fit.te.help = tracetdi.help; + gdat_data.fit.te.status_mds = tracetdi.status; if isempty(trialindx) gdat_data.fit.te.data = tracetdi.data; else if ~isempty(tracetdi.data) && size(tracetdi.data,3)>=trialindx+1 gdat_data.fit.te.data = tracetdi.data(:,:,trialindx+1); else + error_status = 254; + gdat_data.status = error_status; return end end @@ -2629,11 +2812,21 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') elseif ~isfield(gdat_data.gdat_params,'time_out') gdat_data.gdat_params.time_out = []; end + if mod(gdat_data.status_mds,2) == 0 + error_status = 255; + else + error_status = 0; + end + gdat_data.status = error_status; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'powers'} % note: same time array for all main, ec, ohm, nbi, ... % At this stage fill just ech, later add nbi + gdat_data.help = ''; + gdat_data.status_mds = 2; + error_status = 1; + gdat_data.status = error_status; sources_avail = {'ohm','ec','nbi1','nbi2','dnbi','rad'}; % note should allow ech, nbh, ohmic in parameter sources % create empty structures for all, so in return one always have same substructres for i=1:length(sources_avail) @@ -2655,12 +2848,16 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if (gdat_params.nverbose>=1) warning(['source= ' gdat_data.gdat_params.source ' is not part of the available sources: ' sprintf('''%s'' ',sources_avail{:})]); end + error_status = 261; + gdat_data.status = error_status; return else gdat_data.gdat_params.source = {gdat_data.gdat_params.source}; end else if (gdat_params.nverbose>=1); warning([' source parameter not compatible with: ' sprintf('''%s'' ',sources_avail{:})]); end + error_status = 262; + gdat_data.status = error_status; return end else @@ -2678,7 +2875,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % thus should take it from conf if present mdsopen(shot); ptot_ohm = tdi('\results::conf:ptot_ohm'); - if ~isempty(ptot_ohm.data) && ~ischar(ptot_ohm.data) && ~isempty(ptot_ohm.dim) && any(~isnan(ptot_ohm.data)) + gdat_data.ohm.help = ptot_ohm.help; + gdat_data.ohm.status_mds = ptot_ohm.status; + gdat_data.ohm.status = 1 - mod(gdat_data.ohm.status_mds,2); + if mod(gdat_data.ohm.status_mds,2) == 1 gdat_data.ohm.data = ptot_ohm.data; gdat_data.ohm.t = ptot_ohm.dim{1}; gdat_data.ohm.dim = ptot_ohm.dim; @@ -2720,7 +2920,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % EC nodenameeff='\results::toray.input:p_gyro'; tracetdi=tdi(nodenameeff); - if isempty(tracetdi.data) || isempty(tracetdi.dim) || ischar(tracetdi.data) + gdat_data.ec.help = tracetdi.help; + gdat_data.ec.status_mds = tracetdi.status; + gdat_data.ec.status = 1 - mod(gdat_data.ec.status_mds,2); + if mod(gdat_data.ec.status_mds,2) == 0 if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end else ij=[~isfinite(tracetdi.data)]; tracetdi.data(ij)=0.; @@ -2746,7 +2949,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') nodenameeff = '\results::NBH:POWR_TCV'; end nbh_data_tdi = tdi(nodenameeff); - if ~isempty(nbh_data_tdi.data) && ~ischar(nbh_data_tdi.data) && ~isempty(nbh_data_tdi.dim) + gdat_data.nbi1.help = nbh_data_tdi.help; + gdat_data.nbi1.status_mds = nbh_data_tdi.status; + gdat_data.nbi1.status = 1 - mod(gdat_data.nbi1.status_mds,2); + if mod(gdat_data.nbi1.status_mds,2) == 1 nbi_neutral_power_tot = nbh_data_tdi.data.*1e6; % in W ij = nbi_neutral_power_tot<100; nbi_neutral_power_tot(ij) = 0.; @@ -2791,7 +2997,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') nodenameeff='\results::bolo_u:prad'; if shot< 71076, nodenameeff='\results::bolo:prad:total'; end tracetdi=tdi(nodenameeff); - if isempty(tracetdi.data) || isempty(tracetdi.dim) || ischar(tracetdi.data) + gdat_data.rad.help = tracetdi.help; + gdat_data.rad.status_mds = tracetdi.status; + gdat_data.rad.status = 1 - mod(gdat_data.rad.status_mds,2); + if mod(gdat_data.rad.status_mds,2) == 0 if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end else gdat_data.rad.data = tracetdi.data*1e3; % at this stage bolo is in kW' @@ -2814,7 +3023,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % NB2 nodenameeff = '\results::NB2:POWR_TCV'; nb2_data_tdi = tdi(nodenameeff); - if ~isempty(nb2_data_tdi.dim) && ~ischar(nb2_data_tdi.data) && ~isempty(nb2_data_tdi.dim) + gdat_data.nbi2.help = nb2_data_tdi.help; + gdat_data.nbi2.status_mds = nb2_data_tdi.status; + gdat_data.nbi2.status = 1 - mod(gdat_data.nbi2.status_mds,2); + if mod(gdat_data.nbi2.status_mds,2) == 1 nbi_neutral_power_tot = nb2_data_tdi.data.*1e6; % in W ij = nbi_neutral_power_tot<100; nbi_neutral_power_tot(ij) = 0.; @@ -2854,7 +3066,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % NB2 nodenameeff = '\RESULTS::DNBI:POWR_TCV'; nb2_data_tdi = tdi(nodenameeff); - if ~isempty(nb2_data_tdi.data) && ~ischar(nb2_data_tdi.data) && ~isempty(nb2_data_tdi.dim) + gdat_data.dnbi.help = nb2_data_tdi.help; + gdat_data.dnbi.status_mds = nb2_data_tdi.status; + gdat_data.dnbi.status = 1 - mod(gdat_data.dnbi.status_mds,2); + if mod(gdat_data.dnbi.status_mds,2) == 1 nbi_neutral_power_tot = nb2_data_tdi.data.*1e6; % in W ij = nbi_neutral_power_tot<100; nbi_neutral_power_tot(ij) = 0.; @@ -2900,6 +3115,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') elseif ~isfield(gdat_data.gdat_params,'time_out') gdat_data.gdat_params.time_out = []; end + gdat_data.status_mds = 1; + error_status = 0; + gdat_data.status = error_status; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'q_rho'} @@ -2913,6 +3131,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') nodenameeff=[begstr 'q_psi' substr_liuqe]; end tracetdi=tdi(nodenameeff); + gdat_data.help = tracetdi.help; + gdat_data.status_mds = tracetdi.status; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); if liuqe_matlab==1 && liuqe_version_eff==-1 % may have problems with dim{1} being indices instead of rhopol if max(tracetdi.dim{1}) > 2 @@ -2923,9 +3144,11 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') end end end - if isempty(tracetdi.data) || isempty(tracetdi.dim) % || ischar(tracetdi.data) (to add?) + if mod(gdat_data.status_mds,2) == 0 if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end + error_status = 271; + gdat_data.status = error_status; return end gdat_data.data = tracetdi.data; @@ -2955,18 +3178,28 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % R*Bphi(rho,t) from F from FFprime if liuqe_matlab==0 fprintf('\n***** not yet implemented for liuqe fortran ******\n'); + error_status = 281; + gdat_data.status = error_status; return else nodenameeff=['tcv_eq("rbtor_rho","' psitbx_str '")']; end if liuqe_version_eff==-1 disp('not yet implemented for fbte') + error_status = 282; + gdat_data.status = error_status; return end tracetdi=tdi(nodenameeff); - if isempty(tracetdi.data) || isempty(tracetdi.dim) % || ischar(tracetdi.data) (to add?) + gdat_data.help = tracetdi.help; + gdat_data.status_mds = tracetdi.status; + error_status = 0; + gdat_data.status = error_status; + if mod(gdat_data.status_mds,2) == 0 if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end + error_status = 283; + gdat_data.status = error_status; return end gdat_data.data = tracetdi.data; @@ -2991,6 +3224,7 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') elseif ~isfield(gdat_data.gdat_params,'time_out') gdat_data.gdat_params.time_out = []; end + case {'phi_tor', 'phitor', 'toroidal_flux'} % Phi(LCFS) = int(Bphi dSphi), can use Eq.(11) of "Tokamak coordinate conventions: COCOS" paper: % O. Sauter, S.Yu. Medvedev, Comput. Phys. Commun. 184 (2013) 293???302 @@ -2998,14 +3232,18 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % q = -dPhi/dpsi => Phi = - int(q*dpsi) which should always have the sign of B0 % need to get q_rho but to avoid loop for rhotor in grids_1d, get q_rho explicitely here params_eff = gdat_data.gdat_params; + gdat_data.status_mds = 2; + error_status = 1; + gdat_data.status = error_status; if liuqe_matlab==1 nodenameeff = ['tcv_eq("tor_flux_tot","' psitbx_str '")']; phi_tor = tdi(nodenameeff); else phi_tor.data = []; phi_tor.units = 'Wb'; + phi_tor.status = 2; end - if ~any(any(isfinite(phi_tor.data))) || ischar(phi_tor.data) + if mod(phi_tor.status,2) == 0 % no phi_tor, compute it from q profile q_rho = tdi(['tcv_eq("' liuqefortran2liuqematlab('q',1,liuqe_matlab) '","' psitbx_str '")']); if liuqe_matlab==0 @@ -3013,6 +3251,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') end phi_tor.dim = q_rho.dim; phi_tor.dimunits = q_rho.dimunits; + phi_tor.help = q_rho.help; + phi_tor.status = q_rho.status; params_eff.data_request='psi_axis'; % psi_edge=0 with LIUQE psi_axis=gdat_tcv(shot,params_eff); if isnumeric(q_rho.data) @@ -3044,11 +3284,15 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % assume same dimensions, check. Note data dims can be different from dim{} when there is a problem with liuqe run if numel(phi_tor.data) ~= numel(q_rho.data) || numel(psi_axis.data) ~= numel(phi_tor.dim{2}) warning(['problems in gdat_tcv with ' data_request_eff ' with unexpected dimensions']) + error_status =291; + gdat_data.status = error_status; return; end % check time sizes since can happen problems with old liuqe runs if size(q_rho.data,2) ~= size(phi_tor.data,2) warning(['time sizes between q_rho and phi_tor do not match: ' num2str(size(q_rho.data,2)) ' and ' num2str(size(phi_tor.data,2))]); + error_status =292; + gdat_data.status = error_status; return end if size(q_rho.data,2) ~= length(psi_axis.data) @@ -3061,10 +3305,14 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') num2str(length(psi_axis.data))]); disp('WARNING: should have been caught, so probably q_rho.dim not the same as data(:,:) dims') disp('should run: >> liuqe_default_run_sequence(shot)') + error_status =293; + gdat_data.status = error_status; return end if size(q_rho.data,1) ~= size(phi_tor.data,1) warning(['radial sizes between q_rho and phi_tor do not match: ' num2str(size(q_rho.data,1)) ' and ' num2str(size(phi_tor.data,1))]); + error_status = 294; + gdat_data.status = error_status; return end for it=1:size(q_rho.data,2) @@ -3086,6 +3334,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.dim = phi_tor.dim; gdat_data.dimunits = phi_tor.dimunits; gdat_data.units = phi_tor.units; + gdat_data.help = phi_tor.help; + gdat_data.status_mds = phi_tor.status; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; if (length(gdat_data.dim)>=mapping_for_tcv.gdat_timedim); gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim}; end if (length(gdat_data.dim)>0); gdat_data.x = gdat_data.dim{1}; end if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) @@ -3118,11 +3370,15 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.dimunits = tracetdi.dimunits; gdat_data.units = tracetdi.units; gdat_data.request_description = 'pprime=dp/dpsi'; + gdat_data.help = tracetdi.help; + gdat_data.status_mds = tracetdi.status; if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) [gdat_data] = gdat2time_out(gdat_data,1); elseif ~isfield(gdat_data.gdat_params,'time_out') gdat_data.gdat_params.time_out = []; end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'pressure', 'pressure_rho', 'p_rho'} if liuqe_matlab==0 nodenameeff = ['tcv_eq("' liuqefortran2liuqematlab('p_rho',1,0) '","' psitbx_str '")']; @@ -3145,6 +3401,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.dimunits = tracetdi.dimunits; gdat_data.units = tracetdi.units; gdat_data.request_description = 'pressure'; + gdat_data.help = tracetdi.help; + gdat_data.status_mds = tracetdi.status; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) [gdat_data] = gdat2time_out(gdat_data,1); elseif ~isfield(gdat_data.gdat_params,'time_out') @@ -3156,37 +3416,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % psi at edge, 0 by construction in Liuqe, thus not given % add surface_psi from surface_flux and d(surface_flux)/dt = vloop warning('now psi_edge expression in tcv_requests_mapping, so should not come here') - keyboard - nodenameeff=['\results::psi_axis' substr_liuqe]; - if liuqe_version_eff==-1 - nodenameeff=[begstr 'q_psi' substr_liuqe]; - end - tracetdi=tdi(nodenameeff); - if isempty(tracetdi.data) || isempty(tracetdi.dim) || ~any(isfinite(tracetdi.data)) % || ischar(tracetdi.data) (to add?) - if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end - if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end - return - end - gdat_data.data = tracetdi.data.*0; - gdat_data.dim = tracetdi.dim; - gdat_data.t = gdat_data.dim{1}; - gdat_data.data_fullpath=[' zero ']; - gdat_data.dimunits = tracetdi.dimunits; - gdat_data.units = tracetdi.units; - gdat_data.request_description = '0 since LIUQE construct psi to be zero at LCFS'; - % - params_eff.data_request='\results::surface_flux'; - surface_psi=gdat_tcv([],params_eff); - ij=[isfinite(surface_psi.data)]; - [aa,vsurf] = interpos(63,surface_psi.t(ij),surface_psi.data(ij),-3); - gdat_data.surface_psi = surface_psi.data; - gdat_data.vsurf = vsurf; - gdat_data.vsurf_description = ['time derivative from surface_psi, obtained from \results::surface_flux']; - if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) - [gdat_data] = gdat2time_out(gdat_data,1); - elseif ~isfield(gdat_data.gdat_params,'time_out') - gdat_data.gdat_params.time_out = []; - end + gdat_data.status_mds = 2; + gdat_data.status = -1; + error_status = gdat_data.status; + return %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'r_contour_edge', 'z_contour_edge'} @@ -3206,6 +3439,10 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.data_fullpath=nodenameeff; gdat_data.dimunits = tracetdi.dimunits; gdat_data.units = tracetdi.units; + gdat_data.help = tracetdi.help; + gdat_data.status_mds = tracetdi.status; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) [gdat_data] = gdat2time_out(gdat_data,1); elseif ~isfield(gdat_data.gdat_params,'time_out') @@ -3220,6 +3457,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % q = -dPhi/dpsi => Phi = - int(q*dpsi) which should always have the sign of B0 % need to get q_rho but to avoid loop for rhotor in grids_1d, get q_rho explicitely here params_eff = gdat_data.gdat_params; + gdat_data.status_mds = 2; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; if liuqe_matlab==0 nodenameeff=['tcv_eq("q_psi","' psitbx_str '")']; if liuqe_version_eff==-1 @@ -3229,6 +3469,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if isempty(q_rho.data) || isempty(q_rho.dim) % || ischar(q_rho.data) (to add?) if (gdat_params.nverbose>=1); warning(['problems loading data for q_rho for data_request= ' data_request_eff]); end if (gdat_params.nverbose>=3); disp(['rerun LIUQE?']); end + error_status = 301; + gdat_data.status = error_status; return end rhopol_eff = ones(size(q_rho.dim{1})); @@ -3241,6 +3483,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') b0tpsi = interpos_nan(21,b0.t,b0.data,psi_axis.t); %q_rho on same time base as psi_axis if isempty(psi_axis.data) || isempty(psi_axis.dim) || isempty(q_rho.data) || isempty(q_rho.dim) if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end + error_status = 302; + gdat_data.status = error_status; return end rhoequal = linspace(0,1,length(q_rho.dim{1})); @@ -3282,6 +3526,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.psi_axis = reshape(psi_axis.data,length(psi_axis.data),1); if length(gdat_data.psi_axis) ~= length(gdat_data.t) disp('problems of time between qrho and psi_axis?') + error_status = 303; + gdat_data.status = error_status; return end gdat_data.b0 = b0tpsi; @@ -3302,6 +3548,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.data(:,it) = dataeff; else disp(['problem in gdat_tcv rhotor with unknown data_request_eff = ' data_request_eff]); + error_status = 304; + gdat_data.status = error_status; return end end @@ -3314,6 +3562,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') params_eff.data_request='b0'; b0=gdat_tcv([],params_eff); gdat_data.t = phi_tor.t; + gdat_data.help = phi_tor.help; + gdat_data.status_mds = phi_tor.status_mds; ij=find(isfinite(b0.data)); if length(gdat_data.t) > 0 gdat_data.b0 = interpos(b0.t(ij),b0.data(ij),gdat_data.t); @@ -3341,6 +3591,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.data_fullpath=['rhotor=sqrt(Phi/pi/B0) from phi_tor']; else disp(['data_request_eff = ' data_request_eff ' not defined within rhotor block in gdat_tcv.m']); + error_status = 305; + gdat_data.status = error_status; return end else @@ -3348,6 +3600,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.rhotor_edge = []; end end + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) % nothing to do since above uses gdat call getting reduced time already end @@ -3360,7 +3614,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if liuqe_matlab==0 nodenameeff=['\results::psitbx:vol']; if liuqe_version_eff > 1 - disp('needs to construct volume'); + disp('needs liuqe_version_eff > 1 to construct volume'); + error_status = 311; + gdat_data.status = error_status; return end else @@ -3383,7 +3639,11 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') end end end - if isempty(tracetdi.data) || isempty(tracetdi.dim) || ischar(tracetdi.data) + gdat_data.help = tracetdi.help; + gdat_data.status_mds = tracetdi.status; + if mod(gdat_data.status_mds,2) == 0 + error_status = 312; + gdat_data.status = error_status; return end gdat_data.units = tracetdi.units; @@ -3420,10 +3680,14 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if (gdat_params.nverbose>=1) disp(['should not be here in vol cases with data_request = ' data_request_eff]); end + error_status = 313; + gdat_data.status = error_status; return end end gdat_data.t = gdat_data.dim{mapping_for_tcv.gdat_timedim}; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) [gdat_data] = gdat2time_out(gdat_data,1,{'volume_edge'}); elseif ~isfield(gdat_data.gdat_params,'time_out') @@ -3447,6 +3711,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') % If the rtccode/tools not in paths use sauter's link % need: get_scd_mems.m % + gdat_data.help = ''; + gdat_data.status_mds = 2; aaa=which('get_scd_mems'); if isempty(aaa) error('no path for get_scd_mems') @@ -3460,16 +3726,20 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') end end gdat_data.data_fullpath = sprintf('used %s with patterns specified in source gdat_params',aaa); + gdat_data.status_mds = 1; catch % to make sure close and disconnect even if error, since connects to scd end + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; mdsclose; - mdsdisconnect; - + mdsdisconnect; % because connected to rtc/scd %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'sxr', 'mpx', 'radcam'} + gdat_data.help = ''; + gdat_data.status_mds = 2; if any(contains(data_request_eff,{'mpx','radcam'})) % effective source chosen through parameter 'source' within 'sxr' gdat_data.gdat_params.source = data_request_eff; @@ -3485,6 +3755,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if gdat_data.gdat_params.nverbose>=1 warning(['source = ' gdat_data.gdat_params.source ' not expected with data_request= ' data_request_eff]) end + error_status = 321; + gdat_data.status = error_status; return end % time_out: times at which to provide output data, if 2 values provided, return all values within that time interval @@ -3656,8 +3928,13 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.(gdat_data.gdat_params.camera{i}).label = sprintf('radcam %s nb chords: %d', ... gdat_data.gdat_params.camera{i},numel(gdat_data.(gdat_data.gdat_params.camera{i}).x)); end + gdat_data.status_mds = 1; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; case {'mpx', 'dmpx'} + gdat_data.help = ''; + gdat_data.status_mds = 2; gdat_data.gdat_params.source = 'mpx'; if ~isfield(gdat_data.gdat_params,'camera') || isempty(gdat_data.gdat_params.camera) gdat_data.gdat_params.camera = 'top'; @@ -3668,6 +3945,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if gdat_data.gdat_params.nverbose>=3 disp(['liuqe_version = ' liuqe_version ' not supported for data_request= ' data_request_eff]); end + error_status = 331; + gdat_data.status = error_status; return end t_int = [0 10]; % starts from 0 otherwise mpxdata gives data from t<0 @@ -3685,6 +3964,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if gdat_data.gdat_params.nverbose>=1 warning('problem with mpxdata') end + error_status = 332; + gdat_data.status = error_status; return end gdat_data.units = {'au'}; % not known at this stage @@ -3719,8 +4000,13 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') char(10) gdat_data.data_fullpath]; gdat_data.x = gdat_data.dim{1}; end + gdat_data.status_mds = 1; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; case 'xtomo' + gdat_data.help = ''; + gdat_data.status_mds = 2; % so far allow string and array as 'camera' choices: % camera = [] (default, thus get XTOMOGetData defaults), 'central', [3 6] (camera numbers) camera_xtomo = []; @@ -3757,6 +4043,8 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') if gdat_data.gdat_params.nverbose>=1 warning('problem with XTOMOGetData, no data') end + error_status = 341; + gdat_data.status = error_status; return end gdat_data.t = t; @@ -3777,17 +4065,25 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.dimunits = {'chords where floor(dim{1}/10) gives camera nb and mod(dim{1},10) chord nb'; 's'}; end gdat_data.dim = {gdat_data.x; gdat_data.t}; + gdat_data.status_mds = 1; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; otherwise if gdat_data.gdat_params.nverbose>=1 warning(['camera = ' gdat_data.gdat_params.camera ' not expected with data_request= ' data_request_eff]) end + gdat_data.status_mds = 2; + error_status = 351; + gdat_data.status = error_status; return end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'transp'} + gdat_data.help = ''; + gdat_data.status_mds = 2; % read transp netcdf output file provided in source parameter and generate substructure with all variables if ~isfield(gdat_data.gdat_params,'source') || isempty(gdat_data.gdat_params.source) || ~exist(gdat_data.gdat_params.source,'file') warning([char(10) 'requires a netcdf file in ''source'' parameter' char(10)]) @@ -3815,6 +4111,9 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') end gdat_data.data_fullpath = ['.transp structure obtained from cdf2mat(gdat_data.gdat_params.source)']; gdat_data.help='Can use transp_gui(gdat_data.transp) to browse and plot'; + gdat_data.status_mds = 1; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'ttprime', 'ttprime_rho'} @@ -3839,11 +4138,15 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') gdat_data.dimunits = tracetdi.dimunits; gdat_data.units = tracetdi.units; gdat_data.request_description = 'ttprime=t*dt/dpsi'; + gdat_data.help = tracetdi.help; + gdat_data.status_mds = tracetdi.status; if isfield(gdat_data.gdat_params,'time_out') && ~isempty(gdat_data.gdat_params.time_out) [gdat_data] = gdat2time_out(gdat_data,1); elseif ~isfield(gdat_data.gdat_params,'time_out') gdat_data.gdat_params.time_out = []; end + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% case {'profnerho','profterho'} @@ -3902,16 +4205,22 @@ elseif strcmp(mapping_for_tcv.method,'switchcase') elseif ~isfield(gdat_data.gdat_params,'time_out') gdat_data.gdat_params.time_out = []; end + gdat_data.help = tracetdi.help; + gdat_data.status_mds = tracetdi.status; + gdat_data.status = 1 - mod(gdat_data.status_mds,2); + error_status = gdat_data.status; otherwise if (gdat_params.nverbose>=1); warning(['switchcase= ' data_request_eff ' not known in gdat_tcv']); end - error_status=901; + error_status = 901; + gdat_data.status = error_status; return end else if (gdat_params.nverbose>=1); warning(['TCV method=' mapping_for_tcv.method ' not known yet, contact Olivier.Sauter@epfl.ch']); end error_status=602; + gdat_data.status = error_status; return end @@ -3921,6 +4230,7 @@ gdat_data.gdat_params.help = tcv_help_parameters(fieldnames(gdat_data.gdat_param gdat_data.mapping_for.tcv = mapping_for_tcv; gdat_params = gdat_data.gdat_params; error_status=0; +gdat_data.status = error_status; return @@ -4000,8 +4310,12 @@ end % try time=mdsdata('\results::thomson:times'); + gdat_data.status_mds = 1; catch gdat_data.error_bar = []; + gdat_data.status_mds = 2; + error_status = 1001; + gdat_data.status = error_status; if strcmp(data_request_eff(1:2),'ne') tracefirrat_data = []; gdat_data.firrat=tracefirrat_data; @@ -4020,6 +4334,8 @@ if isempty(time) || ischar(time) warning('!!!!!!!!!!!!!!!!!!!!!!!!!\results::thomson:times is empty? Check') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' data_request_eff]) end + error_status = 1002; + gdat_data.status = error_status; return end @@ -4042,12 +4358,16 @@ for is = 1:nsys otherwise warning('Unrecognised thomson scattering system name: %s',systems{is}); disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' data_request_eff]) + error_status = 1003; + gdat_data.status = error_status; return end nodenameeff = ['\results::thomson' edge_str ':' data_request_eff(1:2)]; tracetdi=tdi(nodenameeff); - if isempty(tracetdi.data) || ischar(tracetdi.data) || isempty(tracetdi.dim) + data_tmp(is).help = tracetdi.help; + data_tmp(is).status_mds = tracetdi.status; + if mod(data_tmp(is).status_mds,2) == 0 data_tmp(is).data = []; data_tmp(is).error_bar = []; data_tmp(is).data_fullpath = ''; @@ -4108,6 +4428,8 @@ if strcmp(data_request_eff(1:2),'ne') disp('***********************************************************************') end end +gdat_data.status = 1 - mod(gdat_data.status_mds,2); +error_status = gdat_data.status; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [psiscatvol,psi_max] = get_thomson_psiscatvol(shot,systems,substr_liuqe,nverbose) diff --git a/matlab/gdat.m b/matlab/gdat.m index 99271c743677156ce27598a06bda6a42cf7e88a1..7a0458e83ee0020fa93af549af5442954a46faba 100644 --- a/matlab/gdat.m +++ b/matlab/gdat.m @@ -206,6 +206,14 @@ try % needed since some substructure have machine name like mapping_for gdat_data.gdat_params.machine = lower(gdat_data.gdat_params.machine); end + if ~isfield(gdat_data,'status') + if exist('error_status','var') + gdat_data.status = error_status; + else + error_status = 0; + gdat_data.status = error_status; + end + end catch ME_gdat warning(['problems calling gdat_' lower(machine_eff)]); diff --git a/matlab/tests/test_tcv_get_ids.m b/matlab/tests/test_tcv_get_ids.m index 110f1dbeb5fa712aab98bec4ae71fc69469e1c05..a187d5f8ee377294765eef927af42fd8ad94a197 100644 --- a/matlab/tests/test_tcv_get_ids.m +++ b/matlab/tests/test_tcv_get_ids.m @@ -12,7 +12,8 @@ classdef (TestTags={'tcv_imas'},SharedTestFixtures={... methods(Test) function test_get_ids_list(testCase,shot) - gg = testCase.assertWarning(@() gdat(shot,'ids'),'gdat:EmptyIDSName'); + gg = gdat(shot,'ids'); + testCase.assertTrue(gg.status~=0); testCase.assertTrue(iscell(gg.gdat_params.sources_available)); end