@macrostrat/column-views 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/dist/esm/{column-views.c2fbcba8.js → column-views.04636815.js} +4 -4
- package/dist/esm/{column-views.c2fbcba8.js.map → column-views.04636815.js.map} +1 -1
- package/dist/esm/{column-views.54f8b909.js → column-views.052498a6.js} +37 -4
- package/dist/esm/column-views.052498a6.js.map +1 -0
- package/dist/esm/{column-views.60365cdb.js → column-views.0da4503a.js} +2 -2
- package/dist/esm/{column-views.60365cdb.js.map → column-views.0da4503a.js.map} +1 -1
- package/dist/esm/{column-views.53722d0a.js → column-views.107b47b4.js} +9 -9
- package/dist/esm/{column-views.53722d0a.js.map → column-views.107b47b4.js.map} +1 -1
- package/dist/esm/column-views.17a70358.js +16 -0
- package/dist/esm/column-views.17a70358.js.map +1 -0
- package/dist/esm/{column-views.073c42da.js → column-views.1b5bf0c6.js} +3 -3
- package/dist/esm/{column-views.073c42da.js.map → column-views.1b5bf0c6.js.map} +1 -1
- package/dist/esm/{column-views.29a551f6.js → column-views.2708e176.js} +22 -16
- package/dist/esm/column-views.2708e176.js.map +1 -0
- package/dist/esm/{column-views.88d63dd0.js → column-views.275ba52b.js} +3 -3
- package/dist/esm/{column-views.88d63dd0.js.map → column-views.275ba52b.js.map} +1 -1
- package/dist/esm/{column-views.d86555b0.js → column-views.2bac03a2.js} +2 -2
- package/dist/esm/{column-views.d86555b0.js.map → column-views.2bac03a2.js.map} +1 -1
- package/dist/esm/column-views.322790f3.js +138 -0
- package/dist/esm/column-views.322790f3.js.map +1 -0
- package/dist/esm/{column-views.6698b95a.js → column-views.343fc926.js} +9 -18
- package/dist/esm/column-views.343fc926.js.map +1 -0
- package/dist/esm/column-views.3c9cba65.js +13 -0
- package/dist/esm/{column-views.418f948f.js.map → column-views.3c9cba65.js.map} +1 -1
- package/dist/esm/{column-views.c3495702.js → column-views.3d3e00be.js} +2 -2
- package/dist/esm/{column-views.c3495702.js.map → column-views.3d3e00be.js.map} +1 -1
- package/dist/esm/{column-views.e1bc3cfa.js → column-views.40094dd9.js} +3 -3
- package/dist/esm/{column-views.e1bc3cfa.js.map → column-views.40094dd9.js.map} +1 -1
- package/dist/esm/{column-views.787d7696.js → column-views.44373a90.js} +8 -7
- package/dist/esm/column-views.44373a90.js.map +1 -0
- package/dist/esm/{column-views.8b623b27.js → column-views.488f24b6.js} +2 -2
- package/dist/esm/{column-views.8b623b27.js.map → column-views.488f24b6.js.map} +1 -1
- package/dist/esm/{column-views.4ed90896.js → column-views.4b259f9e.js} +42 -11
- package/dist/esm/column-views.4b259f9e.js.map +1 -0
- package/dist/esm/{column-views.1151416d.css → column-views.54c1f382.css} +6 -5
- package/dist/esm/column-views.54c1f382.css.map +1 -0
- package/dist/esm/{column-views.382c486d.js → column-views.565b193a.js} +3 -3
- package/dist/esm/{column-views.382c486d.js.map → column-views.565b193a.js.map} +1 -1
- package/dist/esm/{column-views.df34441c.js → column-views.5ca2b219.js} +5 -5
- package/dist/esm/{column-views.df34441c.js.map → column-views.5ca2b219.js.map} +1 -1
- package/dist/esm/{column-views.8284c3a9.js → column-views.5eb4e6ff.js} +5 -5
- package/dist/esm/{column-views.8284c3a9.js.map → column-views.5eb4e6ff.js.map} +1 -1
- package/dist/esm/{column-views.2e854496.js → column-views.5fff0716.js} +3 -3
- package/dist/esm/{column-views.2e854496.js.map → column-views.5fff0716.js.map} +1 -1
- package/dist/esm/{column-views.05586d1f.js → column-views.60e97132.js} +2 -4
- package/dist/esm/column-views.60e97132.js.map +1 -0
- package/dist/esm/{column-views.7683bb52.js → column-views.63d40878.js} +5 -5
- package/dist/esm/{column-views.7683bb52.js.map → column-views.63d40878.js.map} +1 -1
- package/dist/esm/{column-views.abeab9aa.js → column-views.6c9e5069.js} +40 -62
- package/dist/esm/column-views.6c9e5069.js.map +1 -0
- package/dist/esm/column-views.6df65dab.js +9 -0
- package/dist/esm/column-views.6df65dab.js.map +1 -0
- package/dist/esm/column-views.7fa0d026.js +62 -0
- package/dist/esm/column-views.7fa0d026.js.map +1 -0
- package/dist/esm/{column-views.3a7179c4.js → column-views.82eb5026.js} +12 -7
- package/dist/esm/column-views.82eb5026.js.map +1 -0
- package/dist/esm/{column-views.adec2e4c.js → column-views.92575b87.js} +3 -3
- package/dist/esm/column-views.92575b87.js.map +1 -0
- package/dist/esm/{column-views.41e5f0dc.js → column-views.9d51a5ab.js} +3 -3
- package/dist/esm/{column-views.41e5f0dc.js.map → column-views.9d51a5ab.js.map} +1 -1
- package/dist/esm/{column-views.0ce9b697.js → column-views.9ffc089b.js} +3 -3
- package/dist/esm/{column-views.0ce9b697.js.map → column-views.9ffc089b.js.map} +1 -1
- package/dist/esm/{column-views.70164236.js → column-views.aa9ede4d.js} +2 -2
- package/dist/esm/{column-views.70164236.js.map → column-views.aa9ede4d.js.map} +1 -1
- package/dist/esm/{column-views.413217dc.js → column-views.ad2fe46c.js} +2 -2
- package/dist/esm/{column-views.413217dc.js.map → column-views.ad2fe46c.js.map} +1 -1
- package/dist/esm/{column-views.0265cf7f.js → column-views.afe0bb48.js} +15 -10
- package/dist/esm/column-views.afe0bb48.js.map +1 -0
- package/dist/esm/{column-views.aecf25bc.js → column-views.b4e1236d.js} +2 -2
- package/dist/esm/{column-views.aecf25bc.js.map → column-views.b4e1236d.js.map} +1 -1
- package/dist/esm/{column-views.469a4952.js → column-views.c149f7a5.js} +3 -3
- package/dist/esm/{column-views.469a4952.js.map → column-views.c149f7a5.js.map} +1 -1
- package/dist/esm/column-views.c3c7901a.js +149 -0
- package/dist/esm/column-views.c3c7901a.js.map +1 -0
- package/dist/esm/{column-views.a3fabf0f.js → column-views.c44febd0.js} +9 -6
- package/dist/esm/column-views.c44febd0.js.map +1 -0
- package/dist/esm/{column-views.b7016f82.css → column-views.cb6fc808.css} +10 -10
- package/dist/esm/column-views.cb6fc808.css.map +1 -0
- package/dist/esm/column-views.cc733361.js.map +1 -1
- package/dist/esm/{column-views.f0b0fc56.js → column-views.ce3a3ac8.js} +2 -2
- package/dist/esm/{column-views.f0b0fc56.js.map → column-views.ce3a3ac8.js.map} +1 -1
- package/dist/esm/{column-views.b08d82e6.js → column-views.d1b49f5c.js} +2 -2
- package/dist/esm/{column-views.b08d82e6.js.map → column-views.d1b49f5c.js.map} +1 -1
- package/dist/esm/{column-views.2aef5df8.js → column-views.d524075b.js} +4 -4
- package/dist/esm/{column-views.2aef5df8.js.map → column-views.d524075b.js.map} +1 -1
- package/dist/esm/column-views.d5e788e8.js +31 -0
- package/dist/esm/column-views.d5e788e8.js.map +1 -0
- package/dist/esm/{column-views.bbc77227.js → column-views.d6c0b7bc.js} +2 -2
- package/dist/esm/{column-views.bbc77227.js.map → column-views.d6c0b7bc.js.map} +1 -1
- package/dist/esm/{column-views.b29f8718.js → column-views.dc195174.js} +2 -2
- package/dist/esm/{column-views.b29f8718.js.map → column-views.dc195174.js.map} +1 -1
- package/dist/esm/column-views.de433f18.js +139 -0
- package/dist/esm/column-views.de433f18.js.map +1 -0
- package/dist/esm/{column-views.2eceafb5.js → column-views.e075af15.js} +2 -2
- package/dist/esm/{column-views.2eceafb5.js.map → column-views.e075af15.js.map} +1 -1
- package/dist/esm/{column-views.e33ac5c9.css → column-views.e93478c3.css} +7 -2
- package/dist/esm/column-views.e93478c3.css.map +1 -0
- package/dist/esm/{column-views.cae1a6a1.js → column-views.f7cdf6be.js} +3 -3
- package/dist/esm/{column-views.cae1a6a1.js.map → column-views.f7cdf6be.js.map} +1 -1
- package/dist/esm/{column-views.81bddbee.js → column-views.faa7e52e.js} +4 -4
- package/dist/esm/{column-views.81bddbee.js.map → column-views.faa7e52e.js.map} +1 -1
- package/dist/esm/index.d.ts +43 -20
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +12 -12
- package/dist/node/column-views.012fa10c.js +2 -0
- package/dist/node/column-views.012fa10c.js.map +1 -0
- package/dist/node/{column-views.edb4ba54.js → column-views.021a6961.js} +2 -2
- package/dist/node/{column-views.edb4ba54.js.map → column-views.021a6961.js.map} +1 -1
- package/dist/node/{column-views.f1ad131a.js → column-views.08bef1f6.js} +2 -2
- package/dist/node/{column-views.f1ad131a.js.map → column-views.08bef1f6.js.map} +1 -1
- package/dist/node/column-views.0beae29d.js +2 -0
- package/dist/node/column-views.0beae29d.js.map +1 -0
- package/dist/node/{column-views.6b8424fd.js → column-views.0f401891.js} +2 -2
- package/dist/node/{column-views.6b8424fd.js.map → column-views.0f401891.js.map} +1 -1
- package/dist/node/column-views.1d064426.js +2 -0
- package/dist/node/column-views.1d064426.js.map +1 -0
- package/dist/node/{column-views.ce5904a6.js → column-views.2577dec0.js} +2 -2
- package/dist/node/{column-views.ce5904a6.js.map → column-views.2577dec0.js.map} +1 -1
- package/dist/node/{column-views.45a03acc.js → column-views.2fe8feb9.js} +2 -2
- package/dist/node/{column-views.45a03acc.js.map → column-views.2fe8feb9.js.map} +1 -1
- package/dist/node/{column-views.ebe61439.js → column-views.42bc66a8.js} +2 -2
- package/dist/node/{column-views.ebe61439.js.map → column-views.42bc66a8.js.map} +1 -1
- package/dist/node/{column-views.ae9536b3.js → column-views.465e593b.js} +2 -2
- package/dist/node/{column-views.ae9536b3.js.map → column-views.465e593b.js.map} +1 -1
- package/dist/node/column-views.46efb749.js +2 -0
- package/dist/node/column-views.46efb749.js.map +1 -0
- package/dist/node/{column-views.554d44a7.js → column-views.47440961.js} +2 -2
- package/dist/node/{column-views.554d44a7.js.map → column-views.47440961.js.map} +1 -1
- package/dist/node/column-views.5361f0e2.js +2 -0
- package/dist/node/column-views.5361f0e2.js.map +1 -0
- package/dist/node/{column-views.f0f5cefd.js → column-views.5559de6a.js} +2 -2
- package/dist/node/{column-views.f0f5cefd.js.map → column-views.5559de6a.js.map} +1 -1
- package/dist/node/column-views.56f88b8c.js +2 -0
- package/dist/node/column-views.56f88b8c.js.map +1 -0
- package/dist/node/{column-views.0b3a384e.js → column-views.5a9331a9.js} +2 -2
- package/dist/node/{column-views.0b3a384e.js.map → column-views.5a9331a9.js.map} +1 -1
- package/dist/node/column-views.5fd6e11a.js +2 -0
- package/dist/node/column-views.5fd6e11a.js.map +1 -0
- package/dist/node/column-views.672b683c.js +2 -0
- package/dist/node/column-views.672b683c.js.map +1 -0
- package/dist/node/{column-views.07c503d3.js → column-views.6c7f9245.js} +2 -2
- package/dist/node/column-views.6c7f9245.js.map +1 -0
- package/dist/node/{column-views.4b4c214a.js → column-views.75456275.js} +2 -2
- package/dist/node/{column-views.4b4c214a.js.map → column-views.75456275.js.map} +1 -1
- package/dist/node/column-views.75ba0464.css +2 -0
- package/dist/node/column-views.75ba0464.css.map +1 -0
- package/dist/node/column-views.777b9bb6.js +2 -0
- package/dist/node/column-views.777b9bb6.js.map +1 -0
- package/dist/node/{column-views.93febe9b.js → column-views.7c322202.js} +2 -2
- package/dist/node/{column-views.93febe9b.js.map → column-views.7c322202.js.map} +1 -1
- package/dist/node/column-views.7cc1a14f.js +2 -0
- package/dist/node/column-views.7cc1a14f.js.map +1 -0
- package/dist/node/{column-views.fcdc74c4.js → column-views.8e846c57.js} +2 -2
- package/dist/node/{column-views.fcdc74c4.js.map → column-views.8e846c57.js.map} +1 -1
- package/dist/node/{column-views.6919fd2a.js → column-views.8ee8469d.js} +2 -2
- package/dist/node/{column-views.6919fd2a.js.map → column-views.8ee8469d.js.map} +1 -1
- package/dist/node/{column-views.588b02a1.js → column-views.93bde6c1.js} +2 -2
- package/dist/node/{column-views.588b02a1.js.map → column-views.93bde6c1.js.map} +1 -1
- package/dist/node/{column-views.94c84716.js → column-views.a14f0134.js} +2 -2
- package/dist/node/{column-views.94c84716.js.map → column-views.a14f0134.js.map} +1 -1
- package/dist/node/{column-views.aef76eee.js → column-views.a596b1f5.js} +2 -2
- package/dist/node/{column-views.aef76eee.js.map → column-views.a596b1f5.js.map} +1 -1
- package/dist/node/column-views.af480651.js +2 -0
- package/dist/node/column-views.af480651.js.map +1 -0
- package/dist/node/column-views.b103acbc.js +2 -0
- package/dist/node/column-views.b103acbc.js.map +1 -0
- package/dist/node/column-views.b40c1b9c.js +2 -0
- package/dist/node/column-views.b40c1b9c.js.map +1 -0
- package/dist/node/column-views.b6e86cf0.js +2 -0
- package/dist/node/column-views.b6e86cf0.js.map +1 -0
- package/dist/node/{column-views.6099a3a9.js → column-views.c007152b.js} +2 -2
- package/dist/node/{column-views.6099a3a9.js.map → column-views.c007152b.js.map} +1 -1
- package/dist/node/{column-views.db4ccacc.js → column-views.c921fa1a.js} +2 -2
- package/dist/node/{column-views.db4ccacc.js.map → column-views.c921fa1a.js.map} +1 -1
- package/dist/node/{column-views.a1e29a15.js → column-views.c9880a4d.js} +2 -2
- package/dist/node/{column-views.a1e29a15.js.map → column-views.c9880a4d.js.map} +1 -1
- package/dist/node/column-views.ccfb9afb.css +2 -0
- package/dist/node/column-views.ccfb9afb.css.map +1 -0
- package/dist/node/{column-views.32344397.js → column-views.cd54f1b1.js} +2 -2
- package/dist/node/{column-views.32344397.js.map → column-views.cd54f1b1.js.map} +1 -1
- package/dist/node/{column-views.0201566d.js → column-views.d77d260b.js} +2 -2
- package/dist/node/{column-views.0201566d.js.map → column-views.d77d260b.js.map} +1 -1
- package/dist/node/{column-views.54363c13.js → column-views.d818b387.js} +2 -2
- package/dist/node/{column-views.54363c13.js.map → column-views.d818b387.js.map} +1 -1
- package/dist/node/{column-views.29483479.js → column-views.d8821a96.js} +2 -2
- package/dist/node/{column-views.29483479.js.map → column-views.d8821a96.js.map} +1 -1
- package/dist/node/column-views.dbb4a46b.js +2 -0
- package/dist/node/column-views.dbb4a46b.js.map +1 -0
- package/dist/node/{column-views.e803e4ae.css → column-views.ddc6184e.css} +2 -2
- package/dist/node/column-views.ddc6184e.css.map +1 -0
- package/dist/node/{column-views.44952ae6.js → column-views.e264a767.js} +2 -2
- package/dist/node/{column-views.44952ae6.js.map → column-views.e264a767.js.map} +1 -1
- package/dist/node/column-views.e93b3bdb.js +2 -0
- package/dist/node/column-views.e93b3bdb.js.map +1 -0
- package/dist/node/{column-views.57dd069c.js → column-views.ec691859.js} +2 -2
- package/dist/node/{column-views.57dd069c.js.map → column-views.ec691859.js.map} +1 -1
- package/dist/node/column-views.ec7cc7cc.js +2 -0
- package/dist/node/column-views.ec7cc7cc.js.map +1 -0
- package/dist/node/{column-views.aae09aca.js → column-views.eecdc727.js} +2 -2
- package/dist/node/{column-views.aae09aca.js.map → column-views.eecdc727.js.map} +1 -1
- package/dist/node/{column-views.108db52e.js → column-views.f577d065.js} +2 -2
- package/dist/node/{column-views.108db52e.js.map → column-views.f577d065.js.map} +1 -1
- package/dist/node/column-views.fac4baff.js +2 -0
- package/dist/node/column-views.fac4baff.js.map +1 -0
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +1 -1
- package/package.json +2 -2
- package/src/age-axis.ts +1 -1
- package/src/column.module.sass +7 -5
- package/src/column.ts +29 -7
- package/src/correlation-chart/stories/correlation-chart.stories.ts +1 -1
- package/src/data-provider/store.ts +48 -5
- package/src/data-provider/unit-selection.ts +1 -0
- package/src/facets/detrital-zircon/index.ts +78 -11
- package/src/facets/detrital-zircon/provider.ts +1 -1
- package/src/facets/fossils/index.ts +145 -215
- package/src/facets/fossils/provider.ts +18 -25
- package/src/facets/fossils/taxon-ranges.ts +220 -0
- package/src/facets/index.ts +0 -1
- package/src/facets/{base-sample-column.module.sass → measurements/base.module.sass} +1 -0
- package/src/facets/measurements/base.ts +215 -0
- package/src/facets/measurements/index.ts +2 -38
- package/src/facets/measurements/sgp.ts +91 -0
- package/src/notes.ts +6 -3
- package/src/prepare-units/index.ts +8 -2
- package/src/prepare-units/utils.ts +55 -9
- package/src/section.ts +9 -4
- package/src/unit-details/panel.ts +2 -1
- package/dist/esm/column-views.0265cf7f.js.map +0 -1
- package/dist/esm/column-views.05586d1f.js.map +0 -1
- package/dist/esm/column-views.1151416d.css.map +0 -1
- package/dist/esm/column-views.29a551f6.js.map +0 -1
- package/dist/esm/column-views.3a7179c4.js.map +0 -1
- package/dist/esm/column-views.418f948f.js +0 -15
- package/dist/esm/column-views.4ed90896.js.map +0 -1
- package/dist/esm/column-views.54f8b909.js.map +0 -1
- package/dist/esm/column-views.6698b95a.js.map +0 -1
- package/dist/esm/column-views.6e7082db.js +0 -16
- package/dist/esm/column-views.6e7082db.js.map +0 -1
- package/dist/esm/column-views.748dce47.js +0 -95
- package/dist/esm/column-views.748dce47.js.map +0 -1
- package/dist/esm/column-views.787d7696.js.map +0 -1
- package/dist/esm/column-views.a3fabf0f.js.map +0 -1
- package/dist/esm/column-views.abeab9aa.js.map +0 -1
- package/dist/esm/column-views.adec2e4c.js.map +0 -1
- package/dist/esm/column-views.b7016f82.css.map +0 -1
- package/dist/esm/column-views.e17f00d3.js +0 -37
- package/dist/esm/column-views.e17f00d3.js.map +0 -1
- package/dist/esm/column-views.e33ac5c9.css.map +0 -1
- package/dist/esm/column-views.ea4ebbb7.js +0 -31
- package/dist/esm/column-views.ea4ebbb7.js.map +0 -1
- package/dist/esm/column-views.faacfc3c.js +0 -92
- package/dist/esm/column-views.faacfc3c.js.map +0 -1
- package/dist/node/column-views.07c503d3.js.map +0 -1
- package/dist/node/column-views.0e7ac946.js +0 -2
- package/dist/node/column-views.0e7ac946.js.map +0 -1
- package/dist/node/column-views.16f336ee.js +0 -2
- package/dist/node/column-views.16f336ee.js.map +0 -1
- package/dist/node/column-views.18d54bbb.js +0 -2
- package/dist/node/column-views.18d54bbb.js.map +0 -1
- package/dist/node/column-views.19a84c01.js +0 -2
- package/dist/node/column-views.19a84c01.js.map +0 -1
- package/dist/node/column-views.1a3c399e.js +0 -2
- package/dist/node/column-views.1a3c399e.js.map +0 -1
- package/dist/node/column-views.29eb25bd.css +0 -2
- package/dist/node/column-views.29eb25bd.css.map +0 -1
- package/dist/node/column-views.312db572.js +0 -2
- package/dist/node/column-views.312db572.js.map +0 -1
- package/dist/node/column-views.573cb29d.js +0 -2
- package/dist/node/column-views.573cb29d.js.map +0 -1
- package/dist/node/column-views.5a8bc8e3.js +0 -2
- package/dist/node/column-views.5a8bc8e3.js.map +0 -1
- package/dist/node/column-views.5f3b0b04.js +0 -2
- package/dist/node/column-views.5f3b0b04.js.map +0 -1
- package/dist/node/column-views.77ace3a2.js +0 -2
- package/dist/node/column-views.77ace3a2.js.map +0 -1
- package/dist/node/column-views.8f54691f.js +0 -2
- package/dist/node/column-views.8f54691f.js.map +0 -1
- package/dist/node/column-views.92e29010.js +0 -2
- package/dist/node/column-views.92e29010.js.map +0 -1
- package/dist/node/column-views.a16cd1f2.js +0 -2
- package/dist/node/column-views.a16cd1f2.js.map +0 -1
- package/dist/node/column-views.abe0a664.js +0 -2
- package/dist/node/column-views.abe0a664.js.map +0 -1
- package/dist/node/column-views.cd7b223b.css +0 -2
- package/dist/node/column-views.cd7b223b.css.map +0 -1
- package/dist/node/column-views.d4545f9f.js +0 -2
- package/dist/node/column-views.d4545f9f.js.map +0 -1
- package/dist/node/column-views.e803e4ae.css.map +0 -1
- package/dist/node/column-views.f7d72702.js +0 -2
- package/dist/node/column-views.f7d72702.js.map +0 -1
- package/src/facets/base-sample-column.ts +0 -114
- package/src/facets/measurements/provider.ts +0 -80
- /package/src/facets/fossils/{index.module.sass → taxon-ranges.module.sass} +0 -0
|
@@ -9,15 +9,20 @@ import { useDetritalMeasurements, MeasurementInfo } from "./provider";
|
|
|
9
9
|
import { useMemo } from "react";
|
|
10
10
|
import styles from "./index.module.sass";
|
|
11
11
|
import classNames from "classnames";
|
|
12
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
BaseMeasurementsColumn,
|
|
14
|
+
mergeHeightRanges,
|
|
15
|
+
ColumnMeasurementData,
|
|
16
|
+
} from "../measurements";
|
|
17
|
+
import { group } from "d3-array";
|
|
18
|
+
import { ColumnAxisType } from "@macrostrat/column-components";
|
|
19
|
+
import { useMacrostratColumnData } from "../../data-provider";
|
|
20
|
+
import { getUnitHeightRange } from "../../prepare-units";
|
|
13
21
|
|
|
14
22
|
const h = hyper.styled(styles);
|
|
15
23
|
|
|
16
24
|
interface DetritalItemProps {
|
|
17
|
-
note:
|
|
18
|
-
data: MeasurementInfo[];
|
|
19
|
-
unit?: IUnit;
|
|
20
|
-
};
|
|
25
|
+
note: DZMeasurementInfo;
|
|
21
26
|
spacing?: {
|
|
22
27
|
below?: number;
|
|
23
28
|
above?: number;
|
|
@@ -27,7 +32,61 @@ interface DetritalItemProps {
|
|
|
27
32
|
color?: string;
|
|
28
33
|
}
|
|
29
34
|
|
|
30
|
-
|
|
35
|
+
interface DZMeasurementInfo extends ColumnMeasurementData<MeasurementInfo[]> {
|
|
36
|
+
units: IUnit[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function prepareDetritalData(
|
|
40
|
+
data: MeasurementInfo[],
|
|
41
|
+
units: IUnit[],
|
|
42
|
+
axisType: ColumnAxisType,
|
|
43
|
+
) {
|
|
44
|
+
/** Right now measurement data could be duplicated if there are multiple units linked to the same
|
|
45
|
+
* measuremeta_id. THis happens because matches to units might be at a lower rank (e.g, if the column
|
|
46
|
+
* contains Formations but the measurements are linked to a Group). To handle this, we group by measuremeta_id
|
|
47
|
+
* and then create unique keys based on the set of units linked to each measurement.
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
// Group data by measuremeta_id
|
|
51
|
+
const measurementsGrouped = group(data, (d) => d.measuremeta_id);
|
|
52
|
+
|
|
53
|
+
const resMap = new Map<string, DZMeasurementInfo>();
|
|
54
|
+
|
|
55
|
+
for (const measurements of measurementsGrouped.values()) {
|
|
56
|
+
// Get a list of unique unit_ids for this measurement
|
|
57
|
+
const unitIDs = new Set(measurements.map((m) => m.unit_id));
|
|
58
|
+
const ids = Array.from(unitIDs);
|
|
59
|
+
ids.sort();
|
|
60
|
+
// Key is unique to the set of units
|
|
61
|
+
const key = ids.join("-");
|
|
62
|
+
|
|
63
|
+
if (!resMap.has(key)) {
|
|
64
|
+
const unitData = ids
|
|
65
|
+
.map((id) => {
|
|
66
|
+
return units.find((u) => u.unit_id === id);
|
|
67
|
+
})
|
|
68
|
+
.filter(Boolean);
|
|
69
|
+
|
|
70
|
+
const positions = unitData.map((unit) => {
|
|
71
|
+
const [height, top_height] = getUnitHeightRange(unit, axisType);
|
|
72
|
+
return { height, top_height };
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// merge positions (note: we could also have multiple separate notes per measurement)
|
|
76
|
+
const pos = mergeHeightRanges(positions, axisType);
|
|
77
|
+
|
|
78
|
+
resMap.set(key, {
|
|
79
|
+
id: key,
|
|
80
|
+
data: [],
|
|
81
|
+
units: unitData as IUnit[],
|
|
82
|
+
...pos,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
resMap.get(key)!.data.push(measurements[0]);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return Array.from(resMap.values());
|
|
89
|
+
}
|
|
31
90
|
|
|
32
91
|
function DetritalColumn({ columnID, color = "magenta" }) {
|
|
33
92
|
const data = useDetritalMeasurements({ col_id: columnID });
|
|
@@ -48,11 +107,17 @@ function DetritalColumn({ columnID, color = "magenta" }) {
|
|
|
48
107
|
};
|
|
49
108
|
}, [width, color]);
|
|
50
109
|
|
|
110
|
+
const { axisType, units } = useMacrostratColumnData();
|
|
111
|
+
|
|
112
|
+
const data1 = useMemo(() => {
|
|
113
|
+
if (data == null || units == null) return null;
|
|
114
|
+
return prepareDetritalData(data, units, axisType);
|
|
115
|
+
}, [data, units, axisType]);
|
|
116
|
+
|
|
51
117
|
return h(BaseMeasurementsColumn, {
|
|
52
|
-
data,
|
|
118
|
+
data: data1,
|
|
53
119
|
noteComponent,
|
|
54
|
-
|
|
55
|
-
matchingUnit,
|
|
120
|
+
deltaConnectorAttachment: 20,
|
|
56
121
|
});
|
|
57
122
|
}
|
|
58
123
|
|
|
@@ -68,7 +133,7 @@ function DepositionalAge({ unit }) {
|
|
|
68
133
|
|
|
69
134
|
function DetritalGroup(props: DetritalItemProps) {
|
|
70
135
|
const { note, width, height, color, spacing } = props;
|
|
71
|
-
const { data,
|
|
136
|
+
const { data, units } = note;
|
|
72
137
|
|
|
73
138
|
const _color = color;
|
|
74
139
|
|
|
@@ -83,7 +148,9 @@ function DetritalGroup(props: DetritalItemProps) {
|
|
|
83
148
|
DetritalSpectrumPlot,
|
|
84
149
|
{ width, innerHeight: height, showAxisLabels: true, paddingBottom: 40 },
|
|
85
150
|
[
|
|
86
|
-
|
|
151
|
+
units.map((unit) => {
|
|
152
|
+
return h(DepositionalAge, { unit });
|
|
153
|
+
}),
|
|
87
154
|
data.map((d) => {
|
|
88
155
|
return h(DetritalSeries, {
|
|
89
156
|
bandwidth: 20,
|
|
@@ -2,26 +2,58 @@ import hyper from "@macrostrat/hyper";
|
|
|
2
2
|
import {
|
|
3
3
|
FossilDataType,
|
|
4
4
|
PBDBCollection,
|
|
5
|
+
PBDBEntity,
|
|
5
6
|
PBDBOccurrence,
|
|
6
7
|
useFossilData,
|
|
7
8
|
} from "./provider";
|
|
8
|
-
import type { IUnit } from "../../units";
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
import type { CompositeColumnScale, IUnit } from "../../units";
|
|
10
|
+
import {
|
|
11
|
+
BaseMeasurementsColumn,
|
|
12
|
+
ColumnMeasurementData,
|
|
13
|
+
MeasurementHeightData,
|
|
14
|
+
standardizeMeasurementHeight,
|
|
15
|
+
groupNotesByPixelDistance,
|
|
16
|
+
TruncatedList,
|
|
17
|
+
} from "../measurements";
|
|
18
|
+
import { ColumnAxisType } from "@macrostrat/column-components";
|
|
13
19
|
import {
|
|
14
|
-
useMacrostratColumnData,
|
|
15
20
|
useCompositeScale,
|
|
21
|
+
useMacrostratColumnData,
|
|
16
22
|
} from "../../data-provider";
|
|
17
23
|
import { UnitLong } from "@macrostrat/api-types";
|
|
18
|
-
import styles from "./
|
|
19
|
-
import {
|
|
24
|
+
import styles from "./taxon-ranges.module.sass";
|
|
25
|
+
import { getPositionWithinUnit, getUnitHeightRange } from "../../prepare-units";
|
|
26
|
+
import { scaleLinear } from "d3-scale";
|
|
27
|
+
|
|
28
|
+
export * from "./taxon-ranges";
|
|
20
29
|
|
|
21
30
|
const h = hyper.styled(styles);
|
|
22
31
|
|
|
23
32
|
export { FossilDataType };
|
|
24
33
|
|
|
34
|
+
export function PBDBFossilsColumn({
|
|
35
|
+
columnID,
|
|
36
|
+
type = FossilDataType.Collections,
|
|
37
|
+
}: {
|
|
38
|
+
columnID: number;
|
|
39
|
+
type: FossilDataType;
|
|
40
|
+
}) {
|
|
41
|
+
const data = useFossilData(columnID, type);
|
|
42
|
+
const { axisType, units } = useMacrostratColumnData();
|
|
43
|
+
const scale = useCompositeScale();
|
|
44
|
+
|
|
45
|
+
if (data == null || units == null || scale == null) return null;
|
|
46
|
+
|
|
47
|
+
const data1 = preparePBDBData(data, units, scale, axisType);
|
|
48
|
+
|
|
49
|
+
return h(BaseMeasurementsColumn, {
|
|
50
|
+
data: data1,
|
|
51
|
+
noteComponent: FossilInfo,
|
|
52
|
+
focusedNoteComponent: FossilInfo,
|
|
53
|
+
className: "fossil-collections",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
25
57
|
interface FossilItemProps {
|
|
26
58
|
note: {
|
|
27
59
|
data: PBDBCollection[];
|
|
@@ -34,19 +66,30 @@ interface FossilItemProps {
|
|
|
34
66
|
width?: number;
|
|
35
67
|
height?: number;
|
|
36
68
|
color?: string;
|
|
69
|
+
focused?: boolean;
|
|
37
70
|
}
|
|
38
71
|
|
|
39
72
|
function FossilInfo(props: FossilItemProps) {
|
|
40
|
-
const { note,
|
|
41
|
-
const { data
|
|
73
|
+
const { note, maxItems, focused = false } = props;
|
|
74
|
+
const { data } = note;
|
|
75
|
+
// Sort collections by name
|
|
76
|
+
data.sort((a, b) => {
|
|
77
|
+
const nameA = a.best_name ?? a.cltn_name ?? "";
|
|
78
|
+
const nameB = b.best_name ?? b.cltn_name ?? "";
|
|
79
|
+
return nameA.localeCompare(nameB);
|
|
80
|
+
});
|
|
42
81
|
|
|
43
82
|
return h(TruncatedList, {
|
|
44
83
|
data,
|
|
45
84
|
className: "fossil-collections",
|
|
46
85
|
itemRenderer: PBDBCollectionLink,
|
|
86
|
+
maxItems: focused ? Infinity : (maxItems ?? 5),
|
|
47
87
|
});
|
|
48
88
|
}
|
|
49
89
|
|
|
90
|
+
const FocusedFossilInfo = (props: FossilItemProps) =>
|
|
91
|
+
h(FossilInfo, { ...props, maxItems: Infinity });
|
|
92
|
+
|
|
50
93
|
function PBDBCollectionLink({
|
|
51
94
|
data,
|
|
52
95
|
}: {
|
|
@@ -56,231 +99,118 @@ function PBDBCollectionLink({
|
|
|
56
99
|
return h(
|
|
57
100
|
"a.link-id",
|
|
58
101
|
{
|
|
59
|
-
href: `https://paleobiodb.org/
|
|
102
|
+
href: `https://paleobiodb.org/app/collections#display=col:${data.cltn_id}`,
|
|
103
|
+
target: "_blank",
|
|
104
|
+
onClick(e) {
|
|
105
|
+
e.stopPropagation();
|
|
106
|
+
},
|
|
60
107
|
},
|
|
61
108
|
data.best_name ?? data.cltn_name,
|
|
62
109
|
);
|
|
63
110
|
}
|
|
64
111
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
type = FossilDataType.Collections,
|
|
70
|
-
}: {
|
|
71
|
-
columnID: number;
|
|
72
|
-
type: FossilDataType;
|
|
73
|
-
}) {
|
|
74
|
-
const data = useFossilData(columnID, type);
|
|
75
|
-
|
|
76
|
-
return h(BaseMeasurementsColumn, {
|
|
77
|
-
data,
|
|
78
|
-
noteComponent: FossilInfo,
|
|
79
|
-
className: "fossil-collections",
|
|
80
|
-
matchingUnit,
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export function PBDBOccurrencesMatrix({ columnID }) {
|
|
85
|
-
/* A column for a matrix of taxon occurrences displayed as a table beside the main column. This will
|
|
86
|
-
eventually be extended with first/last occurrence markers and range bars.
|
|
112
|
+
interface PreparePBDBDataOptions {
|
|
113
|
+
/** If set, group close notes within this distance (in pixels in display space)
|
|
114
|
+
* into a single note. If a number is provided, that number is used as the distance,
|
|
115
|
+
* otherwise a default of 5 pixels is used.
|
|
87
116
|
*/
|
|
88
|
-
|
|
89
|
-
number,
|
|
90
|
-
PBDBOccurrence[]
|
|
91
|
-
>;
|
|
92
|
-
|
|
93
|
-
// convert the data to a map
|
|
94
|
-
const occurrenceMap = new Map(data);
|
|
95
|
-
|
|
96
|
-
const col = useMacrostratColumnData();
|
|
97
|
-
const matrix = createOccurrenceMatrix(col.units, occurrenceMap, col.axisType);
|
|
98
|
-
|
|
99
|
-
const scale = useCompositeScale();
|
|
100
|
-
|
|
101
|
-
const { taxonRanges } = matrix;
|
|
102
|
-
|
|
103
|
-
const padding = 16;
|
|
104
|
-
const spacing = 16;
|
|
105
|
-
|
|
106
|
-
const taxonEntries = Array.from(taxonRanges.entries());
|
|
107
|
-
//const taxon = taxonEntries.slice(0, 50); // limit to top 50 taxa
|
|
108
|
-
|
|
109
|
-
const width = padding * 2 + spacing * taxonEntries.length;
|
|
110
|
-
|
|
111
|
-
return h(Box, { className: "taxon-ranges", width, height: col.totalHeight }, [
|
|
112
|
-
h(TaxonOccurrenceLabels, {
|
|
113
|
-
taxonEntries,
|
|
114
|
-
padding,
|
|
115
|
-
spacing,
|
|
116
|
-
scale,
|
|
117
|
-
}),
|
|
118
|
-
h(
|
|
119
|
-
ColumnSVG,
|
|
120
|
-
{
|
|
121
|
-
width: padding * 2 + spacing * taxonEntries.length,
|
|
122
|
-
},
|
|
123
|
-
h(
|
|
124
|
-
"g.taxa-occurrences-matrix",
|
|
125
|
-
taxonEntries.map(([taxonName, ranges], rowIndex) => {
|
|
126
|
-
const xPosition = padding + rowIndex * spacing;
|
|
127
|
-
return h("g", { transform: `translate(${xPosition})` }, [
|
|
128
|
-
ranges.map(([top, bottom]) => {
|
|
129
|
-
return h("line", {
|
|
130
|
-
y1: scale(top),
|
|
131
|
-
y2: scale(bottom),
|
|
132
|
-
});
|
|
133
|
-
}),
|
|
134
|
-
]);
|
|
135
|
-
}),
|
|
136
|
-
),
|
|
137
|
-
),
|
|
138
|
-
]);
|
|
117
|
+
groupCloseNotes?: boolean | number;
|
|
139
118
|
}
|
|
140
119
|
|
|
141
|
-
function
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
120
|
+
function preparePBDBData<T extends PBDBEntity>(
|
|
121
|
+
data: T[],
|
|
122
|
+
units: UnitLong[],
|
|
123
|
+
scale: CompositeColumnScale,
|
|
124
|
+
axisType: ColumnAxisType,
|
|
125
|
+
options?: { groupCloseNotes?: boolean | number },
|
|
126
|
+
) {
|
|
127
|
+
/** Prepare PBDB fossil data for display in a measurements column */
|
|
128
|
+
const { groupCloseNotes = true } = options ?? {};
|
|
129
|
+
const groupDistance =
|
|
130
|
+
typeof groupCloseNotes === "number" ? groupCloseNotes : 10;
|
|
131
|
+
|
|
132
|
+
// Map of data to its defined height ranges
|
|
133
|
+
const dataMap = new Map<string, ColumnMeasurementData<T[]>>();
|
|
134
|
+
|
|
135
|
+
// Todo: if we wanted, we could add a step where we group notes that are too close together here...
|
|
136
|
+
|
|
137
|
+
for (const d of data) {
|
|
138
|
+
const range = getHeightRangeForPBDBEntity(d, units, axisType);
|
|
139
|
+
|
|
140
|
+
if (range == null) continue;
|
|
141
|
+
const { height, top_height } = range;
|
|
142
|
+
// compose the key based on height info
|
|
143
|
+
let key = `${height}`;
|
|
144
|
+
if (top_height != null) {
|
|
145
|
+
key += `-${top_height}`;
|
|
146
|
+
}
|
|
147
147
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
148
|
+
// Group by height key
|
|
149
|
+
if (!dataMap.has(key)) {
|
|
150
|
+
dataMap.set(key, {
|
|
151
|
+
height,
|
|
152
|
+
top_height: top_height ?? height,
|
|
153
|
+
data: [],
|
|
154
|
+
id: key,
|
|
152
155
|
});
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
+
}
|
|
157
|
+
dataMap.get(key)!.data.push(d);
|
|
158
|
+
}
|
|
156
159
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
"div.taxon-label",
|
|
163
|
-
{
|
|
164
|
-
style: {
|
|
165
|
-
top: `${top}px`,
|
|
166
|
-
marginLeft: `${left}px`,
|
|
167
|
-
"--label-width": `${labelWidth}px`,
|
|
168
|
-
},
|
|
169
|
-
},
|
|
170
|
-
h("div.taxon-label-inner", h("div.taxon-label-text", { ref }, taxonName)),
|
|
160
|
+
return groupNotesByPixelDistance(
|
|
161
|
+
Array.from(dataMap.values()),
|
|
162
|
+
scale,
|
|
163
|
+
axisType,
|
|
164
|
+
groupDistance,
|
|
171
165
|
);
|
|
172
166
|
}
|
|
173
167
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
interface OccurrenceMatrixData {
|
|
177
|
-
occurrenceMap: Map<number, PBDBOccurrence[]>; // Map of unit IDs to occurrences (original data)
|
|
178
|
-
taxonUnitMap: TaxonUnitMap; // Map of taxon names to sets of unit IDs
|
|
179
|
-
taxonOccurrenceMap: Map<string, PBDBOccurrence[]>; // Map of taxon names to occurrences
|
|
180
|
-
taxonRanges: Map<string, [number, number][]>; // Map of taxon names to [top, bottom] pixel ranges
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function TaxonOccurrenceEntry({
|
|
184
|
-
xPosition,
|
|
185
|
-
ranges,
|
|
186
|
-
scale,
|
|
187
|
-
name,
|
|
188
|
-
}: {
|
|
189
|
-
xPosition: number;
|
|
190
|
-
units: Set<number>;
|
|
191
|
-
}) {
|
|
192
|
-
return h("g", { transform: `translate(${xPosition})` }, [
|
|
193
|
-
ranges.map(([top, bottom]) => {
|
|
194
|
-
return h("line", {
|
|
195
|
-
y1: scale(top),
|
|
196
|
-
y2: scale(bottom),
|
|
197
|
-
});
|
|
198
|
-
}),
|
|
199
|
-
]);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
function createOccurrenceMatrix(
|
|
168
|
+
function getHeightRangeForPBDBEntity<T extends PBDBEntity>(
|
|
169
|
+
d: T,
|
|
203
170
|
units: UnitLong[],
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
taxonUnitMap.set(taxonName, new Set());
|
|
215
|
-
taxonOccurrenceMap.set(taxonName, []);
|
|
216
|
-
}
|
|
217
|
-
taxonUnitMap.get(taxonName).add(unit_id);
|
|
218
|
-
taxonOccurrenceMap.get(taxonName).push(occ);
|
|
171
|
+
axisType: ColumnAxisType,
|
|
172
|
+
): MeasurementHeightData | null {
|
|
173
|
+
let height: number | null = null;
|
|
174
|
+
if (d.slb != null && d.slu == "mbsf") {
|
|
175
|
+
// Meters below sea floor - special case for eODP where we have
|
|
176
|
+
// specific depth data referenced
|
|
177
|
+
height = Number(d.slb);
|
|
178
|
+
if (axisType === ColumnAxisType.DEPTH) {
|
|
179
|
+
// Data is already in depth units
|
|
180
|
+
return { height };
|
|
219
181
|
}
|
|
220
182
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
//
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
183
|
+
if (d.unit_id == null) return null;
|
|
184
|
+
if (height != null) {
|
|
185
|
+
// If we have both height and unit info, we need to adjust the height
|
|
186
|
+
// to fit whatever scale type we're using.
|
|
187
|
+
// TODO: we could improve how this works by having concurrent age and
|
|
188
|
+
// height scales, which would allow us to do this without having to
|
|
189
|
+
// reference to a specific unit.
|
|
190
|
+
const unit = units.find((u) => u.unit_id === d.unit_id);
|
|
191
|
+
if (unit == null) return null;
|
|
192
|
+
const relHeight = getRelativePositionInUnit(
|
|
193
|
+
height,
|
|
194
|
+
unit,
|
|
195
|
+
ColumnAxisType.DEPTH,
|
|
233
196
|
);
|
|
197
|
+
if (relHeight == null) return null;
|
|
198
|
+
height = getPositionWithinUnit(relHeight, unit, axisType);
|
|
199
|
+
return { height };
|
|
234
200
|
}
|
|
235
|
-
|
|
236
|
-
return {
|
|
237
|
-
occurrenceMap: data,
|
|
238
|
-
taxonUnitMap: new Map(sortedTaxa),
|
|
239
|
-
taxonOccurrenceMap: taxonOccurrenceMap,
|
|
240
|
-
taxonRanges,
|
|
241
|
-
};
|
|
201
|
+
// We can just get the height within the unit, clipped to the unit boundaries
|
|
202
|
+
return standardizeMeasurementHeight({ unit_id: d.unit_id }, units, axisType);
|
|
242
203
|
}
|
|
243
204
|
|
|
244
|
-
function
|
|
245
|
-
|
|
246
|
-
|
|
205
|
+
function getRelativePositionInUnit<T extends PBDBEntity>(
|
|
206
|
+
pos: number,
|
|
207
|
+
unit: UnitLong,
|
|
247
208
|
axisType: ColumnAxisType,
|
|
248
|
-
):
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
if (
|
|
256
|
-
axisType == ColumnAxisType.DEPTH ||
|
|
257
|
-
axisType == ColumnAxisType.HEIGHT
|
|
258
|
-
) {
|
|
259
|
-
currentDomain = [u.t_pos, u.b_pos];
|
|
260
|
-
} else {
|
|
261
|
-
currentDomain = [u.t_age, u.b_age];
|
|
262
|
-
}
|
|
263
|
-
} else {
|
|
264
|
-
if (
|
|
265
|
-
axisType == ColumnAxisType.DEPTH ||
|
|
266
|
-
axisType == ColumnAxisType.HEIGHT
|
|
267
|
-
) {
|
|
268
|
-
currentDomain[1] = u.b_pos;
|
|
269
|
-
} else {
|
|
270
|
-
currentDomain[1] = u.b_age;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
} else {
|
|
274
|
-
if (currentDomain != null) {
|
|
275
|
-
domains.push(currentDomain);
|
|
276
|
-
currentDomain = null;
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
if (currentDomain != null) {
|
|
282
|
-
domains.push(currentDomain);
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
return domains;
|
|
209
|
+
): number | null {
|
|
210
|
+
// This is the inverse of getPositionWithinUnit
|
|
211
|
+
const heights = getUnitHeightRange(unit, axisType, false);
|
|
212
|
+
const scale = scaleLinear(heights).domain([0, 1]);
|
|
213
|
+
const relPos = scale.invert(pos);
|
|
214
|
+
if (relPos < 0 || relPos > 1) return null;
|
|
215
|
+
return relPos;
|
|
286
216
|
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { group, InternMap } from "d3-array";
|
|
2
1
|
import {
|
|
3
2
|
createAPIContext,
|
|
4
3
|
useAPIResult,
|
|
@@ -7,8 +6,10 @@ import {
|
|
|
7
6
|
|
|
8
7
|
const responseUnwrapper = (d) => d.records;
|
|
9
8
|
|
|
9
|
+
const pbdbAPIBase = "https://paleobiodb.org/data1.2";
|
|
10
|
+
|
|
10
11
|
const pbdbAPIContext = createAPIContext({
|
|
11
|
-
baseURL:
|
|
12
|
+
baseURL: pbdbAPIBase,
|
|
12
13
|
unwrapResponse: responseUnwrapper,
|
|
13
14
|
});
|
|
14
15
|
|
|
@@ -17,26 +18,17 @@ export enum FossilDataType {
|
|
|
17
18
|
Collections = "colls",
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
export
|
|
21
|
-
type: FossilDataType,
|
|
22
|
-
{ col_id },
|
|
23
|
-
): any[] | null {
|
|
24
|
-
const params = {
|
|
25
|
-
ms_column: col_id,
|
|
26
|
-
show: "full,mslink",
|
|
27
|
-
};
|
|
28
|
-
return useAPIResult(`/${type}/list.json`, params, {
|
|
29
|
-
context: pbdbAPIContext,
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface PBDBIdentifier {
|
|
21
|
+
export interface PBDBEntity {
|
|
34
22
|
unit_id: number;
|
|
35
23
|
col_id: number;
|
|
36
24
|
cltn_id: number;
|
|
25
|
+
// For eODP, slb/slu are used to store the heights of fossil locations found in measured sections.
|
|
26
|
+
// They may have a more general set of uses as well but these are not currently explored.
|
|
27
|
+
slb?: string; // The local bed in which the fossil was found
|
|
28
|
+
slu?: string; // The unit of measurement used to designate the local bed
|
|
37
29
|
}
|
|
38
30
|
|
|
39
|
-
export interface PBDBCollection extends
|
|
31
|
+
export interface PBDBCollection extends PBDBEntity {
|
|
40
32
|
cltn_name: string;
|
|
41
33
|
pbdb_occs: number;
|
|
42
34
|
t_age: number;
|
|
@@ -44,7 +36,7 @@ export interface PBDBCollection extends PBDBIdentifier {
|
|
|
44
36
|
[key: string]: any; // Allow for additional properties
|
|
45
37
|
}
|
|
46
38
|
|
|
47
|
-
export interface PBDBOccurrence extends
|
|
39
|
+
export interface PBDBOccurrence extends PBDBEntity {
|
|
48
40
|
occ_id: number;
|
|
49
41
|
cltn_id: number;
|
|
50
42
|
taxon_name: string;
|
|
@@ -86,8 +78,9 @@ async function fetchPDBDFossilData(
|
|
|
86
78
|
col_id: number,
|
|
87
79
|
type: FossilDataType,
|
|
88
80
|
): Promise<PBDBCollection[]> {
|
|
81
|
+
// Note: show=rank does not work on training PBDB server
|
|
89
82
|
const resp = await fetch(
|
|
90
|
-
|
|
83
|
+
pbdbAPIBase + `/${type}/list.json?ms_column=${col_id}&show=mslink,stratext`,
|
|
91
84
|
);
|
|
92
85
|
const res = await resp.json();
|
|
93
86
|
return res.records.map(
|
|
@@ -97,21 +90,21 @@ async function fetchPDBDFossilData(
|
|
|
97
90
|
);
|
|
98
91
|
}
|
|
99
92
|
|
|
100
|
-
async function fetchFossilData(
|
|
93
|
+
async function fetchFossilData<T extends PBDBEntity>(
|
|
101
94
|
colID: number,
|
|
102
95
|
type: FossilDataType,
|
|
103
|
-
): Promise<
|
|
96
|
+
): Promise<T[]> {
|
|
104
97
|
const [macrostratData, pbdbData] = await Promise.all([
|
|
105
98
|
fetchMacrostratFossilData(colID, type),
|
|
106
99
|
fetchPDBDFossilData(colID, type),
|
|
107
100
|
]);
|
|
108
|
-
|
|
109
|
-
const data = [...macrostratData, ...pbdbData];
|
|
110
|
-
|
|
111
|
-
return group(data, (d) => d.unit_id);
|
|
101
|
+
return [...macrostratData, ...pbdbData];
|
|
112
102
|
}
|
|
113
103
|
|
|
114
104
|
function preprocessOccurrence(d): PBDBOccurrence {
|
|
105
|
+
if (d.msu == null || d.msc == null) {
|
|
106
|
+
return d;
|
|
107
|
+
}
|
|
115
108
|
/* Preprocess data for an occurrence into a Macrostrat-like format */
|
|
116
109
|
// Standardize names of Macrostrat units and columns
|
|
117
110
|
const unit_id = parseInt(d.msu.replace(/^\w+:/, ""));
|