classdef results_full_trajectories < handle
    %RESULTS_FULL_TRAJECTORIES Summary of this class goes here
    %   Detailed explanation goes here
    
    properties(GetAccess = 'protected', SetAccess = 'protected')
        window = [];
        parent = [];              
        grid = [];
        grid_box = [];
        panels = [];
        controls_box = [];
        axis = [];        
        sel_combos  = [];
        nx_combo = [];
        ny_combo = [];
        
        measures_list = {};        
    end
    
    methods
        function inst = results_full_trajectories(par, par_wnd)
            global g_config;
            inst.parent = par;
            inst.window = uiextras.VBox('Parent', par_wnd);
            
            for i = 1:length(g_config.DATA_REPRESENTATION)
                par = g_config.DATA_REPRESENTATION{i};
                switch par{2}
                    case base_config.DATA_TYPE_SCALAR_FIELD
                        inst.measures_list = [inst.measures_list, ...
                            {{ par{1}, i, []}, ...
                            { [par{1} ' (mean)'], i, @(vals) mean(vals(:, 4)) }, ...
                            { [par{1} ' (max)'], i, @(vals) max(vals(:, 4)) }, ...
                            { [par{1} ' (min)'], i, @(vals) min(vals(:, 4)) }} ...
                        ];
                    case base_config.DATA_TYPE_EVENTS
                        inst.measures_list = [inst.measures_list, ...
                            {{ par{1}, i, []}, ...
                            { [par{1} ' (count)'], i, @(vals) sum(vals(:, 4) > 0) }} ...                                  
                        ];
                end
            end
        end
        
        function update(inst)                           
            if isempty(inst.grid)                                
                inst.grid_box = uiextras.VBox('Parent', inst.window);                  
                inst.controls_box = uiextras.HBox('Parent', inst.window);  
                set(inst.window, 'Sizes', [-1, 40]);                
                                
                uicontrol('Parent', inst.controls_box, 'Style', 'text', 'String', 'NX:');
                inst.nx_combo = uicontrol('Parent', inst.controls_box, 'Style', 'popupmenu', 'String', {'1', '2', '3', '4', '5', '6'}, 'Callback', {@inst.update_layout});
                set(inst.nx_combo, 'value', 2);
                uicontrol('Parent', inst.controls_box, 'Style', 'text', 'String', 'NY:');
                inst.ny_combo = uicontrol('Parent', inst.controls_box, 'Style', 'popupmenu', 'String', {'1', '2', '3', '4', '5', '6'}, 'Callback', {@inst.update_layout});    
                set(inst.ny_combo, 'value', 2);                   
                
                inst.update_layout;                                    
            else
                inst.update_plots;
            end            
        end
        
        function update_layout(inst, source, event_data)
            if ~isempty(inst.grid)                
                delete(inst.grid);
            end
                        
            inst.grid = uiextras.Grid('Parent', inst.grid_box);
            nx = get(inst.nx_combo, 'value');
            ny = get(inst.ny_combo, 'value');
            if ~isempty(inst.axis)
                arrayfun( @(x) delete(x), inst.axis);
            end            
            inst.axis = [];
            inst.panels = [];
            inst.sel_combos = [];
            
            for i = 1:nx*ny                              
                vbox = uiextras.VBox('Parent', inst.grid);
                % create one box for the axis (created later)
                inst.axis = [inst.axis, axes('Parent', vbox, 'Visible', 'off')];
                box = uiextras.HBox('Parent', vbox);
                
                uicontrol('Parent', box, 'Style', 'text', 'String', 'Measure:');
                strs = {'None'};
                for j = 1:length(inst.measures_list)                    
                    par = inst.measures_list{j};
                    strs = [strs, par{1}];
                end
                inst.sel_combos = [inst.sel_combos, uicontrol('Parent', box, 'Style', 'popupmenu', 'String', strs, 'Callback', @inst.update_plots)];
                set(vbox, 'Sizes', [-1, 40]);              
                set(box, 'Sizes', [50, 200]);
            end                                
                            
            set(inst.grid, 'RowSizes', ones(1, nx)*-1, 'ColumnSizes', ones(1, nx)*-1); 
            inst.update_plots;
        end
        
        function update_plots(inst, source, event_data)
            global g_config;
            nx = get(inst.nx_combo, 'value');
            ny = get(inst.ny_combo, 'value');            
            grp = inst.parent.group;
            ti = inst.parent.first_trial;
            tf = inst.parent.last_trial;
            clr = [ [0, 0, 1]; [1, 0, 0]; [0, 1, 0]];
            hold off;
            for i = 1:nx*ny                              
                sel = get(inst.sel_combos(i), 'value');
                if sel > 1
                    % create an axis
                    % stupid_box = uiextras.HBox('Parent', inst.traj_measures_panels(i));
                    % inst.traj_measures_axis = [inst.traj_measures_axis , axes('Parent', stupid_box)];
                    set(inst.axis(i), 'Visible', 'on');
                    set(inst.parent.window, 'currentaxes', inst.axis(i));
                    meas_param = inst.measures_list{sel - 1};
                    f = meas_param{3};
                    dr = meas_param{2};
                    dr_param = g_config.DATA_REPRESENTATION{meas_param{2}};
                    % data type
                    dt = dr_param{2}; 
                    % plot something
                    data = {};
                    for g = 1:g_config.GROUPS
                        for t = 1:inst.parent.traj.parent.count
                            tg = inst.parent.traj.parent.items(t).group;
                            if grp == 1 || (grp == 2 && g == tg) || (grp - 2) == tg
                                % see if trial matches                                                               
                                if inst.parent.traj.parent.items(t).trial >= ti && inst.parent.traj.parent.items(t).trial <= tf
                                    tmp = inst.parent.traj.parent.items(t).data_representation(dr);
                                    % see if we have continuous values or
                                    % one squashing function                                     
                                    if isempty(f)                                        
                                        switch dt
                                            case base_config.DATA_TYPE_SCALAR_FIELD                                                                                                
                                                data = [data, tmp(:, [1, 4])];
                                            case base_config.DATA_TYPE_EVENT
                                                data = [data, tmp(find(tmp(:, 4) > 0), 1)];
                                            otherwise
                                                error('ops')
                                        end
                                    else
                                        % single values
                                        data = [data, f(tmp)];
                                    end
                                end
                            end
                        end
                        % see what to plot
                        if ~isempty(f)
                           % scalar values -> plot histogram
                           bar(hist(data{:}, 15) ./ sum(hist(data{:}, 15)), 'FaceColor', clr(g, :));
                        else                            
                            switch dt
                                case base_config.DATA_TYPE_SCALAR_FIELD
                                    % plot individual lines
                                    for t = 1:length(data)                                        
                                        tmp = data{t};
                                        plot(tmp(:, 1), tmp(:, 2), '-', 'Color', clr(g, :));
                                        hold on;
                                    end
                                case base_config.DATA_TYPE_EVENT
                                    
                            end                                
                        end
                      
                        if grp == 1
                            break;
                        end                                                                                                
                        
                    end                                        
                end
            end
        end
    end    
end