From 00da861e585d11c4acdd6fd79e4baa8043ffea82 Mon Sep 17 00:00:00 2001
From: Luke Simons <luke.simons@epfl.ch>
Date: Wed, 25 Sep 2024 11:39:00 +0200
Subject: [PATCH] Added first draft of tcv_get_ids_bolometer.m.

---
 matlab/TCV_IMAS/tcv_get_ids_bolometer.m | 123 ++++++++++++++++++++++++
 1 file changed, 123 insertions(+)
 create mode 100644 matlab/TCV_IMAS/tcv_get_ids_bolometer.m

diff --git a/matlab/TCV_IMAS/tcv_get_ids_bolometer.m b/matlab/TCV_IMAS/tcv_get_ids_bolometer.m
new file mode 100644
index 00000000..fe32da03
--- /dev/null
+++ b/matlab/TCV_IMAS/tcv_get_ids_bolometer.m
@@ -0,0 +1,123 @@
+function [ids_bolometer,ids_bolometer_description] =  ...
+    tcv_get_ids_bolometer(shot, ids_bolometer_empty, gdat_params,varargin)
+%
+% [ids_bolometer,ids_bolometer_description] = ...
+%   tcv_get_ids_bolometer(shot, ids_bolometer_empty,varargin);
+%
+% Get the bolometer diagnostics data
+%
+% ids_bolometer_empty should at least be the empty bolometer ids structure 
+% in input
+%
+% gdat_params: gdat_data.gdat_params to get all params passed from original
+% call, in particular error_bar options
+%
+% Date: 20/09/24
+% Author: L. Simons
+
+% Initialise structure with default ids_properties
+% shot=70777; gdat_params=[]; varargin={};
+% ids_bolometer_empty=ids_empty_bolometer;
+[ids_bolometer, ~] = tcv_ids_headpart(shot, ids_bolometer_empty, ...
+  'bolometer','homogeneous_time',1,'gdat_params',gdat_params, ...
+   varargin{:});
+ids_bolometer_description = struct();
+
+% Load the bolometer geometry
+bolo_geom=bolou_load_geometry();
+
+
+params_eff.data_request='\tcv_shot::top.results.bolo_u.intensity';
+params_eff.trialindx=1;
+params_eff.machine='tcv';
+params_eff.doplot=0;
+bolo_u_intensity = gdat(shot,params_eff);
+params_eff.data_request='\tcv_shot::top.results.bolo_u.prad';
+bolo_u_prad = gdat(shot,params_eff);
+params_eff.data_request='\tcv_shot::top.results.bolo_u.prad_core';
+bolo_u_prad_core = gdat(shot,params_eff);
+params_eff.data_request='\tcv_shot::top.results.bolo_u.confidence';
+bolo_u_confidence = gdat(shot,params_eff);
+
+status = ~ischar(bolo_u_intensity.data) & ~ischar(bolo_u_prad_core.data);
+
+if status
+  nchannel = numel(bolo_u_intensity.x);
+  ids_bolometer.channel(1:nchannel) = ids_bolometer.channel(1);
+  for ii = 1:nchannel
+    ids_bolometer.channel(ii) = bolo_geom.channel(ii);
+    ids_bolometer_description.channel{ii}.name = ...
+        ['RADCAM bolometer detector name, from camera labels and number ' ...
+        'VT: Vertical Top, UL: Upper Lateral, ML: Middle Lateral, ' ...
+        'DIV: Divertor, VB: Vertical bottom. Matches cabling.'];
+    ids_bolometer_description.channel{ii}.identifier = ...
+        ['RADCAM bolometer system, global index from order in ' ...
+        '\results::bolo_u tree'];
+    ids_bolometer.channel{ii}.power.data = bolo_u_intensity.data(ii,:);
+    ids_bolometer_description.channel{ii}.power.data = ...
+        ['From results.bolo_u.intensity data, Radiance measured by ' ...
+        'Each bolometer foil in units of [W/m^{2}sr]'];
+    ids_bolometer.channel{ii}.power.t = bolo_u_intensity.t;
+    ids_bolometer_description.channel{ii}.power.data = ...
+        ['From results.bolo_u.intensity dim{1}, time basis of radiance'];
+    ids_bolometer.channel{ii}.validity = 0; % FIXME: Always valid data
+    ids_bolometer.channel{ii}.power_radiated_total = bolo_u_prad.data;
+    ids_bolometer_description.channel{ii}.power_radiated_total = ...
+        ['From results.bolo_u.prad data, Total radiated power measured by ' ...
+        'the bolometer system in units of [kW]'];
+%     ids_bolometer.channel{ii}.power_radiated_total_error_upper = ...
+%         0.*bolo_u_prad.data; % FIXME: Zero error
+%     ids_bolometer.channel{ii}.power_radiated_total_error_lower = ...
+%         0.*bolo_u_prad.data; % FIXME: Zero error
+    ids_bolometer.channel{ii}.power_radiated_inside_lcfs =  ...
+        bolo_u_prad_core.data;
+    ids_bolometer_description.channel{ii}.power_radiated_inside_lcfs.data = ...
+        ['From results.bolo_u.prad_core data, Total radiated power ' ...
+        'radiated from inside the last closed flux surface measured by ' ...
+        'the bolometer system and liuqe reconstruction in units of [kW]'];
+%     ids_bolometer.channel{ii}.power_radiated_inside_lcfs_error_upper =  ...
+%         0.*bolo_u_prad_core.data;
+%     ids_bolometer.channel{ii}.power_radiated_inside_lcfs_error_lower =  ...
+%         0.*bolo_u_prad_core.data;
+    ids_bolometer.channel{ii}.power_radiated_validity = 0*bolo_u_prad.data;
+    
+  end
+  ids_bolometer.code.name = 'rc_gti_prep';
+  ids_bolometer.code.description = ...
+    ['rc_gti_prep, RADCAM gitlab repo, calls General Tomographic ' ...
+    'Inversion (GTI) commands to generate tomographic inversions ' ...
+    'of the emissivity profile and uses liuqe magnetic equilibrium ' ...
+    'reconstruction to determine radiated power in the core. ' ...
+    '/usr/local/bin/matlab960 -nojvm -nosplash -nodisplay -r ' ...
+    '"anasrvmat(''rc_gti_prep'',$2,[0 2.2],''bolo'', 10, 1, 0.04, 30,' ...
+    'false, false,false, [], ''automated'', 1)"'];
+  ids_bolometer.code.commit='';
+  ids_bolometer.code.version='';
+  ids_bolometer.code.repository= ...
+      'https://gitlab.epfl.ch/spc/tcv/diag/radcam/';
+  ids_bolometer.code.parameters='';
+  ids_bolometer.code.library{1}.name = 'meq';
+  ids_bolometer.code.library{1}.description = 'Magnetic equilibrium';
+  ids_bolometer.code.library{1}.commit = '';
+  ids_bolometer.code.library{1}.version = '';
+  ids_bolometer.code.library{1}.repository = ...
+      'https://gitlab.epfl.ch/spc/tcv/tbx/meq';
+  ids_bolometer.code.library{1}.parameters = '';
+  ids_bolometer.code.library{2}.name = 'GTI';
+  ids_bolometer.code.library{2}.description = ...
+      'General Tomographic Inversion';
+  ids_bolometer.code.library{2}.commit = '';
+  ids_bolometer.code.library{2}.version = '';
+  ids_bolometer.code.library{2}.repository = ...
+      'https://gitlab.epfl.ch/spc/tcv/analysis/gti';
+  ids_bolometer.code.library{2}.parameters = '';
+  
+  
+  % FIXME: Values of bolo_u_confidence don't match output_flag
+  ids_bolometer.code.output_flag=bolo_u_confidence; 
+  ids_bolometer.time = bolo_u_intensity.t;
+else
+  warning('Failed to load data for shot %d',shot);
+end
+
+end
-- 
GitLab