Skip to content

Commit

Permalink
SolO QLI: ~Cleanup: Uppercase DSIs, use abbrev. DSI, new batch.const
Browse files Browse the repository at this point in the history
new file:   +solo/+qli/+batch/const.m
modified:   +solo/+qli/+batch/extract_dataset_dates_from_logs.m
modified:   +solo/+qli/+batch/extract_dataset_dates_from_logs___UTEST.m
modified:   +solo/+qli/+batch/get_days_from_logs.m
  • Loading branch information
ErikPGJ committed Apr 3, 2024
1 parent 40f49cf commit 48c2f80
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 46 deletions.
39 changes: 39 additions & 0 deletions mission/solar_orbiter/+solo/+qli/+batch/const.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
%
% Collection of constants.
%
%
% Author: Erik P G Johansson, IRF, Uppsala, Sweden
%
classdef const



%#####################
%#####################
% INSTANCE PROPERTIES
%#####################
%#####################
properties(Constant)

% DSIs (i.e. excluding CDAG) of filenames which will be searched for in
% the respective logs.
% IRFU_LOGS_DSI_CA = {
% 'SOLO_L3_RPW-BIA-EFIELD-10-SECONDS', ...
% 'SOLO_L3_RPW-BIA-DENSITY-10-SECONDS'...
% }
LESIA_LOGS_DSI_CA = {
'SOLO_L2_RPW-TNR-SURV', ...
'SOLO_L3_RPW-BIA-EFIELD-10-SECONDS', ...
'SOLO_L3_RPW-BIA-DENSITY-10-SECONDS'...
}
SOAR_LOGS_DSI_CA = {
'SOLO_L2_MAG-RTN-NORMAL', ...
'SOLO_L2_MAG-RTN-NORMAL-1-MINUTE', ...
'SOLO_L2_SWA-PAS-EFLUX', ...
'SOLO_L2_SWA-PAS-GRND-MOM', ...
}
end



end
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
% String. String pattern for dir() command describing one or multiple log
% files.
% NOTE: Must match at least one file (~failsafe).
% datasetIdCa
% dsiCa
% Cell array of dataset IDs for datasets which should be searched for.
% NOTE: This excludes any "-cdag" suffix. The code will match both CDAG
% and non-CDAG files.
Expand All @@ -34,8 +34,8 @@
% Author: Erik P G Johansson, IRF, Uppsala, Sweden
%
function [DatasetsDtArray, logFilePath] = extract_dataset_dates_from_logs(...
logFileDirPattern, datasetIdCa)
% PROPOSAL: Require correct case for dataset ID?
logFileDirPattern, dsiCa)

% PROPOSAL: Specify filename patterns (not dataset IDs).
% PROPOSAL: Require at least one dataset ID.

Expand Down Expand Up @@ -78,19 +78,27 @@
s = fileread(logFilePath);

datasetFileNameCa = cell(0, 1);
for i = 1:numel(datasetIdCa)
datasetId = datasetIdCa{i};
% IMPLEMENTATION NOTE: Important to prevent maximal munch from making
% matches covering multiple datasets/filenames.
for i = 1:numel(dsiCa)
dsi = dsiCa{i};

assert(strcmp(dsi, upper(dsi)), 'dsi="%s" is not uppercase (convention).', dsi)

% IMPLEMENTATION NOTE: Important to prevent maximal munch from making matches
% covering multiple datasets/filenames.
% Ex: Over multiple rows. ==> Exclude line feed in filename.
% Ex: On the same row. ==> Exclude period in filename (except before file suffix).
% NOTE: solo.adm.parse_dataset_filename()'s "unofficial" basename extension
% can cause problems if there are multiple dataset filenames on the same row
% and one does not exclude e.g. period.
% NOTE: Must permit filenames with and without "-cdag".
pattern = sprintf('%s(|-cdag)_[^\\n.]*\\.cdf', datasetId);
pattern = sprintf('%s(|-cdag)_[^\\n.]*\\.cdf', dsi);

matchCa = regexpi(s, pattern, 'match'); % NOTE: Case-insensitive.
% IMPLEMENTATION NOTE: Using case-insensitive reg. exp. matching to handle
% that (1) dataset filenames contain DSI in lowercase (mostly), and (2) that
% uppercase dataset IDs have not been historically required in this code.
% Note: Some dataset filenames actually have mixed case in the dataset ID part
% (I think) but they are not relevant here (yet).
matchCa = regexpi(s, pattern, 'match');

datasetFileNameCa = [datasetFileNameCa; matchCa(:)];
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ function close_figures(testCase)
function test_zero_logs(testCase)
function call_raise_exception(varargin)
[~, ~] = solo.qli.batch.extract_dataset_dates_from_logs(...
'/nonexisting_dir/nonexisting_log.log', {'solo_L3_rpw-bia-density'});
'/nonexisting_dir/nonexisting_log.log', {'SOLO_L3_RPW-BIA-DENSITY'});
end

testCase.verifyError(...
Expand All @@ -90,7 +90,7 @@ function test_one_log_empty(testCase)
solo.qli.batch.utils.write_file(filePath, {})

[ActDtArray, actLogFilePath] = solo.qli.batch.extract_dataset_dates_from_logs(...
logFileDirPattern, {'solo_L3_rpw-bia-density'});
logFileDirPattern, {'SOLO_L3_RPW-BIA-DENSITY'});

testCase.assertEqual(ActDtArray, solo.qli.const.EMPTY_DT_ARRAY)
testCase.assertEqual(actLogFilePath, filePath)
Expand All @@ -109,7 +109,7 @@ function test_one_log_no_match(testCase)
})

ActDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
logFileDirPattern, {'solo_L3_rpw-bia-density'});
logFileDirPattern, {'SOLO_L3_RPW-BIA-DENSITY'});

testCase.assertEqual(sort(ActDtArray), solo.qli.const.EMPTY_DT_ARRAY)
end
Expand All @@ -128,7 +128,7 @@ function test_one_log_one_match_simple(testCase)
ExpDtArray = solo.qli.utils.umdt('2024-01-01');

ActDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
logFileDirPattern, {'solo_L3_rpw-bia-density'});
logFileDirPattern, {'SOLO_L3_RPW-BIA-DENSITY'});

testCase.assertEqual(sort(ActDtArray), sort(ExpDtArray))
end
Expand Down Expand Up @@ -165,7 +165,7 @@ function test_one_log_two_identical_matches(testCase)
ExpDtArray = solo.qli.utils.umdt('2024-01-01');

ActDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
logFileDirPattern, {'solo_L3_rpw-bia-density'});
logFileDirPattern, {'SOLO_L3_RPW-BIA-DENSITY'});

testCase.assertEqual(sort(ActDtArray), sort(ExpDtArray))
end
Expand All @@ -186,7 +186,7 @@ function test_one_log_CDAG_nonCDAG(testCase)
ExpDtArray = solo.qli.utils.umdt({'2024-01-01'; '2024-02-01'});

ActDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
logFileDirPattern, {'solo_L3_rpw-bia-density'});
logFileDirPattern, {'SOLO_L3_RPW-BIA-DENSITY'});

testCase.assertEqual(sort(ActDtArray), sort(ExpDtArray))
end
Expand All @@ -209,7 +209,7 @@ function test_one_log_one_DSI_complex(testCase)
ExpDtArray = solo.qli.utils.umdt({'2024-01-01'; '2024-02-01'});

ActDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
logFileDirPattern, {'solo_L3_rpw-bia-density'});
logFileDirPattern, {'SOLO_L3_RPW-BIA-DENSITY'});

testCase.assertEqual(sort(ActDtArray), sort(ExpDtArray))
end
Expand All @@ -234,7 +234,7 @@ function test_one_log_multiple_DSIs_complex(testCase)

ExpDtArray = solo.qli.utils.umdt('2024-01-01') + calmonths([0;1;2;3]);
ActDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
logFileDirPattern, {'solo_L3_rpw-bia-density', 'solo_L2_mag-rtn-normal-1-minute'});
logFileDirPattern, {'SOLO_L3_RPW-BIA-DENSITY', 'SOLO_L2_MAG-RTN-NORMAL-1-MINUTE'});

testCase.assertEqual(sort(ActDtArray), sort(ExpDtArray))
end
Expand All @@ -253,7 +253,7 @@ function test_one_log_multiple_matches_on_same_row(testCase)
ExpDtArray = solo.qli.utils.umdt({'2024-01-01'; '2024-02-01'});

ActDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
logFileDirPattern, {'solo_L3_rpw-bia-density'});
logFileDirPattern, {'SOLO_L3_RPW-BIA-DENSITY'});

testCase.assertEqual(sort(ActDtArray), sort(ExpDtArray))
end
Expand Down Expand Up @@ -281,7 +281,7 @@ function test_multiple_logs_multiple_DSIs_complex(testCase)
ExpDtArray = solo.qli.utils.umdt({'2025-01-01'; '2025-02-01'});

[ActDtArray, actLogFilePath] = solo.qli.batch.extract_dataset_dates_from_logs(...
logFileDirPattern, {'solo_L3_rpw-bia-density', 'solo_L2_mag-rtn-normal-1-minute'});
logFileDirPattern, {'SOLO_L3_RPW-BIA-DENSITY', 'SOLO_L2_MAG-RTN-NORMAL-1-MINUTE'});

testCase.assertEqual(sort(ActDtArray), sort(ExpDtArray))
testCase.assertEqual(actLogFilePath, filePath2)
Expand Down
43 changes: 16 additions & 27 deletions mission/solar_orbiter/+solo/+qli/+batch/get_days_from_logs.m
Original file line number Diff line number Diff line change
Expand Up @@ -30,47 +30,36 @@
% Author: Erik P G Johansson, IRF, Uppsala, Sweden
%
function DaysDtArray = get_days_from_logs(Settings, varargin)
% PROPOSAL: Move dataset IDs to solo.qli.batch.const (new)

DaysDtArray = solo.qli.const.EMPTY_DT_ARRAY;

for i = 1:numel(varargin)
datasetsSourceId = varargin{i};
assert(ischar(datasetsSourceId), 'datasetsSource is not a string.')
logFilesId = varargin{i};
assert(ischar(logFilesId), 'logFilesId %i is not a string.', i)

switch(datasetsSourceId)
switch(logFilesId)

% case 'IRFU'
% DaysDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
% '/home/erjo/logs/so_bicas_batch_cron.*.log', ...
% {...
% 'solo_L3_rpw-bia-efield-10-seconds', ...
% 'solo_L3_rpw-bia-density-10-seconds'...
% });
% case 'IRFU'
% % '/home/erjo/logs/so_bicas_batch_cron.*.log'
% logFileDirPattern = Settings.irfuLogFileDirPattern;
% dsiCa = solo.qli.batch.const.IRFU_LOGS_DSI_CA;

case 'LESIA'
SourceDaysDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
Settings.lesiaLogFileDirPattern, ...
{
'solo_L2_rpw-tnr-surv', ...
'solo_L3_rpw-bia-efield-10-seconds', ...
'solo_L3_rpw-bia-density-10-seconds'...
});
logFileDirPattern = Settings.lesiaLogFileDirPattern;
dsiCa = solo.qli.batch.const.LESIA_LOGS_DSI_CA;

case 'SOAR'
SourceDaysDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
Settings.soarLogFileDirPattern, ...
{
'solo_L2_mag-rtn-normal', ...
'solo_L2_mag-rtn-normal-1-minute', ...
'solo_L2_swa-pas-eflux', ...
'solo_L2_swa-pas-grnd-mom', ...
});
logFileDirPattern = Settings.soarLogFileDirPattern;
dsiCa = solo.qli.batch.const.SOAR_LOGS_DSI_CA;

otherwise
error('Illegal datasetsSourceId="%s"', datasetsSourceId)
error('Illegal datasetsSourceId="%s"', logFilesId)
end

SourceDaysDtArray = solo.qli.batch.extract_dataset_dates_from_logs(...
logFileDirPattern, dsiCa);


DaysDtArray = [DaysDtArray; SourceDaysDtArray];
end

Expand Down

0 comments on commit 48c2f80

Please sign in to comment.