From 0391c6cea8b76d9e96660d2fee72a3d9b84b1db6 Mon Sep 17 00:00:00 2001 From: Hongxin Zhang Date: Thu, 13 Oct 2016 09:51:57 -0400 Subject: [PATCH 01/12] Solve issue #312 --- app/scripts/model/dataProxy.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/scripts/model/dataProxy.js b/app/scripts/model/dataProxy.js index 0bb9630..43d8e94 100644 --- a/app/scripts/model/dataProxy.js +++ b/app/scripts/model/dataProxy.js @@ -3,10 +3,11 @@ window.DataManagerForIviz = (function($, _) { var content = {}; // DESC var clinicalAttrsPriority = ['CANCER_TYPE', 'CANCER_TYPE_DETAILED', - 'GENDER', 'AGE', 'sequenced', 'has_cna_data', 'sample_count_patient']; + 'GENDER', 'SEX', 'AGE', 'sequenced', 'has_cna_data', 'sample_count_patient']; var studyClinicalAttrsPriority = { - mskimpact: ['DARWIN_PATIENT_AGE', 'OS_STATUS'] + mskimpact: ['DARWIN_PATIENT_AGE', 'OS_STATUS', 'SAMPLE_TYPE', + 'DARWIN_VITAL_STATUS'] }; // Clinical attributes will be transfered into table. From cd41da41e930feac2a94a66ab93b9a77018db55e Mon Sep 17 00:00:00 2001 From: Hongxin Zhang Date: Thu, 13 Oct 2016 10:13:21 -0400 Subject: [PATCH 02/12] Solve #310 --- app/scripts/views/components/pieChart/pieChart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/views/components/pieChart/pieChart.js b/app/scripts/views/components/pieChart/pieChart.js index 76d2820..f8170ad 100644 --- a/app/scripts/views/components/pieChart/pieChart.js +++ b/app/scripts/views/components/pieChart/pieChart.js @@ -106,7 +106,7 @@ style: { classes: 'qtip-light qtip-rounded qtip-shadow forceZindex qtip-max-width iviz-pie-qtip iviz-pie-label-qtip' }, - show: {event: 'mouseover', delay: 0, ready: true}, + show: {event: 'mouseover', delay: 300, ready: true}, hide: {fixed: true, delay: 300, event: 'mouseleave'}, // hide: false, position: {my: 'left center', at: 'center right', viewport: $(window)}, From 0820d026b948847a599b9d7130948a916bdec4bf Mon Sep 17 00:00:00 2001 From: Hongxin Zhang Date: Thu, 13 Oct 2016 13:18:39 -0400 Subject: [PATCH 03/12] Solve #313 --- app/scripts/views/components/customPlots/CaseDialogBox.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/views/components/customPlots/CaseDialogBox.js b/app/scripts/views/components/customPlots/CaseDialogBox.js index 5f739ad..ce45ae5 100644 --- a/app/scripts/views/components/customPlots/CaseDialogBox.js +++ b/app/scripts/views/components/customPlots/CaseDialogBox.js @@ -47,7 +47,7 @@ methods: { SetCasesSelection: function() { var caseIds = this.casesIdsList.trim().split(/\s+/); - this.$dispatch('set-selected-cases', this.caseSelection, caseIds); + this.$dispatch('set-selected-cases', this.caseSelection, _.uniq(caseIds)); } }, ready: function() { From 63f7bcc0b1b76f3b7898071370a720ae46ef7883 Mon Sep 17 00:00:00 2001 From: Hongxin Zhang Date: Thu, 13 Oct 2016 13:53:43 -0400 Subject: [PATCH 04/12] Bug fixed Update reactTableData if changeView has been called before qTip rendered in pie view: caused by newly added delay 300 to pie chart qtip --- app/scripts/views/components/pieChart/pieChart.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/scripts/views/components/pieChart/pieChart.js b/app/scripts/views/components/pieChart/pieChart.js index f8170ad..1afa03d 100644 --- a/app/scripts/views/components/pieChart/pieChart.js +++ b/app/scripts/views/components/pieChart/pieChart.js @@ -30,7 +30,7 @@ attr_id: 'name', display_name: v.data.display_name, datatype: 'STRING', - column_width: 247 + column_width: 235 }, { attr_id: 'color', display_name: 'Color', @@ -86,7 +86,11 @@ chartDivDom.qtip('destroy', true); if (currentView === 'table') { - updateReactTable(); + if (qtipRendered) { + updateReactTable(); + } else { + updatePieLabels(); + } animateTable('#' + v.opts.chartDivId, 'table', function() { vm.$dispatch('update-grid'); $('#' + v.opts.chartDivId).css('z-index', ''); From 4017c76ff1fd886bb8fb9c343e9836185a2af58f Mon Sep 17 00:00:00 2001 From: Hongxin Zhang Date: Thu, 13 Oct 2016 14:51:15 -0400 Subject: [PATCH 05/12] Solve #314 --- app/scripts/main.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/scripts/main.js b/app/scripts/main.js index cd22b6c..7b7d26c 100644 --- a/app/scripts/main.js +++ b/app/scripts/main.js @@ -509,6 +509,10 @@ var iViz = (function(_, $, cbio, QueryByGeneUtil, QueryByGeneTextArea) { var selectedCases_ = vm_.selectedsamples; var studyId_ = ''; var possibleTOQuery = true; + + // Remove all hidden inputs + $('#iviz-form input:not(:first)').remove(); + _.each(selectedCases_, function(_caseId, key) { var index_ = data_.groups.sample.data_indices.sample_id[_caseId]; if (key === 0) { @@ -522,21 +526,18 @@ var iViz = (function(_, $, cbio, QueryByGeneUtil, QueryByGeneTextArea) { $('#iviz-form').get(0).setAttribute( 'action', window.cbioURL + 'index.do'); - $('#iviz-form input[name="cancer_study_id"]').remove(); $('').attr({ type: 'hidden', value: studyId_, name: 'cancer_study_id' }).appendTo('#iviz-form'); - $('#iviz-form input[name="case_set_id"]').remove(); $('').attr({ type: 'hidden', value: -1, name: 'case_set_id' }).appendTo('#iviz-form'); - $('#iviz-form input[name="case_ids"]').remove(); $('').attr({ type: 'hidden', value: selectedCases_.join(' '), From 5daf088b1a51c3872f9986f03655f8d1523ba2d2 Mon Sep 17 00:00:00 2001 From: Hongxin Zhang Date: Thu, 13 Oct 2016 16:31:39 -0400 Subject: [PATCH 06/12] Solve issue #307 --- app/scripts/model/dataProxy.js | 79 +++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 20 deletions(-) diff --git a/app/scripts/model/dataProxy.js b/app/scripts/model/dataProxy.js index 43d8e94..4754365 100644 --- a/app/scripts/model/dataProxy.js +++ b/app/scripts/model/dataProxy.js @@ -913,29 +913,68 @@ window.DataManagerForIviz = (function($, _) { function(self, fetch_promise) { var study_to_sample_to_patient = {}; var _studyCasesMap = self.getStudyCasesMap(); + var getSamplesCall = function(cancerStudyId) { + var def = new $.Deferred(); + window.cbioportal_client.getSamples({ + study_id: [cancerStudyId], + sample_ids: _studyCasesMap[cancerStudyId].samples + }).then(function(data) { + var sample_to_patient = {}; + var patientList = []; + for (var i = 0; i < data.length; i++) { + sample_to_patient[data[i].id] = data[i].patient_id; + patientList.push(data[i].patient_id); + } + // set patient list in studyCasesMap if sample list is + // passed in the input + if (_.isArray(_studyCasesMap[cancerStudyId].samples) && + _studyCasesMap[cancerStudyId].samples.length > 0) { + self.studyCasesMap[cancerStudyId].patients = _.unique(patientList); + } + study_to_sample_to_patient[cancerStudyId] = sample_to_patient; + def.resolve(); + }).fail(function() { + def.reject(); + }); + return def.promise(); + }; + var requests = self.getCancerStudyIds().map( function(cancer_study_id) { var def = new $.Deferred(); - window.cbioportal_client.getSamples({ - study_id: [cancer_study_id], - sample_ids: _studyCasesMap[cancer_study_id].samples - }).then(function(data) { - var sample_to_patient = {}; - var patientList = []; - for (var i = 0; i < data.length; i++) { - sample_to_patient[data[i].id] = data[i].patient_id; - patientList.push(data[i].patient_id); - } - // set patient list in studyCasesMap if sample list is - // passed in the input - if (_.isArray(_studyCasesMap[cancer_study_id].samples) && _studyCasesMap[cancer_study_id].samples.length > 0) { - self.studyCasesMap[cancer_study_id].patients = _.unique(patientList); - } - study_to_sample_to_patient[cancer_study_id] = sample_to_patient; - def.resolve(); - }).fail(function() { - fetch_promise.reject(); - }); + if (!_studyCasesMap.hasOwnProperty(cancer_study_id)) { + _studyCasesMap[cancer_study_id] = {}; + } + if (_.isArray(_studyCasesMap[cancer_study_id].samples)) { + getSamplesCall(cancer_study_id) + .then(function() { + def.resolve(); + }) + .fail(function() { + fetch_promise.reject(); + }); + } else { + window.cbioportal_client + .getSampleLists({study_id: [cancer_study_id]}) + .then(function(_sampleLists) { + _.each(_sampleLists, function(_sampleList) { + if (_sampleList.id === cancer_study_id + '_all') { + _studyCasesMap[cancer_study_id].samples = + _sampleList.sample_ids; + } + }); + getSamplesCall(cancer_study_id) + .then(function() { + def.resolve(); + }) + .fail(function() { + fetch_promise.reject(); + }); + }) + .fail(function() { + fetch_promise.reject(); + }); + } return def.promise(); }); $.when.apply($, requests).then(function() { From 803217ef7730cad55916a5940dccb7fc1e8eed66 Mon Sep 17 00:00:00 2001 From: Hongxin Zhang Date: Mon, 17 Oct 2016 16:52:01 -0400 Subject: [PATCH 07/12] Add attibutes.json for future customization --- Gruntfile.js | 9 +- app/_components/cbioportal-client.js | 2 +- app/index.html | 153 ++++++------------ app/resources/attributes.json | 38 +++++ app/scripts/controller/util.js | 11 -- app/scripts/main.js | 43 ++++- app/scripts/model/dataProxy.js | 84 +++++++++- .../components/barChart/barChartTemplate.js | 4 +- .../components/dataTable/tableViewTemplate.js | 4 +- .../views/components/pieChart/pieChart.js | 12 +- .../components/pieChart/pieChartTemplate.js | 4 +- .../scatterPlot/scatterPlotTemplate.js | 4 +- .../components/survivalChart/template.js | 4 +- app/scripts/views/mainTemplate.js | 4 +- 14 files changed, 234 insertions(+), 142 deletions(-) create mode 100644 app/resources/attributes.json diff --git a/Gruntfile.js b/Gruntfile.js index ec12e26..6dcf03e 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -43,9 +43,6 @@ module.exports = function(grunt) { files: ['test/spec/{,*/}*.js'], tasks: ['babel:test', 'test:watch'] }, - gruntfile: { - files: ['Gruntfile.js'] - }, sass: { files: ['<%= config.app %>/styles/{,*/}*.{scss,sass}'], tasks: ['sass', 'postcss'] @@ -57,6 +54,12 @@ module.exports = function(grunt) { json_to_sass: { files: ['<%= config.app %>/resources/vars.json'], tasks: ['json_to_sass', 'newer:copy:styles', 'postcss'] + }, + configFiles: { + files: ['<%= config.app %>/resources/attributes.json', 'Gruntfile.js'], + options: { + reload: true + } } }, diff --git a/app/_components/cbioportal-client.js b/app/_components/cbioportal-client.js index 138f22b..de010ff 100644 --- a/app/_components/cbioportal-client.js +++ b/app/_components/cbioportal-client.js @@ -10,7 +10,7 @@ window.cbioportal_client = (function() { var arg_string = arg_strings.join("&") || "?"; return $.ajax({ type: "POST", - url: window.cbioURL + '/' + endpt, + url: window.cbioURL + endpt, data: arg_string, dataType: "json" }); diff --git a/app/index.html b/app/index.html index b41755f..6378840 100644 --- a/app/index.html +++ b/app/index.html @@ -73,6 +73,8 @@ + + @@ -106,16 +108,12 @@ - - - -
-
- +
- +
-
- -
+
+ +
@@ -200,95 +203,31 @@ - - - - @@ -82,6 +78,10 @@ + + + + From d4359a1b3e4667f922562c1538fcac4caacdfd5b Mon Sep 17 00:00:00 2001 From: Hongxin Zhang Date: Tue, 18 Oct 2016 10:33:06 -0400 Subject: [PATCH 10/12] Group priority and hidden attributes into study specific JSON structure --- app/resources/attributes.json | 59 +++++++++++----------- app/scripts/model/dataProxy.js | 90 +++++++++++++++++++++++----------- 2 files changed, 89 insertions(+), 60 deletions(-) diff --git a/app/resources/attributes.json b/app/resources/attributes.json index 313a5c9..5072c2f 100644 --- a/app/resources/attributes.json +++ b/app/resources/attributes.json @@ -1,38 +1,35 @@ { - "clinicalAttrsPriority": { - "general": [ - "CANCER_TYPE", - "CANCER_TYPE_DETAILED", - "GENDER", - "SEX", - "AGE", - "sequenced", - "has_cna_data", - "sample_count_patient" - ], - "study": { - "mskimpact": [ - "DARWIN_PATIENT_AGE", - "OS_STATUS", - "SAMPLE_TYPE", - "DARWIN_VITAL_STATUS" - ] + "clinicalAttrs": { + "general": { + "priority": [ + "CANCER_TYPE", + "CANCER_TYPE_DETAILED", + "GENDER", + "SEX", + "sequenced", + "has_cna_data", + "sample_count_patient" + ], + "hidden": [] + }, + "studies": { + "mskimpact": { + "priority":[ + "DARWIN_PATIENT_AGE", + "OS_STATUS", + "SAMPLE_TYPE", + "DARWIN_VITAL_STATUS" + ], + "hidden": [ + "OS_SURVIVAL", + "DFS_SURVIVAL", + "AGE" + ] + } } }, - "tableAttrs": [ "CANCER_TYPE", "CANCER_TYPE_DETAILED" - ], - "hiddenAttrs": { - "OS_SURVIVAL": [ - "mskimpact" - ], - "DFS_SURVIVAL": [ - "mskimpact" - ], - "AGE": [ - "mskimpact" - ] - } + ] } \ No newline at end of file diff --git a/app/scripts/model/dataProxy.js b/app/scripts/model/dataProxy.js index e58aa94..0ae71f9 100644 --- a/app/scripts/model/dataProxy.js +++ b/app/scripts/model/dataProxy.js @@ -1,25 +1,25 @@ 'use strict'; window.DataManagerForIviz = (function($, _) { var content = {}; - // DESC - var clinicalAttrsPriority = ['CANCER_TYPE', 'CANCER_TYPE_DETAILED', - 'GENDER', 'SEX', 'AGE', 'sequenced', 'has_cna_data', 'sample_count_patient']; - - var studyClinicalAttrsPriority = { - mskimpact: ['DARWIN_PATIENT_AGE', 'OS_STATUS', 'SAMPLE_TYPE', - 'DARWIN_VITAL_STATUS'] - }; // Clinical attributes will be transfered into table. var tableAttrs_ = ['CANCER_TYPE', 'CANCER_TYPE_DETAILED']; content.util = {}; - // clinical attr id as key, designed for specific studies. - // TODO: how do work with merged studies(virtual studies) - var hiddenAttrs_ = { - OS_SURVIVAL: ['mskimpact'], - DFS_SURVIVAL: ['mskimpact'], - AGE: ['mskimpact'] + var clinAttrs_ = { + general: { + priority: [ + 'CANCER_TYPE', + 'CANCER_TYPE_DETAILED', + 'GENDER', + 'SEX', + 'AGE', + 'sequenced', + 'has_cna_data', + 'sample_count_patient' + ], + hidden: [] + } }; /** @@ -56,16 +56,18 @@ window.DataManagerForIviz = (function($, _) { content.util.isPriorityClinicalAttr = function(attr, studyId) { if (_.isString(attr)) { if (_.isString(studyId) && - studyClinicalAttrsPriority.hasOwnProperty(studyId) && - studyClinicalAttrsPriority[studyId].indexOf(attr) !== -1) { + clinAttrs_.studies.hasOwnProperty(studyId) && + _.isArray(clinAttrs_.studies[studyId].priority) && + clinAttrs_.studies[studyId].priority.indexOf(attr) !== -1) { return true; } else if (_.isArray(studyId)) { var sameStudies = _.intersection( - Object.keys(studyClinicalAttrsPriority), studyId); + Object.keys(clinAttrs_.studies), studyId); if (sameStudies.length > 0) { var contain = false; _.every(sameStudies, function(study) { - if (studyClinicalAttrsPriority[study].indexOf(attr) !== -1) { + if (_.isArray(clinAttrs_.studies[study].priority) && + clinAttrs_.studies[study].priority.indexOf(attr) !== -1) { contain = true; return true; } @@ -75,7 +77,7 @@ window.DataManagerForIviz = (function($, _) { } } } - if (clinicalAttrsPriority.indexOf(attr) !== -1) { + if (clinAttrs_.general.priority.indexOf(attr) !== -1) { return true; } } @@ -134,14 +136,14 @@ window.DataManagerForIviz = (function($, _) { if (!_.isString(b)) { return -1; } - var aI = clinicalAttrsPriority.indexOf(a); - var bI = clinicalAttrsPriority.indexOf(b); + var aI = clinAttrs_.general.priority.indexOf(a); + var bI = clinAttrs_.general.priority.indexOf(b); return aI - bI; }; /** * There are few steps to detemine the priority. - * Step 1: whether it is in clinicalAttrsPriority list + * Step 1: whether it is in clinAttrs_.general.priority list * Step 2: whether it will pass preSelectedAttr Regex check * Step 3: Sort the rest based on data availability. Notice that: at this * Step, attribute with only one category will be moved to end. Number of @@ -225,6 +227,29 @@ window.DataManagerForIviz = (function($, _) { return result; }; + content.util.getHiddenAttrs = function() { + var hiddenAttrs = {}; + if (_.isArray(clinAttrs_.general.hidden)) { + _.each(clinAttrs_.general.hidden, function(attr) { + if (!hiddenAttrs.hasOwnProperty(attr)) { + hiddenAttrs[attr] = []; + } + hiddenAttrs[attr].push('general'); + }); + } + _.each(clinAttrs_.studies, function(item, studyId) { + if (_.isArray(item.hidden)) { + _.each(item.hidden, function(attr) { + if (!hiddenAttrs.hasOwnProperty(attr)) { + hiddenAttrs[attr] = []; + } + hiddenAttrs[attr].push(studyId); + }); + } + }); + return hiddenAttrs; + }; + content.init = function(_portalUrl, _study_cases_map) { var initialSetup = function() { var _def = new $.Deferred(); @@ -631,6 +656,8 @@ window.DataManagerForIviz = (function($, _) { show: true }; } + + var hiddenAttrs = content.util.getHiddenAttrs(); _.each(content.util.sortClinicalAttrs( _.values(_.extend({}, _patientAttributes, _sampleAttributes)) ), function(attr, index) { @@ -641,9 +668,10 @@ window.DataManagerForIviz = (function($, _) { groupRef = _patientAttributes; } - if (hiddenAttrs_.hasOwnProperty(attrId) && - _.intersection(hiddenAttrs_[attrId], - Object.keys(_studyToSampleToPatientMap)).length !== 0) { + if (hiddenAttrs.hasOwnProperty(attrId) && + (hiddenAttrs[attrId].indexOf('general') !== -1 || + _.intersection(hiddenAttrs[attrId], + Object.keys(_studyToSampleToPatientMap)).length !== 0)) { groupRef[attrId].priority = 1000; } else if (attr.priority === -1) { groupRef[attrId].priority = 10 + index; @@ -878,10 +906,14 @@ window.DataManagerForIviz = (function($, _) { function(self, fetch_promise) { $.getJSON(window.cbioResourceURL + 'attributes.json') .then(function(data) { - clinicalAttrsPriority = data.clinicalAttrsPriority.general; - studyClinicalAttrsPriority = data.clinicalAttrsPriority.study; - tableAttrs_ = data.tableAttrs; - hiddenAttrs_ = data.hiddenAttrs; + if (_.isObject(data)) { + if (_.isObject(data.clinicalAttrs)) { + clinAttrs_ = data.clinicalAttrs; + } + if (_.isObject(data.tableAttrs)) { + tableAttrs_ = data.tableAttrs; + } + } fetch_promise.resolve(); }) .fail(function() { From 16d7577235c443a8287039643be46124740291bf Mon Sep 17 00:00:00 2001 From: Hongxin Zhang Date: Thu, 20 Oct 2016 15:35:18 -0400 Subject: [PATCH 11/12] Bypass cbioportal client when querying clinical data for performance purpose --- app/scripts/model/dataProxy.js | 63 +++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/app/scripts/model/dataProxy.js b/app/scripts/model/dataProxy.js index 0ae71f9..1bb4211 100644 --- a/app/scripts/model/dataProxy.js +++ b/app/scripts/model/dataProxy.js @@ -713,6 +713,23 @@ window.DataManagerForIviz = (function($, _) { return _def.promise(); }; + // Borrowed from cbioportal-client.js + var getApiCallPromise = function(endpt, args) { + var arg_strings = []; + for (var k in args) { + if (args.hasOwnProperty(k)) { + arg_strings.push(k + '=' + [].concat(args[k]).join(',')); + } + } + var arg_string = arg_strings.join('&') || '?'; + return $.ajax({ + type: 'POST', + url: window.cbioURL + endpt, + data: arg_string, + dataType: 'json' + }); + }; + var getPatientClinicalData = function(self, attr_ids) { var def = new $.Deferred(); var fetch_promises = []; @@ -742,19 +759,22 @@ window.DataManagerForIviz = (function($, _) { fetch_promises = fetch_promises.concat(Object.keys(studyAttributesMap).map(function(_studyId) { var _def = new $.Deferred(); - window.cbioportal_client.getPatientClinicalData({ + // Bypass cBioPortal client for clinical data call. + // Checking whether sample clinical data is available takes too much + // time. This is temporary solution, should be replaced with + // better solution. + getApiCallPromise('api-legacy/clinicaldata/patients', { study_id: [_studyId], attribute_ids: studyAttributesMap[_studyId], patient_ids: studyCasesMap[_studyId].patients - }) - .then(function(data) { - for (var i = 0; i < data.length; i++) { - var attr_id = data[i].attr_id; - clinical_data[attr_id] = clinical_data[attr_id] || []; - clinical_data[attr_id].push(data[i]); - } - _def.resolve(); - }).fail( + }).then(function(data) { + for (var i = 0; i < data.length; i++) { + var attr_id = data[i].attr_id; + clinical_data[attr_id] = clinical_data[attr_id] || []; + clinical_data[attr_id].push(data[i]); + } + _def.resolve(); + }).fail( function() { def.reject(); }); @@ -798,19 +818,22 @@ window.DataManagerForIviz = (function($, _) { fetch_promises = fetch_promises.concat(Object.keys(studyAttributesMap) .map(function(_studyId) { var _def = new $.Deferred(); - window.cbioportal_client.getSampleClinicalData({ + // Bypass cBioPortal client for clinical data call. + // Checking whether sample clinical data is available takes too much + // time. This is temporary solution, should be replaced with + // better solution. + getApiCallPromise('api-legacy/clinicaldata/samples', { study_id: [_studyId], attribute_ids: studyAttributesMap[_studyId], sample_ids: studyCasesMap[_studyId].samples - }) - .then(function(data) { - for (var i = 0; i < data.length; i++) { - var attr_id = data[i].attr_id; - clinical_data[attr_id] = clinical_data[attr_id] || []; - clinical_data[attr_id].push(data[i]); - } - _def.resolve(); - }).fail( + }).then(function(data) { + for (var i = 0; i < data.length; i++) { + var attr_id = data[i].attr_id; + clinical_data[attr_id] = clinical_data[attr_id] || []; + clinical_data[attr_id].push(data[i]); + } + _def.resolve(); + }).fail( function() { def.reject(); }); From 247c220145d5842d1546882ca01a37fe84c9765a Mon Sep 17 00:00:00 2001 From: Hongxin Zhang Date: Thu, 20 Oct 2016 15:38:32 -0400 Subject: [PATCH 12/12] Forgot AGE attribute --- app/resources/attributes.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app/resources/attributes.json b/app/resources/attributes.json index 5072c2f..c83dea0 100644 --- a/app/resources/attributes.json +++ b/app/resources/attributes.json @@ -6,6 +6,7 @@ "CANCER_TYPE_DETAILED", "GENDER", "SEX", + "AGE", "sequenced", "has_cna_data", "sample_count_patient"