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_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 % 'B0'[_2,_3] = current % 'zmag'[_2,_3] = vertical position of the center of the plasma (magnetic axis) % 'rmag'[_2,_3] = radial position of the center of the plasma % 'rcont'[_2,_3] = R of plama boundary vs time % 'zcont'[_2,_3] = Z of plama boundary vs time % 'vol'[_2,_3] = volume of flux surfaces % 'rhovol'[_2,_3] = sqrt(V(:,t)/V(edge,t)), normalised rho variable based on volume of flux surfaces % 'qrho'[_2,_3] = q profile on rho mesh % 'q95'[_2,_3] = q95 vs time % 'kappa', 'elon'[_2,_3] = edge elongation vs time % 'delta', 'triang'[_2,_3] = edge averaged triangularity vs time % 'deltatop', 'triangtop'[_2,_3] = edge upper (top) triangularity vs time % 'deltabot', 'triangbot'[_2,_3] = edge lower (bottom) triangularity vs time % 'j_tor'[_2,_3] = J_TOR vs (R,Z,time) % 'neint' = line-integrated electron density [m/m^3] % 'nel' = line-averaged electron density [1/m^3] % 'ne'= ne raw profile on (z,t). ADD error bars in .std % 'te'= Te raw profile on (z,t). ADD error bars in .std % 'nerho'[_2,_3]= ne profile on (rho=sqrt(psi),time) mesh.Note rho is a 2D array as depends on time. ADD error bars in .std % 'terho'[_2,_3]= Te profile on (rho=sqrt(psi),time) mesh.Note rho is a 2D array as depends on time. ADD error bars in .std % 'nerhozshift'[_2,_3]= same as nerho but allows for zshift [m] in equil given by varargin{1} % 'terhozshift'[_2,_3]= same as terho but allows for zshift [m] in equil given by varargin{1} % 'profnerho' = ne smoothed or fitted , vs (rho,t) (from Thomson auto fit) % 'profterho' = te smoothed or fitted , vs (rho,t) (from Thomson auto fit) % 'neft' = ne fitted from data on rho mesh (from proffit.local_time:neft_abs) % 'neft:4' = ne fitted from data on rho mesh (from proffit.local_time:neft_abs from trial:trial_indx=4) % 'teft' = te fitted from data on rho mesh (from proffit.local_time:teft) % 'neftav' = ne fitted from averaged over time data on rho mesh (from proffit.avg_time:neft_abs) % 'teftav' = te fitted from averaged over time data on rho mesh (from proffit.avg_time:teft) % 'vtor'= Toroidal rotation of C raw profile on (rho,t). ADD error bars in .std, as well as time and rho error bars % 'vtorfit'= Toroidal rotation of C fitted profile on (rho,t) % 'vpol'= Poloidal rotation of C raw profile on (rho,t). ADD error bars in .std, as well as time and rho error bars % 'vpolfit'= Poloidal rotation of C fitted profile on (rho,t) % 'Ti' (or Tc), 'Tifit', 'ni' (or nC), 'nifit', 'zeffcxrs', 'zeffcxrsfit': similar to 'vtor' from CXRS % 'ece' = electron cyclotron emission % 'sxr' = soft x-ray emission % 'sxR' = soft x-ray emission with varargout{1} option (requires varargin{4}!) % 'MPX' = soft x-ray from wire chambers % 'IOH' = current in ohmic transformer coils IOH_1 % 'vloop' = loop voltage % 'pgyro' = ECH power for each gyro(1:9) and total (10) % % 'xx_2 or xx_3' for Liuqe2 or 3: same as above for xx related to equilibrium % 'xx_-1 or xx_-1' for FBTE values (model or shot=-1 or shot>=100000): same as above for xx related to equilibrium % % INPUT: % shot: shot number % data_type: type of the required data % % Definition of varargin depends on data_type: % % 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_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 % % OUTPUT: % % trace.data: data % trace.t: time of reference % trace.x: space of reference % trace.dim: cell array of grids, trace.dim{1}, {2}, ... % trace.dimunits: units of dimensions % trace.units: units of data % % Additional Output arguments depending on data_type % % data_type=sxR, ece: % varargout{1}: major radius: intersection/projection of the view lines with z=zmag % data_type=MPX: % varargout{1}: te be determined % % % function needed: mds functions-xtomo_geometry-get_xtomo_data (Furno's routines) % VsxrTCVradius % Example: % [ip,error_status]=loadTCVdata(shot,'Ip',1); % [sxr,error_status,R]=loadTCVdata(shot,'sxR',1); % varargout{1}=cell(1,1); error_status=1; % 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_type_eff=' '; end i_23=0; % LIUQE tree begstr = '\results::'; endstr = ''; liuqe_version = 1; 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_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" )'; liuqe_version = -1; end end if shot==-1 || (shot>=100000 && shot<200000) % requires FBTE liuqe_version = -1; begstr = 'tcv_eq( "'; endstr = '", "FBTE" )'; end % use keyword without eventual _2 or _3 extension to check for multiple possibilities % Also remove ":4" for trial_indx specification jj=strfind(data_type_eff,':'); trialindx=[]; if ~isempty(jj) ii=strmatch(data_type_eff(1:jj-1),[{'teft'},{'neft'},{'teftav'},{'neftav'}]); if ~isempty(ii) trialindx=str2num(data_type_eff(jj+1:end)); data_type_eff_noext=[data_type_eff(1:jj-1) ':trial']; else data_type_eff_noext=data_type_eff(1:end-i_23); end else data_type_eff_noext=data_type_eff(1:end-i_23); end if ~isempty(strmatch(data_type_eff_noext,[{'ip'} {'i_p'} {'xip'}],'exact')) data_type_eff_noext='Ip'; end if ~isempty(strmatch(data_type_eff_noext,[{'b0'} {'B_0'} {'Bgeom'} {'BGEOM'}],'exact')) data_type_eff_noext='B0'; end if ~isempty(strmatch(data_type_eff_noext,[{'Te'} {'t_e'} {'TE'} {'T_e'}],'exact')) data_type_eff_noext='te'; end if ~isempty(strmatch(data_type_eff_noext,[{'Te_edge'} {'TE_edge'}],'exact')) data_type_eff_noext='te_edge'; end if ~isempty(strmatch(data_type_eff_noext,[{'Ne_edge'} {'NE_edge'}],'exact')) data_type_eff_noext='ne'; end if ~isempty(strmatch(data_type_eff_noext,[{'Rcont'}],'exact')) data_type_eff_noext='rcont'; end if ~isempty(strmatch(data_type_eff_noext,[{'Zcont'}],'exact')) data_type_eff_noext='zcont'; end if ~isempty(strmatch(data_type_eff_noext,[{'Terho'}],'exact')) data_type_eff_noext='terho'; end if ~isempty(strmatch(data_type_eff_noext,[{'Terhozshift'}],'exact')) data_type_eff_noext='terhozshift'; end if ~isempty(strmatch(data_type_eff_noext,[{'SXR'}],'exact')) data_type_eff_noext='sxr'; end if ~isempty(strmatch(data_type_eff_noext,[{'ECE'}],'exact')) data_type_eff_noext='ece'; end if ~isempty(strmatch(data_type_eff_noext,[{'VOL'} {'volume'}],'exact')) data_type_eff_noext='vol'; end if ~isempty(strmatch(data_type_eff_noext,[{'RHOVOL'}],'exact')) data_type_eff_noext='rhovol'; end if ~isempty(strmatch(data_type_eff_noext,[{'q_95'} {'Q95'}],'exact')) data_type_eff_noext='q95'; end if ~isempty(strmatch(data_type_eff_noext,[{'elongation'} {'elon'}],'exact')) data_type_eff_noext='kappa'; end 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_type_eff_noext,[{'triangularity'} {'triang'}],'exact')) data_type_eff_noext='delta'; end if ~isempty(strmatch(data_type_eff_noext,[{'deltaup'} {'deltau'} {'triangtop'} {'triangu'} {'triangup'}],'exact')) data_type_eff_noext='deltatop'; end if ~isempty(strmatch(data_type_eff_noext,[{'deltalow'} {'deltal'} {'triangbot'} {'triangl'} {'trianglow'}],'exact')) data_type_eff_noext='deltabot'; end if ~isempty(strmatch(data_type_eff_noext,[{'Rmag'}],'exact')) data_type_eff_noext='rmag'; end if ~isempty(strmatch(data_type_eff_noext,[{'Zmag'}],'exact')) data_type_eff_noext='zmag'; end if ~isempty(strmatch(data_type_eff_noext,[{'MPX'}],'exact')) data_type_eff_noext='MPX'; end if ~isempty(strmatch(data_type_eff_noext,[{'ioh'} {'Ioh'} {'iot'} {'IOT'}],'exact')) data_type_eff_noext='IOH'; end if ~isempty(strmatch(data_type_eff_noext,[{'Vloop'} {'Vsurf'} {'vsurf'}],'exact')) data_type_eff_noext='vloop'; end 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_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_type_eff_noext,[{'vpol'} {'v_pol'} {'VPOL'} {'V_POL'}],'exact')) data_type_eff_noext='vi_pol'; end 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_type_eff_noext,[{'Ti'} {'ti'} {'TC'} {'tc'} {'T_C'} {'t_c'}],'exact')) data_type_eff_noext='Ti'; end 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_type_eff_noext,[{'Ni'} {'ni'} {'NC'} {'nc'} {'N_C'} {'n_c'}],'exact')) data_type_eff_noext='ni'; end 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_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_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 % nodes which have _2 and _3 equivalence, related to simpletdi case liuqe23=[{'\results::area'} {'\results::beta_pol'} {'\results::beta_tor'} ... {'\results::delta_95'} {'\results::delta_95_bot'} {'\results::delta_95_top'} ... {'\results::delta_edge'} {'\results::delta_ed_bot'} {'\results::delta_ed_top'} ... {'\results::diamag'} {'\results::i_p'} {'\results::j_tor'} ... {'\results::kappa_95'} {'\results::kappa_edge'} {'\results::kappa_zero'} ... {'\results::lambda'} {'\results::l_i'} {'\results::psi_axis'} {'\results::psi_values'} ... {'\results::q_95'} {'\results::q_edge'} {'\results::q_zero'} {'\results::rms_error'} ... {'\results::z_axis'} {'\results::r_axis'} {'\results::q_psi'} ... {'\results::total_energy'} {'\results::tor_flux'} {'\results::volume'} ... {'\results::r_contour'} {'\results::z_contour'} ... {'\results::thomson:psiscatvol'} {'\results::thomson:psi_max'}]; % nodes which have FBTE equivalence, related to simpletdi case liuqeFBTE=[{'\results::i_p'} {'\results::z_axis'} {'\results::r_axis'} {'\results::q_psi'} ... {'\results::beta_tor'} {'\results::beta_pol'} {'\results::q_95'} {'\results::l_i'} {'\results::delta_95'} ... {'\results::kappa_95'} {'\results::r_contour'} {'\results::z_contour'} {'\results::psi_axis'}]; % keywords which do not have FBTE equivalence and are returned empty noFBTE=[{'ne'} {'te'} {'nerho'} {'terho'} {'ne_edge'} {'te_edge'} {'nerho_edge'} {'terho_edge'} {'nerhozshift'} {'terhozshift'} {'profnerho'} {'profterho'} ... {'neft'} {'neft:trial'} {'teft:trial'} {'neftav:trial'} {'teftav:trial'} {'sxr'} {'sxR'} {'ece'} {'MPX'} {'IOH'} {'vloop'} {'neint'} {'nel'} ... {'vi_tor'} {'vi_torfit'} {'vi_pol'} {'vi_polfit'} {'Ti'} {'Tifit'} {'ni'} {'nifit'} {'zeffcxrs'} {'zeffcxrsfit'}]; % all keywords and corresponding case to run below TCVkeywrdall=[{'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'}]; TCVsig.iip=strmatch('Ip',TCVkeywrdall,'exact'); TCVsig.iB0=strmatch('B0',TCVkeywrdall,'exact'); TCVsig.izmag=strmatch('zmag',TCVkeywrdall,'exact'); TCVsig.irmag=strmatch('rmag',TCVkeywrdall,'exact'); TCVsig.ircont=strmatch('rcont',TCVkeywrdall,'exact'); TCVsig.izcont=strmatch('zcont',TCVkeywrdall,'exact'); TCVsig.ivol=strmatch('vol',TCVkeywrdall,'exact'); TCVsig.irhovol=strmatch('rhovol',TCVkeywrdall,'exact'); TCVsig.iqrho=strmatch('qrho',TCVkeywrdall,'exact'); TCVsig.iq95=strmatch('q95',TCVkeywrdall,'exact'); TCVsig.ikappa=strmatch('kappa',TCVkeywrdall,'exact'); TCVsig.idelta=strmatch('delta',TCVkeywrdall,'exact'); TCVsig.ideltatop=strmatch('deltatop',TCVkeywrdall,'exact'); TCVsig.ideltabot=strmatch('deltabot',TCVkeywrdall,'exact'); TCVsig.ineint=strmatch('neint',TCVkeywrdall,'exact'); TCVsig.inel=strmatch('nel',TCVkeywrdall,'exact'); TCVsig.ine=strmatch('ne',TCVkeywrdall,'exact'); TCVsig.ite=strmatch('te',TCVkeywrdall,'exact'); TCVsig.ine_edge=strmatch('ne_edge',TCVkeywrdall,'exact'); TCVsig.ite_edge=strmatch('te_edge',TCVkeywrdall,'exact'); TCVsig.inerho=strmatch('nerho',TCVkeywrdall,'exact'); TCVsig.iterho=strmatch('terho',TCVkeywrdall,'exact'); TCVsig.inerho_edge=strmatch('nerho_edge',TCVkeywrdall,'exact'); TCVsig.iterho_edge=strmatch('terho_edge',TCVkeywrdall,'exact'); TCVsig.inerhozshift=strmatch('nerhozshift',TCVkeywrdall,'exact'); TCVsig.iterhozshift=strmatch('terhozshift',TCVkeywrdall,'exact'); TCVsig.iprofnerho=strmatch('profnerho',TCVkeywrdall,'exact'); TCVsig.iprofterho=strmatch('profterho',TCVkeywrdall,'exact'); TCVsig.ineft=strmatch('neft',TCVkeywrdall,'exact'); TCVsig.ineft_trial=strmatch('neft:trial',TCVkeywrdall); TCVsig.iteft=strmatch('teft',TCVkeywrdall,'exact'); TCVsig.iteft_trial=strmatch('teft:trial',TCVkeywrdall); TCVsig.ineftav=strmatch('neftav',TCVkeywrdall,'exact'); TCVsig.ineftav_trial=strmatch('neftav:trial',TCVkeywrdall); TCVsig.iteftav=strmatch('teftav',TCVkeywrdall,'exact'); TCVsig.iteftav_trial=strmatch('teftav:trial',TCVkeywrdall); TCVsig.isxr=strmatch('sxr',TCVkeywrdall,'exact'); TCVsig.isxR=strmatch('sxR',TCVkeywrdall,'exact'); TCVsig.iece=strmatch('ece',TCVkeywrdall,'exact'); TCVsig.iMPX=strmatch('MPX',TCVkeywrdall,'exact'); TCVsig.iIOH=strmatch('IOH',TCVkeywrdall,'exact'); TCVsig.ivloop=strmatch('vloop',TCVkeywrdall,'exact'); TCVsig.ipgyro=strmatch('pgyro',TCVkeywrdall,'exact'); TCVsig.ijtor=strmatch('jtor',TCVkeywrdall,'exact'); TCVsig.ivi_tor=strmatch('vi_tor',TCVkeywrdall,'exact'); TCVsig.ivi_torfit=strmatch('vi_torfit',TCVkeywrdall,'exact'); TCVsig.ivi_pol=strmatch('vi_pol',TCVkeywrdall,'exact'); TCVsig.ivi_polfit=strmatch('vi_polfit',TCVkeywrdall,'exact'); TCVsig.iTi=strmatch('Ti',TCVkeywrdall,'exact'); TCVsig.iTifit=strmatch('Tifit',TCVkeywrdall,'exact'); TCVsig.ini=strmatch('ni',TCVkeywrdall,'exact'); TCVsig.inifit=strmatch('nifit',TCVkeywrdall,'exact'); TCVsig.izeffcxrs=strmatch('zeffcxrs',TCVkeywrdall,'exact'); TCVsig.izeffcxrsfit=strmatch('zeffcxrsfit',TCVkeywrdall,'exact'); % For each keyword, specify which case to use. As most common is 'simpletdi', fill in with this and change % only indices needed. Usually use name of case same as keyword name TCVkeywrdcase=cell(size(TCVkeywrdall)); TCVkeywrdcase(:)={'simpletdi'}; TCVkeywrdcase(TCVsig.iB0)=TCVkeywrdall(TCVsig.iB0); % through iphi TCVkeywrdcase(TCVsig.iqrho)=TCVkeywrdall(TCVsig.iqrho); % special as liuqe q_psi on psi TCVkeywrdcase(TCVsig.ivol)=TCVkeywrdall(TCVsig.ivol); % special as nodes _2 or _3 not existing with psitbx TCVkeywrdcase(TCVsig.irhovol)=TCVkeywrdall(TCVsig.irhovol); % idem vol TCVkeywrdcase(TCVsig.ine)=TCVkeywrdall(TCVsig.ine); % special as dimensions from other nodes TCVkeywrdcase(TCVsig.ite)=TCVkeywrdall(TCVsig.ite); % idem TCVkeywrdcase(TCVsig.ine_edge)=TCVkeywrdall(TCVsig.ine_edge); % special as dimensions from other nodes TCVkeywrdcase(TCVsig.ite_edge)=TCVkeywrdall(TCVsig.ite_edge); % idem TCVkeywrdcase(TCVsig.inerho)=TCVkeywrdall(TCVsig.inerho); % idem TCVkeywrdcase(TCVsig.inerho_edge)=TCVkeywrdall(TCVsig.inerho_edge); % idem TCVkeywrdcase(TCVsig.iteft_trial)=TCVkeywrdall(TCVsig.iteft_trial); % special to extract trial_indx if needed TCVkeywrdcase(TCVsig.ineft_trial)=TCVkeywrdall(TCVsig.ineft_trial); % special to extract trial_indx if needed TCVkeywrdcase(TCVsig.iteftav_trial)=TCVkeywrdall(TCVsig.iteftav_trial); % special to extract trial_indx if needed TCVkeywrdcase(TCVsig.ineftav_trial)=TCVkeywrdall(TCVsig.ineftav_trial); % special to extract trial_indx if needed TCVkeywrdcase(TCVsig.iterho)=TCVkeywrdall(TCVsig.iterho); % idem TCVkeywrdcase(TCVsig.iterho_edge)=TCVkeywrdall(TCVsig.iterho_edge); % idem TCVkeywrdcase(TCVsig.inerhozshift)=TCVkeywrdall(TCVsig.inerhozshift); % idem TCVkeywrdcase(TCVsig.iterhozshift)=TCVkeywrdall(TCVsig.iterhozshift); % idem TCVkeywrdcase(TCVsig.iprofnerho)=TCVkeywrdall(TCVsig.iprofnerho); TCVkeywrdcase(TCVsig.iprofterho)=TCVkeywrdall(TCVsig.iprofterho); TCVkeywrdcase(TCVsig.isxr)=TCVkeywrdall(TCVsig.isxr); TCVkeywrdcase(TCVsig.isxR)=TCVkeywrdall(TCVsig.isxR); TCVkeywrdcase(TCVsig.iece)=TCVkeywrdall(TCVsig.iece); TCVkeywrdcase(TCVsig.iMPX)=TCVkeywrdall(TCVsig.iMPX); TCVkeywrdcase(TCVsig.iIOH)=TCVkeywrdall(TCVsig.iIOH); TCVkeywrdcase(TCVsig.ivloop)=TCVkeywrdall(TCVsig.ivloop); TCVkeywrdcase(TCVsig.ipgyro)=TCVkeywrdall(TCVsig.ipgyro); TCVkeywrdcase(TCVsig.ijtor)=TCVkeywrdall(TCVsig.ijtor); TCVkeywrdcase(TCVsig.ivi_tor)=TCVkeywrdall(TCVsig.ivi_tor); TCVkeywrdcase(TCVsig.ivi_torfit)=TCVkeywrdall(TCVsig.ivi_torfit); TCVkeywrdcase(TCVsig.ivi_pol)=TCVkeywrdall(TCVsig.ivi_pol); TCVkeywrdcase(TCVsig.ivi_polfit)=TCVkeywrdall(TCVsig.ivi_polfit); TCVkeywrdcase(TCVsig.iTi)=TCVkeywrdall(TCVsig.iTi); TCVkeywrdcase(TCVsig.iTifit)=TCVkeywrdall(TCVsig.iTifit); TCVkeywrdcase(TCVsig.ini)=TCVkeywrdall(TCVsig.ini); TCVkeywrdcase(TCVsig.inifit)=TCVkeywrdall(TCVsig.inifit); TCVkeywrdcase(TCVsig.izeffcxrs)=TCVkeywrdall(TCVsig.izeffcxrs); TCVkeywrdcase(TCVsig.izeffcxrsfit)=TCVkeywrdall(TCVsig.izeffcxrsfit); % Information about which dimension has time, always return 2D data as (x,t) array % as most are 1D arrays with time as first index, fill in with ones and change only those needed TCVsigtimeindx=ones(size(TCVkeywrdall)); % For the 'simpletdi' cases, we need the full node in case gdat was called with full location directly % for the other cases, leave this location empty TCVsiglocation=cell(size(TCVkeywrdall)); TCVsiglocation(:)={''}; TCVsiglocation(TCVsig.iip)={'\results::i_p'}; TCVsiglocation(TCVsig.izmag)={'\results::z_axis'}; TCVsiglocation(TCVsig.irmag)={'\results::r_axis'}; TCVsiglocation(TCVsig.ircont)={'\results::r_contour'}; TCVsigtimeindx(TCVsig.ircont)=2; TCVsiglocation(TCVsig.izcont)={'\results::z_contour'}; TCVsigtimeindx(TCVsig.izcont)=2; TCVsiglocation(TCVsig.iq95)={'\results::q_95'}; TCVsiglocation(TCVsig.ikappa)={'\results::kappa_edge'}; TCVsiglocation(TCVsig.idelta)={'\results::delta_edge'}; TCVsiglocation(TCVsig.ideltatop)={'\results::delta_ed_top'}; TCVsiglocation(TCVsig.ideltabot)={'\results::delta_ed_bot'}; TCVsiglocation(TCVsig.ineint)={'\results::fir:lin_int_dens'}; TCVsiglocation(TCVsig.inel)={'\results::fir:n_average'}; %TCVsiglocation(TCVsig.iprofnerho)={'\results::THOMSON.PROFILES.AUTO:ne'}; %TCVsiglocation(TCVsig.iprofterho)={'\results::THOMSON.PROFILES.AUTO:te'}; TCVsiglocation(TCVsig.ineft)={'\results::proffit.local_time:neft_abs'}; TCVsigtimeindx(TCVsig.ineft)=2; TCVsiglocation(TCVsig.iteft)={'\results::proffit.local_time:teft'}; TCVsigtimeindx(TCVsig.iteft)=2; TCVsiglocation(TCVsig.ineftav)={'\results::proffit.avg_time:neft_abs'}; TCVsigtimeindx(TCVsig.ineftav)=2; TCVsiglocation(TCVsig.iteftav)={'\results::proffit.avg_time:teft'}; TCVsigtimeindx(TCVsig.iteftav)=2; TCVsiglocation(TCVsig.ineft_trial)=TCVsiglocation(TCVsig.ineft); TCVsigtimeindx(TCVsig.ineft_trial)=2; TCVsiglocation(TCVsig.iteft_trial)=TCVsiglocation(TCVsig.iteft); TCVsigtimeindx(TCVsig.iteft_trial)=2; TCVsiglocation(TCVsig.ineftav_trial)=TCVsiglocation(TCVsig.ineftav); TCVsigtimeindx(TCVsig.ineftav_trial)=2; TCVsiglocation(TCVsig.iteftav_trial)=TCVsiglocation(TCVsig.iteftav); TCVsigtimeindx(TCVsig.iteftav_trial)=2; if shot==-9 clear trace for i=1:length(TCVkeywrdall) fieldname_eff = lower(TCVkeywrdall{i}); keyword_eff = TCVkeywrdall{i}; ij=findstr(fieldname_eff,':'); if ~isempty(ij); fieldname_eff(ij)='_'; keyword_eff(ij:end+1)=[':i' keyword_eff(ij+1:end)] ; end trace.(fieldname_eff) = keyword_eff; end % add example for Ip trace full call trace.ipfullcall = TCVsiglocation{TCVsig.iip}; % trace.data=[]; return end % initialize order of substructures and allows just a "return" if data empty trace.data=[]; trace.x=[]; trace.t=[]; trace.dim=[]; trace.dimunits=[]; trace.units=[]; iprintwarn=0; % find index of signal called upon if strcmp(data_type_eff(1:1),'\') % in case full node name was given 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_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_type_eff(1:end-i_23)}; TCVsigtimeindx(end+1)=0; elseif ~strcmp(TCVkeywrdcase{index},'simpletdi') 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_type_eff_noext,TCVkeywrdall,'exact'); if isempty(index) disp(' ') disp('********************') disp(['no such keyword: ' data_type_eff(1:end-i_23)]) disp(' ') disp('Available keywords:') TCVkeywrdall(:) disp('********************') return end if liuqe_version==-1 && ~isempty(strmatch(TCVkeywrdall{index},noFBTE,'exact')) disp(['node ' TCVkeywrdall{index} ' not defined within FBTE']) return end end if iprintwarn 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_type_eff ' ' num2str(shot) ' ' getenv('USER') ' TCV: not in liuqe23 list'' olivier.sauter@epfl.ch < /dev/null']) disp('********') end status=ones(1,100); zmag=cell(0,0); nargineff=nargin; if iprintwarn disp('TCVsiglocation{index} in loadTCVdata') TCVsiglocation{index} end switch TCVkeywrdcase{index} %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 'simpletdi' % load TCV other data if liuqe_version==-1 mdsopen( 'pcs', shot); %synthetic shot generated with FBTE and MGAMS. else mdsopen(shot); % test if node exists 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) '")'')']) disp(['node ' TCVsiglocation{index}(1:ij-1) ' does not exist for shot = ' num2str(shot)]) return % $$$ elseif eval(['mdsdata(''getnci("\' nodenameeff ':foo","length")'')==0']) % $$$ disp(['no data for node ' nodenameeff ' for shot = ' num2str(shot)]) % $$$ return end end if strcmp(TCVsiglocation{index}(1:9),'\psitbx::') begstr = 'tcv_psitbx("'; nodenameeff=[begstr TCVsiglocation{index}(10:end) endstr]; elseif length(TCVsiglocation{index})>16 && strcmp(TCVsiglocation{index}(1:16),'\results::psitbx') begstr = 'tcv_psitbx("'; nodenameeff=[begstr TCVsiglocation{index}(18:end) endstr]; elseif strcmp(TCVsiglocation{index}(1:10),'\results::') nodenameeff=[begstr TCVsiglocation{index}(11:end) endstr]; else nodenameeff=TCVsiglocation{index}; disp(['should not have gone through here, mention this example to O. Sauter']); end tracetdi=tdi(nodenameeff); mdsclose; if isempty(tracetdi.data) || (~iscell(tracetdi.data) && (length(tracetdi.data)<=1) && isnan(tracetdi.data)) disp(['node ' nodenameeff ' is empty for shot = ' num2str(shot)]) return end trace.data=tracetdi.data; if length(tracetdi.dim)==0 % scalar trace.x=[]; trace.t=[]; elseif TCVsigtimeindx(index)>0 | length(tracetdi.dim)==1 trace.t=tracetdi.dim{max(1,TCVsigtimeindx(index))}; ix=3-TCVsigtimeindx(index); % works only for 2D arrays else % if dim=41 assumes is x (usual for TCV) if length(tracetdi.dim{1})==41 ix=1; trace.t=tracetdi.dim{2}; elseif length(tracetdi.dim{2})==41 ix=2; trace.t=tracetdi.dim{1}; elseif length(tracetdi.dim)==2 % if one has 2D or more and the other 1D, assume rho is 2D or more and time is 1D if min(size(tracetdi.dim{1}))==1 && (min(size(tracetdi.dim{2}))>1 || length(size(tracetdi.dim{2}))>2) ix=2; trace.t=tracetdi.dim{1}; disp(['assumes time array is 1D array, so x from dim{' num2str(ix) '}']) elseif min(size(tracetdi.dim{2}))==1 && (min(size(tracetdi.dim{1}))>1 || length(size(tracetdi.dim{1}))>2) ix=1; trace.t=tracetdi.dim{2}; disp(['assumes time array is 1D array, so x from dim{' num2str(ix) '}']) elseif tracetdi.dim{1}(end)<1.1 && tracetdi.dim{2}(end)>1.1 ix=1; trace.t=tracetdi.dim{2}; disp(['assumes x array is 1D array with max <1.1']) elseif tracetdi.dim{1}(end)>1.1 && tracetdi.dim{2}(end)<1.1 ix=2; trace.t=tracetdi.dim{1}; disp(['assumes x array is 1D array with max <1.1']) elseif length(size(tracetdi.dim{1}))==2 && min(size(tracetdi.dim{1}))==1 && length(size(tracetdi.dim{2}))==2 && min(size(tracetdi.dim{2}))==1 % if both are 1D arrays, assumes time array with values having most number of digits ab1=num2str(tracetdi.dim{1}-fix(tracetdi.dim{1})); ab2=num2str(tracetdi.dim{2}-fix(tracetdi.dim{2})); if size(ab1,2)<size(ab2,2); ix=1; trace.t=tracetdi.dim{2}; else ix=2; trace.t=tracetdi.dim{1}; end disp(['assumes time array has more digits, so x from dim{' num2str(ix) '}']) end end end if length(tracetdi.dim)==2 trace.x=tracetdi.dim{ix}; % make sure data is of (x,t) if ix==2 % transpose data trace.data=trace.data'; end elseif length(tracetdi.dim)>2 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') else if max(1,TCVsigtimeindx(index))~=1 disp('Problems in loadTCVdata, max(1,TCVsigtimeindx(index)) should be 1') end end if length(tracetdi.dim)==1 trace.dim=[{trace.t}]; trace.dimunits=tracetdi.dimunits(1); elseif length(tracetdi.dim)==2 trace.dim=[{trace.x} ; {trace.t}]; trace.dimunits=[tracetdi.dimunits(ix) ; tracetdi.dimunits((2-ix)+1)]; else trace.dim=tracetdi.dim; trace.dimunits=tracetdi.dimunits; end % 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; end trace.name=[num2str(shot) ';' nodenameeff]; error_status=0; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'ne','te'} % ne or Te from Thomson data on raw z mesh vs (z,t) mdsopen(shot); if strcmp(TCVkeywrdcase{index},'ne') nodenameeff='\results::thomson:ne'; tracetdi=tdi(nodenameeff); tracestd=tdi('\results::thomson:ne:error_bar'); else 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'; trace.name=[num2str(shot) ';' nodenameeff]; % add correct dimensions try time=mdsdata('\results::thomson:times'); catch warning('Problems with \results::thomson:times') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' TCVkeywrdcase{index}]) return end if isempty(time) || ischar(time) thomsontimes=time warning('!!!!!!!!!!!!!!!!!!!!!!!!!\results::thomson:times is empty? Check') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' TCVkeywrdcase{index}]) return end z=mdsdata('\diagz::thomson_set_up:vertical_pos'); trace.dim=[{z};{time}]; trace.dimunits=[{'Z [m]'} ; {'time [s]'}]; trace.x=z; trace.t=time; % 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; end mdsclose('mdsip'); %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'ne_edge','te_edge'} % ne or Te from Thomson.edge data on raw z mesh vs (z,t) mdsopen(shot); if strcmp(TCVkeywrdcase{index},'ne_edge') nodenameeff='\results::thomson.edge:ne'; tracetdi=tdi(nodenameeff); tracestd=tdi('\results::thomson.edge:ne:error_bar'); 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'; trace.name=[num2str(shot) ';' nodenameeff]; % add correct dimensions try time=mdsdata('\results::thomson:times'); catch warning('Problems with \results::thomson:times') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' TCVkeywrdcase{index}]) return end if isempty(time) || ischar(time) thomsontimes=time warning('!!!!!!!!!!!!!!!!!!!!!!!!!\results::thomson:times is empty? Check') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' TCVkeywrdcase{index}]) return end z=mdsdata('\diagz::thomson_set_up.edge:vertical_pos'); trace.dim=[{z};{time}]; trace.dimunits=[{'Z [m]'} ; {'time [s]'}]; trace.x=z; trace.t=time; % 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; end mdsclose('mdsip'); %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'nerho','terho'} % ne or Te from Thomson data on rho=sqrt(psi_normalised) mesh: (rho,t) mdsopen(shot); try time=mdsdata('\results::thomson:times'); catch warning('Problems with \results::thomson:times') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' TCVkeywrdcase{index}]) return end if isempty(time) || ischar(time) thomsontimes=time warning('!!!!!!!!!!!!!!!!!!!!!!!!!\results::thomson:times is empty? Check') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' TCVkeywrdcase{index}]) return end if strcmp(TCVkeywrdcase{index},'nerho') nodenameeff='\results::thomson:ne'; tracetdi=tdi(nodenameeff); if isempty(tracetdi.data) ishot=mdsopen(shot) tracetdi=tdi(nodenameeff) end nodenameeff='\results::thomson:ne; error_bar ; fir_thom_rat; (ne,std)*fir_thom_rat'; tracestd=tdi('\results::thomson:ne:error_bar'); 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') end else tracefirrat=tdi('\results::thomson:fir_thom_rat'); if isempty(tracefirrat.data) || ischar(tracefirrat.data) disp('problem with \results::thomson.profiles.auto:fir_thom_rat: empty') tracefirrat.dim{1}=[]; else tracefirrat.dim{1}=time; end end if ~isempty(tracefirrat.data) || ischar(tracefirrat.data) tracefirrat_data=NaN*ones(size(tracetdi.dim{1})); itim=iround(time,tracefirrat.dim{1}); tracefirrat_data(itim)=tracefirrat.data; else tracefirrat_data=NaN; end else nodenameeff='\results::thomson:te'; tracetdi=tdi(nodenameeff); nodenameeff='\results::thomson:te; error_bar'; tracestd=tdi('\results::thomson:te:error_bar'); end trace.data=tracetdi.data'; % Thomson data as (t,z) trace.std=tracestd.data'; if strcmp(TCVkeywrdcase{index},'nerho') trace.firrat=tracefirrat_data; trace.data_abs=trace.data*diag(tracefirrat_data); trace.std_abs=trace.std*diag(tracefirrat_data); end trace.name=[num2str(shot) ';' nodenameeff]; % add correct dimensions % construct rho mesh psi_max=tdi(['\results::thomson:psi_max' endstr]); psiscatvol=tdi(['\results::thomson:psiscatvol' endstr]); if ~isempty(psiscatvol.data) && ~ischar(psiscatvol.data) && ~isempty(psi_max.data) && ~ischar(psi_max.data) for ir=1:length(psiscatvol.dim{2}) rho(ir,:)= sqrt(1.-psiscatvol.data(:,ir)./psi_max.data(:))'; end else rho=NaN; end trace.dim=[{rho};{time}]; trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; trace.x=rho; trace.t=time; % 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; end mdsclose; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'nerho_edge','terho_edge'} % ne or Te from Thomson.Edge data on rho=sqrt(psi_normalised) mesh: (rho,t) mdsopen(shot); try time=mdsdata('\results::thomson:times'); catch warning('Problems with \results::thomson:times') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' TCVkeywrdcase{index}]) return end if isempty(time) || ischar(time) thomsontimes=time warning('!!!!!!!!!!!!!!!!!!!!!!!!!\results::thomson:times is empty? Check') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' TCVkeywrdcase{index}]) return end if strcmp(TCVkeywrdcase{index},'nerho_edge') nodenameeff='\results::thomson.edge:ne'; tracetdi=tdi(nodenameeff); if isempty(tracetdi.data) || ischar(tracetdi.data) ishot=mdsopen(shot) tracetdi=tdi(nodenameeff) end nodenameeff='\results::thomson.edge:ne; error_bar ; fir_thom_rat; (ne,std)*fir_thom_rat'; tracestd=tdi('\results::thomson.edge:ne:error_bar'); 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') end else tracefirrat=tdi('\results::thomson.edge:fir_thom_rat'); tracefirrat.dim{1}=time; end if ~isempty(tracetdi.dim) tracefirrat_data=NaN*ones(size(tracetdi.dim{1})); else tracefirrat_data=[]; end if ~isempty(tracefirrat.data) && ~ischar(tracefirrat.data) itim=iround(time,tracefirrat.dim{1}); tracefirrat_data(itim)=tracefirrat.data; end else nodenameeff='\results::thomson.edge:te'; tracetdi=tdi(nodenameeff); nodenameeff='\results::thomson.edge:te; error_bar'; tracestd=tdi('\results::thomson.edge:te:error_bar'); end if ~ischar(tracetdi.data); trace.data=tracetdi.data'; end % Thomson.Edge data as (t,z) trace.std=tracestd.data'; if strcmp(TCVkeywrdcase{index},'nerho') trace.firrat=tracefirrat_data; trace.data_abs=trace.data*diag(tracefirrat_data); trace.std_abs=trace.std*diag(tracefirrat_data); end trace.name=[num2str(shot) ';' nodenameeff]; % add correct dimensions % construct rho mesh psi_max=tdi(['\results::thomson.edge:psi_max' endstr]); psiscatvol=tdi(['\results::thomson.edge:psiscatvol' endstr]); if ~isempty(psiscatvol.data) && ~ischar(psiscatvol.data) for ir=1:length(psiscatvol.dim{2}) rho(ir,:)= sqrt(1.-psiscatvol.data(:,ir)./psi_max.data(:))'; end trace.dim=[{rho};{time}]; trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; trace.x=rho; trace.t=time; % 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; end else trace.dim={}; trace.dimunits={}; trace.x=[]; trace.t=[]; trace.units={}; end mdsclose; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'nerhozshift','terhozshift'} % ne or Te from Thomson data on rho=sqrt(psi_normalised) mesh: (rho,t) % allow for z shift of equil if nargin>=3 & ~isempty(varargin{1}) zshift=varargin{1}; else zshift=0.; end mdsopen(shot); try time=mdsdata('\results::thomson:times'); catch warning('Problems with \results::thomson:times') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' TCVkeywrdcase{index}]) return end if isempty(time) || ischar(time) thomsontimes=time warning('!!!!!!!!!!!!!!!!!!!!!!!!!\results::thomson:times is empty? Check') disp(['!!!!!!!!!!!!!!!!!!!!!!!!! cannot continue with ' TCVkeywrdcase{index}]) return end if strcmp(TCVkeywrdcase{index},'nerhozshift') nodenameeff='\results::thomson:ne'; tracetdi=tdi(nodenameeff); tracestd=tdi('\results::thomson:ne:error_bar'); 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') end else tracefirrat=tdi('\results::thomson:fir_thom_rat'); if isempty(tracefirrat.data) || ischar(tracefirrat.data) disp('problem with \results::thomson.profiles.auto:fir_thom_rat: empty') tracefirrat.dim{1}=[]; else tracefirrat.dim{1}=time; end end if ~isempty(tracefirrat.data) || ischar(tracefirrat.data) tracefirrat_data=NaN*ones(size(tracetdi.dim{1})); itim=iround(time,tracefirrat.dim{1}); tracefirrat_data(itim)=tracefirrat.data; else tracefirrat_data=NaN; end else nodenameeff='\results::thomson:te'; tracetdi=tdi(nodenameeff); tracestd=tdi('\results::thomson:te:error_bar'); end trace.data=tracetdi.data'; % Thomson data as (t,z) trace.std=tracestd.data'; if strcmp(TCVkeywrdcase{index},'nerhozshift') trace.firrat=tracefirrat_data; trace.data_abs=trace.data*diag(tracefirrat_data); trace.std_abs=trace.std*diag(tracefirrat_data); end trace.name=[num2str(shot) ';' nodenameeff]; % add correct dimensions % construct rho mesh if strcmp(endstr,'_-1') error(['in ' TCVkeywrdcase{index} ' endstr should not be ' endstr]); end psi_max=tdi(['\results::thomson:psi_max' endstr]); psiscatvol=tdi(['\results::thomson:psiscatvol' endstr]); if abs(zshift)>1e-5 % calculate new psiscatvol psitdi=tdi('\results::psi'); rmesh=psitdi.dim{1}; zmesh=psitdi.dim{2}; zthom=mdsdata('dim_of(\thomson:te,1)'); zeffshift=zshift; % set zeffshift time array same as psitdi switch length(zeffshift) case 1 zeffshift=zeffshift * ones(size(psitdi.dim{3})); case length(psitdi.dim{3}) % ok case length(psiscatvol.dim{1}) zeffshift=interp1(psiscatvol.dim{1},zeffshift,psitdi.dim{3}); otherwise disp(' bad time dimension for zshift') disp(['it should be 1 or ' num2str(length(psiscatvol.dim{1})) ' or ' num2str(length(psitdi.dim{3}))]) end for it=1:length(psiscatvol.dim{1}) itpsitdi=iround(psitdi.dim{3},psiscatvol.dim{1}(it)); psirz=psitdi.data(:,:,itpsitdi); psiscatvol0=griddata(rmesh,zmesh,psirz',0.9*ones(size(zthom)),zthom-zeffshift(itpsitdi)); psiscatvol.data(it,:)=psiscatvol0; end end if ~isempty(psiscatvol.data) && ~ischar(psiscatvol.data) && ~isempty(psi_max.data) && ~ischar(psi_max.data) for ir=1:length(psiscatvol.dim{2}) rho(ir,:)= sqrt(1.-psiscatvol.data(:,ir)./psi_max.data(:))'; end else rho=NaN; end trace.dim=[{rho};{time}]; trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; trace.x=rho; trace.t=time; % 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; end mdsclose; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'profnerho','profterho'} % vol from psitbx mdsopen(shot); error_status=1; if strcmp(TCVkeywrdcase{index},'profnerho') nodenameeff=['\results::THOMSON.PROFILES.AUTO:ne']; avers=tdi('\results::THOMSON.PROFILES.AUTO:ne:version_num'); end if strcmp(TCVkeywrdcase{index},'profterho') nodenameeff=['\results::THOMSON.PROFILES.AUTO:te']; avers=tdi('\results::THOMSON.PROFILES.AUTO:te:version_num'); end if avers.data==0 % may be because nodes not yet filled in, so call once a node ab=tdi(nodenameeff); avers=tdi([nodenameeff ':version_num']); end if avers.data>0 tracetdi=tdi(nodenameeff); if avers.data < 2.99 % for earlier version the bug made it to have logically (rho,t) if ~isempty(tracetdi.dim) && ~ischar(tracetdi.data) trace.x=tracetdi.dim{1}; trace.t=tracetdi.dim{2}; error_status=0; else error_status=2; trace.x=[]; trace.t=[]; end else trace.data=tracetdi.data'; % error in dimensions for autofits if ~isempty(tracetdi.dim) && ~ischar(tracetdi.data) disp('assumes dim{2} for x in THOMSON.PROFILES.AUTO') trace.x=tracetdi.dim{2}; trace.t=tracetdi.dim{1}; error_status=0; else trace.x=[]; trace.t=[]; error_status=2; end end else tracetdi=avers; trace.x=[]; trace.t=[]; end trace.dim=[{trace.x};{trace.t}]; trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; % 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; end trace.name=[num2str(shot) '; Thomson autfits from ' nodenameeff ]; mdsclose; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'B0'} % B0 at R0=0.88 if liuqe_version==-1 % mdsopen( 'pcs', shot); %synthetic shot generated with FBTE and MGAMS. mdsopen(shot) nodenameeff = 'tcv_eq("BZERO","FBTE")'; tracetdi=tdi(nodenameeff); trace.data = tracetdi.data; trace.t = tracetdi.dim{1}; else mdsopen(shot); nodenameeff=['\magnetics::iphi']; tracetdi=tdi(nodenameeff); R0EXP=0.88; trace.data=192.E-07 * 0.996 *tracetdi.data/R0EXP; trace.t=tracetdi.dim{1}; end trace.x=[]; %keyboard trace.dim=[{trace.t}]; trace.dimunits=[{'time [s]'}]; % 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; end trace.name=[num2str(shot) ';' nodenameeff]; mdsclose; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'qrho'} % q profile on psi from liuqe if liuqe_version==-1 mdsopen( 'pcs', shot); %synthetic shot generated with FBTE and MGAMS. else mdsopen(shot); end nodenameeff=[begstr 'q_psi' endstr]; tracetdi=tdi(nodenameeff); trace.data=tracetdi.data; trace.x=sqrt(tracetdi.dim{1}/(length(tracetdi.dim{1})-1)); trace.t=tracetdi.dim{2}; trace.dim=[{trace.x};{trace.t}]; trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; % 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; end trace.name=[num2str(shot) ';' nodenameeff]; mdsclose; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'vol'} % vol from psitbx if liuqe_version==-1 begstr = 'tcv_psitbx("'; mdsopen( 'pcs', shot); %synthetic shot generated with FBTE and MGAMS. nodenameeff=[begstr 'vol' endstr]; tracetdi=tdi(nodenameeff); else mdsopen(shot); nodenameeff=['\results::psitbx:vol']; tracetdi=tdi(nodenameeff); if i_23==2 ['LIUQE' endstr(2:2)] psi=psitbxtcv(shot,'+0',['LIUQE' endstr(2:2)]); fsd=psitbxp2p(psi,'FS'); fsg=psitbxfsg(fsd); tracetdi.data = fsg.vol.x; tracetdi.dim{1}=fsg.vol.grid.x{:}'; tracetdi.dim{2}=fsg.vol.grid.t'; end end trace.data=tracetdi.data; if isempty(tracetdi.data) || ischar(tracetdi.data) trace.x=tracetdi.dim; trace.t=tracetdi.dim; trace.dim=tracetdi.dim; else trace.x=tracetdi.dim{1}; trace.t=tracetdi.dim{2}; trace.dim=[{trace.x};{trace.t}]; end trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; % 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; end trace.name=[num2str(shot) ';' nodenameeff '_' num2str(liuqe_version)]; mdsclose; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'rhovol'} % vol from psitbx if liuqe_version==-1 begstr = 'tcv_psitbx("'; mdsopen( 'pcs', shot); %synthetic shot generated with FBTE and MGAMS. nodenameeff=[begstr 'vol' endstr]; tracetdi=tdi(nodenameeff); else mdsopen(shot); nodenameeff=['\results::psitbx:vol']; tracetdi=tdi(nodenameeff); if i_23==2 ['LIUQE' endstr(2:2)] psi=psitbxtcv(shot,'+0',['LIUQE' endstr(2:2)]); fsd=psitbxp2p(psi,'FS'); fsg=psitbxfsg(fsd); tracetdi.data = fsg.vol.x; tracetdi.dim{1}=fsg.vol.grid.x{:}'; tracetdi.dim{2}=fsg.vol.grid.t'; end end trace.data=tracetdi.data; for i=1:size(tracetdi.data,2) trace.data(:,i)=sqrt(tracetdi.data(:,i)./tracetdi.data(end,i)); end trace.x=tracetdi.dim{1}; trace.t=tracetdi.dim{2}; trace.dim=[{trace.x};{trace.t}]; trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; % 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; end trace.name=[num2str(shot) '; sqrt(V/Va) from ' nodenameeff '_' num2str(liuqe_version)]; mdsclose; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'sxr','sxR'} % load TCV soft x-ray data if nargin>=3 & ~isempty(varargin{1}) i1=varargin{1}(1); i2=varargin{1}(2); else i1=1; i2=20; end if nargin>=4 & ~isempty(varargin{2}) status=varargin{2}; else status=ones(i2-i1+1,1); end % camera selection: 1-10. each camera has 20 channels icamera=[0 1 0 0 0 0 0 0 0 0]; %index of the camera to use 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_type_eff,'sxR') if nargin>=5 & ~isempty(varargin{3}) zmag=varargin{3}; else zmag=loadTCVdata(shot,['zmag' '_' num2str(liuqe_version)]); end t_1=zmag.t(1); t_2=zmag.t(end); [xtomo_signal,t]=get_xtomo_data(shot,t_1,t_2,13e-6*16,icamera,angfact); data=interp1(zmag.t,zmag.data,t'); radius.data=VsxrTCVradius(data,xchord,ychord)'; radius.t=t'; varargout{1}={radius}; trace.R=radius.data; else t_1=0.001; t_2=3; [xtomo_signal,t]=get_xtomo_data(shot,t_1,t_2,13e-6*16, ... icamera,angfact); end end trace.data=xtomo_signal; trace.x=[1:size(trace.data,1)]'; trace.t=t'; trace.dim=[{trace.x} ; {trace.t}]; trace.dimunits=[{'channel #'} ; {'time [s]'}]; trace.name=[num2str(shot) ';' 'get_xtomo_data']; error_status=0; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 'ece' % load TCV ECE data % Status=1 => Not Read Yet mdsopen(shot); if ~isempty(find(status == 1)) if eval(['~mdsdata(''node_exists("\\RESULTS::ECE:rho")'')']) disp(['node \RESULTS::ECE:rho does not exist for shot = ' num2str(shot)]) return end if eval(['mdsdata(''getnci("\\RESULTS::ECE:rho","length")'')==0']) disp(['no data for \RESULTS::ECE:rho for shot = ' num2str(shot)]) return end [TE_ECE,TE_ECE_ERR,RHO,R,T,TE_THOM,TE_THOM_ERR,Fcentral,CAL]=ece_te ... (shot,[0.1 0.29],10,10); end a=min(find(R(:,1)>=0)); b=max(find(R(:,1)>=0)); trace.data=TE_ECE(a:b,:)'; trace.t=T(a:b); trace.x=[1:size(trace.data,1)]'; trace.dim=[{trace.x} ; {trace.t}]; trace.dimunits=[{'channel #'} ; {'time [s]'}]; trace.R=R(a:b,:)'; trace.name=[num2str(shot) ';' '\results::ece...']; radius.data=trace.R; radius.t=trace.t; varargout{1}={radius}; 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; end mdsclose; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 'MPX' % load TCV MPX data % Status=1 => Not Read Yet if isempty(zmag) zmag=loadTCVdata(shot,'zmag'); end t_1=zmag.t(1); t_2=zmag.t(end); if ~isempty(find(status == 1)) mdsopen(shot); keyboard signal=get_mds_mio('MPX',[t_1 t_2]); mdsclose; trace.data=signal.data; for i=1:size(signal.dim{2},2) trace.t(:,i)=signal.dim{1}; end end trace.dim{1}={trace.t}; trace.dimunits={'time [s]'}; trace.name=[num2str(shot) ';' 'get_mds_mio(MPX)']; [xchord,ychord]=mpx_geometry; varargout{1}={VsxrTCVradius(zmag.data,xchord,ychord)}; error_status=0; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 'IOH' % Ohmic transformer current mdsopen(shot); nodenameeff=[{'\magnetics::ipol[*,$1]'} {'OH_001'}]; tracetdi=tdi(nodenameeff{:}); trace.data=tracetdi.data; trace.x=[]; trace.t=tracetdi.dim{1}; trace.dim=tracetdi.dim; trace.dimunits={'time [s]'}; % 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; end trace.name=[num2str(shot) ';' nodenameeff{1} ',' nodenameeff{2}]; mdsclose; error_status=0; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 'vloop' % Loop voltage mdsopen(shot); nodenameeff=[{'\magnetics::vloop[*,$1]'} {'001'}]; tracetdi=tdi(nodenameeff{:}); trace.data=tracetdi.data; trace.x=[]; trace.t=tracetdi.dim{1}; trace.dim=tracetdi.dim; trace.dimunits={'time [s]'}; % 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; end trace.name=[num2str(shot) ';' nodenameeff{1} ',' nodenameeff{2}]; mdsclose; error_status=0; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 'pgyro' % ECH power for each gyro(1:9) and total (10) mdsopen(shot); nodenameeff=[{'\results::toray.input:p_gyro'}]; tracetdi=tdi(nodenameeff{:}); trace.data=tracetdi.data; trace.x=[]; trace.t=tracetdi.dim{1}; trace.dim=tracetdi.dim; trace.dimunits=tracetdi.dimunits; % 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; end trace.name=[num2str(shot) ';' nodenameeff]; mdsclose; error_status=0; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case 'jtor' % \results::j_tor , 3-D so need to specify time dim index mdsopen(shot); nodenameeff=[{'\results::j_tor'} endstr]; tracetdi=tdi(nodenameeff{:}); trace.data=tracetdi.data; trace.x=tracetdi.dim{1}; trace.t=tracetdi.dim{3}; trace.dim=tracetdi.dim; trace.dimunits=tracetdi.dimunits; % 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; end trace.name=[num2str(shot) ';' nodenameeff]; mdsclose; error_status=0; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'neft:trial','teft:trial','neftav:trial','teftav:trial'} % trial indx mdsopen(shot); eval(['nodenameeff={''' TCVsiglocation{index} ':trial''};']); tracetdi=tdi(nodenameeff{:}); if isempty(trialindx) error('trialindx should not be empty, check call or ask O. Sauter'); end trace.data=tracetdi.data(:,:,trialindx+1); trace.x=tracetdi.dim{1}; trace.t=tracetdi.dim{2}; trace.dim=tracetdi.dim(1:2); trace.dimunits=tracetdi.dimunits(1:2); % 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; end trace.name=[num2str(shot) ' ; ' nodenameeff{:} ' ; trialindx=' num2str(trialindx) ]; mdsclose; error_status=0; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& case {'vi_tor', 'vi_torfit', 'vi_pol', 'vi_polfit', 'Ti', 'Tifit', 'ni', 'nifit', 'zeffcxrs', 'zeffcxrsfit'} proffit = ''; kwd_eff = TCVkeywrdcase{index}; ii=strfind(kwd_eff,'fit'); if ~isempty(ii); proffit = ':proffit'; kwd_eff = kwd_eff(1:ii-1); end if strcmp(kwd_eff,'zeffcxrs'); kwd_eff = 'zeff'; end mdsopen(shot); eval(['nodenameeff=''\results::cxrs' proffit ':' kwd_eff endstr ''';']); tracetdi=tdi(nodenameeff); trace.data=tracetdi.data; if length(tracetdi.dim)>1; trace.x=tracetdi.dim{1}; trace.t=tracetdi.dim{2}; else trace.x=[]; trace.t=[]; end trace.dim=tracetdi.dim; trace.dimunits=tracetdi.dimunits; % 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; end trace.name=[num2str(shot) ';' nodenameeff]; % add error bars eval(['nodenameeff=''\results::cxrs' proffit ':' kwd_eff ':err' endstr ''';']); nodenameeff=[{'\results::cxrs:vi_tor:err'} endstr]; tracetdi=tdi(nodenameeff{:}); trace.std = tracetdi.data; if length(tracetdi.dim)>2; trace.std_rho = tracetdi.dim{1}; trace.std_t = tracetdi.dim{2}; else trace.std_rho = []; trace.std_t = []; end mdsclose; error_status=0; %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& otherwise % 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