diff --git a/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/data-from-server.csv b/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/data-from-server.csv new file mode 100644 index 0000000000000000000000000000000000000000..ed2713a61ec52c577807ba50504483b63fce26c8 --- /dev/null +++ b/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/data-from-server.csv @@ -0,0 +1,520 @@ +id,hasPredictions,hasPhenotypes +JJS-MGP009,False,True +JJS-DIN262,False,False +JJS-DIN112,True,True +JJS-DIN237,True,True +JJS-DIN039,True,True +JJS-MGP028,False,True +JJS-DIN224,True,True +JJS-MGP109,False,True +JJS-MGP074,False,True +JJS-DIN257,False,False +JJS-DIN208,True,True +JJS-MGP209,False,True +JJS-DIN146,True,True +JJS-DIN214,True,True +JJS-MGP229,False,True +JJS-MGP062,False,True +JJS-DIN108,True,True +JJS-MGP120,False,True +JJS-DIN090,True,True +JJS-DIN029,True,True +JJS-MGP122,False,True +JJS-DIN198,True,True +JJS-MGP098,False,True +JJS-DIN048,True,True +JJS-MGP082,False,True +JJS-MGP050,False,True +JJS-MGP173,False,True +JJS-MGP182,False,True +JJS-MGP160,False,True +JJS-DIN097,True,True +JJS-DIN243,True,True +JJS-DIN098,True,True +JJS-DIN188,True,True +JJS-DIN173,True,True +JJS-MGP065,False,True +JJS-MGP032,False,True +JJS-MGP129,False,True +JJS-DIN203,True,True +JJS-MGP113,False,True +JJS-MGP095,False,True +JJS-MGP033,False,True +JJS-MGP002,False,True +JJS-DIN047,True,True +JJS-MGP136,False,True +JJS-DIN282,True,True +JJS-MGP179,False,True +JJS-DIN005,True,True +JJS-MGP011,False,True +JJS-MGP168,False,True +JJS-MGP202,False,True +JJS-DIN182,True,True +JJS-MGP134,False,True +JJS-MGP213,False,True +JJS-DIN197,True,True +JJS-DIN217,True,True +JJS-DIN052,True,True +JJS-DIN084,True,True +JJS-MGP101,False,True +JJS-DIN215,True,True +JJS-DIN135,True,True +JJS-DIN236,True,True +JJS-DIN158,True,True +JJS-MGP169,False,True +JJS-DIN209,True,True +JJS-DIN080,True,True +JJS-MGP135,False,True +JJS-MGP171,False,True +JJS-DIN263,False,False +JJS-DIN216,True,True +JJS-DIN138,True,True +JJS-MGP061,False,True +JJS-DIN168,True,True +JJS-MGP203,False,True +JJS-DIN070,True,True +JJS-MGP195,False,True +JJS-MGP106,False,True +JJS-MGP042,False,True +JJS-DIN036,True,True +JJS-DIN101,True,True +JJS-DIN185,True,True +JJS-DIN219,True,True +JJS-DIN179,True,True +JJS-MGP029,False,True +JJS-DIN230,True,True +JJS-MGP066,False,True +JJS-DIN038,True,True +JJS-MGP123,False,True +JJS-MGP049,False,True +JJS-DIN169,True,True +JJS-DIN026,True,True +JJS-DIN087,True,True +JJS-MGP081,False,True +JJS-DIN115,True,True +JJS-DIN042,True,True +JJS-DIN249,False,False +JJS-DIN190,True,True +JJS-DIN264,False,False +JJS-DIN060,True,True +JJS-MGP172,False,True +JJS-MGP031,False,True +JJS-DIN049,True,True +JJS-MGP014,False,True +JJS-DIN250,False,False +JJS-DIN253,False,False +JJS-DIN017,True,True +JJS-DIN129,True,True +JJS-DIN231,True,True +JJS-MGP220,False,True +JJS-MGP192,False,True +JJS-DIN109,True,True +JJS-DIN063,True,True +JJS-DIN281,True,True +JJS-MGP001,False,True +JJS-DIN018,True,True +JJS-DIN046,True,True +JJS-DIN024,True,True +JJS-MGP020,False,True +JJS-MGP110,False,True +JJS-MGP012,False,True +JJS-MGP118,False,True +JJS-DIN154,True,True +JJS-DIN176,True,True +JJS-MGP158,False,True +JJS-DIN053,True,True +JJS-MGP059,False,True +JJS-DIN276,True,True +JJS-DIN019,True,True +JJS-DIN027,True,True +JJS-DIN148,True,True +JJS-MGP094,False,True +JJS-DIN265,False,False +JJS-MGP145,False,True +JJS-MGP048,False,True +JJS-DIN212,True,True +JJS-DIN007,True,True +JJS-DIN235,True,True +JJS-MGP027,False,True +JJS-DIN245,True,True +JJS-MGP184,False,True +JJS-MGP146,False,True +JJS-DIN220,True,True +JJS-DIN003,True,True +JJS-DIN128,True,True +JJS-DIN205,True,True +JJS-MGP104,False,True +JJS-MGP155,False,True +JJS-DIN123,True,True +JJS-DIN073,True,True +JJS-DIN078,True,True +JJS-MGP166,False,True +JJS-DIN016,True,True +JJS-MGP107,False,True +JJS-DIN199,True,True +JJS-DIN131,True,True +JJS-MGP051,False,True +JJS-DIN226,True,True +JJS-DIN196,True,True +JJS-MGP096,False,True +JJS-DIN145,True,True +JJS-MGP204,False,True +JJS-MGP177,False,True +JJS-DIN175,True,True +JJS-DIN284,True,True +JJS-DIN259,False,False +JJS-MGP035,False,True +JJS-DIN099,True,True +JJS-MGP198,False,True +JJS-MGP063,False,True +JJS-DIN130,True,True +JJS-MGP132,False,True +JJS-MGP222,False,True +JJS-DIN071,True,True +JJS-MGP121,False,True +JJS-DIN119,True,True +JJS-MGP215,False,True +JJS-MGP175,False,True +JJS-DIN137,True,True +JJS-MGP073,False,True +JJS-MGP130,False,True +JJS-MGP083,False,True +JJS-DIN025,True,True +JJS-DIN062,True,True +JJS-DIN082,True,True +JJS-MGP054,False,True +JJS-MGP127,False,True +JJS-MGP019,False,True +JJS-DIN106,True,True +JJS-MGP167,False,True +JJS-DIN006,True,True +JJS-DIN022,True,True +JJS-MGP052,False,True +JJS-MGP047,False,True +JJS-DIN092,True,True +JJS-DIN242,True,True +JJS-MGP154,False,True +JJS-MGP017,False,True +JJS-DIN167,True,True +JJS-MGP197,False,True +JJS-MGP004,False,True +JJS-DIN066,True,True +JJS-MGP144,False,True +JJS-DIN234,True,True +JJS-DIN251,False,False +JJS-DIN015,True,True +JJS-DIN079,True,True +JJS-DIN256,False,False +JJS-MGP216,False,True +JJS-MGP164,False,True +JJS-DIN142,True,True +JJS-DIN225,True,True +JJS-DIN266,False,False +JJS-DIN076,True,True +JJS-DIN187,True,True +JJS-MGP230,False,True +JJS-MGP112,False,True +JJS-DIN127,True,True +JJS-DIN118,True,True +JJS-DIN283,True,True +JJS-MGP128,False,True +JJS-MGP178,False,True +JJS-MGP194,False,True +JJS-MGP071,False,True +JJS-DIN100,True,True +JJS-DIN004,True,True +JJS-MGP034,False,True +JJS-DIN275,True,True +JJS-DIN031,True,True +JJS-DIN113,True,True +JJS-MGP079,False,True +JJS-DIN202,True,True +JJS-DIN107,True,True +JJS-MGP174,False,True +JJS-MGP053,False,True +JJS-MGP185,False,True +JJS-DIN091,True,True +JJS-DIN085,True,True +JJS-DIN164,True,True +JJS-DIN124,True,True +JJS-DIN104,True,True +JJS-DIN051,True,True +JJS-MGP152,False,True +JJS-DIN159,True,True +JJS-MGP133,False,True +JJS-DIN059,True,True +JJS-MGP196,False,True +JJS-DIN077,True,True +JJS-MGP025,False,True +JJS-DIN156,True,True +JJS-DIN093,True,True +JJS-DIN067,True,True +JJS-DIN139,True,True +JJS-DIN035,True,True +JJS-DIN057,True,True +JJS-DIN149,True,True +JJS-MGP046,False,True +JJS-MGP131,False,True +JJS-MGP210,False,True +JJS-DIN177,True,True +JJS-MGP078,False,True +JJS-MGP089,False,True +JJS-DIN194,True,True +JJS-MGP165,False,True +JJS-DIN166,True,True +JJS-MGP199,False,True +JJS-MGP114,False,True +JJS-DIN286,True,True +JJS-DIN183,True,True +JJS-MGP148,False,True +JJS-DIN267,False,False +JJS-DIN009,True,True +JJS-DIN030,True,True +JJS-MGP091,False,True +JJS-DIN233,True,True +JJS-DIN014,True,True +JJS-DIN089,True,True +JJS-MGP105,False,True +JJS-MGP176,False,True +JJS-MGP231,False,True +JJS-MGP038,False,True +JJS-MGP016,False,True +JJS-MGP186,False,True +JJS-MGP224,False,True +JJS-DIN040,True,True +JJS-MGP226,False,True +JJS-MGP072,False,True +JJS-DIN045,True,True +JJS-MGP085,False,True +JJS-DIN105,True,True +JJS-DIN152,True,True +JJS-MGP116,False,True +JJS-DIN064,True,True +JJS-DIN132,True,True +JJS-MGP056,False,True +JJS-DIN012,True,True +JJS-DIN121,True,True +JJS-MGP205,False,True +JJS-DIN280,True,True +JJS-MGP139,False,True +JJS-MGP153,False,True +JJS-DIN192,True,True +JJS-DIN117,True,True +JJS-MGP064,False,True +JJS-DIN163,True,True +JJS-DIN222,True,True +JJS-MGP069,False,True +JJS-MGP157,False,True +JJS-DIN254,False,False +JJS-DIN274,True,True +JJS-MGP040,False,True +JJS-MGP102,False,True +JJS-DIN023,True,True +JJS-DIN228,True,True +JJS-DIN126,True,True +JJS-MGP126,False,True +JJS-DIN050,True,True +JJS-DIN033,True,True +JJS-MGP045,False,True +JJS-DIN204,True,True +JJS-DIN144,True,True +JJS-DIN269,False,False +JJS-MGP026,False,True +JJS-DIN034,True,True +JJS-MGP103,False,True +JJS-DIN020,True,True +JJS-DIN186,True,True +JJS-DIN058,True,True +JJS-DIN244,True,True +JJS-DIN178,True,True +JJS-MGP141,False,True +JJS-DIN116,True,True +JJS-DIN002,True,True +JJS-DIN125,True,True +JJS-MGP055,False,True +JJS-DIN195,True,True +JJS-DIN170,True,True +JJS-DIN227,True,True +JJS-MGP115,False,True +JJS-DIN213,True,True +JJS-DIN151,True,True +JJS-DIN056,True,True +JJS-MGP147,False,True +JJS-DIN285,True,True +JJS-DIN270,False,False +JJS-MGP084,False,True +JJS-MGP217,False,True +JJS-DIN111,True,True +JJS-DIN155,True,True +JJS-MGP211,False,True +JJS-DIN165,True,True +JJS-MGP181,False,True +JJS-MGP077,False,True +JJS-MGP092,False,True +JJS-MGP150,False,True +JJS-DIN083,True,True +JJS-DIN180,True,True +JJS-MGP006,False,True +JJS-MGP206,False,True +JJS-DIN122,True,True +JJS-DIN140,True,True +JJS-DIN273,True,True +JJS-MGP187,False,True +JJS-DIN207,True,True +JJS-DIN246,True,True +JJS-MGP117,False,True +JJS-DIN258,False,False +JJS-MGP232,False,True +JJS-DIN041,True,True +JJS-DIN013,True,True +JJS-DIN162,True,True +JJS-DIN141,True,True +JJS-DIN277,True,True +JJS-DIN068,True,True +JJS-MGP037,False,True +PROTO-4,False,False +JJS-DIN191,True,True +PROTO-3,False,False +JJS-MGP015,False,True +JJS-MGP225,False,True +JJS-MGP036,False,True +JJS-DIN065,True,True +JJS-DIN094,True,True +JJS-DIN172,True,True +JJS-MGP223,False,True +JJS-DIN074,True,True +JJS-MGP003,False,True +JJS-MGP093,False,True +JJS-DIN221,True,True +JJS-MGP018,False,True +JJS-DIN133,True,True +JJS-DIN081,True,True +JJS-DIN021,True,True +JJS-DIN110,True,True +JJS-MGP162,False,True +JJS-DIN120,True,True +JJS-DIN229,True,True +JJS-DIN032,True,True +JJS-MGP218,False,True +JJS-MGP007,False,True +JJS-DIN161,True,True +JJS-MGP156,False,True +JJS-DIN157,True,True +JJS-MGP119,False,True +JJS-DIN011,True,True +JJS-DIN248,False,False +JJS-MGP041,False,True +JJS-DIN055,True,True +JJS-MGP170,False,True +JJS-MGP191,False,True +JJS-DIN069,True,True +JJS-MGP023,False,True +JJS-MGP188,False,True +JJS-DIN252,False,False +JJS-MGP137,False,True +JJS-MGP080,False,True +JJS-MGP087,False,True +JJS-MGP180,False,True +JJS-MGP058,False,True +JJS-MGP227,False,True +JJS-DIN102,True,True +JJS-MGP076,False,True +JJS-MGP060,False,True +JJS-MGP030,False,True +JJS-DIN232,True,True +JJS-DIN272,False,False +JJS-DIN095,True,True +JJS-MGP149,False,True +JJS-DIN240,True,True +JJS-DIN150,True,True +JJS-DIN043,True,True +JJS-MGP161,False,True +JJS-DIN189,True,True +JJS-MGP233,False,True +JJS-MGP200,False,True +JJS-MGP086,False,True +JJS-DIN181,True,True +JJS-DIN086,True,True +JJS-DIN001,True,True +JJS-MGP221,False,True +JJS-MGP090,False,True +JJS-DIN134,True,True +JJS-MGP228,False,True +JJS-MGP124,False,True +JJS-MGP207,False,True +JJS-DIN160,True,True +JJS-MGP142,False,True +JJS-MGP159,False,True +JJS-DIN260,False,False +JJS-DIN278,True,True +JJS-MGP021,False,True +JJS-DIN200,True,True +JJS-MGP044,False,True +JJS-MGP067,False,True +JJS-DIN193,True,True +JJS-MGP013,False,True +JJS-MGP151,False,True +JJS-DIN075,True,True +PROTO-2,True,False +JJS-DIN239,True,True +JJS-MGP111,False,True +JJS-MGP140,False,True +JJS-MGP070,False,True +JJS-DIN238,True,True +JJS-DIN054,True,True +JJS-DIN218,True,True +JJS-DIN171,True,True +JJS-DIN147,True,True +JJS-DIN261,False,False +JJS-MGP024,False,True +JJS-DIN206,True,True +JJS-DIN010,True,True +JJS-MGP219,False,True +JJS-DIN153,True,True +JJS-MGP068,False,True +JJS-DIN028,True,True +JJS-DIN072,True,True +JJS-DIN088,True,True +JJS-DIN174,True,True +JJS-DIN008,True,True +JJS-DIN184,True,True +JJS-DIN096,True,True +JJS-MGP138,False,True +JJS-DIN103,True,True +JJS-MGP057,False,True +JJS-MGP088,False,True +JJS-DIN247,True,True +JJS-MGP075,False,True +JJS-MGP008,False,True +JJS-MGP125,False,True +JJS-MGP208,False,True +JJS-MGP190,False,True +JJS-MGP193,False,True +JJS-MGP189,False,True +JJS-DIN241,True,True +JJS-MGP183,False,True +JJS-MGP234,False,True +JJS-DIN037,True,True +JJS-DIN279,True,True +JJS-DIN061,True,True +JJS-DIN201,True,True +JJS-DIN044,True,True +JJS-MGP099,False,True +JJS-MGP100,False,True +JJS-DIN114,True,True +JJS-MGP039,False,True +JJS-DIN271,True,True +JJS-MGP212,False,True +JJS-DIN255,False,False +JJS-MGP005,False,True +PROTO-1,False,False +JJS-MGP022,False,True +JJS-DIN136,True,True +JJS-MGP010,False,True +JJS-DIN143,True,True +JJS-DIN268,False,False +JJS-MGP201,False,True +JJS-MGP163,False,True +JJS-MGP108,False,True +JJS-MGP043,False,True +JJS-MGP999,False,True diff --git a/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/load-data-from-file-and-put-to-table.py b/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/load-data-from-file-and-put-to-table.py new file mode 100644 index 0000000000000000000000000000000000000000..80b8ff973f6be4d599a8eebd9708435d3db68c2a --- /dev/null +++ b/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/load-data-from-file-and-put-to-table.py @@ -0,0 +1,44 @@ +#! /usr/bin/env python + +import csv + +FIELD_ID = 'id' +FIELD_HAS_PREDICTIONS = 'hasPredictions' +FIELD_HAS_PHENOTYPES = 'hasPhenotypes' + +def loadDataFromFile(filePath): + file = None + try: + file = open(filePath, 'r') + reader = csv.DictReader(file) + dataList = [] + + for row in reader: + dataList.append(row) + + return dataList + except IOError, err: + print 'Could not read the data from a file: ' + str(filePath) + raise + finally: + if file != None: + file.close() + +def addDataToTable(dataList, table): + table.addHeader(FIELD_ID) + table.addHeader(FIELD_HAS_PREDICTIONS) + table.addHeader(FIELD_HAS_PHENOTYPES) + + for dataItem in dataList: + id = dataItem[FIELD_ID] + hasPredictions = dataItem[FIELD_HAS_PREDICTIONS] + hasPhenotypes = dataItem[FIELD_HAS_PHENOTYPES] + + row = table.addRow() + row.setCell(FIELD_ID, id) + row.setCell(FIELD_HAS_PREDICTIONS, hasPredictions) + row.setCell(FIELD_HAS_PHENOTYPES, hasPhenotypes) + +def aggregate(parameters, table): + data = loadDataFromFile('TODO_FILE_TO_FILE_WITH_SERVER_DATA') + addDataToTable(data, table) diff --git a/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/load-data-from-server-and-save-in-file.py b/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/load-data-from-server-and-save-in-file.py new file mode 100644 index 0000000000000000000000000000000000000000..ed7382b3ea65c68fb7d1b086bd364600bcfd836c --- /dev/null +++ b/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/load-data-from-server-and-save-in-file.py @@ -0,0 +1,52 @@ +#! /usr/bin/env python + +import urllib +import json +import csv + +FIELD_ID = 'id' +FIELD_PREDICTIONS = 'predictions' +FIELD_PHENOTYPES = 'phenotypes' +FIELD_HAS_PREDICTIONS = 'hasPredictions' +FIELD_HAS_PHENOTYPES = 'hasPhenotypes' + +def loadDataFromServer(serverUrl): + url = urllib.urlopen(serverUrl) + return url.read().decode('utf8') + +def convertData(dataString): + jsonList = json.loads(dataString) + dataList = [] + + for jsonItem in jsonList: + id = jsonItem[FIELD_ID].upper() + hasPredictions = jsonItem[FIELD_PREDICTIONS] != None and len(jsonItem[FIELD_PREDICTIONS]) > 0 + hasPhenotypes = jsonItem[FIELD_PHENOTYPES] != None and len(jsonItem[FIELD_PHENOTYPES]) > 0 + dataList.append({FIELD_ID: id, FIELD_HAS_PREDICTIONS: hasPredictions, FIELD_HAS_PHENOTYPES: hasPhenotypes}) + + return dataList + +def writeDataToFile(filePath, dataList): + file = None + try: + + file = open(filePath,'w') + writer = csv.writer(file) + writer.writerow([FIELD_ID, FIELD_HAS_PREDICTIONS, FIELD_HAS_PHENOTYPES]); + + for dataItem in dataList: + id = dataItem[FIELD_ID] + hasPredictions = dataItem[FIELD_HAS_PREDICTIONS] + hasPhenotypes = dataItem[FIELD_HAS_PHENOTYPES] + writer.writerow([id, hasPredictions, hasPhenotypes]) + + except IOError as err: + print 'Could not write the data to a file: ' + str(filePath) + raise + finally: + if file != None: + file.close() + +data = loadDataFromServer('http://pubseed.theseed.org/model-prod/StrainServer.cgi?user=reviewer&pass=reviewer&method=getAllPhenotypesAndPredictions&encoding=json') +writeDataToFile('data-from-server.csv', convertData(data)) + diff --git a/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/plugin.properties b/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/plugin.properties new file mode 100644 index 0000000000000000000000000000000000000000..666e00845bf9b229a7620241188b56bf4b27f581 --- /dev/null +++ b/eu_basynthec/source/core-plugins/basynthec/1/dss/reporting-plugins/chicago/plugin.properties @@ -0,0 +1,4 @@ +label = Load data from UChicago DB +class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonAggregationService +script-path = load-data-from-file-and-put-to-table.py +dataset-types = .* diff --git a/eu_basynthec/source/html/browser/basynthec-browser.js b/eu_basynthec/source/html/browser/basynthec-browser.js index 58a14caab61ac1497eef21fde2eb995c9c62f76c..b59a15e34fd63ae8d627fb038dd750b9fb8c74c3 100644 --- a/eu_basynthec/source/html/browser/basynthec-browser.js +++ b/eu_basynthec/source/html/browser/basynthec-browser.js @@ -5,7 +5,6 @@ var curveColors = d3.scale.category10().domain([0, 9]); /** * Abstract superclass for the wrapper classes. - * * @constructor */ function AbstractThingWrapper() { @@ -108,12 +107,29 @@ AppPresenter.prototype.switchToOD600View = function() od600InspectorView.updateView(); } +/** This view is very similar to the OD600 view, but the data is also divided into two main groups: + * - strains for which there are phenotypes, predictions, and data in the openBIS database + * - strains for which there are phenotypes or predictions, but no data in the openBIS database + * (in this group strains with phenotypes and predictions should be marked green; strains with + * phenotypes only should be marked blue; strains with predictions only should be yellow) + * Information about the phenotypes and predictions is retrieved from UChicago strain database + * (http://pubseed.theseed.org/model-prod/StrainServer.cgi) and cached at the server-side in OpenBIS. + */ +AppPresenter.prototype.switchToOD600WithPhenotypesAndPredictionsView = function() +{ + this.presenterMode = presenterModeTypeStrain; + this.hideExplanation(); + this.toggleDisplayedVisualizations(od600StrainWithPhenotypesAndPredictionsVis); + dataSetInspectorView.removeAll(250); + od600InspectorView.updateView(); +} + /** Utility function to gracefully switch from one visualization to another */ AppPresenter.prototype.toggleDisplayedVisualizations = function(visToShow) { this.visualizationContainers.forEach(function(vis) { if (vis == visToShow) { - if (od600StrainVis == vis) { + if (od600StrainVis == vis || od600StrainWithPhenotypesAndPredictionsVis == vis) { // So that scrolling works vis.style("display", "block"); } else { @@ -152,12 +168,13 @@ AppPresenter.prototype.showDataSets = function(bisDataSets) { }; basynthec.dataSetList.sort(sortByTypeAndRegistration); - - model.initialize(); - - this.refreshDataSetTypeTables(); - this.refreshStrainTables(); - this.refreshOd600StrainTables(); + + model.initialize(function(){ + presenter.refreshDataSetTypeTables(); + presenter.refreshStrainTables(); + presenter.refreshOd600StrainTables(); + presenter.refreshOd600StrainWithPhenotypesAndPredictionsTables(); + }); } AppPresenter.prototype.refreshStrainTables = function() { @@ -180,6 +197,12 @@ AppPresenter.prototype.refreshOd600StrainTables = function() { od600StrainView.updateView(1000); } +AppPresenter.prototype.refreshOd600StrainWithPhenotypesAndPredictionsTables = function() { + this.createVis(); + od600StrainWithPhenotypesAndPredictionsView.updateView(1000); +} + + AppPresenter.prototype.createVis = function() { if (this.didCreateVis) return; @@ -216,7 +239,13 @@ AppPresenter.prototype.createVis = function() od600StrainVis.style("overflow-y", "scroll"); od600StrainView = new Od600StrainView(); - this.visualizationContainers = [dataSetTypeVis, strainVis, od600StrainVis]; + od600StrainWithPhenotypesAndPredictionsVis = tableRoot.append("div").style("display", "none"); + od600StrainWithPhenotypesAndPredictionsVis.style("width", w + "px"); + od600StrainWithPhenotypesAndPredictionsVis.style("height",w + "px"); + od600StrainWithPhenotypesAndPredictionsVis.style("overflow-y", "scroll"); + od600StrainWithPhenotypesAndPredictionsView = new Od600StrainWithPhenotypesAndPredictionsView(); + + this.visualizationContainers = [dataSetTypeVis, strainVis, od600StrainVis, od600StrainWithPhenotypesAndPredictionsVis]; dataSetInspectorView = new DataSetInspectorView(); od600InspectorView = new Od600InspectorView(); @@ -406,11 +435,12 @@ function AppModel() { this.dataSetsByType = { }; } -AppModel.prototype.initialize = function() { +AppModel.prototype.initialize = function(callback) { this.initializeDataSetsByType(); this.initializeDataSetsByStrain(); this.initializeStrainGroups(); - this.initializeOd600Model(); + this.initializeOd600Model(); + this.initializeOd600WithPhenotypesAndPredictionsModel(callback); } /** Compute the dataSetsByType variable */ @@ -448,7 +478,7 @@ AppModel.prototype.initializeDataSetsByStrain = function() { AppModel.prototype.initializeStrainGroups = function() { var strains = [] for (strainName in this.dataSetsByStrain) { - strains.push(strainName) + strains.push({name: strainName}); } this.strainGroups = createStrainGroups(strains); } @@ -477,6 +507,57 @@ AppModel.prototype.initializeOd600Model= function() { }); } +AppModel.prototype.initializeOd600WithPhenotypesAndPredictionsModel = function(callback){ + var model = this; + + basynthec.getStrainsPhenotypesAndPredictions(function(strainDataMap){ + + var strainsKnownToOpenbisWithPhenotypesAndPredictions = []; + var strainsUnknownToOpenbisWithPhenotypesOrPredictions = []; + + for(strainName in model.dataSetsByStrain){ + var strainData = strainDataMap[strainName]; + var strainDatasets = model.dataSetsByStrain[strainName]; + + var hasPhenotypesAndPredictions = strainData && strainData.hasPhenotypes && strainData.hasPredictions; + var hasOd600Datasets = strainDatasets && strainDatasets.dataSets.some(function(dataset){ + return "OD600" == dataset.dataSetTypeCode; + }); + + if(hasPhenotypesAndPredictions && hasOd600Datasets){ + strainData.isKnown = true; + strainsKnownToOpenbisWithPhenotypesAndPredictions.push(strainData); + } + } + + for(strainName in strainDataMap){ + var strainData = strainDataMap[strainName]; + var strainDatasets = model.dataSetsByStrain[strainName]; + + var hasPhenotypesOrPredictions = strainData && (strainData.hasPhenotypes || strainData.hasPredictions); + var hasDatasets = strainDatasets && strainDatasets.dataSets.length > 0; + + if(hasPhenotypesOrPredictions && !hasDatasets){ + strainData.isKnown = false; + strainsUnknownToOpenbisWithPhenotypesOrPredictions.push(strainData); + } + } + + model.od600StrainsWithPhenotypesAndPredictionsGroups = []; + model.od600StrainsWithPhenotypesAndPredictionsGroups.push({ + "mainGroupName" : "Known strains with phenotypes and predictions", + "groups" : createStrainGroups(strainsKnownToOpenbisWithPhenotypesAndPredictions) + }); + model.od600StrainsWithPhenotypesAndPredictionsGroups.push({ + "mainGroupName" : "Unknown strains with phenotypes or predictions", + "groups" : createStrainGroups(strainsUnknownToOpenbisWithPhenotypesOrPredictions) + }); + + callback(); + }); + +} + AppModel.prototype.od600DataSets = function() { return this.dataSetsByType["OD600"]; } @@ -485,6 +566,10 @@ AppModel.prototype.od600DataSets = function() { * A utility function that groups strains together based on strain name */ function createStrainGroups(strains) { + if(!strains || strains.length == 0){ + return []; + } + // prefixes of strain names to be grouped togehter var STRAIN_GROUP_PREFIXES = [ "JJS-DIN", "JJS-MGP" ]; @@ -494,19 +579,19 @@ function createStrainGroups(strains) { var groups = STRAIN_GROUP_PREFIXES.map( function(strainPrefix) { var filtered = strains.filter(function(strain) { - return strain.indexOf(strainPrefix) >= 0 + return strain.name.indexOf(strainPrefix) >= 0 }); var groupStrains = filtered.map(function(strain) { - return { name : strain, label : strain.substring(strainPrefix.length)}; + return { name : strain.name, label : strain.name.substring(strainPrefix.length), data: strain}; }); return {groupName : STRAIN_GROUP_PREFIXES_DISPLAY_NAME[strainPrefix], strains : groupStrains}; }); var otherStrains = strains.filter(function(strain) { - return false == STRAIN_GROUP_PREFIXES.some(function(prefix) { return strain.indexOf(prefix) >=0; } ); + return false == STRAIN_GROUP_PREFIXES.some(function(prefix) { return strain.name.indexOf(prefix) >=0; } ); }); - otherStrains = otherStrains.map(function(strain) { return {name:strain, label:strain}}); + otherStrains = otherStrains.map(function(strain) { return {name:strain.name, label:strain.name, data: strain}}); groups.push({groupName : "Other strains", strains : otherStrains}); var sortFunction = sortByProp("name") @@ -647,6 +732,72 @@ Od600StrainView.prototype.updateView = function(duration) .text(function(d) { return d.label }); } +/** + * The view for the OD600 strains with phenotypes and predictions + * + * @constructor + */ +function Od600StrainWithPhenotypesAndPredictionsView(){ +} + +Od600StrainWithPhenotypesAndPredictionsView.prototype.updateView = function(duration) +{ + var mainGroupDiv = od600StrainWithPhenotypesAndPredictionsVis.selectAll("div.strainsMainGroup").data(model.od600StrainsWithPhenotypesAndPredictionsGroups) + .enter().append("div").attr("class", "strainsMainGroup"); + + mainGroupDiv.append("h2").text(function(d) { return d.mainGroupName }); + + var strainDiv = mainGroupDiv.selectAll("div.strains").data(function(d){ return d.groups; }) + .enter().append("div").attr("class", "strains"); + + strainDiv.append("h3").text(function(d) { return d.groupName }); + strainDiv.append("table").selectAll("tr").data(function(d) { + // Group the different sets of strains differently + if (d.groupName.indexOf("Other") == 0) return d.strains.reduce(groupBy(3), []); + if (d.groupName.indexOf("JJS-MGP") == 0) return d.strains.reduce(groupBy(10), []); + + // Group the JJS-DIn strains by runs + return d.strains.reduce(groupByRuns(10), []) }) + .enter() + .append("tr") + .selectAll("td").data(function(d) { return d }) + .enter() + .append("td") + .attr("class", function(d){ + if(d.data.isKnown){ + return "known"; + }else{ + return "unknown"; + } + }) + .on("click", function(d){ + if(d.data.isKnown){ + return toggleOd600Inspected.call(this, d); + } + }) + .text(function(d) { return d.label }) + .style("color", function(d){ + if(d.data.isKnown){ + return "black"; + }else{ + if(d.data.hasPhenotypes && d.data.hasPredictions){ + return "green"; + }else if(d.data.hasPhenotypes){ + return "blue"; + }else if(d.data.hasPredictions){ + return "red"; + } + } + }); + + var legend = od600StrainWithPhenotypesAndPredictionsVis.append("div"); + legend.append("h3").style("font-style","italic").text("Legend"); + var legendList = legend.append("ul"); + legendList.append("li").append("span").text("strain with phenotypes and predictions").style("color","green"); + legendList.append("li").append("span").text("strain with phenotypes only").style("color","blue"); + legendList.append("li").append("span").text("strain with predictions only").style("color","red"); +} + /** * The view that shows data sets. * @@ -932,6 +1083,9 @@ function props_to_pairs(d) var pairs = []; var dataSetStrains = basynthec.getStrains({properties:d}); + dataSetStrains = dataSetStrains.map(function(strain){ + return { name : strain }; + }); var strainGroups = createStrainGroups(dataSetStrains); strainGroups.forEach(function(group) { diff --git a/eu_basynthec/source/html/browser/basynthec-style.css b/eu_basynthec/source/html/browser/basynthec-style.css index d4c9d209a40f2d8871353b03c4b58b4fcbd9b0a9..ee552870b0a4812edcc9a577f5c2ce072475e884 100644 --- a/eu_basynthec/source/html/browser/basynthec-style.css +++ b/eu_basynthec/source/html/browser/basynthec-style.css @@ -1,6 +1,10 @@ body { font: 14px "Trebuchet MS", sans-serif; } h1 { font: 16px; } +h2 { + font-family: "Verdana", sans-serif; + color: #222; +} h3 { font: 12px; } .strains { padding-bottom: 10px; } @@ -9,11 +13,6 @@ h3 { font: 12px; } border-collapse: collapse; } -.strains h2 { - font-family: "Verdana", sans-serif; - color: #222; -} - .strains td { font-family: "Verdana", sans-serif; font-size: 12px; @@ -29,6 +28,10 @@ h3 { font: 12px; } cursor: pointer; } +.strains td.unknown:hover { + cursor: auto; +} + .datasetsummarytable { font-family: "Verdana", sans-serif; } diff --git a/eu_basynthec/source/html/browser/index.html b/eu_basynthec/source/html/browser/index.html index 70a3421411dff301e4bc6174ae905785d7b750fb..780de5d2ad41035ba108f9f6f0063e7c6a13edef 100644 --- a/eu_basynthec/source/html/browser/index.html +++ b/eu_basynthec/source/html/browser/index.html @@ -54,6 +54,9 @@ $(document).ready(function() { $("#groupradio3").change(function(event){ presenter.switchToOD600View(); }); + $("#groupradio4").change(function(event){ + presenter.switchToOD600WithPhenotypesAndPredictionsView(); + }); $('#login-form').submit(function() { $("#login-failed").hide(); @@ -106,10 +109,11 @@ $(document).ready(function() { <input type="radio" name="groupgroup" id="groupradio1" checked> <label for="groupradio1">Data Set Type</label> <input type="radio" name="groupgroup" id="groupradio2"> <label for="groupradio2">Strains</label> <input type="radio" name="groupgroup" id="groupradio3"> <label for="groupradio3">OD600</label> + <input type="radio" name="groupgroup" id="groupradio4"> <label for="groupradio4">OD600 with phenotypes and predictions</label> </div> </div> </div> </body> -</html> \ No newline at end of file +</html> diff --git a/eu_basynthec/source/html/browser/openbis-basynthec.js b/eu_basynthec/source/html/browser/openbis-basynthec.js index 943efa54e12637cc28572a07c82e6545644b8ee7..6ba6f51ca10cfd3d126882befc46834cf28c6077 100644 --- a/eu_basynthec/source/html/browser/openbis-basynthec.js +++ b/eu_basynthec/source/html/browser/openbis-basynthec.js @@ -60,4 +60,22 @@ openbis_basynthec.prototype.getStrains = function(dataSet) { return []; } -} \ No newline at end of file +} + +openbis_basynthec.prototype.getStrainsPhenotypesAndPredictions = function(action){ + this.server.createReportFromAggregationService("DSS1","chicago", null, function(response){ + var result = []; + + if(response.result && response.result.rows){ + $.each(response.result.rows, function(index, row){ + result[row[0].value] = { + "name" : row[0].value, + "hasPhenotypes" : row[1].value && row[1].value.toUpperCase() == "TRUE", + "hasPredictions" : row[2].value && row[2].value.toUpperCase() == "TRUE" + } + }); + } + + action(result); + }); +} diff --git a/eu_basynthec/source/html/browser/openbis.js b/eu_basynthec/source/html/browser/openbis.js index e35025bfb4377979b4dfef992b07bb0153ace058..3039e3488be7a3d357d1d448a8318f134393cb67 100644 --- a/eu_basynthec/source/html/browser/openbis.js +++ b/eu_basynthec/source/html/browser/openbis.js @@ -310,6 +310,20 @@ openbis.prototype.executeQuery = function(queryId, parameterBindings, action) { }); } +/** + * See ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer.createReportFromAggregationService(String, String, String, Map<String, String>) + * + * @method + */ +openbis.prototype.createReportFromAggregationService = function(dataStoreCode, serviceKey, parameters, action) { + ajaxRequest({ + url: this.queryServiceUrl, + data: { "method" : "createReportFromAggregationService", + "params" : [ this.sessionToken, dataStoreCode, serviceKey, parameters ] }, + success: action + }); +} + /** * A utility class for deferring an action until all of some kind of action has completed *