function [torbeam] = read_ech_py(shot,varargin); % % [torbeam] = read_ech_py(shot,varargin); % % loads angles and powers from ECS/ECN for given shot % transforms ECS/ECN into theta,phi of Torbeam % % varargin{1}: time array for Torbeam relevant data output % varargin{2}: min_power_on to decide if the beam was on at a given time (default P>=2e3) % varargin{3}: source for TB angles, etc: 0 (default, aug_setval2tp_mex function useing setmirrors library); 1 (TBP/xxx/git shotfile) % if nargin==0 error('read_ech_py requires at least shot number as input'); else torbeam.shot = shot; end ecsystems=[4,4]; nbgy = sum(ecsystems); igy_seq=[1:ecsystems(1);ecsystems(1)+1:ecsystems(1)+ecsystems(2)]'; load_option = 0, if nargin >= 4 && ~isempty(varargin{3}) load_option = varargin{3}; end torbeam.read_ech_options.load_option = load_option; % Load parameters independent of angles, like power etc: % tec_min = NaN; tec_max = NaN; ecsystems=[4,4]; nbgy = sum(ecsystems); igy_seq=[1:ecsystems(1);ecsystems(1)+1:ecsystems(1)+ecsystems(2)]'; for isys=1:length(ecsystems) isyseff = isys; if isys==1 && shot > 33725; isyseff = 3; end for igy=1:ecsystems(isys) ps_source = ['P_sy' num2str(isyseff) '_g' num2str(igy)]; if isyseff == 1 aaon=gdat(shot,{'ECS',ps_source,'','param:gy_on'},'machine','aug'); else aaon=gdat(shot,{'ECS',ps_source,'','param:gy_HV_on'},'machine','aug'); end if isempty(aaon.data) warning(['problem with detecting if gy_on for isyseff = ' num2str(isyseff) ', igy = ',num2str(igy)]); end torbeam.is_gyro_on(igy_seq(igy,isys)) = false; if aaon.data; torbeam.is_gyro_on(igy_seq(igy,isys)) = true; end if torbeam.is_gyro_on(igy_seq(igy,isys)) if isys==1 aa=gdat(shot,{'ECS',['PG' num2str(igy)]},'machine','aug'); else aa=gdat(shot,{'ECS',['PG' num2str(igy) 'N']},'machine','aug'); end torbeam.pow{igy_seq(igy,isys)}.data = aa.data; torbeam.pow{igy_seq(igy,isys)}.t = aa.t; tec_min = min(min(torbeam.pow{igy_seq(igy,isys)}.t),tec_min); tec_max = max(max(torbeam.pow{igy_seq(igy,isys)}.t),tec_max); else torbeam.pow{igy_seq(igy,isys)}.data = []; torbeam.pow{igy_seq(igy,isys)}.t = []; end end end if ~isfinite(tec_min) || ~isfinite(tec_max) warning('no good time interval') tec_min tec_max return end tec_min = max(tec_min, 0.); if tec_max <= tec_min warning('no good time interval') tec_min tec_max return end if nargin>=2 && ~isempty(varargin{1}) time_for_torbeam = varargin{1}; else time_for_torbeam = linspace(tec_min,tec_max,round(tec_max-tec_min)*3e2); % aim at 3ms end torbeam.t = time_for_torbeam; torbeam.theta_t = NaN(nbgy,length(time_for_torbeam)); torbeam.phi_t = NaN(nbgy,length(time_for_torbeam)); torbeam.err_status_t = NaN(nbgy,length(time_for_torbeam)); isys = 1; for igy=1:ecsystems(isys) igy_1_8 = igy_seq(igy,isys); if torbeam.is_gyro_on(igy_seq(igy,isys)) % linear interpolation for power to avoid over/under shoot torbeam.power_t(igy_1_8,:) = interpos(-21,torbeam.pow{igy_1_8}.t,torbeam.pow{igy_1_8}.data,torbeam.t); end end isys = 2; for igy=1:ecsystems(isys) igy_1_8 = igy_seq(igy,isys); if torbeam.is_gyro_on(igy_seq(igy,isys)) torbeam.power_t(igy_1_8,:) = interpos(-21,torbeam.pow{igy_1_8}.t,torbeam.pow{igy_1_8}.data,torbeam.t); end end if nargin>=3 && ~isempty(varargin{2}) min_power_on = varargin{2}; else min_power_on = 2e3; end torbeam.read_ech_options.min_power_on = min_power_on; torbeam.beam_on = false.*ones(size(torbeam.power_t)); torbeam.beam_on(torbeam.power_t >= min_power_on) = true; torbeam.t_some_beam_on = torbeam.t(any(torbeam.beam_on,1)); switch load_option case 0 torbeam.rfmod = - ones(1,8); % 1 for O-mode, -1 for X-mode torbeam.tb_par.('xxb') = [238., 238., 231.1, 231.1, 236.4, 236.4, 236.4 ,236.4]; torbeam.tb_par.('xzb') = [0., 0., 0., 0., 32., 32., -32., -32.]; torbeam.tb_par.('xryyb') = [129.4,129.4,129.4, 129.4, 85.4, 85.4, 85.4, 85.4]; % 85.0 in GT's py, 85.4 in tb_gui saved files torbeam.tb_par.('xrzzb') = [129.4,129.4,129.4, 129.4, 85.4, 85.4, 85.4, 85.4]; torbeam.tb_par.('xwyyb') = [2.97, 2.97, 2.97, 2.97, 2.55, 2.55, 2.55, 2.55]; torbeam.tb_par.('xwzzb') = [2.97, 2.97, 2.97, 2.97, 2.55, 2.55, 2.55, 2.55]; % from Ringberg 2018 Martin Schubert torbeam.tb_par.('xryyb') = [129.4,129.4,129.4, 129.4, 122.7, 122.7, 139.7, 139.7]; % 85.0 in GT's py, 85.4 in tb_gui saved files torbeam.tb_par.('xrzzb') = [129.4,129.4,129.4, 129.4, 122.7, 122.7, 139.7, 139.7]; torbeam.tb_par.('xwyyb') = [2.97, 2.97, 2.97, 2.97, 3.589, 3.589, 3.196, 3.196]; torbeam.tb_par.('xwzzb') = [2.97, 2.97, 2.97, 2.97, 3.589, 3.589, 3.196, 3.196]; % $$$ torbeam.tr2as = { ... % $$$ 'XECECH', 'RR_n'; 'ZECECH', 'ZZ_n'; ... % $$$ 'ECB_WIDTH_HOR', 'xwyyb'; 'ECB_WIDTH_VERT', 'xwzzb'; ... % $$$ 'ECB_CURV_HOR' , 'xryyb'; 'ECB_CURV_VERT' , 'xrzzb' }; % following python script: % WARNING seems alpha, beta inverted in read_ech.py script, so here use alpha for poloidal related angle and beta for tor % Thus use alpha_pol and beta_tor to avoid confusion (inverted with respect to .py alpha, beta script) for isys=1:length(ecsystems) isyseff = isys; if isys==1 && shot > 33725; isyseff = 3; end for igy=1:ecsystems(isys) ps_source = ['P_sy' num2str(isyseff) '_g' num2str(igy)]; aa=gdat(shot,{'ECS',ps_source,'','param:GPolPos'},'machine','aug'); torbeam.alpha_pol(igy_seq(igy,isys),1) = aa.data; aa=gdat(shot,{'ECS',ps_source,'','param:GTorPos'},'machine','aug'); torbeam.beta_tor(igy_seq(igy,isys),1) = aa.data; if load_option == 0 aa=gdat(shot,{'ECS',ps_source,'','param:gyr_freq'},'machine','aug'); if aa.data > 1000 torbeam.freq(igy_seq(igy,isys),1) = aa.data; else torbeam.freq(igy_seq(igy,isys),1) = 1.398765E+11; end else % assume already loaded in above switch case end end end % Compute theta,phi for TORBEAM torbeam.theta = NaN(nbgy,1); torbeam.phi = NaN(nbgy,1); torbeam.err_status = -ones(nbgy,1); torbeam.isystunit = NaN(nbgy,1); torbeam.datum = NaN(nbgy,1); for isys=1:length(ecsystems) for igy=1:ecsystems(isys) igy_1_8 = igy_seq(igy,isys); if torbeam.is_gyro_on(igy_seq(igy,isys)) [torbeam.theta(igy_seq(igy,isys),1),torbeam.phi(igy_seq(igy,isys),1),torbeam.err_status(igy_seq(igy,isys),1),torbeam.isystunit(igy_seq(igy,isys),1),torbeam.datum(igy_seq(igy,isys),1)] = ... aug_setval2tp_mex(torbeam.alpha_pol(igy_seq(igy,isys),1),torbeam.beta_tor(igy_seq(igy,isys),1),igy_1_8,shot); end end end % get time dependent data if shot < 23187 % Before ECRH2 installed return end isys=length(ecsystems); isyseff = isys; diagname = 'ECN'; % 1st system angles fixed so use above values isys = 1; for igy=1:ecsystems(isys) igy_1_8 = igy_seq(igy,isys); if torbeam.is_gyro_on(igy_seq(igy,isys)) torbeam.theta_t(igy_1_8,:) = torbeam.theta(igy_seq(igy,isys)); torbeam.phi_t(igy_1_8,:) = torbeam.phi(igy_seq(igy,isys)); torbeam.err_status_t(igy_1_8,:) = torbeam.err_status(igy_seq(igy,isys),1); end end isys = 2; for igy=1:ecsystems(isys) torbeam.alpha_polN{igy} = gdat(shot,{diagname,['G' num2str(igy) 'POL']},'machine','aug'); torbeam.alpha_polN{igy}.data = 0.01 .* torbeam.alpha_polN{igy}.data; torbeam.alpha_pol_t = interpos(-21,torbeam.alpha_polN{igy}.t,torbeam.alpha_polN{igy}.data,torbeam.t,-1e2); % $$$ torbeam.beta_torN{igy} = gdat(shot,{diagname,['G' num2str(igy) 'TOR']},'machine','aug'); igy_1_8 = igy_seq(igy,isys); if torbeam.is_gyro_on(igy_seq(igy,isys)) [theta_t,phi_t,err_status_t,torbeam.isystunit(igy_seq(igy,isys),1),torbeam.datum(igy_seq(igy,isys),1)] = ... aug_setval2tp_mex(torbeam.alpha_pol_t,torbeam.beta_tor(igy_seq(igy,isys),1).*ones(size(torbeam.alpha_pol_t)),igy_1_8,shot); torbeam.theta_t(igy_1_8,:) = theta_t'; torbeam.phi_t(igy_1_8,:) = phi_t'; torbeam.err_status_t(igy_1_8,:) = err_status_t'; end end case 1 torbeam.rfmod = - ones(1,8); % 1 for O-mode, -1 for X-mode tmp=gdat(shot,{'TBP','TB_par','git','param:Rlaunch'},'machine','aug'); torbeam.tb_par.('xxb') = reshape(tmp.data,1,length(tmp.data)) * 100.; tmp=gdat(shot,{'TBP','TB_par','git','param:Zlaunch'},'machine','aug'); torbeam.tb_par.('xzb') = reshape(tmp.data,1,length(tmp.data)) * 100.; tmp=gdat(shot,{'TBP','TB_par','git','param:wid_hor'},'machine','aug'); torbeam.tb_par.('xwyyb') = reshape(tmp.data,1,length(tmp.data)) * 100.; tmp=gdat(shot,{'TBP','TB_par','git','param:wid_ver'},'machine','aug'); torbeam.tb_par.('xwzzb') = reshape(tmp.data,1,length(tmp.data)) * 100.; tmp=gdat(shot,{'TBP','TB_par','git','param:curv_hor'},'machine','aug'); torbeam.tb_par.('xryyb') = reshape(tmp.data,1,length(tmp.data)) * 100.; tmp=gdat(shot,{'TBP','TB_par','git','param:curv_ver'},'machine','aug'); torbeam.tb_par.('xrzzb') = reshape(tmp.data,1,length(tmp.data)) * 100.; tmp=gdat(shot,{'TBP','TB_par','git','param:the_ps'},'machine','aug'); torbeam.tb_par_sf.('the_ps') = reshape(tmp.data,1,length(tmp.data)); tmp=gdat(shot,{'TBP','TB_par','git','param:phi_ps'},'machine','aug'); torbeam.tb_par_sf.('phi_ps') = reshape(tmp.data,1,length(tmp.data)); tmp=gdat(shot,{'TBP','TB_par','git','param:freq'},'machine','aug'); torbeam.tb_par_sf.('freq') = reshape(tmp.data,1,length(tmp.data)); tmp=gdat(shot,{'TBP','the_ec2','git'},'machine','aug'); torbeam.tbp.the_ec2 = tmp; tmp=gdat(shot,{'TBP','phi_ec2','git'},'machine','aug'); torbeam.tbp.phi_ec2 = tmp; % fill in relevant output tables torbeam.freq = torbeam.tb_par_sf.freq'; torbeam.theta = torbeam.tb_par_sf.the_ps'; torbeam.phi = torbeam.tb_par_sf.phi_ps'; isys = 1; igy_1_8 = igy_seq(1:ecsystems(isys),isys); % sys1 has fixed angles vs time torbeam.theta_t(igy_1_8,:) = torbeam.theta(igy_1_8)*ones(1,size(torbeam.theta_t,2)); torbeam.phi_t(igy_1_8,:) = torbeam.phi(igy_1_8)*ones(1,size(torbeam.phi_t,2)); isys = 2; igy_1_8 = igy_seq(1:ecsystems(isys),isys); % sys1 has fixed angles vs time for igy=1:size(igy_seq,1) igy_1_8 = igy_seq(igy,isys); torbeam.theta_t(igy_1_8,:) = interpos(-21,torbeam.tbp.the_ec2.t,torbeam.tbp.the_ec2.data(igy,:),torbeam.t,-1e2); torbeam.phi_t(igy_1_8,:) = interpos(-21,torbeam.tbp.phi_ec2.t,torbeam.tbp.phi_ec2.data(igy,:),torbeam.t,-1e2); end otherwise error(['option for Torbeam parameters and angles = ' num2str(load_option) ' not known nor implemented yet. Ask O. Sauter']); end torbeam = orderfields(torbeam);