diff --git a/TCV/loadTCVdata.m b/TCV/loadTCVdata.m index 5486788d3b540dbda659391985a9f30216fc4b14..c48b2446030071e57c5faa7d05f53afd02c2ae03 100644 --- a/TCV/loadTCVdata.m +++ b/TCV/loadTCVdata.m @@ -19,8 +19,10 @@ % '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 -% 'profnerho' = ne smoothed or fitted , vs (rho,t) (from Thomson fit) -% 'profterho' = te smoothed or fitted , vs (rho,t) (from Thomson fit) +% '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) % '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) @@ -47,6 +49,9 @@ % 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: % @@ -103,6 +108,9 @@ 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 @@ -157,7 +165,7 @@ liuqe23=[{'\results::i_p'} {'\results::z_axis'} {'\results::r_axis'} {'\results: % all keywords and corresponding case to run below TCVkeywrdall=[{'Ip'} {'zmag'} {'rmag'} {'rcont'} {'zcont'} {'vol'} {'rhovol'} {'qrho'} {'q95'} {'kappa'} ... {'delta'} {'deltatop'} {'deltabot'} {'neint'} ... - {'ne'} {'te'} {'nerho'} {'terho'} {'profnerho'} {'profterho'} ... + {'ne'} {'te'} {'nerho'} {'terho'} {'nerhozshift'} {'terhozshift'} {'profnerho'} {'profterho'} ... {'neft'} {'teft'} {'neftav'} {'teftav'} ... {'sxr'} {'sxR'} {'ece'} {'MPX'} {'IOH'} {'vloop'}]; TCVsig.iip=strmatch('Ip',TCVkeywrdall,'exact'); @@ -178,6 +186,8 @@ TCVsig.ine=strmatch('ne',TCVkeywrdall,'exact'); TCVsig.ite=strmatch('te',TCVkeywrdall,'exact'); TCVsig.inerho=strmatch('nerho',TCVkeywrdall,'exact'); TCVsig.iterho=strmatch('terho',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'); @@ -202,6 +212,10 @@ TCVkeywrdcase(TCVsig.ine)=TCVkeywrdall(TCVsig.ine); % special as dimensions from TCVkeywrdcase(TCVsig.ite)=TCVkeywrdall(TCVsig.ite); % idem TCVkeywrdcase(TCVsig.inerho)=TCVkeywrdall(TCVsig.inerho); % idem TCVkeywrdcase(TCVsig.iterho)=TCVkeywrdall(TCVsig.iterho); % 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); @@ -228,8 +242,8 @@ 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.iprofnerho)={'\results::th_prof_ne'}; -TCVsiglocation(TCVsig.iprofterho)={'\results::th_prof_te'}; +%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; @@ -329,17 +343,26 @@ switch TCVkeywrdcase{index} trace.t=tracetdi.dim{max(1,TCVsigtimeindx(index))}; ix=3-TCVsigtimeindx(index); % works only for 2D arrays else - % time array unknow, 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; + % if dim=41 assumes is x (usual for TCV) + if length(tracetdi.dim{1})==41 + ix=1; trace.t=tracetdi.dim{2}; - else + elseif length(tracetdi.dim{2})==41 ix=2; trace.t=tracetdi.dim{1}; + else + % time array unknow, 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 - disp(['assumes time array has more digits, so x from dim{' num2str(ix) '}']) end if length(tracetdi.dim)==2 trace.x=tracetdi.dim{ix}; @@ -368,7 +391,8 @@ switch TCVkeywrdcase{index} trace.dim=tracetdi.dim; trace.dimunits=tracetdi.dimunits; end - if isfield(tracetdi,'units'); + % 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 @@ -399,7 +423,8 @@ switch TCVkeywrdcase{index} trace.dimunits=[{'Z [m]'} ; {'time [s]'}]; trace.x=z; trace.t=time; - if isfield(tracetdi,'units'); + % 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') @@ -423,7 +448,6 @@ switch TCVkeywrdcase{index} % add correct dimensions time=mdsdata('\results::thomson:times'); % construct rho mesh - liuqe_ext psi_max=tdi(['\results::thomson:psi_max' liuqe_ext]); psiscatvol=tdi(['\results::thomson:psiscatvol' liuqe_ext]); for ir=1:length(psiscatvol.dim{2}) @@ -433,9 +457,104 @@ switch TCVkeywrdcase{index} trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; trace.x=rho; trace.t=time; - if isfield(tracetdi,'units'); + % 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 {'nerhozshift','terhozshift'} + % ne or Te from Thomson data on rho=sqrt(psi_normalised) mesh: (rho,t) + % allow for z shift of equil + if nargin>=2 & ~isempty(varargin{1}) + zshift=varargin{1}; + else + zshift=0.; + end + mdsopen(shot); + if strcmp(TCVkeywrdcase{index},'nerhozshift') + 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'); + end + trace.data=tracetdi.data'; % Thomson data as (t,z) + trace.std=tracestd.data'; + trace.name=[num2str(shot) ';' nodenameeff]; + % add correct dimensions + time=mdsdata('\results::thomson:times'); + % construct rho mesh + psi_max=tdi(['\results::thomson:psi_max' liuqe_ext]); + psiscatvol=tdi(['\results::thomson:psiscatvol' liuqe_ext]); + 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 + 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 + mdsclose + + %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& + case {'profnerho','profterho'} + % vol from psitbx + mdsopen(shot); + if strcmp(TCVkeywrdcase{index},'profnerho') + nodenameeff=['\results::THOMSON.PROFILES.AUTO:ne']; + end + if strcmp(TCVkeywrdcase{index},'profterho') + nodenameeff=['\results::THOMSON.PROFILES.AUTO:te']; + end + tracetdi=tdi(nodenameeff); + trace.data=tracetdi.data'; % error in dimensions for autofits + if ~isempty(tracetdi.dim) + trace.x=tracetdi.dim{1}; + trace.t=tracetdi.dim{2}; + else + 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 %&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& @@ -449,7 +568,8 @@ switch TCVkeywrdcase{index} trace.t=tracetdi.dim{2}; trace.dim=[{trace.x};{trace.t}]; trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; - if isfield(tracetdi,'units'); + % 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]; @@ -481,7 +601,8 @@ switch TCVkeywrdcase{index} trace.dim=[{trace.x};{trace.t}]; end trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; - if isfield(tracetdi,'units'); + % 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 liuqe_ext]; @@ -510,7 +631,8 @@ switch TCVkeywrdcase{index} trace.t=tracetdi.dim{2}; trace.dim=[{trace.x};{trace.t}]; trace.dimunits=[{'sqrt(psi)'} ; {'time [s]'}]; - if isfield(tracetdi,'units'); + % 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 liuqe_ext]; @@ -596,7 +718,8 @@ switch TCVkeywrdcase{index} radius.t=trace.t; varargout{1}={radius}; error=0; - if isfield(tracetdi,'units'); + % 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 @@ -638,7 +761,8 @@ switch TCVkeywrdcase{index} trace.t=tracetdi.dim{1}; trace.dim=tracetdi.dim; trace.dimunits={'time [s]'}; - if isfield(tracetdi,'units'); + % 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}]; @@ -656,7 +780,8 @@ switch TCVkeywrdcase{index} trace.t=tracetdi.dim{1}; trace.dim=tracetdi.dim; trace.dimunits={'time [s]'}; - if isfield(tracetdi,'units'); + % 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}];