Added the csv reader
This commit is contained in:
parent
365162bd65
commit
5ac459a0d5
139
analyze_from_csv.m
Normal file
139
analyze_from_csv.m
Normal file
|
|
@ -0,0 +1,139 @@
|
||||||
|
%% 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
|
||||||
Loading…
Reference in New Issue
Block a user