From f8cdc4986ae6052f3e935efc2aa2d55dcfbfe8b4 Mon Sep 17 00:00:00 2001
From: Olivier Sauter <olivier.sauter@epfl.ch>
Date: Wed, 5 Jul 2017 08:39:55 +0000
Subject: [PATCH] added powers to jet and radiated from bolo

git-svn-id: https://spcsvn.epfl.ch/repos/TCV/gdat/trunk@7760 d63d8f72-b253-0410-a779-e742ad2e26cf
---
 crpptbx/JET/gdat_jet.m             | 364 +++++++++++++++++++++++------
 crpptbx/JET/jet_requests_mapping.m |   9 +-
 crpptbx/gdat_plot.m                |   2 +-
 3 files changed, 294 insertions(+), 81 deletions(-)

diff --git a/crpptbx/JET/gdat_jet.m b/crpptbx/JET/gdat_jet.m
index d394cce2..925ec592 100644
--- a/crpptbx/JET/gdat_jet.m
+++ b/crpptbx/JET/gdat_jet.m
@@ -782,12 +782,123 @@ elseif strcmp(mapping_for_jet.method,'switchcase')
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'ne','te'}
+    nodenameeff_rho = 'rho';
+    params_eff = gdat_data.gdat_params;
+    if isfield(params_eff,'source') && ~isempty(params_eff.source)
+      if strcmp(lower(params_eff.source),'chain2')
+        params_eff.source = 'hrt2';
+      end
+      if strcmp(lower(params_eff.source),'hrt2')
+        nodenameeff_rho = []; % profiles already on rho
+      end
+    else
+      params_eff.source = 'hrts';
+    end
+    gdat_data.gdat_params = params_eff;
+    params_eff.doplot = 0;
     % ne or Te from Thomson data on raw z mesh vs (z,t)
-    if ~(isfield(gdat_data.gdat_params,'edge') && ~isempty(gdat_data.gdat_params.edge) && ...
-         gdat_data.gdat_params.edge>0)
-      gdat_data.gdat_params.edge = 0;
+    params_eff.data_request = {'ppf',params_eff.source,data_request_eff};
+    aa = gdat_jet(shot,params_eff);
+    if isempty(aa.data) || isempty(aa.t)
+      if gdat_params.nverbose>=3;
+	aa
+	disp(['with data_request= ' data_request_eff])
+      end
+      return
+    end
+    gdat_data.data = aa.data;
+    gdat_data.dim = aa.dim;
+    gdat_data.t = aa.dim{2};
+    gdat_data.x = aa.dim{1};
+    gdat_data.dimunits=[{'R [m]'} ; {'time [s]'}];
+    gdat_data.data_fullpath=[data_request_eff ' from ' params_eff.source];
+    gdat_data.(data_request_eff).data = aa.data;
+    gdat_data.(data_request_eff).t = aa.t;
+    gdat_data.(data_request_eff).r = aa.x;
+    if any(strcmp(fieldnames(aa),'units')) && ~isempty(aa.units)
+      gdat_data.units=aa.units;
+    else
+      if strcmp(data_request_eff,'ne')
+        gdat_data.units = 'm^{-3}';
+      elseif strcmp(data_request_eff,'te')
+        gdat_data.units = 'eV';
+      end
+    end
+    params_eff.data_request = {'ppf',params_eff.source,['d' data_request_eff]};
+    aaerr = gdat_jet(shot,params_eff);
+    gdat_data.error_bar = aaerr.data;
+    gdat_data.(data_request_eff).error_bar = aaerr.data;
+    if ~isempty(nodenameeff_rho)
+      params_eff.data_request = {'ppf',params_eff.source,'rho'};
+      aarho = gdat_jet(shot,params_eff);
+      gdat_data.rhopol = abs(aarho.data);
+      gdat_data.(data_request_eff).rhopol = abs(aarho.data); % keep rho >0
+    else
+      gdat_data.rhopol = gdat_data.x;
+      gdat_data.(data_request_eff).rhopol = gdat_data.x;
+      gdat_data.dimunits{1} = 'rhopol';
+    end
+    
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   case {'ni','ti'}
+    nodenameeff_rho = 'rho';
+    data_type_eff = data_request_eff;
+    if strcmp(data_request_eff,'ni'); data_type_eff = 'dd'; end
+    params_eff = gdat_data.gdat_params;
+    if isfield(params_eff,'source') && ~isempty(params_eff.source)
+      if strcmp(lower(params_eff.source),'chain2')
+        params_eff.source = [data_request_eff(1) 'ion'];
+      end
+      if strcmp(lower(params_eff.source(2:end)),'ion')
+        nodenameeff_rho = []; % profiles already on rho
+      end
+    else
+      params_eff.source = [datar_equest_eff(1) 'ion']; % only chain2 at this stage
+    end
+    gdat_data.gdat_params = params_eff;
+    params_eff.doplot = 0;
+    % ne or Te from Thomson data on raw z mesh vs (z,t)
+    params_eff.data_request = {'ppf',params_eff.source,data_type_eff};
+    aa = gdat_jet(shot,params_eff);
+    if isempty(aa.data) || isempty(aa.t)
+      if gdat_params.nverbose>=3;
+	aa
+	disp(['with data_request= ' data_request_eff])
+      end
+      return
+    end
+    gdat_data.data = aa.data;
+    gdat_data.dim = aa.dim;
+    gdat_data.t = aa.dim{2};
+    gdat_data.x = aa.dim{1};
+    gdat_data.dimunits=[{'R [m]'} ; {'time [s]'}];
+    gdat_data.data_fullpath=[data_request_eff ' from ' params_eff.source];
+    gdat_data.(data_request_eff).data = aa.data;
+    gdat_data.(data_request_eff).t = aa.t;
+    gdat_data.(data_request_eff).r = aa.x;
+    if any(strcmp(fieldnames(aa),'units')) && ~isempty(aa.units)
+      gdat_data.units=aa.units;
+    else
+      if strcmp(data_request_eff,'ni')
+        gdat_data.units = 'm^{-3}';
+      elseif strcmp(data_request_eff,'ti')
+        gdat_data.units = 'eV';
+      end
+    end
+    params_eff.data_request = {'ppf',params_eff.source,['e' data_type_eff]}; % not given for dd but ok will be empty
+    aaerr = gdat_jet(shot,params_eff);
+    gdat_data.error_bar = aaerr.data;
+    gdat_data.(data_request_eff).error_bar = aaerr.data;
+    if ~isempty(nodenameeff_rho)
+      params_eff.data_request = {'ppf',params_eff.source,'rho'};
+      aarho = gdat_jet(shot,params_eff);
+      gdat_data.rhopol = abs(aarho.data);
+      gdat_data.(data_request_eff).rhopol = abs(aarho.data); % keep rho >0
+    else
+      gdat_data.rhopol = gdat_data.x;
+      gdat_data.(data_request_eff).rhopol = gdat_data.x;
+      gdat_data.dimunits{1} = 'rhopol';
     end
-    [gdat_data] = get_thomson_raw_data(shot,data_request_eff,gdat_data,gdat_data.gdat_params.edge,gdat_params.nverbose);
     
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'ne_rho', 'te_rho', 'nete_rho'}
@@ -1023,83 +1134,151 @@ elseif strcmp(mapping_for_jet.method,'switchcase')
    case {'powers'}
     % note: same time array for all main, ec, ohm, nbi, ...
     % At this stage fill just ech, later add nbi
-
-    % EC
-    nodenameeff='\results::toray.input:p_gyro';
-    tracetdi=tdi(nodenameeff);
-    if isempty(tracetdi.data) || isempty(tracetdi.dim) % || ischar(tracetdi.data) (to add?)
-      if (gdat_params.nverbose>=1); warning(['problems loading data for ' nodenameeff ' for data_request= ' data_request_eff]); end
-      gdat_data.ec.data = [];
-      gdat_data.ec.units = [];
-      gdat_data.ec.dim=[];
-      gdat_data.ec.dimunits=[];
-      gdat_data.ec.t=[];
-      gdat_data.ec.x=[];
-      gdat_data.ec.data_fullpath=[];
-      gdat_data.ec.label='';
+    sources_avail = {'ohm','nbi','ic','rad'}; % note should allow ech, nbh, ohmic in parameter sources
+    for i=1:length(sources_avail)
+      gdat_data.(sources_avail{i}).data = [];
+      gdat_data.(sources_avail{i}).units = [];
+      gdat_data.(sources_avail{i}).dim=[];
+      gdat_data.(sources_avail{i}).dimunits=[];
+      gdat_data.(sources_avail{i}).t=[];
+      gdat_data.(sources_avail{i}).x=[];
+      gdat_data.(sources_avail{i}).data_fullpath=[];
+      gdat_data.(sources_avail{i}).label=[];
+    end
+    if ~isfield(gdat_data.gdat_params,'source') || isempty(gdat_data.gdat_params.source)
+      gdat_data.gdat_params.source = sources_avail;
+    elseif ~iscell(gdat_data.gdat_params.source)
+      if ischar(gdat_data.gdat_params.source)
+	gdat_data.gdat_params.source = lower(gdat_data.gdat_params.source);
+        if ~any(strmatch(gdat_data.gdat_params.source,lower(sources_avail)))
+          if (gdat_params.nverbose>=1)
+            warning(['source= ' gdat_data.gdat_params.source ' is not part of the available sources: ' sprintf('''%s'' ',sources_avail{:})]);
+          end
+          return
+        else
+          gdat_data.gdat_params.source = {gdat_data.gdat_params.source};
+        end
+      else
+        if (gdat_params.nverbose>=1); warning([' source parameter not compatible with: ' sprintf('''%s'' ',sources_avail{:})]); end
+        return
+      end
     else
-      gdat_data.ec.data = tracetdi.data*1e3; % at this stage p_gyro is in kW'
-      gdat_data.ec.units = 'W';
-      gdat_data.ec.dim=tracetdi.dim;
-      gdat_data.ec.dimunits=tracetdi.dimunits;
-      gdat_data.ec.t=tracetdi.dim{1};
-      gdat_data.ec.x=tracetdi.dim{2};
-      gdat_data.ec.data_fullpath=[nodenameeff];
-      gdat_data.ec.label='P_{EC}';
-      % set ec time as reference
-      gdat_data.t = gdat_data.ec.t;
-      gdat_data.dim{1} = gdat_data.t;
-      gdat_data.dimunits{1} = 's';
-      gdat_data.units = 'W';
+      for i=1:length(gdat_data.gdat_params.source)
+        gdat_data.gdat_params.source{i} = lower(gdat_data.gdat_params.source{i});
+        if ~any(strmatch(gdat_data.gdat_params.source{i},lower(sources_avail)))
+          if gdat_data.gdat_params.nverbose>=1
+            warning(['source = ' gdat_data.gdat_params.source{i} ' not expected with data_request= ' data_request_eff])
+          end
+        end
+      end
     end
+    % always start from ohmic so can use this time as base time since should yield full shot
 
-    % Ohmic
-    gdat_data.ohm.data = [];
-    gdat_data.ohm.units = '';
-    gdat_data.ohm.dim=gdat_data.dim;
-    gdat_data.ohm.dimunits=gdat_data.dimunits;
-    gdat_data.ohm.t=[];
-    gdat_data.ohm.x=[];
-    gdat_data.ohm.data_fullpath=[];
-    gdat_data.ohm.label='';
-    % get ohmic power simply from vloop*Ip (minus sign for JET)
-    ip=gdat([],'ip');
-    vloop=gdat([],'vloop');
-    tension = -1e5;
-    if isempty(gdat_data.t)
-      gdat_data.t = vloop.t;
-      gdat_data.dim{1} = gdat_data.t;
-      gdat_data.ohm.data = vloop.data;
-      gdat_data.dimunits{1} = 's';
-      gdat_data.units = 'W';
-    else
-      vloop_smooth=interpos(vloop.t,vloop.data,gdat_data.t,tension);
-      ip_t = interp1(ip.t,ip.data,gdat_data.t);
-      gdat_data.ohm.data = -vloop_smooth.*ip_t;
-    end
-    gdat_data.ohm.units = gdat_data.units;
-    gdat_data.ohm.dim=gdat_data.dim;
-    gdat_data.ohm.dimunits=gdat_data.dimunits;
-    gdat_data.ohm.t=gdat_data.t;
-    gdat_data.ohm.x=[];
-    gdat_data.ohm.data_fullpath=['-vloop(tens=' num2str(tension,'%.0e') ')*ip, from gdat'];
-    gdat_data.ohm.label='P_{OHM}';
-    
-    % total power from each and total
-    gdat_data.data(:,1) = gdat_data.ohm.data;
-    if ~isempty(gdat_data.ec.data)
-      gdat_data.data(:,2) = gdat_data.ec.data(:,10);
-      gdat_data.data(:,3) = gdat_data.ec.data(:,10) + gdat_data.ohm.data;
-      gdat_data.dim{2} = [1:3];
-      gdat_data.dimunits{2} = 'Pohm;Pec;Ptot';
-      gdat_data.data_fullpath=['tot power from EC and ohm'];
-      gdat_data.label = 'P_{ohm};P_{EC};P_{tot}';
+    fields_to_copy = {'data','units','dim','dimunits','t','x','data_fullpath','label','help','gdat_params'};
+    fields_to_not_copy = {'shot','gdat_request'};
+    % total of each source in .data, but full data in subfield like pgyro in .ec, to check for nbi
+    params_eff = gdat_data.gdat_params;
+    params_eff.source=[]; % use default for individual calls
+
+    % ohmic, use its time-base
+    params_eff.data_request='p_ohmic';
+    try
+      ohm=gdat_jet(shot,params_eff);
+    catch
+      ohm.data = [];
+      ohm.dim = [];
+    end
+    if ~isempty(ohm.data) && ~isempty(ohm.dim)
+      for i=1:length(fields_to_copy)
+	if isfield(ohm,fields_to_copy{i})
+	  gdat_data.ohm.(fields_to_copy{i}) = ohm.(fields_to_copy{i});
+	end
+      end
+      gdat_data.ohm.raw_data = gdat_data.ohm.data;
     else
-      gdat_data.dim{2} = [1];
-      gdat_data.dimunits{2} = 'Pohm=Ptot';
-      gdat_data.data_fullpath=['tot power from ohm'];
-      gdat_data.label = 'P_{tot}=P_{ohm}';
+      if gdat_params.nverbose>=3; disp(['problems with ' params_eff.data_request]); end
+      return
     end
+    mapping_for_jet.timedim = 1; mapping_for_jet.gdat_timedim = 1;
+    taus = -10;
+    %
+    % add each source in main.data, on ohm time array
+    gdat_data.t = gdat_data.ohm.t;
+    gdat_data.dim{1} = gdat_data.t;
+    gdat_data.dimunits{1} = 's';
+    gdat_data.ohm.data = interpos(gdat_data.t,gdat_data.ohm.raw_data,5.*taus);
+    gdat_data.data = reshape(gdat_data.ohm.data,length(gdat_data.t),1);
+    gdat_data.ohm.tension = 5.*taus;
+    gdat_data.x =[1];
+    gdat_data.label={'P_{ohm}'};
+    gdat_data.units = 'W';
+    %
+    if any(strmatch('nb',gdat_data.gdat_params.source))
+      % nbi
+      params_eff.data_request={'ppf','nbi','ptot'};
+      try
+	nbi=gdat_jet(shot,params_eff);
+      catch
+      end
+      if ~isempty(nbi.data) && ~isempty(nbi.dim)
+	for i=1:length(fields_to_copy)
+	  if isfield(nbi,fields_to_copy{i})
+	    gdat_data.nbi.(fields_to_copy{i}) = nbi.(fields_to_copy{i});
+	  end
+	end
+        % add to main with linear interpolation and 0 for extrapolated values
+	gdat_data.data(:,end+1) = interpos(-21,gdat_data.nbi.t,gdat_data.nbi.data(:,end),gdat_data.t);
+	gdat_data.x(end+1) =gdat_data.x(end)+1;
+	gdat_data.label{end+1}='P_{nbi}';
+      end
+    end
+    %
+    if any(strmatch('ic',gdat_data.gdat_params.source))
+      % ic
+      params_eff.data_request={'ppf','icrh','ptot'};
+      try
+	ic=gdat_jet(shot,params_eff);
+      catch
+      end
+      if ~isempty(ic.data) && ~isempty(ic.dim)
+	for i=1:length(fields_to_copy)
+	  if isfield(ic,fields_to_copy{i})
+	    gdat_data.ic.(fields_to_copy{i}) = ic.(fields_to_copy{i});
+	  end
+	end
+	gdat_data.data(:,end+1) = interpos(-21,gdat_data.ic.t,gdat_data.ic.data,gdat_data.t);
+	gdat_data.x(end+1) =gdat_data.x(end)+1;
+	gdat_data.label{end+1}='P_{ic}';
+      end
+    end
+    if any(strmatch('rad',gdat_data.gdat_params.source))
+      % radiated power
+      params_eff.data_request='p_rad';
+      try
+	rad=gdat_jet(shot,params_eff);
+      catch
+      end
+      if ~isempty(rad.data) && ~isempty(rad.dim)
+	for i=1:length(fields_to_copy)
+	  if isfield(rad,fields_to_copy{i})
+	    gdat_data.rad.(fields_to_copy{i}) = rad.(fields_to_copy{i});
+	  end
+	end
+        % add to main with linear interpolation and 0 for extrapolated values
+	gdat_data.data(:,end+1) = interpos(-21,gdat_data.rad.t,gdat_data.rad.data,gdat_data.t);
+	gdat_data.x(end+1) =gdat_data.x(end)+1;
+	gdat_data.label{end+1}='P_{rad}';
+      end
+    end
+    % add tot power
+    sources_coeff = [  1,    1,   1,   0];
+    aa=sum(gdat_data.data.*repmat(reshape(sources_coeff,1,numel(sources_coeff)),size(gdat_data.data,1),1),2);
+    gdat_data.data(:,end+1) = aa;
+    % gdat_data.data(:,end+1) = sum(gdat_data.data,2);
+    gdat_data.label{end+1}='P_{tot} without Prad';
+    gdat_data.x(end+1) =gdat_data.x(end)+1;
+    gdat_data.dim{2} = gdat_data.x; gdat_data.dimunits{2} = '';
+    gdat_data.data_fullpath = 'tot powers from each sources, and total power in .data(:,end)';
 
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'q_rho'}
@@ -1128,6 +1307,39 @@ elseif strcmp(mapping_for_jet.method,'switchcase')
     % add grids_1d to have rhotor, etc
     gdat_data = get_grids_1d(gdat_data,1,1,gdat_params.nverbose);
     
+    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+   case {'p_rad', 'prad'}
+    params_eff = gdat_data.gdat_params;
+    if ~isfield(params_eff,'source') || isempty(params_eff.source)
+      params_eff.source = 'bolo';
+    end
+    gdat_data.gdat_params = params_eff;
+    switch params_eff.source
+     case 'prad'
+      params_eff.data_request = {'ppf','prad','prad'};
+      rad=gdat_jet(shot,params_eff);
+      gdat_data.label={'P_{rad} from prad'};
+     otherwise
+      % 'bolo' by default
+      gdat_data.gdat_params.source = 'bolo';
+      params_eff.data_request = {'ppf','bolo','topi'};
+      rad=gdat_jet(shot,params_eff);
+      gdat_data.label={'P_{rad} from bolo/topi'};
+      params_eff.data_request = {'ppf','bolo','tobh'};
+      rad_bulk1=gdat_jet(shot,params_eff);
+      gdat_data.rad_bulk_h = rad_bulk1.data;
+      params_eff.data_request = {'ppf','bolo','tobu'};
+      rad_bulk2=gdat_jet(shot,params_eff);
+      gdat_data.rad_bulk_u = rad_bulk2.data;
+      gdat_data.rad_bulk_avg = 0.5.*(rad_bulk1.data+rad_bulk2.data);
+    end
+    gdat_data.t = rad.t;
+    gdat_data.dim{1} = gdat_data.t;
+    gdat_data.dimunits{1} = 's';
+    gdat_data.data = rad.data;
+    gdat_data.units = 'W';
+    gdat_data.data_fullpath = params_eff.data_request;
+    
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    case {'psi_edge'}
     % psi at edge, 0 by construction in Liuqe, thus not given
diff --git a/crpptbx/JET/jet_requests_mapping.m b/crpptbx/JET/jet_requests_mapping.m
index f843d20f..03bde4ee 100644
--- a/crpptbx/JET/jet_requests_mapping.m
+++ b/crpptbx/JET/jet_requests_mapping.m
@@ -129,7 +129,7 @@ switch lower(data_request)
  case 'mhd'
   mapping.timedim = 1;
   mapping.label = 'n=1 and n=2 amplitude';
-  mapping.method = 'expression';
+  mapping.method = 'expression'; % {'JPF','DA','C1M-H306'} {'JPF','DA','C1M-T009'} (big) {'JPF','DA','C1M-MIT27'}
   mapping.expression = ['params_eff = gdat_data.gdat_params;params_eff.data_request={''JPF'',''DA'',''C1H-I301''}; ' ...
                     'gdat_tmp=gdat_jet(shot,params_eff);gdat_tmp.data=reshape(gdat_tmp.data,length(gdat_tmp.data),1 );' ...
 		    'gdat_tmp.dim{1}=gdat_tmp.t;gdat_tmp.dim{2}=[1 2];gdat_tmp.x=gdat_tmp.dim{2};' ...
@@ -203,7 +203,7 @@ switch lower(data_request)
   mapping.timedim = 1;
   mapping.method = 'signal';
   mapping.expression = [{'PPF'},{'EQUI'},{'PHIT'}]; % note this is only chain2, so should check with efit...
- case 'p_ohmic'
+ case {'p_ohmic', 'p_ohm', 'pohm'}
   mapping.label = 'p\_ohmic';
   mapping.timedim = 1;
   mapping.method = 'signal';
@@ -211,8 +211,9 @@ switch lower(data_request)
  case {'p_rad', 'prad'}
   mapping.label = 'p\_rad';
   mapping.timedim = 1;
-  mapping.method = 'signal';
-  mapping.expression = [{'PPF'},{'PRAD'},{'PRAD'}];
+% $$$   mapping.method = 'signal';
+% $$$   mapping.expression = [{'PPF'},{'bolo'},{'topi'}];
+  mapping.method = 'switchcase';
  case 'powers'
   mapping.timedim = 1;
   mapping.label = 'various powers';
diff --git a/crpptbx/gdat_plot.m b/crpptbx/gdat_plot.m
index 5cdee4d7..3377affc 100644
--- a/crpptbx/gdat_plot.m
+++ b/crpptbx/gdat_plot.m
@@ -91,7 +91,7 @@ if all(isfield(gdat_data,{'data','t'})) && ~isempty(gdat_data.data) && ~isempty(
   if strcmp(gdat_data.gdat_request,'mhd')
     % special case, add legend instead of ylabel
     delete(hylabel);
-    legend(gdat_data.label,2);
+    legend(gdat_data.label);
     % add spectrogram per signal
     mhd_sum_data = 0.;
     nfft=1024;
-- 
GitLab