From 53df129841e1368c8643bd3b8f34b38d37af4001 Mon Sep 17 00:00:00 2001
From: Olivier Sauter <olivier.sauter@epfl.ch>
Date: Wed, 1 Jun 2016 07:05:21 +0000
Subject: [PATCH] for generic gui as well

git-svn-id: https://spcsvn.epfl.ch/repos/TCV/gdat/trunk@5865 d63d8f72-b253-0410-a779-e742ad2e26cf
---
 crpptbx/generic_fit.m  | 158 +++++++++++++++++++++++++++++++++++++++++
 crpptbx/line_average.m |  99 ++++++++++++++++++++++++++
 2 files changed, 257 insertions(+)
 create mode 100644 crpptbx/generic_fit.m
 create mode 100644 crpptbx/line_average.m

diff --git a/crpptbx/generic_fit.m b/crpptbx/generic_fit.m
new file mode 100644
index 00000000..54a7f8c2
--- /dev/null
+++ b/crpptbx/generic_fit.m
@@ -0,0 +1,158 @@
+function [gen_signals_data] = generic_fit(shot,data_in,dataname,time_array_in,tension_xx_in,coeff_xx_in,in_option);
+%
+%  [gen_signals_data,gen_signals_fit,filename_withfits] = generic_fit(shot,data_in,dataname,time_interval_in,tension_xx_in,coeff_xx_in,filename_withfits_in,in_option);
+%
+% Required inputs:
+%
+%    shot: shot number
+%    data_in{i}: array of structure from each "diagnostic" to combine, containing the following fields:
+%                        data_in{i}.data(:,it), data_in{i}.t, data_in{i}.error_bar(:,it)
+%                and a subfield .x for the radial coordinate with:
+%                        data_in{i}.x(irho,it) or data_in{i}.x(irho) if the rho values do not change with time
+%                and a subfield data_in{i}.xname which is used to describe if it is rhopol, rhotornorm, etc
+%    dataname: name of data and of subfield to fill in in the gen_signals_data structure:
+%
+%    It uses data_in{1}.t as the main time base thus as gen_signals_data.(dataname).t
+%
+%    in_option: 0 (default) computes the fits from the provided data
+%               1 (combined data already performed thus uses data_in{1}.combined_data or data_in.combined_data to compute the fits
+%
+%    output: gen_signals_data.(dataname).data, gen_signals_fit.(dataname).data
+%
+
+in_option_eff = 0;
+if exist('in_option') && ~isempty(in_option)
+  in_option_eff = in_option;
+end
+
+if in_option_eff == 0
+  % assumes receives just raw data in data_in{}
+  gen_signals_data.(dataname).raw_data = data_in;
+end
+if in_option_eff == 1
+  % assume one receives already gen_signals_data structure
+  if iscell(data_in)
+    gen_signals_data = data_in{1};
+  else
+    gen_signals_data = data_in;
+  end
+end
+
+if ~exist('coeff_xx_in') || length(coeff_xx_in)~=length(data_in)
+  coeff_xx_eff = ones(length(data_in),1);
+else
+  coeff_xx_eff = coeff_xx_in;
+end
+if exist('tension_xx_in') && ~isempty(tension_xx_in)
+  tension_xx_eff = tension_xx_in;
+else
+  tension_xx_eff=-3;
+end
+
+% combine the data to be able to do the fits
+if in_option_eff == 0
+
+  if isempty(data_in) || length(data_in)<1 || ~isfield(data_in{1},'t') || ~isfield(data_in{1},'data') || ~isfield(data_in{1},'x') || isempty(data_in{1}.data)
+    disp('no main data')
+    return
+  end
+  
+  main_time_base = data_in{1}.t;
+  
+  time_interval_in = [main_time_base(1) main_time_base(end)];
+  ij=find(main_time_base>=time_interval_in(1) & main_time_base<=time_interval_in(2));
+  
+  gen_signals_data.(dataname).combined_data.t = main_time_base(ij);
+  gen_signals_data.(dataname).t = gen_signals_data.(dataname).combined_data.t;
+  for i=1:length(ij)
+    if i==1
+      t1(i) = main_time_base(ij(i)) - 0.5*diff(main_time_base(ij([i:i+1])));
+    else
+      t1(i) = mean(main_time_base(ij([i-1:i])));
+    end
+    if i==length(ij)
+      t2(i) = main_time_base(ij(i)) + 0.5*diff(main_time_base(ij([i-1:i])));
+    else
+      t2(i) = mean(main_time_base(ij([i:i+1])));
+    end
+    gen_signals_data.(dataname).combined_data.time_interval(i,1:2) = [t1(i) t2(i)];
+  end
+  
+  for idata=1:length(data_in)
+    gen_signals_data.(dataname).combined_data.rholabel{idata} = data_in{idata}.xname;
+  end
+
+  for i=1:length(ij)
+    % for each time interval, collect the data
+    rhotor_data_tofit = []; 
+    xxdata_tofit = [];
+    xxerr_tofit = [];
+    data_provenance = [];
+    for idata=1:length(data_in)
+      it_data{idata} = find(data_in{idata}.t>=t1(i) & data_in{idata}.t<t2(i));
+      % construct 1D array with data from data_in{idata}
+      if ~isempty(it_data{idata})
+	for it=1:length(it_data{idata})
+	  jrho_data = find(data_in{idata}.x(:,it_data{idata}(it))>0 & data_in{idata}.x(:,it_data{idata}(it))<1.01);
+	  if length(jrho_data)>0
+	    rhotor_data_tofit(end+1:end+length(jrho_data)) = data_in{idata}.x(jrho_data,it_data{idata}(it));
+	    xxdata_tofit(end+1:end+length(jrho_data)) = data_in{idata}.data(jrho_data,it_data{idata}(it));
+	    xxerr_tofit(end+1:end+length(jrho_data)) = data_in{idata}.error_bar(jrho_data,it_data{idata}(it))./coeff_xx_eff(idata);
+	    data_provenance(end+1:end+length(jrho_data)) = idata.*ones(size(jrho_data));
+	  end
+	end
+      end
+    end
+    
+    if isempty(xxdata_tofit)
+      disp('xxdata_tofit empty')
+      gen_signals_data.(dataname).combined_data.perDt{i}.rho = [];
+      gen_signals_data.(dataname).combined_data.perDt{i}.data = [];
+      gen_signals_data.(dataname).combined_data.perDt{i}.error_bar = [];
+      gen_signals_data.(dataname).combined_data.perDt{i}.provenance = [];
+      return
+    else
+      [rhoeff,irhoeff] = sort(rhotor_data_tofit);
+      xxdata_tofit_eff = xxdata_tofit(irhoeff);
+      xxerr_tofit_eff = xxerr_tofit(irhoeff);
+      data_provenance_eff = data_provenance(irhoeff);
+      gen_signals_data.(dataname).combined_data.perDt{i}.rho = rhoeff;
+      gen_signals_data.(dataname).combined_data.perDt{i}.data = xxdata_tofit_eff;
+      gen_signals_data.(dataname).combined_data.perDt{i}.error_bar = xxerr_tofit_eff;
+      gen_signals_data.(dataname).combined_data.perDt{i}.provenance = data_provenance_eff;
+    end
+  end
+end
+
+% do the fit
+doplot=0; % for debugging
+nb_points = 201;
+main_rho = linspace(0,1,nb_points);
+xxfit = [];
+dxxfitdrn = [];
+for i=1:length(gen_signals_data.(dataname).combined_data.perDt)
+  rhoeff = gen_signals_data.(dataname).combined_data.perDt{i}.rho;
+  xxdata_tofit_eff = gen_signals_data.(dataname).combined_data.perDt{i}.data;
+  xxerr_tofit_eff = gen_signals_data.(dataname).combined_data.perDt{i}.error_bar;
+  xeff = [0. rhoeff];
+  yeffxx = [xxdata_tofit_eff(1) xxdata_tofit_eff];
+  erreffxx = [100.*max(xxerr_tofit_eff) xxerr_tofit_eff];
+  [xxfit(:,i),dxxfitdrn(:,i)]=interpos(xeff,yeffxx,main_rho,tension_xx_eff,[1 0],[0 0],erreffxx);
+  if doplot
+    figure(11);clf
+    errorbar(rhoeff,xxdata_tofit_eff,xxerr_tofit_eff,'*');
+    hold all
+    plot(main_rho,xxfit(:,i))
+    pause(0.01)
+  end
+end
+
+gen_signals_data.(dataname).fit.rhofit = main_rho;
+gen_signals_data.(dataname).fit.data = xxfit;
+gen_signals_data.(dataname).fit.dydrho = dxxfitdrn;
+gen_signals_data.(dataname).shot = shot;
+gen_signals_data.(dataname).fit.tension = tension_xx_eff;
+gen_signals_data.(dataname).fit.coeff_datas = coeff_xx_eff;
+gen_signals_data.(dataname).fit.rholabel = gen_signals_data.(dataname).combined_data.rholabel{1};
+
+
diff --git a/crpptbx/line_average.m b/crpptbx/line_average.m
new file mode 100644
index 00000000..fb0d64c2
--- /dev/null
+++ b/crpptbx/line_average.m
@@ -0,0 +1,99 @@
+function [nel_out,s_out,nes_out,varargout] = line_average(shot,time,Rdiag,Zdiag,ne_in,rhopol_in,Rmesh,Zmesh,psi_RZmesh,psi_axis,psi_edge);
+%
+% compute s and ne(s) in s_out and nes_out; where s is distance from first point into the plasma along Rdiag,Zdiag chord
+% compute int[ne(s)ds]/int[ds] in nel_out
+%
+% can get Rmesh, Zmesh and psi_RZmesh from eqdsk at shot,time from gdat if not given, but for many times, should use equil output from gdat
+%
+
+nel_out = [];
+s_out = [];
+nes_out = [];
+
+time_eff = time;
+
+if ~exist('Rmesh') || isempty(Rmesh)
+  % do only 1st time
+  time_eff = time(1);
+  ab=gdat(shot,'eqdsk','time',time_eff);
+  eqdsk=ab.eqdsk;
+  if isempty(Rdiag)
+    % assume H-1 line
+    par=sf2par('DCN',shot,'H1LFS_R','DCNgeo');
+    Rlfs=par.value/1e3;
+    par=sf2par('DCN',shot,'H1LFS_z','DCNgeo');
+    Zlfs=par.value/1e3;
+    par=sf2par('DCN',shot,'H1HFS_R','DCNgeo');
+    Rhfs=par.value/1e3;
+    par=sf2par('DCN',shot,'H1HFS_z','DCNgeo');
+    Zhfs=par.value/1e3;
+    Rdiag=[Rlfs Rhfs];
+    Zdiag=[Zlfs Zhfs];
+  end
+  if length(Rdiag)==2
+    nbpoints=50;
+    Rout=linspace(Rdiag(1),Rdiag(2),nbpoints);
+    Zout=linspace(Zdiag(1),Zdiag(2),nbpoints);
+  elseif length(Rdiag)>10
+    Rout=Rdiag;
+    Zout=Zdiag;
+  else
+    disp(['unexpected nb of diag points: length(Rdiag) = ',length(Rdiag)]);
+    return
+  end
+  Rmesh = eqdsk.rmesh;
+  Zmesh = eqdsk.zmesh;
+  psi_RZmesh(:,:,1) = eqdsk.psirz;
+  psi_axis(1) = eqdsk.psiaxis;
+  psi_edge(1) = eqdsk.psiedge;
+end
+
+if prod(size(Rmesh)) == max(size(Rmesh))
+  Rmesh_eff = repmat(reshape(Rmesh,length(Rmesh),1),1,length(time_eff));
+  Zmesh_eff = repmat(reshape(Zmesh,length(Zmesh),1),1,length(time_eff));
+end
+
+for it=1:length(time_eff)
+  psi_at_routzout(:,it) = interpos2Dcartesian(Rmesh_eff(:,it),Zmesh(:,it),psi_RZmesh(:,:,it),Rout,Zout);
+  ij_in=find((psi_at_routzout(:,it)-psi_axis(it)).*(psi_at_routzout(:,it)-psi_edge(it))<=0);
+  if ~isempty(ij_in)
+    if ij_in(1)==1
+      Rstart=Rout(ij_in(1));
+      Zstart=Zout(ij_in(1));
+    else
+      Rstart = (psi_edge(it)-psi_at_routzout(ij_in(1)-1),it)./diff(psi_at_routzout(ij_in(1)-1:ij_in(1),it)).*diff(Rout(ij_in(1)-1:ij_in(1))) + Rout(ij_in(1)-1);
+      Zstart = (psi_edge(it)-psi_at_routzout(ij_in(1)-1),it)./diff(psi_at_routzout(ij_in(1)-1:ij_in(1),it)).*diff(Zout(ij_in(1)-1:ij_in(1))) + Zout(ij_in(1)-1);
+    end
+    if ij_in(end)==length(Rout)
+      Rend=Rout(ij_in(end));
+      Zend=Zout(ij_in(end));
+    else
+      Rend = (psi_edge(it)-psi_at_routzout(ij_in(end),it))./diff(psi_at_routzout(ij_in(end):ij_in(end)+1,it)).*diff(Rout(ij_in(end):ij_in(end)+1)) + Rout(ij_in(end));
+      Zend = (psi_edge(it)-psi_at_routzout(ij_in(end),it))./diff(psi_at_routzout(ij_in(end):ij_in(end)+1,it)).*diff(Zout(ij_in(end):ij_in(end)+1)) + Zout(ij_in(end));
+    end
+    s_eff = sqrt((Rout(ij_in)-Rstart).^2 + (Zout(ij_in)-Zstart).^2);
+    rhopol_eff=sqrt((psi_at_routzout(ij_in,it)-psi_axis(it))./(psi_edge(it)-psi_axis(it)));
+    if ij_in(1)==1
+      rhopol_eff = reshape(rhopol_eff,length(rhopol_eff),1);
+      s_eff = reshape(s_eff,length(s_eff),1);
+    else
+      rhopol_eff=[1 ;reshape(rhopol_eff,length(rhopol_eff),1); 1];
+      s_eff=[0 ;reshape(s_eff,length(s_eff),1); sqrt((Rend-Rstart).^2 + (Zend-Zstart).^2)];
+    end
+    [rho_in_eff,isort]=sort(rhopol_in(:,it));
+    if rho_in_eff(1)<1e-3
+      % assume 1st point is center
+      nes = interpos(rho_in_eff,ne_in(isort,it),rhopol_eff,-0.1,[1 0],[0 0]);
+    else
+      rho_in_eff = [0 ; rho_in_eff];
+      ne_in_eff = [ne_in(isort(1),it); ne_in(isort,it)];
+      sigma_in = ones(size(ne_in_eff));
+      sigma_in(1)=100;
+      nes = interpos(rho_in_eff,ne_in_eff,rhopol_eff,-1,[1 0],[0 0],sigma_in);
+    end
+    nes_out(:,it) = nes;
+    s_out(:,it) = s_eff;
+    [dum1,~,~,nel_out_prof] = interpos(s_eff,nes,-0.1);
+    nel_out(it) = nel_out_prof(end)./(s_eff(end)-s_eff(1));
+  end
+end
-- 
GitLab