basePath = 'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\'; database = DBHandler("pathToDB",[basePath,'silas_labor.db'],"type",'sqlite'); filterParams = database.tables; filterParams.Configurations = struct( ... 'bitrate', 420e9, ... %[224,336,360,390,420,448] 'db_mode', int32(db_mode.no_db), ... 'fiber_length', 10, ... 'interference_attenuation', [], ... 'interference_path_length', [], ... 'is_mpi', 0, ... 'pam_level', 4, ... 'rop_attenuation', 0, ... 'wavelength', 1310 ... ); % filterParams.EqualizerParameters.diff_precode = int32(db_mode.db_encoded); % filterParams.EqualizerParameters.equalizer_structure = int32(equalizer_structure.vnle); filterParams.EqualizerParameters.DCmu = 0.00; selectedFields = {'Configurations.run_id' 'Runs.rx_raw_path' 'Configurations.bitrate' 'Configurations.symbolrate' 'Configurations.pam_level'... 'Configurations.db_mode' 'Configurations.rop_attenuation' 'Configurations.is_mpi' 'Configurations.interference_attenuation' ... 'EqualizerParameters.equalizer_structure' 'EqualizerParameters.diff_precode' 'EqualizerParameters.eq_id' 'Measurements.power_pd_in' ... 'Measurements.power_mpi_interference' 'Measurements.power_mpi_signal' 'Results.BER' 'Results.BER_precoded' 'Results.SNR' 'Results.GMI' 'Results.Alpha' 'Results.date_of_processing'}; [dataTable,sql_query] = database.queryDB(filterParams, selectedFields); fixedVars = {'eq_id','bitrate'}; dataTableGrpd = groupIt(fixedVars,dataTable); plotRealizations = 1; % Create a new figure figure(); hold on unique_eq = unique(dataTable.eq_id); cols = linspecer(8); for i = 1:numel(unique_eq) idx = find(dataTableGrpd.eq_id == unique_eq(i), 1, 'first'); equalizer_ = equalizer_structure(dataTableGrpd.equalizer_structure(idx)); % Plot SCATTERS: timestamp vs. interference_attenuation loop_filt = dataTable.eq_id==unique_eq(i); if plotRealizations switch equalizer_ case equalizer_structure.vnle bers = dataTable.BER(loop_filt,:); case equalizer_structure.vnle_pf_mlse bers = dataTable.BER(loop_filt,:); case equalizer_structure.vnle_db_mlse bers = dataTable.BER_precoded(loop_filt,:); case equalizer_structure.db_encoded bers = dataTable.BER(loop_filt,:); end date_of_proc = datetime(dataTable.date_of_processing(loop_filt,:)); sc = scatter(date_of_proc, bers, 'LineWidth', 0.5,'Marker','*','MarkerEdgeColor',cols(i,:),'HandleVisibility','off'); pair_one = {'Run ID', dataTable.run_id(loop_filt,:)}; pair_two = {'Rate', dataTable.bitrate(loop_filt,:)}; addDatatips(sc, pair_one, pair_two); xticks(date_of_proc); end end % Label the axes and add a title xlabel('Time of Processing'); ylabel('BER'); title('Line Rate vs. BER'); yline(3.8e-3,'LineWidth',1,'LineStyle','--','HandleVisibility','off'); % Enable grid for better readability grid on; beautifyBERplot; ylim([1e-4 0.5]); function resultTable = groupIt(fixedVars,dataTable) % Group by run_id and eq_id (adjust grouping keys as needed) [G, groupKeys] = findgroups(dataTable(:, fixedVars)); % Preallocate a cell array for aggregated data. varNames = dataTable.Properties.VariableNames; nVars = numel(varNames); aggData = cell(height(groupKeys), nVars); groupCount = zeros(height(groupKeys), 1); % To store the size of each group % Loop over each group. for i = 1:height(groupKeys) idx = (G == i); % Logical index for group i groupCount(i) = sum(idx); % Count number of rows in this group % For each variable in the table: for j = 1:nVars colData = dataTable.(varNames{j}); if isnumeric(colData) % For numeric data, compute the mean. aggData{i, j} = min(colData(idx)); else % For non-numeric data, take the first entry. if iscell(colData) aggData{i, j} = colData{find(idx, 1)}; else aggData{i, j} = colData(find(idx, 1)); end end end end % Convert the aggregated cell array into a table. resultTable = cell2table(aggData, 'VariableNames', varNames); % Append the group count as a new column. resultTable.nRows = groupCount; end function addDatatips(sc, varargin) % addDatatips Adds custom data tip rows to a scatter plot. % % addDatatips(sc, pair1, pair2, ...) adds one or more custom rows to the % data tip display of the scatter plot identified by sc. % % Each pair should be provided as a 1x2 cell array: {label, value}. % The value can be a scalar or a vector. If a vector is provided, its length % must match the number of scatter plot points. % % Example: % sc = scatter(x, y, 'LineWidth', 1.5, 'Marker', 'o'); % pair_one = {'Attenuation', attenuationVector}; % addDatatips(sc, pair_one); numPoints = numel(sc.XData); for k = 1:length(varargin) pair = varargin{k}; if ~iscell(pair) || numel(pair) ~= 2 error('Each pair must be a 1x2 cell array: {label, value}.'); end label = pair{1}; value = pair{2}; % If value is a vector, ensure its length is either 1 or equal to the number of scatter points. if isvector(value) && numel(value) ~= 1 && numel(value) ~= numPoints error('The vector for "%s" must be a scalar or have %d elements matching the scatter data points.', label, numPoints); end % Create a new data tip row using the provided label and vector. newRow = dataTipTextRow(label, value); sc.DataTipTemplate.DataTipRows(end+1) = newRow; end end