Newer
Older
function [adata,error]=rdaAUG_eff(shot,diagname,sigtype,shotfile_exp,varargin);

Olivier Sauter
committed
% [adata,error]=rdaAUG_eff(shot,diagname,sigtype,shotfile_exp,varargin);
%
% inputs: shot,diagname,sigtype,shotfile_exp are mandatory, so specify default shotfile_exp before for example
%
% gets data using sf2sig or mdsplus (when mdsplus will be available)
% 1D arrays: assumes dimension is time
% 2D arrays: assumes data vs (x,time)
% 3D arrays: assumes data vs (x,time,hsig) (for mdsplus)
%
% 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)

Olivier Sauter
committed
% 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)
% 'area-base:yy:i' means it's an area-base type signal and if known from yy dim_of(i)
% 'time-base:yy:i' means it's a time-base type signal and if known from yy dim_of(i)

Olivier Sauter
committed
%
% for mds usage, calls: augparam (_shot, _diag, _psetname, _parameter, _experiment, _edition, _oshot, _oedition)
% for sf2 usage: help sf2par or sf2ps on ipp relevant node
% : [] empty means get signal (default),
% for mds usage: augdiag (_shot, _diag, _signame, _experiment, _edition, _t1, _t2, _oshot, _oedition)
% for sf2 usage: help sf2sig on ipp relevant node
%
% examples:
% [data,error]=rdaAUG_eff(15133,'MAG','Ipi');
% [data,error]=rdaAUG_eff(15133,'MAG','Ipi',[1 5]);
%
% set global variable: usemdsplus to decide if sf2sig or mdsplus is used:

Olivier Sauter
committed
% usemdsplus=1 except if sf2sig is a function, then usemdsplus=0
% (----begin of old comments: >> global usemdsplus
% >> usemdsplus=1 % means use mds to get data
% >> usemdsplus=0 % means use sf2sig (default if not defined)
% if ~exist('usemdsplus'); usemdsplus=0; end -----end of old comments)

Olivier Sauter
committed
%
% return: 1D array and dimensions as 1xN
% 2D array transposed (assumed were changed from C origin, this way gets usually time as 2nd)
%
%global usemdsplus

Olivier Sauter
committed
if ~exist('usemdsplus') || isempty(usemdsplus); usemdsplus=0; end

Olivier Sauter
committed
error=999;
adata.data = [];
adata.value = [];
adata.units = [];
adata.dim = [];
adata.dimunits = [];
adata.t = [];
adata.x = [];
adata_time.data = [];
adata_time.value = [];
adata_area = [];
adata.time_aug = adata_time;
adata.area = adata_area;
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
if nargin_eff>=5 & ~isempty(varargin_eff{1})
time_int=varargin_eff{1};
if nargin_eff>=6 & ~isempty(varargin_eff{2})
extra_arg_sf2sig=varargin_eff{2};

Olivier Sauter
committed
param_name=[];
param_set_name=[];
area_base=false;
area_base_name=[];
area_base_dimof=[];
time_base=false;
time_base_name=[];
time_base_dimof=[];
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);

Olivier Sauter
committed
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);

Olivier Sauter
committed
end
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')

Olivier Sauter
committed
area_base = true;
ij=findstr(varargin_eff{3},':');

Olivier Sauter
committed
if length(ij)==2
area_base_name=varargin_eff{3}(ij(1)+1:ij(2)-1);
area_base_dimof = str2num(varargin_eff{3}(ij(2)+1:end));

Olivier Sauter
committed
elseif length(ij)==1
area_base_name=varargin_eff{3}(ij(1)+1:end);

Olivier Sauter
committed
end
end
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')
ij=findstr(varargin_eff{3},':');
time_base_name=varargin_eff{3}(ij(1)+1:ij(2)-1);
time_base_dimof = str2num(varargin_eff{3}(ij(2)+1:end));
time_base_name=varargin_eff{3}(ij(1)+1:end);
did_transpose = 0;

Olivier Sauter
committed
if usemdsplus
% a_remote=mdsremotelist; does not seem sufficient if connection broken, test with 1+2
is3 = mdsvalue('1+2');
if is3 ~= 3
warning('not connected to an mds server, cannot use mds to get data')
return
end

Olivier Sauter
committed
% $$$ if ~unix('test -d /home/duval/mdsplus')
% $$$ addpath('/home/duval/mdsplus')
% $$$ end

Olivier Sauter
committed
% $$$ if ~unix('test -d /home/osauter/gdat')
% $$$ mdsconnect('localhost:8001');
% $$$ else
% $$$ mdsconnect('localhost');
% $$$ end

Olivier Sauter
committed
% extract if need raw
ij=strfind(extra_arg_sf2sig,'raw');
ask_raw = '';
if ~isempty(ij)
ask_raw = '"raw"';
end

Olivier Sauter
committed
% extract edition number if provided as '-ed',value in extra_arg_sf2sig
ij=strfind(extra_arg_sf2sig,'-ed');
ed_number = '';
if ~isempty(ij)
ed_number = num2str(sscanf(extra_arg_sf2sig(ij+5:end),'%d'));
end

Olivier Sauter
committed
if isempty(time_int)
tstart = '';
tend = '';
else
tstart = num2str(time_int(1));
tend = num2str(time_int(2));
end
if isempty(param_name) && isempty(param_set_name) && ~area_base && ~time_base

Olivier Sauter
committed
% use augsignal to get effective layout as in ISIS and sf2sig, for example for EQI/PFM
eval(['[data,error]=mdsvalue(''_rdaeff' user diagname '=augsignal(' num2str(shot) ',"' diagname '","' sigtype '","' shotfile_exp ...
'",' ed_number ',' tstart ',' tend ',_oshot' user diagname ',_oed' user diagname ',' ask_raw ')'');']);
elseif isempty(param_set_name) && ~area_base && ~time_base

Olivier Sauter
committed
% use augparam
eval(['[data,error]=mdsvalue(''_rdaeff' user diagname '=augparam(' num2str(shot) ',"' diagname '","' sigtype '","' param_name '"' ...
',"' shotfile_exp '",' ed_number ',_oshot' user diagname ',_oed' user diagname ')'');']);

Olivier Sauter
committed
% param-set, cannot get this yet with mdsvalue
disp(['cannot get param-set with mds yet (only sf2ps): ' param_set_name])
data = [];
error = 11;
% area-base or time-base, can only get dim_of at this stage
area_time_base_name = area_base_name;
area_time_base_dimof = area_base_dimof;

Olivier Sauter
committed
if ~isempty(time_base_name);
area_time_base_name = time_base_name;
area_time_base_dimof = time_base_dimof;
end
if ~isempty(area_time_base_name)
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_eff{1}(1),'%.14f') ',' num2str(varargin_eff{1}(end),'%.14f') ')'');']);

Olivier Sauter
committed
else
eval(['[data,error]=mdsvalue(''_rdaeff' user diagname '=augdiag(' num2str(shot) ',"' diagname '","' area_time_base_name '","' shotfile_exp ...

Olivier Sauter
committed
'",' ed_number ',,,_oshot' user diagname ',_oed' user diagname ')'');']);
end
if ~isempty(area_time_base_dimof)
eval(['data=mdsvalue(''dim_of(_rdaeff' user diagname ',' num2str(area_time_base_dimof) ')'');']);

Olivier Sauter
committed
else
for j=1:length(size(data))
eval(['dataj=mdsvalue(''dim_of(_rdaeff' user diagname ',' num2str(j) ')'');']);
if (prod(size(dataj))~=length(dataj))
data = dataj;

Olivier Sauter
committed
break
end
end
end
end
end
adata.data=data;
if exist('ed_number')

Olivier Sauter
committed
adata.edition_in = str2num(ed_number);
adata.edition_out = mdsvalue(['_oed' user diagname]);
if mod(error,2)==2; disp(['error even for ' diagname ' ; ' sigtype]); end
% begin some fix %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% fix some problems (seems not needed anymore with lxmdsplus.aug.ipp.mpg.de, but do with mdsplus.aug.ipp.mpg.de (so leave for some timing tests)
nb_surfaces_m1 = 40;
nb_xpoints_m1 = 4;
if strcmp(sigtype,'Lpf')
if (min(adata.data)<0*100000+3 && min(adata.data)~=0) || max(adata.data)>100000*20
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
end
if strcmp(sigtype,'LPFx')
if (min(adata.data)<1 && min(adata.data)~=0) || max(adata.data)>1000
disp(['seems to be a problem with LPFx assume ' num2str(nb_xpoints_m1+1) ' special X-points'])
adata.data(:) = nb_xpoints_m1;
end
end
% end of some fix %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Olivier Sauter
committed
%
hsig=[];
ss=size(data);
nbofdim=length(ss);

Olivier Sauter
committed
if prod(ss)==length(data); nbofdim=1; end

Olivier Sauter
committed
case 1
adata.data=reshape(adata.data,1,length(adata.data));

Olivier Sauter
committed
idim0 = 0;
eval(['time=mdsvalue(''dim_of(_rdaeff' user diagname ',' num2str(idim0) ')'');']);
if numel(time) ~= numel(adata.data)
idim0 = 1;
eval(['time=mdsvalue(''dim_of(_rdaeff' user diagname ',' num2str(idim0) ')'');']);
if numel(time) ~= numel(adata.data) && (ischar(adata.data) && isempty(strfind(lower(adata.data),'abort')))

Olivier Sauter
committed
warning(['problem with dim for: ' diagname ', ' sigtype])
end
end

Olivier Sauter
committed
time = reshape(time,1,length(time));

Olivier Sauter
committed
adata.dim = {time};

Olivier Sauter
committed
eval(['tunits=mdsvalue(''units_of(dim_of(_rdaeff' user diagname ',' num2str(idim0) '))'');']);

Olivier Sauter
committed
adata.dimunits = {tunits};
case 2
if strcmp(upper(diagname),'IDA')
% rho, time in original dimension, so do not transpose
idim_x = 0;
idim_t = 1;
else
adata.data = adata.data';
did_transpose = 1;
idim_x = 1;
idim_t = 0;
end

Olivier Sauter
committed
% transposed because of C relation and backward compatibility with sf2sig part
eval(['x=mdsvalue(''dim_of(_rdaeff' user diagname ',' num2str(idim_x) ')'');']);

Olivier Sauter
committed
if prod(size(x))==length(x); x = reshape(x,1,length(x)); end
eval(['time=mdsvalue(''dim_of(_rdaeff' user diagname ',' num2str(idim_t) ')'');']);

Olivier Sauter
committed
time = reshape(time,1,length(time));
adata.dim = {x, time};
eval(['xunits=mdsvalue(''units_of(dim_of(_rdaeff' user diagname ',' num2str(idim_x) '))'');']);
eval(['tunits=mdsvalue(''units_of(dim_of(_rdaeff' user diagname ',' num2str(idim_t) '))'');']);

Olivier Sauter
committed
adata.dimunits = {xunits, tunits};

Olivier Sauter
committed
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
% $$$ case 3
% $$$ eval(['x=mdsvalue(''dim_of(_rdaeff' user diagname ',0)'');']);
% $$$ if prod(size(x))==length(x); x = reshape(x,1,length(x)); end
% $$$ eval(['time=mdsvalue(''dim_of(_rdaeff' user diagname ',1)'');']);
% $$$ time = reshape(time,1,length(time));
% $$$ disp('3rd dimension in hsig!!!!!!!!!!!!!!!!!!!!!!!!!')
% $$$ eval(['hsig=mdsvalue(''dim_of(_rdaeff' user diagname ',2)'');']);
% $$$ if prod(size(hsig))==length(hsig); hsig = reshape(hsig,1,length(hsig)); end
% $$$ adata.dim = {x, time, hsig};
% $$$ eval(['xunits=mdsvalue(''units_of(dim_of(_rdaeff' user diagname ',0))'');']);
% $$$ eval(['tunits=mdsvalue(''units_of(dim_of(_rdaeff' user diagname ',1))'');']);
% $$$ eval(['hsigunits=mdsvalue(''units_of(dim_of(_rdaeff' user diagname ',2))'');']);
% $$$ adata.dimunits = {xunits, tunits, hsigunits};
% $$$ [zz,itime] = max(size(adata.data));
% $$$ for i=1:nbofdim
% $$$ if strcmp(adata.dimunits{i},'s'); itime = i; end
% $$$ end
% $$$ ix = min(setdiff([1:2],itime));
% $$$ ihsig = setdiff([1:nbofdim],[ix itime])
% $$$ x = adata.dim{ix};
% $$$ time = adata.dim{itime};
% $$$ hsig = adata.dim{ihsig};
% $$$ adata.dim = {x, time, hsig};
% $$$ xunits = adata.dimunits{ix};
% $$$ tunits = adata.dimunits{itime};
% $$$ hsigunits = adata.dimunits{ihsig};
% $$$ adata.dimunits = {xunits, tunits, hsigunits};

Olivier Sauter
committed
otherwise
itime = 1; % default
for i=1:nbofdim
eval(['dimarray=mdsvalue(''dim_of(_rdaeff' user diagname ',' num2str(i-1) ')'');']);
if prod(size(dimarray)) == length(dimarray)
eval(['adata.dim{' num2str(i) '}=reshape(dimarray,1,length(dimarray));']);

Olivier Sauter
committed
else
eval(['adata.dim{' num2str(i) '} = dimarray;']);

Olivier Sauter
committed
end

Olivier Sauter
committed
eval(['adata.dimunits{' num2str(i) '}=deblank(mdsvalue(''units_of(dim_of(_rdaeff' user diagname ',' num2str(i-1) '))''));']);

Olivier Sauter
committed
if strcmp(adata.dimunits{i},'s'); itime = i; end
end
x = adata.dim{min(setdiff([1:2],itime))};
time = adata.dim{itime};

Olivier Sauter
committed
adata.value = adata.data; % for backward compatibility might need to keep .value, to be checked later, .data for sure
adata.t=time;
adata.x=x;
adata.hsig=hsig;

Olivier Sauter
committed
eval(['adata.units=deblank(mdsvalue(''units_of(_rdaeff' user diagname ')''));']);

Olivier Sauter
committed
%mdsdisconnect;
% $$$ if ~unix('test -d /home/duval/mdsplus')
% $$$ rmpath('/home/duval/mdsplus')
% $$$ end

Olivier Sauter
committed
adata_time.data = [];
adata_area = [];
if isempty(param_name) && isempty(param_set_name) && ~area_base && ~time_base

Olivier Sauter
committed
% use sf2sig
if isempty(time_int)
try
if ~isempty(extra_arg_sf2sig) && ~strcmp(extra_arg_sf2sig,'[]')

Olivier Sauter
committed
eval(['[adata,adata_time, adata_area]=sf2sig(diagname,shot,sigtype,''-exp'',shotfile_exp,' extra_arg_sf2sig ');']);
else
[adata,adata_time, adata_area]=sf2sig(diagname,shot,sigtype,'-exp',shotfile_exp);
end
adata.data = adata.value; % at this stage keep both but try to work only on .data

Olivier Sauter
committed
catch ME
throw(ME)
end
else
try

Olivier Sauter
committed
if ~isempty(extra_arg_sf2sig) && ~strcmp(extra_arg_sf2sig,'[]')
eval(['[adata,adata_time, adata_area]=sf2sig(diagname,shot,sigtype,[' num2str(time_int(1)) ';' num2str(time_int(2)) ...
'] ,''-exp'',shotfile_exp,' extra_arg_sf2sig ');']);
else
[adata,adata_time, adata_area]=sf2sig(diagname,shot,sigtype,[time_int(1);time_int(end)],'-exp',shotfile_exp);
end
adata.data = adata.value; % at this stage keep both but try to work only on .data (for adata which can be from sf2.. or mds)

Olivier Sauter
committed
catch ME
throw(ME)

Olivier Sauter
committed
%%%%%%%%%%%%%%%%%%%%%%%% NEED TO DO THESE AFTER EITHER MDSPLUS or SF2SIG, after data and dims obtained %%%%%%%%%%%%%%%%%%%%%%%
% special checks
if strcmp(upper(diagname),'SXB')
% time missing one point
if length(adata.data) == length(adata_time.value)+1
adata_time.value=linspace(adata_time.range(1),adata_time.range(2),length(adata.data));
adata_time.index(2) = length(adata.data);

Olivier Sauter
committed
end
end
%
% $$$ if strcmp(upper(sigtype),'PNIQ')
% $$$ % transform 4x2 PINIs in 1:8 PINIs and total in index=9
% $$$ if (prod(size(adata.data))/length(adata_time.value) == 8)
% $$$ tmp(:,1:4) = adata.data(:,:,1);
% $$$ tmp(:,5:8) = adata.data(:,:,2);

Olivier Sauter
committed
% $$$ tmp(:,9) = sum(tmp,2);
% $$$ adata.data = tmp'; % transpose since will be transposed afterwards

Olivier Sauter
committed
% $$$ adata.dimunits = {'s','8 sources;total'};
% $$$ else
% $$$ disp('expects 8 sources in PNIQ');
% $$$ return
% $$$ end
% $$$ end

Olivier Sauter
committed
adata.time_aug = adata_time;

Olivier Sauter
committed
adata.area = adata_area;
adata.exp = shotfile_exp;
if (prod(size(adata.data))==length(adata.data))

Olivier Sauter
committed
% only time signal
adata.x = [];
adata.data=reshape(adata.data,1,length(adata.data));

Olivier Sauter
committed
if ~isempty(adata.time_aug)
adata.t=adata.time_aug.value;
else

Olivier Sauter
committed
end
if strcmp(upper(diagname),'IDA')
% rho, time in original dimension, so do not transpose
else
if length(size(adata.data))<=2;
adata.data = adata.data';
did_transpose = 1;
end % cannot transpose Nd>2 matrix
end

Olivier Sauter
committed
if ~isempty(adata.time_aug)
if length(size(adata.data))<=2;
adata.x=[1:prod(size(adata.data))/length(adata_time.value)];

Olivier Sauter
committed
else
adata.x = [];
end
adata.t=adata.time_aug.value;
else
adata.x=[1:size(adata.data,1)];
adata.t=[1:size(adata.data,2)];

Olivier Sauter
committed
end
if ~isempty(adata.area)
adata.x = adata.area.value{1};
end

Olivier Sauter
committed
end
adata.units = adata.unit;
elseif isempty(param_set_name) && ~area_base && ~time_base

Olivier Sauter
committed
% use sf2par
try
if ~isempty(extra_arg_sf2sig) && ~strcmp(extra_arg_sf2sig,'[]')
eval(['[adata]=sf2par(diagname,shot,param_name,sigtype,''-exp'',shotfile_exp,' extra_arg_sf2sig ');']);
else
eval(['[adata]=sf2par(diagname,shot,param_name,sigtype,''-exp'',shotfile_exp);']);
end
adata.data = adata.value;

Olivier Sauter
committed
catch ME

Olivier Sauter
committed
end

Olivier Sauter
committed
% use sf2ps
try
if ~isempty(extra_arg_sf2sig) && ~strcmp(extra_arg_sf2sig,'[]')
eval(['[adata]=sf2ps(diagname,shot,param_set_name,sigtype,''-exp'',shotfile_exp,' extra_arg_sf2sig ');']);
else
eval(['[adata]=sf2ps(diagname,shot,param_set_name,sigtype,''-exp'',shotfile_exp);']);
end
adata.data = adata.value;

Olivier Sauter
committed
catch ME

Olivier Sauter
committed
% area-base
try
if ~isempty(extra_arg_sf2sig) && ~strcmp(extra_arg_sf2sig,'[]')
eval(['[adata]=sf2ab(diagname,shot,area_base_name,''-exp'',shotfile_exp,' extra_arg_sf2sig ');']);
[adata]=sf2ab(diagname,shot,area_base_name,'-exp',shotfile_exp);

Olivier Sauter
committed
adata.data = adata.value{1};
adata.value = adata.data;
catch ME
throw(ME)
end
else
% time-base
try
if ~isempty(extra_arg_sf2sig) && ~strcmp(extra_arg_sf2sig,'[]')
eval(['[adata]=sf2tb(diagname,shot,time_base_name,''-exp'',shotfile_exp,' extra_arg_sf2sig ');']);
[adata]=sf2tb(diagname,shot,time_base_name,'-exp',shotfile_exp);

Olivier Sauter
committed
catch ME
throw(ME)

Olivier Sauter
committed
end

Olivier Sauter
committed
if strcmp(upper(sigtype),'PNIQ')
% transform 4x2 PINIs in 1:8 PINIs and total in index=9
if (prod(size(adata.data))/length(adata.t) == 8)
tmp(:,1:4) = adata.data(:,:,1);
tmp(:,5:8) = adata.data(:,:,2);
tmp(:,9) = sum(tmp,2);
adata.data = tmp;
adata.value = adata.data;
adata.x = [1:9];
adata.dim = {adata.t, adata.x};
adata.dimunits = {'s','8 sources;total'};
else
disp('expects 8 sources in PNIQ');
return
end
if strcmp(diagname,'IDA') && strcmp(sigtype,'rhot')
% In some shots, rhot was multiplied by 1e6, so fix here:
if max(max(adata.data)) > 1e5
adata.data = adata.data / 1e6;
end
end