From 76453f45a4749bd670ed77bd17e569866e633db7 Mon Sep 17 00:00:00 2001 From: Jaden Diefenbaugh <blakcap@users.noreply.github.com> Date: Tue, 14 Feb 2017 22:08:12 +0100 Subject: [PATCH] plots finished --- beat/web/plotters/views.py | 10 ++- beat/web/reports/models.py | 28 +----- .../reports/app/directives/addReportItem.js | 90 ++++++++++++------- .../reports/app/services/reportService.js | 16 +++- 4 files changed, 80 insertions(+), 64 deletions(-) diff --git a/beat/web/plotters/views.py b/beat/web/plotters/views.py index eab4599a7..578accb4f 100644 --- a/beat/web/plotters/views.py +++ b/beat/web/plotters/views.py @@ -206,9 +206,11 @@ def plot(request): # Collect the data for the plot, check compatibility default = None for k, v in experiments.items(): + xp = v['obj'] + xp_analyzer = list(xp.analyzers())[0] + (analyzer_author, analyzer_name, analyzer_version) = xp_analyzer.split('/') + if v['analyzer'].find('/') >= 0: - (analyzer_author, analyzer_name, analyzer_version) = v['analyzer'].split('/') - xp = v['obj'] block = get_object_or_404(Block, experiment=v['obj'], algorithm__author__username=analyzer_author, @@ -217,8 +219,8 @@ def plot(request): ) else: block = get_object_or_404(Block, - experiment=v['obj'], - name=v['analyzer'], + experiment=xp, + name=analyzer_name, ) result = get_object_or_404(Result, diff --git a/beat/web/reports/models.py b/beat/web/reports/models.py index 4a2c87c78..cd2222490 100644 --- a/beat/web/reports/models.py +++ b/beat/web/reports/models.py @@ -214,7 +214,6 @@ class Report(models.Model): } # Process the list of experiments - common_analyzers = None accessible_experiments = [] inaccessible_experiments = [] @@ -229,36 +228,11 @@ class Report(models.Model): accessible_experiments.append(experiment) - if self.analyzer is None: - if common_analyzers is None: - common_analyzers = map(lambda x: x.algorithm, experiment.blocks.filter(analyzer=True)) - else: - analyzers = map(lambda x: x.algorithm, experiment.blocks.filter(analyzer=True)) - common_analyzers = filter(lambda x: x in analyzers, common_analyzers) - if len(common_analyzers) == 0: - return { - 'success': False, - 'error': "No common analyzer", - } - - - # Check that we have common analyzers (if necessary) - if (self.analyzer is None) and (common_analyzers is not None): - if len(common_analyzers) == 1: - self.analyzer = common_analyzers[0] - self.save() - - elif len(common_analyzers) > 1: - return { - 'success': False, - 'common_analyzers': map(lambda x: x.fullname(), common_analyzers), - } - # Add the experiments to the report incompatible_experiments = [] for experiment in accessible_experiments: - if len(experiment.blocks.filter(analyzer=True, algorithm=self.analyzer)) >= 1: + if len(experiment.blocks.filter(analyzer=True)) >= 1: self.experiments.add(experiment) else: incompatible_experiments.append(experiment.fullname()) diff --git a/beat/web/reports/static/reports/app/directives/addReportItem.js b/beat/web/reports/static/reports/app/directives/addReportItem.js index 3abdd6893..e4f0aac57 100644 --- a/beat/web/reports/static/reports/app/directives/addReportItem.js +++ b/beat/web/reports/static/reports/app/directives/addReportItem.js @@ -341,20 +341,42 @@ angular.module('reportApp').directive("addreportitem", ['$compile', 'ReportServi }); - //Results block are the same for all experiments from same analyzer. - //So just grab information from one of them for smart_selector items - let single_experiment = scope.report.experiments[0]; - - //create smart_selector items - angular.forEach(scope.report_experiments[single_experiment].plottable_blocks, function(value_plottable, key_plottable){ - let plot_type = scope.report_experiments[single_experiment].results[scope.report_experiments[single_experiment].analyzer_block][value_plottable].type; - let item_dict = {}; - item_dict["identifier"] = value_plottable; - item_dict["name"] = value_plottable; - item_dict["description"] = plot_type; + // get the possible plot data + let possiblePlots = ReportService + // only look at plots from exps in active group + .getGroupExperiments(ReportService.activeGroup) + // get the obj with the exp's possible plots + .map(expName => Object.entries(scope.report.all_experiments[expName].results.analysis) + .filter(([res_name, obj]) => res_name !== 'out_data') + .map(([res_name, obj]) => { + return { + identifier: res_name, + name: res_name, + description: obj.type + }; + }) + ) + // flatten the array of arrays generated above + .reduce((a, as) => a.concat(as), []) + // only keep plots that are possible from all the entries + .reduce((aKeep, v, i, a) => { + console.log(v); + let plotTypeCount = a.filter(o => o.description === v.description).length; + // if every exp couldnt do this plot, dont keep it + if(plotTypeCount < ReportService.getGroupExperiments(ReportService.activeGroup).length){ + console.log(`break less than`); + return aKeep; + } + // if this value is already kept, dont keep it + if(aKeep.find(o => o.description === v.description)){ + console.log(`break already`); + console.log(aKeep); + return aKeep; + } + return aKeep.concat(v); + }, []) - next_content_items.push(item_dict); - }); + next_content_items = possiblePlots; break; } @@ -558,9 +580,18 @@ angular.module('reportApp').directive("addreportitem", ['$compile', 'ReportServi let legend_experiments = ''; let alias_experiments = []; + let reportItemGroupExps; + let existGroup = ReportService.getReportItemGroup(container.id); + if(existGroup){ + reportItemGroupExps = existGroup.experiments; + } else { + ReportService.addReportItemToGroup(container.id, ReportService.activeGroup); + reportItemGroupExps = ReportService.getReportItemGroup(container.id).experiments; + } + for(let i = 0; i < scope.report.experiments.length; i++){ // if this exp isn't in the active group's exp list, dont look at it - if(!ReportService.getGroupExperiments(ReportService.activeGroup).includes(scope.report.experiments[i])){ + if(!reportItemGroupExps.includes(scope.report.experiments[i])){ continue; } @@ -575,9 +606,20 @@ angular.module('reportApp').directive("addreportitem", ['$compile', 'ReportServi alias_experiments.push(scope.report_experiments_alias_from_content[scope.report.experiments[i]]); } + let getAnalyzerFromExpName = (expName) => { + if(!scope.report.all_experiments){ + return null; + } + let e = scope.report.all_experiments[expName]; + if(!e){ + return null; + } + return e.declaration.analyzers.analysis.algorithm; + }; + let request_data = { experiment: alias_experiments, - analyzer: [scope.report.analyzer], + analyzer: [getAnalyzerFromExpName(reportItemGroupExps[0])], output: [chart_name], plotter: set_plotter, legend: legend_experiments, @@ -589,19 +631,10 @@ angular.module('reportApp').directive("addreportitem", ['$compile', 'ReportServi base_url = scope.report.url_prefix; //scope.plots_details[container.id]; - let getAnalyzerFromExpName = (expName) => { - let e = scope.report.all_experiments[expName]; - if(!e){ - return null; - } - return e.declaration.analyzers.analysis.algorithm; - }; - let analyzers = [scope.report.analyzer]; - if(ReportService.activeGroup){ - analyzers = ReportService.getGroupExperiments(ReportService.activeGroup) - .map(expName => getAnalyzerFromExpName(expName)); - } + analyzers = reportItemGroupExps + .map(expName => getAnalyzerFromExpName(expName)) + .filter(a => a); let plot_detail = {}; plot_detail["required_plotter"] = required_plotter; @@ -631,9 +664,6 @@ angular.module('reportApp').directive("addreportitem", ['$compile', 'ReportServi } scope.plots_details[container.id]= plot_detail; - if(ReportService.activeGroup){ - ReportService.addReportItemToGroup(container.id, ReportService.activeGroup); - } if(scope.report.status == "editable" && scope.report.number != scope.report_number){ beat.experiments.utils.displayPlot(base_url, $(container).find('.panel-body')[0], diff --git a/beat/web/reports/static/reports/app/services/reportService.js b/beat/web/reports/static/reports/app/services/reportService.js index 926381fbe..a1ea27a55 100644 --- a/beat/web/reports/static/reports/app/services/reportService.js +++ b/beat/web/reports/static/reports/app/services/reportService.js @@ -89,7 +89,13 @@ angular.module('reportApp').factory('ReportService', ['$http', function($http){ // } reportServiceInstance.serializeGroups = () => { return groupData - .map(g => { return { [g.name]: g.experiments }; }) + .map(g => { return { + [g.name]: { + experiments: g.experiments, + reportItemIds: g.reportItemIds + } + }; + }) .reduce((o, g) => Object.assign(o, g), {}); }; @@ -127,12 +133,16 @@ angular.module('reportApp').factory('ReportService', ['$http', function($http){ // ... // } reportServiceInstance.loadGroups = (data) => { + if(!data){ + return; + } // wipe data and load groups groupData.splice(0, groupData.length); Object.entries(data) - .forEach(([groupName, expNames]) => { + .forEach(([groupName, groupData]) => { let g = reportServiceInstance.createGroup(groupName); - expNames.forEach(n => g.addExperiment(n)); + groupData.experiments.forEach(n => g.addExperiment(n)); + groupData.reportItemIds.forEach(id => g.addReportItem(id)); }); }; -- GitLab