https://github.com/hms-dbmi/higlass
Raw File
Tip revision: cdc1d30f955bd553f1510fc4c37b74610dabc5f2 authored by Peter Kerpedjiev on 08 August 2020, 16:38:21 UTC
1.11.0
Tip revision: cdc1d30
DenseDataExtremaTests.js
/* eslint-env node, jasmine, mocha */
import {
  configure
  // render,
} from 'enzyme';

import Adapter from 'enzyme-adapter-react-16';

import { expect } from 'chai';

// Utils
import {
  mountHGComponent,
  removeHGComponent,
  getTrackObjectFromHGC,
  waitForTransitionsFinished,
  waitForTilesLoaded
} from '../app/scripts/utils';

import viewConf1DHorizontal from './view-configs/continuous-scaling-1D-horizontal';
import viewConf1DVertical from './view-configs/continuous-scaling-1D-vertical';
import viewConf2D from './view-configs/continuous-scaling-2D';

import DenseDataExtrema1D from '../app/scripts/utils/DenseDataExtrema1D';
import DenseDataExtrema2D from '../app/scripts/utils/DenseDataExtrema2D';
import { vecToy, vecRealistic } from './testdata/vector-data';
import { matToy, matRealistic } from './testdata/matrix-data';

configure({ adapter: new Adapter() });

describe('Continuous scaling tests', () => {
  describe('DenseDataExtrema module', () => {
    it('should get precise extrema of toy vectors', () => {
      const dde = new DenseDataExtrema1D(vecToy);

      expect(dde.minNonZeroInTile).to.eql(1);
      expect(dde.maxNonZeroInTile).to.eql(63);

      expect(dde.getMinNonZeroInSubset([0, 1])).to.eql(Number.MAX_SAFE_INTEGER);

      expect(dde.getMinNonZeroInSubset([10, 33])).to.eql(10);
      expect(dde.getMaxNonZeroInSubset([10, 33])).to.eql(32);
      expect(dde.getMinNonZeroInSubset([21, 64])).to.eql(21);
      expect(dde.getMaxNonZeroInSubset([21, 64])).to.eql(63);
    });

    it('should get precise extrema of realistic vectors', () => {
      const dde = new DenseDataExtrema1D(vecRealistic);

      expect(dde.minNonZeroInTile).to.eql(0.0004627704620361328);
      expect(dde.maxNonZeroInTile).to.eql(0.075439453125);

      expect(dde.getMinNonZeroInSubset([76, 771])).to.eql(
        0.0009503364562988281
      );
      expect(dde.getMaxNonZeroInSubset([76, 771])).to.eql(0.01194000244140625);
    });

    it('should get approximate extrema of toy matrix', () => {
      const dde = new DenseDataExtrema2D(matToy);

      expect(dde.minNonZeroInTile).to.eql(1);
      expect(dde.maxNonZeroInTile).to.eql(255);

      expect(dde.getMinNonZeroInSubset([0, 0, 1, 1])).to.eql(1);
      expect(dde.getMaxNonZeroInSubset([0, 0, 1, 1])).to.eql(17);

      expect(dde.getMinNonZeroInSubset([0, 2, 2, 5])).to.eql(32);
      expect(dde.getMaxNonZeroInSubset([0, 2, 2, 5])).to.eql(83);
    });

    it('should get approximate extrema of realistic matrix', () => {
      const dde = new DenseDataExtrema2D(matRealistic);

      expect(dde.minNonZeroInTile).to.eql(1);
      expect(dde.maxNonZeroInTile).to.eql(5748);

      expect(dde.getMinNonZeroInSubset([28, 40, 250, 120])).to.eql(1);
      expect(dde.getMaxNonZeroInSubset([28, 40, 250, 120])).to.eql(196);
    });
  });

  describe('Precise scaling of horizontal 1D tracks', () => {
    let hgc = null;
    let div = null;

    beforeAll(done => {
      [div, hgc] = mountHGComponent(div, hgc, viewConf1DHorizontal, done);
    });

    it('Ensures HorizontalPoint1DPixiTrack has correct scale', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[0].uid
      );

      const vs = trackObj.valueScale.domain();
      expect(vs[0]).to.be.eql(10.96875);
      expect(vs[1]).to.be.eql(14800);
    });

    it('Ensures Horizontal1DHeatmapTrack has correct scale', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[1].uid
      );

      const vs = trackObj.valueScale.domain();
      expect(vs[0]).to.be.eql(0.12999966740608215);
      expect(vs[1]).to.be.eql(0.3573390543460846);
    });

    it('Ensures HorizontalLine1DPixiTrack has correct scale', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[2].uid
      );

      const vs = trackObj.valueScale.domain();
      expect(vs[0]).to.be.eql(11);
      expect(vs[1]).to.be.eql(12081);
    });

    it('Ensures valuescale locked BarTracks with ignoreOffScreenValue have correct scale', () => {
      const trackObj1 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[3].uid
      );

      const trackObj2 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[4].uid
      );

      const vs1 = trackObj1.valueScale.domain();
      const vs2 = trackObj2.valueScale.domain();
      expect(vs1[0]).to.be.eql(1.0107421875);
      expect(vs1[1]).to.be.eql(4.7421875);
      expect(vs2[0]).to.be.eql(1.0107421875);
      expect(vs2[1]).to.be.eql(4.7421875);
    });

    it('Ensures valuescale locked BarTrack and LineTrack without ignoreOffScreenValue have correct scale', () => {
      const trackObj1 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[5].uid
      );

      const trackObj2 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[6].uid
      );

      const vs1 = trackObj1.valueScale.domain();
      const vs2 = trackObj2.valueScale.domain();
      expect(vs1[0]).to.be.eql(0.004180908203125);
      expect(vs1[1]).to.be.eql(0.15536139905452728);
      expect(vs2[0]).to.be.eql(0.004180908203125);
      expect(vs2[1]).to.be.eql(0.15536139905452728);
    });

    it('Zooms and pan to the right', done => {
      hgc.instance().zoomTo('aa', 2619000000, 2620000000);

      waitForTransitionsFinished(hgc.instance(), () => {
        waitForTilesLoaded(hgc.instance(), () => {
          done();
        });
      });
    });

    it('Ensures HorizontalPoint1DPixiTrack has correct scale after zooming', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[0].uid
      );

      const vs = trackObj.valueScale.domain();
      expect(vs[0]).to.be.eql(4.39453125);
      expect(vs[1]).to.be.eql(2194);
    });

    it('Ensures Horizontal1DHeatmapTrack has correct scale after zooming', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[1].uid
      );

      const vs = trackObj.valueScale.domain();
      expect(vs[0]).to.be.eql(0.12999965250492096);
      expect(vs[1]).to.be.eql(0.6042279601097107);
    });

    it('Ensures HorizontalLine1DPixiTrack has correct scale after zooming', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DHorizontal.views[0].uid,
        viewConf1DHorizontal.views[0].tracks.top[2].uid
      );

      const vs = trackObj.valueScale.domain();

      expect(vs[0]).to.be.eql(180);
      expect(vs[1]).to.be.eql(91032);
    });

    afterAll(() => {
      removeHGComponent(div);
    });
  });

  describe('Precise scaling of vertical 1D tracks', () => {
    let hgc = null;
    let div = null;

    beforeAll(done => {
      [div, hgc] = mountHGComponent(div, hgc, viewConf1DVertical, done);
    });

    it('Ensures leftmodified HorizontalPoint1DPixiTrack has correct scale', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DVertical.views[0].uid,
        viewConf1DVertical.views[0].tracks.left[0].uid
      ).originalTrack;

      waitForTilesLoaded(hgc.instance(), () => {
        const vs = trackObj.valueScale.domain();
        expect(vs[0]).to.be.eql(4308);
        expect(vs[1]).to.be.eql(33920);
      });
    });

    it('Ensures valuescale locked leftmodified BarTracks with ignoreOffScreenValue have correct scale', () => {
      const trackObj1 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DVertical.views[0].uid,
        viewConf1DVertical.views[0].tracks.right[0].uid
      ).originalTrack;

      const trackObj2 = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf1DVertical.views[0].uid,
        viewConf1DVertical.views[0].tracks.right[1].uid
      ).originalTrack;

      const vs1 = trackObj1.valueScale.domain();
      const vs2 = trackObj2.valueScale.domain();

      expect(vs1[0]).to.be.eql(0.0009598731994628906);
      expect(vs1[1]).to.be.eql(1.5029296875);
      expect(vs2[0]).to.be.eql(0.0009598731994628906);
      expect(vs2[1]).to.be.eql(1.5029296875);
    });

    afterAll(() => {
      removeHGComponent(div);
    });
  });

  describe('Correct scaling of 2D tracks', () => {
    let hgc = null;
    let div = null;

    beforeAll(done => {
      [div, hgc] = mountHGComponent(div, hgc, viewConf2D, done, {
        style: 'width:600px; height:600px; background-color: lightgreen',
        bounded: true
      });
    });

    it('Ensures Heatmap track has correct scale', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf2D.views[0].uid,
        viewConf2D.views[0].tracks.center[0].uid
      ).childTracks[0];

      waitForTilesLoaded(hgc.instance(), () => {
        const vs = trackObj.valueScale.domain();

        expect(vs[0]).to.be.eql(0.0014894568594172597);
        expect(vs[1]).to.be.eql(0.9345257878303528);
      });
    });

    it('Pan to the right', done => {
      hgc.instance().zoomTo('aa', 1000000, 1250000, 0, 250000, 1000);

      waitForTransitionsFinished(hgc.instance(), () => {
        waitForTilesLoaded(hgc.instance(), () => {
          done();
        });
      });
    });

    it('Ensures Heatmap track has correct scale after zoom', () => {
      const trackObj = getTrackObjectFromHGC(
        hgc.instance(),
        viewConf2D.views[0].uid,
        viewConf2D.views[0].tracks.center[0].uid
      ).childTracks[0];

      waitForTilesLoaded(hgc.instance(), () => {
        const vs = trackObj.valueScale.domain();

        expect(vs[0]).to.be.eql(0.0017257321160286665);
        expect(vs[1]).to.be.eql(0.01572374626994133);
      });
    });

    afterAll(() => {
      removeHGComponent(div);
    });
  });
});
back to top