UNPKG

vitessce

Version:

Vitessce app and React component library

127 lines (115 loc) 4.27 kB
import React, { useEffect } from 'react'; import TitleInfo from '../TitleInfo'; import { useCoordination, useLoaders } from '../../app/state/hooks'; import { COMPONENT_COORDINATION_TYPES } from '../../app/state/coordination'; import { useUrls, useReady, useGridItemSize } from '../hooks'; import { useGeneSelection, useExpressionAttrs, useCellSetsData } from '../data-hooks'; import { useExpressionByCellSet } from './hooks'; import CellSetExpressionPlotOptions from './CellSetExpressionPlotOptions'; import CellSetExpressionPlot from './CellSetExpressionPlot'; import { VALUE_TRANSFORM_OPTIONS } from '../gating/utils'; const CELL_SET_EXPRESSION_DATA_TYPES = ['cell-sets', 'expression-matrix']; /** * A subscriber component for `CellSetExpressionPlot`, * which listens for gene selection updates and * `GRID_RESIZE` events. * @param {object} props * @param {function} props.removeGridComponent The grid component removal function. * @param {object} props.coordinationScopes An object mapping coordination * types to coordination scopes. * @param {string} props.theme The name of the current Vitessce theme. */ export default function CellSetExpressionPlotSubscriber(props) { const { coordinationScopes, removeGridComponent, theme, } = props; const loaders = useLoaders(); // Get "props" from the coordination space. const [{ dataset, featureSelection: geneSelection, featureValueTransform, featureValueTransformCoefficient, obsSetSelection: cellSetSelection, obsSetColor: cellSetColor, additionalObsSets: additionalCellSets, }, { setFeatureValueTransform, setFeatureValueTransformCoefficient, }] = useCoordination(COMPONENT_COORDINATION_TYPES.cellSetExpression, coordinationScopes); const [width, height, containerRef] = useGridItemSize(); const [urls, addUrl, resetUrls] = useUrls(); const [ isReady, setItemIsReady, setItemIsNotReady, // eslint-disable-line no-unused-vars resetReadyItems, ] = useReady( CELL_SET_EXPRESSION_DATA_TYPES, ); const transformOptions = VALUE_TRANSFORM_OPTIONS; // Reset file URLs and loader progress when the dataset has changed. useEffect(() => { resetUrls(); resetReadyItems(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [loaders, dataset]); // Get data from loaders using the data hooks. const [expressionData] = useGeneSelection( loaders, dataset, setItemIsReady, false, geneSelection, setItemIsNotReady, ); const [attrs] = useExpressionAttrs( loaders, dataset, setItemIsReady, addUrl, false, ); const [cellSets] = useCellSetsData( loaders, dataset, setItemIsReady, addUrl, true, ); const [expressionArr, setArr, expressionMax] = useExpressionByCellSet( expressionData, attrs, cellSets, additionalCellSets, geneSelection, cellSetSelection, cellSetColor, featureValueTransform, featureValueTransformCoefficient, theme, ); const firstGeneSelected = geneSelection && geneSelection.length >= 1 ? geneSelection[0] : null; const selectedTransformName = transformOptions.find( o => o.value === featureValueTransform, )?.name; return ( <TitleInfo title={`Expression by Cell Set${(firstGeneSelected ? ` (${firstGeneSelected})` : '')}`} removeGridComponent={removeGridComponent} urls={urls} theme={theme} isReady={isReady} options={( <CellSetExpressionPlotOptions featureValueTransform={featureValueTransform} setFeatureValueTransform={setFeatureValueTransform} featureValueTransformCoefficient={featureValueTransformCoefficient} setFeatureValueTransformCoefficient={setFeatureValueTransformCoefficient} transformOptions={transformOptions} /> )} > <div ref={containerRef} className="vega-container"> {expressionArr ? ( <CellSetExpressionPlot domainMax={expressionMax} colors={setArr} data={expressionArr} theme={theme} width={width} height={height} featureValueTransformName={selectedTransformName} /> ) : ( <span>Select a gene.</span> )} </div> </TitleInfo> ); }