NorthStar-HMI/utils/analyze_from_csv.m

140 lines
4.5 KiB
Matlab

%% Cellule 1 : Chargement des données
filename = 'recording_20250806_155908.csv';
opts = detectImportOptions(filename);
opts = setvaropts(opts, 'timestamp', 'Type', 'datetime');
df = readtable(filename, opts);
df_PatientSkid = df(strcmp(df.pu, 'PatientSkid'), :);
%% Cellule 2 : Affichage multi-PU par grandeur
reference_lines = struct('Qperm', 1200, 'Pdilute', 2.5);
quantities = {'Qperm', 'Qdilute', 'Qdrain', 'Pro', 'Pdilute','MV07_sp'};
n_quantities = numel(quantities);
pus_all = {'PU_1', 'PU_2', 'PU_3'};
figure('Name', 'Évolution des grandeurs par PU', 'Position', [100 100 1400 300*n_quantities]);
tiledlayout(n_quantities,1)
for i = 1:n_quantities
quantity = quantities{i};
nexttile
hold on
for j = 1:length(pus_all)
pu = pus_all{j};
df_pu = df(strcmp(df.pu, pu), :);
if any(strcmp(df_pu.Properties.VariableNames, quantity))
plot(df_pu.timestamp, df_pu.(quantity), 'DisplayName', pu,'LineWidth',1.5);
end
end
% Lignes de référence
if isfield(reference_lines, quantity)
yline(reference_lines.(quantity), '--r');
end
if strcmp(quantity, 'Qdilute') && ismember('QSkid', df_PatientSkid.Properties.VariableNames)
plot(df_PatientSkid.timestamp, df_PatientSkid.QSkid, 'DisplayName', 'QSkid','LineWidth',1.5);
end
ylabel(quantity)
grid on
legend('Location', 'northeast')
if i == n_quantities
xlabel('Timestamp')
end
end
sgtitle('Évolution des grandeurs par PU')
%% Analyse initiale pour PU_1
df_pu_1 = df(strcmp(df.pu, 'PU_1'), :);
delta_t = seconds(diff(df_pu_1.timestamp));
figure('Name','Time between messages','Position',[100 100 1000 400])
histogram(delta_t, 10, 'Normalization', 'probability')
title("Time between messages for PU\_1")
xlabel(t (seconds)")
ylabel("Probability")
grid on
fprintf("Average time is %.3f seconds\n", mean(delta_t));
%% Affichage pour tous les PU
pus = unique(df.pu);
disp("PU disponibles :")
disp(pus)
pus = {'PU_2'}; % Modifier ici si besoin
for i = 1:length(pus)
pu = pus{i};
fprintf('\n--- Data for %s ---\n', pu)
plot_pu_data(df, df_PatientSkid, pu);
end
%% Fonction d'affichage PU (similaire à plot_pu_data)
function plot_pu_data(df, df_PatientSkid, pu_name)
df_pu = df(strcmp(df.pu, pu_name), :);
% --------- Plot 1: Débits ---------
flow_cols = {'Qperm', 'Qdilute', 'Qdrain', 'Qrecirc'};
available_flows = intersect(flow_cols, df_pu.Properties.VariableNames);
if ~isempty(available_flows)
figure('Name', [pu_name ' - Débits'])
hold on
for i = 1:length(available_flows)
plot(df_pu.timestamp, df_pu.(available_flows{i}), 'DisplayName', available_flows{i},'LineWidth',1.5);
end
if ismember('QSkid', df_PatientSkid.Properties.VariableNames)
plot(df_PatientSkid.timestamp, df_PatientSkid.QSkid, 'DisplayName', 'QSkid','LineWidth',1.5);
end
title([pu_name ' - Flow Rates'])
xlabel("Timestamp")
ylabel("Flow (L/min)")
legend('Location','northeast')
grid on
end
% --------- Plot 2: Pressions ---------
pressure_cols = {'Pro', 'Pdilute', 'Pretentate'};
available_pressures = intersect(pressure_cols, df_pu.Properties.VariableNames);
if ~isempty(available_pressures)
figure('Name', [pu_name ' - Pressions'])
hold on
for i = 1:length(available_pressures)
plot(df_pu.timestamp, df_pu.(available_pressures{i}), 'DisplayName', available_pressures{i},'LineWidth',1.5);
end
title([pu_name ' - Pressures'])
xlabel("Timestamp")
ylabel("Pressure (bar)")
legend('Location','northeast')
grid on
end
% --------- Plot 3: Vannes motorisées ---------
figure('Name', [pu_name ' - Motor Valve Positions'], 'Position', [100 100 1500 800])
tiledlayout(3,3)
idx = 1;
for mv = 2:8
mv_real = sprintf('MV0%d', mv);
mv_sp = sprintf('MV0%d_sp', mv);
nexttile
if ismember(mv_real, df_pu.Properties.VariableNames) && ...
ismember(mv_sp, df_pu.Properties.VariableNames)
plot(df_pu.timestamp, df_pu.(mv_real), 'b', 'DisplayName', 'Actual','LineWidth',1.5)
hold on
plot(df_pu.timestamp, df_pu.(mv_sp), '--', 'Color', [1 0.5 0], 'DisplayName', 'Setpoint','LineWidth',1.5)
title(mv_real)
ylabel("Position (%)")
legend
grid on
else
axis off
end
idx = idx + 1;
end
sgtitle([pu_name ' - Motor Valve Positions vs Setpoints'])
end