%% ===== BEC-Droplets Settings =====

% Specify data location to run analysis on
dataSources = {
    struct('sequence', 'StructuralPhaseTransition', ...
           'date', '2025/08/13', ...
           'runs', [62]) % specify run numbers as a string in "" or just as a numeric value
};

options = struct();

% File paths
options.baseDataFolder     = '//DyLabNAS/Data';
options.FullODImagesFolder = 'E:/Data - Experiment/FullODImages/202508';
options.measurementName    = 'BECToDroplets';
scriptFullPath             = mfilename('fullpath');
options.saveDirectory      = fileparts(scriptFullPath);

% Camera / imaging settings
options.cam                = 4;             % 1 - ODT_1_Axis_Camera; 2 - ODT_2_Axis_Camera; 3 - Horizontal_Axis_Camera;, 4 - Vertical_Axis_Camera;
options.angle              = 0;             % angle by which image will be rotated
options.center             = [1420, 2050];
options.span               = [200, 200];
options.fraction           = [0.1, 0.1];
options.pixel_size         = 5.86e-6;       % in meters
options.magnification      = 24.6;
options.ImagingMode        = 'HighIntensity';
options.PulseDuration      = 5e-6;          % in s

% Fourier analysis settings
options.theta_min          = deg2rad(0);
options.theta_max          = deg2rad(180);
options.N_radial_bins      = 500;
options.Radial_Sigma       = 2;
options.Radial_WindowSize  = 5;              % odd number

options.k_min              = 1.2771;         % μm⁻¹
options.k_max              = 2.5541;         % μm⁻¹
options.N_angular_bins     = 180;
options.Angular_Threshold  = 75;
options.Angular_Sigma      = 2;
options.Angular_WindowSize = 5;
options.zoom_size          = 50;

% Flags
options.skipUnshuffling           = false;
options.skipNormalization         = false;

options.skipFringeRemoval         = true;
options.skipPreprocessing         = true;
options.skipMasking               = true;
options.skipIntensityThresholding = true;
options.skipBinarization          = true;

options.skipFullODImagesFolderUse = false;
options.skipSaveData              = false;
options.skipSaveFigures           = true;
options.skipSaveProcessedOD       = true;
options.skipLivePlot              = false;
options.showProgressBar           = true;

% Extras
options.font = 'Bahnschrift';
switch options.measurementName
    case 'BECToDroplets'
        options.scan_parameter        = 'rot_mag_field';
        options.flipSortOrder         = true;
        options.scanParameterUnits    = 'gauss';
        options.titleString           = 'BEC to Droplets';
    case 'BECToStripes'
        options.scan_parameter        = 'rot_mag_field';
        options.flipSortOrder         = true;
        options.scanParameterUnits    = 'gauss';
        options.titleString           = 'BEC to Stripes';
    case 'DropletsToStripes'
        options.scan_parameter        = 'ps_rot_mag_fin_pol_angle';
        options.flipSortOrder         = false;
        options.scanParameterUnits    = 'degrees';
        options.titleString           = 'Droplets to Stripes';
    case 'StripesToDroplets'
        options.scan_parameter        = 'ps_rot_mag_fin_pol_angle';
        options.flipSortOrder         = false;
        options.scanParameterUnits    = 'degrees';
        options.titleString           = 'Stripes to Droplets';
end

%% ===== Collect Images and Launch Viewer =====

[options.selectedPath, options.folderPath]                         = Helper.selectDataSourcePath(dataSources, options);

[od_imgs, scan_parameter_values, scan_reference_values, file_list] = Helper.collectODImages(options);

%% Conduct correlation analysis
options.skipLivePlot                                               = true;
g2_analysis_results                                                = Analyzer.conductCorrelationAnalysis(od_imgs, scan_parameter_values, options);

%% Analyze G2 matrices

% ROI definition
options.roi.center         = [3, 3];    % center of ROI in µm (x0, y0)
options.roi.size           = [3, 11];   % width and height in µm
options.roi.angle          = pi/4;      % rotation angle (radians, CCW)
options.threshold          = 0.85;
options.fitDeviationThreshold = 0.9;

% Plot control
options.skipLivePlot       = true;
analysis_results           = Analyzer.analyzeG2Structures(g2_analysis_results, options);

%% Plot raw OD images and the corresponding real space g2 matrix

options.skipLivePlot    = true; 
options.skipSaveFigures = true;

Plotter.plotODG2withAnalysis(od_imgs, scan_parameter_values, g2_analysis_results, analysis_results, options, ...
    'FontName', options.font, ...
    'FontSize', 14, ...
    'ShowOverlays', true, ...
    'RepsPerPage', 5, ... 
    'SaveDirectory', options.saveDirectory , ...
    'SkipLivePlot', options.skipLivePlot, ...
    'SkipSaveFigures', options.skipSaveFigures);

%% Plot mean and standard error of anisotropy

Plotter.plotMeanWithSE(scan_parameter_values, analysis_results.anisotropy_vals, ...
    'Title', options.titleString, ...
    'YLim', [0,6], ...
    'XLabel', '\alpha (degrees)', ...
    'YLabel', 'Anisotropy of correlation peaks', ...
    'FigNum', 1, ...
    'FontName', options.font, ...
    'SaveFileName', 'RadialSpectralContrast.fig', ...
    'SaveDirectory', options.saveDirectory , ...
    'SkipSaveFigures', options.skipSaveFigures);

%% Plot distribution of anisotropy
grouped_data          = groupDataByScan(scan_parameter_values, analysis_results.anisotropy_vals);

% call plotPDF
Plotter.plotPDF(grouped_data, ...
    scan_reference_values, ...
    'Title', options.titleString, ...
    'XLabel', '\alpha (degrees)', ...
    'YLabel', 'Anisotropy of correlation peaks', ...
    'FigNum', 2, ...
    'FontName', options.font, ...
    'SkipSaveFigures', options.skipSaveFigures, ...
    'SaveFileName', 'PDF_MaxG2AcrossTransition.fig', ...
    'SaveDirectory', options.saveDirectory , ...
    'NumberOfBins', 20, ... 
    'NormalizeHistogram', true, ... 
    'DataRange', [0 10], ...
    'Colormap', @Colormaps.coolwarm, ...
    'XLim', [min(scan_reference_values) max(scan_reference_values)]);

function groupedData = groupDataByScan(scan_values, data_values)
%% groupByScanValues
% Groups data according to unique scan parameter values.
%
% Inputs:
%   scan_values : array of scan parameters (length = N_reps * N_scan)
%   data_values : numeric array or cell array of measured values
%                 (same length as scan_values)
%
% Output:
%   groupedData : 1 x N_unique cell array, each containing all repetitions
%                 corresponding to a unique scan value

    [unique_vals, ~, idx] = unique(scan_values, 'stable');  % preserve order
    groupedData = cell(1, numel(unique_vals));

    for i = 1:numel(unique_vals)
        if iscell(data_values)
            group = data_values(idx == i);
            groupedData{i} = [group{:}];  % concatenate if nested cells
        else
            groupedData{i} = data_values(idx == i);
        end
    end
end
