cBioPortal/iViz

View on GitHub
app/scripts/views/components/scatterPlot/scatterPlot.js

Summary

Maintainability
D
3 days
Test Coverage
/**
 * Created by Yichao Sun on 5/11/16.
 */

'use strict';
(function(iViz, _, d3, $, Plotly, cbio) {
  iViz.view.component.ScatterPlot = function() {
    var content = this;
    var chartId_;
    var data_;
    var groups_ = [];
    var opts_;
    var layout_;
    var getQtipString = function(_data) {
      var toReturn = ['Cancer Study:', _data.study_id, '<br>Sample Id: ',
        iViz.getCaseIdUsingUID('sample', _data.sample_uid), '<br>CNA fraction: '];
      if (isNaN(_data.FRACTION_GENOME_ALTERED)) {
        toReturn.push(_data.FRACTION_GENOME_ALTERED);
      } else {
        toReturn.push(cbio.util.toPrecision(Number(_data.FRACTION_GENOME_ALTERED), 2, 0.001));
      }
      toReturn.push('<br>Mutation count: ' + _data.MUTATION_COUNT);
      return toReturn.join('');
    };

    content.init = function(_data, opts) {
      opts_ = $.extend(true, {}, opts);
      chartId_ = opts_.chartId;
      data_ = _.filter(_data, function(datum) {
        return !isNaN(datum.FRACTION_GENOME_ALTERED) && !isNaN(datum.MUTATION_COUNT);
      });
      var _xArr = _.pluck(data_, 'FRACTION_GENOME_ALTERED');
      var _yArr = _.pluck(data_, 'MUTATION_COUNT');
      var _qtips = [];
      _.each(data_, function(_dataObj) {
        _qtips.push(getQtipString(_dataObj));
      });
      var trace = {
        x: _xArr,
        y: _yArr,
        text: _qtips,
        mode: 'markers',
        type: 'scattergl',
        hoverinfo: 'text',
        study_id: _.pluck(data_, 'study_id'),
        sample_uid: _.pluck(data_, 'sample_uid'),
        marker: {
          size: 7,
          color: '#2986e2',
          line: {color: 'white'}
        }
      };
      var data = [trace];
      opts_.numOfTraces = 1;
      var _marginX = (d3.max(_xArr) - d3.min(_xArr)) * 0.05;
      var _marginY = (d3.max(_yArr) - d3.min(_yArr)) * 0.05;
      layout_ = {
        xaxis: {
          title: 'Fraction of copy number altered genome',
          range: [d3.min(_xArr) - _marginX, d3.max(_xArr) + _marginX],
          zeroline: false,
          showline: true,
          tickangle: -45
        },
        yaxis: {
          title: '# of mutations',
          range: [d3.min(_yArr) - _marginY, d3.max(_yArr) + _marginY],
          zeroline: false,
          showline: true
        },
        hovermode: 'closest',
        dragmode: 'select',
        showlegend: false,
        width: opts_.width || 370,
        height: opts_.height || 320,
        margin: {
          l: 60,
          r: 10,
          b: 50,
          t: 30,
          pad: 0
        }
      };
      Plotly.plot(chartId_, data, layout_, {
        displaylogo: false,
        modeBarButtonsToRemove: ['sendDataToCloud', 'pan2d',
          'zoomIn2d', 'zoomOut2d', 'resetScale2d',
          'hoverClosestCartesian', 'hoverCompareCartesian', 'toImage']
      });

      groups_ = [{
        name: 'Unselected',
        data: _data
      }];

      initCanvasDownloadData();
    };

    // update selected samples (change color)
    content.update = function(_sampleIds) {
      var _selectedData = [];
      var _unselectedData = [];

      var _tmpSelectedSampleIdMap = {};
      _.each(_sampleIds, function(_sampleId) {
        _tmpSelectedSampleIdMap[_sampleId] = '';
      });
      _.each(data_, function(_dataObj) {
        if (_tmpSelectedSampleIdMap.hasOwnProperty(_dataObj.sample_uid)) {
          _selectedData.push(_dataObj);
        } else {
          _unselectedData.push(_dataObj);
        }
      });

      var _unselectedDataQtips = [];
      var _selectedDataQtips = [];

      _.each(_unselectedData, function(_dataObj) {
        _unselectedDataQtips.push(getQtipString(_dataObj));
      });
      _.each(_selectedData, function(_dataObj) {
        _selectedDataQtips.push(getQtipString(_dataObj));
      });

      groups_ = [];
      if (_selectedData.length > 0) {
        groups_.push({
          name: 'Selected',
          data: _selectedData
        })
      }
      if (_unselectedData.length > 0) {
        groups_.push({
          name: 'Unselected',
          data: _unselectedData
        })
      }

      var _traces = [];
      for (var i = 0; i < opts_.numOfTraces; i++) {
        _traces.push(i);
      }
      Plotly.deleteTraces(chartId_, _traces);
      var data = [];
      data.push({
        x: _.pluck(_unselectedData, 'FRACTION_GENOME_ALTERED'),
        y: _.pluck(_unselectedData, 'MUTATION_COUNT'),
        text: _unselectedDataQtips,
        mode: 'markers',
        type: 'scattergl',
        hoverinfo: 'text',
        study_id: _.pluck(data_, 'study_id'),
        sample_uid: _.pluck(data_, 'sample_uid'),
        marker: {
          size: 6,
          color: '#2986e2',
          line: {color: 'white'}
        }
      });
      data.push({
        x: _.pluck(_selectedData, 'FRACTION_GENOME_ALTERED'),
        y: _.pluck(_selectedData, 'MUTATION_COUNT'),
        text: _selectedDataQtips,
        mode: 'markers',
        type: 'scattergl',
        hoverinfo: 'text',
        study_id: _.pluck(data_, 'study_id'),
        sample_uid: _.pluck(data_, 'sample_uid'),
        marker: {
          size: 6,
          color: 'red',
          line: {color: 'white'}
        }
      });
      opts_.numOfTraces = 2;
      Plotly.addTraces(chartId_, data);
    };

    content.updateDataForDownload = function(fileType) {
      if (['pdf', 'svg'].indexOf(fileType) !== -1) {
        initCanvasDownloadData();
      } else if (fileType === 'tsv') {
        initTsvDownloadData();
      }
    };

    function initTsvDownloadData() {
      var _title = opts_.title || 'Mutation Count vs. CNA';
      var _data = ['Patient ID', 'Sample ID', 'Mutation Count', 'CNA', 'Group'];

      _data = [_data.join('\t')];
      _.each(groups_, function(group) {
        _.each(group.data, function(item) {
          var _sampleId = iViz.getCaseIdUsingUID('sample', item.sample_uid);
          var _patientId = iViz.getPatientId(item.study_id, _sampleId);
          var _txt = (_patientId ? _patientId : 'NA') +
            '\t' + _sampleId + '\t' + item.MUTATION_COUNT + '\t' +
            item.FRACTION_GENOME_ALTERED + '\t' + group.name;
          _data.push(_txt);
        });
      });

      content.setDownloadData('tsv', {
        fileName: _title,
        data: _data.join('\n')
      });
    }

    function initCanvasDownloadData() {
      content.setDownloadData('svg', {
        title: opts_.title,
        chartDivId: opts_.chartId,
        fileName: opts_.title
      });
      content.setDownloadData('pdf', {
        title: opts_.title,
        chartDivId: opts_.chartId,
        fileName: opts_.title
      });
    }
  };

  iViz.view.component.ScatterPlot.prototype =
    new iViz.view.component.GeneralChart('scatterPlot');
  iViz.view.component.ScatterPlot.constructor =
    iViz.view.component.ScatterPlot;
  iViz.util.scatterPlot = (function() {
  })();
})(window.iViz,
  window._,
  window.d3,
  window.jQuery || window.$,
  window.Plotly,
  window.cbio
);